diff --git a/.scripts/npm_start.js b/.scripts/npm_start.js new file mode 100644 index 00000000..f6d56975 --- /dev/null +++ b/.scripts/npm_start.js @@ -0,0 +1,3 @@ +'use strict'; + +require('@sensebox/opensensemap-api'); diff --git a/.scripts/npm_tag-container.sh b/.scripts/npm_tag-container.sh new file mode 100755 index 00000000..5ca9cd0e --- /dev/null +++ b/.scripts/npm_tag-container.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +set -euo pipefail +IFS=$'\n\t' + +currentBranch=$(git branch | grep -e "^*" | cut -d' ' -f 2) + +if [ "$currentBranch" != "master" ]; then + echo "Tags for containers can only be made from 'master' branch" + exit 1 +fi + +# Extract latest git tag +currentVersion=$(git tag -l --sort=-v:refname | grep dockerhub-v | head -n 1 | tr -d 'dockerhub\-v') + +# Increment +newVersion=$(($currentVersion+1)) + +# tag new version +git tag "dockerhub-v$newVersion" + +echo "Creation of new tag for docker hub was successful. New tag is 'dockerhub-v$newVersion'." +echo "Please run 'git push origin master' to trigger the build on docker hub." diff --git a/.scripts/npm_version-update_changelog.js b/.scripts/npm_version-update_changelog.js new file mode 100644 index 00000000..b7f0a565 --- /dev/null +++ b/.scripts/npm_version-update_changelog.js @@ -0,0 +1,28 @@ +'use strict'; + +/* + NPM package.json version script. Do not run manually! + + Only tested on Linux. Node v6. + + This script overwrites the first Markdown headline "## Unreleased" with the + version in the package.json and prepends a new "## Unreleased" headline. + +*/ + +const { version } = require('../package.json'), + fs = require('fs'); + +const filename = 'CHANGELOG.md'; + +fs.readFile(filename, 'utf-8', function(err, data) { + if (err) return console.log(err); + const result = data.replace( + /## Unreleased/i, + `## Unreleased\n\n## v${version}` + ); + + fs.writeFile(filename, result, 'utf8', function(err) { + if (err) return console.log(err); + }); +}); diff --git a/.travis.yml b/.travis.yml index f3d74ff5..321088e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ node_js: - "6" install: true -script: ./utils/deploy-docs.sh +script: ./api/.scripts/deploy-docs.sh env: global: diff --git a/Dockerfile b/Dockerfile index 2aa4b1e9..07664556 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,7 @@ FROM node:6-alpine +ENV NODE_ENV=production + RUN apk --no-cache --virtual .build add python make g++ git # taken from node:6-onbuild @@ -8,15 +10,16 @@ WORKDIR /usr/src/app COPY package.json /usr/src/app/ COPY yarn.lock /usr/src/app/ -RUN yarn install --pure-lockfile +RUN yarn install --pure-lockfile --production # required because the prebuilt binaries are not compatible with musl # remove when https://github.com/kelektiv/node.bcrypt.js/issues/528 is resolved RUN npm rebuild bcrypt --build-from-source -COPY . /usr/src/app +COPY .scripts /usr/src/app/ +COPY .git /usr/src/app/ # for git 2.1.4 RUN echo -n $(git rev-parse --abbrev-ref HEAD) $(TZ=UTC git log --date=local --pretty=format:"%ct %h" -n 1) > revision; rm -rf .git RUN apk del .build -CMD [ "npm", "start" ] +CMD [ "yarn", "start" ] diff --git a/README.md b/README.md index 76ccc05d..8436ef84 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,96 @@ -openSenseMap-API -================ - -[![Join the chat at https://gitter.im/sensebox/openSenseMap-API](https://badges.gitter.im/sensebox/openSenseMap-API.svg)](https://gitter.im/sensebox/openSenseMap-API?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -This is the back-end for [openSenseMap](https://opensensemap.org). - -openSenseMap is part of the [senseBox](https://sensebox.de) project. -To get more information about openSenseMap and senseBox visit the before mentioned links or have a look at this [video](https://www.youtube.com/watch?v=uTOWYa42_rI). - -Originally, this API has been built as part the bachelor thesis of @mpfeil at the ifgi (Institute for Geoinformatics, WWU Münster). - -### Technologies - -* [node.js] -* [MongoDB] - -### Development - -#### Node.js -It is assumed that you have installed node.js Version 6 LTS. Install dependencies with [yarn](https://yarnpkg.com/) -``` -yarn install -``` - -There are several config keys in `config/index.js`. These can also be configured through environment keys. Just prefix your environment keys with `OSEM_` to be read by the api. - -#### Database -The API needs a running MongoDB instance with a `OSeM-api` database and credentials. - -The best way to run the database for development is to use the supplied `docker-compose.yml` and run -``` -docker-compose up -d db -``` - -### `require()` openSenseMap-API for other projects - -You can require several parts of the API in other projects. - -Install it as dependency -``` -# for specific branch/commit/tag append # -yarn add git://github.com/sensebox/openSenseMap-API.git -``` - -This allows you to use parts like models and decoding in your own project. See `index.js`. - -### Create the JSDoc pages - -To create the documentation you need [apidocjs](http://apidocjs.com/) and run: -``` -apidoc -e node_modules/ -``` - -### Running Tests -You can run the tests in containers using docker and docker-compose. +# openSenseMap API + +[openSenseMap] is part of the [senseBox] project. To get more information about openSenseMap and senseBox visit the before mentioned links or have a look at this [video](https://www.youtube.com/watch?v=uTOWYa42_rI), read the [API docs](https://docs.opensensemap.org) or the [openSenseMap](https://osem.books.sensebox.de/) chapter in our [books](https://books.sensebox.de/). + +## Organization + +This repository is a monorepo for the packages + +- [![@sensebox/opensensemap-api-models NPM Version](https://img.shields.io/npm/v/@sensebox/opensensemap-api-models.svg)](https://www.npmjs.com/package/@sensebox/opensensemap-api-models) [@sensebox/opensensemap-api-models](models) The data models and database connection of openSenseMap. +- [![@sensebox/opensensemap-api NPM Version](https://img.shields.io/npm/v/@sensebox/opensensemap-api.svg)](https://www.npmjs.com/package/@sensebox/opensensemap-api) [@sensebox/opensensemap-api](api) The REST API used by [https://opensensemap.org](https://opensensemap.org) running at [https://api.opensensemap.org](https://api.opensensemap.org). + +### Directories +- root directory + - not published on NPM + - is used to build a Docker container image + - contains tests (run with `./run-tests`) +- [api](api) directory + - NPM [@sensebox/opensensemap-api](https://www.npmjs.com/package/@sensebox/opensensemap-api) + - [Changelog](api/CHANGELOG.md) + - should not appear as dependency of other packages +- [models](models) directory + - NPM [@sensebox/opensensemap-api-models](https://www.npmjs.com/package/@sensebox/opensensemap-api-models) + - [Changelog](models/CHANGELOG.md) + - `require('@sensebox/opensensemap-api-models')` for access to data models + +### Branches +- master (runs in production) + - Is never used to publish versions of subpackages + - [package.json](package.json) contains specific versions from NPM + - Is used for container build tags +- development (runs on testing server) + - Releases for subpackages are done from here + - [package.json](package.json) contains `file:./api` and `file:./models` as versions +- gh-pages + - Hosts API docs for [https://docs.opensensemap.org/](https://docs.opensensemap.org/) + - Is generated and pushed to github by Travis CI [![sensebox/openSenseMap-API Build Status](https://travis-ci.org/sensebox/openSenseMap-API.svg?branch=master)](https://travis-ci.org/sensebox/openSenseMap-API) + +### Tags and Versions +Git Tags are used for: +- Docker hub builds `dockerhub-v1`. Version number is increased by one for each new version. +- NPM tags for subpackages. [Uses Semantic Versioning 2.0.0](http://semver.org/spec/v2.0.0.html) + - `@sensebox/opensensemap-api-v1.0.0` + - `@sensebox/opensensemap-api-models-v1.0.0` + +### Release new NPM versions +Make sure you've documented your changes in the `CHANGELOG.md` file of the respective package and have comitted everything to the development branch. + +To create a new NPM version, use `npm version`. +1. Have everything commited for the release +1. Document your changes in `CHANGELOG.md` under `## Unreleased`. Do not `git add` the file +1. Run `npm version [ major | minor | patch ] -m "[-v%s] "` +1. `git push origin development` +1. `npm publish` + +### Docker container images +#### Development images +Every commit on branch `development` will be built with the tag `development`. Versions of `@sensebox/opensensemap-api` and `@sensebox/opensensemap-api-models` will be the current development snapshot. + +#### Versioned container images +- Check out `master` branch +- Go to root directory +- Modify version of `@sensebox/opensensemap-api` and `@sensebox/opensensemap-api-models` to desired versions +- Make sure versions of `@sensebox/opensensemap-api` and `@sensebox/opensensemap-api-models` are published on NPM +- Optional + - Run tests + - Build docker image locally +- Run `yarn` to update `yarn.lock` +- Commit `package.json` and `yarn.lock` +- Run `npm run tag-container` +- Run `git push origin master` +- Docker images are built automatically by the Docker hub for all tags starting with `dockerhub-v` + +## Development +- Have [Node.js] v6, [yarn](https://yarnpkg.com/), [Docker](https://docs.docker.com/engine/installation/) and [docker-compose](https://docs.docker.com/compose/install/) installed +- Go to the subdirectory in which you want to develop +- Only for [api](api): Run `yarn install` +- Start your development database (`docker-compose up -d db`) + +## Running Tests +You can run the tests in containers using Docker and docker-compose. ``` # Only run this once or every time you change dependencies in package.json -docker-compose -p osemapitest -f tests-docker-compose.yml build osem-api +./run-tests.sh build ./run-tests.sh ``` -### Running in Production - -Look at the [OSeM-compose](https://github.com/sensebox/osem-compose) repository. It contains a deployment with docker compose. - -### License +## Running the API +### Configuration +These packages read their configuration either from their respective `src/config.js` file or environment variables starting with `OSEM_`. Environment variables override values in `src/config.js`. -[MIT](license.md) - Matthias Pfeil 2015 - 2017 +### Container based +The repository [OSeM-compose](https://github.com/sensebox/osem-compose) contains a deployment of all services with docker compose. The image built from this repository is called [`sensebox/opensensemap-api`](https://hub.docker.com/r/sensebox/opensensemap-api/). -[node.js]:http://nodejs.org/ -[MongoDB]:http://www.mongodb.com/ +[openSenseMap]:https://opensensemap.org/ +[senseBox]:https://sensebox.de/ diff --git a/.eslintrc.js b/api/.eslintrc.js similarity index 97% rename from .eslintrc.js rename to api/.eslintrc.js index 1541c671..fb21deb8 100644 --- a/.eslintrc.js +++ b/api/.eslintrc.js @@ -156,6 +156,7 @@ module.exports = { 'error', 'never' ], - 'no-warning-comments': 'error' + 'no-warning-comments': 'error', + 'prefer-promise-reject-errors': 'error' } }; diff --git a/utils/deploy-docs.sh b/api/.scripts/deploy-docs.sh similarity index 90% rename from utils/deploy-docs.sh rename to api/.scripts/deploy-docs.sh index ff7cbf84..521c59ef 100755 --- a/utils/deploy-docs.sh +++ b/api/.scripts/deploy-docs.sh @@ -3,14 +3,11 @@ set -euo pipefail IFS=$'\n\t' - # move to the build dir.. -cd $TRAVIS_BUILD_DIR +cd "$TRAVIS_BUILD_DIR" # install apidocs -npm install -g apidoc@0.17.5 - -# deploy! +npm install -g apidoc@0.17.6 # run apidoc apidoc -i . -f js -e node_modules @@ -42,6 +39,5 @@ git config user.email "travis@travis-ci.org" # commit git commit -m "apidoc build from ${TRAVIS_COMMIT} by Travis" -# push to github! +# push to github git push "https://${GITHUB_TOKEN}@github.com/${GITHUB_REPO}.git" gh-pages - diff --git a/api/CHANGELOG.md b/api/CHANGELOG.md new file mode 100644 index 00000000..6a4b2172 --- /dev/null +++ b/api/CHANGELOG.md @@ -0,0 +1,4 @@ +# @sensebox/opensensemap-api Changelog + +## Unreleased +- Initial Release after splitting api and models diff --git a/api/README.md b/api/README.md new file mode 100644 index 00000000..d22264ab --- /dev/null +++ b/api/README.md @@ -0,0 +1,33 @@ +# @sensebox/opensensemap-api + +This package contains the HTTP REST API for the openSenseMap. Originally, this API has been built as part the bachelor thesis of [@mpfeil](https://github.com/mpfeil) at the ifgi (Institute for Geoinformatics, WWU Münster). + +The package should never be required by any other package. If you want to use the openSenseMap models, look at [@sensebox/opensensemap-api-models](../models). + +## Development + +- Install Docker, Node.js v6, yarn +- Run `yarn` in this directory +- Run development database `docker-compose up -d db` + +Also see [README](../README.md) + + +## Create the API documentation pages + +To create the documentation you need [apidocjs](http://apidocjs.com/) and run: +``` +apidoc -e node_modules/ +``` + +## Technologies + +* [Node.js] +* [MongoDB] + +## License + +[MIT](license.md) - Matthias Pfeil 2015 - 2017 + +[Node.js]:http://nodejs.org/ +[MongoDB]:http://www.mongodb.com/ diff --git a/app.js b/api/app.js similarity index 75% rename from app.js rename to api/app.js index 60b348a8..c5ceaa25 100644 --- a/app.js +++ b/api/app.js @@ -3,22 +3,24 @@ * Booya! */ +/** + * define for Datetype parameters + * @apiDefine ISO8601Date A ISO8601 formatted timestamp. Will be parsed by MomentJS with enabled strict mode + */ + 'use strict'; const restify = require('restify'), { fullResponse, queryParser, jsonBodyParser, pre: { sanitizePath } } = restify.plugins, - utils = require('./lib/utils'), - db = require('./lib/db'), - { preRequest, preCors } = require('./lib/helpers/apiUtils'), - Box = require('./lib/models').Box, - routes = require('./lib/routes'), + config = require('./src/config'), + { preRequest, preCors, Honeybadger, softwareRevision, postToSlack } = require('./src/helpers/apiUtils'), + routes = require('./src/routes'), passport = require('passport'), - log = require('./lib/log'); - -const { config, Honeybadger } = utils; + log = require('./src/log'), + { db } = require('@sensebox/opensensemap-api-models'); const server = restify.createServer({ - name: `opensensemap-api (${utils.softwareRevision})`, + name: `opensensemap-api (${softwareRevision})`, log: log }); @@ -45,8 +47,7 @@ db.connect() .then(function () { server.listen(config.port, function () { log.info(`${server.name} listening at ${server.url}`); - utils.postToSlack(`openSenseMap API started. Revision: ${utils.softwareRevision}`); - Box.connectMQTTBoxes(); + postToSlack(`openSenseMap API started. Revision: ${softwareRevision}`); }); }) .catch(function (err) { diff --git a/license.md b/api/license.md similarity index 100% rename from license.md rename to api/license.md diff --git a/logs/.gitkeep b/api/logs/.gitkeep similarity index 100% rename from logs/.gitkeep rename to api/logs/.gitkeep diff --git a/api/package.json b/api/package.json new file mode 100644 index 00000000..bb15652c --- /dev/null +++ b/api/package.json @@ -0,0 +1,60 @@ +{ + "name": "@sensebox/opensensemap-api", + "description": "openSenseMap HTTP REST API", + "version": "0.0.1", + "main": "app.js", + "license": "MIT", + "dependencies": { + "@turf/area": "^4.6.0", + "@turf/bbox": "^4.6.0", + "@turf/centroid": "^4.6.1", + "@turf/distance": "^4.6.0", + "@turf/helpers": "^4.6.0", + "@turf/hex-grid": "^4.6.1", + "@turf/square-grid": "^4.6.0", + "@turf/triangle-grid": "^4.6.0", + "apicache": "^0.10.0", + "bunyan": "^1.8.12", + "csv-stringify": "^1.0.4", + "honeybadger": "^1.2.1", + "isemail": "^3.0.0", + "millify": "^2.0.1", + "moment": "^2.18.1", + "passport": "^0.4.0", + "passport-jwt": "^3.0.0", + "passport-local": "^1.0.0", + "request": "^2.81.0", + "restify": "^5.2.0", + "restify-errors": "^5.0.0" + }, + "devDependencies": { + "@sensebox/opensensemap-api-models": "file:../models", + "eslint": "^4.6.1" + }, + "scripts": { + "lint": "./node_modules/.bin/eslint --ignore-pattern node_modules --fix app.js \"src/**/*.js\"", + "deploy-docs": "./.scripts/deploy-docs.sh", + "version": "node ../.scripts/npm_version-update_changelog.js && git add CHANGELOG.md" + }, + "apidoc": { + "name": "openSenseMap API documentation", + "description": "methods to manage senseBoxes and get/post measurements", + "title": "openSenseMap API documentation", + "url": "https://api.opensensemap.org", + "order": [ + "getBox", + "getBoxes", + "postNewBox", + "updateBox", + "deleteBox", + "getScript", + "postNewMeasurement", + "getMeasurements", + "getData", + "calculateIdw" + ] + }, + "publishConfig": { + "access": "public" + } +} diff --git a/api/src/config.js b/api/src/config.js new file mode 100644 index 00000000..e530b456 --- /dev/null +++ b/api/src/config.js @@ -0,0 +1,53 @@ +'use strict'; + +const isProdEnv = function isProdEnv () { + return process.env.ENV === 'prod'; +}; + +// specify your config items +// environment variables starting with `OSEM_` will override the values here. +// Example: `OSEM_targetfolder` will override the setting for `targetFolder` +const config = { + logFolder: './logs/', // absolute location of error log files + + api_base_domain: 'localhost', // the naked api domain. For example api.opensensemap.org + api_protocol: (isProdEnv() ? 'https' : 'http'), + api_url: '', // generated if not set from api_protocol and api_base_domain + + port: 8000, // port the api will bind to + + // configuration for routes + basePath: '/boxes', // boxes and measurements methods + userPath: '/users', // user methods + statisticsPath: '/statistics', //statistics methods + + slack_url: '', // for slack integration + + honeybadger_apikey: '', + + jwt_secret: 'OH GOD THIS IS SO INSECURE PLS CHANGE ME', // should be at least 32 characters + jwt_algorithm: 'HS256', + jwt_issuer: '', // usually the base url of the api. generated if not set from api_protocol and api_base_domain. for example https://api.opensensemap.org + + isProdEnv +}; + +for (const envKey in process.env) { + if (envKey.indexOf('OSEM_') === 0) { + const configKey = envKey.substring(5); + if (config[configKey] && typeof config[configKey] === 'number') { + config[configKey] = parseInt(process.env[envKey], 10); + } else { + config[configKey] = process.env[envKey]; + } + } +} + +// set composite config keys +if (config.api_url === '') { + config.api_url = `${config.api_protocol}://${config.api_base_domain}`; +} + +// freeze config +module.exports = Object.freeze(config); + diff --git a/lib/controllers/boxesController.js b/api/src/controllers/boxesController.js similarity index 89% rename from lib/controllers/boxesController.js rename to api/src/controllers/boxesController.js index d544a43d..a2d32ae9 100644 --- a/lib/controllers/boxesController.js +++ b/api/src/controllers/boxesController.js @@ -1,7 +1,43 @@ 'use strict'; +/** + * @apiDefine ExposureFilterParam + * @apiParam {String="indoor","outdoor","mobile","unknown"} [exposure] only include boxes with this exposure. + */ + +/** + * MQTT broker integration data + * @apiDefine MqttOption Settings for a senseBox connected through MQTT + */ + +/** + * @apiDefine MqttBody + * + * @apiParam (MqttOption) {Boolean} enabled="false" enable or disable mqtt + * @apiParam (MqttOption) {String} url the url to the mqtt server. + * @apiParam (MqttOption) {String} topic the topic to subscribe to. + * @apiParam (MqttOption) {String="json","csv"} messageFormat the format the mqtt messages are in. + * @apiParam (MqttOption) {String} decodeOptions a json encoded string with options for decoding the message. 'jsonPath' for 'json' messageFormat. + * @apiParam (MqttOption) {String} connectionOptions a json encoded string with options to supply to the mqtt client (https://github.com/mqttjs/MQTT.js#client) + */ + +/** + * thethingsnetwork.org integration data + * @apiDefine TTNOption Settings for a senseBox connected through thethingsnetwork.org (TTN) + */ + +/** + * @apiDefine TTNBody + * + * @apiParam (TTNOption) {String} dev_id The device ID recieved from TTN + * @apiParam (TTNOption) {String} app_id The application ID recieved from TTN + * @apiParam (TTNOption) {String="lora-serialization","sensebox/home","json","debug"} profile A decoding profile matching the payload format. For details and configuration see https://github.com/sensebox/ttn-osem-integration#decoding-profiles + * @apiParam (TTNOption) {Array} [decodeOptions] A JSON Array containing decoder configuration, needed for some profiles. + * @apiParam (TTNOption) {Number} [port] The TTN port to listen for messages. Optional, if not provided, all ports are used. + */ + const - { Box } = require('../models'), + { Box } = require('@sensebox/opensensemap-api-models'), { addCache, clearCache, checkContentType } = require('../helpers/apiUtils'), { retrieveParameters, @@ -11,6 +47,11 @@ const } = require('../helpers/userParamHelpers'), handleError = require('../helpers/errorHandler'); +/** + * @apiDefine Addons + * @apiParam {String="feinstaub"} addon specify a sensor addon for a box. + */ + /** * @api {put} /boxes/:senseBoxId Update a senseBox * @apiDescription Modify the specified senseBox. diff --git a/lib/controllers/index.js b/api/src/controllers/index.js similarity index 100% rename from lib/controllers/index.js rename to api/src/controllers/index.js diff --git a/lib/controllers/measurementsController.js b/api/src/controllers/measurementsController.js similarity index 95% rename from lib/controllers/measurementsController.js rename to api/src/controllers/measurementsController.js index 82d97313..a97cbe34 100644 --- a/lib/controllers/measurementsController.js +++ b/api/src/controllers/measurementsController.js @@ -1,8 +1,8 @@ 'use strict'; const - restifyErrors = require('restify-errors'), - { Measurement, Box } = require('../models'), + { BadRequestError, UnsupportedMediaTypeError } = require('restify-errors'), + { Measurement, Box } = require('@sensebox/opensensemap-api-models'), csvstringify = require('csv-stringify'), { checkContentType } = require('../helpers/apiUtils'), { @@ -11,8 +11,6 @@ const } = require('../helpers/userParamHelpers'), handleError = require('../helpers/errorHandler'); -const { BadRequestError, UnsupportedMediaTypeError } = restifyErrors; - /** * @api {get} /boxes/:senseBoxId/sensors Get latest measurements of a senseBox * @apiDescription Get the latest measurements of all sensors of the specified senseBox. @@ -36,6 +34,13 @@ const getLatestMeasurements = function getLatestMeasurements (req, res, next) { * @apiParam {String=comma,semicolon} [delimiter=comma] Only for csv: the delimiter for csv. Possible values: `semicolon`, `comma`. Per default a comma is used. Alternatively you can use separator as parameter name. */ +/** + * @apiDefine OutlierParameters + * + * @apiParam {String="replace","mark"} [outliers] Specifying this parameter enables outlier calculation which adds a new field called `isOutlier` to the data. Possible values are "mark" and "replace". + * @apiParam {Number=1-50} [outlier-window=15] Size of moving window used as base to calculate the outliers. + */ + /** * @api {get} /boxes/:senseBoxId/data/:sensorId?from-date=fromDate&to-date=toDate&download=true&format=json Get the 10000 latest measurements for a sensor * @apiDescription Get up to 10000 measurements from a sensor for a specific time frame, parameters `from-date` and `to-date` are optional. If not set, the last 48 hours are used. The maximum time frame is 1 month. If `download=true` `Content-disposition` headers will be set. Allows for JSON or CSV format. @@ -153,7 +158,7 @@ const postNewMeasurement = function postNewMeasurement (req, res, next) { value, createdAt, location - }], { contentType: 'json' }) + }], 'json') .then(function ([ measurement ]) { return box.saveMeasurement(measurement); }); @@ -240,7 +245,7 @@ const postNewMeasurements = function postNewMeasurements (req, res, next) { if (Measurement.hasDecoder(contentType)) { Box.findBoxById(boxId, { populate: false, lean: false }) .then(function (box) { - return Measurement.decodeMeasurements(req.body, { contentType, sensors: box.sensors }) + return Measurement.decodeMeasurements(req.body, contentType, { sensors: box.sensors }) .then(function (measurements) { // handler.decodeMessage succeeded, so just save measurements return box.saveMeasurementsArray(measurements); diff --git a/lib/controllers/sensorsController.js b/api/src/controllers/sensorsController.js similarity index 74% rename from lib/controllers/sensorsController.js rename to api/src/controllers/sensorsController.js index 1f82ff8a..b29f5f87 100644 --- a/lib/controllers/sensorsController.js +++ b/api/src/controllers/sensorsController.js @@ -1,10 +1,31 @@ 'use strict'; -const { Box } = require('../models'), +const { Box } = require('@sensebox/opensensemap-api-models'), { checkContentType } = require('../helpers/apiUtils'), { retrieveParameters, validateFromToTimeParams, checkBoxIdOwner } = require('../helpers/userParamHelpers'), handleError = require('../helpers/errorHandler'); +/** + * define for a senseBox Sensor + * @apiDefine Sensor A single sensor for the nested Sensor parameter + */ + +/** + * @apiDefine SensorBody + * + * @apiParam (Sensor) {String} title the title of the phenomenon the sensor observes. + * @apiParam (Sensor) {String} unit the unit of the phenomenon the sensor observes. + * @apiParam (Sensor) {String} sensorType the type of the sensor. + * @apiParam (Sensor) {String} [icon] the visual representation for the openSenseMap of this sensor. + * + */ + +/** + * @apiDefine SensorIdParam + * + * @apiParam {String} sensorId the ID of the sensor you are referring to. + */ + /** * @api {delete} /boxes/:senseBoxId/:sensorId/measurements Delete measurements of a sensor * @apiDescription This method allows to delete measurements for the specified sensor. Use the request body to specify which measurements should be deleted. diff --git a/lib/controllers/statisticsController.js b/api/src/controllers/statisticsController.js similarity index 95% rename from lib/controllers/statisticsController.js rename to api/src/controllers/statisticsController.js index c34cfca7..cc2cbaba 100644 --- a/lib/controllers/statisticsController.js +++ b/api/src/controllers/statisticsController.js @@ -1,17 +1,14 @@ 'use strict'; -const models = require('../models'), +const { Box, Measurement } = require('@sensebox/opensensemap-api-models'), { UnprocessableEntityError } = require('restify-errors'), - statistics = require('../statistics'), + idwTransformer = require('../transformers/idwTransformer'), { addCache } = require('../helpers/apiUtils'), { retrieveParameters, validateFromToTimeParams } = require('../helpers/userParamHelpers'), area = require('@turf/area'), millify = require('millify'), handleError = require('../helpers/errorHandler'); -const { Box, Measurement } = models; -const { idwTransformer } = statistics; - /** * @api {get} /stats Get some statistics about the database * @apiDescription returns an array with three numbers which denominates the count of senseBoxes, the count of measurements and the count of measurements in the last minute. @@ -133,7 +130,7 @@ module.exports = { getIdw: [ retrieveParameters([ { predef: 'bbox', required: true }, - { name: 'exposure', allowedValues: models.Box.BOX_VALID_EXPOSURES }, + { name: 'exposure', allowedValues: Box.BOX_VALID_EXPOSURES }, { name: 'phenomenon', required: true }, { name: 'gridType', defaultValue: 'hex', allowedValues: ['hex', 'square', 'triangle'] }, { name: 'cellWidth', dataType: 'Number', defaultValue: 50, min: 0.001 }, diff --git a/lib/controllers/usersController.js b/api/src/controllers/usersController.js similarity index 89% rename from lib/controllers/usersController.js rename to api/src/controllers/usersController.js index 5096f30e..519c2447 100644 --- a/lib/controllers/usersController.js +++ b/api/src/controllers/usersController.js @@ -1,12 +1,34 @@ 'use strict'; -const { User } = require('../models'), - restifyErrors = require('restify-errors'), +const { User } = require('@sensebox/opensensemap-api-models'), + { InternalServerError } = require('restify-errors'), { checkContentType } = require('../helpers/apiUtils'), { retrieveParameters } = require('../helpers/userParamHelpers'), handleError = require('../helpers/errorHandler'); -const { InternalServerError } = restifyErrors; +/** + * define for nested user parameter for box creation request + * @apiDefine User Parameters for creating a new openSenseMap user + */ + +/** + * @apiDefine UserBody + * + * @apiParam (User) {String} name the full name or nickname of the user. The name must consist of at least 3 and up to 40 characters and only allows to use alphanumerics (a-zA-Z0-9), dots (.), dashes (-), underscores (_) and spaces. The first character must be a letter or number. + * @apiParam (User) {String} email the email for the user. Is used for signing in and for sending the arduino sketch. + * @apiParam (User) {String} password the desired password for the user. Must be at least 8 characters long. + * @apiParam (User) {String} [language=en_US] the language of the user. Used for the website and mails + * + */ + +/** + * @apiDefine JWTokenAuth + * + * @apiHeader {String} Authorization allows to send a valid JSON Web Token along with this request with `Bearer` prefix. + * @apiHeaderExample {String} Authorization Header Example + * Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0ODMwMDYxNTIsImV4cCI6MTQ4MzAwOTc1MiwiaXNzIjoibG9jYWxob3N0OjgwMDAiLCJzdWIiOiJ0ZXN0QHRlc3QuZGUiLCJqdGkiOiJmMjNiOThkNi1mMjRlLTRjOTQtYWE5Ni1kMWI4M2MzNmY1MjAifQ.QegeWHWetw19vfgOvkTCsBfaSOPnjakhzzRjVtNi-2Q + * @apiError {String} 403 Unauthorized + */ /** * @api {post} /users/register Register new diff --git a/lib/helpers/apiUtils.js b/api/src/helpers/apiUtils.js similarity index 68% rename from lib/helpers/apiUtils.js rename to api/src/helpers/apiUtils.js index 092a3e3b..33a1b4c5 100644 --- a/lib/helpers/apiUtils.js +++ b/api/src/helpers/apiUtils.js @@ -1,8 +1,9 @@ 'use strict'; const { NotAuthorizedError, UnsupportedMediaTypeError } = require('restify-errors'), - { config: { basePath } } = require('../utils'), - apicache = require('apicache'); + { basePath, honeybadger_apikey, slack_url } = require('../config'), + apicache = require('apicache'), + request = require('request'); const addCache = function addCache (duration, group) { // configure the apicache, set the group and only cache response code 200 responses @@ -95,10 +96,63 @@ const preCors = function preCors (request, response, next) { return next(); }; +let Honeybadger = { + notify () {}, + resetContext () {} +}; + +/* eslint-disable global-require */ +if (honeybadger_apikey && honeybadger_apikey !== '') { + Honeybadger = require('honeybadger').configure({ + apiKey: honeybadger_apikey + }); +} +/* eslint-enable global-require */ + + +const postToSlack = function postToSlack (text) { + if (slack_url) { + request.post({ url: slack_url, json: { text: text } }); + } +}; + +const softwareRevision = (function () { + try { + /* eslint-disable global-require */ + const parts = require('fs') + .readFileSync(`${__dirname}/../revision`) + .toString() + .split(' '); + /* eslint-enable global-require */ + parts[1] = new Date(parseInt(parts[1], 10) * 1000).toISOString(); + + return `${parts[0]} ${parts[1]} ${parts[2]}`; + } catch (err) { + return 'unknown revision'; + } +})(); + +const redactEmail = function redactEmail (email) { + /* eslint-disable prefer-const */ + let [ name = '', domain = '' ] = email.split('@'); + /* eslint-enable prefer-const */ + + let [ hostname = '', tld = '' ] = domain.split('.'); + + tld = `${tld.slice(0, 1)}**`; + hostname = `${hostname.slice(0, 3)}****`; + name = `${name.slice(0, 3)}****`; + + return `${name}@${hostname}.${tld}`; +}; module.exports = { addCache, clearCache, checkContentType, preRequest, - preCors + preCors, + Honeybadger, + postToSlack, + softwareRevision, + redactEmail }; diff --git a/lib/helpers/authHelpers.js b/api/src/helpers/authHelpers.js similarity index 93% rename from lib/helpers/authHelpers.js rename to api/src/helpers/authHelpers.js index c8bd6640..3c6dd20d 100644 --- a/lib/helpers/authHelpers.js +++ b/api/src/helpers/authHelpers.js @@ -1,17 +1,14 @@ 'use strict'; const passport = require('passport'), - utils = require('../utils'), + config = require('../config'), LocalStrategy = require('passport-local'), passportJwt = require('passport-jwt'), - User = require('../models').User, - tokenBlacklist = require('./tokenBlacklist'), + { User } = require('@sensebox/opensensemap-api-models'), log = require('../log'); const { Strategy: JwtStrategy, ExtractJwt } = passportJwt; -const { config } = utils; - const localOptions = { usernameField: 'email', session: false @@ -60,7 +57,7 @@ const jwtLogin = new JwtStrategy(jwtOptions, function verifiyJwtLogin (req, jwt, const jwtString = req.headers.authorization.split(' ')[1]; // check if the token is blacklisted by performing a hmac digest on the string representation of the jwt. // also checks the existence of the jti claim - if (tokenBlacklist.isTokenBlacklisted(jwt, jwtString)) { + if (User.isTokenBlacklisted(jwt, jwtString)) { return done(null, false, { error: JWT_WRONG_OR_UNAUTHORIZED }); } diff --git a/lib/helpers/errorHandler.js b/api/src/helpers/errorHandler.js similarity index 100% rename from lib/helpers/errorHandler.js rename to api/src/helpers/errorHandler.js diff --git a/lib/helpers/userParamHelpers.js b/api/src/helpers/userParamHelpers.js similarity index 98% rename from lib/helpers/userParamHelpers.js rename to api/src/helpers/userParamHelpers.js index 0225cb1a..cbfc3330 100644 --- a/lib/helpers/userParamHelpers.js +++ b/api/src/helpers/userParamHelpers.js @@ -1,9 +1,7 @@ 'use strict'; const { BadRequestError, UnprocessableEntityError, InvalidArgumentError } = require('restify-errors'), - { parseAndValidateTimestamp } = require('../utils'), - { mongoose } = require('../db'), - { transformAndValidateCoords } = require('../decoding/validators'), + { utils: { parseAndValidateTimestamp }, db: { mongoose }, decoding: { validators: { transformAndValidateCoords } } } = require('@sensebox/opensensemap-api-models'), moment = require('moment'), isemail = require('isemail'), handleModelError = require('./errorHandler'); @@ -47,6 +45,11 @@ const checkParamAllowed = function checkParamAllowed (param, allowedValues) { const stringParser = function stringParser (s) { return s.toString().trim(); }; +/** + * @apiDefine BoxIdParam + * @apiParam {String} senseBoxId the ID of the senseBox you are referring to. + */ + const idCheck = function idCheck (id) { if (mongoose.Types.ObjectId.isValid(id) && id !== '00112233445566778899aabb') { return id; diff --git a/lib/log.js b/api/src/log.js similarity index 97% rename from lib/log.js rename to api/src/log.js index 92f9634a..51629b44 100644 --- a/lib/log.js +++ b/api/src/log.js @@ -2,7 +2,7 @@ const Stream = require('stream'), bunyan = require('bunyan'), - { config } = require('./utils'), + config = require('./config'), path = require('path'); const consoleStream = new Stream(); diff --git a/lib/routes.js b/api/src/routes.js similarity index 98% rename from lib/routes.js rename to api/src/routes.js index 3c8022b0..207e187c 100644 --- a/lib/routes.js +++ b/api/src/routes.js @@ -1,7 +1,8 @@ 'use strict'; const { usersController, statisticsController, boxesController, sensorsController, measurementsController } = require('./controllers'), - { config: { statisticsPath, basePath, userPath, api_url }, softwareRevision } = require('./utils'), + { statisticsPath, basePath, userPath, api_url } = require('./config'), + { softwareRevision } = require('./helpers/apiUtils'), { checkJwt, checkUsernamePassword } = require('./helpers/authHelpers'), { initUserParams } = require('./helpers/userParamHelpers'); diff --git a/lib/statistics/idw/idwTransformer.js b/api/src/transformers/idwTransformer.js similarity index 100% rename from lib/statistics/idw/idwTransformer.js rename to api/src/transformers/idwTransformer.js diff --git a/api/yarn.lock b/api/yarn.lock new file mode 100644 index 00000000..c3058059 --- /dev/null +++ b/api/yarn.lock @@ -0,0 +1,2087 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@mapbox/geojson-area@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz#18d7814aa36bf23fbbcc379f8e26a22927debf10" + dependencies: + wgs84 "0.0.0" + +"@sensebox/opensensemap-api-models@file:../models": + version "1.0.0" + dependencies: + "@sensebox/sketch-templater" "^1.0.6" + "@turf/helpers" "^4.6.0" + bcrypt "^1.0.2" + csv-stringify "^1.0.4" + isemail "^3.0.0" + jsonpath "^0.2.12" + jsonwebtoken "^7.4.3" + lodash.isequal "^4.5.0" + moment "^2.18.1" + mongoose "^4.11.9" + mongoose-timestamp "^0.6" + request "^2.81.0" + request-promise-native "^1.0.4" + simple-statistics "^4.1.1" + stream-transform "^0.1.2" + stringify-stream "^1.0.5" + uuid "^3.1.0" + +"@sensebox/sketch-templater@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@sensebox/sketch-templater/-/sketch-templater-1.0.6.tgz#8aa4a0cda28b5a8ed6ebcd4953a81d042a0c70be" + dependencies: + dedent "^0.7.0" + +"@turf/area@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@turf/area/-/area-4.6.0.tgz#cba871adbe73ed6d42d1489e04b0bf88c6414514" + dependencies: + "@mapbox/geojson-area" "^0.2.2" + "@turf/meta" "^4.6.0" + +"@turf/bbox@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-4.6.0.tgz#8c7f68cdd2bee9178de4d9f9bfbcee4235db5fc3" + dependencies: + "@turf/meta" "^4.6.0" + +"@turf/centroid@^4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-4.6.1.tgz#6ffe203746aa33dec17d41c22aa5691342e46496" + dependencies: + "@turf/helpers" "^4.6.0" + "@turf/meta" "^4.6.0" + +"@turf/distance@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@turf/distance/-/distance-4.6.0.tgz#6410b9b4ea7e44e4a99be33018d9daab031946e0" + dependencies: + "@turf/helpers" "^4.6.0" + "@turf/invariant" "^4.6.0" + +"@turf/helpers@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-4.6.0.tgz#12398733b8ae28420df6166fa44c7ee8ffd6414c" + +"@turf/hex-grid@^4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@turf/hex-grid/-/hex-grid-4.6.1.tgz#211ee084cad9c5ba60ceb36a2994e4bf6962f746" + dependencies: + "@turf/distance" "^4.6.0" + "@turf/helpers" "^4.6.0" + +"@turf/invariant@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@turf/invariant/-/invariant-4.6.0.tgz#ba61401d537543f81ccfc588e12bb0d8e653dd80" + +"@turf/meta@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-4.6.0.tgz#0d3f9a218e58d1c5e5deedf467c3321dd61203f3" + +"@turf/square-grid@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@turf/square-grid/-/square-grid-4.6.0.tgz#e1c1637402ec6426ddcf37cb6382deab0267df34" + dependencies: + "@turf/bbox" "^4.6.0" + "@turf/distance" "^4.6.0" + "@turf/helpers" "^4.6.0" + +"@turf/triangle-grid@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@turf/triangle-grid/-/triangle-grid-4.6.0.tgz#c0c30df466fe0bb7f32cc1dfd8ca485ac2911b6d" + dependencies: + "@turf/distance" "^4.6.0" + "@turf/helpers" "^4.6.0" + +JSONSelect@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/JSONSelect/-/JSONSelect-0.4.0.tgz#a08edcc67eb3fcbe99ed630855344a0cf282bb8d" + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +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: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" + +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, ajv@^4.9.1: + 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.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.0" + json-stable-stringify "^1.0.1" + +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" + +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" + +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +apicache@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/apicache/-/apicache-0.10.0.tgz#79687842020647a91aa87e0e74680bcc0610584e" + +aproba@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +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" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +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@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" + dependencies: + lodash "^4.14.0" + +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" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.22.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" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +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" + +bcrypt@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-1.0.3.tgz#b02ddc6c0b52ea16b8d3cf375d5a32e780dab548" + dependencies: + nan "2.6.2" + node-pre-gyp "0.6.36" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@2.10.2: + version "2.10.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.10.2.tgz#024a5517295308857f14f91f1106fc3b555f446b" + +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" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +bson@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.4.tgz#93c10d39eaa5b58415cbc4052f3e53e562b0b72c" + +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-shims@^1.0.0, buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +bunyan@^1.8.1, bunyan@^1.8.12: + version "1.8.12" + resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797" + optionalDependencies: + dtrace-provider "~0.8" + moment "^2.10.6" + mv "~2" + safe-json-stringify "~1" + +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" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +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" + +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" + +chalk@^2.0.0, chalk@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.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" + +cjson@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cjson/-/cjson-0.2.1.tgz#73cd8aad65d9e1505f9af1744d3b79c1527682a5" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +clone-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.0.tgz#eae0a2413f55c0942f818c229fefce845d7f3b1c" + dependencies: + is-regexp "^1.0.0" + is-supported-regexp-flag "^1.0.0" + +clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +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@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +colors@0.5.x: + version "0.5.1" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +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.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +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" + +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +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" + +csv-generate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-1.0.0.tgz#bd52886859d0c925f3e51f60f3abed262fa15caf" + +csv-parse@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-1.2.1.tgz#9199c23f2490d98c4d9ab2a0167b06927498c9df" + +csv-stringify@^1.0.0, csv-stringify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-1.0.4.tgz#bc18bab9ad4cef3195fd257980b58b479c42d3e5" + dependencies: + lodash.get "^4.0.0" + +csv@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/csv/-/csv-1.1.1.tgz#d9952d59b1f964a7afbcdd804d6818a73199a477" + dependencies: + csv-generate "^1.0.0" + csv-parse "^1.2.0" + csv-stringify "^1.0.0" + stream-transform "^0.1.0" + +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@2.6.8, debug@^2.2.0, debug@^2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +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.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +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" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-node@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dtrace-provider@^0.8.1, dtrace-provider@~0.8: + version "0.8.5" + resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.5.tgz#98ebba221afac46e1c39fd36858d8f9367524b92" + dependencies: + nan "^2.3.3" + +ebnf-parser@~0.1.9: + version "0.1.10" + resolved "https://registry.yarnpkg.com/ebnf-parser/-/ebnf-parser-0.1.10.tgz#cd1f6ba477c5638c40c97ed9b572db5bab5d8331" + +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" + +es6-promise@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" + +escape-regexp-component@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-regexp-component/-/escape-regexp-component-1.0.2.tgz#9c63b6d0b25ff2a88c3adbd18c5b61acc3b9faa2" + +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@0.0.21: + version "0.0.21" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-0.0.21.tgz#53d652cfa1030388279458a5266c5ffc709c63c3" + dependencies: + esprima "~1.0.2" + estraverse "~0.0.4" + optionalDependencies: + source-map ">= 0.1.2" + +escodegen@~0.0.24: + version "0.0.28" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-0.0.28.tgz#0e4ff1715f328775d6cab51ac44a406cd7abffd3" + dependencies: + esprima "~1.0.2" + estraverse "~1.3.0" + optionalDependencies: + source-map ">= 0.1.2" + +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.6.1.tgz#ddc7fc7fd70bf93205b0b3449bb16a1e9e7d4950" + dependencies: + ajv "^5.2.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^2.6.8" + doctrine "^2.0.0" + eslint-scope "^3.7.1" + espree "^3.5.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^9.17.0" + 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 "^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 "^4.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "^4.0.1" + text-table "~0.2.0" + +espree@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" + dependencies: + acorn "^5.1.1" + acorn-jsx "^3.0.0" + +esprima@1.0.x, esprima@~1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" + +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + +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.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +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" + +estraverse@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-0.0.4.tgz#01a0932dfee574684a598af5a67c3bf9b6428db2" + +estraverse@~1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.3.2.tgz#37c2b893ef13d723f276d878d60d8535152a6c42" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.31" + +extsprintf@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.2.0.tgz#5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529" + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +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" + +flat-cache@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +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" + +formidable@^1.0.17: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +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" + +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@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: + 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.17.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" + +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +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@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +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-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +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" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +honeybadger@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/honeybadger/-/honeybadger-1.2.1.tgz#ad54b4ebf07ad41038cc9b4bb4a753c11317acb4" + dependencies: + request "~2.79.0" + stack-trace "~0.0.9" + +hooks-fixed@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hooks-fixed/-/hooks-fixed-2.0.0.tgz#a01d894d52ac7f6599bbb1f63dfc9c411df70cba" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + +http-signature@^1.0.0, 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" + +iconv-lite@^0.4.17: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + +ignore@^3.3.3: + version "3.3.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +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.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^3.0.6: + version "3.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.2.tgz#c2aaede1507cc54d826818737742d621bef2e823" + dependencies: + ansi-escapes "^2.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@^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-json-valid@^2.12.4: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.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.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + +is-supported-regexp-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz#8b520c85fae7a253382d4b02652e045576e13bb8" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isemail@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" + +isemail@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.0.0.tgz#c89a46bb7a3361e1759f8028f9082488ecce3dff" + dependencies: + punycode "2.x.x" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jison-lex@0.2.x: + version "0.2.1" + resolved "https://registry.yarnpkg.com/jison-lex/-/jison-lex-0.2.1.tgz#ac4b815e8cce5132eb12b5dfcfe8d707b8844dfe" + dependencies: + lex-parser "0.1.x" + nomnom "1.5.2" + +jison@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/jison/-/jison-0.4.13.tgz#9041707d62241367f58834532b9f19c2c36fac78" + dependencies: + JSONSelect "0.4.0" + cjson "~0.2.1" + ebnf-parser "~0.1.9" + escodegen "0.0.21" + esprima "1.0.x" + jison-lex "0.2.x" + lex-parser "~0.1.3" + nomnom "1.5.2" + +joi@^6.10.1: + version "6.10.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" + dependencies: + hoek "2.x.x" + isemail "1.x.x" + moment "2.x.x" + topo "1.x.x" + +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.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" + 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" + +jschardet@^1.4.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" + +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.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" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpath@^0.2.12: + version "0.2.12" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-0.2.12.tgz#5bf9d911fb4616c1e3370beceb9f0db24ae34cd2" + dependencies: + esprima "1.2.2" + jison "0.4.13" + static-eval "0.2.3" + underscore "1.7.0" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsonwebtoken@^7.0.0, jsonwebtoken@^7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz#77f5021de058b605a1783fa1283e99812e645638" + dependencies: + joi "^6.10.1" + jws "^3.1.4" + lodash.once "^4.0.0" + ms "^2.0.0" + 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" + +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.1.4: + 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.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-1.5.0.tgz#e3e4101d9dcfde299769daf4b4db64d895d17448" + +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" + +lex-parser@0.1.x, lex-parser@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/lex-parser/-/lex-parser-0.1.4.tgz#64c4f025f17fd53bfb45763faeb16f015a747550" + +lodash.get@^4.0.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +millify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/millify/-/millify-2.0.1.tgz#3cfde496b23904b357c620ae71409ffd8eafdd02" + +mime-db@~1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.16" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" + dependencies: + mime-db "~1.29.0" + +mime@^1.2.11: + version "1.3.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, 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: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"mkdirp@>=0.5 0", mkdirp@^0.5.1, 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" + +moment@2.x.x, moment@^2.10.6, moment@^2.18.1: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +mongodb-core@2.1.15: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.15.tgz#841f53b87ffff4c7458189c35c8ae827e1169764" + dependencies: + bson "~1.0.4" + require_optional "~1.0.0" + +mongodb@2.2.31: + version "2.2.31" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.31.tgz#1940445c661e19217bb3bf8245d9854aaef548db" + dependencies: + es6-promise "3.2.1" + mongodb-core "2.1.15" + readable-stream "2.2.7" + +mongoose-timestamp@^0.6: + version "0.6.0" + resolved "https://registry.yarnpkg.com/mongoose-timestamp/-/mongoose-timestamp-0.6.0.tgz#da54110ca8e6d4c2b9957a0366836c362ed272be" + dependencies: + defaults "^1.0.3" + +mongoose@^4.11.9: + version "4.11.9" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.11.9.tgz#58f89a72e75674d9bcdfa4e65ebe1b49b4477637" + dependencies: + async "2.1.4" + bson "~1.0.4" + hooks-fixed "2.0.0" + kareem "1.5.0" + mongodb "2.2.31" + mpath "0.3.0" + mpromise "0.5.5" + mquery "2.3.1" + ms "2.0.0" + muri "1.2.2" + regexp-clone "0.0.1" + sliced "1.0.1" + +mpath@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.3.0.tgz#7a58f789e9b5fd3c94520634157960f26bd5ef44" + +mpromise@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mpromise/-/mpromise-0.5.5.tgz#f5b24259d763acc2257b0a0c8c6d866fd51732e6" + +mquery@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-2.3.1.tgz#9ab36749714800ff0bb53a681ce4bc4d5f07c87b" + dependencies: + bluebird "2.10.2" + debug "2.6.8" + regexp-clone "0.0.1" + sliced "0.0.5" + +ms@2.0.0, ms@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +muri@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/muri/-/muri-1.2.2.tgz#63198132650db08a04cc79ccd00dd389afd2631c" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +mv@~2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" + dependencies: + mkdirp "~0.5.1" + ncp "~2.0.0" + rimraf "~2.4.0" + +nan@2.6.2, nan@^2.3.3: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +ncp@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + +negotiator@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +node-pre-gyp@0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nomnom@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.5.2.tgz#f4345448a853cfbd5c0d26320f2477ab0526fe2f" + dependencies: + colors "0.5.x" + underscore "1.1.x" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +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" + +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" + +once@^1.3.0, once@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +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" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +passport-jwt@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/passport-jwt/-/passport-jwt-3.0.0.tgz#7d9e4ff0fa0522108540ce1fcfa83bbd8faa29c9" + dependencies: + jsonwebtoken "^7.0.0" + passport-strategy "^1.0.0" + +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, passport-strategy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + +passport@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.4.0.tgz#c5095691347bd5ad3b5e180238c3914d16f05811" + 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, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +pause@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +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" + +pluralize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +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" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@^6.2.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" + +qs@~6.3.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +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.0.1, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.9: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~2.1.0: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + 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 "~0.10.x" + util-deprecate "~1.0.1" + +regexp-clone@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589" + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.4.tgz#86988ec8eee408e45579fce83bfd05b3adf9a155" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.0" + +request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + 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" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +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" + +require-uncached@^1.0.3: + 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" + +restify-errors@^4.2.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/restify-errors/-/restify-errors-4.3.0.tgz#ec90f30934d7f3119135181dfc303e30be601abe" + dependencies: + assert-plus "^1.0.0" + lodash "^4.2.1" + verror "^1.8.1" + optionalDependencies: + safe-json-stringify "^1.0.3" + +restify-errors@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/restify-errors/-/restify-errors-5.0.0.tgz#668717e100683eec6ce0d515f89ff1dbec254a8d" + dependencies: + assert-plus "^1.0.0" + lodash "^4.2.1" + verror "^1.8.1" + optionalDependencies: + safe-json-stringify "^1.0.3" + +restify@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/restify/-/restify-5.2.0.tgz#f7133102ef3958a56da42f760415112a78a01822" + dependencies: + assert-plus "^1.0.0" + bunyan "^1.8.1" + clone-regexp "^1.0.0" + csv "^1.1.0" + escape-regexp-component "^1.0.2" + formidable "^1.0.17" + http-signature "^1.0.0" + lodash "^4.17.4" + lru-cache "^4.0.1" + mime "^1.2.11" + negotiator "^0.6.1" + once "^1.3.0" + qs "^6.2.1" + restify-errors "^4.2.3" + semver "^5.0.1" + spdy "^3.3.3" + uuid "^3.0.0" + vasync "^1.6.4" + verror "^1.9.0" + optionalDependencies: + dtrace-provider "^0.8.1" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +rimraf@~2.4.0: + version "2.4.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" + dependencies: + glob "^6.0.1" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +safe-buffer@^5.0.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" + +safe-json-stringify@^1.0.3, safe-json-stringify@~1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.0.4.tgz#81a098f447e4bbc3ff3312a243521bc060ef5911" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + +semver@^5.0.1, semver@^5.1.0, semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +simple-statistics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/simple-statistics/-/simple-statistics-4.1.1.tgz#533c48d48336ba3d350d8135f20fa7138acb0c7d" + +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" + +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" + +"source-map@>= 0.1.2": + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +spdy-transport@^2.0.18: + version "2.0.20" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.3.3: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + +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.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + 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.9: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + +static-eval@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-0.2.3.tgz#023f17ac9fee426ea788c12ea39206dc175f8b2a" + dependencies: + escodegen "~0.0.24" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + +stream-transform@^0.1.0, stream-transform@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-0.1.2.tgz#7d8e6b4e03ac4781778f8c79517501bfb0762a9f" + +string-width@^1.0.1, string-width@^1.0.2: + 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, string-width@^2.1.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" + +stringify-stream@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/stringify-stream/-/stringify-stream-1.0.5.tgz#e51407a8fdc4ca0e1c62f149868bacf5cf204050" + dependencies: + readable-stream "~2.1.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + 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-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" + +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@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + +table@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" + 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" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +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" + +tmp@^0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +topo@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" + dependencies: + hoek "2.x.x" + +tough-cookie@>=2.3.0, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +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" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +underscore@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.1.7.tgz#40bab84bad19d230096e8d6ef628bff055d83db0" + +underscore@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +vasync@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/vasync/-/vasync-1.6.4.tgz#dfe93616ad0e7ae801b332a9d88bfc5cdc8e1d1f" + dependencies: + verror "1.6.0" + +verror@1.10.0, verror@^1.8.1, verror@^1.9.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" + +verror@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.6.0.tgz#7d13b27b1facc2e2da90405eb5ea6e5bdd252ea5" + dependencies: + extsprintf "1.2.0" + +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" + dependencies: + minimalistic-assert "^1.0.0" + +wgs84@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/wgs84/-/wgs84-0.0.0.tgz#34fdc555917b6e57cf2a282ed043710c049cdc76" + +which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +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" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" diff --git a/docker-compose.yml b/docker-compose.yml index 2eade908..1e247ff6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,22 +1,5 @@ version: "2" services: - osem-api: - build: . - ports: - - 8000:8000 - volumes: - - ./app.js:/usr/src/app/app.js - - ./lib:/usr/src/app/lib - - ./config/index.js:/usr/src/app/config/index.js - - ./userimages:/usr/src/app/userimages - environment: - OSEM_dbhost: db - OSEM_dbuser: senseboxapiuser - OSEM_dbuserpass: userpass - OSEM_mailer_url: https://localhost:3924/ - depends_on: - - db - db: image: sensebox/opensensemap-api-mongo ports: @@ -27,5 +10,4 @@ services: OSEM_dbhost: db OSEM_dbuser: senseboxapiuser OSEM_dbuserpass: userpass - OSEM_mailer_url: https://localhost:3924/ diff --git a/index.js b/index.js deleted file mode 100644 index b3e2aab1..00000000 --- a/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -const models = require('./lib/models'), - utils = require('./lib/utils'), - decoding = require('./lib/decoding'), - db = require('./lib/db'); - -module.exports = { - models, - utils, - decoding, - db -}; diff --git a/lib/decoding/plainHandler.js b/lib/decoding/plainHandler.js deleted file mode 100644 index 94f46d4e..00000000 --- a/lib/decoding/plainHandler.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -// this handler is only for debugging.. -const log = require('../log'); - -module.exports = { - decodeMessage: function (message) { - log.debug(message); - - return Promise.resolve(); - } -}; diff --git a/lib/models/index.js b/lib/models/index.js deleted file mode 100644 index dfb27728..00000000 --- a/lib/models/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -const Box = require('./box'), - User = require('./user'), - Measurement = require('./measurement'), - Sensor = require('./sensor'); - -module.exports = { - Box: Box.model, - User: User.model, - Measurement: Measurement.model, - Sensor: Sensor.model -}; diff --git a/lib/mqtt/connectionOptionsParser.js b/lib/mqtt/connectionOptionsParser.js deleted file mode 100644 index 61a1f3e4..00000000 --- a/lib/mqtt/connectionOptionsParser.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -const log = require('../log'); - -// see https://github.com/mqttjs/MQTT.js#client -const ALLOWED_KEYS = [ - 'keepalive', - 'reschedulePings', - 'clientId', - 'username', - 'password' -]; - -module.exports = { - // userConnectionOptions is a string which contains json - parse (userConnectionOptions) { - const opts = {}; - - if (userConnectionOptions) { - let userOptions; - - try { - userOptions = JSON.parse(userConnectionOptions); - } catch (e) { - log.error(e, 'unable to parse user supplied connectionOptions'); - } - - if (userOptions) { - // just handle keys in the ALLOWED_KEYS array - ALLOWED_KEYS.forEach(function (key) { - if (userOptions[key]) { - opts[key] = userOptions[key]; - } - }); - } - } - - // check if there was a user supplied clientId - // and if not generate one.. - if (!opts.clientId || typeof opts.clientId !== 'string') { - opts.clientId = `osem_${Math.random().toString(16) - .substr(2, 8)}`; - } - - // check if there was a user supplied connectTimeout - // and if not set to 5 seconds - if (!opts.connectTimeout || typeof opts.connectTimeout !== 'string') { - opts.connectTimeout = 5 * 1000; - } - - return opts; - } -}; diff --git a/lib/mqtt/index.js b/lib/mqtt/index.js deleted file mode 100644 index 23babfb2..00000000 --- a/lib/mqtt/index.js +++ /dev/null @@ -1,133 +0,0 @@ -'use strict'; - -const mqtt = require('mqtt'), - decodeHandlers = require('../decoding'), - connOptsParser = require('./connectionOptionsParser'), - log = require('../log'); - -const RETRY_AFTER_MINUTES = 10; - -// use this object as simple key/value store for connecting/disconnecting -const mqttConnections = {}; - -const _retryAfter = function (box, afterMinutes) { - const theBox = box; - setTimeout(function () { - connect(theBox); - }, afterMinutes * 60000); -}; - -const _connect = function (box, maxRetries) { - // parse mqtt connection options - const connectionOptions = connOptsParser.parse(box.integrations.mqtt.connectionOptions); - let errRetries = maxRetries, - closeRetries = maxRetries; - - const client = mqtt.connect(box.integrations.mqtt.url, connectionOptions); - client.reconnecting = true; - - return new Promise(function (resolve, reject) { - client.on('error', function (err) { - errRetries = errRetries - 1; - if (errRetries === 0) { - client.reconnecting = false; - client.end(true); - errRetries = maxRetries; - closeRetries = maxRetries; - - // retry after.. - _retryAfter(box, RETRY_AFTER_MINUTES); - - return reject(`connection closed after 5 retries because of ${err}. Retry after ${RETRY_AFTER_MINUTES} minutes`); - } - }); - - client.on('close', function () { - closeRetries = closeRetries - 1; - if (closeRetries === 0) { - client.reconnecting = false; - client.end(true); - - // retry after.. - _retryAfter(box, RETRY_AFTER_MINUTES); - - return reject(`connection closed after 5 retries. Retry after ${RETRY_AFTER_MINUTES} minutes`); - } - }); - - client.on('connect', function () { - log.info(`connected mqtt for box ${box._id}`); - client.subscribe(box.integrations.mqtt.topic, function (err) { - if (err) { - return reject(err); - } - mqttConnections[box._id] = client; - - return resolve(client); - }); - }); - }); -}; - -const connect = function (box) { - // disconnect any running connections before reconnecting.. - disconnect(box); - if (box.integrations.mqtt && box.integrations.mqtt.url !== '') { - const mqttCfg = box.integrations.mqtt; - const handler = decodeHandlers[mqttCfg.messageFormat]; - - if (mqttCfg.url && mqttCfg.topic && handler) { - _connect(box, 5) - .then(function (client) { - let decodeOptions; - try { - decodeOptions = JSON.parse(mqttCfg.decodeOptions); - } catch (e) { - log.warn(`mqtt decode options of box ${box._id} not parseable`); - } - - client.on('close', function () { - log.info(`mqtt closed for box: ${box._id}`); - }); - - client.on('message', function (topic, message) { - // query the database for the box, then save the measurements - // should help with the version error - // box.constructor is the model - const msgStr = message.toString(); - - Promise.all([box.constructor.findOne({ _id: box._id }), handler.decodeMessage(msgStr, decodeOptions)]) - .then(function (results) { - const [ box, decoded ] = results; - - return box.saveMeasurementsArray(decoded); - }) - .then(function ({ ok, n }) { - if (ok === n) { - log.info(`received, decoded and saved mqtt message for box ${box._id}`); - } - }) - .catch(function (err) { - log.error(err, `error saving mqtt message for box ${box._id}`); - }); - }); - }) - .catch(function (err) { - log.error(err, `mqtt error for box ${box._id}`); - }); - } - } -}; - -const disconnect = function (box) { - if (mqttConnections[box._id]) { - mqttConnections[box._id].end(true); - mqttConnections[box._id] = undefined; - log.info(`mqtt disconnected mqtt for box ${box._id}`); - } -}; - -module.exports = { - connect: connect, - disconnect: disconnect -}; diff --git a/lib/statistics/index.js b/lib/statistics/index.js deleted file mode 100644 index f35a1d40..00000000 --- a/lib/statistics/index.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -const idwTransformer = require('./idw/idwTransformer'), - outlierTransformer = require('./outlier/outlierTransformer'); - -module.exports = { - idwTransformer, - outlierTransformer -}; diff --git a/lib/utils.js b/lib/utils.js deleted file mode 100644 index 906d7aba..00000000 --- a/lib/utils.js +++ /dev/null @@ -1,128 +0,0 @@ -'use strict'; - -const config = require('../config'), - moment = require('moment'), - request = require('request'); - -let Honeybadger = { - notify () {}, - resetContext () {} -}; - -/* eslint-disable global-require */ -if (config.honeybadger_apikey && config.honeybadger_apikey !== '') { - Honeybadger = require('honeybadger').configure({ - apiKey: config.honeybadger_apikey - }); -} -/* eslint-enable global-require */ - -/** - * define for Datetype parameters - * @apiDefine ISO8601Date A ISO8601 formatted timestamp. Will be parsed by MomentJS with enabled strict mode - */ - -// time parsing function used throughout the api -const parseTimestamp = function parseTimestamp (timestamp) { - if (timestamp instanceof Date || timestamp instanceof moment) { - return moment.utc(timestamp); - } - - // is not moment or date, should be safe to call .toString here - return moment.utc(timestamp.toString(), moment.ISO_8601, true); -}; - -const parseAndValidateTimestamp = function parseAndValidateTimestamp (timestamp) { - if (!moment.isMoment(timestamp)) { - timestamp = parseTimestamp(timestamp); - } - - if (!timestamp.isValid()) { - throw new Error(`Invalid timestamp '${timestamp.creationData().input}'.`); - } - - const nowPlusOneMinute = moment.utc().add(1, 'minutes'); - if (nowPlusOneMinute.isBefore(timestamp)) { - throw new Error(`Timestamp ${timestamp.toISOString()} is too far into the future.`); - } - - return timestamp; -}; - -// returns now as UTC moment -const utcNow = function utcNow () { - return moment.utc(); -}; - -const postToSlack = function postToSlack (text) { - if (config.slack_url) { - request.post({ url: config.slack_url, json: { text: text } }); - } -}; - -const softwareRevision = (function () { - try { - /* eslint-disable global-require */ - const parts = require('fs') - .readFileSync(`${__dirname}/../revision`) - .toString() - .split(' '); - /* eslint-enable global-require */ - parts[1] = new Date(parseInt(parts[1], 10) * 1000).toISOString(); - - return `${parts[0]} ${parts[1]} ${parts[2]}`; - } catch (err) { - return 'unknown revision'; - } -})(); - -const isJSONParseable = function isJSONParseable (value) { - if (value !== '') { - try { - JSON.parse(value); - - return true; - } catch (err) { - return false; - } - } - - return true; -}; - -const isNonEmptyString = function isNonEmptyString (val) { - return !(typeof val === 'undefined' || val === ''); -}; - -// https://stackoverflow.com/questions/18082/validate-decimal-numbers-in-javascript-isnumeric -const isNumeric = function isNumeric (n) { - return !isNaN(parseFloat(n)) && isFinite(n); -}; - -const redactEmail = function redactEmail (email) { - /* eslint-disable prefer-const */ - let [ name = '', domain = '' ] = email.split('@'); - /* eslint-enable prefer-const */ - - let [ hostname = '', tld = '' ] = domain.split('.'); - - tld = `${tld.slice(0, 1)}**`; - hostname = `${hostname.slice(0, 3)}****`; - name = `${name.slice(0, 3)}****`; - - return `${name}@${hostname}.${tld}`; -}; - -module.exports = { - config, - Honeybadger, - parseTimestamp, - isJSONParseable, - isNonEmptyString, - isNumeric, - parseAndValidateTimestamp, - utcNow, - postToSlack, - softwareRevision, - redactEmail -}; diff --git a/models/.eslintrc.js b/models/.eslintrc.js new file mode 100644 index 00000000..fb21deb8 --- /dev/null +++ b/models/.eslintrc.js @@ -0,0 +1,162 @@ +module.exports = { + 'env': { + 'es6': true, + 'node': true + }, + 'extends': 'eslint:recommended', + 'rules': { + 'indent': [ + 'error', + 2 + ], + 'linebreak-style': [ + 'error', + 'unix' + ], + 'quotes': [ + 'error', + 'single' + ], + 'semi': [ + 'error', + 'always' + ], + 'curly': [ + 'error' + ], + 'eqeqeq': [ + 'error', + 'always' + ], + 'guard-for-in': [ + 'error' + ], + 'no-multi-spaces': [ + 'error' + ], + 'strict': [ + 'error', + 'global' + ], + 'key-spacing': [ + 'error' + ], + 'keyword-spacing': [ + 'error' + ], + 'space-before-function-paren': [ + 'error', + 'always' + ], + 'space-in-parens': [ + 'error', + 'never' + ], + 'space-infix-ops': [ + 'error' + ], + 'no-console': 'error', + 'no-spaced-func': [ + 'error' + ], + 'no-whitespace-before-property': [ + 'error' + ], + 'space-before-blocks': [ + 'error' + ], + 'no-template-curly-in-string': [ + 'error' + ], + 'block-scoped-var': [ + 'error' + ], + 'complexity': [ + 'warn', + 10 + ], + 'dot-location': [ + 'error', + 'property' + ], + 'no-else-return': 'error', + 'no-floating-decimal': 'error', + 'no-implicit-coercion': 'error', + 'no-implicit-globals': 'error', + 'no-implied-eval': 'error', + 'no-lone-blocks': 'error', + 'no-loop-func': 'error', + 'no-multi-str': 'error', + 'no-new-wrappers': 'error', + 'no-new': 'error', + 'no-return-assign': 'error', + 'no-throw-literal': 'error', + 'no-unmodified-loop-condition': 'error', + 'no-useless-return': 'error', + 'radix': [ + 'error', + 'always' + ], + 'yoda': 'error', + 'callback-return': 'error', + 'global-require': 'error', + 'comma-spacing': [ + 'error', + { 'before': false, 'after': true } + ], + 'comma-style': [ + 'error', + 'last' + ], + 'computed-property-spacing': [ + 'error', + 'never' + ], + 'eol-last': [ + 'error', + 'always' + ], + 'func-call-spacing': [ + 'error', + 'never' + ], + 'func-name-matching': [ + 'error', + 'always' + ], + 'func-style': [ + 'error', + 'expression' + ], + 'linebreak-style': [ + 'error', + 'unix' + ], + 'lines-around-directive': [ + 'error' + ], + 'newline-before-return': 'error', + 'newline-per-chained-call': 'error', + 'no-lonely-if': 'error', + 'no-trailing-spaces': 'error', + 'object-curly-spacing': [ + 'error', + 'always' + ], + 'operator-assignment': [ + 'error', + 'never' + ], + 'no-confusing-arrow': 'error', + 'no-useless-computed-key': 'error', + 'no-var': 'error', + 'prefer-const': 'error', + 'prefer-template': 'error', + 'template-curly-spacing': [ + 'error', + 'never' + ], + 'no-warning-comments': 'error', + 'prefer-promise-reject-errors': 'error' + } +}; diff --git a/models/CHANGELOG.md b/models/CHANGELOG.md new file mode 100644 index 00000000..dcd26725 --- /dev/null +++ b/models/CHANGELOG.md @@ -0,0 +1,4 @@ +# @sensebox/opensensemap-api-models Changelog + +## Unreleased +- Initial Release after splitting api and models diff --git a/models/README.md b/models/README.md new file mode 100644 index 00000000..4f210a24 --- /dev/null +++ b/models/README.md @@ -0,0 +1,11 @@ +# @sensebox/opensensemap-api-models + +### `require()` openSenseMap API models + +Install it as dependency: `npm install --save @sensebox/opensensemap-api-models` or `yarn add @sensebox/opensensemap-api-models` + +This allows you to use parts like models and decoding in your own project. See `index.js`. + +## License + +[MIT](license.md) - Matthias Pfeil 2015 - 2017 diff --git a/models/index.js b/models/index.js new file mode 100644 index 00000000..dc7bdec8 --- /dev/null +++ b/models/index.js @@ -0,0 +1,19 @@ +'use strict'; + +const { model: Box } = require('./src/box/box'), + { model: Measurement } = require('./src/measurement/measurement'), + { model: Sensor } = require('./src/sensor/sensor'), + { model: User } = require('./src/user/user'), + utils = require('./src/utils'), + decoding = require('./src/measurement/decoding'), + db = require('./src/db'); + +module.exports = { + Box, + Measurement, + Sensor, + User, + utils, + decoding, + db +}; diff --git a/models/license.md b/models/license.md new file mode 100644 index 00000000..e6f68b77 --- /dev/null +++ b/models/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017 Matthias Pfeil, Gerald Pape + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/migrations/0-3_usermanagement/0-mongoshell-boxes-integrations.js b/models/migrations/0-3_usermanagement/0-mongoshell-boxes-integrations.js similarity index 100% rename from migrations/0-3_usermanagement/0-mongoshell-boxes-integrations.js rename to models/migrations/0-3_usermanagement/0-mongoshell-boxes-integrations.js diff --git a/migrations/0-3_usermanagement/1-mongoshell-users-name-createdAt-apikey.js b/models/migrations/0-3_usermanagement/1-mongoshell-users-name-createdAt-apikey.js similarity index 100% rename from migrations/0-3_usermanagement/1-mongoshell-users-name-createdAt-apikey.js rename to models/migrations/0-3_usermanagement/1-mongoshell-users-name-createdAt-apikey.js diff --git a/migrations/0-3_usermanagement/2-node-make-users-unique.js b/models/migrations/0-3_usermanagement/2-node-make-users-unique.js similarity index 99% rename from migrations/0-3_usermanagement/2-node-make-users-unique.js rename to models/migrations/0-3_usermanagement/2-node-make-users-unique.js index 68e5b04d..48c23544 100644 --- a/migrations/0-3_usermanagement/2-node-make-users-unique.js +++ b/models/migrations/0-3_usermanagement/2-node-make-users-unique.js @@ -1,3 +1,4 @@ +/* eslint-disable */ 'use strict'; const models = require('../../lib/models'), diff --git a/models/migrations/0-3_usermanagement/dev_run_migration.sh b/models/migrations/0-3_usermanagement/dev_run_migration.sh new file mode 100755 index 00000000..1b9c0a22 --- /dev/null +++ b/models/migrations/0-3_usermanagement/dev_run_migration.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -e + +export OSEM_mailer_cert=$(cat /home/gerald/code/sensebox-mailer/client_cert.pem) +export OSEM_mailer_key=$(cat /home/gerald/code/sensebox-mailer/client_key.pem) +export OSEM_mailer_ca=$(cat /home/gerald/code/sensebox-mailer/ca_cert.pem) +export OSEM_mailer_url="https://localhost:3924" +export OSEM_mailer_origin="locahost" + +node 2-node-make-users-unique.js diff --git a/migrations/3-4_normalize_boxes/3-mongoshell-normalize-boxes.js b/models/migrations/3-4_normalize_boxes/3-mongoshell-normalize-boxes.js similarity index 100% rename from migrations/3-4_normalize_boxes/3-mongoshell-normalize-boxes.js rename to models/migrations/3-4_normalize_boxes/3-mongoshell-normalize-boxes.js diff --git a/migrations/4-5_mobile_boxes/4-mongoshell-refactor-boxlocation.js b/models/migrations/4-5_mobile_boxes/4-mongoshell-refactor-boxlocation.js similarity index 100% rename from migrations/4-5_mobile_boxes/4-mongoshell-refactor-boxlocation.js rename to models/migrations/4-5_mobile_boxes/4-mongoshell-refactor-boxlocation.js diff --git a/migrations/README.md b/models/migrations/README.md similarity index 100% rename from migrations/README.md rename to models/migrations/README.md diff --git a/models/package.json b/models/package.json new file mode 100644 index 00000000..30356b53 --- /dev/null +++ b/models/package.json @@ -0,0 +1,36 @@ +{ + "name": "@sensebox/opensensemap-api-models", + "description": "openSenseMap data models and database connection", + "version": "0.0.1", + "main": "index.js", + "license": "MIT", + "dependencies": { + "@sensebox/sketch-templater": "^1.0.6", + "@turf/helpers": "^4.6.0", + "bcrypt": "^1.0.2", + "csv-stringify": "^1.0.4", + "isemail": "^3.0.0", + "jsonpath": "^0.2.12", + "jsonwebtoken": "^7.4.3", + "lodash.isequal": "^4.5.0", + "moment": "^2.18.1", + "mongoose": "^4.11.10", + "mongoose-timestamp": "^0.6", + "request": "^2.81.0", + "request-promise-native": "^1.0.4", + "simple-statistics": "^4.1.1", + "stream-transform": "^0.1.2", + "stringify-stream": "^1.0.5", + "uuid": "^3.1.0" + }, + "devDependencies": { + "eslint": "^4.6.1" + }, + "scripts": { + "lint": "./node_modules/.bin/eslint --ignore-pattern node_modules --fix index.js \"src/**/*.js\"", + "version": "node ../.scripts/npm_version-update_changelog.js && git add CHANGELOG.md" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/lib/models/box.js b/models/src/box/box.js similarity index 96% rename from lib/models/box.js rename to models/src/box/box.js index 8cdfa4ed..dfb7bc43 100644 --- a/lib/models/box.js +++ b/models/src/box/box.js @@ -1,38 +1,20 @@ 'use strict'; -/** - * @apiDefine Addons - * @apiParam {String="feinstaub"} addon specify a sensor addon for a box. - */ - -/** - * @apiDefine BoxIdParam - * @apiParam {String} senseBoxId the ID of the senseBox you are referring to. - */ - -/** - * @apiDefine ExposureFilterParam - * @apiParam {String="indoor","outdoor","mobile","unknown"} [exposure] only include boxes with this exposure. - */ - - const { mongoose } = require('../db'), timestamp = require('mongoose-timestamp'), Schema = mongoose.Schema, - { schema: sensorSchema, model: Sensor } = require('./sensor'), + { schema: sensorSchema, model: Sensor } = require('../sensor/sensor'), isEqual = require('lodash.isequal'), integrations = require('./integrations'), - sensorLayouts = require('../sensorLayouts'), - mqttClient = require('../mqtt'), - { model: Measurement } = require('./measurement'), + sensorLayouts = require('./sensorLayouts'), + { model: Measurement } = require('../measurement/measurement'), + { api_measurements_post_domain, imageFolder } = require('../config'), { - config: { api_measurements_post_domain, imageFolder }, parseTimestamp, utcNow } = require('../utils'), transform = require('stream-transform'), - log = require('../log'), - ModelError = require('./modelError'), + ModelError = require('../modelError'), Sketcher = require('@sensebox/sketch-templater'), fs = require('fs'), { point } = require('@turf/helpers'), @@ -117,7 +99,7 @@ const boxSchema = new Schema({ try { fs.writeFileSync(`${imageFolder}${filename}`, data); } catch (err) { - log.warn(err); + // log.warn(err); return; } @@ -256,14 +238,6 @@ boxSchema.statics.initNew = function ({ }; -boxSchema.statics.connectMQTTBoxes = function connectMQTTBoxes () { - this.find({ 'integrations.mqtt.enabled': true }) - .exec() - .then(function (mqttBoxes) { - mqttBoxes.forEach(mqttClient.connect); - }); -}; - boxSchema.statics.findBoxById = function findBoxById (id, { lean = true, populate = true, includeSecrets = false, onlyLastMeasurements = false, onlyLocations = false, format, projection = {} } = {}) { if (populate) { Object.assign(projection, BOX_PROPS_FOR_POPULATION); @@ -739,7 +713,6 @@ boxSchema.statics.findMeasurementsOfBoxesStream = function findMeasurementsOfBox const transformer = measurementTransformer(columns, sensors, transformations); transformer.on('error', function (err) { - log.error(err); throw err; }); diff --git a/lib/models/integrations.js b/models/src/box/integrations.js similarity index 53% rename from lib/models/integrations.js rename to models/src/box/integrations.js index 41999016..a4d1de20 100644 --- a/lib/models/integrations.js +++ b/models/src/box/integrations.js @@ -1,29 +1,10 @@ 'use strict'; const { mongoose } = require('../db'), - Schema = mongoose.Schema, - mqttClient = require('../mqtt'), utils = require('../utils'), - isJSONParseableValidation = [utils.isJSONParseable, '{PATH} is not parseable as JSON'], - log = require('../log'); + isJSONParseableValidation = [utils.isJSONParseable, '{PATH} is not parseable as JSON']; -/** - * MQTT broker integration data - * @apiDefine MqttOption Settings for a senseBox connected through MQTT - */ - -/** - * @apiDefine MqttBody - * - * @apiParam (MqttOption) {Boolean} enabled="false" enable or disable mqtt - * @apiParam (MqttOption) {String} url the url to the mqtt server. - * @apiParam (MqttOption) {String} topic the topic to subscribe to. - * @apiParam (MqttOption) {String="json","csv"} messageFormat the format the mqtt messages are in. - * @apiParam (MqttOption) {String} decodeOptions a json encoded string with options for decoding the message. 'jsonPath' for 'json' messageFormat. - * @apiParam (MqttOption) {String} connectionOptions a json encoded string with options to supply to the mqtt client (https://github.com/mqttjs/MQTT.js#client) - */ - -const mqttSchema = new Schema({ +const mqttSchema = new mongoose.Schema({ enabled: { type: Boolean, default: false, required: true }, url: { type: String, trim: true, validate: [function validMqttUri (url) { return url === '' || url.startsWith('mqtt://') || url.startsWith('ws://'); }, '{PATH} must be either empty or start with mqtt:// or ws://'] }, topic: { type: String, trim: true }, @@ -32,21 +13,7 @@ const mqttSchema = new Schema({ connectionOptions: { type: String, trim: true, validate: isJSONParseableValidation } }, { _id: false }); -/** - * thethingsnetwork.org integration data - * @apiDefine TTNOption Settings for a senseBox connected through thethingsnetwork.org (TTN) - */ - -/** - * @apiDefine TTNBody - * - * @apiParam (TTNOption) {String} dev_id The device ID recieved from TTN - * @apiParam (TTNOption) {String} app_id The application ID recieved from TTN - * @apiParam (TTNOption) {String="lora-serialization","sensebox/home","json","debug"} profile A decoding profile matching the payload format. For details and configuration see https://github.com/sensebox/ttn-osem-integration#decoding-profiles - * @apiParam (TTNOption) {Array} [decodeOptions] A JSON Array containing decoder configuration, needed for some profiles. - * @apiParam (TTNOption) {Number} [port] The TTN port to listen for messages. Optional, if not provided, all ports are used. - */ -const ttnSchema = new Schema({ +const ttnSchema = new mongoose.Schema({ dev_id: { type: String, trim: true, required: true }, app_id: { type: String, trim: true, required: true }, port: { type: Number, min: 0 }, @@ -54,7 +21,7 @@ const ttnSchema = new Schema({ decodeOptions: [{}] }, { _id: false }); -const integrationSchema = new Schema({ +const integrationSchema = new mongoose.Schema({ mqtt: { type: mqttSchema, required: false, @@ -105,24 +72,25 @@ const addIntegrationsToSchema = function addIntegrationsToSchema (schema) { next(); }); - // reconnect when mqtt option change was flagged - schema.post('save', function integrationsPostSave (box) { - if (box._mqttChanged === true && box.integrations.mqtt) { - if (box.integrations.mqtt.enabled === true) { - log.info('mqtt credentials changed, reconnecting'); - mqttClient.connect(box); - } else if (box.integrations.mqtt.enabled === false) { - mqttClient.disconnect(box); - } - } - box._mqttChanged = undefined; - }); + // TODO + // // reconnect when mqtt option change was flagged + // schema.post('save', function integrationsPostSave (box) { + // if (box._mqttChanged === true && box.integrations.mqtt) { + // if (box.integrations.mqtt.enabled === true) { + // // log.info('mqtt credentials changed, reconnecting'); + // mqttClient.connect(box); + // } else if (box.integrations.mqtt.enabled === false) { + // mqttClient.disconnect(box); + // } + // } + // box._mqttChanged = undefined; + // }); - // disconnect mqtt on removal - schema.pre('remove', function integrationsPostRemove (next) { - mqttClient.disconnect(this); - next(); - }); + // // disconnect mqtt on removal + // schema.pre('remove', function integrationsPostRemove (next) { + // mqttClient.disconnect(this); + // next(); + // }); }; module.exports = { diff --git a/lib/sensorLayouts/addons/feinstaubAddon.js b/models/src/box/sensorLayouts/addons/feinstaubAddon.js similarity index 100% rename from lib/sensorLayouts/addons/feinstaubAddon.js rename to models/src/box/sensorLayouts/addons/feinstaubAddon.js diff --git a/lib/sensorLayouts/index.js b/models/src/box/sensorLayouts/index.js similarity index 100% rename from lib/sensorLayouts/index.js rename to models/src/box/sensorLayouts/index.js diff --git a/lib/sensorLayouts/luftdaten/sds011.bme280.js b/models/src/box/sensorLayouts/luftdaten/sds011.bme280.js similarity index 100% rename from lib/sensorLayouts/luftdaten/sds011.bme280.js rename to models/src/box/sensorLayouts/luftdaten/sds011.bme280.js diff --git a/lib/sensorLayouts/luftdaten/sds011.bmp180.js b/models/src/box/sensorLayouts/luftdaten/sds011.bmp180.js similarity index 100% rename from lib/sensorLayouts/luftdaten/sds011.bmp180.js rename to models/src/box/sensorLayouts/luftdaten/sds011.bmp180.js diff --git a/lib/sensorLayouts/luftdaten/sds011.dht11.js b/models/src/box/sensorLayouts/luftdaten/sds011.dht11.js similarity index 100% rename from lib/sensorLayouts/luftdaten/sds011.dht11.js rename to models/src/box/sensorLayouts/luftdaten/sds011.dht11.js diff --git a/lib/sensorLayouts/luftdaten/sds011.dht22.js b/models/src/box/sensorLayouts/luftdaten/sds011.dht22.js similarity index 100% rename from lib/sensorLayouts/luftdaten/sds011.dht22.js rename to models/src/box/sensorLayouts/luftdaten/sds011.dht22.js diff --git a/lib/sensorLayouts/luftdaten/sds011.js b/models/src/box/sensorLayouts/luftdaten/sds011.js similarity index 100% rename from lib/sensorLayouts/luftdaten/sds011.js rename to models/src/box/sensorLayouts/luftdaten/sds011.js diff --git a/lib/sensorLayouts/sensebox.home.feinstaub.js b/models/src/box/sensorLayouts/sensebox.home.feinstaub.js similarity index 100% rename from lib/sensorLayouts/sensebox.home.feinstaub.js rename to models/src/box/sensorLayouts/sensebox.home.feinstaub.js diff --git a/lib/sensorLayouts/sensebox.home.js b/models/src/box/sensorLayouts/sensebox.home.js similarity index 100% rename from lib/sensorLayouts/sensebox.home.js rename to models/src/box/sensorLayouts/sensebox.home.js diff --git a/lib/sensorLayouts/sensorDefinitions/bme280_humidity.js b/models/src/box/sensorLayouts/sensorDefinitions/bme280_humidity.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/bme280_humidity.js rename to models/src/box/sensorLayouts/sensorDefinitions/bme280_humidity.js diff --git a/lib/sensorLayouts/sensorDefinitions/bme280_pressure_hpa.js b/models/src/box/sensorLayouts/sensorDefinitions/bme280_pressure_hpa.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/bme280_pressure_hpa.js rename to models/src/box/sensorLayouts/sensorDefinitions/bme280_pressure_hpa.js diff --git a/lib/sensorLayouts/sensorDefinitions/bme280_pressure_pa.js b/models/src/box/sensorLayouts/sensorDefinitions/bme280_pressure_pa.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/bme280_pressure_pa.js rename to models/src/box/sensorLayouts/sensorDefinitions/bme280_pressure_pa.js diff --git a/lib/sensorLayouts/sensorDefinitions/bme280_temperature.js b/models/src/box/sensorLayouts/sensorDefinitions/bme280_temperature.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/bme280_temperature.js rename to models/src/box/sensorLayouts/sensorDefinitions/bme280_temperature.js diff --git a/lib/sensorLayouts/sensorDefinitions/bmp180_pressure_hpa.js b/models/src/box/sensorLayouts/sensorDefinitions/bmp180_pressure_hpa.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/bmp180_pressure_hpa.js rename to models/src/box/sensorLayouts/sensorDefinitions/bmp180_pressure_hpa.js diff --git a/lib/sensorLayouts/sensorDefinitions/bmp180_pressure_pa.js b/models/src/box/sensorLayouts/sensorDefinitions/bmp180_pressure_pa.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/bmp180_pressure_pa.js rename to models/src/box/sensorLayouts/sensorDefinitions/bmp180_pressure_pa.js diff --git a/lib/sensorLayouts/sensorDefinitions/bmp180_temperature.js b/models/src/box/sensorLayouts/sensorDefinitions/bmp180_temperature.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/bmp180_temperature.js rename to models/src/box/sensorLayouts/sensorDefinitions/bmp180_temperature.js diff --git a/lib/sensorLayouts/sensorDefinitions/bmp280_pressure.js b/models/src/box/sensorLayouts/sensorDefinitions/bmp280_pressure.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/bmp280_pressure.js rename to models/src/box/sensorLayouts/sensorDefinitions/bmp280_pressure.js diff --git a/lib/sensorLayouts/sensorDefinitions/dht11_humidity.js b/models/src/box/sensorLayouts/sensorDefinitions/dht11_humidity.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/dht11_humidity.js rename to models/src/box/sensorLayouts/sensorDefinitions/dht11_humidity.js diff --git a/lib/sensorLayouts/sensorDefinitions/dht11_temperature.js b/models/src/box/sensorLayouts/sensorDefinitions/dht11_temperature.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/dht11_temperature.js rename to models/src/box/sensorLayouts/sensorDefinitions/dht11_temperature.js diff --git a/lib/sensorLayouts/sensorDefinitions/dht22_humidity.js b/models/src/box/sensorLayouts/sensorDefinitions/dht22_humidity.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/dht22_humidity.js rename to models/src/box/sensorLayouts/sensorDefinitions/dht22_humidity.js diff --git a/lib/sensorLayouts/sensorDefinitions/dht22_temperature.js b/models/src/box/sensorLayouts/sensorDefinitions/dht22_temperature.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/dht22_temperature.js rename to models/src/box/sensorLayouts/sensorDefinitions/dht22_temperature.js diff --git a/lib/sensorLayouts/sensorDefinitions/hdc1008_humidity.js b/models/src/box/sensorLayouts/sensorDefinitions/hdc1008_humidity.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/hdc1008_humidity.js rename to models/src/box/sensorLayouts/sensorDefinitions/hdc1008_humidity.js diff --git a/lib/sensorLayouts/sensorDefinitions/hdc1008_temperature.js b/models/src/box/sensorLayouts/sensorDefinitions/hdc1008_temperature.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/hdc1008_temperature.js rename to models/src/box/sensorLayouts/sensorDefinitions/hdc1008_temperature.js diff --git a/lib/sensorLayouts/sensorDefinitions/index.js b/models/src/box/sensorLayouts/sensorDefinitions/index.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/index.js rename to models/src/box/sensorLayouts/sensorDefinitions/index.js diff --git a/lib/sensorLayouts/sensorDefinitions/sds011_pm10.js b/models/src/box/sensorLayouts/sensorDefinitions/sds011_pm10.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/sds011_pm10.js rename to models/src/box/sensorLayouts/sensorDefinitions/sds011_pm10.js diff --git a/lib/sensorLayouts/sensorDefinitions/sds011_pm25.js b/models/src/box/sensorLayouts/sensorDefinitions/sds011_pm25.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/sds011_pm25.js rename to models/src/box/sensorLayouts/sensorDefinitions/sds011_pm25.js diff --git a/lib/sensorLayouts/sensorDefinitions/tsl45315_lightintensity.js b/models/src/box/sensorLayouts/sensorDefinitions/tsl45315_lightintensity.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/tsl45315_lightintensity.js rename to models/src/box/sensorLayouts/sensorDefinitions/tsl45315_lightintensity.js diff --git a/lib/sensorLayouts/sensorDefinitions/veml6070_uvintensity.js b/models/src/box/sensorLayouts/sensorDefinitions/veml6070_uvintensity.js similarity index 100% rename from lib/sensorLayouts/sensorDefinitions/veml6070_uvintensity.js rename to models/src/box/sensorLayouts/sensorDefinitions/veml6070_uvintensity.js diff --git a/config/index.js b/models/src/config.js similarity index 77% rename from config/index.js rename to models/src/config.js index 3cec9e22..9434d39a 100644 --- a/config/index.js +++ b/models/src/config.js @@ -9,7 +9,6 @@ const isProdEnv = function isProdEnv () { // Example: `OSEM_targetfolder` will override the setting for `targetFolder` const config = { imageFolder: './userimages/', // absolute location of user images - logFolder: './logs/', // absolute location of error log files // database configuration, will be concatenated to a mongo db connection string dbhost: 'localhost', @@ -19,29 +18,14 @@ const config = { dbauthsource: 'OSeM-api', dbdb: 'OSeM-api', - api_base_domain: 'localhost', // the naked api domain. For example api.opensensemap.org - api_protocol: (isProdEnv() ? 'https' : 'http'), - api_url: '', // generated if not set from api_protocol and api_base_domain api_measurements_post_domain: '', //just the naked ingress domain. For example ingress.opensensemap.org - port: 8000, // port the api will bind to - - // configuration for routes - basePath: '/boxes', // boxes and measurements methods - userPath: '/users', // user methods - statisticsPath: '/statistics', //statistics methods - mailer_url: '', // leave empty to not send emails. For example: https://mailer:3924/ mailer_cert: '', mailer_key: '', mailer_ca: '', mailer_origin: '', // set to the address where your frontend runs. for example: https://opensensemap.org - slack_url: '', // for slack integration - - honeybadger_apikey: '', - - // TODO: add config key to osem-compose jwt_secret: 'OH GOD THIS IS SO INSECURE PLS CHANGE ME', // should be at least 32 characters jwt_algorithm: 'HS256', jwt_validity_ms: 3600000, // 1 hour @@ -77,9 +61,6 @@ if (env_has_dbconnectionstring === false) { } // set composite config keys -if (config.api_url === '') { - config.api_url = `${config.api_protocol}://${config.api_base_domain}`; -} if (config.jwt_issuer === '') { config.jwt_issuer = `${config.api_protocol}://${config.api_base_domain}`; } diff --git a/lib/db.js b/models/src/db.js similarity index 76% rename from lib/db.js rename to models/src/db.js index a75332cb..d318fa0c 100644 --- a/lib/db.js +++ b/models/src/db.js @@ -1,7 +1,7 @@ 'use strict'; -const { config, Honeybadger } = require('./utils'), - log = require('./log'); +/* eslint-disable no-console */ +const config = require('./config'); // Bring Mongoose into the app const mongoose = require('mongoose'); @@ -26,7 +26,7 @@ const connect = function connect (connectionString) { } mongoose.connection.on('connecting', function () { - log.info('trying to connect to MongoDB...'); + console.info('trying to connect to MongoDB...'); }); // Create the database connection @@ -42,28 +42,28 @@ const connect = function connect (connectionString) { // If the connection throws an error mongoose.connection.on('error', function (err) { - log.fatal(err, 'Mongoose connection error'); - Honeybadger.notify(err); + console.error(err, 'Mongoose connection error'); + throw err; }); // When the connection is disconnected mongoose.connection.on('disconnected', function () { - log.warn('Mongoose connection disconnected. Retrying with mongo AutoReconnect.'); + console.warn('Mongoose connection disconnected. Retrying with mongo AutoReconnect.'); }); // When the connection is resconnected mongoose.connection.on('reconnected', function () { - log.info('Mongoose connection reconnected.'); + console.info('Mongoose connection reconnected.'); }); - log.info('Successfully connected to MongoDB.'); + console.info('Successfully connected to MongoDB.'); return resolve(); }) .catch(function (err) { // only called if the initial mongoose.connect fails on first connect if (err.message.startsWith('failed to connect to server')) { - log.info(`Error ${err.message} - retrying manually in 1 second.`); + console.info(`Error ${err.message} - retrying manually in 1 second.`); mongoose.connection.removeAllListeners(); return new Promise(function () { @@ -77,6 +77,7 @@ const connect = function connect (connectionString) { }); }); }; +/* eslint-enable no-console */ module.exports = { connect, diff --git a/lib/decoding/bytesHandler.js b/models/src/measurement/decoding/bytesHandler.js similarity index 93% rename from lib/decoding/bytesHandler.js rename to models/src/measurement/decoding/bytesHandler.js index e60af3b0..35b15ff9 100644 --- a/lib/decoding/bytesHandler.js +++ b/models/src/measurement/decoding/bytesHandler.js @@ -54,7 +54,12 @@ const messageToBytes = function messageToBytes (bytes, len) { module.exports = { bytesHandler: { decodeMessage (message) { - const bytes = messageToBytes(message, DATA_LENGTH_NO_TIMESTAMP); + let bytes; + try { + bytes = messageToBytes(message, DATA_LENGTH_NO_TIMESTAMP); + } catch (err) { + return Promise.reject(err); + } const measurements = []; diff --git a/lib/decoding/csvHandler.js b/models/src/measurement/decoding/csvHandler.js similarity index 94% rename from lib/decoding/csvHandler.js rename to models/src/measurement/decoding/csvHandler.js index b6c4e127..2ff9333f 100644 --- a/lib/decoding/csvHandler.js +++ b/models/src/measurement/decoding/csvHandler.js @@ -38,7 +38,7 @@ module.exports = { } measurementsArray.push(measurement); } else { - throw new Error(`illegal line '${line.join(',')}'`); + return Promise.reject(new Error(`illegal line '${line.join(',')}'`)); } } } diff --git a/lib/decoding/index.js b/models/src/measurement/decoding/index.js similarity index 83% rename from lib/decoding/index.js rename to models/src/measurement/decoding/index.js index 1b96607a..907110c5 100644 --- a/lib/decoding/index.js +++ b/models/src/measurement/decoding/index.js @@ -5,7 +5,7 @@ const jsonHandler = require('./jsonHandler'), csvHandler = require('./csvHandler'), luftdatenHandler = require('./luftdatenHandler'), { bytesHandler, bytesTimestampHandler } = require('./bytesHandler'), - { transformAndValidateMeasurements } = require('./validators'); + validators = require('./validators'); module.exports = { 'json': jsonHandler, @@ -19,5 +19,5 @@ module.exports = { 'application/sbx-bytes-ts': bytesTimestampHandler, 'sbx-bytes': bytesHandler, 'sbx-bytes-ts': bytesTimestampHandler, - 'transformAndValidateArray': transformAndValidateMeasurements, + validators }; diff --git a/lib/decoding/jsonHandler.js b/models/src/measurement/decoding/jsonHandler.js similarity index 87% rename from lib/decoding/jsonHandler.js rename to models/src/measurement/decoding/jsonHandler.js index 8ee267f6..679051b8 100644 --- a/lib/decoding/jsonHandler.js +++ b/models/src/measurement/decoding/jsonHandler.js @@ -1,8 +1,7 @@ 'use strict'; -const jsonPath = require('jsonpath'), - { transformAndValidateMeasurements } = require('./validators'), - log = require('../log'); +const jsonPathModule = require('jsonpath'), + { transformAndValidateMeasurements } = require('./validators'); /** * this decode takes either an object like @@ -69,7 +68,7 @@ const handleJSONObjectMultipleValues = function (obj) { module.exports = { - decodeMessage: function (message, options) { + decodeMessage: function (message, { jsonPath }) { if (message) { // try to decode the json, or if already a js object // use it as given @@ -80,8 +79,6 @@ module.exports = { try { json = JSON.parse(message); } catch (err) { - log.error(err); - return Promise.reject(err); } } @@ -89,16 +86,20 @@ module.exports = { if (typeof json !== 'undefined') { // use the root '$' if no jsonPath was specified let path = '$'; - if (options && options.jsonPath) { - path = options.jsonPath; + if (jsonPath) { + path = jsonPath; } // extract the json with jsonPath - const result = jsonPath.query(json, path, 1); + const result = jsonPathModule.query(json, path, 1); if (result && result[0]) { let decodedJson = result[0]; if (!Array.isArray(decodedJson)) { - decodedJson = handleJSONObjectMultipleValues(decodedJson); + try { + decodedJson = handleJSONObjectMultipleValues(decodedJson); + } catch (err) { + return Promise.reject(err); + } } return transformAndValidateMeasurements(decodedJson); diff --git a/lib/decoding/luftdatenHandler.js b/models/src/measurement/decoding/luftdatenHandler.js similarity index 98% rename from lib/decoding/luftdatenHandler.js rename to models/src/measurement/decoding/luftdatenHandler.js index 98e01cba..4b71f5c5 100644 --- a/lib/decoding/luftdatenHandler.js +++ b/models/src/measurement/decoding/luftdatenHandler.js @@ -1,7 +1,6 @@ 'use strict'; -const { transformAndValidateMeasurements } = require('./validators'), - log = require('../log'); +const { transformAndValidateMeasurements } = require('./validators'); /** * Transforms JSON produced by Luftdaten.info devices to openSenseMap compatible JSON. @@ -123,8 +122,6 @@ module.exports = { try { json = JSON.parse(message); } catch (err) { - log.error(err); - return Promise.reject(err); } } diff --git a/models/src/measurement/decoding/plainHandler.js b/models/src/measurement/decoding/plainHandler.js new file mode 100644 index 00000000..ae15ad4c --- /dev/null +++ b/models/src/measurement/decoding/plainHandler.js @@ -0,0 +1,13 @@ +'use strict'; + +// this handler is only for debugging.. + +module.exports = { + decodeMessage: function (message) { + /* eslint-disable no-console */ + console.log(message); + /* eslint-enable no-console */ + + return Promise.resolve(message); + } +}; diff --git a/lib/decoding/validators.js b/models/src/measurement/decoding/validators.js similarity index 97% rename from lib/decoding/validators.js rename to models/src/measurement/decoding/validators.js index 10f8035b..875a5c44 100644 --- a/lib/decoding/validators.js +++ b/models/src/measurement/decoding/validators.js @@ -1,7 +1,7 @@ 'use strict'; -const { parseAndValidateTimestamp, isNonEmptyString, isNumeric, utcNow } = require('../utils'), - { mongoose } = require('../db'); +const { parseAndValidateTimestamp, isNonEmptyString, isNumeric, utcNow } = require('../../utils'), + { mongoose } = require('../../db'); const isNumber = function isNumber (n) { return !isNaN(parseFloat(n)) && isFinite(n); diff --git a/lib/models/measurement.js b/models/src/measurement/measurement.js similarity index 92% rename from lib/models/measurement.js rename to models/src/measurement/measurement.js index 903eb69b..4f84b316 100644 --- a/lib/models/measurement.js +++ b/models/src/measurement/measurement.js @@ -1,22 +1,21 @@ 'use strict'; const { mongoose } = require('../db'), - Schema = mongoose.Schema, moment = require('moment'), - decodeHandlers = require('../decoding'), - ModelError = require('./modelError'), + decodeHandlers = require('./decoding'), + ModelError = require('../modelError'), csvstringify = require('csv-stringify'), streamTransform = require('stream-transform'), jsonstringify = require('stringify-stream'), - { outlierTransformer } = require('../statistics'); + outlierTransformer = require('./outlier/outlierTransformer'); -const measurementSchema = new Schema({ +const measurementSchema = new mongoose.Schema({ value: { type: String, required: true }, sensor_id: { - type: Schema.Types.ObjectId, + type: mongoose.Schema.Types.ObjectId, ref: 'Sensor', required: true }, @@ -65,8 +64,8 @@ measurementSchema.statics.findLastMeasurementOfSensor = function findLastMeasure }); }; -measurementSchema.statics.decodeMeasurements = function decodeMeasurements (measurements, { contentType = 'json', sensors }) { - return decodeHandlers[contentType].decodeMessage(measurements, { sensors }) +measurementSchema.statics.decodeMeasurements = function decodeMeasurements (measurements, contentType = 'json', decodeOptions = {}) { + return decodeHandlers[contentType].decodeMessage(measurements, decodeOptions) .catch(function (err) { throw new ModelError(err.message, { type: 'UnprocessableEntityError' }); }); diff --git a/lib/statistics/outlier/outlierTransformer.js b/models/src/measurement/outlier/outlierTransformer.js similarity index 79% rename from lib/statistics/outlier/outlierTransformer.js rename to models/src/measurement/outlier/outlierTransformer.js index beb73981..69655d09 100644 --- a/lib/statistics/outlier/outlierTransformer.js +++ b/models/src/measurement/outlier/outlierTransformer.js @@ -1,15 +1,8 @@ 'use strict'; -const ss = require('simple-statistics'); -const Transform = require('stream').Transform, - inherits = require('util').inherits; - -/** - * @apiDefine OutlierParameters - * - * @apiParam {String="replace","mark"} [outliers] Specifying this parameter enables outlier calculation which adds a new field called `isOutlier` to the data. Possible values are "mark" and "replace". - * @apiParam {Number=1-50} [outlier-window=15] Size of moving window used as base to calculate the outliers. - */ +const ss = require('simple-statistics'), + { Transform } = require('stream'), + { inherits } = require('util'); const outlier = function (outlierOptions, streamOptions) { if (!(this instanceof outlier)) { diff --git a/lib/models/modelError.js b/models/src/modelError.js similarity index 100% rename from lib/models/modelError.js rename to models/src/modelError.js diff --git a/lib/models/sensor.js b/models/src/sensor/sensor.js similarity index 55% rename from lib/models/sensor.js rename to models/src/sensor/sensor.js index adfbb8bf..847d2b22 100644 --- a/lib/models/sensor.js +++ b/models/src/sensor/sensor.js @@ -1,31 +1,9 @@ 'use strict'; -/** - * define for a senseBox Sensor - * @apiDefine Sensor A single sensor for the nested Sensor parameter - */ - -/** - * @apiDefine SensorBody - * - * @apiParam (Sensor) {String} title the title of the phenomenon the sensor observes. - * @apiParam (Sensor) {String} unit the unit of the phenomenon the sensor observes. - * @apiParam (Sensor) {String} sensorType the type of the sensor. - * @apiParam (Sensor) {String} [icon] the visual representation for the openSenseMap of this sensor. - * - */ - -/** - * @apiDefine SensorIdParam - * - * @apiParam {String} sensorId the ID of the sensor you are referring to. - */ - -const { mongoose } = require('../db'), - Schema = mongoose.Schema; +const { mongoose } = require('../db'); //Sensor schema -const sensorSchema = new Schema({ +const sensorSchema = new mongoose.Schema({ title: { type: String, required: true, @@ -47,7 +25,7 @@ const sensorSchema = new Schema({ trim: true }, lastMeasurement: { - type: Schema.Types.ObjectId, + type: mongoose.Schema.Types.ObjectId, ref: 'Measurement' } }); diff --git a/lib/helpers/jwtRefreshTokenHasher.js b/models/src/user/jwtRefreshTokenHasher.js similarity index 77% rename from lib/helpers/jwtRefreshTokenHasher.js rename to models/src/user/jwtRefreshTokenHasher.js index 26db5af1..ec2f9b61 100644 --- a/lib/helpers/jwtRefreshTokenHasher.js +++ b/models/src/user/jwtRefreshTokenHasher.js @@ -1,9 +1,7 @@ 'use strict'; const crypto = require('crypto'), - config = require('../utils').config; - -const { refresh_token_algorithm, refresh_token_secret } = config; + { refresh_token_algorithm, refresh_token_secret } = require('../config'); const hashJWT = function hashJWT (jwtString) { if (typeof jwtString !== 'string') { diff --git a/lib/mails.js b/models/src/user/mails.js similarity index 90% rename from lib/mails.js rename to models/src/user/mails.js index d8849862..e1df171e 100644 --- a/lib/mails.js +++ b/models/src/user/mails.js @@ -1,7 +1,6 @@ 'use strict'; -const { config, Honeybadger } = require('./utils'), - log = require('./log'); +const config = require('../config'); const noMailerConfiguredFunc = function () { @@ -113,22 +112,19 @@ if (config.mailer_url && config.mailer_url.trim() !== '') { json: payload }) .then((response) => { - log.info(`successfully sent mails: ${JSON.stringify(response)}`); + // log.info(`successfully sent mails: ${JSON.stringify(response)}`); return response; }) .catch((err) => { - log.error('Mailer', err.message); - Honeybadger.notify(err); - - return err; + throw err; }); }; module.exports = { sendMail (template, user, data) { if (!(template in mailTemplates)) { - return Promise.reject(`template ${template} not implemented`); + return Promise.reject(new Error(`template ${template} not implemented`)); } const { payload = {}, attachment, recipient = { address: user.email, name: user.name } } = mailTemplates[template](user, data); diff --git a/lib/helpers/tokenBlacklist.js b/models/src/user/tokenBlacklist.js similarity index 100% rename from lib/helpers/tokenBlacklist.js rename to models/src/user/tokenBlacklist.js diff --git a/lib/models/user.js b/models/src/user/user.js similarity index 86% rename from lib/models/user.js rename to models/src/user/user.js index e42d6f5a..52c2c59c 100644 --- a/lib/models/user.js +++ b/models/src/user/user.js @@ -8,44 +8,19 @@ * */ -/** - * define for nested user parameter for box creation request - * @apiDefine User Parameters for creating a new openSenseMap user - */ - -/** - * @apiDefine UserBody - * - * @apiParam (User) {String} name the full name or nickname of the user. The name must consist of at least 3 and up to 40 characters and only allows to use alphanumerics (a-zA-Z0-9), dots (.), dashes (-), underscores (_) and spaces. The first character must be a letter or number. - * @apiParam (User) {String} email the email for the user. Is used for signing in and for sending the arduino sketch. - * @apiParam (User) {String} password the desired password for the user. Must be at least 8 characters long. - * @apiParam (User) {String} [language=en_US] the language of the user. Used for the website and mails - * - */ - -/** - * @apiDefine JWTokenAuth - * - * @apiHeader {String} Authorization allows to send a valid JSON Web Token along with this request with `Bearer` prefix. - * @apiHeaderExample {String} Authorization Header Example - * Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0ODMwMDYxNTIsImV4cCI6MTQ4MzAwOTc1MiwiaXNzIjoibG9jYWxob3N0OjgwMDAiLCJzdWIiOiJ0ZXN0QHRlc3QuZGUiLCJqdGkiOiJmMjNiOThkNi1mMjRlLTRjOTQtYWE5Ni1kMWI4M2MzNmY1MjAifQ.QegeWHWetw19vfgOvkTCsBfaSOPnjakhzzRjVtNi-2Q - * @apiError {String} 403 Unauthorized - */ - const { mongoose } = require('../db'), - Schema = mongoose.Schema, bcrypt = require('bcrypt'), crypto = require('crypto'), - { config: { jwt_algorithm, jwt_secret, jwt_issuer, password_min_length, password_salt_factor, jwt_validity_ms, refresh_token_validity_ms }, Honeybadger, postToSlack, redactEmail } = require('../utils'), + { jwt_algorithm, jwt_secret, jwt_issuer, password_min_length, password_salt_factor, jwt_validity_ms, refresh_token_validity_ms } = require('../config'), uuid = require('uuid'), jwt = require('jsonwebtoken'), - Box = require('./box').model, - mails = require('../mails'), + { model: Box } = require('../box/box'), + mails = require('./mails'), moment = require('moment'), - hashJWT = require('../helpers/jwtRefreshTokenHasher'), - tokenBlacklist = require('../helpers/tokenBlacklist'), + hashJWT = require('./jwtRefreshTokenHasher'), + tokenBlacklist = require('./tokenBlacklist'), timestamp = require('mongoose-timestamp'), - ModelError = require('./modelError'), + ModelError = require('../modelError'), isemail = require('isemail'); const userNameRequirementsText = 'Parameter name must consist of at least 3 and up to 40 alphanumerics (a-zA-Z0-9), dot (.), dash (-), underscore (_) and spaces.', @@ -53,7 +28,7 @@ const userNameRequirementsText = 'Parameter name must consist of at least 3 and const nameValidRegex = /^[^~`!@#$%^&*()+=£€{}[\]|\\:;"'<>,?/\n\r\t\s][^~`!@#$%^&*()+=£€{}[\]|\\:;"'<>,?/\n\r\t]{1,39}[^~`!@#$%^&*()+=£€{}[\]|\\:;"'<>,?/\n\r\t\s]$/; -const userSchema = new Schema({ +const userSchema = new mongoose.Schema({ name: { type: String, required: true, @@ -218,7 +193,8 @@ userSchema.pre('save', function userPreSave (next) { userSchema.post('save', function userPostSaveSendMails (user) { if (user.wasNew) { user.mail('newUser'); - postToSlack(`New User: ${user.name} (${redactEmail(user.email)})`); + // TODO + //postToSlack(`New User: ${user.name} (${redactEmail(user.email)})`); return; } @@ -325,7 +301,7 @@ userSchema.methods.signOut = function signOut (req) { // generates new JWT and refreshToken. Just don't send to the user this.createToken() .catch(function (err) { - Honeybadger.notify(err); + throw err; }); tokenBlacklist.addTokenToBlacklist(req._jwt, req._jwtString); @@ -347,6 +323,11 @@ userSchema.statics.refreshJwt = function refreshJwt (refreshToken) { }); }); }; + +userSchema.statics.isTokenBlacklisted = function isTokenBlacklisted (jwt, jwtString) { + return tokenBlacklist.isTokenBlacklisted(jwt, jwtString); +}; + // ---- End JWT Stuff ---- userSchema.methods.addBox = function addBox (params) { @@ -366,7 +347,8 @@ userSchema.methods.addBox = function addBox (params) { mailTemplate = 'newBoxLuftdaten'; } - postToSlack(`New Box: ${user.name} (${redactEmail(user.email)}) just registered "${savedBox.name}" (${savedBox.model}): `); + // TODO + // postToSlack(`New Box: ${user.name} (${redactEmail(user.email)}) just registered "${savedBox.name}" (${savedBox.model}): `); user.mail(mailTemplate, savedBox); return savedBox; @@ -398,19 +380,20 @@ userSchema.methods.removeBox = function removeBox (boxId) { .exec() .then(function (box) { if (!box) { - return Promise.reject('coudn\'t remove, senseBox not found'); + return Promise.reject(new ModelError('coudn\'t remove, senseBox not found', { type: 'NotFoundError' })); } // remove box and measurements box.removeSelfAndMeasurements() .catch(function (err) { - Honeybadger.notify(err); + throw err; }); // remove from boxes user.boxes.pull({ _id: boxId }); - postToSlack(`Box deleted: ${user.name} (${redactEmail(user.email)}) just deleted "${box.name}" (${box.model})`); + // TODO + // postToSlack(`Box deleted: ${user.name} (${redactEmail(user.email)}) just deleted "${box.name}" (${box.model})`); return user.save(); }); @@ -426,7 +409,8 @@ userSchema.methods.destroyUser = function destroyUser (req) { .execPopulate() .then(function (userWithBoxes) { userWithBoxes.mail('deleteUser'); - postToSlack(`User deleted: ${user.name} (${redactEmail(user.email)})`); + // TODO + // postToSlack(`User deleted: ${user.name} (${redactEmail(user.email)})`); // delete the boxes.. for (const box of userWithBoxes.boxes) { box.removeSelfAndMeasurements(); @@ -510,7 +494,7 @@ userSchema.methods.updateUser = function updateUser ({ email, language, name, cu // at this point its also clear the new password conforms to the password rules if (newPassword && newPassword !== '') { user.set('password', newPassword); - msgs.push(' Password changed. Please log in with your new password'); + msgs.push(' Password changed. Please sign in with your new password'); signOut = true; somethingsChanged = true; } diff --git a/models/src/utils.js b/models/src/utils.js new file mode 100644 index 00000000..f7cebbcc --- /dev/null +++ b/models/src/utils.js @@ -0,0 +1,67 @@ +'use strict'; + +const moment = require('moment'); + +// time parsing function used throughout the api +const parseTimestamp = function parseTimestamp (timestamp) { + if (timestamp instanceof Date || timestamp instanceof moment) { + return moment.utc(timestamp); + } + + // is not moment or date, should be safe to call .toString here + return moment.utc(timestamp.toString(), moment.ISO_8601, true); +}; + +const parseAndValidateTimestamp = function parseAndValidateTimestamp (timestamp) { + if (!moment.isMoment(timestamp)) { + timestamp = parseTimestamp(timestamp); + } + + if (!timestamp.isValid()) { + throw new Error(`Invalid timestamp '${timestamp.creationData().input}'.`); + } + + const nowPlusOneMinute = moment.utc().add(1, 'minutes'); + if (nowPlusOneMinute.isBefore(timestamp)) { + throw new Error(`Timestamp ${timestamp.toISOString()} is too far into the future.`); + } + + return timestamp; +}; + +// returns now as UTC moment +const utcNow = function utcNow () { + return moment.utc(); +}; + +const isJSONParseable = function isJSONParseable (value) { + if (value !== '') { + try { + JSON.parse(value); + + return true; + } catch (err) { + return false; + } + } + + return true; +}; + +const isNonEmptyString = function isNonEmptyString (val) { + return !(typeof val === 'undefined' || val === ''); +}; + +// https://stackoverflow.com/questions/18082/validate-decimal-numbers-in-javascript-isnumeric +const isNumeric = function isNumeric (n) { + return !isNaN(parseFloat(n)) && isFinite(n); +}; + +module.exports = { + parseTimestamp, + isJSONParseable, + isNonEmptyString, + isNumeric, + parseAndValidateTimestamp, + utcNow +}; diff --git a/models/yarn.lock b/models/yarn.lock new file mode 100644 index 00000000..412a0d7c --- /dev/null +++ b/models/yarn.lock @@ -0,0 +1,1652 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@sensebox/sketch-templater@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@sensebox/sketch-templater/-/sketch-templater-1.0.6.tgz#8aa4a0cda28b5a8ed6ebcd4953a81d042a0c70be" + dependencies: + dedent "^0.7.0" + +"@turf/helpers@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-4.6.0.tgz#12398733b8ae28420df6166fa44c7ee8ffd6414c" + +JSONSelect@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/JSONSelect/-/JSONSelect-0.4.0.tgz#a08edcc67eb3fcbe99ed630855344a0cf282bb8d" + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +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: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" + +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, ajv@^4.9.1: + 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.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.0" + json-stable-stringify "^1.0.1" + +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" + +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" + +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +aproba@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +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" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +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@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" + dependencies: + lodash "^4.14.0" + +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" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.22.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" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +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" + +bcrypt@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-1.0.3.tgz#b02ddc6c0b52ea16b8d3cf375d5a32e780dab548" + dependencies: + nan "2.6.2" + node-pre-gyp "0.6.36" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@2.10.2: + version "2.10.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.10.2.tgz#024a5517295308857f14f91f1106fc3b555f446b" + +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" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +bson@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.4.tgz#93c10d39eaa5b58415cbc4052f3e53e562b0b72c" + +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-shims@^1.0.0, buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +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" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +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" + +chalk@^2.0.0, chalk@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.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" + +cjson@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cjson/-/cjson-0.2.1.tgz#73cd8aad65d9e1505f9af1744d3b79c1527682a5" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +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@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +colors@0.5.x: + version "0.5.1" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +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.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +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" + +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +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" + +csv-stringify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-1.0.4.tgz#bc18bab9ad4cef3195fd257980b58b479c42d3e5" + dependencies: + lodash.get "^4.0.0" + +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@2.6.8, debug@^2.2.0, debug@^2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +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.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +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" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +ebnf-parser@~0.1.9: + version "0.1.10" + resolved "https://registry.yarnpkg.com/ebnf-parser/-/ebnf-parser-0.1.10.tgz#cd1f6ba477c5638c40c97ed9b572db5bab5d8331" + +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" + +es6-promise@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" + +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@0.0.21: + version "0.0.21" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-0.0.21.tgz#53d652cfa1030388279458a5266c5ffc709c63c3" + dependencies: + esprima "~1.0.2" + estraverse "~0.0.4" + optionalDependencies: + source-map ">= 0.1.2" + +escodegen@~0.0.24: + version "0.0.28" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-0.0.28.tgz#0e4ff1715f328775d6cab51ac44a406cd7abffd3" + dependencies: + esprima "~1.0.2" + estraverse "~1.3.0" + optionalDependencies: + source-map ">= 0.1.2" + +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.6.1.tgz#ddc7fc7fd70bf93205b0b3449bb16a1e9e7d4950" + dependencies: + ajv "^5.2.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^2.6.8" + doctrine "^2.0.0" + eslint-scope "^3.7.1" + espree "^3.5.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^9.17.0" + 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 "^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 "^4.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "^4.0.1" + text-table "~0.2.0" + +espree@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" + dependencies: + acorn "^5.1.1" + acorn-jsx "^3.0.0" + +esprima@1.0.x, esprima@~1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" + +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + +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.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +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" + +estraverse@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-0.0.4.tgz#01a0932dfee574684a598af5a67c3bf9b6428db2" + +estraverse@~1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.3.2.tgz#37c2b893ef13d723f276d878d60d8535152a6c42" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.31" + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +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" + +flat-cache@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +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" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +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@^7.0.3, glob@^7.0.5, glob@^7.1.2: + 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.17.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" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +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-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +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" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hooks-fixed@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hooks-fixed/-/hooks-fixed-2.0.0.tgz#a01d894d52ac7f6599bbb1f63dfc9c411df70cba" + +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" + +iconv-lite@^0.4.17: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + +ignore@^3.3.3: + version "3.3.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +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.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^3.0.6: + version "3.2.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.3.tgz#1c7b1731cf77b934ec47d22c9ac5aa8fe7fbe095" + dependencies: + ansi-escapes "^2.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@^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-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.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isemail@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" + +isemail@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.0.0.tgz#c89a46bb7a3361e1759f8028f9082488ecce3dff" + dependencies: + punycode "2.x.x" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jison-lex@0.2.x: + version "0.2.1" + resolved "https://registry.yarnpkg.com/jison-lex/-/jison-lex-0.2.1.tgz#ac4b815e8cce5132eb12b5dfcfe8d707b8844dfe" + dependencies: + lex-parser "0.1.x" + nomnom "1.5.2" + +jison@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/jison/-/jison-0.4.13.tgz#9041707d62241367f58834532b9f19c2c36fac78" + dependencies: + JSONSelect "0.4.0" + cjson "~0.2.1" + ebnf-parser "~0.1.9" + escodegen "0.0.21" + esprima "1.0.x" + jison-lex "0.2.x" + lex-parser "~0.1.3" + nomnom "1.5.2" + +joi@^6.10.1: + version "6.10.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" + dependencies: + hoek "2.x.x" + isemail "1.x.x" + moment "2.x.x" + topo "1.x.x" + +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.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" + 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" + +jschardet@^1.4.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" + +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.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" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpath@^0.2.12: + version "0.2.12" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-0.2.12.tgz#5bf9d911fb4616c1e3370beceb9f0db24ae34cd2" + dependencies: + esprima "1.2.2" + jison "0.4.13" + static-eval "0.2.3" + underscore "1.7.0" + +jsonwebtoken@^7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz#77f5021de058b605a1783fa1283e99812e645638" + dependencies: + joi "^6.10.1" + jws "^3.1.4" + lodash.once "^4.0.0" + ms "^2.0.0" + 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" + +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.1.4: + 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.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-1.5.0.tgz#e3e4101d9dcfde299769daf4b4db64d895d17448" + +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" + +lex-parser@0.1.x, lex-parser@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/lex-parser/-/lex-parser-0.1.4.tgz#64c4f025f17fd53bfb45763faeb16f015a747550" + +lodash.get@^4.0.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +mime-db@~1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.16" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" + dependencies: + mime-db "~1.29.0" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimatch@^3.0.0, minimatch@^3.0.2, 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: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"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" + +moment@2.x.x, moment@^2.18.1: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +mongodb-core@2.1.15: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.15.tgz#841f53b87ffff4c7458189c35c8ae827e1169764" + dependencies: + bson "~1.0.4" + require_optional "~1.0.0" + +mongodb@2.2.31: + version "2.2.31" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.31.tgz#1940445c661e19217bb3bf8245d9854aaef548db" + dependencies: + es6-promise "3.2.1" + mongodb-core "2.1.15" + readable-stream "2.2.7" + +mongoose-timestamp@^0.6: + version "0.6.0" + resolved "https://registry.yarnpkg.com/mongoose-timestamp/-/mongoose-timestamp-0.6.0.tgz#da54110ca8e6d4c2b9957a0366836c362ed272be" + dependencies: + defaults "^1.0.3" + +mongoose@^4.11.10: + version "4.11.10" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.11.10.tgz#f68b131df09893b9f0073f46d5dcab0116789f56" + dependencies: + async "2.1.4" + bson "~1.0.4" + hooks-fixed "2.0.0" + kareem "1.5.0" + mongodb "2.2.31" + mpath "0.3.0" + mpromise "0.5.5" + mquery "2.3.1" + ms "2.0.0" + muri "1.2.2" + regexp-clone "0.0.1" + sliced "1.0.1" + +mpath@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.3.0.tgz#7a58f789e9b5fd3c94520634157960f26bd5ef44" + +mpromise@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mpromise/-/mpromise-0.5.5.tgz#f5b24259d763acc2257b0a0c8c6d866fd51732e6" + +mquery@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-2.3.1.tgz#9ab36749714800ff0bb53a681ce4bc4d5f07c87b" + dependencies: + bluebird "2.10.2" + debug "2.6.8" + regexp-clone "0.0.1" + sliced "0.0.5" + +ms@2.0.0, ms@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +muri@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/muri/-/muri-1.2.2.tgz#63198132650db08a04cc79ccd00dd389afd2631c" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +node-pre-gyp@0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nomnom@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.5.2.tgz#f4345448a853cfbd5c0d26320f2477ab0526fe2f" + dependencies: + colors "0.5.x" + underscore "1.1.x" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +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" + +once@^1.3.0, once@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +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" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +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, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +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" + +pluralize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +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" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +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.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~2.1.0: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + 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 "~0.10.x" + util-deprecate "~1.0.1" + +regexp-clone@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589" + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.4.tgz#86988ec8eee408e45579fce83bfd05b3adf9a155" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.0" + +request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + 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" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-uncached@^1.0.3: + 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" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +safe-buffer@^5.0.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" + +semver@^5.1.0, semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +simple-statistics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/simple-statistics/-/simple-statistics-4.1.1.tgz#533c48d48336ba3d350d8135f20fa7138acb0c7d" + +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" + +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" + +"source-map@>= 0.1.2": + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +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.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + 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" + +static-eval@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-0.2.3.tgz#023f17ac9fee426ea788c12ea39206dc175f8b2a" + dependencies: + escodegen "~0.0.24" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + +stream-transform@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-0.1.2.tgz#7d8e6b4e03ac4781778f8c79517501bfb0762a9f" + +string-width@^1.0.1, string-width@^1.0.2: + 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, string-width@^2.1.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" + +stringify-stream@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/stringify-stream/-/stringify-stream-1.0.5.tgz#e51407a8fdc4ca0e1c62f149868bacf5cf204050" + dependencies: + readable-stream "~2.1.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + 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-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" + +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@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + +table@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" + 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" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +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" + +tmp@^0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +topo@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" + dependencies: + hoek "2.x.x" + +tough-cookie@>=2.3.0, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +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" + +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" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +underscore@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.1.7.tgz#40bab84bad19d230096e8d6ef628bff055d83db0" + +underscore@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +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" + +which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +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" + +xtend@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" diff --git a/osem-mongo/Dockerfile b/osem-mongo/Dockerfile deleted file mode 100644 index 2685c2b8..00000000 --- a/osem-mongo/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM mongo:3.2 - -COPY docker-entrypoint.sh /entrypoint.sh -COPY set_mongodb_password.sh /set_mongodb_password.sh diff --git a/osem-mongo/docker-entrypoint.sh b/osem-mongo/docker-entrypoint.sh deleted file mode 100755 index f11ca14d..00000000 --- a/osem-mongo/docker-entrypoint.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -set -e - -if [ "${1:0:1}" = '-' ]; then - set -- mongod "$@" -fi - -# allow the container to be started with `--user` -if [ "$1" = 'mongod' -a "$(id -u)" = '0' ]; then - chown -R mongodb /data/configdb /data/db - exec gosu mongodb "$BASH_SOURCE" "$@" -fi - -if [ "$1" = 'mongod' ]; then - numa='numactl --interleave=all' - if $numa true &> /dev/null; then - set -- $numa "$@" - fi -fi - -# taken from the tutumcloud mongo image.. -if [ ! -f /data/db/.mongodb_password_set ]; then -# mongod & -#mongod --config << EOF -#bind_ip=127.0.0.1 -#EOF - mongod --bind_ip 127.0.0.1 & - PID=$! - /set_mongodb_password.sh - kill $PID - wait $PID - exec "$@" -else - exec "$@" -fi - diff --git a/osem-mongo/set_mongodb_password.sh b/osem-mongo/set_mongodb_password.sh deleted file mode 100755 index 986d3be1..00000000 --- a/osem-mongo/set_mongodb_password.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -USER=${OSEM_dbuser:-"admin"} -DATABASE=OSeM-api -PASS=${OSEM_dbuserpass:-"admin"} - -RET=1 -while [[ RET -ne 0 ]]; do - echo "=> Waiting for confirmation of MongoDB service startup" - sleep 5 - mongo admin --eval "help" >/dev/null 2>&1 - RET=$? -done - -echo "=> Creating user ${USER} user with password ${PASS} in MongoDB" -mongo admin << EOF -use OSeM-api -db.createUser({user: '$USER', pwd: '$PASS', roles:['readWrite']}) -EOF - -echo "=> Done!" -touch /data/db/.mongodb_password_set - diff --git a/package.json b/package.json index 99a3ea89..d09d2f4d 100644 --- a/package.json +++ b/package.json @@ -1,61 +1,28 @@ { - "name": "openSenseMapAPI", + "name": "opensensemap-api", + "private": true, "version": "0.0.1", "description": "API for opensensemap.org", - "main": "index.js", "dependencies": { - "@sensebox/sketch-templater": "^1.0.5", - "@turf/area": "^4.6.0", - "@turf/bbox": "^4.6.0", - "@turf/centroid": "^4.6.1", - "@turf/convex": "^4.6.0", - "@turf/distance": "^4.6.0", - "@turf/helpers": "^4.6.0", - "@turf/hex-grid": "^4.6.1", - "@turf/simplify": "^4.6.0", - "@turf/square-grid": "^4.6.0", - "@turf/triangle-grid": "^4.6.0", - "apicache": "^0.9.0", - "bcrypt": "^1.0.2", - "bunyan": "^1.8.12", - "csv-stringify": "^1.0.4", - "honeybadger": "^1.2.1", - "isemail": "^3.0.0", - "jsonpath": "^0.2.12", - "jsonwebtoken": "^7.4.3", - "lodash.isequal": "^4.5.0", - "millify": "^2.0.1", - "moment": "^2.18.1", - "mongoose": "^4.11.7", - "mongoose-timestamp": "^0.6", - "mqtt": "^2.12.0", - "passport": "^0.4.0", - "passport-jwt": "^3.0.0", - "passport-local": "^1.0.0", - "request": "^2.81.0", - "request-promise-native": "^1.0.4", - "restify": "^5.2.0", - "restify-errors": "^5.0.0", - "simple-statistics": "^4.1.1", - "stream-transform": "^0.1.2", - "stringify-stream": "^1.0.5", - "uuid": "^3.1.0" + "@sensebox/opensensemap-api": "file:./api", + "@sensebox/opensensemap-api-models": "file:./models" }, "devDependencies": { "@turf/invariant": "^4.6.0", "chakram": "^1.5.0", "cheerio": "^1.0.0-rc.2", "csv-parse": "^1.2.1", - "eslint": "^4.5.0", "mimelib": "^0.3.1", "mocha": "^3.5.0", - "randomgeojson": "^1.0.0" + "moment": "^2.18.1", + "randomgeojson": "^1.0.0", + "request-promise-native": "^1.0.4" }, "scripts": { - "start": "node app.js", + "start": "node ./.scripts/npm_start.js", "test": "node node_modules/.bin/mocha tests/tests.js", "pretest": "node tests/waitForHttp", - "lint": "./node_modules/.bin/eslint --fix app.js \"{tests,lib}/**/*.js\"" + "tag-container": "./.scripts/npm_tag-container.sh" }, "repository": { "type": "git", @@ -66,23 +33,5 @@ "bugs": { "url": "https://github.com/sensebox/openSenseMap-API/issues" }, - "homepage": "https://github.com/sensebox/openSenseMap-API", - "apidoc": { - "name": "openSenseMap API documentation", - "description": "methods to manage senseBoxes and get/post measurements", - "title": "openSenseMap API documentation", - "url": "https://api.opensensemap.org", - "order": [ - "getBox", - "getBoxes", - "postNewBox", - "updateBox", - "deleteBox", - "getScript", - "postNewMeasurement", - "getMeasurements", - "getData", - "calculateIdw" - ] - } + "homepage": "https://github.com/sensebox/openSenseMap-API" } diff --git a/run-tests.sh b/run-tests.sh index 833bf496..22253e88 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -11,7 +11,7 @@ logs_service=${2:-} case "$cmd" in "build" ) - docker-compose -p osemapitest -f tests-docker-compose.yml build osem-api + docker-compose -p osemapitest -f ./tests/tests-docker-compose.yml build osem-api exit 0; ;; "logs" ) @@ -35,21 +35,20 @@ fi function cleanup { if [[ -n "$show_logs" ]]; then if [[ -z "$logs_service" ]]; then - docker-compose -p osemapitest -f tests-docker-compose.yml logs + docker-compose -p osemapitest -f ./tests/tests-docker-compose.yml logs else - docker-compose -p osemapitest -f tests-docker-compose.yml logs "$logs_service" + docker-compose -p osemapitest -f ./tests/tests-docker-compose.yml logs "$logs_service" fi fi if [[ -z "$dont_clean_up" ]]; then echo 'cleanup!' - docker-compose -p osemapitest -f tests-docker-compose.yml down -v + docker-compose -p osemapitest -f ./tests/tests-docker-compose.yml down -v fi } trap cleanup EXIT -docker-compose -p osemapitest -f tests-docker-compose.yml down -v -docker-compose -p osemapitest -f tests-docker-compose.yml up -d --force-recreate --remove-orphans - -docker-compose -p osemapitest -f tests-docker-compose.yml exec osem-api npm test +docker-compose -p osemapitest -f ./tests/tests-docker-compose.yml down -v +docker-compose -p osemapitest -f ./tests/tests-docker-compose.yml up -d --force-recreate --remove-orphans +docker-compose -p osemapitest -f ./tests/tests-docker-compose.yml exec osem-api yarn test diff --git a/tests/tests-Dockerfile b/tests/tests-Dockerfile new file mode 100644 index 00000000..a4e3d3ab --- /dev/null +++ b/tests/tests-Dockerfile @@ -0,0 +1,30 @@ +FROM node:6-alpine + +ENV NODE_ENV=production + +RUN apk --no-cache --virtual .build add python make g++ git + +# taken from node:6-onbuild +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +# COPY in dev versions +COPY models /usr/src/app/models +COPY api /usr/src/app/api + +COPY package.json /usr/src/app/ +COPY yarn.lock /usr/src/app/ +RUN yarn install --pure-lockfile --production=false +# required because the prebuilt binaries are not compatible with musl +# remove when https://github.com/kelektiv/node.bcrypt.js/issues/528 is resolved +RUN npm rebuild bcrypt --build-from-source + +COPY .scripts /usr/src/app/.scripts + +COPY .git /usr/src/app/.git +# for git 2.1.4 +RUN echo -n $(git rev-parse --abbrev-ref HEAD) $(TZ=UTC git log --date=local --pretty=format:"%ct %h" -n 1) > revision; rm -rf .git + +RUN apk del .build + +CMD ["yarn", "start"] diff --git a/tests-docker-compose.yml b/tests/tests-docker-compose.yml similarity index 94% rename from tests-docker-compose.yml rename to tests/tests-docker-compose.yml index 1ff51fd6..8e92845c 100644 --- a/tests-docker-compose.yml +++ b/tests/tests-docker-compose.yml @@ -2,14 +2,14 @@ version: "2" services: osem-api: build: - context: . - dockerfile: ./Dockerfile + context: .. + dockerfile: ./tests/tests-Dockerfile volumes: - - ./app.js:/usr/src/app/app.js - - ./lib:/usr/src/app/lib - - ./config/index.js:/usr/src/app/config/index.js - - ./package.json:/usr/src/app/package.json - - ./tests:/usr/src/app/tests + - ./:/usr/src/app/tests + - ../api/app.js:/usr/src/app/node_modules/@sensebox/opensensemap-api/app.js + - ../api/src:/usr/src/app/node_modules/@sensebox/opensensemap-api/src + - ../models/index.js:/usr/src/app/node_modules/@sensebox/opensensemap-api-models/index.js + - ../models/src:/usr/src/app/node_modules/@sensebox/opensensemap-api-models/src environment: OSEM_dbuser: senseboxapiuser OSEM_dbuserpass: userpass @@ -148,13 +148,12 @@ services: ports: - "8025:8025" - mosquitto: - image: eclipse-mosquitto:1.4.10 + #mosquitto: + # image: eclipse-mosquitto:1.4.10 db: image: sensebox/opensensemap-api-mongo environment: - OSEM_dbhost: db OSEM_dbuser: senseboxapiuser OSEM_dbuserpass: userpass OSEM_mailer_url: https://localhost:3924/ diff --git a/tests/tests.js b/tests/tests.js index a5f281fe..ae1a41df 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -1,6 +1,8 @@ 'use strict'; -process.env.OSEM_TEST_BASE_URL = 'http://localhost:8000'; +if (!process.env.OSEM_TEST_BASE_URL || process.env.OSEM_TEST_BASE_URL === '') { + process.env.OSEM_TEST_BASE_URL = 'http://localhost:8000'; +} const path = require('path').join(__dirname, 'tests'); diff --git a/tests/tests/002-location_tests.js b/tests/tests/002-location_tests.js index 807e2863..b8e44a11 100644 --- a/tests/tests/002-location_tests.js +++ b/tests/tests/002-location_tests.js @@ -7,6 +7,8 @@ const chakram = require('chakram'), parseCSV = require('csv-parse/lib/sync'), moment = require('moment'); +const modelsRequirePath = '../../node_modules/@sensebox/opensensemap-api-models'; + const logResponseIfError = function logResponseIfError (r) { if (r.response.statusCode >= 400) { /* eslint-disable no-console */ @@ -44,7 +46,7 @@ describe('openSenseMap API locations tests', function () { describe('location validation', function () { /* eslint-disable global-require */ - const { transformAndValidateCoords: validate } = require('../../lib/decoding/validators'); + const { decoding: { validators: { transformAndValidateCoords: validate } } } = require(modelsRequirePath); /* eslint-enable global-require */ it('should transform latlng object to array', function () { @@ -761,8 +763,7 @@ describe('openSenseMap API locations tests', function () { it('should provide box.currentLocation for legacy measurements without location field', function () { /* eslint-disable global-require */ - const { connect, mongoose } = require('../../lib/db'); - const Measurement = require('../../lib/models/measurement').model; + const { db: { connect, mongoose }, Measurement } = require(modelsRequirePath); /* eslint-enable global-require */ mongoose.set('debug', false); diff --git a/tests/tests/004-users-test.js b/tests/tests/004-users-test.js index b7f89776..e9b4a810 100644 --- a/tests/tests/004-users-test.js +++ b/tests/tests/004-users-test.js @@ -260,7 +260,7 @@ describe('openSenseMap API Routes: /users', function () { return chakram.put(`${BASE_URL}/users/me`, { newPassword: ' leading and trailing spaces ', currentPassword: '12345678' }, { headers: { 'Authorization': `Bearer ${jwt}` } }) .then(function (response) { expect(response).to.have.status(200); - expect(response).to.have.json('message', 'User successfully saved. Password changed. Please log in with your new password'); + expect(response).to.have.json('message', 'User successfully saved. Password changed. Please sign in with your new password'); // try to log in with old token return chakram.get(`${BASE_URL}/users/me`, { headers: { 'Authorization': `Bearer ${jwt}` } }); @@ -288,7 +288,7 @@ describe('openSenseMap API Routes: /users', function () { return chakram.put(`${BASE_URL}/users/me`, { newPassword: '12345678910', currentPassword: ' leading and trailing spaces ' }, { headers: { 'Authorization': `Bearer ${jwt}` } }) .then(function (response) { expect(response).to.have.status(200); - expect(response).to.have.json('message', 'User successfully saved. Password changed. Please log in with your new password'); + expect(response).to.have.json('message', 'User successfully saved. Password changed. Please sign in with your new password'); // try to log in with old token return chakram.get(`${BASE_URL}/users/me`, { headers: { 'Authorization': `Bearer ${jwt}` } }); diff --git a/tests/tests/006-submit-measurements-test.js b/tests/tests/006-submit-measurements-test.js index 15be95dc..18fb5d43 100644 --- a/tests/tests/006-submit-measurements-test.js +++ b/tests/tests/006-submit-measurements-test.js @@ -6,13 +6,11 @@ const chakram = require('chakram'), expect = chakram.expect, moment = require('moment'); -process.env.OSEM_TEST_BASE_URL = 'http://localhost:8000'; - const BASE_URL = process.env.OSEM_TEST_BASE_URL, csv_example_data = require('../data/csv_example_data'), json_submit_data = require('../data/json_submit_data'), - byte_submit_data = require('../data/byte_submit_data'), - publishMqttMessage = require('../helpers/mqtt'); + byte_submit_data = require('../data/byte_submit_data'); + // publishMqttMessage = require('../helpers/mqtt'); describe('submitting measurements', function () { let boxes = []; @@ -301,35 +299,35 @@ describe('submitting measurements', function () { }); }); - it('should accept measurements through mqtt', function () { - const submitTime = moment.utc(); - - const payload = JSON.stringify(json_submit_data.json_arr(boxes[0].sensors)); - - return publishMqttMessage('mqtt://mosquitto', 'mytopic', payload) - .then(function () { - return new Promise(function (resolve) { - setTimeout(resolve, 500); - }) - .then(function () { - return chakram.get(`${BASE_URL}/boxes/${boxIds[0]}`); - }); - }) - .then(function (response) { - expect(response).to.have.status(200); - expect(response).to.have.json('sensors', function (sensors) { - sensors.forEach(function (sensor) { - expect(sensor.lastMeasurement).not.to.be.null; - expect(sensor.lastMeasurement.createdAt).to.exist; - const createdAt = moment.utc(sensor.lastMeasurement.createdAt); - expect(submitTime.diff(createdAt, 'minutes')).to.be.below(5); - countMeasurements = countMeasurements + 1; - }); - }); - - return chakram.wait(); - }); - }); + //it('should accept measurements through mqtt', function () { + // const submitTime = moment.utc(); + + // const payload = JSON.stringify(json_submit_data.json_arr(boxes[0].sensors)); + + // return publishMqttMessage('mqtt://mosquitto', 'mytopic', payload) + // .then(function () { + // return new Promise(function (resolve) { + // setTimeout(resolve, 500); + // }) + // .then(function () { + // return chakram.get(`${BASE_URL}/boxes/${boxIds[0]}`); + // }); + // }) + // .then(function (response) { + // expect(response).to.have.status(200); + // expect(response).to.have.json('sensors', function (sensors) { + // sensors.forEach(function (sensor) { + // expect(sensor.lastMeasurement).not.to.be.null; + // expect(sensor.lastMeasurement.createdAt).to.exist; + // const createdAt = moment.utc(sensor.lastMeasurement.createdAt); + // expect(submitTime.diff(createdAt, 'minutes')).to.be.below(5); + // countMeasurements = countMeasurements + 1; + // }); + // }); + + // return chakram.wait(); + // }); + //}); it('should accept measurements in random order', function () { const sensor_id = boxes[0].sensors[1]._id; diff --git a/tests/tests/007-download-data-test.js b/tests/tests/007-download-data-test.js index 09ce0f71..bc6933bc 100644 --- a/tests/tests/007-download-data-test.js +++ b/tests/tests/007-download-data-test.js @@ -6,8 +6,6 @@ const chakram = require('chakram'), expect = chakram.expect, moment = require('moment'); -process.env.OSEM_TEST_BASE_URL = 'http://localhost:8000'; - const BASE_URL = process.env.OSEM_TEST_BASE_URL, findAllSchema = require('../data/findAllSchema'), measurementsSchema = require('../data/measurementsSchema'); diff --git a/tests/tests/008-delete-sensordata-test.js b/tests/tests/008-delete-sensordata-test.js index c96e4df1..00625d17 100644 --- a/tests/tests/008-delete-sensordata-test.js +++ b/tests/tests/008-delete-sensordata-test.js @@ -6,8 +6,6 @@ const chakram = require('chakram'), expect = chakram.expect, moment = require('moment'); -process.env.OSEM_TEST_BASE_URL = 'http://localhost:8000'; - const BASE_URL = process.env.OSEM_TEST_BASE_URL; describe('deleting sensor data', function () { diff --git a/tests/waitForHttp.js b/tests/waitForHttp.js index e00c628f..6abeb19c 100644 --- a/tests/waitForHttp.js +++ b/tests/waitForHttp.js @@ -2,9 +2,13 @@ const request = require('request-promise-native'); +if (!process.env.OSEM_TEST_BASE_URL || process.env.OSEM_TEST_BASE_URL === '') { + process.env.OSEM_TEST_BASE_URL = 'http://localhost:8000'; +} + /*eslint-disable no-console */ const connectWithRetry = function (success) { - return request('http://localhost:8000/boxes') + return request(`${process.env.OSEM_TEST_BASE_URL}/boxes`) .then(function () { success(); }) diff --git a/yarn.lock b/yarn.lock index 6ced5a4c..2b47443a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,9 +8,55 @@ dependencies: wgs84 "0.0.0" -"@sensebox/sketch-templater@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@sensebox/sketch-templater/-/sketch-templater-1.0.5.tgz#13f18641aac48f693c226c4d1f0b7c82a5b65ed8" +"@sensebox/opensensemap-api-models@file:./models": + version "1.0.0" + dependencies: + "@sensebox/sketch-templater" "^1.0.6" + "@turf/helpers" "^4.6.0" + bcrypt "^1.0.2" + csv-stringify "^1.0.4" + isemail "^3.0.0" + jsonpath "^0.2.12" + jsonwebtoken "^7.4.3" + lodash.isequal "^4.5.0" + moment "^2.18.1" + mongoose "^4.11.9" + mongoose-timestamp "^0.6" + request "^2.81.0" + request-promise-native "^1.0.4" + simple-statistics "^4.1.1" + stream-transform "^0.1.2" + stringify-stream "^1.0.5" + uuid "^3.1.0" + +"@sensebox/opensensemap-api@file:./api": + version "1.0.0" + dependencies: + "@turf/area" "^4.6.0" + "@turf/bbox" "^4.6.0" + "@turf/centroid" "^4.6.1" + "@turf/distance" "^4.6.0" + "@turf/helpers" "^4.6.0" + "@turf/hex-grid" "^4.6.1" + "@turf/square-grid" "^4.6.0" + "@turf/triangle-grid" "^4.6.0" + apicache "^0.10.0" + bunyan "^1.8.12" + csv-stringify "^1.0.4" + honeybadger "^1.2.1" + isemail "^3.0.0" + millify "^2.0.1" + moment "^2.18.1" + passport "^0.4.0" + passport-jwt "^3.0.0" + passport-local "^1.0.0" + request "^2.81.0" + restify "^5.2.0" + restify-errors "^5.0.0" + +"@sensebox/sketch-templater@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@sensebox/sketch-templater/-/sketch-templater-1.0.6.tgz#8aa4a0cda28b5a8ed6ebcd4953a81d042a0c70be" dependencies: dedent "^0.7.0" @@ -34,14 +80,6 @@ "@turf/helpers" "^4.6.0" "@turf/meta" "^4.6.0" -"@turf/convex@^4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@turf/convex/-/convex-4.6.0.tgz#963afe831e929728b64eef30abcd82356222e17e" - dependencies: - "@turf/helpers" "^4.6.0" - "@turf/meta" "^4.6.0" - convex-hull "^1.0.3" - "@turf/distance@^4.6.0": version "4.6.0" resolved "https://registry.yarnpkg.com/@turf/distance/-/distance-4.6.0.tgz#6410b9b4ea7e44e4a99be33018d9daab031946e0" @@ -68,12 +106,6 @@ version "4.6.0" resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-4.6.0.tgz#0d3f9a218e58d1c5e5deedf467c3321dd61203f3" -"@turf/simplify@^4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@turf/simplify/-/simplify-4.6.0.tgz#e19e3c0eaf5fcec54eb978ab60f08843af6543c7" - dependencies: - simplify-js "^1.2.1" - "@turf/square-grid@^4.6.0": version "4.6.0" resolved "https://registry.yarnpkg.com/@turf/square-grid/-/square-grid-4.6.0.tgz#e1c1637402ec6426ddcf37cb6382deab0267df34" @@ -90,8 +122,8 @@ "@turf/helpers" "^4.6.0" "@types/node@^6.0.46": - version "6.0.78" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.78.tgz#5d4a3f579c1524e01ee21bf474e6fba09198f470" + version "6.0.88" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.88.tgz#f618f11a944f6a18d92b5c472028728a3e3d4b66" JSONSelect@0.4.0: version "0.4.0" @@ -101,75 +133,28 @@ abbrev@1: version "1.1.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" -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: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" - addressparser@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746" -affine-hull@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/affine-hull/-/affine-hull-1.0.0.tgz#763ff1d38d063ceb7e272f17ee4d7bbcaf905c5d" - dependencies: - robust-orientation "^1.1.3" - -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, ajv@^4.9.1: +ajv@^4.9.1: 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.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" - -ansi-escapes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" - 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" -ansi-styles@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - dependencies: - color-convert "^1.9.0" - -apicache@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/apicache/-/apicache-0.9.0.tgz#e4194f1dfb628025031c1f4bc218d6383430741c" +apicache@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/apicache/-/apicache-0.10.0.tgz#79687842020647a91aa87e0e74680bcc0610584e" aproba@^1.0.3: version "1.1.2" @@ -182,26 +167,6 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -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" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -236,14 +201,6 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -259,26 +216,11 @@ bcrypt-pbkdf@^1.0.0: tweetnacl "^0.14.3" bcrypt@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-1.0.2.tgz#d05fc5d223173e0e28ec381c0f00cc25ffaf2736" - dependencies: - bindings "1.2.1" - nan "2.5.0" - node-pre-gyp "0.6.32" - -bindings@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" - -bit-twiddle@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-1.0.2.tgz#0c6c1fabe2b23d17173d9a61b7b7093eb9e1769e" - -bl@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" + version "1.0.3" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-1.0.3.tgz#b02ddc6c0b52ea16b8d3cf375d5a32e780dab548" dependencies: - readable-stream "^2.0.5" + nan "2.6.2" + node-pre-gyp "0.6.36" block-stream@*: version "0.0.9" @@ -323,16 +265,7 @@ buffer-shims@^1.0.0, buffer-shims@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" -bunyan@^1.8.1: - version "1.8.10" - resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.10.tgz#201fedd26c7080b632f416072f53a90b9a52981c" - optionalDependencies: - dtrace-provider "~0.8" - moment "^2.10.6" - mv "~2" - safe-json-stringify "~1" - -bunyan@^1.8.12: +bunyan@^1.8.1, bunyan@^1.8.12: version "1.8.12" resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797" optionalDependencies: @@ -341,23 +274,6 @@ bunyan@^1.8.12: mv "~2" safe-json-stringify "~1" -callback-stream@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/callback-stream/-/callback-stream-1.1.0.tgz#4701a51266f06e06eaa71fc17233822d875f4908" - dependencies: - inherits "^2.0.1" - readable-stream "> 1.0.0 < 3.0.0" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -395,7 +311,7 @@ chakram@^1.5.0: request-debug "0.x.x" tv4 "1.x.x" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: +chalk@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -405,14 +321,6 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - cheerio@^1.0.0-rc.2: version "1.0.0-rc.2" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" @@ -424,24 +332,10 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" -circular-json@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" - cjson@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cjson/-/cjson-0.2.1.tgz#73cd8aad65d9e1505f9af1744d3b79c1527682a5" -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" - clone-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.0.tgz#eae0a2413f55c0942f818c229fefce845d7f3b1c" @@ -461,16 +355,6 @@ 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@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" - dependencies: - color-name "^1.1.1" - -color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - colors@0.5.x: version "0.5.1" resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" @@ -481,55 +365,28 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@2.9.0, commander@^2.9.0: +commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" -commist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/commist/-/commist-1.0.0.tgz#c0c352501cf6f52e9124e3ef89c9806e2022ebef" - dependencies: - leven "^1.0.0" - minimist "^1.1.0" +commander@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" 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.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -convex-hull@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/convex-hull/-/convex-hull-1.0.3.tgz#20a3aa6ce87f4adea2ff7d17971c9fc1c67e1fff" - dependencies: - affine-hull "^1.0.0" - incremental-convex-hull "^1.0.1" - monotone-convex-hull-2d "^1.0.1" - 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" -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -578,18 +435,12 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@2.6.8, debug@^2.6.8: +debug@2.6.8, debug@^2.2.0, debug@^2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: ms "2.0.0" -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" - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -604,28 +455,12 @@ deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" -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.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" dependencies: clone "^1.0.2" -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" @@ -642,13 +477,6 @@ diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -670,27 +498,25 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -domutils@1.5.1, domutils@^1.5.1: +domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" dependencies: dom-serializer "0" domelementtype "1" -dtrace-provider@^0.8.1, dtrace-provider@~0.8: - version "0.8.3" - resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.3.tgz#ba1bfc6493285ccfcfc6ab69cd5c61d74c2a43bf" +domutils@^1.5.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff" dependencies: - nan "^2.3.3" + dom-serializer "0" + domelementtype "1" -duplexify@^3.1.2, duplexify@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" +dtrace-provider@^0.8.1, dtrace-provider@~0.8: + version "0.8.5" + resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.5.tgz#98ebba221afac46e1c39fd36858d8f9367524b92" dependencies: - end-of-stream "1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" + nan "^2.3.3" ebnf-parser@~0.1.9: version "0.1.10" @@ -715,18 +541,6 @@ encoding@~0.1.12: dependencies: iconv-lite "~0.4.13" -end-of-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" - dependencies: - once "~1.3.0" - -end-of-stream@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" - dependencies: - once "^1.4.0" - entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -739,7 +553,7 @@ escape-regexp-component@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/escape-regexp-component/-/escape-regexp-component-1.0.2.tgz#9c63b6d0b25ff2a88c3adbd18c5b61acc3b9faa2" -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -761,62 +575,6 @@ escodegen@~0.0.24: optionalDependencies: source-map ">= 0.1.2" -eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.5.0.tgz#bb75d3b8bde97fb5e13efcd539744677feb019c3" - dependencies: - ajv "^5.2.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^2.6.8" - doctrine "^2.0.0" - eslint-scope "^3.7.1" - espree "^3.5.0" - esquery "^1.0.0" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^9.17.0" - 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 "^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 "^4.0.0" - progress "^2.0.0" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "^4.0.1" - text-table "~0.2.0" - -espree@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" - dependencies: - acorn "^5.1.1" - acorn-jsx "^3.0.0" - esprima@1.0.x, esprima@~1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" @@ -825,27 +583,6 @@ esprima@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" -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.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" - dependencies: - estraverse "^4.1.0" - object-assign "^4.0.1" - -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" - estraverse@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-0.0.4.tgz#01a0932dfee574684a598af5a67c3bf9b6428db2" @@ -854,74 +591,22 @@ estraverse@~1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.3.2.tgz#37c2b893ef13d723f276d878d60d8535152a6c42" -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - extend-object@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/extend-object/-/extend-object-1.0.0.tgz#42514f84015d1356caf5187969dfb2bc1bda0823" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.0, extend@~3.0.0: +extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" -external-editor@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" - dependencies: - iconv-lite "^0.4.17" - jschardet "^1.4.2" - tmp "^0.0.31" - -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" - extsprintf@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.2.0.tgz#5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529" -extsprintf@^1.2.0: +extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" -fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - -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" - -flat-cache@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -942,7 +627,7 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fstream-ignore@~1.0.5: +fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" dependencies: @@ -950,7 +635,7 @@ fstream-ignore@~1.0.5: inherits "2" minimatch "^3.0.0" -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" dependencies: @@ -959,10 +644,6 @@ fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: mkdirp ">=0.5 0" rimraf "2" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -992,28 +673,6 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-stream@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" - dependencies: - extend "^3.0.0" - glob "^7.1.1" - glob-parent "^3.1.0" - is-negated-glob "^1.0.0" - ordered-read-streams "^1.0.0" - pumpify "^1.3.5" - readable-stream "^2.1.5" - remove-trailing-separator "^1.0.1" - to-absolute-glob "^2.0.0" - unique-stream "^2.0.2" - glob@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" @@ -1035,7 +694,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: +glob@^7.0.5: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -1046,21 +705,6 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.17.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" @@ -1107,10 +751,6 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -1124,15 +764,6 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" -help-me@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/help-me/-/help-me-1.1.0.tgz#8f2d508d0600b4a456da2f086556e7e5c056a3c6" - dependencies: - callback-stream "^1.0.2" - glob-stream "^6.1.0" - through2 "^2.0.1" - xtend "^4.0.0" - hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" @@ -1172,7 +803,15 @@ http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" -http-signature@^1.0.0, http-signature@~1.1.0: +http-signature@^1.0.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" + +http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" dependencies: @@ -1180,25 +819,10 @@ http-signature@^1.0.0, http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@^0.4.17, iconv-lite@~0.4.13: +iconv-lite@~0.4.13: version "0.4.18" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" -ignore@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -incremental-convex-hull@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz#51428c14cb9d9a6144bfe69b2851fb377334be1e" - dependencies: - robust-orientation "^1.1.2" - simplicial-complex "^1.0.0" - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1206,7 +830,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -1214,89 +838,21 @@ ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inquirer@^3.0.6: - version "3.1.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.1.1.tgz#87621c4fba4072f48a8dd71c9f9df6f100b2d534" - dependencies: - ansi-escapes "^2.0.0" - chalk "^1.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.0.0" - strip-ansi "^3.0.0" - through "^2.3.6" - -is-absolute@^0.2.5: - version "0.2.6" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" - dependencies: - is-relative "^0.2.1" - is-windows "^0.2.0" - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extglob@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - 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-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - is-my-json-valid@^2.12.4: - version "2.16.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" dependencies: generate-function "^2.0.0" generate-object-property "^1.1.0" jsonpointer "^4.0.0" xtend "^4.0.0" -is-negated-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" - -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.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" @@ -1305,18 +861,6 @@ is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" -is-relative@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" - dependencies: - is-unc-path "^0.1.1" - -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" - is-supported-regexp-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz#8b520c85fae7a253382d4b02652e045576e13bb8" @@ -1325,17 +869,7 @@ is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" -is-unc-path@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" - dependencies: - unc-path-regex "^0.1.0" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - -isarray@^1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -1349,10 +883,6 @@ isemail@^3.0.0: dependencies: punycode "2.x.x" -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -1386,34 +916,15 @@ joi@^6.10.1: moment "2.x.x" topo "1.x.x" -js-tokens@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" - -js-yaml@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" - 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" -jschardet@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.4.2.tgz#2aa107f142af4121d145659d44f50830961e699a" - -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: +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: @@ -1444,17 +955,7 @@ jsonpointer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" -jsonwebtoken@^7.0.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz#7ca324f5215f8be039cd35a6c45bb8cb74a448fb" - dependencies: - joi "^6.10.1" - jws "^3.1.4" - lodash.once "^4.0.0" - ms "^2.0.0" - xtend "^4.0.1" - -jsonwebtoken@^7.4.3: +jsonwebtoken@^7.0.0, jsonwebtoken@^7.4.3: version "7.4.3" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz#77f5021de058b605a1783fa1283e99812e645638" dependencies: @@ -1465,13 +966,13 @@ jsonwebtoken@^7.4.3: xtend "^4.0.1" jsprim@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" dependencies: assert-plus "1.0.0" - extsprintf "1.0.2" + extsprintf "1.3.0" json-schema "0.2.3" - verror "1.3.6" + verror "1.10.0" jwa@^1.1.4: version "1.1.5" @@ -1494,17 +995,6 @@ kareem@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/kareem/-/kareem-1.5.0.tgz#e3e4101d9dcfde299769daf4b4db64d895d17448" -leven@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" - -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" - lex-parser@0.1.x, lex-parser@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/lex-parser/-/lex-parser-0.1.4.tgz#64c4f025f17fd53bfb45763faeb16f015a747550" @@ -1568,7 +1058,7 @@ lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0: +lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.1: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -1583,19 +1073,19 @@ millify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/millify/-/millify-2.0.1.tgz#3cfde496b23904b357c620ae71409ffd8eafdd02" -mime-db@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" +mime-db@~1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" mime-types@^2.1.12, mime-types@~2.1.7: - version "2.1.15" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + version "2.1.16" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" dependencies: - mime-db "~1.27.0" + mime-db "~1.29.0" mime@^1.2.11: - version "1.3.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + version "1.4.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.0.tgz#69e9e0db51d44f2a3b56e48b7817d7d137f1a343" mimelib@^0.3.1: version "0.3.1" @@ -1604,10 +1094,6 @@ mimelib@^0.3.1: addressparser "~1.0.1" encoding "~0.1.12" -mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -1622,7 +1108,7 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.0, minimist@^1.2.0: +minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -1673,9 +1159,9 @@ mongoose-timestamp@^0.6: dependencies: defaults "^1.0.3" -mongoose@^4.11.7: - version "4.11.7" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.11.7.tgz#39e6f60880146eadf2efc37257e628fad9ceed8d" +mongoose@^4.11.9: + version "4.11.10" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.11.10.tgz#f68b131df09893b9f0073f46d5dcab0116789f56" dependencies: async "2.1.4" bson "~1.0.4" @@ -1690,12 +1176,6 @@ mongoose@^4.11.7: regexp-clone "0.0.1" sliced "1.0.1" -monotone-convex-hull-2d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz#47f5daeadf3c4afd37764baa1aa8787a40eee08c" - dependencies: - robust-orientation "^1.1.3" - mpath@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.3.0.tgz#7a58f789e9b5fd3c94520634157960f26bd5ef44" @@ -1704,33 +1184,6 @@ mpromise@0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mpromise/-/mpromise-0.5.5.tgz#f5b24259d763acc2257b0a0c8c6d866fd51732e6" -mqtt-packet@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/mqtt-packet/-/mqtt-packet-5.4.0.tgz#387104c06aa68fbb9f8159d0c722dd5c3e45df22" - dependencies: - bl "^1.2.1" - inherits "^2.0.3" - process-nextick-args "^1.0.7" - safe-buffer "^5.1.0" - -mqtt@^2.12.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/mqtt/-/mqtt-2.12.0.tgz#3b0d0a85c42cf4465642f860dd299c441b7a6d3c" - dependencies: - commist "^1.0.0" - concat-stream "^1.6.0" - end-of-stream "^1.1.0" - help-me "^1.0.1" - inherits "^2.0.3" - minimist "^1.2.0" - mqtt-packet "^5.4.0" - pump "^1.0.2" - readable-stream "^2.3.3" - reinterval "^1.1.0" - split2 "^2.1.1" - websocket-stream "^5.0.1" - xtend "^4.0.1" - mquery@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/mquery/-/mquery-2.3.1.tgz#9ab36749714800ff0bb53a681ce4bc4d5f07c87b" @@ -1740,10 +1193,6 @@ mquery@2.3.1: 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@2.0.0, ms@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -1752,10 +1201,6 @@ muri@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/muri/-/muri-1.2.2.tgz#63198132650db08a04cc79ccd00dd389afd2631c" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - mv@~2: version "2.1.1" resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" @@ -1764,13 +1209,13 @@ mv@~2: ncp "~2.0.0" rimraf "~2.4.0" -nan@2.5.0, nan@^2.3.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8" +nan@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" +nan@^2.3.3: + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" ncp@~2.0.0: version "2.0.0" @@ -1780,19 +1225,19 @@ negotiator@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -node-pre-gyp@0.6.32: - version "0.6.32" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" +node-pre-gyp@0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" dependencies: - mkdirp "~0.5.1" - nopt "~3.0.6" - npmlog "^4.0.1" - rc "~1.1.6" - request "^2.79.0" - rimraf "~2.5.4" - semver "~5.3.0" - tar "~2.2.1" - tar-pack "~3.3.0" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" nomnom@1.5.2: version "1.5.2" @@ -1801,15 +1246,16 @@ nomnom@1.5.2: colors "0.5.x" underscore "1.1.x" -nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" dependencies: abbrev "1" + osenv "^0.1.4" -npmlog@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -1830,7 +1276,7 @@ oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -1838,45 +1284,27 @@ obuf@^1.0.0, obuf@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" -once@~1.3.0, once@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - dependencies: - mimic-fn "^1.0.0" - -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" - -ordered-read-streams@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" - dependencies: - readable-stream "^2.0.1" +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" -os-tmpdir@~1.0.1: +os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + parse5@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510" @@ -1907,18 +1335,10 @@ passport@^0.4.0: passport-strategy "1.x.x" pause "0.0.1" -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - 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, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" @@ -1927,10 +1347,6 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" -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" @@ -1941,41 +1357,14 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pluralize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -process-nextick-args@^1.0.7, process-nextick-args@~1.0.6: +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" -progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -pump@^1.0.0, pump@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" - dependencies: - duplexify "^3.1.2" - inherits "^2.0.1" - pump "^1.0.0" - punycode@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" @@ -1988,21 +1377,25 @@ q@1.x.x: version "1.5.0" resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" -qs@^6.2.1, qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" +qs@^6.2.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" qs@~6.3.0: version "6.3.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + randomgeojson@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/randomgeojson/-/randomgeojson-1.0.0.tgz#2446f5a5cd88365365a10ebdda9fe76656fa6b1f" -rc@~1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea" +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -2021,19 +1414,7 @@ readable-stream@2.2.7: string_decoder "~1.0.0" util-deprecate "~1.0.1" -"readable-stream@> 1.0.0 < 3.0.0", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.0, readable-stream@^2.2.2, readable-stream@^2.2.9: - version "2.3.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.2.tgz#5a04df05e4f57fe3f0dc68fdd11dc5c97c7e6f4d" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.0" - string_decoder "~1.0.0" - util-deprecate "~1.0.1" - -readable-stream@^2.3.3: +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.9: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -2045,7 +1426,7 @@ readable-stream@^2.3.3: string_decoder "~1.0.3" util-deprecate "~1.0.1" -readable-stream@~2.1.0, readable-stream@~2.1.4: +readable-stream@~2.1.0: version "2.1.5" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" dependencies: @@ -2061,14 +1442,6 @@ regexp-clone@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589" -reinterval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reinterval/-/reinterval-1.1.0.tgz#3361ecfa3ca6c18283380dd0bb9546f390f5ece7" - -remove-trailing-separator@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" - request-debug@0.x.x: version "0.2.0" resolved "https://registry.yarnpkg.com/request-debug/-/request-debug-0.2.0.tgz#fc054ec817181b04ca41a052c136f61c48abaf78" @@ -2089,7 +1462,7 @@ request-promise-native@^1.0.4: stealthy-require "^1.1.0" tough-cookie ">=2.3.0" -request@2.x.x, request@^2.79.0, request@^2.81.0: +request@2.x.x, request@^2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -2141,13 +1514,6 @@ request@~2.79.0: tunnel-agent "~0.4.1" uuid "^3.0.0" -require-uncached@^1.0.3: - 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" @@ -2155,10 +1521,6 @@ require_optional@~1.0.0: 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" @@ -2209,16 +1571,9 @@ restify@^5.2.0: optionalDependencies: dtrace-provider "^0.8.1" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -rimraf@2, rimraf@^2.2.8, rimraf@~2.5.1, rimraf@~2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" +rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: glob "^7.0.5" @@ -2228,54 +1583,10 @@ rimraf@~2.4.0: dependencies: glob "^6.0.1" -robust-orientation@^1.1.2, robust-orientation@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/robust-orientation/-/robust-orientation-1.1.3.tgz#daff5b00d3be4e60722f0e9c0156ef967f1c2049" - dependencies: - robust-scale "^1.0.2" - robust-subtract "^1.0.0" - robust-sum "^1.0.0" - two-product "^1.0.2" - -robust-scale@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/robust-scale/-/robust-scale-1.0.2.tgz#775132ed09542d028e58b2cc79c06290bcf78c32" - dependencies: - two-product "^1.0.2" - two-sum "^1.0.0" - -robust-subtract@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-subtract/-/robust-subtract-1.0.0.tgz#e0b164e1ed8ba4e3a5dda45a12038348dbed3e9a" - -robust-sum@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-sum/-/robust-sum-1.0.0.tgz#16646e525292b4d25d82757a286955e0bbfa53d9" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.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" -safe-buffer@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" - safe-json-stringify@^1.0.3, safe-json-stringify@~1: version "1.0.4" resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.0.4.tgz#81a098f447e4bbc3ff3312a243521bc060ef5911" @@ -2284,29 +1595,15 @@ select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" -semver@^5.0.1, semver@^5.3.0: +semver@^5.0.1, semver@^5.1.0, semver@^5.3.0: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" -semver@^5.1.0, semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -2314,21 +1611,6 @@ simple-statistics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/simple-statistics/-/simple-statistics-4.1.1.tgz#533c48d48336ba3d350d8135f20fa7138acb0c7d" -simplicial-complex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-1.0.0.tgz#6c33a4ed69fcd4d91b7bcadd3b30b63683eae241" - dependencies: - bit-twiddle "^1.0.0" - union-find "^1.0.0" - -simplify-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/simplify-js/-/simplify-js-1.2.1.tgz#fa216b40454f48175450e0fea1bd1e6ab39fcbc0" - -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" @@ -2344,8 +1626,8 @@ sntp@1.x.x: hoek "2.x.x" "source-map@>= 0.1.2": - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" spdy-transport@^2.0.18: version "2.0.20" @@ -2370,16 +1652,6 @@ spdy@^3.3.3: select-hose "^2.0.0" spdy-transport "^2.0.18" -split2@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0" - dependencies: - through2 "^2.0.2" - -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.13.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" @@ -2408,10 +1680,6 @@ stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - stream-transform@^0.1.0, stream-transform@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-0.1.2.tgz#7d8e6b4e03ac4781778f8c79517501bfb0762a9f" @@ -2424,13 +1692,6 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.0.tgz#030664561fc146c9423ec7d978fe2457437fe6d0" - 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" @@ -2461,12 +1722,6 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: 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-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" @@ -2481,37 +1736,20 @@ 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@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" dependencies: - has-flag "^2.0.0" + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" -table@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" - 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" - -tar-pack@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" - dependencies: - debug "~2.2.0" - fstream "~1.0.10" - fstream-ignore "~1.0.5" - once "~1.3.3" - readable-stream "~2.1.4" - rimraf "~2.5.1" - tar "~2.2.1" - uid-number "~0.0.6" - -tar@~2.2.1: +tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: @@ -2519,42 +1757,6 @@ tar@~2.2.1: fstream "^1.0.2" inherits "2" -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2@^2.0.1, through2@^2.0.2, through2@~2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -tmp@^0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - dependencies: - os-tmpdir "~1.0.1" - -to-absolute-glob@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.1.tgz#70c375805b9e3105e899ee8dbdd6a9aa108f407b" - dependencies: - extend-shallow "^2.0.1" - is-absolute "^0.2.5" - is-negated-glob "^1.0.0" - topo@1.x.x: version "1.1.0" resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" @@ -2567,10 +1769,6 @@ tough-cookie@>=2.3.0, tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -2589,20 +1787,6 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" -two-product@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/two-product/-/two-product-1.0.2.tgz#67d95d4b257a921e2cb4bd7af9511f9088522eaa" - -two-sum@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/two-sum/-/two-sum-1.0.0.tgz#31d3f32239e4f731eca9df9155e2b297f008ab64" - -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-detect@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" @@ -2611,22 +1795,10 @@ type-detect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -uid-number@~0.0.6: +uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" -ultron@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.0.tgz#b07a2e6a541a815fc6a34ccd4533baec307ca864" - -unc-path-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - underscore@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.1.7.tgz#40bab84bad19d230096e8d6ef628bff055d83db0" @@ -2635,17 +1807,6 @@ underscore@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" -union-find@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/union-find/-/union-find-1.0.2.tgz#292bac415e6ad3a89535d237010db4a536284e58" - -unique-stream@^2.0.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" - dependencies: - json-stable-stringify "^1.0.0" - through2-filter "^2.0.0" - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -2660,11 +1821,13 @@ vasync@^1.6.4: dependencies: verror "1.6.0" -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" +verror@1.10.0, verror@^1.8.1, verror@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" dependencies: - extsprintf "1.0.2" + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" verror@1.6.0: version "1.6.0" @@ -2672,69 +1835,27 @@ verror@1.6.0: dependencies: extsprintf "1.2.0" -verror@^1.8.1, verror@^1.9.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" - wbuf@^1.1.0, wbuf@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" dependencies: minimalistic-assert "^1.0.0" -websocket-stream@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/websocket-stream/-/websocket-stream-5.0.1.tgz#51cb992988c2eeb4525ccd90eafbac52a5ac6700" - dependencies: - duplexify "^3.2.0" - inherits "^2.0.1" - readable-stream "^2.2.0" - safe-buffer "^5.0.1" - ws "^3.0.0" - xtend "^4.0.0" - wgs84@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/wgs84/-/wgs84-0.0.0.tgz#34fdc555917b6e57cf2a282ed043710c049cdc76" -which@^1.2.9: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" - dependencies: - isexe "^2.0.0" - wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" dependencies: string-width "^1.0.2" -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - 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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.0.0.tgz#98ddb00056c8390cb751e7788788497f99103b6c" - dependencies: - safe-buffer "~5.0.1" - ultron "~1.1.0" - -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"