diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..b9486d8 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,184 @@ +--- +plugins: + - promise +env: + node: true +extends: + - eslint:recommended + - plugin:promise/recommended +parserOptions: + ecmaVersion: 2017 + sourceType: script +rules: + array-bracket-spacing: + - error + - always + - + objectsInArrays: false + arrow-parens: + - error + - as-needed + - + requireForBlockBody: true + arrow-spacing: error + block-spacing: error + brace-style: + - error + - 1tbs # I very much prefer allman -mjl + - + allowSingleLine: true + camelcase: + - error + - + properties: always + comma-dangle: + - error + - only-multiline + comma-spacing: error + comma-style: error + computed-property-spacing: error + consistent-return: error + consistent-this: error + curly: + - error + - multi-line + dot-location: + - error + - property + eqeqeq: error + func-call-spacing: error + generator-star-spacing: + - error + - + before: false + after: true + global-require: error + indent: + - error + - 2 + - + SwitchCase: 1 + FunctionDeclaration: + parameters: first + body: 1 + FunctionExpression: + parameters: first + body: 1 + MemberExpression: off + CallExpression: + arguments: first + ArrayExpression: first + ObjectExpression: first + ImportDeclaration: first + key-spacing: + - error + - + beforeColon: false + afterColon: true + mode: minimum + keyword-spacing: error + linebreak-style: + - error + - unix + max-len: + - warn + - + code: 120 + ignoreStrings: false + ignoreTemplateLiterals: false + ignoreRegExpLiterals: false + ignoreTrailingComments: true + ignoreUrls: true + newline-per-chained-call: + - error + - + ignoreChainWithDepth: 3 + no-console: warn + no-eq-null: error + no-extend-native: error + no-extra-parens: warn + no-fallthrough: error + no-global-assign: error + no-magic-numbers: off + no-multi-assign: error + no-multi-spaces: + - error + - + ignoreEOLComments: true + no-new: error + no-octal-escape: error + no-shadow: error + no-shadow-restricted-names: error + no-trailing-spaces: error + no-unused-vars: warn + no-use-before-define: + - error + - + functions: false + no-useless-call: error + no-useless-return: error + no-var: off # this is probably worth turning on and fixing at some point + no-whitespace-before-property: error + object-curly-newline: off + object-curly-spacing: + - error + - always + object-property-newline: + - error + - + allowAllPropertiesOnSameLine: true + one-var-declaration-per-line: + - error + - always + operator-linebreak: off + promise/no-nesting: off + prefer-rest-params: error + prefer-spread: error + quote-props: + - error + - as-needed + - + keywords: true + quotes: + - error + - single + - + avoidEscape: true + allowTemplateLiterals: true + rest-spread-spacing: error + semi: + - error + - never + semi-spacing: error + sort-imports: error + space-before-blocks: error + space-before-function-paren: + - error + - + anonymous: always + named: always + asyncArrow: ignore + space-in-parens: error + space-infix-ops: error + space-unary-ops: + - error + - + words: true + nonwords: false + spaced-comment: + - warn + - always + - + line: + markers: + - / + block: + exceptions: + - "*" + balanced: true + symbol-description: error + template-curly-spacing: + - error + - never + valid-jsdoc: warn + yoda: error diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..9933ea3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,36 @@ + + +## Expected Behavior + + + +## Current Behavior + + + +## Possible Solution + + + +## Steps to Reproduce (for bugs) + + +1. +2. +3. +4. + +## Context + + + +## Debug Info + +rhythm-server - VERSION + +Operating system: OS +CPU architecture: ARCH +Kernel: KERNEL + +Docker environment (if applicable): +Using `make up` from `rhythm-docker` diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..01c3095 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,32 @@ + + +## Description + + +## Motivation and context + + + +## How has this been tested? + + + + +## Screenshots (if appropriate): + +## Types of changes + + +- ✅ Bug fix (non-breaking change which fixes an issue) +- ✅ New feature (non-breaking change which adds functionality) +- ✅ Breaking change (fix or feature that would cause existing functionality to change) + +## Checklist: + + + + +- ✅ My code follows the code style of this project. **[REQUIRED]** +- ✅ All new and existing tests passed. **[REQUIRED]** +- ✅ My change requires a change to the documentation and I have updated it accordingly. +- ✅ I have added tests to cover my changes. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..98a0b74 --- /dev/null +++ b/Makefile @@ -0,0 +1,72 @@ +# +# Makefile to build and test the rhythm-server +# duplicates (and should be kept in sync with) some of the scripts in package.json +# + +GIT_TAG_VERSION = $(shell git describe) + +COMPILER = ./node_modules/.bin/tsc +LINT = ./node_modules/.bin/eslint +MOCHA = ./node_modules/.bin/mocha + +LINT_LOG = logs/lint.log +TEST_LOG = logs/test.log + +# Add --quiet to only report on errors, not warnings +LINT_OPTIONS = +LINT_FORMAT = stylish + +.DELETE_ON_ERROR : +.PHONY : help all build doc lint test load-test wtftest clean clean-build start-dev + +help : + @echo "" ; \ + echo "Useful targets in this rhythm-server Makefile:" ; \ + echo "- all : run lint, build, test" ; \ + echo "- build :" ; \ + echo "- lint : run lint over the sources & tests; display results to stdout" ; \ + echo "- lint-log : run lint concise diffable output to $(LINT_LOG)" ; \ + echo "- test : run the mocha (unit) tests" ; \ + echo "- load-test : run the mocha (load) tests" ; \ + echo "- wtftest : run the mocha (unit) tests w/ wtfnode to help debug the test run hanging at the end" ; \ + echo "- start-dev : start a dev container for the rhythm-server" ; \ + echo "- vim-lint : run lint in format consumable by vim quickfix" ; \ + echo "" + +all : lint build test + +build : + @echo build would run the compiler: $(COMPILER) + +doc : + @echo doc would run the compiler: $(COMPILER) + +lint-log: LINT_OPTIONS = --output-file $(LINT_LOG) +lint-log: LINT_FORMAT = unix +vim-lint: LINT_FORMAT = unix +lint vim-lint lint-log: + $(LINT) $(LINT_OPTIONS) --format $(LINT_FORMAT) src test + +test : + $(MOCHA) --reporter spec -r dotenv/config --recursive --sort --invert --grep 'Load tests' test | tee $(TEST_LOG) + +load-test : + $(MOCHA) --reporter spec -r dotenv/config test/load.test.js + +wtftest : ./node_modules/.bin/wtfnode +# This is helpful for determining why the tests seem to be hanging after they've "finished" +# it requires the wtfnode package to be installed. + ./node_modules/.bin/wtfnode ./node_modules/.bin/_mocha --reporter spec -r dotenv/config --recursive --sort --invert --grep 'Load tests' test + +clean : clean-build + +clean-build : + -rm -f dist/* + +start-dev : + -docker-compose run rhythm-server bash + -docker-compose rm --force + -docker-compose stop + +./node_modules/.bin/wtfnode : + npm install wtfnode --no-save diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..b913864 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +version: '3' +services: + rhythm-server: + build: docker/rhythm-server + ports: + - '3000:3000' + volumes: + - ${RHYTHM_SERVER_PATH-.}:/app + depends_on: + - mongo-server + rhythm-rtc: + build: docker/rhythm-rtc + ports: + - '3001:3001' + volumes: + - ${RHYTHM_RTC_PATH-../rhythm-rtc}:/app + depends_on: + - rhythm-server + mongo-server: + image: mongo:latest + volumes: + - ${RHYTHM_DB_PATH-./data}:/data/db diff --git a/docker/rhythm-rtc/Dockerfile b/docker/rhythm-rtc/Dockerfile new file mode 100644 index 0000000..1687f2b --- /dev/null +++ b/docker/rhythm-rtc/Dockerfile @@ -0,0 +1,18 @@ +FROM node:8 +LABEL Description="This image runs rhythm-rtc which serves the pages to enable video chat w/ the Media Manager" + +# Modified bashrc which defines some aliases and an interactive prompt (for both root & node users) +COPY bashrc /root/.bashrc + +# node images have a node user w/ UID 1000 (works well for me for now, but more thought may be needed later) -mjl +USER node +COPY bashrc /home/node/.bashrc + +EXPOSE 3001 + +# rhythm-rtc repository working directory must be bound at /app and all dependent packages installed +VOLUME /app +WORKDIR /app +CMD ["npm", "start"] +# ENTRYPOINT ["/bin/bash"] + diff --git a/docker/rhythm-rtc/bashrc b/docker/rhythm-rtc/bashrc new file mode 100644 index 0000000..35d8746 --- /dev/null +++ b/docker/rhythm-rtc/bashrc @@ -0,0 +1,23 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. + +# Note: PS1 and umask are already set in /etc/profile. You should not +# need this unless you want different defaults for root. +# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ ' +# umask 022 + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + +servicename=rhythm-rtc +PS1='\[\033[00;33m\]('${servicename}') \[\033[01;33m\]\u\[\033[00;37m\] \w \[\033[01;36m\]\$\[\033[00m\] ' +unset servicename + +# colorize `ls' +export LS_OPTIONS='--color=auto' +eval "`dircolors --sh`" + +# common ls aliases +alias ls='ls $LS_OPTIONS' +alias ll='ls $LS_OPTIONS -l' +alias lla='ls $LS_OPTIONS -lA' +alias l='ls $LS_OPTIONS -CF' diff --git a/docker/rhythm-server/Dockerfile b/docker/rhythm-server/Dockerfile new file mode 100644 index 0000000..b3b2489 --- /dev/null +++ b/docker/rhythm-server/Dockerfile @@ -0,0 +1,18 @@ +FROM node:8 +LABEL Description="This image runs the rhythm-server which collects utterance info made by participants in meetings" + +# Modified bashrc which defines some aliases and an interactive prompt (for both root & node users) +COPY bashrc /root/.bashrc + +# node images have a node user w/ UID 1000 (works well for me for now, but more thought may be needed later) -mjl +USER node +COPY bashrc /home/node/.bashrc + +EXPOSE 3000 + +# rhythm-server repository working directory must be bound at /app and all dependent packages installed +VOLUME /app +WORKDIR /app +CMD ["npm", "start"] +# ENTRYPOINT ["/bin/bash"] + diff --git a/docker/rhythm-server/bashrc b/docker/rhythm-server/bashrc new file mode 100644 index 0000000..67caff4 --- /dev/null +++ b/docker/rhythm-server/bashrc @@ -0,0 +1,23 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. + +# Note: PS1 and umask are already set in /etc/profile. You should not +# need this unless you want different defaults for root. +# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ ' +# umask 022 + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + +servicename=rhythm-svr +PS1='\[\033[00;33m\]('${servicename}') \[\033[01;33m\]\u\[\033[00;37m\] \w \[\033[01;36m\]\$\[\033[00m\] ' +unset servicename + +# colorize `ls' +export LS_OPTIONS='--color=auto' +eval "`dircolors --sh`" + +# common ls aliases +alias ls='ls $LS_OPTIONS' +alias ll='ls $LS_OPTIONS -l' +alias lla='ls $LS_OPTIONS -lA' +alias l='ls $LS_OPTIONS -CF' diff --git a/docker/rrtc-shell.sh b/docker/rrtc-shell.sh new file mode 100755 index 0000000..7fa5e8f --- /dev/null +++ b/docker/rrtc-shell.sh @@ -0,0 +1,17 @@ +#! /bin/bash + +# Default path to the rhythm server directory +RHYTHM_RTC_PATH=~/Projects/riff/rhythm-rtc +RHYTHM_MONGO_DATA_PATH=~/Projects/riff/rhythm-server/data +DOCKER_ENGINE_IP=127.0.0.1 + +# include .rhythmdevrc if it exists to redefine the variables w/ values of locations of +# working directories for any components +if [ -f "$HOME/.rhythmdevrc" ] +then + . "$HOME/.rhythmdevrc" +fi + + +# It attaches to my rhythm-rtc repo working directory so whatever I have there is what will run +docker run --rm -it --net rhythm -p ${DOCKER_ENGINE_IP}:3001:3001 -v ${RHYTHM_RTC_PATH}:/app --name rrtc-shell local/rhythm-rtc bash diff --git a/docker/rs-shell.sh b/docker/rs-shell.sh new file mode 100755 index 0000000..17fa4e2 --- /dev/null +++ b/docker/rs-shell.sh @@ -0,0 +1,19 @@ +#! /bin/bash + +# Default path to the rhythm server directory +RHYTHM_SERVER_PATH=~/Projects/riff/rhythm-server/ +RHYTHM_MONGO_DATA_PATH=~/Projects/riff/rhythm-server/data/ +DOCKER_ENGINE_IP=127.0.0.1 + +# include .rhythmdevrc if it exists to redefine the variables w/ values of locations of +# working directories for any components +if [ -f "$HOME/.rhythmdevrc" ] +then + . "$HOME/.rhythmdevrc" +fi + + +# It attaches to my rhythm-server repo working directory so whatever I have there is what will run +#docker run -d --net rhythm -p ${DOCKER_ENGINE_IP}:27017:27017 -v ${RHYTHM_MONGO_DATA_PATH}:/data/db --name rhythm-mongo-server mongo +docker start rhythm-mongo-server +docker run --rm -it --net rhythm -p ${DOCKER_ENGINE_IP}:3000:3000 -v ${RHYTHM_SERVER_PATH}:/app --name rs-shell local/rhythm-server bash diff --git a/docker/testenv.sh b/docker/testenv.sh new file mode 100755 index 0000000..7c10342 --- /dev/null +++ b/docker/testenv.sh @@ -0,0 +1,83 @@ +#! /bin/bash + +# Default paths to the rhythm working directories +RHYTHM_RTC_PATH=~/Projects/riff/rhythm-rtc +RHYTHM_SERVER_PATH=~/Projects/riff/rhythm-server +RHYTHM_MONGO_DATA_PATH=~/Projects/riff/rhythm-server/data +DOCKER_ENGINE_IP=127.0.0.1 + +# include .rhythmdevrc if it exists to redefine the variables w/ values of locations of +# working directories for any components +if [ -f "$HOME/.rhythmdevrc" ] +then + . "$HOME/.rhythmdevrc" +fi + +function echosyntax() { + echo '' + echo 'testenv.sh provides an interface to create and use the containers needed to run the rhythm system locally.' + echo 'The containers are:' + echo ' rhythm-mongo-server: The mongo instance where the rhythm data is stored' + echo ' rhythm-server: The rhythm server instance' + echo '' + echo "If the file $HOME/.rhythmdevrc exists it will be sourced, allowing local paths to the working directories to be specified." + echo '' + echo 'usage:' + echo 'build the docker rhythm image(s): testenv.sh make-images' + echo 'run the needed docker containers: testenv.sh initial-start' + echo 'start the docker containers: testenv.sh start' + echo 'stop the docker containers: testenv.sh stop' + echo 'remove the docker containers: testenv.sh remove-containers' + echo 'create the docker rhythm bridge network: testenv.sh create-network' + echo 'this help: testenv.sh --help' +} + +if [ $# -ne 1 ] +then + echo 'Wrong number of arguments' + echosyntax + exit 1 +fi + +case $1 in + make-images) + # Create the docker images + docker build -t local/rhythm-server docker/rhythm-server + docker build -t local/rhythm-rtc docker/rhythm-rtc + ;; + initial-start) + # run the webserver for accessing the testpage at localhost/tests/integration/testpage-divs.html + #docker run -d -p ${DOCKER_ENGINE_IP}:80:80 -v ${BRIXCLIENT_PATH}:/usr/share/nginx/html:ro --name brixclient nginx + + # run the rhythm mongo server + [ -d ${RHYTHM_MONGO_DATA_PATH} ] || mkdir ${RHYTHM_MONGO_DATA_PATH} + docker run -d --net rhythm -p ${DOCKER_ENGINE_IP}:27017:27017 -v ${RHYTHM_MONGO_DATA_PATH}:/data/db --name rhythm-mongo-server mongo + + # run the rhythm-server + docker run -d --net rhythm -p ${DOCKER_ENGINE_IP}:3000:3000 -v ${RHYTHM_SERVER_PATH}:/app -w /app --name rhythm-server local/rhythm-server + + # run the rhythm-rtc + docker run -d --net rhythm -p ${DOCKER_ENGINE_IP}:3001:3001 -v ${RHYTHM_RTC_PATH}:/app -w /app --name rhythm-rtc local/rhythm-rtc + ;; + start) + # start the containers once they've been created using initial-start + docker start rhythm-mongo-server rhythm-server + ;; + stop) + # stop the running containers + docker stop rhythm-server rhythm-mongo-server + ;; + remove-containers) + # remove the containers requiring that they be restarted using initial-start + docker rm rhythm-server rhythm-mongo-server + ;; + + create-network) + # create a bridge network for the various rhythm servers + docker network create --driver bridge rhythm + ;; + --help) + # show help + echosyntax + ;; +esac diff --git a/env_template b/env_template index 2c7198e..f06715c 100644 --- a/env_template +++ b/env_template @@ -1,4 +1,3 @@ -AUTH_ID_FIELD="id" AUTH_ON="true" AUTH_TOKEN_EXPIRESIN="1000d" AUTH_TOKEN_SECRET="my-secret" diff --git a/logs/lint.log b/logs/lint.log new file mode 100644 index 0000000..30e963c --- /dev/null +++ b/logs/lint.log @@ -0,0 +1,292 @@ +/app/src/app.js:44:8: Unexpected console statement. [Warning/no-console] +/app/src/events/meetingJoinedEvent.js:11:12: 'meeting' is already declared in the upper scope. [Error/no-shadow] +/app/src/events/meetingJoinedEvent.js:18:16: 'meeting' is already declared in the upper scope. [Error/no-shadow] +/app/src/events/meetingJoinedEvent.js:38:16: 'participant' is already declared in the upper scope. [Error/no-shadow] +/app/src/events/meetingJoinedEvent.js:57:17: 'err' is already declared in the upper scope. [Error/no-shadow] +/app/src/events/meetingJoinedEvent.js:67:14: Gratuitous parentheses around expression. [Warning/no-extra-parens] +/app/src/events/meetingJoinedEvent.js:100:20: 'meeting' is already declared in the upper scope. [Error/no-shadow] +/app/src/index.js:8:3: Unexpected console statement. [Warning/no-console] +/app/src/jobs/end-meeting-job.js:108:11: Each then() should return a value or throw [Error/promise/always-return] +/app/src/jobs/end-meeting-job.js:109:7: Unexpected console statement. [Warning/no-console] +/app/src/jobs/end-meeting-job.js:112:7: Unexpected console statement. [Warning/no-console] +/app/src/jobs/end-meeting-job.js:116:31: Expected to return a value at the end of function. [Error/consistent-return] +/app/src/jobs/turn-job/turn-analytics.js:17:46: 'turns' is already declared in the upper scope. [Error/no-shadow] +/app/src/jobs/turn-job/turn-analytics.js:50:11: Each then() should return a value or throw [Error/promise/always-return] +/app/src/jobs/turn-job/turn-analytics.js:55:68: 'key' is defined but never used. [Warning/no-unused-vars] +/app/src/jobs/turn-job/turn-analytics.js:87:15: Each then() should return a value or throw [Error/promise/always-return] +/app/src/jobs/turn-job/turn-analytics.js:87:16: 'turn' is defined but never used. [Warning/no-unused-vars] +/app/src/jobs/turn-job/turn-analytics.js:90:19: Each then() should return a value or throw [Error/promise/always-return] +/app/src/jobs/turn-job/turn-analytics.js:90:20: 'newTurn' is defined but never used. [Warning/no-unused-vars] +/app/src/jobs/turn-job/turn-analytics.js:101:19: Each then() should return a value or throw [Error/promise/always-return] +/app/src/jobs/turn-job/turn-analytics.js:101:20: 'newTurn' is defined but never used. [Warning/no-unused-vars] +/app/src/jobs/turn-job/turn-analytics.js:104:21: 'err' is already declared in the upper scope. [Error/no-shadow] +/app/src/scripts/create-default-user.js:57:21: 'userOrTrue' is defined but never used. [Warning/no-unused-vars] +/app/src/scripts/create-default-user.js:67:94: Expected to return a value at the end of function. [Error/consistent-return] +/app/src/services/meeting/hooks/activate-meeting-hook.js:10:10: Gratuitous parentheses around expression. [Warning/no-extra-parens] +/app/src/services/meeting/hooks/activate-meeting-hook.js:15:19: Gratuitous parentheses around expression. [Warning/no-extra-parens] +/app/src/services/meeting/hooks/activate-meeting-hook.js:20:12: 'meetingEvent' is defined but never used. [Warning/no-unused-vars] +/app/src/services/meeting/hooks/apply_unstructured_query-hook.js:11:48: Expected to return a value at the end of arrow function. [Error/consistent-return] +/app/src/services/meeting/hooks/compute-turn-hook.js:11:10: Gratuitous parentheses around expression. [Warning/no-extra-parens] +/app/src/services/meeting/hooks/compute-turn-hook.js:15:10: Gratuitous parentheses around expression. [Warning/no-extra-parens] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:21:10: Gratuitous parentheses around expression. [Warning/no-extra-parens] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:51:11: Each then() should return a value or throw [Error/promise/always-return] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:57:5: Expected catch() or return [Error/promise/catch-or-return] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:62:13: Each then() should return a value or throw [Error/promise/always-return] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:66:68: 'key' is defined but never used. [Warning/no-unused-vars] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:70:75: 'key' is defined but never used. [Warning/no-unused-vars] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:92:7: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:166:30: 'i' is defined but never used. [Warning/no-unused-vars] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:219:1: Line 219 exceeds the maximum line length of 120. [Warning/max-len] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:220:1: Line 220 exceeds the maximum line length of 120. [Warning/max-len] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:221:1: Line 221 exceeds the maximum line length of 120. [Warning/max-len] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:263:14: Unexpected console statement. [Warning/no-console] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:266:12: Unexpected console statement. [Warning/no-console] +/app/src/services/meeting/hooks/deactivate-meeting-hook.js:276:16: 'meetingEvent' is defined but never used. [Warning/no-unused-vars] +/app/src/services/meeting/hooks/participants-event-hook.js:9:18: Expected to return a value at the end of function. [Error/consistent-return] +/app/src/services/meeting/hooks/participants-event-hook.js:17:14: 'participantEvent' is defined but never used. [Warning/no-unused-vars] +/app/src/services/utterance/hooks/mergeHook.js:22:9: Gratuitous parentheses around expression. [Warning/no-extra-parens] +/app/src/services/utterance/hooks/mergeHook.js:25:7: Expected catch() or return [Error/promise/catch-or-return] +/app/src/services/utterance/hooks/mergeHook.js:28:15: Each then() should return a value or throw [Error/promise/always-return] +/app/src/services/utterance/hooks/participant-consented-hook.js:10:25: Expected to return a value at the end of arrow function. [Error/consistent-return] +/app/src/services/utterance/hooks/participant-consented-hook.js:11:7: Each then() should return a value or throw [Error/promise/always-return] +/app/src/services/utterance/hooks/repeatHook.js:9:3: Expected catch() or return [Error/promise/catch-or-return] +/app/src/services/utterance/hooks/repeatHook.js:28:39: Gratuitous parentheses around expression. [Warning/no-extra-parens] +/app/src/services/utterance/hooks/roomHook.js:3:16: Expected to return a value at the end of function. [Error/consistent-return] +/app/src/services/utterance/hooks/roomHook.js:9:3: Expected catch() or return [Error/promise/catch-or-return] +/app/test/events/index.test.js:27:38: 'room' is defined but never used. [Warning/no-unused-vars] +/app/test/events/index.test.js:28:5: Expected catch() or return [Error/promise/catch-or-return] +/app/test/events/index.test.js:30:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/events/index.test.js:38:19: Each then() should return a value or throw [Error/promise/always-return] +/app/test/events/index.test.js:38:20: 'meeting' is already declared in the upper scope. [Error/no-shadow] +/app/test/events/index.test.js:42:15: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/events/index.test.js:50:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/events/index.test.js:54:28: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/events/index.test.js:56:25: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/events/index.test.js:68:15: Each then() should return a value or throw [Error/promise/always-return] +/app/test/events/index.test.js:72:11: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/events/index.test.js:77:11: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/events/index.test.js:85:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/events/index.test.js:95:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/events/meetingEvent.test.js:11:25: Each then() should return a value or throw [Error/promise/always-return] +/app/test/events/meetingEvent.test.js:11:33: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/events/meetingEvent.test.js:12:37: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:55:21: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/jobs/end-meeting-job.test.js:56:58: 'list' is defined but never used. [Warning/no-unused-vars] +/app/test/jobs/end-meeting-job.test.js:57:9: Expected catch() or return [Error/promise/catch-or-return] +/app/test/jobs/end-meeting-job.test.js:57:69: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/end-meeting-job.test.js:61:21: 'participants' is defined but never used. [Warning/no-unused-vars] +/app/test/jobs/end-meeting-job.test.js:65:7: Function expected no return value. [Error/consistent-return] +/app/test/jobs/end-meeting-job.test.js:72:21: 'utterance' is defined but never used. [Warning/no-unused-vars] +/app/test/jobs/end-meeting-job.test.js:73:7: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/end-meeting-job.test.js:74:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:80:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:102:68: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/end-meeting-job.test.js:104:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:107:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:112:68: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/end-meeting-job.test.js:114:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:117:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:138:15: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/end-meeting-job.test.js:140:11: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:143:11: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:153:15: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/end-meeting-job.test.js:155:11: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:158:11: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:181:26: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/end-meeting-job.test.js:185:22: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:188:22: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:194:26: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/end-meeting-job.test.js:198:22: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/end-meeting-job.test.js:201:22: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/turn-job/index.test.js:46:27: 'n' is defined but never used. [Warning/no-unused-vars] +/app/test/jobs/turn-job/index.test.js:52:27: 'n' is defined but never used. [Warning/no-unused-vars] +/app/test/jobs/turn-job/index.test.js:58:27: 'n' is defined but never used. [Warning/no-unused-vars] +/app/test/jobs/turn-job/index.test.js:64:10: Gratuitous parentheses around expression. [Warning/no-extra-parens] +/app/test/jobs/turn-job/index.test.js:67:10: Gratuitous parentheses around expression. [Warning/no-extra-parens] +/app/test/jobs/turn-job/index.test.js:72:5: Expected catch() or return [Error/promise/catch-or-return] +/app/test/jobs/turn-job/index.test.js:72:25: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/turn-job/index.test.js:77:15: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/turn-job/index.test.js:77:16: 'participants' is defined but never used. [Warning/no-unused-vars] +/app/test/jobs/turn-job/index.test.js:77:35: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/turn-job/index.test.js:78:27: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/turn-job/index.test.js:84:17: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/turn-job/index.test.js:87:13: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/turn-job/index.test.js:90:13: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/turn-job/index.test.js:95:40: 'done' is defined but never used. [Warning/no-unused-vars] +/app/test/jobs/turn-job/index.test.js:106:18: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/turn-job/index.test.js:106:19: 'utterances' is defined but never used. [Warning/no-unused-vars] +/app/test/jobs/turn-job/index.test.js:106:36: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/turn-job/index.test.js:107:30: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/turn-job/index.test.js:120:15: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/turn-job/index.test.js:127:11: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/turn-job/index.test.js:130:11: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/turn-job/index.test.js:140:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/jobs/turn-job/index.test.js:142:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/jobs/turn-job/index.test.js:145:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/load.test.js:43:35: 'n' is defined but never used. [Warning/no-unused-vars] +/app/test/load.test.js:53:39: 'n' is defined but never used. [Warning/no-unused-vars] +/app/test/services/face/index.test.js:47:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/face/index.test.js:50:28: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/face/index.test.js:52:25: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/face/index.test.js:57:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/face/index.test.js:60:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/face/index.test.js:62:21: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/activate-meeting-hook.test.js:23:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/activate-meeting-hook.test.js:24:9: Expected catch() or return [Error/promise/catch-or-return] +/app/test/services/meeting/activate-meeting-hook.test.js:26:17: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/activate-meeting-hook.test.js:28:13: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/activate-meeting-hook.test.js:31:25: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/activate-meeting-hook.test.js:39:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/activate-meeting-hook.test.js:39:14: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/activate-meeting-hook.test.js:40:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/activate-meeting-hook.test.js:43:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/activate-meeting-hook.test.js:52:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/activate-meeting-hook.test.js:55:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/activate-meeting-hook.test.js:58:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/add-participants-hook.test.js:40:25: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/add-participants-hook.test.js:40:33: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/add-participants-hook.test.js:41:37: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/add-participants-hook.test.js:46:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/add-participants-hook.test.js:48:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/add-participants-hook.test.js:51:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/add-participants-hook.test.js:60:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/add-participants-hook.test.js:60:14: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/add-participants-hook.test.js:61:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/add-participants-hook.test.js:64:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/add-participants-hook.test.js:74:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/add-participants-hook.test.js:77:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/add-participants-hook.test.js:80:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/add-participants-hook.test.js:90:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/add-participants-hook.test.js:92:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/add-participants-hook.test.js:95:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/deactivate-meeting-hook-test.js:70:58: 'list' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/deactivate-meeting-hook-test.js:73:54: 'list' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/deactivate-meeting-hook-test.js:89:25: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/deactivate-meeting-hook-test.js:89:33: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/deactivate-meeting-hook-test.js:90:37: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/deactivate-meeting-hook-test.js:95:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/deactivate-meeting-hook-test.js:97:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/deactivate-meeting-hook-test.js:100:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/deactivate-meeting-hook-test.js:109:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/deactivate-meeting-hook-test.js:113:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/deactivate-meeting-hook-test.js:116:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/deactivate-meeting-hook-test.js:125:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/deactivate-meeting-hook-test.js:125:23: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/deactivate-meeting-hook-test.js:132:17: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/deactivate-meeting-hook-test.js:134:13: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/deactivate-meeting-hook-test.js:137:13: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/deactivate-meeting-hook-test.js:141:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/index.test.js:17:3: Unexpected console statement. [Warning/no-console] +/app/test/services/meeting/index.test.js:26:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/index.test.js:28:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/index.test.js:31:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:12:25: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/meeting-meta.test.js:12:33: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:13:37: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:48:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/meeting-meta.test.js:51:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:54:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:61:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/meeting-meta.test.js:64:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:67:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:74:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/meeting-meta.test.js:78:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:81:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:86:5: Expected catch() or return [Error/promise/catch-or-return] +/app/test/services/meeting/meeting-meta.test.js:88:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/meeting-meta.test.js:88:23: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/meeting-meta.test.js:91:17: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/meeting-meta.test.js:93:13: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:96:13: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:104:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/meeting-meta.test.js:106:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/meeting-meta.test.js:109:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participant-changed.test.js:11:25: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/participant-changed.test.js:11:33: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participant-changed.test.js:12:37: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participant-changed.test.js:31:45: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/participant-changed.test.js:31:55: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/participant-changed.test.js:34:15: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/participant-changed.test.js:34:25: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/participant-changed.test.js:34:25: 'meeting' is already declared in the upper scope. [Error/no-shadow] +/app/test/services/meeting/participant-changed.test.js:36:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participant-changed.test.js:39:7: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participant-changed.test.js:59:45: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/participant-changed.test.js:59:55: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/participant-changed.test.js:62:15: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/participant-changed.test.js:62:25: 'meeting' is already declared in the upper scope. [Error/no-shadow] +/app/test/services/meeting/participant-changed.test.js:62:25: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/participant-changed.test.js:65:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participant-changed.test.js:68:7: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participants-event-hook.test.js:38:25: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/participants-event-hook.test.js:38:33: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participants-event-hook.test.js:39:37: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participants-event-hook.test.js:45:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/participants-event-hook.test.js:47:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participants-event-hook.test.js:50:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participants-event-hook.test.js:62:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/participants-event-hook.test.js:65:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participants-event-hook.test.js:68:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participants-event-hook.test.js:78:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/participants-event-hook.test.js:78:23: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/participants-event-hook.test.js:87:19: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/participants-event-hook.test.js:92:15: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participants-event-hook.test.js:95:15: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/participants-event-hook.test.js:100:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/remove-participants-hook.test.js:39:25: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/remove-participants-hook.test.js:39:33: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/remove-participants-hook.test.js:40:37: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/remove-participants-hook.test.js:47:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/remove-participants-hook.test.js:49:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/remove-participants-hook.test.js:52:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/remove-participants-hook.test.js:61:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/remove-participants-hook.test.js:61:14: 'meeting' is defined but never used. [Warning/no-unused-vars] +/app/test/services/meeting/remove-participants-hook.test.js:62:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/remove-participants-hook.test.js:65:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/remove-participants-hook.test.js:75:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/remove-participants-hook.test.js:78:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/remove-participants-hook.test.js:81:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/remove-participants-hook.test.js:91:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/meeting/remove-participants-hook.test.js:93:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/meeting/remove-participants-hook.test.js:96:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/participant/index.test.js:23:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/participant/index.test.js:25:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/participant/index.test.js:28:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/participant/index.test.js:37:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/participant/index.test.js:39:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/participant/index.test.js:42:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/utterance/index.test.js:58:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/utterance/index.test.js:61:28: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/utterance/index.test.js:63:25: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/utterance/index.test.js:67:5: Expected catch() or return [Error/promise/catch-or-return] +/app/test/services/utterance/index.test.js:67:25: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/utterance/index.test.js:67:33: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/utterance/index.test.js:78:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/utterance/index.test.js:84:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/utterance/index.test.js:87:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/utterance/index.test.js:94:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/utterance/index.test.js:100:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/utterance/index.test.js:103:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/utterance/index.test.js:110:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/utterance/index.test.js:117:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/services/utterance/index.test.js:125:13: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/utterance/index.test.js:128:13: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/services/utterance/index.test.js:132:9: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/shared/global-before.js:43:10: Avoid creating new promises. [Warning/promise/avoid-new] +/app/test/shared/global-before.js:44:5: Expected catch() or return [Error/promise/catch-or-return] +/app/test/shared/global-before.js:45:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/shared/global-before.js:56:13: Each then() should return a value or throw [Error/promise/always-return] +/app/test/shared/global-before.js:56:14: 'user' is already declared in the upper scope. [Error/no-shadow] +/app/test/shared/global-before.js:85:19: 'res' is defined but never used. [Warning/no-unused-vars] +/app/test/shared/global-before.js:93:23: Each then() should return a value or throw [Error/promise/always-return] +/app/test/shared/global-before.js:95:19: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/shared/global-before.js:98:19: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/shared/global-before.js:104:23: Each then() should return a value or throw [Error/promise/always-return] +/app/test/shared/global-before.js:104:31: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] +/app/test/shared/global-before.js:105:35: Avoid calling back inside of a promise. [Warning/promise/no-callback-in-promise] + +286 problems +---- Added manually (from the console report) + +✖ 286 problems (109 errors, 177 warnings) + 0 errors, 10 warnings potentially fixable with the `--fix` option. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..224b19c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3861 @@ +{ + "name": "rhythm-server", + "version": "0.3.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@feathers-plus/batch-loader": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@feathers-plus/batch-loader/-/batch-loader-0.3.3.tgz", + "integrity": "sha512-1ZQ8wRScn6/Si4k8ARdGNAWiBqM90V22/IZqkSmu0zhqFtfk+h/l9od4hGWKdKCw9R5TtcL+CvPZBOa5AT6JfQ==" + }, + "@feathersjs/authentication": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication/-/authentication-2.1.5.tgz", + "integrity": "sha512-lz/b0coSnc3SSHOeEJIvT6n3r+HvVIcrZo9eKnbaEx6roZnw4oGU9dbiCHr1VKH3yNDR+fVrV0hzPfh5Nb67sg==", + "requires": { + "@feathersjs/commons": "^1.2.0", + "@feathersjs/errors": "^3.0.0", + "@feathersjs/socket-commons": "^3.1.2", + "debug": "^3.1.0", + "jsonwebtoken": "^8.0.0", + "lodash.clone": "^4.5.0", + "lodash.merge": "^4.6.0", + "lodash.omit": "^4.5.0", + "lodash.pick": "^4.4.0", + "long-timeout": "^0.1.1", + "ms": "^2.0.0", + "passport": "^0.4.0", + "uuid": "^3.1.0" + } + }, + "@feathersjs/authentication-client": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication-client/-/authentication-client-1.0.2.tgz", + "integrity": "sha512-uZfWWMLqNkXcGi5bCuvQwLjBWvUhHtGjK4yZJh3KIHFAESBlQ4/TlqI/JRz2RuswfGfbyNtj9ARPam71YCGOpw==", + "requires": { + "@feathersjs/errors": "^3.0.0", + "debug": "^3.1.0", + "jwt-decode": "^2.1.0" + } + }, + "@feathersjs/authentication-jwt": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication-jwt/-/authentication-jwt-2.0.1.tgz", + "integrity": "sha512-2EhgBEFLWm87ZuHcCQtahbujEgwe8++aUGj9rCcFSCWx4oz9S/0NfRH37AtKQuHpdnTG9rClLOP23KqvhOLeLQ==", + "requires": { + "@feathersjs/errors": "^3.0.0", + "debug": "^3.1.0", + "lodash.merge": "^4.6.0", + "lodash.omit": "^4.5.0", + "lodash.pick": "^4.4.0", + "passport-jwt": "^4.0.0" + } + }, + "@feathersjs/authentication-local": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication-local/-/authentication-local-1.2.1.tgz", + "integrity": "sha512-FS78aGjs+zVp3ovXsBmqToqN9mIF1AUFfssnFFa7zcfzuzIp6s3kJARfamdBZH4duq/QW1eO0xRVPIJj9BqZ+A==", + "requires": { + "@feathersjs/errors": "^3.0.0", + "bcryptjs": "^2.3.0", + "debug": "^3.1.0", + "lodash": "^4.17.5", + "passport-local": "^1.0.0" + } + }, + "@feathersjs/client": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@feathersjs/client/-/client-3.4.5.tgz", + "integrity": "sha512-kLXwyI4i+eAsDuqZcUhWuQ0ttDCsbxEOKvUGBw/mzmfFg/2kWFfa7YIoheTkZ/udCxRjUISDPHxh6i7h2sHpyA==", + "requires": { + "@feathersjs/authentication-client": "1.0.2", + "@feathersjs/errors": "3.3.0", + "@feathersjs/feathers": "3.1.5", + "@feathersjs/primus-client": "1.1.0", + "@feathersjs/rest-client": "1.3.4", + "@feathersjs/socketio-client": "1.1.0" + } + }, + "@feathersjs/commons": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-1.4.1.tgz", + "integrity": "sha512-hs3Tz0JV/nwd14B9s+mv4SG+Tll9pDxqEn2wuc5CzL4I2vc1+EnwnhpOkokvQMTAdzsaxwOLoQ4y1BPm6WmMNA==" + }, + "@feathersjs/configuration": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@feathersjs/configuration/-/configuration-1.0.2.tgz", + "integrity": "sha512-y0XXfkQF0nFYFwzx/nh2sTfVRetVNBFZd5WQCRCz+tCA2DA17oN9cnFCmuZi9/KVsdLZjx7WG9RmnSkRON9E2Q==", + "requires": { + "config": "^1.27.0", + "debug": "^3.1.0" + } + }, + "@feathersjs/errors": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-3.3.0.tgz", + "integrity": "sha512-9oYAhAj4CKIix5KITRDEzvyNJNIaqNde5lGqmrQLw4pTuyWMvx9tgBhtXPA0l8lS1KnMKw4Qf1gHo6aKrM+OyQ==", + "requires": { + "debug": "^3.1.0" + } + }, + "@feathersjs/express": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-1.2.2.tgz", + "integrity": "sha512-Z5sFXcIHxn5ZPdrYeqAndXTPfmSvKbc1YJ1afZmsqXWYM7sD/xa2jZxXodI4KNLRJChKt6kTiWACyolKVXUOkg==", + "requires": { + "@feathersjs/commons": "^1.4.0", + "@feathersjs/errors": "^3.0.0", + "debug": "^3.1.0", + "express": "^4.16.2", + "uberproto": "^1.2.0" + } + }, + "@feathersjs/feathers": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-3.1.5.tgz", + "integrity": "sha512-GrgAjh44jx6I1xmZFa9Nkub5GIlnGKmP6Id1Ys0P+NQFPYALdtUs6idmuBFGf3Rc+uKHWpbB13eTnNfDSGKZdQ==", + "requires": { + "@feathersjs/commons": "^1.4.0", + "debug": "^3.1.0", + "events": "^2.0.0", + "uberproto": "^1.2.0" + } + }, + "@feathersjs/primus-client": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@feathersjs/primus-client/-/primus-client-1.1.0.tgz", + "integrity": "sha512-a6zczmbHF7Rmm/KHNMIlD6CNEjdhbFkCHxdBaM+CaKMb9tkW8sNdR4Pc1VA/t8CRUqOSECPE9mk141MwoKwQRA==", + "requires": { + "@feathersjs/transport-commons": "^4.0.0" + } + }, + "@feathersjs/rest-client": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@feathersjs/rest-client/-/rest-client-1.3.4.tgz", + "integrity": "sha512-GIe4u6uLk/69A8qOee2Zz9XQBkO1C6jNWFjWYoKiiuOj3Gz294AHv5tMF7DzmnWOQyVosSrZOzgfH98yf2VNuw==", + "requires": { + "@feathersjs/commons": "^1.2.0", + "@feathersjs/errors": "^3.0.0", + "qs": "^6.5.0" + } + }, + "@feathersjs/socket-commons": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@feathersjs/socket-commons/-/socket-commons-3.1.5.tgz", + "integrity": "sha512-cnMqVNGR0fOM00UqRmslmPiUZ2UKToTxesoGwZvhvq4unF032KzS4gz8bZ7qYsin9HmAP/E2gs2v0119CR7LKQ==", + "requires": { + "@feathersjs/errors": "^3.0.0", + "debug": "^3.1.0", + "lodash": "^4.17.4", + "url-pattern": "^1.0.3" + } + }, + "@feathersjs/socketio": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@feathersjs/socketio/-/socketio-3.2.1.tgz", + "integrity": "sha512-QGIptIgsbyyKzmCE0Hzd5HBAq80CnM/Qaq4e3aqs3gpe+GUUeVubpmZszLhapzwwto8WshxWVWUQLQZ+uRYH9g==", + "requires": { + "@feathersjs/transport-commons": "^4.0.0", + "debug": "^3.1.0", + "socket.io": "^2.1.0" + } + }, + "@feathersjs/socketio-client": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@feathersjs/socketio-client/-/socketio-client-1.1.0.tgz", + "integrity": "sha512-2ry9vX8qIF1Nax3G3r121Utsnj5NQbGgBG7K0M3RTJc+93Gg46BrnLVMFKue5fz2YTIOpHfHDRu1qqbddTJLXQ==", + "requires": { + "@feathersjs/transport-commons": "^4.0.0" + } + }, + "@feathersjs/transport-commons": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@feathersjs/transport-commons/-/transport-commons-4.0.0.tgz", + "integrity": "sha512-O+kuJWpdao0Lw5Pg/65eOuMIlxu+aP9bnK9jNlxfwVdqCxw4eX3Jh8WS0WmQpfZYILk5oyhP/IUdHgSqcjaXgw==", + "requires": { + "@feathersjs/commons": "^1.4.0", + "@feathersjs/errors": "^3.0.0", + "debug": "^3.1.0", + "lodash": "^4.17.4", + "radix-router": "^3.0.1" + } + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==" + }, + "acorn-globals": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", + "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", + "requires": { + "acorn": "^5.0.0" + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "^4.14.0" + } + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" + }, + "base64url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.x.x" + }, + "dependencies": { + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-process-hrtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=" + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "bson": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz", + "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "compressible": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "requires": { + "mime-db": ">= 1.33.0 < 2" + } + }, + "compression": { + "version": "1.7.2", + "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "requires": { + "accepts": "~1.3.4", + "bytes": "3.0.0", + "compressible": "~2.0.13", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/config/-/config-1.30.0.tgz", + "integrity": "sha1-HWCp81NIoTwXV5jThOgaWhbDum4=", + "requires": { + "json5": "0.4.0", + "os-homedir": "1.0.2" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "coveralls": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", + "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==", + "dev": true, + "requires": { + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.79.0" + }, + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "qs": "~6.3.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1", + "uuid": "^3.0.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + } + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.x.x" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.x.x" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + } + } + }, + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "requires": { + "cssom": "0.3.x" + } + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, + "d3-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", + "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" + }, + "d3-axis": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", + "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=" + }, + "d3-collection": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", + "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" + }, + "d3-color": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.1.0.tgz", + "integrity": "sha512-IZVcqX5yYFvR2NUBbSfIfbgNcSgAtZ7JbgQWqDXf4CywtN7agvI7Kw6+Q1ETvlHOHWJT55Kyuzt0C3I0GVtRHQ==" + }, + "d3-format": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz", + "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==" + }, + "d3-interpolate": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", + "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.0.0.tgz", + "integrity": "sha512-Sa2Ny6CoJT7x6dozxPnvUQT61epGWsgppFvnNl8eJEzfJBG0iDBBTJAtz2JKem7Mb+NevnaZiDiIDHsuWkv6vg==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.0.tgz", + "integrity": "sha512-YwMbiaW2bStWvQFByK8hA6hk7ToWflspIo2TRukCqERd8isiafEMBXmwfh8c7/0Z94mVvIzIveRLVC6RAjhgeA==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz", + "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" + }, + "d3-time": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", + "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" + }, + "d3-time-format": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", + "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", + "requires": { + "d3-time": "1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz", + "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", + "requires": { + "abab": "^1.0.4", + "whatwg-mimetype": "^2.0.0", + "whatwg-url": "^6.4.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "optional": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", + "requires": { + "base64url": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "engine.io": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", + "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "~1.0.2" + } + }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + }, + "dependencies": { + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "globals": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + } + } + }, + "eslint-plugin-promise": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz", + "integrity": "sha512-2WO+ZFh7vxUKRfR0cOIMrWgYKdR6S1AlOezw6pC52B6oYpd5WFghN+QHxvrRdZMtbo8h3dfUZ2o1rWb0UPbKtg==", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "events": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.0.0.tgz", + "integrity": "sha512-r/M5YkNg9zwI8QbSf7tsDWWJvO3PGwZXyG7GpFAxtMASnHL2eblFd7iHiGPtyGKKFPZ59S63NeX10Ws6WqGDcg==" + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, + "faker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", + "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=", + "dev": true + }, + "fast-deep-equal": { + "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", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "feathers-authentication-hooks": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/feathers-authentication-hooks/-/feathers-authentication-hooks-0.2.0.tgz", + "integrity": "sha512-jebnA47GHNcWzFlHS7/f2A20GDoe+jlNNdbxL+6yFe9xDOJn+Y2weFhzdeeK5ZxQ+oc0lh0KS6USS4T9aMGrng==", + "requires": { + "@feathersjs/errors": "^3.3.0", + "debug": "^3.1.0", + "lodash": "^4.17.5" + } + }, + "feathers-hooks-common": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/feathers-hooks-common/-/feathers-hooks-common-4.11.1.tgz", + "integrity": "sha512-+tt8M57zdL4N0hIMsML2C688DhC6oAgvH48rU1bDLmgTHe4wt7XJ9N4ewpkFQ0SxsUngBbN/hi/iOBbxnFfFzw==", + "requires": { + "@feathers-plus/batch-loader": "^0.3.0", + "@feathersjs/commons": "^1.4.0", + "@feathersjs/errors": "^3.3.0", + "@feathersjs/feathers": "^3.1.3", + "ajv": "^5.5.2", + "debug": "^3.1.0", + "process": "0.11.10", + "traverse": "^0.6.6" + } + }, + "feathers-mongoose": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/feathers-mongoose/-/feathers-mongoose-6.1.1.tgz", + "integrity": "sha512-m35hSzEF62M7/a6Qk8TmPHdFkAUqp7RnHirgiSFPXUbs4e9iq7unl1NBtudr7MqoVCMY49nIUhJasaEtJFB/NA==", + "requires": { + "@feathersjs/commons": "^1.3.0", + "@feathersjs/errors": "^3.2.0", + "lodash.omit": "^4.3.0", + "uberproto": "^1.2.0" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", + "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" + }, + "dependencies": { + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + } + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-coveralls": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/istanbul-coveralls/-/istanbul-coveralls-1.0.3.tgz", + "integrity": "sha1-TxwVkr4QTVkfkzy/nA8vUoStzwA=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "coveralls": "^2.11.2", + "minimist": "^1.1.1", + "rimraf": "^2.3.4", + "sum-up": "^1.0.1" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsdom": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz", + "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", + "requires": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + } + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsonwebtoken": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz", + "integrity": "sha512-l8rUBr0fqYYwPc8/ZGrue7GiW7vWdZtZqelxo4Sd5lMvuEeCK8/wS54sEo6tJhdZ6hqfutsj6COgC0d1XdbHGw==", + "requires": { + "jws": "^3.1.4", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "xtend": "^4.0.1" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jwa": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", + "requires": { + "base64url": "2.0.0", + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.9", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", + "requires": { + "base64url": "^2.0.0", + "jwa": "^1.1.4", + "safe-buffer": "^5.0.1" + } + }, + "jwt-decode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", + "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk=" + }, + "kareem": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.0.7.tgz", + "integrity": "sha512-p8+lEpsNs4N0fvNOC1/zzDO0wDrD3Pb1G+OwfIG+gKVK3MyY5jeaGYh+9Qx6jb4fEG2b3E6U98vaE9MH7Gilsw==" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "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.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.1.tgz", + "integrity": "sha512-kKKs/H1KrMMQIEsWNxGmb4/BGsmj0dkeyotEvbrAuQ01FcWRLssUNXCEUZk6SZtyJBi6EE7SL0zDDtItw1rGhw==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "mocha-mongo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mocha-mongo/-/mocha-mongo-1.0.0.tgz", + "integrity": "sha1-q3Kaq60uTa5Rj7UPKpEB/qbXTfQ=", + "dev": true, + "requires": { + "mongodb": "^2.2.24", + "qbox": "0.1.x" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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.4", + "require_optional": "~1.0.0" + } + }, + "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=", + "dev": true + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "dev": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "mongodb": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.8.tgz", + "integrity": "sha512-mj7yIUyAr9xnO2ev8pcVJ9uX7gSum5LLs1qIFoWLxA5Il50+jcojKtaO1/TbexsScZ9Poz00Pc3b86GiSqJ7WA==", + "requires": { + "mongodb-core": "3.0.8" + } + }, + "mongodb-core": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.8.tgz", + "integrity": "sha512-dFxfhH9N7ohuQnINyIl6dqEF8sYOE0WKuymrFf3L3cipJNrx+S8rAbNOTwa00/fuJCjBMJNFsaA+R2N16//UIw==", + "requires": { + "bson": "~1.0.4", + "require_optional": "^1.0.1" + } + }, + "mongoose": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.1.0.tgz", + "integrity": "sha512-GFx4Z2YpfxRQ9BExd2ML5MDKYdzOjdXB5a6fhove98EP6iB8tgZDY/fKSociEMJSIA37auPXmKfGfrc2uAMkMQ==", + "requires": { + "async": "2.1.4", + "bson": "~1.0.5", + "kareem": "2.0.7", + "lodash.get": "4.4.2", + "mongodb": "3.0.8", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.4.1", + "mquery": "3.0.0", + "ms": "2.0.0", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "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==" + }, + "mpath": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.4.1.tgz", + "integrity": "sha512-NNY/MpBkALb9jJmjpBlIi6GRoLveLUM0pJzgbp9vY9F7IQEb/HREC/nxrixechcQwd1NevOhJnWWV8QQQRE+OA==" + }, + "mquery": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.0.0.tgz", + "integrity": "sha512-WL1Lk8v4l8VFSSwN3yCzY9TXw+fKVYKn6f+w86TRzOLSE8k1yTgGaLBPUByJQi8VcLbOdnUneFV/y3Kv874pnQ==", + "requires": { + "bluebird": "3.5.0", + "debug": "2.6.9", + "regexp-clone": "0.0.1", + "sliced": "0.0.5" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "nodemailer": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.6.4.tgz", + "integrity": "sha512-SD4uuX7NMzZ5f5m1XHDd13J4UC3SmdJk8DsmU1g6Nrs5h3x9LcXr6EBPZIqXRJ3LrF7RdklzGhZRF/TuylTcLg==" + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "passport": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", + "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-jwt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", + "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", + "requires": { + "jsonwebtoken": "^8.2.0", + "passport-strategy": "^1.0.0" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", + "requires": { + "passport-strategy": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "promise": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", + "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", + "requires": { + "asap": "~2.0.3" + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + }, + "qbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/qbox/-/qbox-0.1.7.tgz", + "integrity": "sha1-6A8NxdCfhp2IghaMP2asjdKEDwI=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "radix-router": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/radix-router/-/radix-router-3.0.1.tgz", + "integrity": "sha512-jpHXHgP+ZmVzEfmZ7WVRSvc/EqMoAqYuMtBsHd9s47Hs9Iy8FDJhkweMrDH0wmdxanLzVIWhq0UpomLXNpW8tg==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "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", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "requires": { + "lodash": "^4.13.1" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" + } + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } + } + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.x.x" + }, + "dependencies": { + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + } + } + }, + "socket.io": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.0.tgz", + "integrity": "sha512-KS+3CNWWNtLbVN5j0/B+1hjxRzey+oTK6ejpAOoxMZis6aXeB8cUtfuvjHl97tuZx+t/qD/VyqFMjuzu2Js6uQ==", + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.0", + "socket.io-parser": "~3.2.0" + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" + }, + "socket.io-client": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.0.tgz", + "integrity": "sha512-TvKPpL0cBON5LduQfR8Rxrr+ktj70bLXGvqHCL3er5avBXruB3gpnbaud5ikFYVfANH1gCABAvo0qN8Axpg2ew==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "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.2.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "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", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "sum-up": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", + "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "tough-cookie": { + "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" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uberproto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-1.2.0.tgz", + "integrity": "sha1-YdTqsCT5CcTm6lK+hnxIlKS+63Y=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "underscore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.0.tgz", + "integrity": "sha512-4IV1DSSxC1QK48j9ONFK1MoIAKKkbE8i7u55w2R6IqBqbT7A/iG7aZBCR2Bi8piF0Uz+i/MG1aeqLwl/5vqF+A==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "url-pattern": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/url-pattern/-/url-pattern-1.0.3.tgz", + "integrity": "sha1-BAkpJHGyTyPFDWWkeTF5PStaz8E=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", + "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "requires": { + "iconv-lite": "0.4.19" + } + }, + "whatwg-mimetype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", + "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==" + }, + "whatwg-url": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz", + "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "winston": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.2.tgz", + "integrity": "sha512-4S/Ad4ZfSNl8OccCLxnJmNISWcm2joa6Q0YGDxlxMzH0fgSwWsjMt+SmlNwCqdpaPg3ev1HKkMBsIiXeSUwpbA==", + "requires": { + "async": "~1.0.0", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "stack-trace": "0.0.x" + }, + "dependencies": { + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" + } + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/package.json b/package.json index 1d07cf8..a78ff1b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "rhythm-server", "description": "server for breakout, a measurement and feedback framework for human communication", - "version": "0.3.0", + "version": "0.4.0-dev.2", "homepage": "", "main": "src/", "keywords": [ @@ -13,61 +13,56 @@ "contributors": [], "bugs": {}, "engines": { - "node": "5.4.0" + "node": ">=5.4.0" }, "scripts": { - "test": "npm run stylecheck && npm run mocha", + "test": "npm run lint && npm run mocha", "start": "node -r dotenv/config src/", - "mocha": "node -r dotenv/config ./node_modules/.bin/mocha $(find test -type f \\( ! -name load* ! -name *.swp \\) | sort)", + "mocha": "./node_modules/.bin/mocha --reporter spec -r dotenv/config --recursive --sort --invert --grep 'Load tests' test", "loadtest": " -r dotenv/config ./node_modules/.bin/mocha test/load.test.js", "coverage": "istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && istanbul-coveralls", - "stylecheck": "find src/ test/ -name *.js | xargs ./node_modules/.bin/standard" + "lint": "./node_modules/.bin/eslint --format stylish src test" }, "dependencies": { - "body-parser": "1.15.0", - "compression": "1.6.1", - "cors": "2.7.1", - "d3": "3.5.17", - "dotenv": "2.0.0", - "feathers": "2.0.1", - "feathers-authentication": "0.7.0", - "feathers-client": "~1.3.2", - "feathers-configuration": "0.2.2", - "feathers-errors": "2.1.0", - "feathers-hooks": "~1.5.4", - "feathers-mongoose": "3.3.6", - "feathers-rest": "1.2.4", - "feathers-socketio": "1.3.3", - "jsdom": "^9.8.3", - "mongodb": "^2.2.33", - "mongoose": "4.4.11", - "nodemailer": "^2.6.4", - "passport": "0.3.2", - "promise": "7.1.1", - "request": "^2.78.0", - "serve-favicon": "2.3.0", - "socket.io-client": "~1.4.6", - "underscore": "1.8.3", - "winston": "2.2.0" + "@feathersjs/authentication": "^2.1.3", + "@feathersjs/authentication-client": "^1.0.2", + "@feathersjs/authentication-jwt": "^2.0.1", + "@feathersjs/authentication-local": "^1.2.1", + "@feathersjs/client": "^3.4.5", + "@feathersjs/configuration": "^1.0.2", + "@feathersjs/errors": "^3.3.0", + "@feathersjs/express": "^1.2.1", + "@feathersjs/feathers": "^3.1.5", + "@feathersjs/socketio": "^3.2.1", + "body-parser": "^1.18.2", + "compression": "^1.7.2", + "cors": "^2.8.4", + "d3-array": "^1.2.1", + "d3-axis": "^1.0.8", + "d3-scale": "^2.0.0", + "d3-scale-chromatic": "^1.3.0", + "d3-selection": "^1.3.0", + "dotenv": "^5.0.1", + "feathers-authentication-hooks": "^0.2.0", + "feathers-hooks-common": "^4.11.1", + "feathers-mongoose": "^6.1.0", + "jsdom": "^11.10.0", + "mongoose": "^5.1.0", + "nodemailer": "^4.6.4", + "promise": "^8.0.1", + "socket.io-client": "^2.1.0", + "underscore": "^1.8.3", + "winston": "^2.4.1" }, "devDependencies": { - "Faker": "0.7.2", - "coveralls": "2.11.9", - "eslint": "^3.8.1", - "eslint-config-standard": "^6.2.0", - "eslint-config-standard-jsx": "^3.2.0", + "coveralls": "^2.13.3", + "eslint": "^4.19.1", "eslint-plugin-promise": "^3.3.0", - "eslint-plugin-react": "^6.4.1", - "eslint-plugin-standard": "^2.0.1", - "feathers-client": "1.1.0", - "feathers-hooks": "1.5.3", - "istanbul": "0.4.3", - "istanbul-coveralls": "1.0.3", - "mocha": "2.4.5", - "mocha-mongo": "0.2.0", - "promise": "7.1.1", - "request": "2.69.0", - "socket.io-client": "1.4.5", - "standard": "^7.1.2" + "faker": "^4.1.0", + "istanbul": "^0.4.5", + "istanbul-coveralls": "^1.0.3", + "mocha": "^5.1.1", + "mocha-mongo": "^1.0.0", + "mongodb": "^3.0.8" } } diff --git a/src/app.js b/src/app.js index 652f1a8..3f08c9e 100644 --- a/src/app.js +++ b/src/app.js @@ -1,39 +1,43 @@ 'use strict' const path = require('path') -const serveStatic = require('feathers').static +const feathers = require('@feathersjs/feathers') +const express = require('@feathersjs/express') const compress = require('compression') const cors = require('cors') -const feathers = require('feathers') -const configuration = require('feathers-configuration') -const hooks = require('feathers-hooks') -const rest = require('feathers-rest') +const configuration = require('@feathersjs/configuration') const bodyParser = require('body-parser') -const socketio = require('feathers-socketio') +const socketio = require('@feathersjs/socketio') const middleware = require('./middleware') const services = require('./services') const events = require('./events') const jobs = require('./jobs') const scripts = require('./scripts') -const app = module.exports = feathers() +const channels = require('./channels') + +// Create an Express compatible Feathers application +const app = express(feathers()) +module.exports = app app.configure(configuration(path.join(__dirname, '..'))) +// Add body parsing middleware +app.use(bodyParser.json()) +app.use(bodyParser.urlencoded({ extended: true })) + +// Initialize REST provider +app.configure(express.rest()) + app.use(compress()) .options('*', cors()) .use(cors()) - .use('/', serveStatic(app.get('www'))) - .use(bodyParser.json()) - .use(bodyParser.urlencoded({ extended: true })) - .configure(hooks()) - .configure(rest()) .configure(socketio((io) => { io.set('transports', [ 'websocket', 'flashsocket', 'htmlfile', 'xhr-polling', - 'jsonp-polling' + 'jsonp-polling', ]) io.on('connection', (socket) => { @@ -41,7 +45,12 @@ app.use(compress()) events.configure(socket, app) }) })) - .configure(services) + +// Statically host some files +app.use('/', express.static(app.get('www'))) + +app.configure(services) + .configure(channels) .configure(middleware) .configure(scripts) diff --git a/src/channels.js b/src/channels.js new file mode 100644 index 0000000..f255b38 --- /dev/null +++ b/src/channels.js @@ -0,0 +1,74 @@ +/* ******************************************** + * + * This file was taken from the feathers v2 to v3 migration guide + * (https://docs.feathersjs.com/migrating.html) + * for an initial quick pass at migrating the use of event filters + * `.filter()` + * + * However (from that guide): + * Very important: This channels.js file will publish all + * real-time events to all authenticated users. This is already safer + * than the previous default but you should carefully review the + * channels documentation and implement appropriate channels so + * that only the right users are going to receive real-time events. + * + * ********************************************/ + +module.exports = function (app) { + if (typeof app.channel !== 'function') { + // If no real-time functionality has been configured just return + return + } + + app.on('connection', (connection) => { + // On a new real-time connection, add it to the anonymous channel + app.channel('anonymous').join(connection) + }) + + app.on('login', (authResult, { connection }) => { + // connection can be undefined if there is no + // real-time connection, e.g. when logging in via REST + if (connection) { + // Obtain the logged in user from the connection + // const user = connection.user; + + // The connection is no longer anonymous, remove it + app.channel('anonymous').leave(connection) + + // Add it to the authenticated user channel + app.channel('authenticated').join(connection) + + // Channels can be named anything and joined on any condition + + // E.g. to send real-time events only to admins use + // if(user.isAdmin) { app.channel('admins').join(connection); } + + // If the user has joined e.g. chat rooms + // if(Array.isArray(user.rooms)) user.rooms.forEach(room => app.channel(`rooms/${room.id}`).join(channel)); + + // Easily organize users by email and userid for things like messaging + // app.channel(`emails/${user.email}`).join(channel); + // app.channel(`userIds/$(user.id}`).join(channel); + } + }) + + app.publish((data, hook) => { // eslint-disable-line no-unused-vars + // Here you can add event publishers to channels set up in `channels.js` + // To publish only for a specific event use `app.publish(eventname, () => {})` + + // e.g. to publish all service events to all authenticated users use + return app.channel('authenticated') + }) + + // Here you can also add service specific event publishers + // e..g the publish the `users` service `created` event to the `admins` channel + // app.service('users').publish('created', () => app.channel('admins')); + + // With the userid and email organization from above you can easily select involved users + // app.service('messages').publish(() => { + // return [ + // app.channel(`userIds/${data.createdBy}`), + // app.channel(`emails/${data.recipientEmail}`) + // ]; + // }); +} diff --git a/src/events/meetingJoinedEvent.js b/src/events/meetingJoinedEvent.js index eaf2db3..3b6fabd 100644 --- a/src/events/meetingJoinedEvent.js +++ b/src/events/meetingJoinedEvent.js @@ -6,18 +6,20 @@ const winston = require('winston') const _ = require('underscore') function addParticipantToMeeting (app, participant, meeting) { - return app.service('meetings').get(meeting).then((meeting) => { - // now patch the meeting to include the participant - winston.log('info', 'patching meeting: ', meeting) - winston.log('info', 'adding participant to meeting: ', participant._id) - var parts = meeting.participants || [] - return app.service('meetings').patch(meeting, { - participants: _.uniq(parts.concat([participant._id])) - }).then((meeting) => { - winston.log('info', 'updated meeting with participants: ', meeting) - return meeting + return app.service('meetings') + .get(meeting) + .then((meeting) => { + // now patch the meeting to include the participant + winston.log('info', 'patching meeting: ', meeting) + winston.log('info', 'adding participant to meeting: ', participant._id) + var parts = meeting.participants || [] + return app.service('meetings') + .patch(meeting, { participants: _.uniq(parts.concat([ participant._id ])) }) + .then((meeting) => { + winston.log('info', 'updated meeting with participants: ', meeting) + return meeting + }) }) - }) } function getOrCreateParticipant (obj) { @@ -30,27 +32,32 @@ function getOrCreateParticipant (obj) { let email = participant.email || data.participant.email return app.service('participants') .patch(participant._id, { - meetings: _.uniq(participant.meetings.concat([data.meeting])), + meetings: _.uniq(participant.meetings.concat([ data.meeting ])), email: email - }).then((participant) => { + }) + .then((participant) => { return addParticipantToMeeting(app, participant, data.meeting) }) - }).catch((err) => { + }) + .catch((err) => { winston.log('info', 'creating a new participant...', err) - return app.service('participants').create({ - _id: data.participant, - name: data.name, - email: data.email, - consent: data.consent || false, - consentDate: data.consentDate || null, - meetings: [data.meeting] - }).then((participant) => { - winston.log('info', 'created a new participant', participant._id) - return addParticipantToMeeting(app, participant, data.meeting) - }).catch((err) => { - winston.log('info', 'couldnt make a new participant', err) - return err - }) + return app.service('participants') + .create({ + _id: data.participant, + name: data.name, + email: data.email, + consent: data.consent || false, + consentDate: data.consentDate || null, + meetings: [ data.meeting ] + }) + .then((participant) => { + winston.log('info', 'created a new participant', participant._id) + return addParticipantToMeeting(app, participant, data.meeting) + }) + .catch((err) => { + winston.log('info', 'couldnt make a new participant', err) + return err + }) }) } @@ -79,24 +86,27 @@ function getOrCreateMeeting (data, app) { winston.log('info', 'no meeting found', data) winston.log('info', 'creating meeting') // get the number of meetings for this group - return app.service('meetings').find({ query: { room: data.room } }).then((mtgs) => { - // generate an id for the new meeting based on room - let id = data.room + '-' + (mtgs.length + 1) - return app.service('meetings').create({ - _id: id, - room: data.room, - active: true, - meetingUrl: data.meetingUrl, - meta: JSON.parse(meta) - }).then((meeting) => { - winston.log('info', 'new meeting created', meeting._id) - data.meeting = meeting._id - return { data: data, app: app } - }).catch((err) => { - winston.log('error', 'couldnt create new meeting', err) - return err + return app.service('meetings').find({ query: { room: data.room } }) + .then((mtgs) => { + // generate an id for the new meeting based on room + let id = data.room + '-' + (mtgs.length + 1) + return app.service('meetings').create({ + _id: id, + room: data.room, + active: true, + meetingUrl: data.meetingUrl, + meta: JSON.parse(meta) + }) + .then((meeting) => { + winston.log('info', 'new meeting created', meeting._id) + data.meeting = meeting._id + return { data: data, app: app } + }) + .catch((err) => { + winston.log('error', 'couldnt create new meeting', err) + return err + }) }) - }) } }) } diff --git a/src/filters/index.js b/src/filters/index.js deleted file mode 100644 index 5f0ec65..0000000 --- a/src/filters/index.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -// Any filters that are shared across services are here - -const winston = require('winston') - -function authenticationFilter (data, connection) { - if (!connection.user) { - winston.log('info', 'User not authenticated.', connection.user) - return false - } - return data -} - -module.exports = { - authenticationFilter: authenticationFilter -} diff --git a/src/jobs/end-meeting-job.js b/src/jobs/end-meeting-job.js index 08dd1f0..8864f04 100644 --- a/src/jobs/end-meeting-job.js +++ b/src/jobs/end-meeting-job.js @@ -14,16 +14,19 @@ var scope = {} // returns a list of all active meetings, or false if an error occurred. var getActiveMeetings = function () { - return scope.app.service('meetings').find({ - query: { - active: true - } - }).then((meetings) => { - return meetings - }).catch((err) => { - winston.log('error', 'Couldnt find any active meetings:', err) - return [] - }) + return scope.app.service('meetings') + .find({ + query: { + active: true + } + }) + .then((meetings) => { + return meetings + }) + .catch((err) => { + winston.log('error', 'Couldnt find any active meetings:', err) + return [] + }) } // returns an object that indicates whether the given meeting should be ended. @@ -31,47 +34,50 @@ var isMeetingEnded = function (meeting, passedApp) { // TODO make this return true/false instead of an object winston.log('info', 'isMeetingEnded', meeting) var app = passedApp === undefined ? scope.app : passedApp - return app.service('utterances').find({ - query: { - meeting: meeting, - $sort: {endTime: -1}, - $limit: 1 - } - }).then((lastUtterances) => { - var waitFor - if (lastUtterances.length === 0) { - waitFor = app.service('meetings').get(meeting).then((meetingObject) => { - return (new Date().getTime() - new Date(meetingObject.startTime).getTime()) + return app.service('utterances') + .find({ + query: { + meeting: meeting, + $sort: { endTime: -1 }, + $limit: 1 + } + }) + .then((lastUtterances) => { + var waitFor + if (lastUtterances.length === 0) { + waitFor = app.service('meetings').get(meeting).then((meetingObject) => { + return new Date().getTime() - new Date(meetingObject.startTime).getTime() + }) + } else { + waitFor = Promise.resolve(new Date().getTime() - new Date(lastUtterances[0].endTime).getTime()) + } + return waitFor.then((elapsedTime) => { + var meetingShouldEnd = elapsedTime > MAX_TIME_SINCE_LAST_UTTERANCE + winston.log('info', 'should end?:', elapsedTime, MAX_TIME_SINCE_LAST_UTTERANCE) + winston.log('info', 'should end?:', elapsedTime > MAX_TIME_SINCE_LAST_UTTERANCE) + return { meetingShouldEnd: meetingShouldEnd, + meeting: meeting } }) - } else { - waitFor = Promise.resolve(new Date().getTime() - new Date(lastUtterances[0].endTime).getTime()) - } - return waitFor.then((elapsedTime) => { - var meetingShouldEnd = elapsedTime > MAX_TIME_SINCE_LAST_UTTERANCE - winston.log('info', 'should end?:', elapsedTime, MAX_TIME_SINCE_LAST_UTTERANCE) - winston.log('info', 'should end?:', elapsedTime > MAX_TIME_SINCE_LAST_UTTERANCE) - return {meetingShouldEnd: meetingShouldEnd, - meeting: meeting} }) - }).catch((err) => { - winston.log('error', 'Couldnt find last utterance:', err) - // TODO maybe this is why meetings end if you havent spoken yet - // despite the requisite elapsed time not passing - return {meetingShouldEnd: true, - meeting: meeting} - }) + .catch((err) => { + winston.log('error', 'Couldnt find last utterance:', err) + // TODO maybe this is why meetings end if you havent spoken yet + // despite the requisite elapsed time not passing + return { meetingShouldEnd: true, meeting: meeting } + }) } var maybeEndMeeting = function (context, passedApp) { var app = passedApp === undefined ? scope.app : passedApp if (context.meetingShouldEnd) { winston.log('info', 'meetingShouldEnd', JSON.stringify(context.meeting)) - return app.service('meetings').patch(context.meeting, {participants: [], active: false}) + return app.service('meetings').patch(context.meeting, { participants: [], active: false }) .then((patchedMeeting) => { winston.log('info', 'patched meeting w/ id: ', patchedMeeting._id) return patchedMeeting.participants.length === 0 && patchedMeeting.active === false - }).catch((err) => { + }) + .catch((err) => { winston.log('info', 'Couldnt patch meeting!', err) return false }) @@ -97,11 +103,14 @@ var endInactiveMeetings = function (meetings, passedApp) { var monitorMeetings = function () { // not sure that this promise chain works the way I'd like it to winston.log('info', '[end-meeting-job] checking all meetings...') - getActiveMeetings().then(endInactiveMeetings).then((endedMeetings) => { - console.log('info', '(maybe) ended meetings:', endedMeetings) - }).catch((err) => { - console.log('info', 'oops:', err) - }) + getActiveMeetings() + .then(endInactiveMeetings) + .then((endedMeetings) => { + console.log('info', '(maybe) ended meetings:', endedMeetings) + }) + .catch((err) => { + console.log('info', 'oops:', err) + }) } var startMonitoringMeetings = function (app) { diff --git a/src/jobs/turn-job/turn-analytics.js b/src/jobs/turn-job/turn-analytics.js index 5a7cb50..3440769 100644 --- a/src/jobs/turn-job/turn-analytics.js +++ b/src/jobs/turn-job/turn-analytics.js @@ -34,69 +34,81 @@ function computeTurns (app, meeting, from, to) { to = new Date(to) winston.log('info', 'getting turn data for hangout', meeting._id, from, to) - app.service('utterances').find({ - query: { - meeting: meeting._id, - // TODO: date stuff here isn't working all of a sudden. - // should be able to do meeting AND start time. - $and: [ - {startTime: {$gte: from.toISOString()}}, - {endTime: {$lte: to.toISOString()}} - ], - $select: ['participant', 'meeting', 'startTime', 'endTime'] - } - }).then((utterances) => { - // {'participant': [utteranceObj, ...]} - var participantUtterances = _.groupBy(utterances, 'participant') - - // {'participant': # of utterances} - var numUtterances = _.mapObject(participantUtterances, (val, key) => { - return val.length + app.service('utterances') + .find({ + query: { + meeting: meeting._id, + // TODO: date stuff here isn't working all of a sudden. + // should be able to do meeting AND start time. + $and: [ + { startTime: { $gte: from.toISOString() } }, + { endTime: { $lte: to.toISOString() } } + ], + $select: [ 'participant', 'meeting', 'startTime', 'endTime' ] + } }) + .then((utterances) => { + // {'participant': [utteranceObj, ...]} + var participantUtterances = _.groupBy(utterances, 'participant') - // total number of utterances by all participants - var totalUtterances = _.reduce(_.pairs(numUtterances), (memo, val) => { - return memo + val[1] - }, 0) - - // distribution / "share" of utterances by participant - var utteranceDistribution = [] - _.mapObject(numUtterances, (val, key) => { - utteranceDistribution.push({ - participant: key, - turns: val / totalUtterances // percentage of your total number of utterances relative to convo's total utterances. viz uses this to measure "contributions" to conversation with the ball + // {'participant': # of utterances} + var numUtterances = _.mapObject(participantUtterances, (val, key) => { + return val.length }) - }) - var transitions = getTurnTransitions(utterances) + // total number of utterances by all participants + var totalUtterances = _.reduce(_.pairs(numUtterances), (memo, val) => { + return memo + val[1] + }, 0) - var turnObj = { - _id: meeting._id, - meeting: meeting._id, - room: meeting.room, - turns: utteranceDistribution, // patch instead of update - transitions: transitions, // patch instead of update - timestamp: new Date(), - from: from, // update, to make meetings.turn be the most updated turn in the last 5 min of that meeting (this is computed every 5 seconds) - to: to // update - } - app.service('turns').get(meeting._id, {}).then((turn) => { - app.service('turns').update(meeting._id, turnObj, {}).then((newTurn) => { - winston.log('info', 'updated turns for meeting:', meeting._id) - }).catch((err) => { - winston.log('error', 'could not save turns for meeting:', turnObj, 'error:', err) - }) - }).catch((err) => { - winston.log('error', 'could not get turn', err) - app.service('turns').create(turnObj, {}).then((newTurn) => { - winston.log('info', 'created turns for meeting:', meeting._id) - }).catch((err) => { - winston.log('error', 'could not create turns for meeting:', turnObj, 'error:', err) + // distribution / "share" of utterances by participant + var utteranceDistribution = [] + _.mapObject(numUtterances, (val, key) => { + utteranceDistribution.push({ + participant: key, + turns: val / totalUtterances // percentage of your total number of utterances relative to convo's total utterances. viz uses this to measure "contributions" to conversation with the ball + }) }) + + var transitions = getTurnTransitions(utterances) + + var turnObj = { + _id: meeting._id, + meeting: meeting._id, + room: meeting.room, + turns: utteranceDistribution, // patch instead of update + transitions: transitions, // patch instead of update + timestamp: new Date(), + from: from, // update, to make meetings.turn be the most updated turn in the last 5 min of that meeting (this is computed every 5 seconds) + to: to // update + } + app.service('turns') + .get(meeting._id, {}) + .then((turn) => { + app.service('turns') + .update(meeting._id, turnObj, {}) + .then((newTurn) => { + winston.log('info', 'updated turns for meeting:', meeting._id) + }) + .catch((err) => { + winston.log('error', 'could not save turns for meeting:', turnObj, 'error:', err) + }) + }) + .catch((err) => { + winston.log('error', 'could not get turn', err) + app.service('turns') + .create(turnObj, {}) + .then((newTurn) => { + winston.log('info', 'created turns for meeting:', meeting._id) + }) + .catch((err) => { + winston.log('error', 'could not create turns for meeting:', turnObj, 'error:', err) + }) + }) + }) + .catch((err) => { + winston.log('error', 'couldnt get utterances...', err) }) - }).catch((err) => { - winston.log('error', 'couldnt get utterances...', err) - }) } module.exports = { diff --git a/src/middleware/index.js b/src/middleware/index.js index 1183720..1796ccf 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -1,6 +1,6 @@ 'use strict' -const handler = require('feathers-errors/handler') +const handler = require('@feathersjs/express/errors') const notFound = require('./not-found-handler') const logger = require('./logger') @@ -8,7 +8,7 @@ module.exports = function () { // Add your custom middleware here. Remember, that // just like Express the order matters, so error // handling middleware should go last. - const app = this + const app = this // eslint-disable-line consistent-this app.use(notFound()) app.use(logger(app)) diff --git a/src/middleware/not-found-handler.js b/src/middleware/not-found-handler.js index b4d798d..2862efe 100644 --- a/src/middleware/not-found-handler.js +++ b/src/middleware/not-found-handler.js @@ -1,6 +1,6 @@ 'use strict' -const errors = require('feathers-errors') +const errors = require('@feathersjs/errors') module.exports = function () { return function (req, res, next) { diff --git a/src/scripts/create-default-user.js b/src/scripts/create-default-user.js index ec0e2a3..39ee21b 100644 --- a/src/scripts/create-default-user.js +++ b/src/scripts/create-default-user.js @@ -1,66 +1,86 @@ +const winston = require('winston') const path = require('path') const fs = require('fs') -const feathers = require('feathers-client') const io = require('socket.io-client') +const feathers = require('@feathersjs/feathers') +const socketio = require('@feathersjs/socketio-client') +const auth = require('@feathersjs/authentication-client') var socket = io.connect('http://localhost:3000', { - 'transports': [ + transports: [ 'websocket', 'flashsocket', 'jsonp-polling', 'xhr-polling', - 'htmlfile' + 'htmlfile', ] }) module.exports = function () { - const app = this - console.log('in create default user') + const app = this // eslint-disable-line consistent-this + winston.info('in create default user') + + // TODO: this is now in 3 places, it really should be somewhere common like a config file -mjl 2018-04-24 + let config = { + jwt: {}, + secret: process.env.AUTH_TOKEN_SECRET, + expiresIn: process.env.AUTH_TOKEN_EXPIRESIN, + local: {} + } const client = feathers() - .configure(feathers.socketio(socket)) - .configure(feathers.hooks()) - .configure(feathers.authentication()) + .configure(socketio(socket)) + .configure(auth(config)) const DEFAULT_USER_EMAIL = process.env.DEFAULT_USER_EMAIL const DEFAULT_USER_PASSWORD = process.env.DEFAULT_USER_PASSWORD - return app.service('users').find({ - email: DEFAULT_USER_EMAIL - }).then(function (users) { - return users.data.length > 0 - }).then(function (foundUser) { - if (!foundUser) { - return app.service('users').create({ + return app.service('users') + .find({ + email: DEFAULT_USER_EMAIL + }) + .then(function (users) { + winston.debug(`found user w/ email: ${DEFAULT_USER_EMAIL}: ${JSON.stringify(users.data)}`) + return users.data.length > 0 + }) + .then(function (foundUser) { + winston.debug(`found user ${foundUser}`) + if (!foundUser) { + return app.service('users').create({ + email: DEFAULT_USER_EMAIL, + password: DEFAULT_USER_PASSWORD + }) + } else { + return true + } + }) + .then(function (userOrTrue) { + return client.authenticate({ + strategy: 'local', email: DEFAULT_USER_EMAIL, password: DEFAULT_USER_PASSWORD }) - } else { - return true - } - }).then(function (userOrTrue) { - return client.authenticate({ - type: 'token', - email: DEFAULT_USER_EMAIL, - password: DEFAULT_USER_PASSWORD }) - }).then(function (authResult) { - if (authResult !== undefined) { - fs.writeFile(path.join(__dirname, 'DEFAULT_USER_TOKEN.txt'), authResult.token, function (err) { - if (err) { - return console.log(err) - } - }) - socket.disconnect() - return true - } else { - console.log('auth error') + .then(function (authResult) { + winston.debug(`client authentication: ${JSON.stringify(authResult)}`) + if (authResult !== undefined) { + fs.writeFile(path.join(__dirname, 'DEFAULT_USER_TOKEN.txt'), authResult.accessToken, function (err) { + if (err) { + winston.error('error saving user token', err) + return false + } + }) + socket.disconnect() + return true + } else { + winston.error('auth error') + socket.disconnect() + return false + } + }) + .catch(function (err) { + winston.error('could not connect to app', err) socket.disconnect() return false - } - }).catch(function (err) { - console.log('could not connect to app', err) - socket.disconnect() - return false - }) + }) } diff --git a/src/scripts/index.js b/src/scripts/index.js index 87ba372..dd7a244 100644 --- a/src/scripts/index.js +++ b/src/scripts/index.js @@ -1,6 +1,6 @@ const createDefaultUser = require('./create-default-user') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this app.configure(createDefaultUser) } diff --git a/src/services/authentication/index.js b/src/services/authentication/index.js index a40d982..afb59e3 100644 --- a/src/services/authentication/index.js +++ b/src/services/authentication/index.js @@ -1,22 +1,35 @@ 'use strict' const winston = require('winston') -const authentication = require('feathers-authentication') +const auth = require('@feathersjs/authentication') +const local = require('@feathersjs/authentication-local') +const jwt = require('@feathersjs/authentication-jwt') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this let config = { - idField: process.env.AUTH_ID_FIELD, - token: { - secret: process.env.AUTH_TOKEN_SECRET - }, + jwt: {}, + secret: process.env.AUTH_TOKEN_SECRET, expiresIn: process.env.AUTH_TOKEN_EXPIRESIN, local: {} } if (process.env.AUTH_ON) { winston.log('info', 'configuring authentication...') - app.configure(authentication(config)) + app.configure(auth(config)) + .configure(jwt()) + .configure(local()) + + // Authenticate the user using the a JWT or + // email/password strategy and if successful + // return a new JWT access token. + app.service('authentication').hooks({ + before: { + create: [ + auth.hooks.authenticate([ 'jwt', 'local' ]) + ] + } + }) } } diff --git a/src/services/face/face-model.js b/src/services/face/face-model.js index c53e8cd..29426a8 100644 --- a/src/services/face/face-model.js +++ b/src/services/face/face-model.js @@ -8,16 +8,18 @@ const mongoose = require('mongoose') const Schema = mongoose.Schema +/* eslint-disable camelcase */ const faceSchema = new Schema({ - participant: {type: String, ref: 'Participant'}, - meeting: {type: String, ref: 'Meeting'}, + participant: { type: String, ref: 'Participant' }, + meeting: { type: String, ref: 'Meeting' }, timestamp: Date, face_delta: Number, norm_smile: Number, - delta_array: [Number], - x_array: [Number], - y_array: [Number] + delta_array: [ Number ], + x_array: [ Number ], + y_array: [ Number ] }) +/* eslint-enable camelcase */ const faceModel = mongoose.model('face', faceSchema) diff --git a/src/services/face/hooks/index.js b/src/services/face/hooks/index.js index 531add2..4b67cd4 100644 --- a/src/services/face/hooks/index.js +++ b/src/services/face/hooks/index.js @@ -1,13 +1,13 @@ 'use strict' -const authHooks = require('feathers-authentication').hooks +const auth = require('@feathersjs/authentication') const roomHook = require('../../../hooks/roomHook').hook exports.before = { - all: [authHooks.verifyToken()], + all: [ auth.hooks.authenticate('jwt') ], find: [], get: [], - create: [roomHook], + create: [ roomHook ], update: [], patch: [], remove: [] diff --git a/src/services/face/index.js b/src/services/face/index.js index c7a1426..b4c89a0 100644 --- a/src/services/face/index.js +++ b/src/services/face/index.js @@ -3,10 +3,9 @@ const service = require('feathers-mongoose') const face = require('./face-model') const hooks = require('./hooks') -const globalFilters = require('../../filters') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this const options = { Model: face @@ -15,14 +14,9 @@ module.exports = function () { // Initialize our service with any options it requires app.use('/faces', service(options)) - // Get our initialize service to that we can bind hooks + // Get our service so that we can bind hooks const faceService = app.service('/faces') - // Set up our before hooks - faceService.before(hooks.before) - - // Set up our after hooks - faceService.after(hooks.after) - - faceService.filter(globalFilters.authenticationFilter) + // Set up our hooks + faceService.hooks(hooks) } diff --git a/src/services/index.js b/src/services/index.js index 10e8aed..6c470e4 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -14,13 +14,15 @@ const face = require('./face') const mongoose = require('mongoose') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this + /* eslint-disable camelcase */ let options = { - server: {sslCA: process.env.MONGO_CERT, - auto_reconnect: true, - poolSize: 5} + server: { sslCA: process.env.MONGO_CERT, + auto_reconnect: true, + poolSize: 5 } } + /* eslint-enable camelcase */ mongoose.connect(process.env.MONGODB_URI, options) mongoose.Promise = global.Promise diff --git a/src/services/meeting/hooks/add-participant-hook.js b/src/services/meeting/hooks/add-participant-hook.js index 2d732a0..89724cb 100644 --- a/src/services/meeting/hooks/add-participant-hook.js +++ b/src/services/meeting/hooks/add-participant-hook.js @@ -10,20 +10,22 @@ const winston = require('winston') module.exports = function (hook) { if (hook.data.add_participant) { winston.log('info', 'adding participant:', hook.data.add_participant) - return hook.app.service('meetings').get(hook.id) - .then((meeting) => { - var oldParticipants = meeting.participants - if (_.contains(oldParticipants, hook.data.add_participant)) { - return hook - } else { - hook.data.participants = _.union(oldParticipants, [hook.data.add_participant]) - delete hook.data.add_participant - return hook - } - }).catch((err) => { - winston.log('error', 'couldnt add given participant', err) + return hook.app.service('meetings') + .get(hook.id) + .then((meeting) => { + var oldParticipants = meeting.participants + if (_.contains(oldParticipants, hook.data.add_participant)) { return hook - }) + } else { + hook.data.participants = _.union(oldParticipants, [ hook.data.add_participant ]) + delete hook.data.add_participant + return hook + } + }) + .catch((err) => { + winston.log('error', 'couldnt add given participant', err) + return hook + }) } else { winston.log('info', 'not adding participant:') return hook diff --git a/src/services/meeting/hooks/apply_unstructured_query-hook.js b/src/services/meeting/hooks/apply_unstructured_query-hook.js index f1fafd3..87f4db3 100644 --- a/src/services/meeting/hooks/apply_unstructured_query-hook.js +++ b/src/services/meeting/hooks/apply_unstructured_query-hook.js @@ -12,7 +12,7 @@ function applyUnstructuredQuery (hook) { if (current.meta !== undefined) { var match = true _.each(_.keys(hook.params.meta), function (key) { - if (current.meta == null || current.meta[key] !== decodeURI(hook.params.meta[key])) { + if (current.meta === null || current.meta[key] !== decodeURI(hook.params.meta[key])) { match = false } }) diff --git a/src/services/meeting/hooks/deactivate-meeting-hook.js b/src/services/meeting/hooks/deactivate-meeting-hook.js index 4ee4b8b..c70f366 100644 --- a/src/services/meeting/hooks/deactivate-meeting-hook.js +++ b/src/services/meeting/hooks/deactivate-meeting-hook.js @@ -7,8 +7,14 @@ const _ = require('underscore') const winston = require('winston') -var d3 = require('d3') -var jsdom = require('jsdom') +var d3 = Object.assign({}, + require('d3-selection'), + require('d3-array'), + require('d3-axis'), + require('d3-scale'), + require('d3-scale-chromatic')) + +var { JSDOM } = require('jsdom') var nodemailer = require('nodemailer') function shouldMakeMeetingInactive (newParticipants, meetingObject) { @@ -46,7 +52,7 @@ function getReportData (hook, callback) { var validParticipants = _.filter(participants.data, (participant) => { return _.contains(participant.meetings, meetingId) }) - winston.log('info', 'generating report for participants', _.map(validParticipants, (part) => part._id)) + winston.log('info', 'generating report for participants', _.map(validParticipants, part => part._id)) // find utterances hook.app.service('utterances').find({ query: { @@ -70,11 +76,11 @@ function getReportData (hook, callback) { }) // [{'name': ..., 'numUtterances': ..., 'meanLengthUtterances': ...}, ...] var visualizationData = validParticipants.map((participant) => { - var participantId = participant[ '_id' ] + var participantId = participant['_id'] return { - name: participant[ 'name' ], - numUtterances: participantId in numUtterances ? numUtterances[ participantId ] : 0, - meanLengthUtterances: participantId in meanLengthUtterances ? meanLengthUtterances[ participantId ] : 0 + name: participant['name'], + numUtterances: participantId in numUtterances ? numUtterances[participantId] : 0, + meanLengthUtterances: participantId in meanLengthUtterances ? meanLengthUtterances[participantId] : 0 } }) winston.log('info', 'getting addresses...') @@ -93,17 +99,19 @@ function createVisualization (visualizationData) { var margin = { top: 20, right: 15, bottom: 60, left: 60 } var width = 800 - margin.left - margin.right var height = 500 - margin.top - margin.bottom - var color = d3.scale.category20() + // TODO: think about color, start here: https://medium.com/@Elijah_Meeks/color-advice-for-data-visualization-with-d3-js-33b5adc41c90 + // d3 v5 removed category20 which was used here. + var color = d3.scaleOrdinal(d3.schemeCategory10) - var x = d3.scale.linear() + var x = d3.scaleLinear() .domain([ 0, d3.max(visualizationData, function (d) { return d.meanLengthUtterances }) + 5 ]) .range([ 0, width ]) - var y = d3.scale.linear() + var y = d3.scaleLinear() .domain([ 0, d3.max(visualizationData, function (d) { return d.numUtterances }) + 1 ]) .range([ height, 0 ]) - var document = jsdom.jsdom() + const { document } = (new JSDOM('')).window var chart = d3.select(document.body) .append('svg') .attr('width', width + margin.right + margin.left) @@ -117,9 +125,7 @@ function createVisualization (visualizationData) { .attr('class', 'main') // draw the x axis - var xAxis = d3.svg.axis() - .scale(x) - .orient('bottom') + var xAxis = d3.axisBottom(x) main.append('g') .attr('transform', 'translate(0,' + height + ')') @@ -134,9 +140,7 @@ function createVisualization (visualizationData) { .text('Avg. Length of Turns (in seconds)') // draw the y axis - var yAxis = d3.svg.axis() - .scale(y) - .orient('left') + var yAxis = d3.axisLeft(y) main.append('g') .attr('transform', 'translate(0,0)') @@ -154,7 +158,8 @@ function createVisualization (visualizationData) { var node = g.selectAll('scatter-dots') .data(visualizationData) - .enter().append('g') + .enter() + .append('g') node.append('svg:circle') .style('fill', function (d) { return color(d.name) }) @@ -263,7 +268,7 @@ function sendReport (visualization, addresses) { } function createMeetingEndEvent (hook) { - var meetingId = (hook.method === 'create') ? hook.data._id : hook.id + var meetingId = (hook.method === 'create') ? hook.data._id : hook.id // eslint-disable-line no-extra-parens return hook.app.service('meetingEvents').create({ meeting: meetingId, event: 'end', diff --git a/src/services/meeting/hooks/index.js b/src/services/meeting/hooks/index.js index bb95c85..84a882d 100644 --- a/src/services/meeting/hooks/index.js +++ b/src/services/meeting/hooks/index.js @@ -8,10 +8,10 @@ const removeParticipantsHook = require('./remove-participants-hook') const addParticipantHook = require('./add-participant-hook') const extractUnstructuredQueryHook = require('./extract_unstructured_query-hook') const applyUnstructuredQueryHook = require('./apply_unstructured_query-hook') -const authHooks = require('feathers-authentication').hooks +const auth = require('@feathersjs/authentication') function addStartTime (hook) { - hook.data.start_time = new Date() + hook.data.start_time = new Date() // eslint-disable-line camelcase return hook } @@ -21,20 +21,22 @@ function updateTime (hook) { } exports.before = { - all: [authHooks.verifyToken()], - create: [addStartTime, activateMeetingHook], - find: [extractUnstructuredQueryHook], - update: [updateTime], - patch: [updateTime, activateMeetingHook, - deactivateMeetingHook, removeParticipantsHook, - addParticipantHook], + all: [ auth.hooks.authenticate('jwt') ], + create: [ addStartTime, activateMeetingHook ], + find: [ extractUnstructuredQueryHook ], + update: [ updateTime ], + patch: [ updateTime, + activateMeetingHook, + deactivateMeetingHook, + removeParticipantsHook, + addParticipantHook ], get: [] } exports.after = { - create: [computeTurnHook, participantsEventHook], - update: [computeTurnHook], - patch: [computeTurnHook, participantsEventHook], + create: [ computeTurnHook, participantsEventHook ], + update: [ computeTurnHook ], + patch: [ computeTurnHook, participantsEventHook ], all: [], - find: [applyUnstructuredQueryHook] + find: [ applyUnstructuredQueryHook ] } diff --git a/src/services/meeting/hooks/participants-event-hook.js b/src/services/meeting/hooks/participants-event-hook.js index ff1bb57..b562929 100644 --- a/src/services/meeting/hooks/participants-event-hook.js +++ b/src/services/meeting/hooks/participants-event-hook.js @@ -8,17 +8,20 @@ const winston = require('winston') module.exports = function (hook) { if (_.has(hook.data, 'participants')) { - hook.app.service('participantEvents').create({ - meeting: hook.result._id, - participants: hook.result.participants, - timestamp: new Date() - }).then((participantEvent) => { - winston.log('info', 'created participantEvent!') - return hook - }).catch(function (err) { - winston.log('info', 'error creating participantEvent!', err) - return hook - }) + hook.app.service('participantEvents') + .create({ + meeting: hook.result._id, + participants: hook.result.participants, + timestamp: new Date() + }) + .then((participantEvent) => { + winston.log('info', 'created participantEvent!') + return hook + }) + .catch(function (err) { + winston.log('info', 'error creating participantEvent!', err) + return hook + }) } else { winston.log('info', 'no participants in request, not creating event...') return hook diff --git a/src/services/meeting/hooks/remove-participants-hook.js b/src/services/meeting/hooks/remove-participants-hook.js index bfc736e..027820d 100644 --- a/src/services/meeting/hooks/remove-participants-hook.js +++ b/src/services/meeting/hooks/remove-participants-hook.js @@ -9,17 +9,19 @@ const winston = require('winston') module.exports = function (hook) { if (hook.data.remove_participants) { - return hook.app.service('meetings').get(hook.id) - .then((meeting) => { - var oldParticipants = meeting.participants - hook.data.participants = _.difference(oldParticipants, - hook.data.remove_participants) - delete hook.data.remove_participants - return hook - }).catch((err) => { - winston.log('error', 'couldnt remove given participants', err) - return hook - }) + return hook.app.service('meetings') + .get(hook.id) + .then((meeting) => { + var oldParticipants = meeting.participants + hook.data.participants = _.difference(oldParticipants, + hook.data.remove_participants) + delete hook.data.remove_participants + return hook + }) + .catch((err) => { + winston.log('error', 'couldnt remove given participants', err) + return hook + }) } else { return hook } diff --git a/src/services/meeting/index.js b/src/services/meeting/index.js index 9ec5a14..530197e 100644 --- a/src/services/meeting/index.js +++ b/src/services/meeting/index.js @@ -3,10 +3,9 @@ const service = require('feathers-mongoose') const meeting = require('./meeting-model') const hooks = require('./hooks') -const authenticationFilter = require('../../filters').authenticationFilter module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this const options = { Model: meeting, @@ -16,8 +15,5 @@ module.exports = function () { app.use('/meetings', service(options)) const meetingService = app.service('/meetings') - meetingService.before(hooks.before) - meetingService.after(hooks.after) - - meetingService.filter(authenticationFilter) + meetingService.hooks(hooks) } diff --git a/src/services/meeting/meeting-model.js b/src/services/meeting/meeting-model.js index 12ee8b1..f16df8d 100644 --- a/src/services/meeting/meeting-model.js +++ b/src/services/meeting/meeting-model.js @@ -8,10 +8,10 @@ const mongoose = require('mongoose') const Schema = mongoose.Schema const meetingSchema = new Schema({ - _id: {type: String}, - participants: [{type: String, ref: 'Participant'}], + _id: { type: String }, + participants: [{ type: String, ref: 'Participant' }], room: String, - startTime: {type: Date, 'default': Date.now}, + startTime: { type: Date, 'default': Date.now }, endTime: Date, active: Boolean, meetingUrl: String, diff --git a/src/services/meetingEvent/hooks/index.js b/src/services/meetingEvent/hooks/index.js index a1b357c..d12256a 100644 --- a/src/services/meetingEvent/hooks/index.js +++ b/src/services/meetingEvent/hooks/index.js @@ -1,9 +1,9 @@ 'use strict' -const authHooks = require('feathers-authentication').hooks +const auth = require('@feathersjs/authentication') exports.before = { - all: [authHooks.verifyToken()], + all: [ auth.hooks.authenticate('jwt') ], find: [], get: [], create: [], diff --git a/src/services/meetingEvent/index.js b/src/services/meetingEvent/index.js index d07e37d..cb78b2c 100644 --- a/src/services/meetingEvent/index.js +++ b/src/services/meetingEvent/index.js @@ -5,7 +5,7 @@ const meetingEvent = require('./meetingEvent-model') const hooks = require('./hooks') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this const options = { Model: meetingEvent @@ -18,12 +18,9 @@ module.exports = function () { // Initialize our service with any options it requires app.use('/meetingEvents', service(options)) - // Get our initialize service to that we can bind hooks + // Get our service so that we can bind hooks const meetingEventService = app.service('/meetingEvents') - // Set up our before hooks - meetingEventService.before(hooks.before) - - // Set up our after hooks - meetingEventService.after(hooks.after) + // Set up our hooks + meetingEventService.hooks(hooks) } diff --git a/src/services/meetingEvent/meetingEvent-model.js b/src/services/meetingEvent/meetingEvent-model.js index 0700684..c28af44 100644 --- a/src/services/meetingEvent/meetingEvent-model.js +++ b/src/services/meetingEvent/meetingEvent-model.js @@ -9,7 +9,7 @@ const mongoose = require('mongoose') const Schema = mongoose.Schema const meetingEventSchema = new Schema({ - meeting: {type: String, ref: 'Meeting'}, + meeting: { type: String, ref: 'Meeting' }, event: String, data: Object, timestamp: Date diff --git a/src/services/participant/hooks/index.js b/src/services/participant/hooks/index.js index a1b357c..d12256a 100644 --- a/src/services/participant/hooks/index.js +++ b/src/services/participant/hooks/index.js @@ -1,9 +1,9 @@ 'use strict' -const authHooks = require('feathers-authentication').hooks +const auth = require('@feathersjs/authentication') exports.before = { - all: [authHooks.verifyToken()], + all: [ auth.hooks.authenticate('jwt') ], find: [], get: [], create: [], diff --git a/src/services/participant/index.js b/src/services/participant/index.js index b8215a8..323965c 100644 --- a/src/services/participant/index.js +++ b/src/services/participant/index.js @@ -3,14 +3,13 @@ const service = require('feathers-mongoose') const participant = require('./participant-model') const hooks = require('./hooks') -const globalFilters = require('../../filters') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this const options = { paginate: { - default: 5, + 'default': 5, max: 1000 }, Model: participant @@ -19,14 +18,9 @@ module.exports = function () { // Initialize our service with any options it requires app.use('/participants', service(options)) - // Get our initialize service to that we can bind hooks + // Get our service so that we can bind hooks const participantService = app.service('/participants') - // Set up our before hooks - participantService.before(hooks.before) - - // Set up our after hooks - participantService.after(hooks.after) - - participantService.filter(globalFilters.authenticationFilter) + // Set up our hooks + participantService.hooks(hooks) } diff --git a/src/services/participant/participant-model.js b/src/services/participant/participant-model.js index 12c0a3a..520e9e2 100644 --- a/src/services/participant/participant-model.js +++ b/src/services/participant/participant-model.js @@ -13,7 +13,7 @@ const participantSchema = new Schema({ _id: String, name: String, email: String, - meetings: [{type: String, ref: 'meeting'}], + meetings: [{ type: String, ref: 'meeting' }], consent: Boolean, consentDate: Date, createdAt: { type: Date, 'default': Date.now }, diff --git a/src/services/participantEvent/hooks/index.js b/src/services/participantEvent/hooks/index.js index a1b357c..d12256a 100644 --- a/src/services/participantEvent/hooks/index.js +++ b/src/services/participantEvent/hooks/index.js @@ -1,9 +1,9 @@ 'use strict' -const authHooks = require('feathers-authentication').hooks +const auth = require('@feathersjs/authentication') exports.before = { - all: [authHooks.verifyToken()], + all: [ auth.hooks.authenticate('jwt') ], find: [], get: [], create: [], diff --git a/src/services/participantEvent/index.js b/src/services/participantEvent/index.js index 6b8c266..a565f2b 100644 --- a/src/services/participantEvent/index.js +++ b/src/services/participantEvent/index.js @@ -3,15 +3,14 @@ const service = require('feathers-mongoose') const participantEvent = require('./participantEvent-model') const hooks = require('./hooks') -const globalFilters = require('../../filters') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this const options = { Model: participantEvent, paginate: { - default: 5, + 'default': 5, max: 25 } } @@ -19,14 +18,9 @@ module.exports = function () { // Initialize our service with any options it requires app.use('/participantEvents', service(options)) - // Get our initialize service to that we can bind hooks + // Get our service so that we can bind hooks const participantEventService = app.service('/participantEvents') - // Set up our before hooks - participantEventService.before(hooks.before) - - // Set up our after hooks - participantEventService.after(hooks.after) - - participantEventService.filter(globalFilters.authenticationFilter) + // Set up our hooks + participantEventService.hooks(hooks) } diff --git a/src/services/participantEvent/participantEvent-model.js b/src/services/participantEvent/participantEvent-model.js index 9f010ab..2b0fbdb 100644 --- a/src/services/participantEvent/participantEvent-model.js +++ b/src/services/participantEvent/participantEvent-model.js @@ -9,8 +9,8 @@ const mongoose = require('mongoose') const Schema = mongoose.Schema const participantEventSchema = new Schema({ - participants: [{type: String, ref: 'Participant'}], - meeting: {type: String, ref: 'Meeting'}, + participants: [{ type: String, ref: 'Participant' }], + meeting: { type: String, ref: 'Meeting' }, timestamp: Date }) diff --git a/src/services/turn/hooks/index.js b/src/services/turn/hooks/index.js index a1b357c..d12256a 100644 --- a/src/services/turn/hooks/index.js +++ b/src/services/turn/hooks/index.js @@ -1,9 +1,9 @@ 'use strict' -const authHooks = require('feathers-authentication').hooks +const auth = require('@feathersjs/authentication') exports.before = { - all: [authHooks.verifyToken()], + all: [ auth.hooks.authenticate('jwt') ], find: [], get: [], create: [], diff --git a/src/services/turn/index.js b/src/services/turn/index.js index 770219d..e8dce15 100644 --- a/src/services/turn/index.js +++ b/src/services/turn/index.js @@ -3,10 +3,9 @@ const service = require('feathers-mongoose') const turn = require('./turn-model') const hooks = require('./hooks') -const globalFilters = require('../../filters') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this const options = { Model: turn @@ -15,13 +14,9 @@ module.exports = function () { // Initialize our service with any options it requires app.use('/turns', service(options)) - // Get our initialize service to that we can bind hooks + // Get our service so that we can bind hooks const turnService = app.service('/turns') - // Set up our before hooks - turnService.before(hooks.before) - - // Set up our after hooks - turnService.after(hooks.after) - turnService.filter(globalFilters.authenticationFilter) + // Set up our hooks + turnService.hooks(hooks) } diff --git a/src/services/turn/turn-model.js b/src/services/turn/turn-model.js index ce10c52..aabbf0c 100644 --- a/src/services/turn/turn-model.js +++ b/src/services/turn/turn-model.js @@ -10,14 +10,14 @@ const Schema = mongoose.Schema const turnSchema = new Schema({ _id: String, - meeting: {type: String, ref: 'Meeting'}, + meeting: { type: String, ref: 'Meeting' }, timestamp: Date, from: Date, to: Date, room: String, transitions: Number, turns: [{ - participant: {type: String, ref: 'participant'}, + participant: { type: String, ref: 'participant' }, turns: Number }] }) diff --git a/src/services/user/hooks/index.js b/src/services/user/hooks/index.js index 4f865e2..d54ac57 100644 --- a/src/services/user/hooks/index.js +++ b/src/services/user/hooks/index.js @@ -1,47 +1,42 @@ 'use strict' -const hooks = require('feathers-hooks') -const auth = require('feathers-authentication').hooks +const auth = require('@feathersjs/authentication') +const local = require('@feathersjs/authentication-local') +const { iff, isProvider, discard } = require('feathers-hooks-common') + +const { restrictToOwner } = require('feathers-authentication-hooks') exports.before = { all: [], find: [ - auth.verifyToken(), - auth.populateUser(), - auth.restrictToAuthenticated() + auth.hooks.authenticate('jwt') ], get: [ - auth.verifyToken(), - auth.populateUser(), - auth.restrictToAuthenticated(), - auth.restrictToOwner({ ownerField: '_id' }) + auth.hooks.authenticate('jwt'), + restrictToOwner({ ownerField: '_id' }) ], create: [ - auth.verifyToken(), - auth.hashPassword() + auth.hooks.authenticate('jwt'), + local.hooks.hashPassword() ], update: [ - auth.verifyToken(), - auth.populateUser(), - auth.restrictToAuthenticated(), - auth.restrictToOwner({ ownerField: '_id' }) + auth.hooks.authenticate('jwt'), + restrictToOwner({ ownerField: '_id' }) ], patch: [ - auth.verifyToken(), - auth.populateUser(), - auth.restrictToAuthenticated(), - auth.restrictToOwner({ ownerField: '_id' }) + auth.hooks.authenticate('jwt'), + restrictToOwner({ ownerField: '_id' }) ], remove: [ - auth.verifyToken(), - auth.populateUser(), - auth.restrictToAuthenticated(), - auth.restrictToOwner({ ownerField: '_id' }) + auth.hooks.authenticate('jwt'), + restrictToOwner({ ownerField: '_id' }) ] } exports.after = { - all: [hooks.remove('password')], + // remove password field once authentication is done only for external calls + // see https://github.com/feathers-plus/feathers-hooks-common/issues/139 + all: [ iff(isProvider('external'), discard('password')) ], find: [], get: [], create: [], diff --git a/src/services/user/index.js b/src/services/user/index.js index 72cf851..9658489 100644 --- a/src/services/user/index.js +++ b/src/services/user/index.js @@ -5,12 +5,12 @@ const user = require('./user-model') const hooks = require('./hooks') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this const options = { Model: user, paginate: { - default: 5, + 'default': 5, max: 25 } } @@ -18,12 +18,9 @@ module.exports = function () { // Initialize our service with any options it requires app.use('/users', service(options)) - // Get our initialize service to that we can bind hooks + // Get our service so that we can bind hooks const userService = app.service('/users') - // Set up our before hooks - userService.before(hooks.before) - - // Set up our after hooks - userService.after(hooks.after) + // Set up our hooks + userService.hooks(hooks) } diff --git a/src/services/user/user-model.js b/src/services/user/user-model.js index 98929e1..984b726 100644 --- a/src/services/user/user-model.js +++ b/src/services/user/user-model.js @@ -6,7 +6,7 @@ const mongoose = require('mongoose') const Schema = mongoose.Schema const userSchema = new Schema({ - email: {type: String, required: true, unique: true}, + email: { type: String, required: true, unique: true }, password: { type: String, required: true }, createdAt: { type: Date, 'default': Date.now }, diff --git a/src/services/utterance/hooks/index.js b/src/services/utterance/hooks/index.js index 319c43d..979ce30 100644 --- a/src/services/utterance/hooks/index.js +++ b/src/services/utterance/hooks/index.js @@ -4,13 +4,13 @@ const repeatHook = require('./repeatHook').hook const mergeHook = require('./mergeHook').hook const roomHook = require('../../../hooks/roomHook').hook const participantConsentedHook = require('./participant-consented-hook') -const authHooks = require('feathers-authentication').hooks +const auth = require('@feathersjs/authentication') exports.before = { - all: [authHooks.verifyToken()], + all: [ auth.hooks.authenticate('jwt') ], find: [], get: [], - create: [participantConsentedHook, roomHook, mergeHook, repeatHook], + create: [ participantConsentedHook, roomHook, mergeHook, repeatHook ], update: [], patch: [], remove: [] diff --git a/src/services/utterance/hooks/mergeHook.js b/src/services/utterance/hooks/mergeHook.js index 307b8d5..300d618 100644 --- a/src/services/utterance/hooks/mergeHook.js +++ b/src/services/utterance/hooks/mergeHook.js @@ -7,7 +7,7 @@ exports.hook = function (hook) { query: { meeting: hook.data.meeting, participant: hook.data.participant, - $sort: {endTime: -1}, + $sort: { endTime: -1 }, $limit: 1 } }).then((lastUtterances) => { diff --git a/src/services/utterance/hooks/participant-consented-hook.js b/src/services/utterance/hooks/participant-consented-hook.js index 316daa5..2b44019 100644 --- a/src/services/utterance/hooks/participant-consented-hook.js +++ b/src/services/utterance/hooks/participant-consented-hook.js @@ -5,16 +5,18 @@ const winston = require('winston') module.exports = function (hook) { - return hook.app.service('participants').get(hook.data.participant) - .then((participant) => { - if (participant.consent === true) { - return hook - } else { - winston.log('info', 'NOT creating utterance, do not have consent') - hook.result = {'created': false} - } - }).catch((err) => { - winston.log('info', 'Unable to create utterance, participant does not exist yet', err) - hook.result = {'created': false} - }) + return hook.app.service('participants') + .get(hook.data.participant) + .then((participant) => { + if (participant.consent === true) { + return hook + } else { + winston.log('info', 'NOT creating utterance, do not have consent') + hook.result = { created: false } + } + }) + .catch((err) => { + winston.log('info', 'Unable to create utterance, participant does not exist yet', err) + hook.result = { created: false } + }) } diff --git a/src/services/utterance/hooks/repeatHook.js b/src/services/utterance/hooks/repeatHook.js index 6a497fa..a7753a5 100644 --- a/src/services/utterance/hooks/repeatHook.js +++ b/src/services/utterance/hooks/repeatHook.js @@ -6,13 +6,14 @@ function dateDiff (d1, d2) { } exports.hook = function (hook) { - hook.app.service('utterances').find( - { + hook.app.service('utterances') + .find({ query: { - $and: [{meeting: hook.data.meeting}, - {participant: hook.data.participant}] + $and: [{ meeting: hook.data.meeting }, + { participant: hook.data.participant }] } - }).then((foundUtterances) => { + }) + .then((foundUtterances) => { var timeMatchThreshold = 1.5 * 1000 // threshold for times being "matched", in ms // there are some talk events from this participant // filter them, find if any are very close: @@ -21,9 +22,9 @@ exports.hook = function (hook) { var matches = _.filter(foundUtterances, function (utterance) { var startDiff = dateDiff(utterance.startTime, - hook.data.startTime) + hook.data.startTime) var endDiff = dateDiff(utterance.endTime, - hook.data.endTime) + hook.data.endTime) return (startDiff < timeMatchThreshold || endDiff < timeMatchThreshold) }) diff --git a/src/services/utterance/index.js b/src/services/utterance/index.js index c350824..ded4226 100644 --- a/src/services/utterance/index.js +++ b/src/services/utterance/index.js @@ -3,10 +3,9 @@ const service = require('feathers-mongoose') const utterance = require('./utterance-model') const hooks = require('./hooks') -const globalFilters = require('../../filters') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this const options = { Model: utterance @@ -15,14 +14,9 @@ module.exports = function () { // Initialize our service with any options it requires app.use('/utterances', service(options)) - // Get our initialize service to that we can bind hooks + // Get our service so that we can bind hooks const utteranceService = app.service('/utterances') - // Set up our before hooks - utteranceService.before(hooks.before) - - // Set up our after hooks - utteranceService.after(hooks.after) - - utteranceService.filter(globalFilters.authenticationFilter) + // Set up our hooks + utteranceService.hooks(hooks) } diff --git a/src/services/utterance/utterance-model.js b/src/services/utterance/utterance-model.js index a6b7c59..54c82a8 100644 --- a/src/services/utterance/utterance-model.js +++ b/src/services/utterance/utterance-model.js @@ -9,8 +9,8 @@ const mongoose = require('mongoose') const Schema = mongoose.Schema const utteranceSchema = new Schema({ - participant: {type: String, ref: 'Participant'}, - meeting: {type: String, ref: 'Meeting'}, + participant: { type: String, ref: 'Participant' }, + meeting: { type: String, ref: 'Meeting' }, startTime: Date, endTime: Date, volumes: [{ diff --git a/src/services/utteranceDistribution/hooks/index.js b/src/services/utteranceDistribution/hooks/index.js index a1b357c..d12256a 100644 --- a/src/services/utteranceDistribution/hooks/index.js +++ b/src/services/utteranceDistribution/hooks/index.js @@ -1,9 +1,9 @@ 'use strict' -const authHooks = require('feathers-authentication').hooks +const auth = require('@feathersjs/authentication') exports.before = { - all: [authHooks.verifyToken()], + all: [ auth.hooks.authenticate('jwt') ], find: [], get: [], create: [], diff --git a/src/services/utteranceDistribution/index.js b/src/services/utteranceDistribution/index.js index fb2f788..410a189 100644 --- a/src/services/utteranceDistribution/index.js +++ b/src/services/utteranceDistribution/index.js @@ -3,15 +3,14 @@ const service = require('feathers-mongoose') const utteranceDistribution = require('./utteranceDistribution-model') const hooks = require('./hooks') -const globalFilters = require('../../filters') module.exports = function () { - const app = this + const app = this // eslint-disable-line consistent-this const options = { Model: utteranceDistribution, paginate: { - default: 5, + 'default': 5, max: 25 } } @@ -19,14 +18,9 @@ module.exports = function () { // Initialize our service with any options it requires app.use('/utteranceDistributions', service(options)) - // Get our initialize service to that we can bind hooks + // Get our service so that we can bind hooks const utteranceDistributionService = app.service('/utteranceDistributions') - // Set up our before hooks - utteranceDistributionService.before(hooks.before) - - // Set up our after hooks - utteranceDistributionService.after(hooks.after) - - utteranceDistributionService.filter(globalFilters.authenticationFilter) + // Set up our hooks + utteranceDistributionService.hooks(hooks) } diff --git a/src/services/utteranceDistribution/utteranceDistribution-model.js b/src/services/utteranceDistribution/utteranceDistribution-model.js index 6e0888f..84da458 100644 --- a/src/services/utteranceDistribution/utteranceDistribution-model.js +++ b/src/services/utteranceDistribution/utteranceDistribution-model.js @@ -9,9 +9,9 @@ const mongoose = require('mongoose') const Schema = mongoose.Schema const utteranceDistributionSchema = new Schema({ - meeting: {type: String, ref: 'Meeting'}, + meeting: { type: String, ref: 'Meeting' }, talkTimes: [{ - participant: {type: String, ref: 'Participant'}, + participant: { type: String, ref: 'Participant' }, seconds: Number }], timestamp: Date diff --git a/test/.eslintrc.yml b/test/.eslintrc.yml new file mode 100644 index 0000000..8750db5 --- /dev/null +++ b/test/.eslintrc.yml @@ -0,0 +1,9 @@ +--- +env: + mocha: true +rules: + no-shadow: + - error + - + allow: + - done diff --git a/test/app.test.js b/test/app.test.js index 942f5f1..44d2241 100644 --- a/test/app.test.js +++ b/test/app.test.js @@ -6,6 +6,9 @@ const request = require('request') const winston = require('winston') const app = require('../src/app') +// No logging to the console (which may mean no logging at all, but it gets in the way of the test output otherwise. +winston.remove(winston.transports.Console) + before(function (done) { global.app = app winston.log('info', 'mongo:', process.env.MONGODB_URI) diff --git a/test/events/index.test.js b/test/events/index.test.js index b709b79..9d7e526 100644 --- a/test/events/index.test.js +++ b/test/events/index.test.js @@ -15,38 +15,45 @@ describe('meeting joined event', function (done) { } var socket = io.connect('http://localhost:3000', { - 'transports': [ + transports: [ 'websocket', 'flashsocket', 'jsonp-polling', 'xhr-polling', - 'htmlfile' + 'htmlfile', ] }) var deactivateMeetings = function (room) { - global.app.service('meetings').find({ query: { room: fakeJoinedEvent.room } }).then((meetings) => { - winston.log('info', 'deactivating meetings', meetings) - meetings.forEach((meeting) => { - let id = meeting._id - global.app.service('meetings').patch(id, { - active: false - }).then((meeting) => { - winston.log('info', 'meeting deactivated', meeting) - }).catch((err) => { - done(err) + global.app.service('meetings') + .find({ query: { room: fakeJoinedEvent.room } }) + .then((meetings) => { + winston.log('info', 'deactivating meetings', meetings) + meetings.forEach((meeting) => { + let id = meeting._id + global.app.service('meetings') + .patch(id, { + active: false + }) + .then((meeting) => { + winston.log('info', 'meeting deactivated', meeting) + }) + .catch((err) => { + done(err) + }) }) }) - }) } before(function (done) { - dropDatabase().then(() => { - socket.emit('meetingJoined', fakeJoinedEvent) - setTimeout(() => { deactivateMeetings(fakeJoinedEvent.room) }, 400) - setTimeout(() => { socket.emit('meetingJoined', fakeJoinedEvent) }, 800) - setTimeout(() => { done() }, 1200) - }).catch((err) => { done(err) }) + dropDatabase() + .then(() => { + socket.emit('meetingJoined', fakeJoinedEvent) + setTimeout(() => { deactivateMeetings(fakeJoinedEvent.room) }, 400) + setTimeout(() => { socket.emit('meetingJoined', fakeJoinedEvent) }, 800) + setTimeout(() => { done() }, 1200) + }) + .catch((err) => { done(err) }) }) after(function (done) { @@ -56,32 +63,37 @@ describe('meeting joined event', function (done) { it('creates a participant & meeting when they join for the first time', function (done) { setTimeout(function () { - global.app.service('participants').get(fakeJoinedEvent.participant) - .then(function (participant) { - winston.log('info', 'participant:', participant) - assert.strictEqual(participant._id, fakeJoinedEvent.participant) - socket.disconnect() - done() - }).catch(function (err) { - winston.log('info', 'errrrrred', err) - socket.disconnect() - done(err) - }) + global.app.service('participants') + .get(fakeJoinedEvent.participant) + .then(function (participant) { + winston.log('info', 'participant:', participant) + assert.strictEqual(participant._id, fakeJoinedEvent.participant) + socket.disconnect() + done() + }) + .catch(function (err) { + winston.log('info', 'errrrrred', err) + socket.disconnect() + done(err) + }) }, 1500) }) it('creates a meeting based on group name', function (done) { - global.app.service('meetings').find().then((meetings) => { - winston.log('info', 'mtgs: ', meetings) - assert.strictEqual(meetings.length, 2) - assert(meetings[0].active !== meetings[1].active) - meetings.forEach((meeting) => { - assert.strictEqual(meeting.room, fakeJoinedEvent.room) - assert(meeting._id.startsWith(fakeJoinedEvent.room), 'meeting id starts with room name') + global.app.service('meetings') + .find() + .then((meetings) => { + winston.log('info', 'mtgs: ', meetings) + assert.strictEqual(meetings.length, 2) + assert(meetings[0].active !== meetings[1].active) + meetings.forEach((meeting) => { + assert.strictEqual(meeting.room, fakeJoinedEvent.room) + assert(meeting._id.startsWith(fakeJoinedEvent.room), 'meeting id starts with room name') + }) + }) + .catch((err) => { + done(err) }) - }).catch((err) => { - done(err) - }) done() }) }) diff --git a/test/events/meetingEvent.test.js b/test/events/meetingEvent.test.js index 011e1ea..b11db7a 100644 --- a/test/events/meetingEvent.test.js +++ b/test/events/meetingEvent.test.js @@ -23,13 +23,13 @@ describe('Meeting event', function () { isMicrophoneMute: true } - var options = { 'transports': [ + var options = { transports: [ 'websocket', 'flashsocket', 'jsonp-polling', 'xhr-polling', 'htmlfile' - ]} + ] } var socket = io('http://localhost:3000', options) diff --git a/test/helpers/index.test.js b/test/helpers/index.test.js index 75c19f3..35d5d4c 100644 --- a/test/helpers/index.test.js +++ b/test/helpers/index.test.js @@ -12,7 +12,7 @@ describe('json transform', function () { b: 3, c: 4 } - var newObj = helpers.transformKeys(obj, ['a'], (val) => { return val + 1 }) + var newObj = helpers.transformKeys(obj, [ 'a' ], (val) => { return val + 1 }) assert(_.isEqual(newObj, { a: 3, b: 3, @@ -23,13 +23,13 @@ describe('json transform', function () { it('should transform nested values of a json object', function (done) { var obj = { - a: {d: 2}, + a: { d: 2 }, b: 3, c: 4 } - var newObj = helpers.transformKeys(obj, ['d'], (val) => { return val + 1 }) + var newObj = helpers.transformKeys(obj, [ 'd' ], (val) => { return val + 1 }) assert(_.isEqual(newObj, { - a: {d: 3}, + a: { d: 3 }, b: 3, c: 4 })) @@ -38,13 +38,13 @@ describe('json transform', function () { it('should transform array values of a json object', function (done) { var obj = { - a: [2, 3], + a: [ 2, 3 ], b: 3, c: 4 } - var newObj = helpers.transformKeys(obj, ['a'], (val) => { return val + 1 }) + var newObj = helpers.transformKeys(obj, [ 'a' ], (val) => { return val + 1 }) assert(_.isEqual(newObj, { - a: [3, 4], + a: [ 3, 4 ], b: 3, c: 4 })) diff --git a/test/jobs/end-meeting-job.test.js b/test/jobs/end-meeting-job.test.js index 8eb988b..0c20cea 100644 --- a/test/jobs/end-meeting-job.test.js +++ b/test/jobs/end-meeting-job.test.js @@ -42,7 +42,7 @@ function createMeetingAndUtterances (testName, ended, hasUtterances, done) { var testMeeting = { _id: testName + n, - participants: [testParticipants[0]._id, testParticipants[1]._id], + participants: [ testParticipants[0]._id, testParticipants[1]._id ], startTime: d1, endTime: null, active: true @@ -50,32 +50,36 @@ function createMeetingAndUtterances (testName, ended, hasUtterances, done) { meetingId = testName + n - global.app.service('meetings').create(testMeeting) - .then(function (meeting) { - _.each(testParticipants, function (participant, i, list) { - global.app.service('participants').create(participant).then(() => {}) - }) - return testParticipants - }).then(function (participants) { - if (!hasUtterances) { - return - } - return global.app.service('utterances').create({ - meeting: testMeeting._id, - startTime: d1, - endTime: d2, - participant: testParticipants[0]._id - }) - }).then(function (utterance) { - if (done !== undefined) { - done() - } - }).catch(function (err) { - winston.log('info', '[end-meeting-job] error: ', err) - if (done !== undefined) { - done(err) - } - }) + global.app.service('meetings') + .create(testMeeting) + .then(function (meeting) { + _.each(testParticipants, function (participant, i, list) { + global.app.service('participants').create(participant).then(() => {}) + }) + return testParticipants + }) + .then(function (participants) { + if (!hasUtterances) { + return + } + return global.app.service('utterances').create({ + meeting: testMeeting._id, + startTime: d1, + endTime: d2, + participant: testParticipants[0]._id + }) + }) + .then(function (utterance) { + if (done !== undefined) { + done() + } + }) + .catch(function (err) { + winston.log('info', '[end-meeting-job] error: ', err) + if (done !== undefined) { + done(err) + } + }) n += 1 } @@ -126,27 +130,33 @@ describe('end meeting job', function () { }) it('should change an inactive meetings ended state', function (done) { - endMeetingJob._isMeetingEnded(endedMeeting, global.app).then(function (res) { - assert(res.meetingShouldEnd) - return endMeetingJob._maybeEndMeeting(res, global.app) - }).then(function (didEndMeeting) { - assert(didEndMeeting) - done() - }).catch(function (err) { - done(err) - }) + endMeetingJob._isMeetingEnded(endedMeeting, global.app) + .then(function (res) { + assert(res.meetingShouldEnd) + return endMeetingJob._maybeEndMeeting(res, global.app) + }) + .then(function (didEndMeeting) { + assert(didEndMeeting) + done() + }) + .catch(function (err) { + done(err) + }) }) it('shouldnt change an active meetings end state', function (done) { - endMeetingJob._isMeetingEnded(aliveMeeting, global.app).then(function (res) { - assert(!res.meetingShouldEnd) - return endMeetingJob._maybeEndMeeting(res, global.app) - }).then(function (didEndMeeting) { - assert(!didEndMeeting) - done() - }).catch(function (err) { - done(err) - }) + endMeetingJob._isMeetingEnded(aliveMeeting, global.app) + .then(function (res) { + assert(!res.meetingShouldEnd) + return endMeetingJob._maybeEndMeeting(res, global.app) + }) + .then(function (didEndMeeting) { + assert(!didEndMeeting) + done() + }) + .catch(function (err) { + done(err) + }) }) }) @@ -167,25 +177,27 @@ describe('end meeting job', function () { }) it('should end all inactive meetings', function (done) { - endMeetingJob._endInactiveMeetings([endedMeeting, aliveMeeting], global.app) + endMeetingJob._endInactiveMeetings([ endedMeeting, aliveMeeting ], global.app) .then(function (endedMeetings) { winston.log('info', '[end-meeting-job] ended meetings:', endedMeetings) assert(endedMeetings[0]) assert(!endedMeetings[1]) done() - }).catch(function (err) { + }) + .catch(function (err) { done(err) }) }) it('should end inactive meetings without utterances', function (done) { - endMeetingJob._endInactiveMeetings([endedMeetingWithoutUtterances, aliveMeetingWithoutUtterances], global.app) + endMeetingJob._endInactiveMeetings([ endedMeetingWithoutUtterances, aliveMeetingWithoutUtterances ], global.app) .then(function (endedMeetings) { winston.log('info', '[end-meeting-job] ended meetings:', endedMeetings) assert(endedMeetings[0]) assert(!endedMeetings[1]) done() - }).catch(function (err) { + }) + .catch(function (err) { done(err) }) }) diff --git a/test/jobs/turn-job/index.test.js b/test/jobs/turn-job/index.test.js index b8d27d7..18b703a 100644 --- a/test/jobs/turn-job/index.test.js +++ b/test/jobs/turn-job/index.test.js @@ -2,7 +2,7 @@ 'use strict' const assert = require('assert') -const Faker = require('Faker') +const Faker = require('faker') const winston = require('winston') const _ = require('underscore') const turnJob = require('../../../src/jobs').turnJob @@ -33,8 +33,8 @@ var testParticipants = [ var testMeeting = { _id: 'turn-job-meeting-0', room: 'turn-job', - participants: ['p1a', 'p2a', 'p3a'], - startTime: Faker.Date.recent(), + participants: [ 'p1a', 'p2a', 'p3a' ], + startTime: Faker.date.recent(), active: true } @@ -43,19 +43,19 @@ var testUtterances = [ participant: testMeeting.participants[0], startTime: new Date(startTime), endTime: new Date(startTime + 1 * 50), - volumes: _(10).times((n) => { return { 'timestamp': '1', 'vol': Faker.Helpers.randomNumber(5) } }) + volumes: _(10).times((n) => { return { timestamp: '1', vol: Faker.random.number(5) } }) }, { meeting: testMeeting._id, participant: testMeeting.participants[0], startTime: new Date(startTime + 2 * 50), endTime: new Date(startTime + 3 * 50), - volumes: _(10).times((n) => { return { 'timestamp': '1', 'vol': Faker.Helpers.randomNumber(5) } }) + volumes: _(10).times((n) => { return { timestamp: '1', vol: Faker.random.number(5) } }) }, { meeting: testMeeting._id, participant: testMeeting.participants[1], startTime: new Date(startTime + 3 * 50), endTime: new Date(startTime + 4 * 50), - volumes: _(10).times((n) => { return { 'timestamp': '1', 'vol': Faker.Helpers.randomNumber(5) } }) + volumes: _(10).times((n) => { return { timestamp: '1', vol: Faker.random.number(5) } }) } ] @@ -85,7 +85,8 @@ describe('turn job hook', () => { winston.log('info', 'meeting compute created', meeting) assert(_.has(turnJob.processList, meeting._id)) done() - }).catch((err) => { + }) + .catch((err) => { done(err) }) }) @@ -102,42 +103,46 @@ describe('turn computation', function (done) { return global.app.service('utterances').create(utteranceObj, {}) }) Promise.all(testUtterancePromises) - .then((utterances) => { done() }) - .catch((err) => { done(err) }) + .then((utterances) => { done() }) + .catch((err) => { done(err) }) }) it('correctly computed turns from utterance data', function (done) { this.timeout(6000) turnAnalytics.computeTurns(global.app, testMeeting, startTime, new Date()) setTimeout(function () { - global.app.service('turns').find({ - query: { - meeting: testMeeting._id - } - }).then((turns) => { - // pull out just the turns - var turn = _.map(turns[0].turns, (t) => { return _.omit(t, '_id') }) - winston.log('info', JSON.stringify(turn), JSON.stringify(expectedTurnData), turns[0].transitions) - turn.sort((a, b) => { return a.turns < b.turns }) - assert.deepEqual(turn, expectedTurnData) - assert.equal(turns[0].transitions, 1) + global.app.service('turns') + .find({ + query: { + meeting: testMeeting._id + } + }) + .then((turns) => { + // pull out just the turns + var turn = _.map(turns[0].turns, (t) => { return _.omit(t, '_id') }) + winston.log('info', JSON.stringify(turn), JSON.stringify(expectedTurnData), turns[0].transitions) + turn.sort((a, b) => { return a.turns < b.turns }) + assert.deepEqual(turn, expectedTurnData) + assert.equal(turns[0].transitions, 1) + done() + }) + .catch((err) => { + done(err) + }) + }, 5000) + }) + + it('stopped computing turns when a meeting is changed to inactive', function (done) { + global.app.service('meetings') + .patch(testMeeting._id, { + active: false + }) + .then((meeting) => { + assert(_.has(turnJob.processList, meeting._id) === false) done() - }).catch((err) => { + }) + .catch((err) => { done(err) }) - } - , 5000) }) - - it('stopped computing turns when a meeting is changed to inactive', - function (done) { - global.app.service('meetings').patch(testMeeting._id, { - active: false - }).then((meeting) => { - assert(_.has(turnJob.processList, meeting._id) === false) - done() - }).catch((err) => { - done(err) - }) - }) }) diff --git a/test/load.test.js b/test/load.test.js index 0899813..7ca8d78 100644 --- a/test/load.test.js +++ b/test/load.test.js @@ -3,8 +3,9 @@ const assert = require('assert') const io = require('socket.io-client') -const Faker = require('Faker') -const feathers = require('feathers-client') +const Faker = require('faker') +const feathers = require('@feathersjs/feathers') +const socketio = require('@feathersjs/socketio-client') const _ = require('underscore') const testUsers = 50 @@ -16,7 +17,7 @@ describe('Load tests', function () { while (ioIndex < testUsers) { (function () { var socket = io.connect('http://localhost:3000', { - 'transports': [ + transports: [ 'websocket', 'flashsocket', 'jsonp-polling', @@ -39,17 +40,19 @@ describe('Load tests', function () { participant: 'participant' + ioIndex, startTime: new Date(), endTime: new Date((new Date()).getTime() + 50), - volumes: _(10).times((n) => { return Faker.Helpers.randomNumber(5) }) + volumes: _(10).times((n) => { return Faker.helpers.random.number(5) }) }) + /* eslint-disable camelcase */ socket.emit('face::create', { meeting: 'meeting' + ioIndex, participant: 'participant' + ioIndex, start_time: new Date(), end_time: new Date((new Date()).getTime() + 50), timestamp: new Date(), - face_delta: Faker.Helpers.randomNumber(5), - delta_array: _(71).times((n) => { return [Faker.Helpers.randomNumber(5)] }) + face_delta: Faker.random.number(5), + delta_array: _(71).times((n) => { return [ Faker.random.number(5) ] }) }) + /* eslint-enable camelcase */ }, interval) setTimeout(function () { @@ -65,7 +68,7 @@ describe('Load tests', function () { it('receives turn events for each hangout', function (done) { var socket = io.connect('http://localhost:3000', { - 'transports': [ + transports: [ 'websocket', 'flashsocket', 'jsonp-polling', @@ -74,12 +77,13 @@ describe('Load tests', function () { ], 'force new connection': true }) - var app = feathers() - .configure(feathers.hooks()) - .configure(feathers.socketio(socket)) - var turns = app.service('turns') + var client = feathers() + .configure(socketio(socket)) + var turns = client.service('turns') var recvdTurns = [] - for (var i = 0; i < testUsers; i++) { recvdTurns[i] = 0 } + for (let i = 0; i < testUsers; i++) { + recvdTurns[i] = 0 + } var isDone = false turns.on('created', function (turn) { @@ -88,7 +92,7 @@ describe('Load tests', function () { if (recvdTurns[meeting] >= 3) { if (!isDone) { isDone = true - for (var i = 0; i < testUsers; i++) { + for (let i = 0; i < testUsers; i++) { assert.equal(recvdTurns[i], 3) } done() diff --git a/test/services/face/index.test.js b/test/services/face/index.test.js index 91696ea..22d711d 100644 --- a/test/services/face/index.test.js +++ b/test/services/face/index.test.js @@ -12,6 +12,7 @@ describe('face service', () => { assert.ok(app.service('faces')) }) + /* eslint-disable camelcase */ var face = { participant: 'jordan', timestamp: new Date(), @@ -20,6 +21,7 @@ describe('face service', () => { delta_array: [], room: 'room' } + /* eslint-enable camelcase */ var fakeJoinedEvent = { participant: 'bob', @@ -31,7 +33,7 @@ describe('face service', () => { } var socket = io.connect('http://localhost:3000', { - 'transports': [ + transports: [ 'websocket', 'flashsocket', 'jsonp-polling', @@ -41,18 +43,22 @@ describe('face service', () => { }) before(function (done) { - dropDatabase().then(() => { - socket.emit('meetingJoined', fakeJoinedEvent) - socket.disconnect() - setTimeout(() => { done() }, 400) - }).catch((err) => { done(err) }) + dropDatabase() + .then(() => { + socket.emit('meetingJoined', fakeJoinedEvent) + socket.disconnect() + setTimeout(() => { done() }, 400) + }) + .catch((err) => { done(err) }) }) it('created a face', function (done) { - app.service('faces').create(face).then((created) => { - winston.log('info', 'created fcace', JSON.stringify(created)) - assert.equal(created.meeting, 'room-1') - done() - }).catch((err) => done(err)) + app.service('faces').create(face) + .then((created) => { + winston.log('info', 'created fcace', JSON.stringify(created)) + assert.equal(created.meeting, 'room-1') + done() + }) + .catch(err => done(err)) }) }) diff --git a/test/services/meeting/activate-meeting-hook.test.js b/test/services/meeting/activate-meeting-hook.test.js index c0bb890..8be0039 100644 --- a/test/services/meeting/activate-meeting-hook.test.js +++ b/test/services/meeting/activate-meeting-hook.test.js @@ -19,34 +19,43 @@ describe('activate meeting hook', function () { } before(function (done) { - dropDatabase().then(() => { - global.app.service('meetings').create(endedMeeting) - .then(function (meeting) { - assert(meeting.active === false) - done() - }) - }).catch((err) => { done(err) }) + dropDatabase() + .then(() => { + global.app.service('meetings') + .create(endedMeeting) + .then(function (meeting) { + assert(meeting.active === false) + done() + }) + }) + .catch((err) => { done(err) }) }) after(function (done) { - global.app.service('meetings').patch(endedMeeting._id, { - participants: [] - }).then((meeting) => { - done() - }).catch((err) => { - done(err) - }) + global.app.service('meetings') + .patch(endedMeeting._id, { + participants: [] + }) + .then((meeting) => { + done() + }) + .catch((err) => { + done(err) + }) }) it('sets an empty meeting active after a participant joins', function (done) { - global.app.service('meetings').patch(endedMeeting._id, { - participants: ['p1'] - }).then(function (meeting) { - assert(meeting.active === true) - assert(meeting.endTime === null) - done() - }).catch(function (err) { - done(err) - }) + global.app.service('meetings') + .patch(endedMeeting._id, { + participants: [ 'p1' ] + }) + .then(function (meeting) { + assert(meeting.active === true) + assert(meeting.endTime === null) + done() + }) + .catch(function (err) { + done(err) + }) }) }) diff --git a/test/services/meeting/add-participants-hook.test.js b/test/services/meeting/add-participants-hook.test.js index 4af7f99..570f07f 100644 --- a/test/services/meeting/add-participants-hook.test.js +++ b/test/services/meeting/add-participants-hook.test.js @@ -16,20 +16,22 @@ function createMeeting () { var activeMeeting = { _id: 'add-participants-hook' + n, - participants: ['p1', 'p2'], + participants: [ 'p1', 'p2' ], startTime: d2, endTime: null, active: true } - return global.app.service('meetings').create(activeMeeting) - .then(function (meeting) { - assert(meeting.active === true) - n += 1 - return meeting - }).catch(function (err) { - return err - }) + return global.app.service('meetings') + .create(activeMeeting) + .then(function (meeting) { + assert(meeting.active === true) + n += 1 + return meeting + }) + .catch(function (err) { + return err + }) } describe('add participants hook', function () { @@ -40,44 +42,57 @@ describe('add participants hook', function () { }) beforeEach(function (done) { - createMeeting().then(function (meeting) { - meetingId = meeting - done() - }).catch(function (err) { - done(err) - }) + createMeeting() + .then(function (meeting) { + meetingId = meeting + done() + }) + .catch(function (err) { + done(err) + }) }) afterEach(function (done) { - global.app.service('meetings').patch(meetingId, { - participants: [] - }).then((meeting) => { - done() - }).catch((err) => { - done(err) - }) + global.app.service('meetings') + .patch(meetingId, { + participants: [] + }) + .then((meeting) => { + done() + }) + .catch((err) => { + done(err) + }) }) it('adds a participant to a meeting when it receives an add_participants query ', function (done) { - global.app.service('meetings').patch(meetingId, { - add_participant: 'p3' - }, {}).then(function (meeting) { - winston.log('info', 'added participants? :', meeting) - assert(_.isEqual(meeting.participants, ['p1', 'p2', 'p3'])) - done() - }).catch(function (err) { - done(err) - }) + /* eslint-disable camelcase */ + global.app.service('meetings') + .patch(meetingId, { + add_participant: 'p3' + }, {}) + .then(function (meeting) { + winston.log('info', 'added participants? :', meeting) + assert(_.isEqual(meeting.participants, [ 'p1', 'p2', 'p3' ])) + done() + }) + .catch(function (err) { + done(err) + }) + /* eslint-enable camelcase */ }) it('patches without an add_participant query', function (done) { - global.app.service('meetings').patch(meetingId, { - participants: ['p1', 'p2', 'p3', 'p4'] - }).then(function (meeting) { - assert(_.isEqual(meeting.participants, ['p1', 'p2', 'p3', 'p4'])) - done() - }).catch(function (err) { - done(err) - }) + global.app.service('meetings') + .patch(meetingId, { + participants: [ 'p1', 'p2', 'p3', 'p4' ] + }) + .then(function (meeting) { + assert(_.isEqual(meeting.participants, [ 'p1', 'p2', 'p3', 'p4' ])) + done() + }) + .catch(function (err) { + done(err) + }) }) }) diff --git a/test/services/meeting/deactivate-meeting-hook-test.js b/test/services/meeting/deactivate-meeting-hook-test.js index 2e7b2c7..c13e164 100644 --- a/test/services/meeting/deactivate-meeting-hook-test.js +++ b/test/services/meeting/deactivate-meeting-hook-test.js @@ -37,7 +37,7 @@ function createMeetingAndUtterances (testName) { var testMeeting = { _id: testName + n, - participants: [testParticipants[0]._id, testParticipants[1]._id, testParticipants[2]._id], + participants: [ testParticipants[0]._id, testParticipants[1]._id, testParticipants[2]._id ], startTime: d2, endTime: null, active: true @@ -64,20 +64,22 @@ function createMeetingAndUtterances (testName) { } ] - return global.app.service('meetings').create(testMeeting) - .then(function (meeting) { - _.each(testParticipants, function (participant, i, list) { - global.app.service('participants').create(participant) - }) - _.each(testUtterances, function (utterance, i, list) { - global.app.service('utterances').create(utterance) - }) - assert(meeting.active === true) - n += 1 - return meeting - }).catch(function (err) { - return err - }) + return global.app.service('meetings') + .create(testMeeting) + .then(function (meeting) { + _.each(testParticipants, function (participant, i, list) { + global.app.service('participants').create(participant) + }) + _.each(testUtterances, function (utterance, i, list) { + global.app.service('utterances').create(utterance) + }) + assert(meeting.active === true) + n += 1 + return meeting + }) + .catch(function (err) { + return err + }) } describe('deactivate meeting hook', function () { @@ -89,43 +91,54 @@ describe('deactivate meeting hook', function () { }) beforeEach(function (done) { - createMeetingAndUtterances('deactivate-meeting-hook').then(function (meeting) { - meetingId = meeting - done() - }).catch(function (err) { - done(err) - }) + createMeetingAndUtterances('deactivate-meeting-hook') + .then(function (meeting) { + meetingId = meeting + done() + }) + .catch(function (err) { + done(err) + }) }) it('sets an empty meeting inactive after all participants leave', function (done) { - global.app.service('meetings').patch(meetingId, { - participants: [] - }).then(function (meeting) { - winston.log('info', 'deactivated meeting:', meeting) - assert(meeting.active === false) - assert(meeting.endTime !== null) - done() - }).catch(function (err) { - done(err) - }) + global.app.service('meetings') + .patch(meetingId, { + participants: [] + }) + .then(function (meeting) { + winston.log('info', 'deactivated meeting:', meeting) + assert(meeting.active === false) + assert(meeting.endTime !== null) + done() + }) + .catch(function (err) { + done(err) + }) }) it('creates a meeting end event successfully', function (done) { - global.app.service('meetings').patch(meetingId, { - participants: [] - }).then(function (meeting) { - global.app.service('meetingEvents').find({ - query: { $and: [{meeting: meetingId}, - {event: 'end'}] - } - }).then(function (meetingEvents) { - assert(meetingEvents.length > 0) - done() - }).catch(function (err) { + global.app.service('meetings') + .patch(meetingId, { + participants: [] + }) + .then(function (meeting) { + global.app.service('meetingEvents') + .find({ + query: { $and: [{ meeting: meetingId }, + { event: 'end' }] + } + }) + .then(function (meetingEvents) { + assert(meetingEvents.length > 0) + done() + }) + .catch(function (err) { + done(err) + }) + }) + .catch(function (err) { done(err) }) - }).catch(function (err) { - done(err) - }) }) }) diff --git a/test/services/meeting/index.test.js b/test/services/meeting/index.test.js index 051343c..bb5d87a 100644 --- a/test/services/meeting/index.test.js +++ b/test/services/meeting/index.test.js @@ -2,15 +2,15 @@ 'use strict' const assert = require('assert') -const Faker = require('Faker') +const Faker = require('faker') const app = require('../../../src/app') describe('meeting service', () => { var testMeeting = { - _id: Faker.Helpers.randomNumber(500).toString(), - participants: ['p1', 'p2', 'p3'], - startTime: Faker.Date.recent(), + _id: Faker.random.number(500).toString(), + participants: [ 'p1', 'p2', 'p3' ], + startTime: Faker.date.recent(), active: false } @@ -22,12 +22,13 @@ describe('meeting service', () => { it('creates a new meeting', function (done) { app.service('meetings') - .create(testMeeting, {}) - .then((meeting) => { - assert(meeting._id === testMeeting._id) - done() - }).catch((err) => { - done(err) - }) + .create(testMeeting, {}) + .then((meeting) => { + assert(meeting._id === testMeeting._id) + done() + }) + .catch((err) => { + done(err) + }) }) }) diff --git a/test/services/meeting/meeting-meta.test.js b/test/services/meeting/meeting-meta.test.js index 2d8c8f1..0c0742c 100644 --- a/test/services/meeting/meeting-meta.test.js +++ b/test/services/meeting/meeting-meta.test.js @@ -30,7 +30,7 @@ describe('meta data in meeting', function () { startTime: d2, endTime: d1, active: false, - meta: {key: 'value'} + meta: { key: 'value' } } var m3 = { @@ -39,62 +39,74 @@ describe('meta data in meeting', function () { startTime: d2, endTime: d1, active: false, - meta: {key: 'value with spaces'} + meta: { key: 'value with spaces' } } it('successfully saves a meeting with no metadata', function (done) { - app.service('meetings').create(m1) - .then(function (meeting) { - assert(meeting) - assert(_.isEqual(meeting._id, m1._id)) - done() - }).catch(function (err) { - done(err) - }) + app.service('meetings') + .create(m1) + .then(function (meeting) { + assert(meeting) + assert(_.isEqual(meeting._id, m1._id)) + done() + }) + .catch(function (err) { + done(err) + }) }) it('successfully saves a meeting that has metadata', function (done) { - app.service('meetings').create(m2) - .then(function (meeting) { - assert(_.isEqual(meeting._id, m2._id)) - assert(_.isEqual(meeting.meta, m2.meta)) - done() - }).catch(function (err) { - done(err) - }) + app.service('meetings') + .create(m2) + .then(function (meeting) { + assert(_.isEqual(meeting._id, m2._id)) + assert(_.isEqual(meeting.meta, m2.meta)) + done() + }) + .catch(function (err) { + done(err) + }) }) it('successfully finds a meeting with meta filter', function (done) { - app.service('meetings').find({query: {meta: {key: 'value'}}}) - .then(function (meetings) { - assert(meetings) - assert(_.isEqual(meetings[0]._id, 'meeting-metadata-1')) - assert(_.isEqual(meetings[0].meta, m2.meta)) - done() - }).catch(function (err) { - done(err) - }) + app.service('meetings') + .find({ query: { meta: { key: 'value' } } }) + .then(function (meetings) { + assert(meetings) + assert(_.isEqual(meetings[0]._id, 'meeting-metadata-1')) + assert(_.isEqual(meetings[0].meta, m2.meta)) + done() + }) + .catch(function (err) { + done(err) + }) }) it('successfully finds the meeting after url decoding the meta fields', function (done) { - app.service('meetings').create(m3).then(function (meeting) { - app.service('meetings').find({query: {meta: {key: 'value%20with%20spaces'}}}) - .then(function (meetings) { - assert(meetings[0]._id === 'meeting-metadata-3') - done() - }).catch(function (err) { - done(err) - }) - }) + app.service('meetings') + .create(m3) + .then(function (meeting) { + app.service('meetings') + .find({ query: { meta: { key: 'value%20with%20spaces' } } }) + .then(function (meetings) { + assert(meetings[0]._id === 'meeting-metadata-3') + done() + }) + .catch(function (err) { + done(err) + }) + }) }) it('doesnt find a meeting with meta when there isnt one', function (done) { - app.service('meetings').find({query: {meta: {key: 'not value'}}}) - .then(function (meetings) { - assert(_.isEmpty(meetings)) - done() - }).catch(function (err) { - done(err) - }) + app.service('meetings') + .find({ query: { meta: { key: 'not value' } } }) + .then(function (meetings) { + assert(_.isEmpty(meetings)) + done() + }) + .catch(function (err) { + done(err) + }) }) }) diff --git a/test/services/meeting/participant-changed.test.js b/test/services/meeting/participant-changed.test.js index ece4fa9..8b96285 100644 --- a/test/services/meeting/participant-changed.test.js +++ b/test/services/meeting/participant-changed.test.js @@ -16,10 +16,10 @@ describe('meeting participants change', function () { const meetingService = global.app.service('meetings') var testMeeting = { _id: 'participants-patched-1', - participants: ['p1', 'p2', 'p3'], + participants: [ 'p1', 'p2', 'p3' ], startTime: new Date() } - var endParticipants = ['p1', 'p2'] + var endParticipants = [ 'p1', 'p2' ] meetingService.on('patched', function (meeting) { if (meeting._id === testMeeting._id) { @@ -44,10 +44,10 @@ describe('meeting participants change', function () { const meetingService = global.app.service('meetings') var testMeeting = { _id: 'participants-patched-2', - participants: ['p1', 'p2'], + participants: [ 'p1', 'p2' ], startTime: new Date() } - var endParticipants = ['p1', 'p2', 'p3'] + var endParticipants = [ 'p1', 'p2', 'p3' ] meetingService.on('patched', function (meeting) { if (meeting._id === testMeeting._id) { diff --git a/test/services/meeting/participants-event-hook.test.js b/test/services/meeting/participants-event-hook.test.js index c2b6f8c..e3bd79e 100644 --- a/test/services/meeting/participants-event-hook.test.js +++ b/test/services/meeting/participants-event-hook.test.js @@ -21,14 +21,16 @@ function createMeeting () { active: false } - return global.app.service('meetings').create(activeMeeting) - .then(function (meeting) { - assert(meeting.active === false) - n += 1 - return meeting - }).catch(function (err) { - return err - }) + return global.app.service('meetings') + .create(activeMeeting) + .then(function (meeting) { + assert(meeting.active === false) + n += 1 + return meeting + }) + .catch(function (err) { + return err + }) } describe('participants event hook', function () { @@ -39,52 +41,63 @@ describe('participants event hook', function () { var meetingId = null beforeEach(function (done) { - createMeeting().then(function (meeting) { - meetingId = meeting - done() - }).catch(function (err) { - done(err) - }) + createMeeting() + .then(function (meeting) { + meetingId = meeting + done() + }) + .catch(function (err) { + done(err) + }) }) it('creates a participantEvent when a meeting is created', function (done) { - global.app.service('participantEvents').find({ - query: { - meeting: meetingId, - $sort: {timestamp: -1} - } - }).then(function (participantEvents) { - var participants = participantEvents.data[0].participants - assert(participants.length === 0) - done() - }).catch(function (err) { - done(err) - }) + global.app.service('participantEvents') + .find({ + query: { + meeting: meetingId, + $sort: { timestamp: -1 } + } + }) + .then(function (participantEvents) { + var participants = participantEvents.data[0].participants + assert(participants.length === 0) + done() + }) + .catch(function (err) { + done(err) + }) }) it('creates a participantEvent when a meeting is changed', function (done) { this.timeout = 3000 - global.app.service('meetings').patch(meetingId, { - participants: ['p1', 'p2'] - }).then(function (meeting) { - setTimeout(function () { - global.app.service('participantEvents').find({ - query: { - meeting: meetingId, - $sort: {timestamp: -1} - } - }).then(function (participantEvents) { - var participants = participantEvents.data[0].participants - assert(_.contains(participants, 'p1')) - assert(_.contains(participants, 'p2')) - assert(participants.length === 2) - done() - }).catch(function (err) { - done(err) - }) - }, 1000) - }).catch(function (err) { - done(err) - }) + global.app.service('meetings') + .patch(meetingId, { + participants: [ 'p1', 'p2' ] + }) + .then(function (meeting) { + setTimeout(function () { + global.app.service('participantEvents') + .find({ + query: { + meeting: meetingId, + $sort: { timestamp: -1 } + } + }) + .then(function (participantEvents) { + var participants = participantEvents.data[0].participants + assert(_.contains(participants, 'p1')) + assert(_.contains(participants, 'p2')) + assert(participants.length === 2) + done() + }) + .catch(function (err) { + done(err) + }) + }, 1000) + }) + .catch(function (err) { + done(err) + }) }) }) diff --git a/test/services/meeting/remove-participants-hook.test.js b/test/services/meeting/remove-participants-hook.test.js index 61929df..75964aa 100644 --- a/test/services/meeting/remove-participants-hook.test.js +++ b/test/services/meeting/remove-participants-hook.test.js @@ -16,20 +16,22 @@ function createMeeting () { var activeMeeting = { _id: 'remove-participants-hook' + n, - participants: ['p1', 'p2', 'p3'], + participants: [ 'p1', 'p2', 'p3' ], startTime: d2, endTime: null, active: true } - return global.app.service('meetings').create(activeMeeting) - .then(function (meeting) { - assert(meeting.active === true) - n += 1 - return meeting - }).catch(function (err) { - return err - }) + return global.app.service('meetings') + .create(activeMeeting) + .then(function (meeting) { + assert(meeting.active === true) + n += 1 + return meeting + }) + .catch(function (err) { + return err + }) } describe('remove participants hook', function () { @@ -41,44 +43,57 @@ describe('remove participants hook', function () { var meetingId = null beforeEach(function (done) { - createMeeting().then(function (meeting) { - meetingId = meeting - done() - }).catch(function (err) { - done(err) - }) + createMeeting() + .then(function (meeting) { + meetingId = meeting + done() + }) + .catch(function (err) { + done(err) + }) }) afterEach(function (done) { - global.global.app.service('meetings').patch(meetingId, { - participants: [] - }).then((meeting) => { - done() - }).catch((err) => { - done(err) - }) + global.global.app.service('meetings') + .patch(meetingId, { + participants: [] + }) + .then((meeting) => { + done() + }) + .catch((err) => { + done(err) + }) }) it('removes a participant when it receives a remove_participants query ', function (done) { - global.app.service('meetings').patch(meetingId, { - remove_participants: ['p1', 'p2'] - }, {}).then(function (meeting) { - winston.log('info', 'removed participants? :', meeting) - assert(_.isEqual(meeting.participants, ['p3'])) - done() - }).catch(function (err) { - done(err) - }) + /* eslint-disable camelcase */ + global.app.service('meetings') + .patch(meetingId, { + remove_participants: [ 'p1', 'p2' ] + }, {}) + .then(function (meeting) { + winston.log('info', 'removed participants? :', meeting) + assert(_.isEqual(meeting.participants, [ 'p3' ])) + done() + }) + .catch(function (err) { + done(err) + }) + /* eslint-enable camelcase */ }) it('patches without a remove_participant query', function (done) { - global.app.service('meetings').patch(meetingId, { - participants: ['p1', 'p2', 'p3', 'p4'] - }).then(function (meeting) { - assert(_.isEqual(meeting.participants, ['p1', 'p2', 'p3', 'p4'])) - done() - }).catch(function (err) { - done(err) - }) + global.app.service('meetings') + .patch(meetingId, { + participants: [ 'p1', 'p2', 'p3', 'p4' ] + }) + .then(function (meeting) { + assert(_.isEqual(meeting.participants, [ 'p1', 'p2', 'p3', 'p4' ])) + done() + }) + .catch(function (err) { + done(err) + }) }) }) diff --git a/test/services/participant/index.test.js b/test/services/participant/index.test.js index bd02a88..8eb65da 100644 --- a/test/services/participant/index.test.js +++ b/test/services/participant/index.test.js @@ -19,23 +19,27 @@ describe('participant service', () => { it('creates a new participant', function (done) { app.service('participants') - .create(testParticipant, {}) - .then((participant) => { - assert(testParticipant._id === participant._id) - done() - }).catch((err) => { - done(err) - }) + .create(testParticipant, {}) + .then((participant) => { + assert(testParticipant._id === participant._id) + done() + }) + .catch((err) => { + done(err) + }) }) it('patches a participant', function (done) { - app.service('participants').patch(testParticipant._id, { - consent: true - }).then((participant) => { - assert(participant.consent === true) - done() - }).catch((err) => { - done(err) - }) + app.service('participants') + .patch(testParticipant._id, { + consent: true + }) + .then((participant) => { + assert(participant.consent === true) + done() + }) + .catch((err) => { + done(err) + }) }) }) diff --git a/test/services/utterance/index.test.js b/test/services/utterance/index.test.js index 022f0c9..2a52fee 100644 --- a/test/services/utterance/index.test.js +++ b/test/services/utterance/index.test.js @@ -18,7 +18,7 @@ describe('utterance service', () => { } var socket = io.connect('http://localhost:3000', { - 'transports': [ + transports: [ 'websocket', 'flashsocket', 'jsonp-polling', @@ -54,11 +54,13 @@ describe('utterance service', () => { ] before(function (done) { - dropDatabase().then(() => { - socket.emit('meetingJoined', fakeJoinedEvent) - socket.disconnect() - setTimeout(() => { done() }, 400) - }).catch((err) => { done(err) }) + dropDatabase() + .then(() => { + socket.emit('meetingJoined', fakeJoinedEvent) + socket.disconnect() + setTimeout(() => { done() }, 400) + }) + .catch((err) => { done(err) }) }) after(function (done) { @@ -71,51 +73,63 @@ describe('utterance service', () => { }) it('created an utterance', function (done) { - app.service('utterances').create(utterances[0]).then((utter) => { - winston.log('info', 'utterance created', JSON.stringify(utter)) - assert(utter.meeting !== undefined) - assert.equal(utter.startTime.getTime(), utterances[0].startTime) - assert.equal(utter.endTime.getTime(), utterances[0].endTime) - assert.equal(utter.participant, utterances[0].participant) - done() - }).catch((err) => { - done(err) - }) + app.service('utterances') + .create(utterances[0]) + .then((utter) => { + winston.log('info', 'utterance created', JSON.stringify(utter)) + assert(utter.meeting !== undefined) + assert.equal(utter.startTime.getTime(), utterances[0].startTime) + assert.equal(utter.endTime.getTime(), utterances[0].endTime) + assert.equal(utter.participant, utterances[0].participant) + done() + }) + .catch((err) => { + done(err) + }) }) it('created a second utterance', function (done) { - app.service('utterances').create(utterances[1]).then((utter) => { - winston.log('info', 'utterance created', JSON.stringify(utter)) - assert(utter.meeting !== undefined) - assert.equal(utter.startTime.getTime(), utterances[1].startTime) - assert.equal(utter.endTime.getTime(), utterances[1].endTime) - assert.equal(utter.participant, utterances[1].participant) - done() - }).catch((err) => { - done(err) - }) - }) - - it('merged the third utterance', function (done) { - app.service('utterances').create(utterances[2]).then((drop) => { - winston.log('info', 'third utt', JSON.stringify(drop)) - app.service('utterances').find().then((utts) => { - assert.equal(utts.length, 2) - let utter - if (utts[0].startTime === utterances[0].startTime) { - utter = utts[0] - } else { - utter = utts[1] - } + app.service('utterances') + .create(utterances[1]) + .then((utter) => { + winston.log('info', 'utterance created', JSON.stringify(utter)) + assert(utter.meeting !== undefined) assert.equal(utter.startTime.getTime(), utterances[1].startTime) - assert.equal(utter.endTime.getTime(), utterances[2].endTime.getTime()) + assert.equal(utter.endTime.getTime(), utterances[1].endTime) assert.equal(utter.participant, utterances[1].participant) done() - }).catch((err) => { + }) + .catch((err) => { + done(err) + }) + }) + + it('merged the third utterance', function (done) { + app.service('utterances') + .create(utterances[2]) + .then((drop) => { + winston.log('info', 'third utt', JSON.stringify(drop)) + app.service('utterances') + .find() + .then((utts) => { + assert.equal(utts.length, 2) + let utter + if (utts[0].startTime === utterances[0].startTime) { + utter = utts[0] + } else { + utter = utts[1] + } + assert.equal(utter.startTime.getTime(), utterances[1].startTime) + assert.equal(utter.endTime.getTime(), utterances[2].endTime.getTime()) + assert.equal(utter.participant, utterances[1].participant) + done() + }) + .catch((err) => { + done(err) + }) + }) + .catch((err) => { done(err) }) - }).catch((err) => { - done(err) - }) }) }) diff --git a/test/shared/global-before.js b/test/shared/global-before.js index f979baf..ea308d8 100644 --- a/test/shared/global-before.js +++ b/test/shared/global-before.js @@ -1,20 +1,22 @@ /* eslint-env mocha */ 'use strict' -const feathersServer = require('feathers') -const MongoClient = require('mongodb').MongoClient const winston = require('winston') const Promise = require('promise') +const MongoClient = require('mongodb').MongoClient const mongoose = require('mongoose') -const feathers = require('feathers-client') const io = require('socket.io-client') +const feathers = require('@feathersjs/feathers') +const socketio = require('@feathersjs/socketio-client') +const auth = require('@feathersjs/authentication-client') -// for server -const hooks = require('feathers-hooks') const user = require('../../src/services/user') +// to see debug log messages enable the following: +// winston.level = 'debug' + global.socket = io.connect('http://localhost:' + process.env.PORT, { - 'transports': [ + transports: [ 'websocket', 'flashsocket', 'jsonp-polling', @@ -27,48 +29,62 @@ var mongoUrl = process.env.MONGODB_URI function dropDatabase () { winston.log('info', 'dropping db..') - var connectedDb = null + var mongoClient = null return MongoClient.connect(mongoUrl) - .then((db) => { - connectedDb = db - return connectedDb.dropDatabase() + .then((client) => { + mongoClient = client + return client.db().dropDatabase() }) - .then(() => { return connectedDb }) + .then(() => { return mongoClient }) } -function createUser (db) { +function createUser (mongoClient) { winston.log('info', 'creating user...') return new Promise(function (resolve, reject) { - db.close().then(function () { - mongoose.connect(mongoUrl) - mongoose.Promise = global.Promise - }) - var serverNoAuth = feathersServer().configure(hooks()).configure(user) + mongoClient.close() + .then(function () { + mongoose.connect(mongoUrl) + mongoose.Promise = global.Promise + }) + var serverNoAuth = feathers().configure(user) // serverNoAuth.listen(3000) - return serverNoAuth.service('users').create({ - email: 'hello', - password: 'password' - }).then((user) => { - winston.log('info', 'created user...') - resolve(user) - }).catch((err) => { - winston.log('info', 'error creating user:', err) - reject(err) - }) + return serverNoAuth.service('users') + .create({ + email: 'hello', + password: 'password' + }) + .then((user) => { + winston.info('created user...') + winston.debug(user) + resolve(user) + }) + .catch((err) => { + winston.log('info', 'error creating user:', err) + reject(err) + }) }) } function authenticate () { - const client = feathers().configure(feathers.socketio(global.socket)) - .configure(feathers.hooks()) - .configure(feathers.authentication()) - return client.authenticate({ - type: 'local', - email: 'hello', - password: 'password' - }).then((res) => { - return client - }) + const client = feathers() + let config = { + jwt: {}, + secret: process.env.AUTH_TOKEN_SECRET, + expiresIn: process.env.AUTH_TOKEN_EXPIRESIN, + local: {} + } + client + .configure(socketio(global.socket)) + .configure(auth(config)) + return client + .authenticate({ + strategy: 'local', + email: 'hello', + password: 'password' + }) + .then((res) => { + return client + }) } before(function (done) { @@ -77,14 +93,16 @@ before(function (done) { .then((app) => { global.app = app done() - }).catch((err) => { + }) + .catch((err) => { done(err) winston.log('info', '[pre-test] error creating test app:', err) }) }) after(function (done) { - dropDatabase().then(() => { done() }).catch((err) => { done(err) }) + dropDatabase().then(() => { done() }) + .catch((err) => { done(err) }) }) module.exports.dropDatabase = dropDatabase diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..3acafaf --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3468 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/node@*": + version "9.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.0.tgz#d3480ee666df9784b1001a1872a2f6ccefb6c2d7" + +"@types/socket.io@~1.4.27": + version "1.4.32" + resolved "https://registry.yarnpkg.com/@types/socket.io/-/socket.io-1.4.32.tgz#bf7bc4ea6991327f31672c05e237a8a28d7bfc30" + dependencies: + "@types/node" "*" + +Faker@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/Faker/-/Faker-0.7.2.tgz#c2474bc77bb1d78018b6877d307bd7fdf082fb14" + +abab@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +accepts@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +access-control@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/access-control/-/access-control-1.0.0.tgz#aeba282cee77313e85240163d69e35b29e36d626" + dependencies: + millisecond "0.1.x" + setheader "0.0.x" + vary "1.1.x" + +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4, acorn@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.4: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.5.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" + +addressparser@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746" + +after@0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + +ajv@^4.7.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array.prototype.find@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +arraybuffer.slice@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async@1.5.2, async@1.x, async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asyncemit@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/asyncemit/-/asyncemit-3.0.1.tgz#cc3e0fe0da39b53cc15e5b3aa8616ea6a72bd599" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.16.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-polyfill@^6.3.14: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-arraybuffer@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz#474df4a9f2da24e05df3158c3b1db3c3cd46a154" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + +base64url@2.0.0, base64url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +bcryptjs@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" + +benchmark@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-1.0.0.tgz#2f1e2fa4c359f11122aa183082218e957e390c73" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + +bluebird@2.10.2: + version "2.10.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.10.2.tgz#024a5517295308857f14f91f1106fc3b555f446b" + +body-parser@1.18.2, body-parser@^1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +bson@~0.2: + version "0.2.22" + resolved "https://registry.yarnpkg.com/bson/-/bson-0.2.22.tgz#fcda103f26d0c074d5a52d50927db80fd02b4b39" + dependencies: + nan "~1.8" + +bson@~0.4.21: + version "0.4.23" + resolved "https://registry.yarnpkg.com/bson/-/bson-0.4.23.tgz#e65a2e3c7507ffade4109bc7575a76e50f8da915" + +bson@~1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.6.tgz#444db59ddd4c24f0cb063aabdc5c8c7b0ceca912" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + +buffer-from@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" + +buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +buildmail@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/buildmail/-/buildmail-4.0.1.tgz#877f7738b78729871c9a105e3b837d2be11a7a72" + dependencies: + addressparser "1.0.1" + libbase64 "0.1.0" + libmime "3.0.0" + libqp "1.1.0" + nodemailer-fetch "1.6.0" + nodemailer-shared "1.1.0" + punycode "1.4.1" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" + +color-name@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + +color@0.8.x: + version "0.8.0" + resolved "https://registry.yarnpkg.com/color/-/color-0.8.0.tgz#890c07c3fd4e649537638911cf691e5458b6fca5" + dependencies: + color-convert "^0.5.0" + color-string "^0.3.0" + +colornames@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/colornames/-/colornames-0.0.2.tgz#d811fd6c84f59029499a8ac4436202935b92be31" + +colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colorspace@1.0.x: + version "1.0.1" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.0.1.tgz#c99c796ed31128b9876a52e1ee5ee03a4a719749" + dependencies: + color "0.8.x" + text-hex "0.0.x" + +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" + +commander@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" + +commander@^2.9.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + +component-emitter@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + +component-emitter@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe" + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + +compressible@~2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9" + dependencies: + mime-db ">= 1.33.0 < 2" + +compression@^1.7.2: + version "1.7.2" + resolved "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" + dependencies: + accepts "~1.3.4" + bytes "3.0.0" + compressible "~2.0.13" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.1" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.6, concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connected@0.0.x: + version "0.0.2" + resolved "https://registry.yarnpkg.com/connected/-/connected-0.0.2.tgz#7b5755b216ce31ffabccc38e9f4e1dfc1c3b7c6d" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type-parser@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.4.tgz#f2c8bf181f2a80b92f360121429ce63a2f0aeae0" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cors@^2.8.4: + version "2.8.4" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" + dependencies: + object-assign "^4" + vary "^1" + +coveralls@^2.11.2, coveralls@^2.13.3: + version "2.13.3" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.3.tgz#9ad7c2ae527417f361e8b626483f48ee92dd2bc7" + dependencies: + js-yaml "3.6.1" + lcov-parse "0.0.10" + log-driver "1.2.5" + minimist "1.2.0" + request "2.79.0" + +create-server@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/create-server/-/create-server-1.0.1.tgz#164342834f188bbec7c7bc4667463cc2b1304c44" + dependencies: + connected "0.0.x" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +d3@^3.5.17: + version "3.5.17" + resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug-log@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + +debug@0.7.x: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@2.6.9, debug@^2.1.1, debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@^3.0.0, debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +defaults@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +deglob@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/deglob/-/deglob-1.1.2.tgz#76d577c25fe3f7329412a2b59eadea57ac500e3f" + dependencies: + find-root "^1.0.0" + glob "^7.0.5" + ignore "^3.0.9" + pkg-config "^1.1.0" + run-parallel "^1.1.2" + uniq "^1.0.1" + xtend "^4.0.0" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@~1.1.1, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +diagnostics@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.0.tgz#e1090900b49523e8527be20f081275205f2ae36a" + dependencies: + colorspace "1.0.x" + enabled "1.0.x" + kuler "0.0.x" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +doctrine@^1.2.1, doctrine@^1.2.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +dotenv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ecdsa-sig-formatter@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" + dependencies: + base64url "^2.0.0" + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +emits@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emits/-/emits-3.0.0.tgz#32752bba95e1707b219562384ab9bb8b1fd62f70" + +enabled@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" + dependencies: + env-variable "0.0.x" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + +engine.io-client@1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.6.11.tgz#7d250d8fa1c218119ecde51390458a57d5171376" + dependencies: + component-emitter "1.1.2" + component-inherit "0.0.3" + debug "2.2.0" + engine.io-parser "1.2.4" + has-cors "1.1.0" + indexof "0.0.1" + parsejson "0.0.1" + parseqs "0.0.2" + parseuri "0.0.4" + ws "1.0.1" + xmlhttprequest-ssl "1.5.1" + yeast "0.1.2" + +engine.io-client@~1.8.4: + version "1.8.5" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.5.tgz#fe7fb60cb0dcf2fa2859489329cb5968dedeb11f" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "2.3.3" + engine.io-parser "1.3.2" + has-cors "1.1.0" + indexof "0.0.1" + parsejson "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~1.1.5" + xmlhttprequest-ssl "1.5.3" + yeast "0.1.2" + +engine.io-parser@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.2.4.tgz#e0897b0bf14e792d4cd2a5950553919c56948c42" + dependencies: + after "0.8.1" + arraybuffer.slice "0.0.6" + base64-arraybuffer "0.1.2" + blob "0.0.4" + has-binary "0.1.6" + utf8 "2.1.0" + +engine.io-parser@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" + dependencies: + after "0.8.2" + arraybuffer.slice "0.0.6" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary "0.1.7" + wtf-8 "1.0.0" + +engine.io@~1.8.4: + version "1.8.5" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.5.tgz#4ebe5e75c6dc123dee4afdce6e5fdced21eb93f6" + dependencies: + accepts "1.3.3" + base64id "1.0.0" + cookie "0.3.1" + debug "2.3.3" + engine.io-parser "1.3.2" + ws "~1.1.5" + +env-variable@0.0.x: + version "0.0.4" + resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.4.tgz#0d6280cf507d84242befe35a512b5ae4be77c54e" + +es-abstract@^1.7.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.42" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.42.tgz#8c07dd33af04d5dcd1310b5cef13bea63a89ba8d" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + +es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-promise@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" + +es6-promise@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escodegen@^1.6.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-standard-jsx@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-1.2.1.tgz#0d19b1705f0ad48363ef2a8bbfa71df012d989b3" + +eslint-config-standard-jsx@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.3.0.tgz#cab0801a15a360bf63facb97ab22fbdd88d8a5e0" + +eslint-config-standard@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-5.3.1.tgz#591c969151744132f561d3b915a812ea413fe490" + +eslint-config-standard@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-6.2.1.tgz#d3a68aafc7191639e7ee441e7348739026354292" + +eslint-plugin-promise@^1.0.8: + version "1.3.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-1.3.2.tgz#fce332d6f5ff523200a537704863ec3c2422ba7c" + +eslint-plugin-promise@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz#f4bde5c2c77cdd69557a8f69a24d1ad3cfc9e67e" + +eslint-plugin-react@^5.0.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-5.2.2.tgz#7db068e1f5487f6871e4deef36a381c303eac161" + dependencies: + doctrine "^1.2.2" + jsx-ast-utils "^1.2.1" + +eslint-plugin-react@^6.4.1: + version "6.10.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78" + dependencies: + array.prototype.find "^2.0.1" + doctrine "^1.2.2" + has "^1.0.1" + jsx-ast-utils "^1.3.4" + object.assign "^4.0.4" + +eslint-plugin-standard@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-1.3.3.tgz#a3085451523431e76f409c70cb8f94e32bf0ec7f" + +eslint-plugin-standard@^2.0.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-2.3.1.tgz#6765bd2a6d9ecdc7bdf1b145ae4bb30e2b7b86f8" + +eslint@^3.8.1: + version "3.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.5.2" + debug "^2.1.1" + doctrine "^2.0.0" + escope "^3.6.0" + espree "^3.4.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +eslint@~2.10.2: + version "2.10.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-2.10.2.tgz#b2309482fef043d3203365a321285e6cce01c3d7" + dependencies: + chalk "^1.1.3" + concat-stream "^1.4.6" + debug "^2.1.1" + doctrine "^1.2.1" + es6-map "^0.1.3" + escope "^3.6.0" + espree "3.1.4" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^1.1.1" + glob "^7.0.3" + globals "^9.2.0" + ignore "^3.1.2" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + optionator "^0.8.1" + path-is-absolute "^1.0.0" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.6.0" + strip-json-comments "~1.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.1.4.tgz#0726d7ac83af97a7c8498da9b363a3609d2a68a1" + dependencies: + acorn "^3.1.0" + acorn-jsx "^3.0.0" + +espree@^3.4.0: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@~2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba" + +events@^1.1.0, events@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +express@^4.12.3, express@^4.16.1: + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extendible@0.1.x: + version "0.1.1" + resolved "https://registry.yarnpkg.com/extendible/-/extendible-0.1.1.tgz#e2a37ed87129fb4f9533e8a8d7506230a539c905" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +feathers-authentication@0.7.12: + version "0.7.12" + resolved "https://registry.yarnpkg.com/feathers-authentication/-/feathers-authentication-0.7.12.tgz#858e9ec3b91b8404be0e55c3f040f8489f1066a9" + dependencies: + bcryptjs "^2.3.0" + debug "^2.2.0" + feathers-errors "^2.0.1" + feathers-hooks "^1.5.0" + jsonwebtoken "^5.4.0" + lodash.isplainobject "^4.0.4" + passport "^0.3.0" + passport-local "^1.0.0" + +feathers-authentication@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/feathers-authentication/-/feathers-authentication-0.7.13.tgz#df2dcab5ae285b75194cef442b85c39ebfb8e00e" + dependencies: + bcryptjs "^2.3.0" + debug "^2.2.0" + feathers-errors "^2.0.1" + feathers-hooks "^1.5.0" + jsonwebtoken "^5.4.0" + lodash.isplainobject "^4.0.4" + passport "^0.3.0" + passport-local "^1.0.0" + +feathers-client@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/feathers-client/-/feathers-client-1.9.0.tgz#b1086314b0cf68fce049cddfabd9d0ebcd4b0146" + dependencies: + feathers "2.0.3" + feathers-authentication "0.7.12" + feathers-commons "^0.8.7" + feathers-hooks "1.7.1" + feathers-primus "2.0.0" + feathers-rest "1.6.0" + feathers-socketio "1.4.2" + +feathers-commons@^0.7.0: + version "0.7.8" + resolved "https://registry.yarnpkg.com/feathers-commons/-/feathers-commons-0.7.8.tgz#11b119c30dd1ea9c505c2537b12504aedaa3fe7d" + +feathers-commons@^0.8.0, feathers-commons@^0.8.4, feathers-commons@^0.8.6, feathers-commons@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/feathers-commons/-/feathers-commons-0.8.7.tgz#11c6f25b537745a983e8d61552d7db8932d53782" + +feathers-configuration@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/feathers-configuration/-/feathers-configuration-0.2.3.tgz#7458655820dfad75a9fb307d066835e412d1fd56" + dependencies: + debug "^2.2.0" + +feathers-errors@^2.0.1, feathers-errors@^2.2.0, feathers-errors@^2.4.0, feathers-errors@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/feathers-errors/-/feathers-errors-2.9.2.tgz#96ca0e5fe50cc56f0eccc90ce3fa5e1f8840828d" + dependencies: + debug "^3.0.0" + +feathers-hooks-common@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/feathers-hooks-common/-/feathers-hooks-common-2.0.3.tgz#e9f12abebdbc163f28d4cb4c85094e29aa24635d" + dependencies: + debug "^2.2.0" + feathers-errors "^2.4.0" + traverse "0.6.6" + +feathers-hooks@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/feathers-hooks/-/feathers-hooks-1.7.1.tgz#d1df225a64bf3d09f10988a418e70a79032bf4c9" + dependencies: + feathers-commons "^0.8.6" + feathers-hooks-common "^2.0.3" + uberproto "^1.2.0" + +feathers-hooks@^1.5.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/feathers-hooks/-/feathers-hooks-1.8.1.tgz#cba0c46f309cd6e368faeb4957a2dec9d7f2898f" + dependencies: + feathers-commons "^0.8.6" + feathers-hooks-common "^2.0.3" + uberproto "^1.2.0" + +feathers-hooks@~1.5.4: + version "1.5.8" + resolved "https://registry.yarnpkg.com/feathers-hooks/-/feathers-hooks-1.5.8.tgz#a6e39d4c90ff7c2b206a8a528d193073361c691d" + dependencies: + feathers-commons "^0.7.0" + feathers-errors "^2.0.1" + +feathers-mongoose@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/feathers-mongoose/-/feathers-mongoose-3.6.2.tgz#a3f91e40ae8c6bc0627b6c09849b94be915e7f2e" + dependencies: + feathers-commons "^0.8.4" + feathers-errors "^2.0.1" + feathers-query-filters "^2.0.0" + lodash.omit "^4.3.0" + uberproto "^1.2.0" + +feathers-primus@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/feathers-primus/-/feathers-primus-2.0.0.tgz#1b6ce01b05e763161867fe968434d8890ca9156e" + dependencies: + debug "^2.2.0" + feathers-socket-commons "^2.0.0" + primus "^6.0.5" + primus-emitter "^3.1.1" + uberproto "^1.2.0" + +feathers-query-filters@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/feathers-query-filters/-/feathers-query-filters-2.1.2.tgz#cdb18224db5e19cc0140d528108e0908d5eb0654" + dependencies: + feathers-commons "^0.8.0" + +feathers-rest@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/feathers-rest/-/feathers-rest-1.6.0.tgz#2ff4eb74445882c4f8901841b436cff7ad3de971" + dependencies: + debug "^2.2.0" + feathers-commons "^0.8.0" + feathers-errors "^2.0.1" + qs "^6.0.1" + +feathers-rest@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/feathers-rest/-/feathers-rest-1.8.1.tgz#3251a80ec4419763bc214dd8bb1f0a59d4ff9f35" + dependencies: + debug "^3.0.0" + feathers-commons "^0.8.0" + feathers-errors "^2.0.1" + qs "^6.4.0" + +feathers-socket-commons@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/feathers-socket-commons/-/feathers-socket-commons-2.4.0.tgz#062efd57f9a8716644145b993a5f72709969f1e1" + dependencies: + debug "^2.2.0" + feathers-commons "^0.8.0" + feathers-errors "^2.2.0" + +feathers-socketio@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/feathers-socketio/-/feathers-socketio-1.4.2.tgz#0557a61804b456d40d265b86fec6d96f01dd93bd" + dependencies: + debug "^2.2.0" + feathers-socket-commons "^2.0.0" + socket.io "^1.5.1" + uberproto "^1.2.0" + +feathers-socketio@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/feathers-socketio/-/feathers-socketio-1.6.0.tgz#9ccf9a65274c6e1fca2bd8f9e7b847be04af99ad" + dependencies: + "@types/socket.io" "~1.4.27" + debug "^2.2.0" + feathers-socket-commons "^2.0.0" + socket.io "^1.7.1" + uberproto "^1.2.0" + +feathers@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/feathers/-/feathers-2.0.3.tgz#a9fc63a7126f4bc137456e13efd25047fdb308b9" + dependencies: + babel-polyfill "^6.3.14" + debug "^2.1.1" + events "^1.1.0" + express "^4.12.3" + feathers-commons "^0.8.7" + rubberduck "^1.0.0" + uberproto "^1.2.0" + +feathers@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/feathers/-/feathers-2.2.4.tgz#5ed23e27a8889a4409a408f80fc2f2a5f7dd9175" + dependencies: + babel-runtime "^6.26.0" + debug "^3.1.0" + events "^1.1.1" + express "^4.16.1" + feathers-commons "^0.8.7" + rubberduck "^1.1.1" + uberproto "^1.2.0" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^1.1.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + 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" + +find-root@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +forwarded-for@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/forwarded-for/-/forwarded-for-1.0.1.tgz#e7da4814025168ffc0a10d3ff79e1415f46af469" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +fusing@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fusing/-/fusing-1.0.0.tgz#550c15d76af9265778aa051ece44d4000a098d45" + dependencies: + emits "3.0.x" + predefine "0.1.x" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stdin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob@3.2.11: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.14.0, globals@^9.2.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +handlebars@^4.0.1: + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-binary@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" + dependencies: + isarray "0.0.1" + +has-binary@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoek@4.x.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + +hooks-fixed@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hooks-fixed/-/hooks-fixed-1.1.0.tgz#0e8c15336708e6611185fe390b44687dd5230dbb" + +html-encoding-sniffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + +http-errors@1.6.2, http-errors@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +httpntlm@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/httpntlm/-/httpntlm-1.6.1.tgz#ad01527143a2e8773cfae6a96f58656bb52a34b2" + dependencies: + httpreq ">=0.4.22" + underscore "~1.7.0" + +httpreq@>=0.4.22: + version "0.4.24" + resolved "https://registry.yarnpkg.com/httpreq/-/httpreq-0.4.24.tgz#4335ffd82cd969668a39465c929ac61d6393627f" + +iconv-lite@0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +ignore@^3.0.9, ignore@^3.1.2, ignore@^3.2.0: + version "3.3.7" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +ip@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +ipaddr.js@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: + version "2.17.2" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-coveralls@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/istanbul-coveralls/-/istanbul-coveralls-1.0.3.tgz#4f1c1592be104d591f933cbf9c0f2f5284adcf00" + dependencies: + chalk "^1.0.0" + coveralls "^2.11.2" + minimist "^1.1.1" + rimraf "^2.3.4" + sum-up "^1.0.1" + +istanbul@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +jade@0.26.3: + version "0.26.3" + resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" + dependencies: + commander "0.6.1" + mkdirp "0.3.0" + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +js-yaml@3.x, js-yaml@^3.5.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^9.8.3: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsonwebtoken@^5.4.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-5.7.0.tgz#1c90f9a86ce5b748f5f979c12b70402b4afcddb4" + dependencies: + jws "^3.0.0" + ms "^0.7.1" + xtend "^4.0.1" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^1.2.1, jsx-ast-utils@^1.3.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" + +jwa@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" + dependencies: + base64url "2.0.0" + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.9" + safe-buffer "^5.0.1" + +jws@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" + dependencies: + base64url "^2.0.0" + jwa "^1.1.4" + safe-buffer "^5.0.1" + +kareem@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-1.0.1.tgz#7805d215bb53214ec3af969a1d0b1f17e3e7b95c" + +kerberos@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/kerberos/-/kerberos-0.0.11.tgz#cb29891c21c22ac195f3140b97dd12204fea7dc2" + dependencies: + nan "~1.8" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kuler@0.0.x: + version "0.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-0.0.0.tgz#b66bb46b934e550f59d818848e0abba4f7f5553c" + dependencies: + colornames "0.0.2" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcov-parse@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +libbase64@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-0.1.0.tgz#62351a839563ac5ff5bd26f12f60e9830bb751e6" + +libmime@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/libmime/-/libmime-3.0.0.tgz#51a1a9e7448ecbd32cda54421675bb21bc093da6" + dependencies: + iconv-lite "0.4.15" + libbase64 "0.1.0" + libqp "1.1.0" + +libqp@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/libqp/-/libqp-1.1.0.tgz#f5e6e06ad74b794fb5b5b66988bf728ef1dedbe8" + +lodash.isplainobject@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.omit@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + +lodash@^4.0.0, lodash@^4.3.0: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + +log-driver@1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +mailcomposer@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/mailcomposer/-/mailcomposer-4.0.1.tgz#0e1c44b2a07cf740ee17dc149ba009f19cadfeb4" + dependencies: + buildmail "4.0.1" + libmime "3.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +millisecond@0.1.x: + version "0.1.2" + resolved "https://registry.yarnpkg.com/millisecond/-/millisecond-0.1.2.tgz#6cc5ad386241cab8e78aff964f87028eec92dac5" + +"mime-db@>= 1.33.0 < 2", mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +"minimatch@2 || 3", minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + +mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha-mongo@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/mocha-mongo/-/mocha-mongo-0.2.0.tgz#5a5c763547a4d47533ce2817fb4daac49ae739bf" + dependencies: + mongodb "1.4.x" + qbox "0.1.x" + +mocha@^2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" + dependencies: + commander "2.3.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.2" + glob "3.2.11" + growl "1.9.2" + jade "0.26.3" + mkdirp "0.5.1" + supports-color "1.2.0" + to-iso-string "0.0.2" + +mongodb-core@1.3.13: + version "1.3.13" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-1.3.13.tgz#0a8e8719461ed98f36ed981ae00fa65d8b97781d" + dependencies: + bson "~0.4.21" + require_optional "~1.0.0" + +mongodb-core@2.1.19: + version "2.1.19" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.19.tgz#00fbd5e5a3573763b9171cfd844e60a8f2a3a18b" + dependencies: + bson "~1.0.4" + require_optional "~1.0.0" + +mongodb@1.4.x: + version "1.4.40" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-1.4.40.tgz#cfd80b74fdf0fa053f2ccfb5f49c47ca32a38efb" + dependencies: + bson "~0.2" + optionalDependencies: + kerberos "0.0.11" + readable-stream latest + +mongodb@2.1.14: + version "2.1.14" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.1.14.tgz#d78e9d70e0966ed56aba87abd15a1f1ab9478c85" + dependencies: + es6-promise "3.0.2" + mongodb-core "1.3.13" + readable-stream "1.0.31" + +mongodb@^2.2.35: + version "2.2.35" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.35.tgz#cd1b5af8a9463e3f9a787fa5b3d05565579730f9" + dependencies: + es6-promise "3.2.1" + mongodb-core "2.1.19" + readable-stream "2.2.7" + +mongoose@4.4.11: + version "4.4.11" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.4.11.tgz#ea67e1cf819d180f96dbd4e205675596d55b9d68" + dependencies: + async "1.5.2" + bson "~0.4.21" + hooks-fixed "1.1.0" + kareem "1.0.1" + mongodb "2.1.14" + mpath "0.2.1" + mpromise "0.5.5" + mquery "1.10.0" + ms "0.7.1" + muri "1.1.0" + regexp-clone "0.0.1" + sliced "1.0.1" + +mpath@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.2.1.tgz#3a4e829359801de96309c27a6b2e102e89f9e96e" + +mpromise@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mpromise/-/mpromise-0.5.5.tgz#f5b24259d763acc2257b0a0c8c6d866fd51732e6" + +mquery@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-1.10.0.tgz#8603f02b0b524d17ac0539a85996124ee17b7cb3" + dependencies: + bluebird "2.10.2" + debug "2.2.0" + regexp-clone "0.0.1" + sliced "0.0.5" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +ms@^0.7.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" + +multiline@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/multiline/-/multiline-1.0.2.tgz#69b1f25ff074d2828904f244ddd06b7d96ef6c93" + dependencies: + strip-indent "^1.0.0" + +muri@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/muri/-/muri-1.1.0.tgz#a3a6d74e68a880f433a249a74969cbb665cc0add" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +nan@~1.8: + version "1.8.4" + resolved "https://registry.yarnpkg.com/nan/-/nan-1.8.4.tgz#3c76b5382eab33e44b758d2813ca9d92e9342f34" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + +nodemailer-direct-transport@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz#e96fafb90358560947e569017d97e60738a50a86" + dependencies: + nodemailer-shared "1.1.0" + smtp-connection "2.12.0" + +nodemailer-fetch@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz#79c4908a1c0f5f375b73fe888da9828f6dc963a4" + +nodemailer-shared@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz#cf5994e2fd268d00f5cf0fa767a08169edb07ec0" + dependencies: + nodemailer-fetch "1.6.0" + +nodemailer-smtp-pool@2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz#2eb94d6cf85780b1b4725ce853b9cbd5e8da8c72" + dependencies: + nodemailer-shared "1.1.0" + nodemailer-wellknown "0.1.10" + smtp-connection "2.12.0" + +nodemailer-smtp-transport@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz#03d71c76314f14ac7dbc7bf033a6a6d16d67fb77" + dependencies: + nodemailer-shared "1.1.0" + nodemailer-wellknown "0.1.10" + smtp-connection "2.12.0" + +nodemailer-wellknown@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz#586db8101db30cb4438eb546737a41aad0cf13d5" + +nodemailer@^2.6.4: + version "2.7.2" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-2.7.2.tgz#f242e649aeeae39b6c7ed740ef7b061c404d30f9" + dependencies: + libmime "3.0.0" + mailcomposer "4.0.1" + nodemailer-direct-transport "3.3.2" + nodemailer-shared "1.1.0" + nodemailer-smtp-pool "2.8.2" + nodemailer-smtp-transport "2.7.2" + socks "1.1.9" + +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.4.4" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + +object-keys@^1.0.11, object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object.assign@^4.0.4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@1.x, once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +parsejson@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.1.tgz#9b10c6c0d825ab589e685153826de0a3ba278bcc" + dependencies: + better-assert "~1.0.0" + +parsejson@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.2.tgz#9dfe70b2cddac388bde4f35b1f240fa58adbe6c7" + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.4.tgz#806582a39887e1ea18dd5e2fe0e01902268e9350" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +passport-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee" + dependencies: + passport-strategy "1.x.x" + +passport-strategy@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + +passport@^0.3.0: + version "0.3.2" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.3.2.tgz#9dd009f915e8fe095b0124a01b8f82da07510102" + dependencies: + passport-strategy "1.x.x" + pause "0.0.1" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +pause@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-config@^1.0.1, pkg-config@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" + dependencies: + debug-log "^1.0.0" + find-root "^1.0.0" + xtend "^4.0.1" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +predefine@0.1.x: + version "0.1.2" + resolved "https://registry.yarnpkg.com/predefine/-/predefine-0.1.2.tgz#2aa92b4496bc1f8554e43a45f76bfbe50d33d37f" + dependencies: + extendible "0.1.x" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +primus-emitter@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/primus-emitter/-/primus-emitter-3.1.1.tgz#a85a36353fe8a96975be5edfebd7ee66c84dce1b" + +primus@^6.0.5: + version "6.1.0" + resolved "https://registry.yarnpkg.com/primus/-/primus-6.1.0.tgz#b3bf4c938eb07874b872bc2b0ce9c0da855d6c12" + dependencies: + access-control "~1.0.0" + asyncemit "~3.0.1" + create-server "~1.0.1" + diagnostics "~1.1.0" + eventemitter3 "~2.0.2" + forwarded-for "~1.0.1" + fusing "~1.0.0" + setheader "~0.0.4" + ultron "~1.1.0" + yeast "~0.1.2" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promise@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +proxy-addr@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.6.0" + +punycode@1.4.1, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qbox@0.1.x: + version "0.1.7" + resolved "https://registry.yarnpkg.com/qbox/-/qbox-0.1.7.tgz#e80f0dc5d09f869d8882168c3f66ac8dd2840f02" + +qs@6.5.1, qs@^6.0.1, qs@^6.4.0, qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +qs@~6.3.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +readable-stream@1.0.31: + version "1.0.31" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.31.tgz#8f2502e0bc9e3b0da1b94520aabb4e2603ecafae" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readable-stream@^2.2.2, readable-stream@latest: + version "2.3.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regexp-clone@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +request@2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +request@^2.79.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +require_optional@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" + dependencies: + resolve-from "^2.0.0" + semver "^5.1.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6: + version "1.6.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@^2.2.8, rimraf@^2.3.4: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rubberduck@^1.0.0, rubberduck@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/rubberduck/-/rubberduck-1.1.1.tgz#cd2cda4b867178135eafc995a71384f5f743db02" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +run-parallel@^1.1.2: + version "1.1.8" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.8.tgz#70e4e788f13a1ad9603254f6a2277f3843a5845c" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +sax@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +semver@^5.1.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +setheader@0.0.x, setheader@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/setheader/-/setheader-0.0.4.tgz#926ed28cf762149620931e7aea3f1b95816ec694" + dependencies: + debug "0.7.x" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + +shelljs@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" + +shelljs@^0.7.5: + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +sliced@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/sliced/-/sliced-0.0.5.tgz#5edc044ca4eb6f7816d50ba2fc63e25d8fe4707f" + +sliced@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" + +smart-buffer@^1.0.4: + version "1.1.15" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" + +smtp-connection@2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-2.12.0.tgz#d76ef9127cb23c2259edb1e8349c2e8d5e2d74c1" + dependencies: + httpntlm "1.6.1" + nodemailer-shared "1.1.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +socket.io-adapter@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + dependencies: + debug "2.3.3" + socket.io-parser "2.3.1" + +socket.io-client@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.4.tgz#ec9f820356ed99ef6d357f0756d648717bdd4281" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "2.3.3" + engine.io-client "~1.8.4" + has-binary "0.1.7" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.5" + socket.io-parser "2.3.1" + to-array "0.1.4" + +socket.io-client@~1.4.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.4.8.tgz#481b241e73df140ea1a4fb03486a85ad097f5558" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "1.2.0" + debug "2.2.0" + engine.io-client "1.6.11" + has-binary "0.1.7" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.4" + socket.io-parser "2.2.6" + to-array "0.1.4" + +socket.io-parser@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.2.6.tgz#38dfd61df50dcf8ab1d9e2091322bf902ba28b99" + dependencies: + benchmark "1.0.0" + component-emitter "1.1.2" + debug "2.2.0" + isarray "0.0.1" + json3 "3.3.2" + +socket.io-parser@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + dependencies: + component-emitter "1.1.2" + debug "2.2.0" + isarray "0.0.1" + json3 "3.3.2" + +socket.io@^1.5.1, socket.io@^1.7.1: + version "1.7.4" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.4.tgz#2f7ecedc3391bf2d5c73e291fe233e6e34d4dd00" + dependencies: + debug "2.3.3" + engine.io "~1.8.4" + has-binary "0.1.7" + object-assign "4.1.0" + socket.io-adapter "0.5.0" + socket.io-client "1.7.4" + socket.io-parser "2.3.1" + +socks@1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.9.tgz#628d7e4d04912435445ac0b6e459376cb3e6d691" + dependencies: + ip "^1.1.2" + smart-buffer "^1.0.4" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + +standard-engine@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-4.1.3.tgz#7a31aad54f03d9f39355f43389ce0694f4094155" + dependencies: + defaults "^1.0.2" + deglob "^1.0.0" + find-root "^1.0.0" + get-stdin "^5.0.1" + minimist "^1.1.0" + multiline "^1.0.2" + pkg-config "^1.0.1" + xtend "^4.0.0" + +standard@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/standard/-/standard-7.1.2.tgz#40166eeec2405065d1a4f0e3f15babc6e274607e" + dependencies: + eslint "~2.10.2" + eslint-config-standard "5.3.1" + eslint-config-standard-jsx "1.2.1" + eslint-plugin-promise "^1.0.8" + eslint-plugin-react "^5.0.1" + eslint-plugin-standard "^1.3.1" + standard-engine "^4.0.0" + +"statuses@>= 1.3.1 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0, string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +sum-up@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + dependencies: + chalk "^1.0.0" + +supports-color@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +text-hex@0.0.x: + version "0.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-0.0.0.tgz#578fbc85a6a92636e42dd17b41d0218cce9eb2b3" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + +to-iso-string@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" + +tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +traverse@0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uberproto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/uberproto/-/uberproto-1.2.0.tgz#61d4eab024f909c4e6ea52be867c4894a4beeb76" + +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + +underscore@^1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + +underscore@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +utf8@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.0.tgz#0cfec5c8052d44a23e3aaa908104e8075f95dfd5" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +vary@1.1.x, vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + +whatwg-encoding@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + dependencies: + iconv-lite "0.4.19" + +whatwg-url@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.1.tgz#a3a9265105564263c6785b4583b8c8aca26fded6" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +ws@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.0.1.tgz#7d0b2a2e58cddd819039c29c9de65045e1b310e9" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +ws@~1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +wtf-8@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +xmlhttprequest-ssl@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.1.tgz#3b7741fea4a86675976e908d296d4445961faa67" + +xmlhttprequest-ssl@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yeast@0.1.2, yeast@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"