diff --git a/.travis.yml b/.travis.yml index 14a3dfe59d0..d7513af2880 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,9 @@ language: node_js sudo: required dist: trusty node_js: - - "8.9.3" -before_install: if [[ `npm --version` != "5.6" ]]; then npm install -g npm@latest; npm --version; fi + - "8" + - "9" +before_install: if [[ `npm --version` != "5.8.0" ]]; then npm install -g npm@latest; npm --version; fi matrix: fast_finish: true services: diff --git a/README.md b/README.md index 0dd62cf7173..e5b3b0379a9 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,8 @@ Community maintained fork of the Requirements: -- [Node.js](http://nodejs.org/) 8.9.0 LTS (use [Install instructions for Node](https://nodejs.org/en/download/package-manager/) or `setup.sh`) +- [Node.js](http://nodejs.org/) 8.11.0 LTS or later or [Node.js](http://nodejs.org/) 9.10.0 or later. Use [Install instructions for Node](https://nodejs.org/en/download/package-manager/) or `setup.sh`) +- [MongoDB](https://www.mongodb.com/download-center?jmp=nav#community) 3.x. MongoDB 2.4 is only supported for Raspberry Pi. Clone this repo then install dependencies into the root of the project: @@ -215,6 +216,7 @@ To learn more about the Nightscout API, visit https://YOUR-SITE.com/api-docs.htm * `MONGO_DEVICESTATUS_COLLECTION`(`devicestatus`) - The collection used to store device status information such as uploader battery * `MONGO_PROFILE_COLLECTION`(`profile`) - The collection used to store your profiles * `MONGO_FOOD_COLLECTION`(`food`) - The collection used to store your food database + * `MONGO_ACTIVITY_COLLECTION`(`activity`) - The collection used to store activity data * `PORT` (`1337`) - The port that the node.js application will listen on. * `HOSTNAME` - The hostname that the node.js application will listen on, null by default for any hostname for IPv6 you may need to use `::`. * `SSL_KEY` - Path to your ssl key file, so that ssl(https) can be enabled directly in node.js diff --git a/app.js b/app.js index a073eff8f80..1d8f30b922c 100644 --- a/app.js +++ b/app.js @@ -101,9 +101,9 @@ function create(env, ctx) { // pebble data app.get('/pebble', ctx.pebble); - // expose swagger.yaml - app.get('/swagger.yaml', function(req, res) { - res.sendFile(__dirname + '/swagger.yaml'); + // expose swagger.json + app.get('/swagger.json', function(req, res) { + res.sendFile(__dirname + '/swagger.json'); }); /* @@ -141,6 +141,13 @@ function create(env, ctx) { // serve the static content app.use(staticFiles); + var swaggerFiles = express.static(env.swagger_files, { + maxAge: maxAge + }); + + // serve the static content + app.use('/swagger-ui-dist', swaggerFiles); + var tmpFiles = express.static('tmp', { maxAge: maxAge }); diff --git a/bundle/bundle.source.js b/bundle/bundle.source.js index 9124fceb253..f3d0c7ce215 100644 --- a/bundle/bundle.source.js +++ b/bundle/bundle.source.js @@ -1,7 +1,7 @@ import '../static/css/drawer.css'; import '../static/css/dropdown.css'; import '../static/css/sgv.css'; -import '../node_modules/jquery.tipsy/src/jquery.tipsy.css'; +import '../node_modules/jquery.tooltips/css/jquery.tooltips.css'; $ = require("jquery"); @@ -11,7 +11,7 @@ require('jquery-ui-bundle'); window._ = require('lodash'); window.d3 = require('d3'); -require('jquery.tipsy'); +require('jquery.tooltips'); window.Storage = require('js-storage'); diff --git a/env.js b/env.js index b347d3852e8..66286fad662 100644 --- a/env.js +++ b/env.js @@ -20,6 +20,7 @@ function config ( ) { env.HOSTNAME = readENV('HOSTNAME', null); env.IMPORT_CONFIG = readENV('IMPORT_CONFIG', null); env.static_files = readENV('NIGHTSCOUT_STATIC_FILES', __dirname + '/static/'); + env.swagger_files = readENV('NIGHTSCOUT_SWAGGER_FILES', __dirname + '/node_modules/swagger-ui-dist/'); env.debug = { minify: readENVTruthy('DEBUG_MINIFY', true) }; @@ -105,6 +106,7 @@ function setStorage() { env.profile_collection = readENV('MONGO_PROFILE_COLLECTION', 'profile'); env.devicestatus_collection = readENV('MONGO_DEVICESTATUS_COLLECTION', 'devicestatus'); env.food_collection = readENV('MONGO_FOOD_COLLECTION', 'food'); + env.activity_collection = readENV('MONGO_ACTIVITY_COLLECTION', 'activity'); // TODO: clean up a bit // Some people prefer to use a json configuration file instead. diff --git a/lib/api/activity/index.js b/lib/api/activity/index.js new file mode 100644 index 00000000000..772a437c60a --- /dev/null +++ b/lib/api/activity/index.js @@ -0,0 +1,127 @@ +'use strict'; + +var _ = require('lodash'); +var consts = require('../../constants'); +var moment = require('moment'); + +function configure(app, wares, ctx) { + var express = require('express') + , api = express.Router(); + + api.use(wares.compression()); + api.use(wares.bodyParser({ + limit: 1048576 * 50 + })); + // text body types get handled as raw buffer stream + api.use(wares.bodyParser.raw({ + limit: 1048576 + })); + // json body types get handled as parsed json + api.use(wares.bodyParser.json({ + limit: 1048576 + })); + // also support url-encoded content-type + api.use(wares.bodyParser.urlencoded({ + limit: 1048576 + , extended: true + })); + // invoke common middleware + api.use(wares.sendJSONStatus); + + api.use(ctx.authorization.isPermitted('api:activity:read')); + + // List activity data available + api.get('/activity', function(req, res) { + var ifModifiedSince = req.get('If-Modified-Since'); + ctx.activity.list(req.query, function(err, results) { + var d1 = null; + + _.forEach(results, function clean(t) { + + var d2 = null; + + if (t.hasOwnProperty('created_at')) { + d2 = new Date(t.created_at); + } else { + if (t.hasOwnProperty('timestamp')) { + d2 = new Date(t.timestamp); + } + } + + if (d2 == null) { return; } + + if (d1 == null || d2.getTime() > d1.getTime()) { + d1 = d2; + } + }); + + if (!_.isNil(d1)) res.setHeader('Last-Modified', d1.toUTCString()); + + if (ifModifiedSince && d1.getTime() <= moment(ifModifiedSince).valueOf()) { + res.status(304).send({ + status: 304 + , message: 'Not modified' + , type: 'internal' + }); + return; + } else { + return res.json(results); + } + }); + }); + + function config_authed(app, api, wares, ctx) { + + function post_response(req, res) { + var activity = req.body; + + if (!_.isArray(activity)) { + activity = [activity]; + }; + + ctx.activity.create(activity, function(err, created) { + if (err) { + console.log('Error adding activity data', err); + res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', err); + } else { + console.log('Activity measure created'); + res.json(created); + } + }); + } + + api.post('/activity/', wares.bodyParser({ + limit: 1048576 * 50 + }), ctx.authorization.isPermitted('api:activity:create'), post_response); + + api.delete('/activity/:_id', ctx.authorization.isPermitted('api:activity:delete'), function(req, res) { + ctx.activity.remove(req.params._id, function() { + res.json({}); + }); + }); + + // update record + api.put('/activity/', ctx.authorization.isPermitted('api:activity:update'), function(req, res) { + var data = req.body; + ctx.activity.save(data, function(err, created) { + if (err) { + res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', err); + console.log('Error saving activity'); + console.log(err); + } else { + res.json(created); + console.log('Activity measure saved', data); + } + }); + }); + } + + if (app.enabled('api') && app.enabled('careportal')) { + config_authed(app, api, wares, ctx); + } + + return api; +} + +module.exports = configure; + diff --git a/lib/api/entries/index.js b/lib/api/entries/index.js index 19bcfed9526..dea493efca8 100644 --- a/lib/api/entries/index.js +++ b/lib/api/entries/index.js @@ -83,9 +83,11 @@ function configure (app, wares, ctx) { res.setHeader('Last-Modified', lastEntryDate.toUTCString()); } - var ifModifiedSince = req.get('If-Modified-Since'); + var ifModifiedSince = req.get('If-Modified-Since'); if (!ifModifiedSince) { return next(); } + console.log("CGM Entry request with If-Modified-Since: ", ifModifiedSince); + if (lastEntryDate.getTime() <= new Date(ifModifiedSince).getTime()) { res.status(304).send({status:304, message: 'Not modified', type:'internal'}); return; @@ -114,6 +116,40 @@ function configure (app, wares, ctx) { if (res.entries_err) { return res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', res.entries_err); } + + // IF-Modified-Since support + + function compare(a,b) { + var a_field = a.mills ? a.mills : a.date; + var b_field = b.mills ? b.mills : b.date; + + if (a_field < b_field) + return -1; + if (a_field > b_field) + return 1; + return 0; + } + + res.entries.sort(compare); + + var lastEntry = _.last(res.entries); + var lastEntryDate = null; + + if (!_.isNil(lastEntry)) { + if (lastEntry.mills) lastEntryDate = new Date(lastEntry.mills); + if (!lastEntry.mills && lastEntry.date ) lastEntryDate = new Date(lastEntry.date); + res.setHeader('Last-Modified', lastEntryDate.toUTCString()); + } + + var ifModifiedSince = req.get('If-Modified-Since'); + + console.log('If-Modified-Since: ' + new Date(ifModifiedSince) + ' Last-Modified', lastEntryDate); + + if (lastEntryDate !== null && ifModifiedSince !== null && lastEntryDate.getTime() <= new Date(ifModifiedSince).getTime()) { + res.status(304).send({status:304, message: 'Not modified', type:'internal'}); + return; + } + // if no error, format the payload // The general pattern here is to create an output stream that reformats // the data correctly into the desired representation. diff --git a/lib/api/index.js b/lib/api/index.js index 4f4239c55d8..57c24975d81 100644 --- a/lib/api/index.js +++ b/lib/api/index.js @@ -53,6 +53,8 @@ function create (env, ctx) { app.all('/devicestatus*', require('./devicestatus/')(app, wares, ctx)); app.all('/notifications*', require('./notifications-api')(app, wares, ctx)); + app.all('/activity*', require('./activity/')(app, wares, ctx)); + app.use('/', wares.sendJSONStatus, require('./verifyauth')(ctx)); app.all('/food*', require('./food/')(app, wares, ctx)); diff --git a/lib/authorization/storage.js b/lib/authorization/storage.js index d90c21351a2..41969be150f 100644 --- a/lib/authorization/storage.js +++ b/lib/authorization/storage.js @@ -114,6 +114,7 @@ function init (env, ctx) { , { name: 'readable', permissions: [ '*:*:read' ] } , { name: 'careportal', permissions: [ 'api:treatments:create' ] } , { name: 'devicestatus-upload', permissions: [ 'api:devicestatus:create' ] } + , { name: 'activity', permissions: [ 'api:activity:create' ] } ]; storage.reload = function reload (callback) { diff --git a/lib/client/browser-utils.js b/lib/client/browser-utils.js index 6ce7d2461d7..fc9a983d0e0 100644 --- a/lib/client/browser-utils.js +++ b/lib/client/browser-utils.js @@ -7,12 +7,12 @@ function init ($) { // Tooltips can remain in the way on touch screens. if (!isTouch()) { - $('.tip').tipsy(); + $('.tip').tooltip(); } else { // Drawer info tips should be displayed on touchscreens. - $('#drawer').find('.tip').tipsy(); + $('#drawer').find('.tip').tooltip(); } - $.fn.tipsy.defaults = { + $.fn.tooltip.defaults = { fade: true, gravity: 'n', opacity: 0.75 diff --git a/lib/client/renderer.js b/lib/client/renderer.js index f0666277715..a333769a178 100644 --- a/lib/client/renderer.js +++ b/lib/client/renderer.js @@ -881,6 +881,7 @@ function init (client, d3) { renderer.drawTreatments = function drawTreatments(client) { var treatmentCount = 0; + chart().focus.selectAll('.draggable-treatment').remove(); _.forEach(client.ddata.treatments, function eachTreatment (d) { if (Number(d.insulin) > 0 || Number(d.carbs) > 0) { treatmentCount += 1; }; diff --git a/lib/data/dataloader.js b/lib/data/dataloader.js index c6ab99dfa77..714d7144a59 100644 --- a/lib/data/dataloader.js +++ b/lib/data/dataloader.js @@ -5,301 +5,382 @@ var async = require('async'); var times = require('../times'); var fitTreatmentsToBGCurve = require('./treatmenttocurve'); -var ONE_DAY = 86400000 - , TWO_DAYS = 172800000; +var ONE_DAY = 86400000, + TWO_DAYS = 172800000; function uniq(a) { - var seen = {}; - return a.filter(function (item) { - return seen.hasOwnProperty(item.mills) ? false : (seen[item.mills] = true); - }); + var seen = {}; + return a.filter(function(item) { + return seen.hasOwnProperty(item.mills) ? false : (seen[item.mills] = true); + }); } function init(env, ctx) { - var dataloader = { }; + var dataloader = {}; - dataloader.update = function update(ddata, opts, done) { - - if (opts && done == null && opts.call) { - done = opts; - opts = { lastUpdated: Date.now( ), frame: false }; - } + dataloader.update = function update(ddata, opts, done) { - if (opts.frame) { - ddata.page = { - frame: true - , after: opts.lastUpdated - // , before: opts. - }; - } - ddata.lastUpdated = opts.lastUpdated; - // console.log('LOOKING SINCE', (new Date(ddata.lastUpdated))); - - function loadComplete (err, result) { - ddata.treatments = _.uniq(ddata.treatments, false, function (item) { return item._id.toString(); }); - //sort treatments so the last is the most recent - ddata.treatments = _.sortBy(ddata.treatments, function (item) { return item.mills; }); - fitTreatmentsToBGCurve(ddata, env, ctx); - if (err) { - console.error(err); - } - ddata.processTreatments(true); - - var counts = []; - _.forIn(ddata, function each (value, key) { - if (_.isArray(value) && value.length > 0) { - counts.push(key + ':' + value.length); + //console.log("Database is connected: " + ctx.store.client.isConnected()); + + if (opts && done == null && opts.call) { + done = opts; + opts = { + lastUpdated: Date.now(), + frame: false + }; } - }); - console.info('Load Complete:\n\t', counts.join(', ')); + if (opts.frame) { + ddata.page = { + frame: true, + after: opts.lastUpdated + // , before: opts. + }; + } + ddata.lastUpdated = opts.lastUpdated; + // console.log('LOOKING SINCE', (new Date(ddata.lastUpdated))); - done(err, result); - } + function loadComplete(err, result) { + ddata.treatments = _.uniq(ddata.treatments, false, function(item) { + return item._id.toString(); + }); + //sort treatments so the last is the most recent + ddata.treatments = _.sortBy(ddata.treatments, function(item) { + return item.mills; + }); + fitTreatmentsToBGCurve(ddata, env, ctx); + if (err) { + console.error(err); + } + ddata.processTreatments(true); + + var counts = []; + _.forIn(ddata, function each(value, key) { + if (_.isArray(value) && value.length > 0) { + counts.push(key + ':' + value.length); + } + }); - // clear treatments, we're going to merge from more queries - ddata.treatments = []; + console.info('Load Complete:\n\t', counts.join(', ')); - async.parallel([ - loadEntries.bind(null, ddata, ctx) - , loadTreatments.bind(null, ddata, ctx) - , loadProfileSwitchTreatments.bind(null, ddata, ctx) - , loadSensorAndInsulinTreatments.bind(null, ddata, ctx) - , loadProfile.bind(null, ddata, ctx) - , loadFood.bind(null, ddata, ctx) - , loadDeviceStatus.bind(null, ddata, env, ctx) - ], loadComplete); + done(err, result); + } + + // clear treatments, we're going to merge from more queries + ddata.treatments = []; + + async.parallel([ + loadEntries.bind(null, ddata, ctx) + , loadTreatments.bind(null, ddata, ctx) + , loadProfileSwitchTreatments.bind(null, ddata, ctx) + , loadSensorAndInsulinTreatments.bind(null, ddata, ctx) + , loadProfile.bind(null, ddata, ctx) + , loadFood.bind(null, ddata, ctx) + , loadDeviceStatus.bind(null, ddata, env, ctx) + , loadActivity.bind(null, ddata, ctx) + ], loadComplete); - }; + }; - return dataloader; + return dataloader; } -function loadEntries (ddata, ctx, callback) { - var dateRange = { - $gte: ddata.lastUpdated - TWO_DAYS - }; - if (ddata.page && ddata.page.frame) { - dateRange['$lte'] = ddata.lastUpdated; - } - var q = { - find: { - date: dateRange +function loadEntries(ddata, ctx, callback) { + var dateRange = { + $gte: ddata.lastUpdated - TWO_DAYS + }; + if (ddata.page && ddata.page.frame) { + dateRange['$lte'] = ddata.lastUpdated; } - , sort: {date: 1} - }; - - ctx.entries.list(q, function (err, results) { - - if (err) { console.log("Problem loading entries"); } - - if (!err && results) { - var mbgs = []; - var sgvs = []; - var cals = []; - results.forEach(function (element) { - if (element) { - if (element.mbg) { - mbgs.push({ - mgdl: Number(element.mbg), mills: element.date, device: element.device - }); - } else if (element.sgv) { - sgvs.push({ - mgdl: Number(element.sgv), mills: element.date, device: element.device, direction: element.direction, filtered: element.filtered, unfiltered: element.unfiltered, noise: element.noise, rssi: element.rssi - }); - } else if (element.type === 'cal') { - cals.push({ - mills: element.date, scale: element.scale, intercept: element.intercept, slope: element.slope - }); - } + var q = { + find: { + date: dateRange + }, + sort: { + date: 1 } - }); + }; - //stop using uniq for SGVs since we use buckets, also enables more detailed monitoring - ddata.sgvs = sgvs; + ctx.entries.list(q, function(err, results) { - ddata.mbgs = uniq(mbgs); - ddata.cals = uniq(cals); - } - callback(); - }); + if (err) { + console.log("Problem loading entries"); + } + + if (!err && results) { + var mbgs = []; + var sgvs = []; + var cals = []; + results.forEach(function(element) { + if (element) { + if (element.mbg) { + mbgs.push({ + mgdl: Number(element.mbg), + mills: element.date, + device: element.device + }); + } else if (element.sgv) { + sgvs.push({ + mgdl: Number(element.sgv), + mills: element.date, + device: element.device, + direction: element.direction, + filtered: element.filtered, + unfiltered: element.unfiltered, + noise: element.noise, + rssi: element.rssi + }); + } else if (element.type === 'cal') { + cals.push({ + mills: element.date, + scale: element.scale, + intercept: element.intercept, + slope: element.slope + }); + } + } + }); + + //stop using uniq for SGVs since we use buckets, also enables more detailed monitoring + ddata.sgvs = sgvs; + + ddata.mbgs = uniq(mbgs); + ddata.cals = uniq(cals); + } + callback(); + }); } -function mergeToTreatments (ddata, results) { - var filtered = _.filter(results, function hasId (treatment) { - return !_.isEmpty(treatment._id); - }); - - var treatments = _.map(filtered, function update (treatment) { - treatment.mills = new Date(treatment.created_at).getTime(); - return treatment; - }); - - //filter out temps older than a day and an hour ago since we don't display them - var oldestAgo = ddata.lastUpdated - TWO_DAYS - times.hour().msecs; - treatments = _.filter(treatments, function noOldTemps (treatment) { - return !treatment.eventType || treatment.eventType.indexOf('Temp Basal') === -1 || treatment.mills > oldestAgo; - }); - - ddata.treatments = _.unionWith(ddata.treatments, treatments, function (a, b) { - return a._id.toString() == b._id.toString(); - }); +function mergeToTreatments(ddata, results) { + var filtered = _.filter(results, function hasId(treatment) { + return !_.isEmpty(treatment._id); + }); + + var treatments = _.map(filtered, function update(treatment) { + treatment.mills = new Date(treatment.created_at).getTime(); + return treatment; + }); + + //filter out temps older than a day and an hour ago since we don't display them + var oldestAgo = ddata.lastUpdated - TWO_DAYS - times.hour().msecs; + treatments = _.filter(treatments, function noOldTemps(treatment) { + return !treatment.eventType || treatment.eventType.indexOf('Temp Basal') === -1 || treatment.mills > oldestAgo; + }); + + ddata.treatments = _.unionWith(ddata.treatments, treatments, function(a, b) { + return a._id.toString() == b._id.toString(); + }); } -function loadTreatments (ddata, ctx, callback) { - var dateRange = { - $gte: new Date(ddata.lastUpdated - (ONE_DAY * 8)).toISOString() - }; - if (ddata.page && ddata.page.frame) { - dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString( ); - } - var tq = { - find: { - created_at: dateRange - } - , sort: {created_at: 1} - }; - console.log('searching treatments q', tq); - ctx.treatments.list(tq, function (err, results) { - if (!err && results) { - mergeToTreatments(ddata, results); +function loadActivity(ddata, ctx, callback) { + var dateRange = { + $gte: new Date(ddata.lastUpdated - (ONE_DAY * 2)).toISOString() + }; + if (ddata.page && ddata.page.frame) { + dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString(); } - callback(); - }); -} + var q = { + find: { + created_at: dateRange + }, + sort: { + created_at: 1 + } + }; -function loadProfileSwitchTreatments (ddata, ctx, callback) { - var dateRange = { - $gte: new Date(ddata.lastUpdated - (ONE_DAY * 31 * 12)).toISOString() - }; + var activity = []; + ctx.activity.list(q, function(err, results) { - if (ddata.page && ddata.page.frame) { - dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString( ); - } + if (err) { + console.log("Problem loading activity data"); + } - var tq = { - find: { - eventType: 'Profile Switch' - , created_at: dateRange - } - , sort: {created_at: -1} - }; + if (!err && results) { + var activity = []; + results.forEach(function(element) { + if (element) { + if (element.created_at) { + var d = new Date(element.created_at); + activity.push({ + mills: d, + heartrate: element.heartrate, + steps: element.steps, + activitylevel: element.activitylevel + }); + } + } + }); + + ddata.activity = uniq(activity); + } + callback(); + }); +} - ctx.treatments.list(tq, function (err, results) { - if (!err && results) { - mergeToTreatments(ddata, results); +function loadTreatments(ddata, ctx, callback) { + var dateRange = { + $gte: new Date(ddata.lastUpdated - (ONE_DAY * 8)).toISOString() + }; + if (ddata.page && ddata.page.frame) { + dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString(); } + var tq = { + find: { + created_at: dateRange + }, + sort: { + created_at: 1 + } + }; - // Store last profile switch - if (results) { - ddata.lastProfileFromSwitch = null; - var now = new Date().getTime(); - for (var p = 0; p < results.length; p++ ) { - var pdate = new Date(results[p].created_at).getTime(); - if (pdate < now) { - ddata.lastProfileFromSwitch = results[p].profile; - break; + console.log('searching treatments q', tq); + ctx.treatments.list(tq, function(err, results) { + if (!err && results) { + mergeToTreatments(ddata, results); } - } - } - callback(); - }); + callback(); + }); } -function loadSensorAndInsulinTreatments (ddata, ctx, callback) { - var dateRange = { - $gte: new Date(ddata.lastUpdated - (ONE_DAY * 32)).toISOString() - }; - - if (ddata.page && ddata.page.frame) { - dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString( ); - } - - var tq = { - find: { - eventType: { - $in: [ 'Sensor Start', 'Sensor Change', 'Insulin Change', 'Pump Battery Change'] - } - , created_at: dateRange +function loadProfileSwitchTreatments(ddata, ctx, callback) { + var dateRange = { + $gte: new Date(ddata.lastUpdated - (ONE_DAY * 31 * 12)).toISOString() + }; + + if (ddata.page && ddata.page.frame) { + dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString(); } - , sort: {created_at: -1} - }; - ctx.treatments.list(tq, function (err, results) { - if (!err && results) { - mergeToTreatments(ddata, results); + var tq = { + find: { + eventType: 'Profile Switch', + created_at: dateRange + }, + sort: { + created_at: -1 + } + }; + + ctx.treatments.list(tq, function(err, results) { + if (!err && results) { + mergeToTreatments(ddata, results); + } + + // Store last profile switch + if (results) { + ddata.lastProfileFromSwitch = null; + var now = new Date().getTime(); + for (var p = 0; p < results.length; p++) { + var pdate = new Date(results[p].created_at).getTime(); + if (pdate < now) { + ddata.lastProfileFromSwitch = results[p].profile; + break; + } + } + } + + callback(); + }); +} + +function loadSensorAndInsulinTreatments(ddata, ctx, callback) { + var dateRange = { + $gte: new Date(ddata.lastUpdated - (ONE_DAY * 32)).toISOString() + }; + + if (ddata.page && ddata.page.frame) { + dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString(); } - callback(); - }); + var tq = { + find: { + eventType: { + $in: ['Sensor Start', 'Sensor Change', 'Insulin Change', 'Pump Battery Change'] + }, + created_at: dateRange + }, + sort: { + created_at: -1 + } + }; + + ctx.treatments.list(tq, function(err, results) { + if (!err && results) { + mergeToTreatments(ddata, results); + } + + callback(); + }); } -function loadProfile (ddata, ctx, callback) { - ctx.profile.last(function (err, results) { - if (!err && results) { - var profiles = []; - results.forEach(function (element) { - if (element) { - profiles[0] = element; +function loadProfile(ddata, ctx, callback) { + ctx.profile.last(function(err, results) { + if (!err && results) { + var profiles = []; + results.forEach(function(element) { + if (element) { + profiles[0] = element; + } + }); + ddata.profiles = profiles; } - }); - ddata.profiles = profiles; - } - callback(); - }); + callback(); + }); } - function loadFood (ddata, ctx, callback) { - ctx.food.list(function (err, results) { - if (!err && results) { - ddata.food = results; - } - callback(); +function loadFood(ddata, ctx, callback) { + ctx.food.list(function(err, results) { + if (!err && results) { + ddata.food = results; + } + callback(); }); - } - - function loadDeviceStatus (ddata, env, ctx, callback) { - var dateRange = { - $gte: new Date(ddata.lastUpdated - ONE_DAY).toISOString() - }; - if (ddata.page && ddata.page.frame) { - dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString( ); - } - var opts = { - find: { - created_at: dateRange +} + +function loadDeviceStatus(ddata, env, ctx, callback) { + var dateRange = { + $gte: new Date(ddata.lastUpdated - ONE_DAY).toISOString() + }; + if (ddata.page && ddata.page.frame) { + dateRange['$lte'] = new Date(ddata.lastUpdated).toISOString(); } - , sort: {created_at: -1} - }; - - if (env.extendedSettings.devicestatus && env.extendedSettings.devicestatus.advanced) { - //not adding count: 1 restriction - } else { - opts.count = 1; - } - - ctx.devicestatus.list(opts, function (err, results) { - if (!err && results) { - ddata.devicestatus = _.map(results, function eachStatus (result) { - result.mills = new Date(result.created_at).getTime(); - if ('uploaderBattery' in result) { - result.uploader = { - battery: result.uploaderBattery - }; - delete result.uploaderBattery; + var opts = { + find: { + created_at: dateRange + }, + sort: { + created_at: -1 } - return result; - }).reverse(); + }; + + if (env.extendedSettings.devicestatus && env.extendedSettings.devicestatus.advanced) { + //not adding count: 1 restriction } else { - ddata.devicestatus = []; + opts.count = 1; } - callback(); - }); + + ctx.devicestatus.list(opts, function(err, results) { + if (!err && results) { + ddata.devicestatus = _.map(results, function eachStatus(result) { + result.mills = new Date(result.created_at).getTime(); + if ('uploaderBattery' in result) { + result.uploader = { + battery: result.uploaderBattery + }; + delete result.uploaderBattery; + } + return result; + }).reverse(); + } else { + ddata.devicestatus = []; + } + callback(); + }); } -module.exports = init; +module.exports = init; \ No newline at end of file diff --git a/lib/data/ddata.js b/lib/data/ddata.js index 49f874cb2d1..1b799427a55 100644 --- a/lib/data/ddata.js +++ b/lib/data/ddata.js @@ -15,6 +15,7 @@ function init( ) { , profiles: [] , devicestatus: [] , food: [] + , activity: [] , lastUpdated: 0 }; @@ -36,7 +37,7 @@ function init( ) { first: { } , rest: { } }; - + function recent (item) { return item.mills >= time - cutoff; } @@ -44,7 +45,7 @@ function init( ) { function filterMax(item) { return item.mills >= time - max; } - + function partition (field, filter) { var data; if (filter) { @@ -52,7 +53,7 @@ function init( ) { } else { data = ddata[field]; } - + var parts = _.partition(data, recent); result.first[field] = parts[0]; result.rest[field] = parts[1]; @@ -64,7 +65,7 @@ function init( ) { result.first.sgvs = ddata.sgvs.filter(filterMax); result.first.cals = ddata.cals; - + var profiles = _.cloneDeep(ddata.profiles); if (profiles && profiles[0]) for (var k in profiles[0].store) { @@ -78,6 +79,7 @@ function init( ) { result.rest.mbgs = ddata.mbgs.filter(filterMax); result.rest.food = ddata.food; + result.rest.activity = ddata.activity; console.log('results.first size', JSON.stringify(result.first).length,'bytes'); console.log('results.rest size', JSON.stringify(result.rest).length,'bytes'); @@ -127,7 +129,7 @@ function init( ) { .value(); }; - + ddata.processDurations = function processDurations (treatments, keepzeroduration) { treatments = _.uniqBy(treatments, 'mills'); @@ -186,7 +188,12 @@ function init( ) { ddata.insulinchangeTreatments = ddata.treatments.filter( function filterInsulin (t) { return t.eventType.indexOf('Insulin Change') > -1; }).sort(function (a,b) { return a.mills > b.mills; }); - + + // filter & prepare 'Pump Battery Change' events + ddata.batteryTreatments = ddata.treatments.filter( function filterSensor (t) { + return t.eventType.indexOf('Pump Battery Change') > -1; + }).sort(function (a,b) { return a.mills > b.mills; }); + // filter & prepare 'Sensor' events ddata.sensorTreatments = ddata.treatments.filter( function filterSensor (t) { return t.eventType.indexOf('Sensor') > -1; @@ -215,6 +222,17 @@ function init( ) { // filter temp target var tempTargetTreatments = ddata.treatments.filter( function filterTargets (t) { + //check for a units being sent + if (t.units){ + if (t.units == 'mmol'){ + //convert to mgdl + t.targetTop = t.targetTop * 18; + t.targetBottom = t.targetBottom * 18; + } + } + //if we have a temp target thats below 20, assume its mmol and convert to mgdl for safety. + if ( t.targetTop < 20 ) { t.targetTop = t.targetTop * 18; } + if ( t.targetBottom < 20 ) { t.targetBottom = t.targetBottom * 18; } return t.eventType && t.eventType.indexOf('Temporary Target') > -1; }); if (preserveOrignalTreatments) @@ -227,4 +245,4 @@ function init( ) { } -module.exports = init; \ No newline at end of file +module.exports = init; diff --git a/lib/language.js b/lib/language.js index 3216c53dadb..4888ed457b5 100644 --- a/lib/language.js +++ b/lib/language.js @@ -49,7 +49,6 @@ function init() { ,bg: 'Активиране на порта' ,hr: 'Slušanje na portu' ,it: 'Porta in ascolto' - ,dk: 'Lytter på port' ,fi: 'Kuuntelen porttia' ,nb: 'Lytter på port' ,he: 'מקשיב על פתחה' @@ -2041,7 +2040,6 @@ function init() { ,'No API secret hash stored yet. You need to enter API secret.' : { cs: 'Není uložený žádný hash API hesla. Musíte zadat API heslo.' ,de: 'Keine API-Prüfsumme gespeichert. Bitte API-Prüfsumme eingeben.' - ,es: 'No se ha almacenado ningún hash todavía. Debe introducir su API secreto.' ,es: 'No se ha almacenado ningún hash todavía. Debe introducir su secreto API.' ,fr: 'Pas de secret API existant. Vous devez en entrer un.' ,el: 'Δεν υπάρχει αποθηκευμένο συνθηματικό API. Πρέπει να εισάγετε το συνθηματικό API' @@ -4355,6 +4353,29 @@ function init() { ,zh_cn: '静音2小时' ,zh_tw: '靜音2小時' } + ,'2HR' : { + cs: '2hod' + ,de: '2h' + ,es: '2h' + ,fr: '2hr' + ,el: '2 ώρες' + ,pt: '2h' + ,sv: '2tim' + ,ro: '2h' + ,bg: '2часа' + ,hr: '2h' + ,it: '2ORE' + ,dk: '2t' + ,fi: '2h' + ,nb: '2t' + ,pl: '2h' + ,ru: '2ч' + ,sk: '2 hod' + ,nl: '2 uur' + ,ko: '2시간' + ,zh_cn: '2小时' + ,zh_tw: '2小時' + } ,'3HR' : { cs: '3hod' ,de: '3h' @@ -6603,7 +6624,7 @@ function init() { ,fr: 'Cet outil cherche et efface les valeurs CGM dont la date est dans le futur' ,el: 'Αυτή η ενέργεια αφαιρεί δεδομένα αιθητήρα τα οποία εισήχθησαν με λάθος ημερομηνία και ώρα, από τη βάση δεδομένων' ,de: 'Finde und entferne CGM Daten in der Zukunft, die vom Uploader mit falschem Datum/Uhrzeit erstellt wurden.' - ,es: 'Este comando encuentra y elimina datos del sensor futuros creados por actualizaciones con errores en fecha/hora' + ,es: 'Este comando encuentra y elimina datos del sensor futuros creados por actualizaciones con errores en fecha/hora' ,dk: 'Denne handling finder og fjerner CGM data i fremtiden forårsaget af indlæsning med forkert dato/tid.' ,bg: 'Тази опция ще намери и премахне данни от сензора в бъдещето, създадени поради грешна дата/време.' ,ro: 'Instrument de căutare și eliminare a datelor din viitor, create de uploader cu ora setată greșit' @@ -7654,7 +7675,7 @@ function init() { ,fr: 'mg/dL ou mmol/l par unité d\'insuline. Le rapport représentant la modification de la glycémie résultant de l\'administration d\'une unité d\'insuline.' ,el: 'mg/dl ή mmol/L ανά μονάδα U ινσουλίνης. Το πόσες μονάδες ρίχνει τη γλυκόζη αίματος μία μονάδα U ινσουλίνης' ,de: 'mg/dL oder mmol/L pro Einheit Insulin. Verhältnis von BG-Veränderung je Einheit Korrekturinsulin.' - ,es: 'mg/dl o mmol/L por unidad Insulina. La relación de la caída de glucosa y cada unidad de insulina de corrección administrada.' + ,es: 'mg/dl o mmol/L por unidad Insulina. La relación de la caída de glucosa y cada unidad de insulina de corrección administrada.' ,sv: 'mg/dl eller mmol per enhet insulin. Hur varje enhet insulin sänker blodsockret' ,nb: 'mg/dl eller mmol/l per enhet insulin. Beskriver hvor mye blodsukkeret senkes per enhet insulin.' ,fi: 'mg/dL tai mmol/L / 1 yksikkö insuliinia. Suhde, joka kertoo montako yksikköä verensokeria yksi yksikkö insuliinia laskee.' @@ -8184,7 +8205,7 @@ function init() { ,sk: 'Operácia' ,pl: 'Operacja' ,pt: 'Operação' - ,nl: 'Operatie' + ,nl: 'Operatie' ,ko: '동작' ,it: 'Operazione' ,zh_cn: '操作' @@ -9796,7 +9817,7 @@ function init() { ,ro: 'Ignoră alarma de hiper deoarece este suficientă insulină activă IOB' ,fr: 'Alarme haute ignorée car suffisamment d\'insuline à bord (IOB)' ,bg: 'Изключване на аларма за висока КЗ, тъй като има достатъчно IOB' - ,es: 'Ignorar alarma de Hiperglucemia al tener suficiente insulina activa' + ,es: 'Ignorar alarma de Hiperglucemia al tener suficiente insulina activa' ,ru: 'Отключение предупреждение о высоком СК ввиду достаточности инсулина в организме' ,sv: 'Snoozar höglarm då aktivt insulin är tillräckligt' ,nb: 'Utsetter høyalarm siden det er nok aktivt insulin' @@ -9818,7 +9839,7 @@ function init() { ,nb: 'Sjekk blodsukker, på tide med bolus?' ,fi: 'Tarkista VS, aika bolustaa?' ,pt: 'Meça a glicemia, hora de bolus de correção?' - ,es: 'Controle su glucemia, ¿quizás un bolo Insulina?' + ,es: 'Controle su glucemia, ¿quizás un bolo Insulina?' ,sk: 'Skontrolovať glykémiu, čas na bolus?' ,it: 'Controllare BG, il tempo del bolo?' ,nl: 'Controleer BG, tijd om te bolussen?' @@ -11326,6 +11347,46 @@ function init() { , sv: 'no' , zh_cn: 'no' , zh_tw: 'no' + }, + 'alexaUploadBattery': { + en: 'Your uploader battery is at %1' + , de: 'Der Akku deines Uploader Handys ist bei %1' + }, + 'alexaReservoir': { + en: 'You have %1 units remaining' + , de: 'Du hast %1 Einheiten übrig' + }, + 'alexaPumpBattery': { + en: 'Your pump battery is at %1 %2' + , de: 'Der Batteriestand deiner Pumpe ist bei %1 %2' + }, + 'alexaLastLoop': { + en: 'The last successful loop was %1' + , de: 'Der letzte erfolgreiche Loop war vor %1' + }, + 'alexaLoopNotAvailable': { + en: 'Loop plugin does not seem to be enabled' + , de: 'Das Loop Plugin scheint nicht aktiviert zu sein' + }, + 'alexaLoopForecast': { + en: 'According to the loop forecast you are expected to be %1 over the next %2' + , de: 'Entsprechend der Loop Vorhersage landest du bei %1 während der nächsten %2' + }, + 'alexaForecastUnavailable': { + en: 'Unable to forecast with the data that is available', + de: 'Mit den verfügbaren Daten ist eine Loop Vorhersage nicht möglich' + }, + 'alexaRawBG': { + en: 'Your raw bg is %1' + , de: 'Dein Rohblutzucker ist %1' + }, + 'alexaOpenAPSForecast': { + en: 'The OpenAPS Eventual BG is %1' + , de: 'Der von OpenAPS vorhergesagte Blutzucker ist %1' + }, + 'alexaCOB': { + en: '%1 %2 carbohydrates on board' + , de: '%1 %2 Gramm Kohlenhydrate wirkend.' }, 'Fat [g]': { cs: 'Tuk [g]' diff --git a/lib/plugins/batteryage.js b/lib/plugins/batteryage.js new file mode 100644 index 00000000000..ffdb51bc6cc --- /dev/null +++ b/lib/plugins/batteryage.js @@ -0,0 +1,156 @@ +'use strict'; + +var _ = require('lodash'); +var moment = require('moment'); +var levels = require('../levels'); + +function init(ctx) { + var translate = ctx.language.translate; + + var bage = { + name: 'bage' + , label: 'Pump Battery Change' + , pluginType: 'pill-minor' + }; + + bage.getPrefs = function getPrefs(sbx) { + return { + info: sbx.extendedSettings.info || 312 + , warn: sbx.extendedSettings.warn || 336 + , urgent: sbx.extendedSettings.urgent || 360 + , display: sbx.extendedSettings.display ? sbx.extendedSettings.display : 'days' + , enableAlerts: sbx.extendedSettings.enableAlerts || false + }; + }; + + bage.setProperties = function setProperties (sbx) { + sbx.offerProperty('bage', function setProp ( ) { + return bage.findLatestTimeChange(sbx); + }); + }; + + bage.checkNotifications = function checkNotifications(sbx) { + var batteryInfo = sbx.properties.bage; + + if (batteryInfo.notification) { + var notification = _.extend({}, batteryInfo.notification, { + plugin: bage + , debug: { + age: batteryInfo.age + } + }); + sbx.notifications.requestNotify(notification); + } + }; + + bage.findLatestTimeChange = function findLatestTimeChange(sbx) { + + var prefs = bage.getPrefs(sbx); + + var batteryInfo = { + found: false + , age: 0 + , treatmentDate: null + , checkForAlert: false + }; + + var prevDate = 0; + + _.each(sbx.data.batteryTreatments, function eachTreatment (treatment) { + var treatmentDate = treatment.mills; + if (treatmentDate > prevDate && treatmentDate <= sbx.time) { + + prevDate = treatmentDate; + batteryInfo.treatmentDate = treatmentDate; + + var a = moment(sbx.time); + var b = moment(batteryInfo.treatmentDate); + var days = a.diff(b,'days'); + var hours = a.diff(b,'hours') - days * 24; + var age = a.diff(b,'hours'); + + if (!batteryInfo.found || (age >= 0 && age < batteryInfo.age)) { + batteryInfo.found = true; + batteryInfo.age = age; + batteryInfo.days = days; + batteryInfo.hours = hours; + batteryInfo.notes = treatment.notes; + batteryInfo.minFractions = a.diff(b,'minutes') - age * 60; + } + } + }); + + + batteryInfo.level = levels.NONE; + + var sound = 'incoming'; + var message; + var sendNotification = false; + + if (batteryInfo.age >= prefs.urgent) { + sendNotification = batteryInfo.age === prefs.urgent; + message = translate('Pump Battery change overdue!'); + sound = 'persistent'; + batteryInfo.level = levels.URGENT; + } else if (batteryInfo.age >= prefs.warn) { + sendNotification = batteryInfo.age === prefs.warn; + message = translate('Time to change pump battery'); + batteryInfo.level = levels.WARN; + } else if (batteryInfo.age >= prefs.info) { + sendNotification = batteryInfo.age === prefs.info; + message = 'Change pump battery soon'; + batteryInfo.level = levels.INFO; + } + + if (prefs.display === 'days' && batteryInfo.found) { + batteryInfo.display = ''; + if (batteryInfo.age >= 24) { + batteryInfo.display += batteryInfo.days + 'd'; + } + batteryInfo.display += batteryInfo.hours + 'h'; + } else { + batteryInfo.display = batteryInfo.found ? batteryInfo.age + 'h' : 'n/a '; + } + + //allow for 20 minute period after a full hour during which we'll alert the user + if (prefs.enableAlerts && sendNotification && batteryInfo.minFractions <= 20) { + batteryInfo.notification = { + title: translate('Pump battery age %1 hours', { params: [batteryInfo.age] }) + , message: message + , pushoverSound: sound + , level: batteryInfo.level + , group: 'BAGE' + }; + } + + return batteryInfo; + }; + + bage.updateVisualisation = function updateVisualisation (sbx) { + + var batteryInfo = sbx.properties.bage; + + var info = [{ label: translate('Inserted'), value: new Date(batteryInfo.treatmentDate).toLocaleString() }]; + + if (!_.isEmpty(batteryInfo.notes)) { + info.push({label: translate('Notes') + ':', value: batteryInfo.notes}); + } + + var statusClass = null; + if (batteryInfo.level === levels.URGENT) { + statusClass = 'urgent'; + } else if (batteryInfo.level === levels.WARN) { + statusClass = 'warn'; + } + + sbx.pluginBase.updatePillText(bage, { + value: batteryInfo.display + , label: translate('BAGE') + , info: info + , pillClass: statusClass + }); + }; + return bage; +} + +module.exports = init; diff --git a/lib/plugins/careportal.js b/lib/plugins/careportal.js index e65277074cf..b30a51532af 100644 --- a/lib/plugins/careportal.js +++ b/lib/plugins/careportal.js @@ -69,6 +69,10 @@ function init() { , name: 'CGM Sensor Insert' , bg: true, insulin: false, carbs: false, prebolus: false, duration: false, percent: false, absolute: false, profile: false, split: false } + , { val: 'Pump Battery Change' + , name: 'Pump Battery Change' + , bg: true, insulin: false, carbs: false, prebolus: false, duration: false, percent: false, absolute: false, profile: false, split: false + } , { val: 'Insulin Change' , name: 'Insulin Cartridge Change' , bg: true, insulin: false, carbs: false, prebolus: false, duration: false, percent: false, absolute: false, profile: false, split: false @@ -96,4 +100,4 @@ function init() { return careportal; } -module.exports = init; \ No newline at end of file +module.exports = init; diff --git a/lib/plugins/index.js b/lib/plugins/index.js index c874d968ef8..acb7ab22c8a 100644 --- a/lib/plugins/index.js +++ b/lib/plugins/index.js @@ -35,6 +35,7 @@ function init (ctx) { , require('./cannulaage')(ctx) , require('./sensorage')(ctx) , require('./insulinage')(ctx) + , require('./batteryage')(ctx) , require('./basalprofile')(ctx) , require('./boluscalc')(ctx) // fake plugin to show/hide , require('./profile')(ctx) // fake plugin to hold extended settings @@ -57,6 +58,7 @@ function init (ctx) { , require('./cannulaage')(ctx) , require('./sensorage')(ctx) , require('./insulinage')(ctx) + , require('./batteryage')(ctx) , require('./treatmentnotify')(ctx) , require('./timeago')(ctx) , require('./basalprofile')(ctx) diff --git a/lib/plugins/openaps.js b/lib/plugins/openaps.js index 136e901c888..e43af9bff25 100644 --- a/lib/plugins/openaps.js +++ b/lib/plugins/openaps.js @@ -9,13 +9,12 @@ var levels = require('../levels'); function init(ctx) { var utils = require('../utils')(ctx); - var openaps = { name: 'openaps' , label: 'OpenAPS' , pluginType: 'pill-status' }; - + var translate = ctx.language.translate; var firstPrefs = true; openaps.getPrefs = function getPrefs(sbx) { @@ -450,14 +449,22 @@ function init(ctx) { function alexaForecastHandler (next, slots, sbx) { if (sbx.properties.openaps && sbx.properties.openaps.lastEventualBG) { - var response = 'The OpenAPS Eventual BG is ' + sbx.properties.openaps.lastEventualBG; + var response = translate('alexaOpenAPSForecast', { + params: [ + sbx.properties.openaps.lastEventualBG + ]} + ); next('Loop Forecast', response); } } function alexaLastLoopHandler (next, slots, sbx) { console.log(JSON.stringify(sbx.properties.openaps.lastLoopMoment)); - var response = 'The last successful loop was ' + moment(sbx.properties.openaps.lastLoopMoment).from(moment(sbx.time)); + var response = translate('alexaLastLoop', { + params: [ + moment(sbx.properties.openaps.lastLoopMoment).from(moment(sbx.time)) + ] + }); next('Last loop', response); } diff --git a/lib/plugins/pump.js b/lib/plugins/pump.js index 1f8dd958005..ff9e4f98e6c 100644 --- a/lib/plugins/pump.js +++ b/lib/plugins/pump.js @@ -136,14 +136,23 @@ function init (ctx) { }; function alexaReservoirHandler (next, slots, sbx) { - var response = 'You have ' + sbx.properties.pump.pump.reservoir + ' units remaining'; + var response = translate('alexaReservoir', { + params: [ + sbx.properties.pump.pump.reservoir + ] + }); next('Remaining insulin', response); } function alexaBatteryHandler (next, slots, sbx) { var battery = _.get(sbx, 'properties.pump.data.battery'); if (battery) { - var response = 'Your battery is at ' + battery.value + ' ' + battery.unit; + var response = translate('alexaPumpBattery', { + params: [ + battery.value, + battery.unit + ] + }); next('Pump battery', response); } else { next(); diff --git a/lib/plugins/treatmentnotify.js b/lib/plugins/treatmentnotify.js index 98d609bf4da..88aa8f8d8b0 100644 --- a/lib/plugins/treatmentnotify.js +++ b/lib/plugins/treatmentnotify.js @@ -15,13 +15,13 @@ function init() { , pluginType: 'notification' }; - //automated treatments from OpenAPS shouldn't trigger notifications or snooze alarms + //automated treatments from OpenAPS or Loop shouldn't trigger notifications or snooze alarms function filterTreatments (sbx) { var treatments = sbx.data.treatments; treatments = _.filter(treatments, function notOpenAPS (treatment) { var ok = true; - if (treatment.enteredBy && treatment.enteredBy.indexOf('openaps://') === 0) { + if (treatment.enteredBy && treatment.enteredBy.indexOf('openaps://' || 'loop://') === 0) { ok = _.indexOf(OPENAPS_WHITELIST, treatment.eventType) >= 0; } return ok; diff --git a/lib/server/activity.js b/lib/server/activity.js new file mode 100644 index 00000000000..f7df9f48268 --- /dev/null +++ b/lib/server/activity.js @@ -0,0 +1,79 @@ +'use strict'; + +var find_options = require('./query'); + + +function storage (env, ctx) { + var ObjectID = require('mongodb').ObjectID; + + function create (obj, fn) { + obj.created_at = (new Date( )).toISOString( ); + api().insert(obj, function (err, doc) { + fn(null, doc.ops); + }); + } + + function save (obj, fn) { + obj._id = new ObjectID(obj._id); + obj.created_at = (new Date( )).toISOString( ); + api().save(obj, function (err, doc) { + fn(err, doc); + }); + } + + function query_for (opts) { + return find_options(opts, storage.queryOpts); + } + + function list(opts, fn) { + // these functions, find, sort, and limit, are used to + // dynamically configure the request, based on the options we've + // been given + + // determine sort options + function sort ( ) { + return opts && opts.sort || {created_at: -1}; + } + + // configure the limit portion of the current query + function limit ( ) { + if (opts && opts.count) { + return this.limit(parseInt(opts.count)); + } + return this; + } + + // handle all the results + function toArray (err, entries) { + fn(err, entries); + } + + // now just stitch them all together + limit.call(api( ) + .find(query_for(opts)) + .sort(sort( )) + ).toArray(toArray); + } + + function remove (_id, fn) { + return api( ).remove({ '_id': new ObjectID(_id) }, fn); + } + + function api ( ) { + return ctx.store.collection(env.activity_collection); + } + + api.list = list; + api.create = create; + api.query_for = query_for; + api.save = save; + api.remove = remove; + api.indexedFields = ['created_at']; + return api; +} + +module.exports = storage; + +storage.queryOpts = { + dateField: 'created_at' +}; diff --git a/lib/server/bootevent.js b/lib/server/bootevent.js index e5f1e5080b1..1d23ae27a8c 100644 --- a/lib/server/bootevent.js +++ b/lib/server/bootevent.js @@ -118,6 +118,7 @@ function boot (env, language) { ctx.maker = require('../plugins/maker')(env); ctx.pushnotify = require('./pushnotify')(env, ctx); + ctx.activity = require('./activity')(env, ctx); ctx.entries = require('./entries')(env, ctx); ctx.treatments = require('./treatments')(env, ctx); ctx.devicestatus = require('./devicestatus')(env.devicestatus_collection, ctx); @@ -148,6 +149,7 @@ function boot (env, language) { ctx.store.ensureIndexes(ctx.devicestatus( ), ctx.devicestatus.indexedFields); ctx.store.ensureIndexes(ctx.profile( ), ctx.profile.indexedFields); ctx.store.ensureIndexes(ctx.food( ), ctx.food.indexedFields); + ctx.store.ensureIndexes(ctx.activity( ), ctx.activity.indexedFields); next( ); } diff --git a/lib/server/websocket.js b/lib/server/websocket.js index 65c088e1081..aa2eaad8703 100644 --- a/lib/server/websocket.js +++ b/lib/server/websocket.js @@ -4,7 +4,7 @@ var levels = require('../levels'); var times = require('../times'); var calcData = require('../data/calcdelta'); var ObjectID = require('mongodb').ObjectID; - + function init (env, ctx, server) { function websocket ( ) { @@ -17,19 +17,20 @@ function init (env, ctx, server) { var log_reset = '\x1B[0m'; var LOG_WS = log_green + 'WS: ' + log_reset; var LOG_DEDUP = log_magenta + 'DEDUPE: ' + log_reset; - + var io; var watchers = 0; var lastData = {}; var lastProfileSwitch = null; // TODO: this would be better to have somehow integrated/improved - var supportedCollections = { - 'treatments' : env.treatments_collection, + var supportedCollections = { + 'treatments' : env.treatments_collection, 'entries': env.entries_collection, 'devicestatus': env.devicestatus_collection, 'profile': env.profile_collection, - 'food': env.food_collection + 'food': env.food_collection, + 'activity': env.activity_collection }; // This is little ugly copy but I was unable to pass testa after making module from status and share with /api/v1/status @@ -40,10 +41,10 @@ function init (env, ctx, server) { versionNum = 10000 * parseInt(verParse[1]) + 100 * parseInt(verParse[2]) + 1 * parseInt(verParse[3]) ; } var apiEnabled = env.api_secret ? true : false; - + var activeProfile = ctx.ddata.lastProfileFromSwitch; - - var info = { + + var info = { status: 'ok' , name: env.name , version: env.version @@ -55,7 +56,7 @@ function init (env, ctx, server) { , settings: env.settings , extendedSettings: ctx.plugins && ctx.plugins.extendedClientSettings ? ctx.plugins.extendedClientSettings(env.extendedSettings) : {} }; - + if (activeProfile) { info.activeProfile = activeProfile; } @@ -124,7 +125,7 @@ function init (env, ctx, server) { console.log(LOG_WS + 'Disconnected client ID: ',socket.client.id); }); - + function checkConditions (action, data) { var collection = supportedCollections[data.collection]; if (!collection) { @@ -148,7 +149,7 @@ function init (env, ctx, server) { return { result: 'Not permitted' }; } } - + if (action === 'dbUpdate' && !data._id) { console.log('WS dbUpdate/dbAddnot sure abou documentati call: ', 'Missing _id', data); return { result: 'Missing _id' }; @@ -178,7 +179,7 @@ function init (env, ctx, server) { socket.on('dbUpdate', function dbUpdate (data, callback) { console.log(LOG_WS + 'dbUpdate client ID: ', socket.client.id, ' data: ', data); var collection = supportedCollections[data.collection]; - + var check = checkConditions('dbUpdate', data); if (check) { if (callback) { @@ -186,19 +187,25 @@ function init (env, ctx, server) { } return; } - + var id ; + try { + id = new ObjectID(data._id); + } catch (err){ + console.error(err); + id = new ObjectID(); + } ctx.store.collection(collection).update( - { '_id': new ObjectID(data._id) }, + { '_id': id }, { $set: data.data } ); - + if (callback) { callback( { result: 'success' } ); } ctx.bus.emit('data-received'); }); - - // dbUpdateUnset message + + // dbUpdateUnset message // { // collection: treatments // _id: 'some mongo record id' @@ -210,7 +217,7 @@ function init (env, ctx, server) { socket.on('dbUpdateUnset', function dbUpdateUnset (data, callback) { console.log(LOG_WS + 'dbUpdateUnset client ID: ', socket.client.id, ' data: ', data); var collection = supportedCollections[data.collection]; - + var check = checkConditions('dbUpdate', data); if (check) { if (callback) { @@ -218,19 +225,19 @@ function init (env, ctx, server) { } return; } - + ctx.store.collection(collection).update( { '_id': new ObjectID(data._id) }, { $unset: data.data } ); - + if (callback) { callback( { result: 'success' } ); } ctx.bus.emit('data-received'); }); - - // dbAdd message + + // dbAdd message // { // collection: treatments // data: { @@ -242,7 +249,7 @@ function init (env, ctx, server) { console.log(LOG_WS + 'dbAdd client ID: ', socket.client.id, ' data: ', data); var collection = supportedCollections[data.collection]; var maxtimediff = times.mins(1).msecs; - + var check = checkConditions('dbAdd', data); if (check) { if (callback) { @@ -250,14 +257,14 @@ function init (env, ctx, server) { } return; } - + if (data.collection === 'treatments' && !('eventType' in data.data)) { data.data.eventType = ''; } if (!('created_at' in data.data)) { data.data.created_at = new Date().toISOString(); } - + // treatments deduping if (data.collection === 'treatments') { var query; @@ -279,7 +286,7 @@ function init (env, ctx, server) { } return; } - + var selected = false; var query_similiar = { created_at: {$gte: new Date(new Date(data.data.created_at).getTime() - maxtimediff).toISOString(), $lte: new Date(new Date(data.data.created_at).getTime() + maxtimediff).toISOString()} @@ -374,7 +381,7 @@ function init (env, ctx, server) { }); } }); - // dbRemove message + // dbRemove message // { // collection: treatments // _id: 'some mongo record id' @@ -382,7 +389,7 @@ function init (env, ctx, server) { socket.on('dbRemove', function dbRemove (data, callback) { console.log(LOG_WS + 'dbRemove client ID: ', socket.client.id, ' data: ', data); var collection = supportedCollections[data.collection]; - + var check = checkConditions('dbUpdate', data); if (check) { if (callback) { @@ -390,20 +397,20 @@ function init (env, ctx, server) { } return; } - + ctx.store.collection(collection).remove( { '_id': new ObjectID(data._id) } ); - + if (callback) { callback( { result: 'success' } ); } ctx.bus.emit('data-received'); }); - + // Authorization message // { - // client: 'web' | 'phone' | 'pump' + // client: 'web' | 'phone' | 'pump' // , secret: 'secret_hash' // [, history : history_in_hours ] // [, status : true ] @@ -446,10 +453,10 @@ function init (env, ctx, server) { } }); }); - + // Pind message // { - // mills: + // mills: // } socket.on('nsping', function ping (message, callback) { var clientTime = message.mills; @@ -490,7 +497,7 @@ function init (env, ctx, server) { console.info(LOG_WS + 'emitted announcement to all clients'); } }; - + start( ); listeners( ); diff --git a/lib/storage/mongo-storage.js b/lib/storage/mongo-storage.js index 622748f2739..72728e53b1c 100644 --- a/lib/storage/mongo-storage.js +++ b/lib/storage/mongo-storage.js @@ -30,18 +30,22 @@ function init (env, cb, forceNewConnection) { var connect_with_retry = function(i) { return MongoClient.connect(env.storageURI, options, function connected(err, client) { if (err) { - if (err.includes('Invalid schema')) { throw new Error('MongoDB connection string seems invalid'); } - if (i>20) { - // Abort after retrying for more than 10 minutes - throw 'Error connecting to MongoDB, stopping the retry loop and aborting...'; + //console.log('err=', err) + if (err.name && err.name === "MongoNetworkError") { + if (i>20) { + // Abort after retrying for more than 10 minutes + throw 'Error connecting to MongoDB, stopping the retry loop and aborting...'; + } + console.log('Error connecting to MongoDB: %j - retrying in ' + i*3 + ' sec', err); + setTimeout(connect_with_retry, i*3000, i+1); + } else if (err.message) { + throw new Error('MongoDB connection string '+env.storageURI+' seems invalid: '+err.message) ; } - console.log('Error connecting to MongoDB: %j - retrying in ' + i*3 + ' sec', err); - setTimeout(connect_with_retry, i*3000, i+1); } else { console.log('Successfully established a connected to MongoDB'); - var dbName = env.storageURI.split('?').pop().split('/'); - dbName = dbName[dbName.length -1]; + var dbName = env.storageURI.split('/').pop().split('?'); + dbName=dbName[0]; // drop Connection Options mongo.db = client.db(dbName); connection = mongo.db; mongo.client = client; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 0263db9d211..ac20968a4b9 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -4,12 +4,27 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@braintree/sanitize-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-2.1.0.tgz", + "integrity": "sha1-VJqdH5I8m8eVOlhdPpqpQpvo/ig=" + }, + "@types/inline-style-prefixer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/inline-style-prefixer/-/inline-style-prefixer-3.0.1.tgz", + "integrity": "sha512-+kbOcYW1/noncDwRryRoB9tH87IYcMfdBGvw98iocK39LtTA2DFL7agmk4UHW/GxjzVfwrxfjlLrqrgA7MCtmg==" + }, "@types/node": { "version": "6.0.83", "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.83.tgz", "integrity": "sha512-Q92+tkWnX7nmT0ZG+/wFxzJr+idr00T12MgsY3p0sZIu8nfvYF8i5pbY3BVZw6ad6yS2MLF71sfMr+ySatc2Gw==", "dev": true }, + "@types/react": { + "version": "16.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.0.38.tgz", + "integrity": "sha512-t0XJHNrlzLiVAKCWxS9zzAadoQO8zGFpHsrvNVk7QmrDXnm3cPFy2wFcHGNbKjntBiXznL6qQkh+a1Wxu21+dA==" + }, "abab": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz", @@ -58,11 +73,10 @@ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" }, "ajv": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.1.tgz", - "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.1.1.tgz", + "integrity": "sha1-l41Zf7wrfQ5aXD3esUmmgvKr+g4=", "requires": { - "co": "4.6.0", "fast-deep-equal": "1.0.0", "fast-json-stable-stringify": "2.0.0", "json-schema-traverse": "0.3.1" @@ -100,6 +114,12 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "optional": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -162,6 +182,12 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "optional": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -172,6 +198,20 @@ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "optional": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -187,6 +227,11 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, "ascli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", @@ -202,9 +247,9 @@ "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=" }, "asn1.js": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { "bn.js": "4.11.8", "inherits": "2.0.3", @@ -245,6 +290,11 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "autolinker": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=" + }, "autoprefixer": { "version": "6.7.7", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", @@ -278,6 +328,15 @@ "js-tokens": "3.0.2" } }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -294,9 +353,9 @@ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" }, "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", + "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==" }, "base64id": { "version": "1.0.0", @@ -308,6 +367,12 @@ "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "optional": true + }, "bcrypt-pbkdf": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", @@ -335,6 +400,25 @@ "callsite": "1.0.0" } }, + "bfj-node4": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bfj-node4/-/bfj-node4-5.2.1.tgz", + "integrity": "sha512-w+OTPD/R0AvDVR/sy/uVUVeoCpEgUoYj9/1P2zB6mR1yx7F/ADzLX4nlvZ/91WWzGgdZnuLxWP/J89D7ZDt0DA==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "check-types": "7.3.0", + "tryer": "1.0.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + } + } + }, "big.js": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", @@ -428,6 +512,28 @@ } } }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "optional": true, + "requires": { + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "optional": true + } + } + }, "boom": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", @@ -444,6 +550,19 @@ "chainsaw": "0.1.0" } }, + "bowser": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.2.tgz", + "integrity": "sha512-fuiANC1Bqbqa/S4gmvfCt7bGBmNELMsGZj4Wg3PrP6esP66Ttoj1JSlzFlXtHyduMv07kDNmDsX6VsMWT/MLGg==" + }, + "brace": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/brace/-/brace-0.7.0.tgz", + "integrity": "sha1-kGUdpb1Ibtu0GIjex4r9zQc3WyE=", + "requires": { + "w3c-blob": "0.0.1" + } + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -558,7 +677,7 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { "bn.js": "4.11.8", - "randombytes": "2.0.5" + "randombytes": "2.0.6" } }, "browserify-sign": { @@ -597,12 +716,17 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" }, + "btoa": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.1.2.tgz", + "integrity": "sha1-PkC4FmP4HS3WWWpMtxSo3BbPq+A=" + }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "1.2.1", + "base64-js": "1.2.3", "ieee754": "1.1.8", "isarray": "1.0.0" } @@ -612,6 +736,12 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "optional": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -695,6 +825,24 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "optional": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "optional": true + } + } + }, "caniuse-api": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", @@ -752,6 +900,12 @@ "supports-color": "2.0.0" } }, + "check-types": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.3.0.tgz", + "integrity": "sha1-Ro9XGkQ1wkJI9f0MsOjYfDw0Hn0=", + "dev": true + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -785,6 +939,11 @@ "chalk": "1.1.3" } }, + "classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + }, "clear-require": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/clear-require/-/clear-require-2.0.0.tgz", @@ -921,11 +1080,48 @@ "resolved": "https://registry.npmjs.org/common/-/common-0.2.5.tgz", "integrity": "sha1-PHGC9ni9HjaBzVzDSMdZ/o3SI5Q=" }, + "commonmark": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.28.1.tgz", + "integrity": "sha1-Buq41SM4uDn6Gi11rwCF7tGxvq4=", + "requires": { + "entities": "1.1.1", + "mdurl": "1.0.1", + "minimist": "1.2.0", + "string.prototype.repeat": "0.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "commonmark-react-renderer": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/commonmark-react-renderer/-/commonmark-react-renderer-4.3.4.tgz", + "integrity": "sha512-+/Rzo3sI37NR8LaVdkUiqBH3+CEW75hc86shwY4E9eEERg78VCy4rSkaP/p7OG5bTvosUMkvhn5d1ZJ5iyt/ag==", + "requires": { + "lodash.assign": "4.2.0", + "lodash.isplainobject": "4.0.6", + "pascalcase": "0.1.1", + "xss-filters": "1.2.7" + } + }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" }, + "component-clone": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/component-clone/-/component-clone-0.2.2.tgz", + "integrity": "sha1-x/WXmCKID62M+wliuikYbQYe4E8=", + "requires": { + "component-type": "1.1.0" + } + }, "component-emitter": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", @@ -936,6 +1132,34 @@ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, + "component-raf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/component-raf/-/component-raf-1.2.0.tgz", + "integrity": "sha1-srxy1D8bAU/eeks8RHx2S8c8y6o=" + }, + "component-tween": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/component-tween/-/component-tween-1.2.0.tgz", + "integrity": "sha1-zDnOXbqwW1KCX0HRlHY4oLAbK4o=", + "requires": { + "component-clone": "0.2.2", + "component-emitter": "1.2.0", + "component-type": "1.1.0", + "ease-component": "1.0.0" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.0.tgz", + "integrity": "sha1-zNETqGOI0GSC0D3j/H35hSa6jv4=" + } + } + }, + "component-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.1.0.tgz", + "integrity": "sha1-lbZmqtU+XI0fK+E1xFtdSZGXwMU=" + }, "compressible": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", @@ -1002,6 +1226,12 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "optional": true + }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", @@ -1052,6 +1282,11 @@ "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", "dev": true }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1074,7 +1309,7 @@ "cipher-base": "1.0.4", "inherits": "2.0.3", "ripemd160": "2.0.1", - "sha.js": "2.4.9" + "sha.js": "2.4.10" } }, "create-hmac": { @@ -1087,7 +1322,33 @@ "inherits": "2.0.3", "ripemd160": "2.0.1", "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "sha.js": "2.4.10" + } + }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + }, + "cross-fetch": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-0.0.8.tgz", + "integrity": "sha1-Ae2U3EB98sAPGAf95wCnz6SKIFw=", + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.3" + }, + "dependencies": { + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + } } }, "cross-spawn": { @@ -1122,8 +1383,8 @@ "inherits": "2.0.3", "pbkdf2": "3.0.14", "public-encrypt": "4.0.0", - "randombytes": "2.0.5", - "randomfill": "1.0.3" + "randombytes": "2.0.6", + "randomfill": "1.0.4" } }, "css-color-names": { @@ -1131,6 +1392,14 @@ "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" }, + "css-in-js-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.0.tgz", + "integrity": "sha512-yuWmPMD9FLi50Xf3k8W8oO3WM1eVnxEGCldCLyfusQ+CgivFk0s23yst4ooW6tfxMuSa03S6uUEga9UhX6GRrA==", + "requires": { + "hyphenate-style-name": "1.0.2" + } + }, "css-loader": { "version": "0.28.9", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.9.tgz", @@ -1162,6 +1431,11 @@ "regexpu-core": "1.0.0" } }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + }, "cssesc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", @@ -1240,6 +1514,15 @@ "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=" }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "optional": true, + "requires": { + "array-find-index": "1.0.2" + } + }, "cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", @@ -1250,7 +1533,7 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "0.10.37" + "es5-ext": "0.10.39" } }, "d3": { @@ -1291,6 +1574,11 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "deep-diff": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", + "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" + }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -1299,8 +1587,7 @@ "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "optional": true + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, "deep-is": { "version": "0.1.3", @@ -1308,11 +1595,34 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "optional": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1349,6 +1659,12 @@ "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", "optional": true }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "optional": true + }, "diff": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", @@ -1362,7 +1678,7 @@ "requires": { "bn.js": "4.11.8", "miller-rabin": "4.0.1", - "randombytes": "2.0.5" + "randombytes": "2.0.6" } }, "director": { @@ -1370,16 +1686,84 @@ "resolved": "https://registry.npmjs.org/director/-/director-1.2.7.tgz", "integrity": "sha1-v9N0EHX9f7GlsuE2WMX0vsd3NvM=" }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "optional": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "optional": true, + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "optional": true, + "requires": { + "buffer-indexof": "1.1.1" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + } + } + }, "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, + "ease-component": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ease-component/-/ease-component-1.0.0.tgz", + "integrity": "sha1-s3VybbC1sEWVt3RAOW/sfapdd8k=" + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -1432,11 +1816,24 @@ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, + "encode-3986": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/encode-3986/-/encode-3986-1.0.0.tgz", + "integrity": "sha1-lA1RSY+HQa3hhLda0UObMXwMemA=" + }, "encodeurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.19" + } + }, "engine.io": { "version": "1.8.4", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.4.tgz", @@ -1537,12 +1934,17 @@ "tapable": "0.2.8" } }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "0.0.0" + "prr": "1.0.1" } }, "error-ex": { @@ -1562,10 +1964,32 @@ "escape-html": "1.0.3" } }, + "es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, "es5-ext": { - "version": "0.10.37", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", - "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "version": "0.10.39", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.39.tgz", + "integrity": "sha512-AlaXZhPHl0po/uxMx1tyrlt1O86M6D5iVaDH8UgLfgek4kXTX6vzsRfJQWC2Ku+aG8pkw1XWzh9eTkwfVrsD5g==", "requires": { "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" @@ -1577,7 +2001,7 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.39", "es6-symbol": "3.1.1" } }, @@ -1587,7 +2011,7 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.39", "es6-iterator": "2.0.3", "es6-set": "0.1.5", "es6-symbol": "3.1.1", @@ -1600,7 +2024,7 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.39", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -1612,7 +2036,7 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37" + "es5-ext": "0.10.39" } }, "es6-weak-map": { @@ -1621,7 +2045,7 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.39", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } @@ -1713,7 +2137,7 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.37" + "es5-ext": "0.10.39" } }, "event-stream": { @@ -1735,11 +2159,26 @@ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=" }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "optional": true + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "optional": true, + "requires": { + "original": "1.0.0" + } + }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -1790,6 +2229,20 @@ "repeat-string": "0.2.2" } }, + "expect": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-1.20.2.tgz", + "integrity": "sha1-1Fj+TFYAQDa64yMkFqP2Nh8E+WU=", + "requires": { + "define-properties": "1.1.2", + "has": "1.0.1", + "is-equal": "1.5.5", + "is-regex": "1.0.4", + "object-inspect": "1.5.0", + "object-keys": "1.0.11", + "tmatch": "2.0.1" + } + }, "expose-loader": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.4.tgz", @@ -1944,6 +2397,11 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" }, + "fast-json-patch": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-1.2.2.tgz", + "integrity": "sha1-03fZfGkR290qHIC/rNoEik+Du/k=" + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -1960,6 +2418,36 @@ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "optional": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.17" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, "file-loader": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.6.tgz", @@ -1974,7 +2462,20 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "requires": { - "ajv": "5.5.1" + "ajv": "5.5.2" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } } } } @@ -1985,9 +2486,9 @@ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" }, "filesize": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.0.tgz", + "integrity": "sha512-g5OWtoZWcPI56js1DFhIEqyG9tnu/7sG3foHwgS9KGYFMfsYguI3E+PRVCmtmE96VajQIEMRU2OhN+ME589Gdw==", "dev": true }, "fill-range": { @@ -2047,11 +2548,12 @@ } }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "locate-path": "2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "flatiron": { @@ -2099,6 +2601,11 @@ "for-in": "1.0.2" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, "forever": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/forever/-/forever-0.15.3.tgz", @@ -2165,7 +2672,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { - "lodash": "4.17.4" + "lodash": "4.17.5" } } } @@ -2429,11 +2936,22 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "optional": true + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, + "getbase": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/getbase/-/getbase-2.8.2.tgz", + "integrity": "sha1-ytdX/7K19THTKtb6xIceYmpMCcs=" + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -2479,6 +2997,27 @@ "is-glob": "2.0.1" } }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "optional": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "optional": true + } + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -2497,14 +3036,21 @@ "dev": true }, "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", + "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=", "dev": true, "requires": { - "duplexer": "0.1.1" + "duplexer": "0.1.1", + "pify": "3.0.0" } }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "optional": true + }, "handlebars": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", @@ -2661,11 +3207,28 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, + "hoist-non-react-statics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" + }, "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "optional": true, + "requires": { + "inherits": "2.0.3", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "wbuf": "1.7.2" + } + }, "html-comment-regex": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", @@ -2680,6 +3243,31 @@ "whatwg-encoding": "1.0.1" } }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "optional": true + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.7.0", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "optional": true + }, "http-errors": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", @@ -2691,6 +3279,50 @@ "statuses": "1.4.0" } }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "optional": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "optional": true, + "requires": { + "http-proxy": "1.16.2", + "is-glob": "3.1.0", + "lodash": "4.17.5", + "micromatch": "2.3.11" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "optional": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, "http-signature": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", @@ -2706,6 +3338,11 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "hyphenate-style-name": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", + "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=" + }, "i": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", @@ -2792,6 +3429,25 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "optional": true, + "requires": { + "repeating": "2.0.1" + } + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -2821,16 +3477,48 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" }, + "inline-style-prefixer": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz", + "integrity": "sha1-hVG45bTVcyROZqNLBPfTIHaitTQ=", + "requires": { + "bowser": "1.9.2", + "css-in-js-utils": "2.0.0" + } + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "optional": true, + "requires": { + "meow": "3.7.0" + } + }, "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "optional": true + }, "ipaddr.js": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", @@ -2846,6 +3534,14 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, + "is-arrow-function": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-arrow-function/-/is-arrow-function-2.0.3.tgz", + "integrity": "sha1-Kb4sLY2UUIUri7r7Y1unuNjofsI=", + "requires": { + "is-callable": "1.1.3" + } + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -2854,6 +3550,11 @@ "binary-extensions": "1.8.0" } }, + "is-boolean-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=" + }, "is-buffer": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", @@ -2867,11 +3568,39 @@ "builtin-modules": "1.1.1" } }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, + "is-equal": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/is-equal/-/is-equal-1.5.5.tgz", + "integrity": "sha1-XoXxlX4FKIMkf+s4aWWju6Ffuz0=", + "requires": { + "has": "1.0.1", + "is-arrow-function": "2.0.3", + "is-boolean-object": "1.0.0", + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-generator-function": "1.0.7", + "is-number-object": "1.0.3", + "is-regex": "1.0.4", + "is-string": "1.0.4", + "is-symbol": "1.0.1", + "object.entries": "1.0.4" + } + }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", @@ -2890,6 +3619,15 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "optional": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -2898,6 +3636,11 @@ "number-is-nan": "1.0.1" } }, + "is-generator-function": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", + "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" + }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -2922,6 +3665,35 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=" }, + "is-number-object": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=" + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "optional": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "optional": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "optional": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -2937,16 +3709,34 @@ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "1.0.1" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=" + }, "is-svg": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", @@ -2955,21 +3745,26 @@ "html-comment-regex": "1.1.1" } }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isemail": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", - "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2983,6 +3778,23 @@ "isarray": "1.0.0" } }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "0.11.1" + } + }, + "isomorphic-form-data": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-0.0.1.tgz", + "integrity": "sha1-Am9ifgMrDNhBPsyHVZKLlKRosGI=", + "requires": { + "form-data": "1.0.1" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -3059,17 +3871,6 @@ } } }, - "joi": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", - "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", - "requires": { - "hoek": "2.16.3", - "isemail": "1.2.0", - "moment": "2.19.3", - "topo": "1.1.0" - } - }, "jquery": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", @@ -3107,7 +3908,6 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.0.tgz", "integrity": "sha512-0LoUNELX4S+iofCT8f4uEHIiRBR+c2AINyC8qRWfC6QNruLtxVZRJaPcu/xwMgFIgDxF25tGHaDjvxzJCNE9yw==", - "dev": true, "requires": { "argparse": "1.0.9", "esprima": "4.0.0" @@ -3116,8 +3916,7 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" } } }, @@ -3217,15 +4016,27 @@ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" }, "jsonwebtoken": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz", - "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.1.tgz", + "integrity": "sha512-+ijVOtfLMlCII8LJkvabaKX3+8tGrGjiCTfzoed2D1b/ebKTO1hIYBQUJHbd9dJ9Fa4kH+dhYEd1qDwyzDLUUw==", "requires": { - "joi": "6.10.1", "jws": "3.1.4", + "lodash.includes": "4.3.0", + "lodash.isboolean": "3.0.3", + "lodash.isinteger": "4.0.4", + "lodash.isnumber": "3.0.3", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", "lodash.once": "4.1.1", - "ms": "2.0.0", + "ms": "2.1.1", "xtend": "4.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, "jsprim": { @@ -3303,15 +4114,31 @@ "type-check": "0.3.2" } }, + "lie": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.2.0.tgz", + "integrity": "sha512-VhoCwA12FP8oixbhyjg1leSNePhF3y966Xdo3o0wAMQUoQ4g9a9vt3o6I3ob3PrNx4MCBJtHXEY+UpVZKhiscQ==", + "requires": { + "immediate": "3.0.6" + } + }, "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { "graceful-fs": "4.1.11", "parse-json": "2.2.0", "pify": "2.3.0", - "strip-bom": "3.0.0" + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } } }, "loader-runner": { @@ -3336,12 +4163,24 @@ "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + }, + "lodash-es": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.5.tgz", + "integrity": "sha512-Ez3ONp3TK9gX1HYKp6IhetcVybD+2F+Yp6GS9dfH8ue6EOCEzQtQEh4K0FYWBP9qLv+lzeQAYXw+3ySfxyZqkw==" }, "lodash._baseassign": { "version": "3.2.0", @@ -3368,8 +4207,7 @@ "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" }, "lodash._isiterateecall": { "version": "3.0.9", @@ -3377,11 +4215,21 @@ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", "dev": true }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "lodash.create": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", @@ -3393,23 +4241,55 @@ "lodash._isiterateecall": "3.0.9" } }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" }, "lodash.isarray": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, "requires": { "lodash._getnative": "3.9.1", "lodash.isarguments": "3.1.0", @@ -3421,6 +4301,11 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==" + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -3447,6 +4332,24 @@ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "optional": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", @@ -3456,16 +4359,37 @@ "yallist": "2.1.2" } }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "requires": { + "es5-ext": "0.10.39" + } + }, "macaddress": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=" }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, "map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" }, + "matcher": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-0.1.2.tgz", + "integrity": "sha1-7yDL3mTCTFDMYa9bg+4LG4/wAQE=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, "math-expression-evaluator": { "version": "1.2.17", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", @@ -3491,6 +4415,11 @@ } } }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -3501,7 +4430,22 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "1.2.0" + } + }, + "memoizee": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.1.tgz", + "integrity": "sha1-aT9TgM2ASjmR662gAXnGtWWjr6s=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.39", + "es6-weak-map": "2.0.2", + "event-emitter": "0.3.5", + "is-promise": "2.1.0", + "lru-queue": "0.1.0", + "next-tick": "1.0.0", + "timers-ext": "0.1.2" } }, "memory-fs": { @@ -3509,10 +4453,36 @@ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { - "errno": "0.1.4", + "errno": "0.1.7", "readable-stream": "2.3.3" } }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "optional": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -3523,6 +4493,11 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "mfb": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/mfb/-/mfb-0.12.0.tgz", + "integrity": "sha1-E+HUekDyF04sLEcFJKh8BNXKY38=" + }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", @@ -3592,9 +4567,9 @@ } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimalistic-assert": { "version": "1.0.0", @@ -3749,16 +4724,16 @@ } }, "moment": { - "version": "2.19.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.3.tgz", - "integrity": "sha1-vbmdJw1tf9p4zA+6zoVeJ/59pp8=" + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", + "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" }, "moment-timezone": { "version": "0.5.14", "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.14.tgz", "integrity": "sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE=", "requires": { - "moment": "2.19.3" + "moment": "2.20.1" } }, "mongodb": { @@ -3822,6 +4797,22 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "optional": true, + "requires": { + "dns-packet": "1.3.1", + "thunky": "1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "optional": true + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -3869,13 +4860,18 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "node-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.1.1.tgz", "integrity": "sha1-CFJGRe5AOd7cPcwd18a5eeBhnkQ=", "requires": { "clone": "2.1.1", - "lodash": "4.17.4" + "lodash": "4.17.5" }, "dependencies": { "clone": { @@ -3885,6 +4881,21 @@ } } }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node-forge": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", + "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=", + "optional": true + }, "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", @@ -3896,7 +4907,7 @@ "console-browserify": "1.1.0", "constants-browserify": "1.0.0", "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", + "domain-browser": "1.2.0", "events": "1.1.1", "https-browserify": "1.0.0", "os-browserify": "0.3.0", @@ -3906,9 +4917,9 @@ "querystring-es3": "0.2.1", "readable-stream": "2.3.3", "stream-browserify": "2.0.1", - "stream-http": "2.7.2", + "stream-http": "2.8.0", "string_decoder": "1.0.3", - "timers-browserify": "2.0.4", + "timers-browserify": "2.0.6", "tty-browserify": "0.0.0", "url": "0.11.0", "util": "0.10.3", @@ -4166,6 +5177,27 @@ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" }, + "object-inspect": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.5.0.tgz", + "integrity": "sha512-UmOFbHbwvv+XHj7BerrhVq+knjceBdkvU5AriwLMvhv2qi+e7DJzxfBeFpILEjVzCp+xA+W/pIf06RGPWlZNfw==" + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + }, + "object.entries": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", + "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.10.0", + "function-bind": "1.1.1", + "has": "1.0.1" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -4175,6 +5207,11 @@ "is-extendable": "0.1.1" } }, + "obuf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -4202,6 +5239,16 @@ "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", "dev": true }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "optional": true, + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -4243,24 +5290,50 @@ "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "os-homedir": { + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "optional": true, + "requires": { + "url-parse": "1.0.5" + }, + "dependencies": { + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "optional": true + }, + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "optional": true, + "requires": { + "querystringify": "0.0.4", + "requires-port": "1.0.0" + } + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "optional": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "lcid": "1.0.0" } }, "os-tmpdir": { @@ -4283,18 +5356,32 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "requires": { + "p-try": "1.0.0" + } }, "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "1.1.0" + "p-limit": "1.2.0" } }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "optional": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -4305,7 +5392,7 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", "requires": { - "asn1.js": "4.9.2", + "asn1.js": "4.10.1", "browserify-aes": "1.1.1", "create-hash": "1.1.3", "evp_bytestokey": "1.0.3", @@ -4374,21 +5461,35 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "2.0.1" + } }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "optional": true + }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -4400,11 +5501,20 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "pify": "2.3.0" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } } }, "pause-stream": { @@ -4424,7 +5534,7 @@ "create-hmac": "1.1.6", "ripemd160": "2.0.1", "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "sha.js": "2.4.10" } }, "performance-now": { @@ -4433,9 +5543,22 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } }, "pkginfo": { "version": "0.3.1", @@ -4448,6 +5571,25 @@ "integrity": "sha1-HPWjCw2AbNGPiPxBprXUrWFbO6k=", "dev": true }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "optional": true, + "requires": { + "async": "1.5.2", + "debug": "2.6.7", + "mkdirp": "0.5.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "optional": true + } + } + }, "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", @@ -5034,6 +6176,23 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "promise-worker": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-worker/-/promise-worker-1.1.1.tgz", + "integrity": "sha1-wrddBF0kliXAImTi3/mtIuAxxps=", + "requires": { + "is-promise": "2.1.0", + "lie": "3.2.0" + } + }, "prompt": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", @@ -5046,6 +6205,16 @@ "winston": "0.8.3" } }, + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + }, "protobufjs": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-3.2.4.tgz", @@ -5065,9 +6234,9 @@ } }, "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, "ps-tree": { "version": "0.0.3", @@ -5109,7 +6278,7 @@ "browserify-rsa": "4.0.1", "create-hash": "1.1.3", "parse-asn1": "5.1.0", - "randombytes": "2.0.5" + "randombytes": "2.0.6" } }, "punycode": { @@ -5151,6 +6320,19 @@ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" + }, + "raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "requires": { + "performance-now": "2.1.0" + } + }, "random-token": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/random-token/-/random-token-0.0.8.tgz", @@ -5194,19 +6376,19 @@ } }, "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "requires": { "safe-buffer": "5.1.1" } }, "randomfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { - "randombytes": "2.0.5", + "randombytes": "2.0.6", "safe-buffer": "5.1.1" } }, @@ -5246,6 +6428,195 @@ } } }, + "react": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", + "requires": { + "create-react-class": "15.6.3", + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" + } + }, + "react-addons-perf": { + "version": "15.4.2", + "resolved": "https://registry.npmjs.org/react-addons-perf/-/react-addons-perf-15.4.2.tgz", + "integrity": "sha1-EQvc9cRZxPd8uF7WNLzTOXU2ODs=", + "requires": { + "fbjs": "0.8.16", + "object-assign": "4.1.1" + } + }, + "react-addons-shallow-compare": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/react-addons-shallow-compare/-/react-addons-shallow-compare-0.14.8.tgz", + "integrity": "sha1-HyZTPXjK2r9GOXVuwNrlq0VCenQ=" + }, + "react-addons-test-utils": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-addons-test-utils/-/react-addons-test-utils-15.6.2.tgz", + "integrity": "sha1-wStu/cIkfBDae4dw0YUICnsEcVY=" + }, + "react-collapse": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-collapse/-/react-collapse-4.0.3.tgz", + "integrity": "sha512-OO4NhtEqFtz+1ma31J1B7+ezdRnzHCZiTGSSd/Pxoks9hxrZYhzFEddeYt05A/1477xTtdrwo7xEa2FLJyWGCQ==", + "requires": { + "prop-types": "15.6.0" + } + }, + "react-dom": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", + "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" + } + }, + "react-height": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-height/-/react-height-2.2.1.tgz", + "integrity": "sha1-CQINnSKkgSGno4E14jRStH96mH8=", + "requires": { + "create-react-class": "15.5.2", + "prop-types": "15.5.8" + }, + "dependencies": { + "create-react-class": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.5.2.tgz", + "integrity": "sha1-aodYNI32YLiDJqDnZNVp8nSq1oE=", + "requires": { + "fbjs": "0.8.16", + "object-assign": "4.1.1" + } + }, + "prop-types": { + "version": "15.5.8", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.8.tgz", + "integrity": "sha1-a3suFBCDvjjIWVqlH8VXdccZk5Q=", + "requires": { + "fbjs": "0.8.16" + } + } + } + }, + "react-hot-api": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/react-hot-api/-/react-hot-api-0.4.7.tgz", + "integrity": "sha1-p+IqVtJS4Rq9k2a2EmTPRJLFgXE=" + }, + "react-hot-loader": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-1.3.1.tgz", + "integrity": "sha1-yVZHrni3Pfzv9uxx/8sEGC/22vk=", + "requires": { + "react-hot-api": "0.4.7", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "react-immutable-proptypes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.1.0.tgz", + "integrity": "sha1-Aj1vObsVyXwHHp5g0A0TbqxfoLQ=" + }, + "react-immutable-pure-component": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/react-immutable-pure-component/-/react-immutable-pure-component-1.1.1.tgz", + "integrity": "sha512-/SEHxOlbPpfsqRmTXiLetOSUexnKeY7CfrKfdyPudCpFyGNcPXtbtq0cgeVPmo4NyxeluYrq0FZSMhXj6ICtOA==" + }, + "react-markdown": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-2.5.1.tgz", + "integrity": "sha512-N5xMde42RrclLIdF16bckTApFM56vkn4q3GoZlLkuE8IK23GOIqJsuE62RTrkgq//pAt4dovVgZcgawh7YtN4w==", + "requires": { + "commonmark": "0.24.0", + "commonmark-react-renderer": "4.3.4", + "prop-types": "15.6.0" + }, + "dependencies": { + "commonmark": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.24.0.tgz", + "integrity": "sha1-uA3gGCxUY1VkOqFdsSv7KCNoJ48=", + "requires": { + "entities": "1.1.1", + "mdurl": "1.0.1", + "string.prototype.repeat": "0.2.0" + } + } + } + }, + "react-motion": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", + "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", + "requires": { + "performance-now": "0.2.0", + "prop-types": "15.6.0", + "raf": "3.4.0" + }, + "dependencies": { + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + } + } + }, + "react-object-inspector": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/react-object-inspector/-/react-object-inspector-0.2.1.tgz", + "integrity": "sha1-jsMpUb3ox2sHLvCEp056nS0K63I=" + }, + "react-redux": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-4.4.8.tgz", + "integrity": "sha1-57wd0QDotk6WrIIS2xEyObni4I8=", + "requires": { + "create-react-class": "15.6.3", + "hoist-non-react-statics": "1.2.0", + "invariant": "2.2.2", + "lodash": "4.17.5", + "loose-envify": "1.3.1", + "prop-types": "15.6.0" + } + }, + "react-split-pane": { + "version": "0.1.70", + "resolved": "https://registry.npmjs.org/react-split-pane/-/react-split-pane-0.1.70.tgz", + "integrity": "sha512-vXLE4gTI9gTFXEaX2pKKyZilwDsxGVmAQi7yombplzzj2oBY/fmd3o4DlNSMN43m9XchtStcWri9mOrBx3yMiQ==", + "requires": { + "@types/inline-style-prefixer": "3.0.1", + "@types/react": "16.0.38", + "inline-style-prefixer": "3.0.8", + "prop-types": "15.6.0", + "react-style-proptype": "3.2.0" + } + }, + "react-style-proptype": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-style-proptype/-/react-style-proptype-3.2.0.tgz", + "integrity": "sha512-Mafmkzj3oNmLSJNOlH+WWWyGIdzVLhPj+d12fDxQMQdwDQ5sMX7vQKOLpry4U+zRWieTCx448AyRKK0NLWuXmg==", + "requires": { + "prop-types": "15.6.0" + } + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -5255,22 +6626,22 @@ } }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "2.0.0", + "load-json-file": "1.1.0", "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "path-type": "1.1.0" } }, "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" } }, "readable-stream": { @@ -5298,6 +6669,16 @@ "set-immediate-shim": "1.0.1" } }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "optional": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, "reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", @@ -5330,11 +6711,43 @@ } } }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "4.17.5", + "lodash-es": "4.17.5", + "loose-envify": "1.3.1", + "symbol-observable": "1.2.0" + } + }, + "redux-immutable": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-3.0.8.tgz", + "integrity": "sha1-31pdYByIInujj0dM+C99AOVvjBQ=", + "requires": { + "immutable": "3.8.2" + } + }, + "redux-logger": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", + "integrity": "sha1-91VZZvMJjzyIYExEnPC69XeCdL8=", + "requires": { + "deep-diff": "0.3.8" + } + }, "regenerate": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, "regex-cache": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", @@ -5367,6 +6780,26 @@ "jsesc": "0.5.0" } }, + "remarkable": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", + "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", + "requires": { + "argparse": "0.1.16", + "autolinker": "0.15.3" + }, + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "requires": { + "underscore": "1.7.0", + "underscore.string": "2.4.0" + } + } + } + }, "remove-trailing-separator": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", @@ -5382,6 +6815,15 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=" }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "optional": true, + "requires": { + "is-finite": "1.0.2" + } + }, "request": { "version": "2.83.0", "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", @@ -5467,8 +6909,21 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.1", + "ajv": "5.5.2", "har-schema": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } } }, "hawk": { @@ -5547,7 +7002,7 @@ "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "request-promise-native": { @@ -5580,6 +7035,16 @@ "semver": "5.4.1" } }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "reselect": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-2.5.3.tgz", + "integrity": "sha1-I2WRE2rV/2PuUM3YT+/39q/YDuo=" + }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -5640,6 +7105,69 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, + "sanitize-html": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.17.0.tgz", + "integrity": "sha512-5r265ukJgS+MXVMK0OxXLn7iBqRTIxYK0m6Bc+/gFhCY20Vr/KFp/ZTKu9hyB3tKkiGPiQ08aGDPUbjbBhRpXw==", + "requires": { + "chalk": "2.3.1", + "htmlparser2": "3.9.2", + "lodash.clonedeep": "4.5.0", + "lodash.escaperegexp": "4.1.2", + "lodash.mergewith": "4.6.1", + "postcss": "6.0.18", + "srcset": "1.0.0", + "xtend": "4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "5.2.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.18.tgz", + "integrity": "sha512-X8MyLi3OYI1o71u0SsefWLpGBo5xnGiK1Pn+nrZFplc671Ts7L8aPwEbPIO8AWpulK5wuaVzyM9Rw6R8o7hYBw==", + "requires": { + "chalk": "2.3.1", + "source-map": "0.6.1", + "supports-color": "5.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -5650,11 +7178,56 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.3.tgz", "integrity": "sha512-sgv/iF/T4/SewJkaVpldKC4WjSkz0JsOh2eKtxCPpCO1oR05+7MOF+H476HVRbLArkgA7j5TRJJ4p2jdFkUGQQ==", "requires": { - "ajv": "5.5.1", + "ajv": "5.5.2", "ajv-keywords": "2.1.1" - } - }, - "semver": { + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } + } + }, + "scroll-to": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/scroll-to/-/scroll-to-0.0.2.tgz", + "integrity": "sha1-k205ipEzZgokkhRcLACB38sHKPM=", + "requires": { + "component-raf": "1.2.0", + "component-tween": "1.2.0" + } + }, + "scroll-to-element": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/scroll-to-element/-/scroll-to-element-2.0.0.tgz", + "integrity": "sha1-NGczDjOEdDtylaxkswJ5mQxawWQ=", + "requires": { + "scroll-to": "0.0.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "optional": true + }, + "selfsigned": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz", + "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=", + "optional": true, + "requires": { + "node-forge": "0.7.1" + } + }, + "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" @@ -5699,6 +7272,60 @@ } } }, + "serialize-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.0.0.tgz", + "integrity": "sha1-bBFT9+4/5/c/8bG30rSUtntnXro=" + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "optional": true, + "requires": { + "accepts": "1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.2", + "mime-types": "2.1.18", + "parseurl": "1.3.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "optional": true, + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "1.33.0" + } + } + } + }, "serve-static": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", @@ -5762,14 +7389,22 @@ } }, "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", + "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", "requires": { "inherits": "2.0.3", "safe-buffer": "5.1.1" } }, + "shallowequal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", + "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", + "requires": { + "lodash.keys": "3.1.2" + } + }, "share2nightscout-bridge": { "version": "git://github.com/bewest/share2nightscout-bridge.git#34e3c59567b6d74c0d543b234f354bea1cf807e1", "requires": { @@ -5922,9 +7557,9 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shiro-trie": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/shiro-trie/-/shiro-trie-0.3.13.tgz", - "integrity": "sha1-pKZrVJjWm5RgLnqYsAVzFbO1x0Q=" + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/shiro-trie/-/shiro-trie-0.4.5.tgz", + "integrity": "sha512-l9XaQKFi6hX0ZGSlrhLHiI9UGYxJtZTWbg/otqX/5Kx5Xdhbtd/TPnjP9PF9cOHzhw8nV3EDIEry/rt5mSEkJg==" }, "should": { "version": "11.1.2", @@ -6141,6 +7776,49 @@ } } }, + "sockjs": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", + "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "optional": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "2.0.3" + }, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "optional": true + } + } + }, + "sockjs-client": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", + "integrity": "sha1-8CEqhVDkyUaMjM6u79LjSTwDOtU=", + "optional": true, + "requires": { + "debug": "2.6.7", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.2.0" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "optional": true, + "requires": { + "websocket-driver": "0.7.0" + } + } + } + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -6177,6 +7855,57 @@ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "optional": true, + "requires": { + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.1", + "select-hose": "2.0.0", + "spdy-transport": "2.0.20" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "spdy-transport": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "optional": true, + "requires": { + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "safe-buffer": "5.1.1", + "wbuf": "1.7.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -6190,6 +7919,15 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, + "srcset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", + "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=", + "requires": { + "array-uniq": "1.0.3", + "number-is-nan": "1.0.1" + } + }, "sshpk": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", @@ -6251,9 +7989,9 @@ } }, "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", + "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", "requires": { "builtin-status-codes": "3.0.0", "inherits": "2.0.3", @@ -6268,34 +8006,20 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - } + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, + "string.prototype.repeat": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz", + "integrity": "sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8=" + }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", @@ -6318,15 +8042,27 @@ } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "0.2.1" + } }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "optional": true, + "requires": { + "get-stdin": "4.0.1" + } + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -6425,6 +8161,107 @@ } } }, + "swagger-client": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.4.11.tgz", + "integrity": "sha1-JAgauyn7gGTJtY6TDP+lzfQXyNY=", + "requires": { + "babel-runtime": "6.26.0", + "btoa": "1.1.2", + "cookie": "0.3.1", + "cross-fetch": "0.0.8", + "deep-extend": "0.4.2", + "encode-3986": "1.0.0", + "fast-json-patch": "1.2.2", + "isomorphic-form-data": "0.0.1", + "js-yaml": "3.9.0", + "lodash": "4.17.5", + "qs": "6.4.0", + "url": "0.11.0", + "utf8-bytes": "0.0.1", + "utfstring": "2.0.0" + } + }, + "swagger-ui": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-3.10.0.tgz", + "integrity": "sha1-DvKnBFlu6kIChtQuEtdNFdrumWQ=", + "requires": { + "@braintree/sanitize-url": "2.1.0", + "base64-js": "1.2.3", + "brace": "0.7.0", + "classnames": "2.2.5", + "commonmark": "0.28.1", + "core-js": "2.5.3", + "css.escape": "1.5.1", + "deep-extend": "0.4.1", + "expect": "1.20.2", + "getbase": "2.8.2", + "ieee754": "1.1.8", + "immutable": "3.8.2", + "js-yaml": "3.9.0", + "lodash": "4.17.2", + "matcher": "0.1.2", + "memoizee": "0.4.1", + "promise-worker": "1.1.1", + "prop-types": "15.6.0", + "react": "15.6.2", + "react-addons-perf": "15.4.2", + "react-addons-shallow-compare": "0.14.8", + "react-addons-test-utils": "15.6.2", + "react-collapse": "4.0.3", + "react-dom": "15.6.2", + "react-height": "2.2.1", + "react-hot-loader": "1.3.1", + "react-immutable-proptypes": "2.1.0", + "react-immutable-pure-component": "1.1.1", + "react-markdown": "2.5.1", + "react-motion": "0.5.2", + "react-object-inspector": "0.2.1", + "react-redux": "4.4.8", + "react-split-pane": "0.1.70", + "redux": "3.7.2", + "redux-immutable": "3.0.8", + "redux-logger": "3.0.6", + "remarkable": "1.7.1", + "reselect": "2.5.3", + "sanitize-html": "1.17.0", + "scroll-to-element": "2.0.0", + "serialize-error": "2.0.0", + "shallowequal": "0.2.2", + "swagger-client": "3.4.11", + "url-parse": "1.2.0", + "webpack-dev-server": "2.5.0", + "whatwg-fetch": "0.11.1", + "worker-loader": "0.7.1", + "xml": "1.0.1", + "xml-but-prettier": "1.0.1", + "yaml-js": "0.2.0", + "zenscroll": "4.0.0" + }, + "dependencies": { + "deep-extend": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", + "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=" + }, + "lodash": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz", + "integrity": "sha1-NKMFW6vgTOQkZ7YH1wAHLH/2v0I=" + } + } + }, + "swagger-ui-dist": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.10.0.tgz", + "integrity": "sha1-ilrzP/ImPHFaFD9z8qjUfVOZQ+8=" + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, "symbol-tree": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", @@ -6492,19 +8329,45 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", + "optional": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "optional": true + }, "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", "requires": { "setimmediate": "1.0.5" } }, + "timers-ext": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.2.tgz", + "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=", + "requires": { + "es5-ext": "0.10.39", + "next-tick": "1.0.0" + } + }, "timespan": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=" }, + "tmatch": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz", + "integrity": "sha1-DFYkbzPzDaG409colauvFmYPOM8=" + }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", @@ -6515,14 +8378,6 @@ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, - "topo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", - "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", - "requires": { - "hoek": "2.16.3" - } - }, "tough-cookie": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", @@ -6542,6 +8397,18 @@ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "optional": true + }, + "tryer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.0.tgz", + "integrity": "sha1-Antp+oIyJeVRys4+8DsR9qs3wdc=", + "dev": true + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -6576,6 +8443,11 @@ "mime-types": "2.1.15" } }, + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" + }, "uglify-js": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.1.tgz", @@ -6631,6 +8503,16 @@ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=" + }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", @@ -6670,6 +8552,25 @@ } } }, + "url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + } + }, + "utf8-bytes": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/utf8-bytes/-/utf8-bytes-0.0.1.tgz", + "integrity": "sha1-EWsCVEjJtQAIHN+/H01sbDfYg30=" + }, + "utfstring": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/utfstring/-/utfstring-2.0.0.tgz", + "integrity": "sha512-/ugBfyvIoLe9xqkFHio3CxXnpUKQ1p2LfTxPr6QTRj6GiwpHo73YGdh03UmAzDQNOWpNIE0J5nLss00L4xlWgg==" + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -6755,6 +8656,11 @@ "indexof": "0.0.1" } }, + "w3c-blob": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/w3c-blob/-/w3c-blob-0.0.1.tgz", + "integrity": "sha1-sM01KhpQ9RVWNCD/1YYflQ8dhbg=" + }, "watchpack": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", @@ -6770,11 +8676,19 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { - "lodash": "4.17.4" + "lodash": "4.17.5" } } } }, + "wbuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "requires": { + "minimalistic-assert": "1.0.0" + } + }, "webidl-conversions": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz", @@ -6782,14 +8696,14 @@ "dev": true }, "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", "requires": { - "acorn": "5.2.1", + "acorn": "5.4.1", "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.1", - "ajv-keywords": "2.1.1", + "ajv": "6.1.1", + "ajv-keywords": "3.1.0", "async": "2.6.0", "enhanced-resolve": "3.4.1", "escope": "3.6.0", @@ -6811,16 +8725,36 @@ }, "dependencies": { "acorn": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", - "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", + "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==" + }, + "ajv": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.1.1.tgz", + "integrity": "sha1-l41Zf7wrfQ5aXD3esUmmgvKr+g4=", + "requires": { + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "camelcase": { @@ -6850,11 +8784,101 @@ } } }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "2.0.0" + } + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, "supports-color": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", @@ -6863,6 +8887,11 @@ "has-flag": "2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, "yargs": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", @@ -6882,49 +8911,198 @@ "y18n": "3.2.1", "yargs-parser": "7.0.0" } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "4.1.0" + } } } }, "webpack-bundle-analyzer": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.9.1.tgz", - "integrity": "sha512-a+UcvlsXvCmclNgfThT8PVyuJKd029By7CxkYEbNNCfs0Lqj9gagjkdv3S3MBvCIKBaUGYs8l4UpiVI0bFoh2Q==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.10.0.tgz", + "integrity": "sha512-eA/9F/ZLFlVXfCLYqefHFbelJ3JcvyeFdmpAG6Vu3iJNcisj3KWNPqu00lCqK9caeaesipVrGb9alUSi2lEvAg==", "dev": true, "requires": { - "acorn": "5.2.1", - "chalk": "1.1.3", - "commander": "2.12.2", + "acorn": "5.4.1", + "bfj-node4": "5.2.1", + "chalk": "2.3.1", + "commander": "2.14.1", "ejs": "2.5.7", "express": "4.16.2", - "filesize": "3.5.11", - "gzip-size": "3.0.0", - "lodash": "4.17.4", + "filesize": "3.6.0", + "gzip-size": "4.1.0", + "lodash": "4.17.5", "mkdirp": "0.5.1", "opener": "1.4.3", - "ws": "3.3.1" + "ws": "4.0.0" }, "dependencies": { "acorn": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", - "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", + "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "5.2.0" + } + }, + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, "ultron": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", - "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, "ws": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.1.tgz", - "integrity": "sha512-8A/uRMnQy8KCQsmep1m7Bk+z/+LIkeF7w+TDMLtX1iZm5Hq9HsUDmgFGaW1ACW5Cj0b2Qo7wCvRhYN2ErUVp/A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.0.0.tgz", + "integrity": "sha512-QYslsH44bH8O7/W2815u5DpnCpXWpEK44FmaHffNwgJI4JMaSZONgPBTOfrxJ29mXKbXak+LsJ2uAkDTYq2ptQ==", "dev": true, "requires": { "async-limiter": "1.0.0", "safe-buffer": "5.1.1", - "ultron": "1.1.0" + "ultron": "1.1.1" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "optional": true, + "requires": { + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true + } + } + }, + "webpack-dev-server": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.0.tgz", + "integrity": "sha1-TTanKLA7iyr6SO0wJCiEfOooQK0=", + "optional": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "3.5.0", + "chokidar": "1.7.0", + "compression": "1.7.1", + "connect-history-api-fallback": "1.5.0", + "del": "3.0.0", + "express": "4.16.2", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "internal-ip": "1.2.0", + "opn": "4.0.2", + "portfinder": "1.0.13", + "selfsigned": "1.10.2", + "serve-index": "1.9.1", + "sockjs": "0.3.18", + "sockjs-client": "1.1.2", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "3.2.3", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "optional": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "optional": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "optional": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "optional": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" } } } @@ -6945,6 +9123,20 @@ } } }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "requires": { + "http-parser-js": "0.4.10", + "websocket-extensions": "0.1.3" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + }, "whatwg-encoding": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", @@ -6962,6 +9154,11 @@ } } }, + "whatwg-fetch": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.11.1.tgz", + "integrity": "sha1-bT3tJF/dl81yjg4lh7VLczlJ5mM=" + }, "whatwg-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.1.0.tgz", @@ -6987,9 +9184,10 @@ } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "optional": true }, "wide-align": { "version": "1.1.2", @@ -7049,6 +9247,27 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, + "worker-loader": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-0.7.1.tgz", + "integrity": "sha1-kf/S4vv3aSGkPoyjdm0S6VN/XXA=", + "requires": { + "loader-utils": "0.2.17" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "requires": { + "big.js": "3.1.3", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } + } + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -7056,18 +9275,6 @@ "requires": { "string-width": "1.0.2", "strip-ansi": "3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } } }, "wrappy": { @@ -7089,6 +9296,26 @@ "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=" }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" + }, + "xml-but-prettier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz", + "integrity": "sha1-9aMyZ+1CzNTjVcYlV6XjmwH7QPM=", + "requires": { + "repeat-string": "1.6.1" + }, + "dependencies": { + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + } + } + }, "xml-name-validator": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", @@ -7100,6 +9327,11 @@ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" }, + "xss-filters": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/xss-filters/-/xss-filters-1.2.7.tgz", + "integrity": "sha1-Wfod4gHzby80cNysX1jMwoMLCpo=" + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -7115,6 +9347,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, + "yaml-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/yaml-js/-/yaml-js-0.2.0.tgz", + "integrity": "sha512-3s7pA2Imzux1zIPyrSEj01B1fvAcb2TwNRhXjqhWosJn2CaWlQSshE1tJOFAjtPYHEcCVmOEtko1Km+qGH/06A==" + }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", @@ -7127,17 +9364,19 @@ } }, "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "optional": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "3.0.0" }, "dependencies": { "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "optional": true } } }, @@ -7145,6 +9384,11 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + }, + "zenscroll": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/zenscroll/-/zenscroll-4.0.0.tgz", + "integrity": "sha1-S676Shufs7zG02XiAGSP8znkR6g=" } } } diff --git a/package.json b/package.json index 0be3f5d80c6..bcb99686c21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Nightscout", - "version": "0.10.3-dev-20171205", + "version": "0.10.3-dev-20180304", "description": "Nightscout acts as a web-based CGM (Continuous Glucose Montinor) to allow multiple caregivers to remotely view a patients glucose data in realtime.", "license": "AGPL-3.0", "author": "Nightscout Team", @@ -27,8 +27,9 @@ "start": "node server.js", "test": "make test", "env": "env", - "postinstall": "webpack --config webpack.config.js && npm run-script update-buster", - "bundle": "webpack --config webpack.config.js && npm run-script update-buster", + "postinstall": "webpack --mode production --config webpack.config.js && npm run-script update-buster", + "bundle": "webpack --mode production --config webpack.config.js && npm run-script update-buster", + "bundle-dev": "webpack --mode development --config webpack.config.js && npm run-script update-buster", "update-buster": "node bin/generateCacheBuster.js >tmp/cacheBusterToken" }, "config": { @@ -46,39 +47,40 @@ } }, "engines": { - "node": "8.9.x", - "npm": "5.6.x || 5.2.0 || 5.3.0 || 5.0.3" + "node": "8.x||9.x", + "npm": "5.8.x || 5.7.x || 5.6.x" }, "dependencies": { + "ajv": "^6.4.0", "async": "^0.9.2", "body-parser": "^1.18.2", "bootevent": "0.0.1", - "compression": "^1.7.1", - "css-loader": "^0.28.9", + "compression": "^1.7.2", + "css-loader": "^0.28.10", "cssmin": "^0.4.3", "d3": "^3.5.17", - "ejs": "^2.5.7", + "ejs": "^2.5.8", "errorhandler": "^1.5.0", "event-stream": "^3.3.4", "expand-braces": "^0.1.2", "expose-loader": "^0.7.4", "express": "^4.16.2", "express-extension-to-accept": "0.0.2", - "express-minify": "^0.2.0", - "file-loader": "^1.1.6", + "express-minify": "^1.0.0", + "file-loader": "^1.1.11", "flot": "^0.8.0-alpha", "forever": "^0.15.3", - "jquery": "^2.2.4", - "jquery-ui-bundle": "^1.12.1", - "jquery.tipsy": "^1.0.3", + "jquery": "^3.3.1", + "jquery-ui-bundle": "^1.12.1-migrate", + "jquery.tooltips": "^1.0.0", "js-storage": "^1.0.4", - "jsonwebtoken": "^7.4.3", - "lodash": "^4.17.4", + "jsonwebtoken": "^8.2.0", + "lodash": "^4.17.5", "long": "^3.2.0", "minimed-connect-to-nightscout": "git://github.com/mddub/minimed-connect-to-nightscout.git#v1.1.0", - "moment": "^2.19.3", + "moment": "^2.21.0", "moment-timezone": "^0.5.14", - "mongodb": "^3.0.2", + "mongodb": "^3.0.5", "mongomock": "^0.1.2", "mqtt": "^0.3.13", "node-cache": "^4.1.1", @@ -91,11 +93,12 @@ "share2nightscout-bridge": "git://github.com/bewest/share2nightscout-bridge.git#wip/generalize", "shiro-trie": "^0.3.13", "simple-statistics": "^0.7.0", - "socket.io": "^1.7.4", - "style-loader": "^0.20.1", + "socket.io": "^2.0.4", + "style-loader": "^0.20.2", "traverse": "^0.6.6", - "uglify-js": "^3.2.1", - "webpack": "^3.10.0" + "uglify-js": "^3.3.13", + "uuid": "^3.2.1", + "webpack": "^4.3.0" }, "devDependencies": { "benv": "3.3.0", @@ -104,6 +107,7 @@ "mocha": "~3.1.2", "should": "~11.1.1", "supertest": "~2.0.0", - "webpack-bundle-analyzer": "^2.9.1" + "webpack-bundle-analyzer": "^2.11.1", + "webpack-cli": "^2.0.13" } } diff --git a/static/api-docs.html b/static/api-docs.html index f58fd52b0a7..dfec386b976 100644 --- a/static/api-docs.html +++ b/static/api-docs.html @@ -1,9 +1,11 @@ + - + - Nightscout API - + Swagger UI: Nightscout API + + @@ -22,89 +24,88 @@ - + + - - - - - - - - - - - - - - - - - + - - - - + + + + + - - + + + + + + + - - + + -
 
-
+
+ + + + + diff --git a/swagger.json b/swagger.json new file mode 100644 index 00000000000..6aada8784e2 --- /dev/null +++ b/swagger.json @@ -0,0 +1,952 @@ +{ + "openapi": "3.0.0", + "servers": [ + { + "url": "/api/v1" + } + ], + "info": { + "title": "Nightscout API", + "description": "Own your DData with the Nightscout API", + "version": "0.10.3-dev-20171205", + "license": { + "name": "AGPL 3", + "url": "https://www.gnu.org/licenses/agpl.txt" + } + }, + "security": [ + { + "api_secret": [], + "token_in_url": [], + "jwtoken": [] + } + ], + "paths": { + "/entries/{spec}": { + "get": { + "summary": "All Entries matching query", + "description": "The Entries endpoint returns information about the\nNightscout entries.\n", + "parameters": [ + { + "name": "spec", + "in": "path", + "description": "entry id, such as `55cf81bc436037528ec75fa5` or a type filter such\nas `sgv`, `mbg`, etc.\n", + "required": true, + "schema": { + "type": "string", + "default": "sgv" + } + }, + { + "name": "find", + "in": "query", + "description": "The query used to find entries, support nested query syntax, for\nexample `find[dateString][$gte]=2015-08-27`. All find parameters\nare interpreted as strings.\n", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "count", + "in": "query", + "description": "Number of entries to return.", + "required": false, + "schema": { + "type": "number" + } + } + ], + "tags": [ + "Entries" + ], + "responses": { + "200": { + "description": "An array of entries", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Entries" + } + } + } + }, + "default": { + "description": "Entries", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Entries" + } + } + } + } + } + } + }, + "/slice/{storage}/{field}/{type}/{prefix}/{regex}": { + "get": { + "summary": "All Entries matching query", + "description": "The Entries endpoint returns information about the Nightscout entries.", + "parameters": [ + { + "name": "storage", + "in": "path", + "description": "Prefix to use in constructing a prefix-based regex, default is `entries`.", + "required": true, + "schema": { + "type": "string", + "default": "entries" + } + }, + { + "name": "field", + "in": "path", + "description": "Name of the field to use Regex against in query object, default is `dateString`.", + "required": true, + "schema": { + "type": "string", + "default": "dateString" + } + }, + { + "name": "type", + "in": "path", + "description": "The type field to search against, default is sgv.", + "required": true, + "schema": { + "type": "string", + "default": "sgv" + } + }, + { + "name": "prefix", + "in": "path", + "description": "Prefix to use in constructing a prefix-based regex.", + "required": true, + "schema": { + "type": "string", + "default": "2015" + } + }, + { + "name": "regex", + "in": "path", + "description": "Tail part of regexp to use in expanding/construccting a query object.\nRegexp also has bash-style brace and glob expansion applied to it,\ncreating ways to search for modal times of day, perhaps using\nsomething like this syntax: `T{15..17}:.*`, this would search for\nall records from 3pm to 5pm.\n", + "required": true, + "schema": { + "type": "string", + "default": ".*" + } + }, + { + "name": "find", + "in": "query", + "description": "The query used to find entries, support nested query syntax, for\nexample `find[dateString][$gte]=2015-08-27`. All find parameters\nare interpreted as strings.\n", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "count", + "in": "query", + "description": "Number of entries to return.", + "required": false, + "schema": { + "type": "number" + } + } + ], + "tags": [ + "Entries" + ], + "responses": { + "200": { + "description": "An array of entries", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Entries" + } + } + } + }, + "default": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/echo/{storage}/{spec}": { + "get": { + "summary": "View generated Mongo Query object", + "description": "Information about the mongo query object created by the query.\n", + "parameters": [ + { + "name": "storage", + "in": "path", + "description": "`entries`, or `treatments` to select the storage layer.\n", + "required": true, + "schema": { + "type": "string", + "default": "sgv" + } + }, + { + "name": "spec", + "in": "path", + "description": "entry id, such as `55cf81bc436037528ec75fa5` or a type filter such\nas `sgv`, `mbg`, etc.\nThis parameter is optional.\n", + "required": true, + "schema": { + "type": "string", + "default": "sgv" + } + }, + { + "name": "find", + "in": "query", + "description": "The query used to find entries, support nested query syntax, for\nexample `find[dateString][$gte]=2015-08-27`. All find parameters\nare interpreted as strings.\n", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "count", + "in": "query", + "description": "Number of entries to return.", + "required": false, + "schema": { + "type": "number" + } + } + ], + "tags": [ + "Entries", + "Debug" + ], + "responses": { + "200": { + "description": "An array of entries", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MongoQuery" + } + } + } + } + } + } + }, + "/times/echo/{prefix}/{regex}": { + "get": { + "summary": "Echo the query object to be used.", + "description": "Echo debug information about the query object constructed.", + "parameters": [ + { + "name": "prefix", + "in": "path", + "description": "Prefix to use in constructing a prefix-based regex.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "regex", + "in": "path", + "description": "Tail part of regexp to use in expanding/construccting a query object.\nRegexp also has bash-style brace and glob expansion applied to it,\ncreating ways to search for modal times of day, perhaps using\nsomething like this syntax: `T{15..17}:.*`, this would search for\nall records from 3pm to 5pm.\n", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "find", + "in": "query", + "description": "The query used to find entries, support nested query syntax, for example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "count", + "in": "query", + "description": "Number of entries to return.", + "required": false, + "schema": { + "type": "number" + } + } + ], + "tags": [ + "Entries", + "Debug" + ], + "responses": { + "200": { + "description": "An array of entries", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MongoQuery" + } + } + } + }, + "default": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/times/{prefix}/{regex}": { + "get": { + "summary": "All Entries matching query", + "description": "The Entries endpoint returns information about the Nightscout entries.", + "parameters": [ + { + "name": "prefix", + "in": "path", + "description": "Prefix to use in constructing a prefix-based regex.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "regex", + "in": "path", + "description": "Tail part of regexp to use in expanding/construccting a query object.\nRegexp also has bash-style brace and glob expansion applied to it,\ncreating ways to search for modal times of day, perhaps using\nsomething like this syntax: `T{15..17}:.*`, this would search for\nall records from 3pm to 5pm.\n", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "find", + "in": "query", + "description": "The query used to find entries, support nested query syntax, for example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "count", + "in": "query", + "description": "Number of entries to return.", + "required": false, + "schema": { + "type": "number" + } + } + ], + "tags": [ + "Entries" + ], + "responses": { + "200": { + "description": "An array of entries", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Entries" + } + } + } + }, + "default": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/entries": { + "get": { + "summary": "All Entries matching query", + "description": "The Entries endpoint returns information about the Nightscout entries.", + "parameters": [ + { + "name": "find", + "in": "query", + "description": "The query used to find entries, support nested query syntax, for example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "count", + "in": "query", + "description": "Number of entries to return.", + "required": false, + "schema": { + "type": "number" + } + } + ], + "tags": [ + "Entries" + ], + "responses": { + "200": { + "description": "An array of entries", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Entries" + } + } + } + }, + "default": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "post": { + "tags": [ + "Entries" + ], + "summary": "Add new entries.", + "description": "", + "operationId": "addEntries", + "responses": { + "200": { + "description": "Rejected list of entries. Empty list is success." + }, + "405": { + "description": "Invalid input" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Entries" + } + }, + "text/plain": { + "schema": { + "$ref": "#/components/schemas/Entries" + } + } + }, + "description": "Entries to be uploaded.", + "required": true + } + }, + "delete": { + "tags": [ + "Entries" + ], + "summary": "Delete entries matching query.", + "description": "Remove entries, same search syntax as GET.", + "operationId": "remove", + "parameters": [ + { + "name": "find", + "in": "query", + "description": "The query used to find entries, support nested query syntax, for example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "count", + "in": "query", + "description": "Number of entries to return.", + "required": false, + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "Empty list is success." + } + } + } + }, + "/treatments": { + "get": { + "summary": "Treatments", + "description": "The Treatments endpoint returns information about the Nightscout treatments.", + "tags": [ + "Treatments" + ], + "parameters": [ + { + "name": "find", + "in": "query", + "description": "The query used to find entries, supports nested query syntax. Examples `find[insulin][$gte]=3` `find[carb][$gte]=100` `find[eventType]=Correction+Bolus` All find parameters are interpreted as strings.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "count", + "in": "query", + "description": "Number of entries to return.", + "required": false, + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "An array of treatments", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Treatments" + } + } + } + }, + "default": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "post": { + "tags": [ + "Treatments" + ], + "summary": "Add new treatments.", + "description": "", + "operationId": "addTreatments", + "responses": { + "200": { + "description": "Rejected list of treatments. Empty list is success." + }, + "405": { + "description": "Invalid input" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Treatments" + } + } + }, + "description": "Treatments to be uploaded.", + "required": true + } + } + }, + "/profile": { + "get": { + "summary": "Profile", + "description": "The Profile endpoint returns information about the Nightscout Treatment Profiles.", + "tags": [ + "Profile" + ], + "responses": { + "200": { + "description": "An array of treatments", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Profile" + } + } + } + }, + "default": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/status": { + "get": { + "summary": "Status", + "description": "Server side status, default settings and capabilities.", + "tags": [ + "Status" + ], + "responses": { + "200": { + "description": "Server capabilities and status.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Status" + } + } + } + }, + "default": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + } + }, + "components": { + "securitySchemes": { + "api_secret": { + "type": "apiKey", + "name": "api_secret", + "in": "header", + "description": "The hash of the API_SECRET env var" + }, + "token_in_url": { + "type": "apiKey", + "name": "token", + "in": "query", + "description": "Add token as query item in the URL. You can manage access Token in `/admin`. This uses json webtokens." + }, + "jwtoken": { + "type": "http", + "scheme": "bearer", + "description": "Use this if you know the temporary json webtoken.", + "bearerFormat": "JWT" + } + }, + "schemas": { + "Entry": { + "properties": { + "type": { + "type": "string", + "description": "sgv, mbg, cal, etc" + }, + "dateString": { + "type": "string", + "description": "dateString, prefer ISO `8601`" + }, + "date": { + "type": "number", + "description": "Epoch" + }, + "sgv": { + "type": "number", + "description": "The glucose reading. (only available for sgv types)" + }, + "direction": { + "type": "string", + "description": "Direction of glucose trend reported by CGM. (only available for sgv types)" + }, + "noise": { + "type": "number", + "description": "Noise level at time of reading. (only available for sgv types)" + }, + "filtered": { + "type": "number", + "description": "The raw filtered value directly from CGM transmitter. (only available for sgv types)" + }, + "unfiltered": { + "type": "number", + "description": "The raw unfiltered value directly from CGM transmitter. (only available for sgv types)" + }, + "rssi": { + "type": "number", + "description": "The signal strength from CGM transmitter. (only available for sgv types)" + } + } + }, + "Entries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Entry" + } + }, + "Treatment": { + "properties": { + "_id": { + "type": "string", + "description": "Internally assigned id." + }, + "eventType": { + "type": "string", + "description": "The type of treatment event." + }, + "created_at": { + "type": "string", + "description": "The date of the event, might be set retroactively ." + }, + "glucose": { + "type": "string", + "description": "Current glucose." + }, + "glucoseType": { + "type": "string", + "description": "Method used to obtain glucose, Finger or Sensor." + }, + "carbs": { + "type": "number", + "description": "Number of carbs." + }, + "insulin": { + "type": "number", + "description": "Amount of insulin, if any." + }, + "units": { + "type": "string", + "description": "The units for the glucose value, mg/dl or mmol." + }, + "notes": { + "type": "string", + "description": "Description/notes of treatment." + }, + "enteredBy": { + "type": "string", + "description": "Who entered the treatment." + } + } + }, + "Treatments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Treatment" + } + }, + "Profile": { + "properties": { + "sens": { + "type": "integer", + "description": "Internally assigned id" + }, + "dia": { + "type": "integer", + "description": "Internally assigned id" + }, + "carbratio": { + "type": "integer", + "description": "Internally assigned id" + }, + "carbs_hr": { + "type": "integer", + "description": "Internally assigned id" + }, + "_id": { + "type": "string", + "description": "Internally assigned id" + } + } + }, + "Status": { + "properties": { + "apiEnabled": { + "type": "boolean", + "description": "Whether or not the REST API is enabled." + }, + "careportalEnabled": { + "type": "boolean", + "description": "Whether or not the careportal is enabled in the API." + }, + "head": { + "type": "string", + "description": "The git identifier for the running instance of the app." + }, + "name": { + "type": "string", + "description": "Nightscout (static)" + }, + "version": { + "type": "string", + "description": "The version label of the app." + }, + "settings": { + "$ref": "#/components/schemas/Settings" + }, + "extendedSettings": { + "$ref": "#/components/schemas/ExtendedSettings" + } + } + }, + "Settings": { + "properties": { + "units": { + "type": "string", + "description": "Default units for glucose measurements across the server." + }, + "timeFormat": { + "type": "string", + "description": "Default time format", + "enum": [ + 12, + 24 + ] + }, + "customTitle": { + "type": "string", + "description": "Default custom title to be displayed system wide." + }, + "nightMode": { + "type": "boolean", + "description": "Should Night mode be enabled by default?" + }, + "theme": { + "type": "string", + "description": "Default theme to be displayed system wide, `default`, `colors`, `colorblindfriendly`." + }, + "language": { + "type": "string", + "description": "Default language code to be used system wide" + }, + "showPlugins": { + "type": "string", + "description": "Plugins that should be shown by default" + }, + "showRawbg": { + "type": "string", + "description": "If Raw BG is enabled when should it be shown? `never`, `always`, `noise`" + }, + "alarmTypes": { + "type": "array", + "items": { + "type": "string" + }, + "enum": [ + "simple", + "predict" + ], + "description": "Enabled alarm types, can be multiple" + }, + "alarmUrgentHigh": { + "type": "boolean", + "description": "Enable/Disable client-side Urgent High alarms by default, for use with `simple` alarms." + }, + "alarmHigh": { + "type": "boolean", + "description": "Enable/Disable client-side High alarms by default, for use with `simple` alarms." + }, + "alarmLow": { + "type": "boolean", + "description": "Enable/Disable client-side Low alarms by default, for use with `simple` alarms." + }, + "alarmUrgentLow": { + "type": "boolean", + "description": "Enable/Disable client-side Urgent Low alarms by default, for use with `simple` alarms." + }, + "alarmTimeagoWarn": { + "type": "boolean", + "description": "Enable/Disable client-side stale data alarms by default." + }, + "alarmTimeagoWarnMins": { + "type": "number", + "description": "Number of minutes before a stale data warning is generated." + }, + "alarmTimeagoUrgent": { + "type": "boolean", + "description": "Enable/Disable client-side urgent stale data alarms by default." + }, + "alarmTimeagoUrgentMins": { + "type": "number", + "description": "Number of minutes before a stale data warning is generated." + }, + "enable": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Enabled features" + }, + "thresholds": { + "$ref": "#/components/schemas/Threshold" + } + } + }, + "Threshold": { + "properties": { + "bg_high": { + "type": "integer", + "description": "High BG range." + }, + "bg_target_top": { + "type": "integer", + "description": "Top of target range." + }, + "bg_target_bottom": { + "type": "integer", + "description": "Bottom of target range." + }, + "bg_low": { + "type": "integer", + "description": "Low BG range." + } + } + }, + "ExtendedSettings": { + "description": "Extended settings of client side plugins" + }, + "MongoQuery": { + "description": "Mongo Query object." + }, + "Error": { + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "fields": { + "type": "object" + } + } + } + } + } +} \ No newline at end of file diff --git a/swagger.yaml b/swagger.yaml index ce9204ceed9..a9fe3f82bae 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -1,36 +1,34 @@ -swagger: '2.0' +openapi: 3.0.0 +servers: + - url: /api/v1 info: title: Nightscout API description: Own your DData with the Nightscout API - version: "0.8.0" + version: 0.10.3-dev-20171205 license: name: AGPL 3 - url: https://www.gnu.org/licenses/agpl.txt -basePath: /api/v1 -produces: - - application/json + url: 'https://www.gnu.org/licenses/agpl.txt' security: - api_secret: [] - + token_in_url: [] + jwtoken: [] paths: - - /entries/{spec}: + '/entries/{spec}': get: summary: All Entries matching query description: | The Entries endpoint returns information about the Nightscout entries. - parameters: - name: spec in: path - type: string description: | - entry id, such as `55cf81bc436037528ec75fa5` or a type filter such - as `sgv`, `mbg`, etc. - - default: sgv + entry id, such as `55cf81bc436037528ec75fa5` or a type filter such + as `sgv`, `mbg`, etc. required: true + schema: + type: string + default: sgv - name: find in: query description: | @@ -38,64 +36,83 @@ paths: example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings. required: false - type: string + schema: + type: string - name: count in: query description: Number of entries to return. required: false - type: number + schema: + type: number tags: - Entries responses: - "200": + '200': description: An array of entries - schema: - $ref: '#/definitions/Entries' + content: + application/json: + schema: + $ref: '#/components/schemas/Entries' default: description: Entries - schema: - $ref: '#/definitions/Entries' - - /slice/{storage}/{field}/{type}/{prefix}/{regex}: + content: + application/json: + schema: + $ref: '#/components/schemas/Entries' + '/slice/{storage}/{field}/{type}/{prefix}/{regex}': get: summary: All Entries matching query description: The Entries endpoint returns information about the Nightscout entries. parameters: - name: storage in: path - type: string - description: Prefix to use in constructing a prefix-based regex, default is `entries`. + description: >- + Prefix to use in constructing a prefix-based regex, default is + `entries`. required: true - default: entries + schema: + type: string + default: entries - name: field in: path - type: string - description: Name of the field to use Regex against in query object, default is `dateString`. - default: dateString + description: >- + Name of the field to use Regex against in query object, default is + `dateString`. required: true + schema: + type: string + default: dateString - name: type in: path - type: string - description: The type field to search against, default is sgv. + description: 'The type field to search against, default is sgv.' required: true - default: sgv + schema: + type: string + default: sgv - name: prefix in: path - type: string description: Prefix to use in constructing a prefix-based regex. required: true - default: '2015' + schema: + type: string + default: '2015' - name: regex in: path - type: string - description: | - Tail part of regexp to use in expanding/construccting a query object. + description: > + Tail part of regexp to use in expanding/construccting a query + object. + Regexp also has bash-style brace and glob expansion applied to it, + creating ways to search for modal times of day, perhaps using + something like this syntax: `T{15..17}:.*`, this would search for + all records from 3pm to 5pm. required: true - default: .* + schema: + type: string + default: .* - name: find in: query description: | @@ -103,49 +120,53 @@ paths: example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings. required: false - type: string + schema: + type: string - name: count in: query description: Number of entries to return. required: false - type: number + schema: + type: number tags: - Entries responses: - "200": + '200': description: An array of entries - schema: - $ref: '#/definitions/Entries' + content: + application/json: + schema: + $ref: '#/components/schemas/Entries' default: description: Unexpected error - schema: - $ref: '#/definitions/Error' - - /echo/{storage}/{spec}: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '/echo/{storage}/{spec}': get: summary: View generated Mongo Query object description: | Information about the mongo query object created by the query. - parameters: - name: storage in: path - type: string description: | - `entries`, or `treatments` to select the storage layer. - - default: sgv + `entries`, or `treatments` to select the storage layer. required: true + schema: + type: string + default: sgv - name: spec in: path - type: string description: | - entry id, such as `55cf81bc436037528ec75fa5` or a type filter such - as `sgv`, `mbg`, etc. - This parameter is optional. - - default: sgv + entry id, such as `55cf81bc436037528ec75fa5` or a type filter such + as `sgv`, `mbg`, etc. + This parameter is optional. required: true + schema: + type: string + default: sgv - name: find in: query description: | @@ -153,108 +174,139 @@ paths: example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings. required: false - type: string + schema: + type: string - name: count in: query description: Number of entries to return. required: false - type: number + schema: + type: number tags: - Entries - Debug responses: - "200": + '200': description: An array of entries - schema: - $ref: '#/definitions/MongoQuery' - - /times/echo/{prefix}/{regex}: + content: + application/json: + schema: + $ref: '#/components/schemas/MongoQuery' + '/times/echo/{prefix}/{regex}': get: summary: Echo the query object to be used. description: Echo debug information about the query object constructed. parameters: - name: prefix in: path - type: string description: Prefix to use in constructing a prefix-based regex. required: true + schema: + type: string - name: regex in: path - type: string - description: | - Tail part of regexp to use in expanding/construccting a query object. + description: > + Tail part of regexp to use in expanding/construccting a query + object. + Regexp also has bash-style brace and glob expansion applied to it, + creating ways to search for modal times of day, perhaps using + something like this syntax: `T{15..17}:.*`, this would search for + all records from 3pm to 5pm. required: true + schema: + type: string - name: find in: query - description: The query used to find entries, support nested query syntax, for example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings. + description: >- + The query used to find entries, support nested query syntax, for + example `find[dateString][$gte]=2015-08-27`. All find parameters + are interpreted as strings. required: false - type: string + schema: + type: string - name: count in: query description: Number of entries to return. required: false - type: number + schema: + type: number tags: - Entries - Debug responses: - "200": + '200': description: An array of entries - schema: - $ref: '#/definitions/MongoQuery' + content: + application/json: + schema: + $ref: '#/components/schemas/MongoQuery' default: description: Unexpected error - schema: - $ref: '#/definitions/Error' - - - /times/{prefix}/{regex}: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '/times/{prefix}/{regex}': get: summary: All Entries matching query description: The Entries endpoint returns information about the Nightscout entries. parameters: - name: prefix in: path - type: string description: Prefix to use in constructing a prefix-based regex. required: true + schema: + type: string - name: regex in: path - type: string - description: | - Tail part of regexp to use in expanding/construccting a query object. + description: > + Tail part of regexp to use in expanding/construccting a query + object. + Regexp also has bash-style brace and glob expansion applied to it, + creating ways to search for modal times of day, perhaps using + something like this syntax: `T{15..17}:.*`, this would search for + all records from 3pm to 5pm. required: true + schema: + type: string - name: find in: query - description: The query used to find entries, support nested query syntax, for example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings. + description: >- + The query used to find entries, support nested query syntax, for + example `find[dateString][$gte]=2015-08-27`. All find parameters + are interpreted as strings. required: false - type: string + schema: + type: string - name: count in: query description: Number of entries to return. required: false - type: number + schema: + type: number tags: - Entries responses: - "200": + '200': description: An array of entries - schema: - $ref: '#/definitions/Entries' + content: + application/json: + schema: + $ref: '#/components/schemas/Entries' default: description: Unexpected error - schema: - $ref: '#/definitions/Error' - - + content: + application/json: + schema: + $ref: '#/components/schemas/Error' /entries: get: summary: All Entries matching query @@ -262,376 +314,413 @@ paths: parameters: - name: find in: query - description: The query used to find entries, support nested query syntax, for example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings. + description: >- + The query used to find entries, support nested query syntax, for + example `find[dateString][$gte]=2015-08-27`. All find parameters + are interpreted as strings. required: false - type: string + schema: + type: string - name: count in: query description: Number of entries to return. required: false - type: number + schema: + type: number tags: - Entries responses: - "200": + '200': description: An array of entries - schema: - $ref: '#/definitions/Entries' + content: + application/json: + schema: + $ref: '#/components/schemas/Entries' default: description: Unexpected error - schema: - $ref: '#/definitions/Error' - + content: + application/json: + schema: + $ref: '#/components/schemas/Error' post: tags: - Entries summary: Add new entries. - description: "" + description: '' operationId: addEntries - consumes: - - application/json - - text/plain - produces: - - application/json - - text/plain - parameters: - - in: body - name: body - description: Entries to be uploaded. - required: true - schema: - $ref: "#/definitions/Entries" responses: - "405": - description: Invalid input - "200": + '200': description: Rejected list of entries. Empty list is success. + '405': + description: Invalid input + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Entries' + text/plain: + schema: + $ref: '#/components/schemas/Entries' + description: Entries to be uploaded. + required: true delete: tags: - Entries summary: Delete entries matching query. - description: "Remove entries, same search syntax as GET." + description: 'Remove entries, same search syntax as GET.' operationId: remove parameters: - name: find in: query - description: The query used to find entries, support nested query syntax, for example `find[dateString][$gte]=2015-08-27`. All find parameters are interpreted as strings. + description: >- + The query used to find entries, support nested query syntax, for + example `find[dateString][$gte]=2015-08-27`. All find parameters + are interpreted as strings. required: false - type: string + schema: + type: string - name: count in: query description: Number of entries to return. required: false - type: number + schema: + type: number responses: - "200": + '200': description: Empty list is success. - /treatments: get: summary: Treatments - description: The Treatments endpoint returns information about the Nightscout treatments. + description: >- + The Treatments endpoint returns information about the Nightscout + treatments. tags: - Treatments parameters: - name: find in: query - description: - The query used to find entries, supports nested query syntax. Examples - `find[insulin][$gte]=3` - `find[carb][$gte]=100` - `find[eventType]=Correction+Bolus` - All find parameters are interpreted as strings. + description: >- + The query used to find entries, supports nested query syntax. + Examples `find[insulin][$gte]=3` `find[carb][$gte]=100` + `find[eventType]=Correction+Bolus` All find parameters are + interpreted as strings. required: false - type: string + schema: + type: string - name: count in: query description: Number of entries to return. required: false - type: number + schema: + type: number responses: - "200": + '200': description: An array of treatments - schema: - $ref: '#/definitions/Treatments' + content: + application/json: + schema: + $ref: '#/components/schemas/Treatments' default: description: Unexpected error - schema: - $ref: '#/definitions/Error' - post: - tags: - - Treatments - summary: Add new treatments. - description: "" - operationId: addTreatments - consumes: - - application/json - produces: - - application/json - parameters: - - in: body - name: body - description: Treatments to be uploaded. - required: true + content: + application/json: schema: - $ref: "#/definitions/Treatments" - responses: - "405": - description: Invalid input - "200": - description: Rejected list of treatments. Empty list is success. - + $ref: '#/components/schemas/Error' + post: + tags: + - Treatments + summary: Add new treatments. + description: '' + operationId: addTreatments + responses: + '200': + description: Rejected list of treatments. Empty list is success. + '405': + description: Invalid input + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Treatments' + description: Treatments to be uploaded. + required: true /profile: get: summary: Profile - description: The Profile endpoint returns information about the Nightscout Treatment Profiles. + description: >- + The Profile endpoint returns information about the Nightscout Treatment + Profiles. tags: - Profile responses: - "200": + '200': description: An array of treatments - schema: - $ref: '#/definitions/Profile' + content: + application/json: + schema: + $ref: '#/components/schemas/Profile' default: description: Unexpected error - schema: - $ref: '#/definitions/Error' - + content: + application/json: + schema: + $ref: '#/components/schemas/Error' /status: get: summary: Status - description: Server side status, default settings and capabilities. + description: 'Server side status, default settings and capabilities.' tags: - Status responses: - "200": + '200': description: Server capabilities and status. - schema: - $ref: '#/definitions/Status' + content: + application/json: + schema: + $ref: '#/components/schemas/Status' default: description: Unexpected error - schema: - $ref: '#/definitions/Error' - -securityDefinitions: - api_secret: - type: apiKey - name: api_secret - in: header - description: The hash of the API_SECRET env var - -definitions: - Entry: - properties: - type: - type: string - description: "sgv, mbg, cal, etc" - dateString: - type: string - description: dateString, prefer ISO `8601` - date: - type: number - description: Epoch - sgv: - type: number - description: The glucose reading. (only available for sgv types) - direction: - type: string - description: Direction of glucose trend reported by CGM. (only available for sgv types) - noise: - type: number - description: Noise level at time of reading. (only available for sgv types) - filtered: - type: number - description: The raw filtered value directly from CGM transmitter. (only available for sgv types) - unfiltered: - type: number - description: The raw unfiltered value directly from CGM transmitter. (only available for sgv types) - rssi: - type: number - description: The signal strength from CGM transmitter. (only available for sgv types) - - Entries: - type: array - items: - $ref: '#/definitions/Entry' - - Treatment: - properties: - _id: - type: string - description: Internally assigned id. - eventType: - type: string - description: The type of treatment event. - created_at: - type: string - description: The date of the event, might be set retroactively . - glucose: - type: string - description: Current glucose. - glucoseType: - type: string - description: Method used to obtain glucose, Finger or Sensor. - carbs: - type: number - description: Number of carbs. - insulin: - type: number - description: Amount of insulin, if any. - units: - type: string - description: The units for the glucose value, mg/dl or mmol. - notes: - type: string - description: Description/notes of treatment. - enteredBy: - type: string - description: Who entered the treatment. - - Treatments: - type: array - items: - $ref: '#/definitions/Treatment' - - Profile: - properties: - sens: - type: integer - description: 'Internally assigned id' - dia: - type: integer - description: 'Internally assigned id' - carbratio: - type: integer - description: 'Internally assigned id' - carbs_hr: - type: integer - description: 'Internally assigned id' - _id: - type: string - description: 'Internally assigned id' - - Status: - properties: - apiEnabled: - type: boolean - description: 'Whether or not the REST API is enabled.' - careportalEnabled: - type: boolean - description: 'Whether or not the careportal is enabled in the API.' - head: - type: string - description: 'The git identifier for the running instance of the app.' - name: - type: string - description: Nightscout (static) - version: - type: string - description: 'The version label of the app.' - settings: - $ref: '#/definitions/Settings' - extendedSettings: - $ref: '#/definitions/ExtendedSettings' - - Settings: - properties: - units: - type: string - description: Default units for glucose measurements across the server. - timeFormat: - type: string - description: Default time format - enum: - - 12 - - 24 - customTitle: - type: string - description: Default custom title to be displayed system wide. - nightMode: - type: boolean - description: Should Night mode be enabled by default? - theme: - type: string - description: Default theme to be displayed system wide, `default`, `colors`, `colorblindfriendly`. - language: - type: string - description: Default language code to be used system wide - showPlugins: - type: string - description: Plugins that should be shown by default - showRawbg: - type: string - description: If Raw BG is enabled when should it be shown? `never`, `always`, `noise` - alarmTypes: - type: array - items: + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +components: + securitySchemes: + api_secret: + type: apiKey + name: api_secret + in: header + description: The hash of the API_SECRET env var + token_in_url: + type: apiKey + name: token + in: query + description: Add token as query item in the URL. You can manage access Token in `/admin`. This uses json webtokens. + jwtoken: + type: http + scheme: bearer + description: Use this if you know the temporary json webtoken. + bearerFormat: JWT + schemas: + Entry: + properties: + type: type: string - enum: - - simple - - predict - description: Enabled alarm types, can be multiple - alarmUrgentHigh: - type: boolean - description: Enable/Disable client-side Urgent High alarms by default, for use with `simple` alarms. - alarmHigh: - type: boolean - description: Enable/Disable client-side High alarms by default, for use with `simple` alarms. - alarmLow: - type: boolean - description: Enable/Disable client-side Low alarms by default, for use with `simple` alarms. - alarmUrgentLow: - type: boolean - description: Enable/Disable client-side Urgent Low alarms by default, for use with `simple` alarms. - alarmTimeagoWarn: - type: boolean - description: Enable/Disable client-side stale data alarms by default. - alarmTimeagoWarnMins: - type: number - description: Number of minutes before a stale data warning is generated. - alarmTimeagoUrgent: - type: boolean - description: Enable/Disable client-side urgent stale data alarms by default. - alarmTimeagoUrgentMins: - type: number - description: Number of minutes before a stale data warning is generated. - enable: - type: array - items: + description: 'sgv, mbg, cal, etc' + dateString: type: string - description: Enabled features - thresholds: - $ref: '#/definitions/Threshold' - - Threshold: - properties: - bg_high: - type: integer - description: 'High BG range.' - bg_target_top: - type: integer - description: 'Top of target range.' - bg_target_bottom: - type: integer - description: 'Bottom of target range.' - bg_low: - type: integer - description: 'Low BG range.' - - ExtendedSettings: - description: Extended settings of client side plugins - - MongoQuery: - description: Mongo Query object. - - - Error: - properties: - code: - type: integer - format: int32 - message: - type: string - fields: - type: object - + description: 'dateString, prefer ISO `8601`' + date: + type: number + description: Epoch + sgv: + type: number + description: The glucose reading. (only available for sgv types) + direction: + type: string + description: >- + Direction of glucose trend reported by CGM. (only available for sgv + types) + noise: + type: number + description: Noise level at time of reading. (only available for sgv types) + filtered: + type: number + description: >- + The raw filtered value directly from CGM transmitter. (only + available for sgv types) + unfiltered: + type: number + description: >- + The raw unfiltered value directly from CGM transmitter. (only + available for sgv types) + rssi: + type: number + description: >- + The signal strength from CGM transmitter. (only available for sgv + types) + Entries: + type: array + items: + $ref: '#/components/schemas/Entry' + Treatment: + properties: + _id: + type: string + description: Internally assigned id. + eventType: + type: string + description: The type of treatment event. + created_at: + type: string + description: 'The date of the event, might be set retroactively .' + glucose: + type: string + description: Current glucose. + glucoseType: + type: string + description: 'Method used to obtain glucose, Finger or Sensor.' + carbs: + type: number + description: Number of carbs. + insulin: + type: number + description: 'Amount of insulin, if any.' + units: + type: string + description: 'The units for the glucose value, mg/dl or mmol.' + notes: + type: string + description: Description/notes of treatment. + enteredBy: + type: string + description: Who entered the treatment. + Treatments: + type: array + items: + $ref: '#/components/schemas/Treatment' + Profile: + properties: + sens: + type: integer + description: Internally assigned id + dia: + type: integer + description: Internally assigned id + carbratio: + type: integer + description: Internally assigned id + carbs_hr: + type: integer + description: Internally assigned id + _id: + type: string + description: Internally assigned id + Status: + properties: + apiEnabled: + type: boolean + description: Whether or not the REST API is enabled. + careportalEnabled: + type: boolean + description: Whether or not the careportal is enabled in the API. + head: + type: string + description: The git identifier for the running instance of the app. + name: + type: string + description: Nightscout (static) + version: + type: string + description: The version label of the app. + settings: + $ref: '#/components/schemas/Settings' + extendedSettings: + $ref: '#/components/schemas/ExtendedSettings' + Settings: + properties: + units: + type: string + description: Default units for glucose measurements across the server. + timeFormat: + type: string + description: Default time format + enum: + - 12 + - 24 + customTitle: + type: string + description: Default custom title to be displayed system wide. + nightMode: + type: boolean + description: Should Night mode be enabled by default? + theme: + type: string + description: >- + Default theme to be displayed system wide, `default`, `colors`, + `colorblindfriendly`. + language: + type: string + description: Default language code to be used system wide + showPlugins: + type: string + description: Plugins that should be shown by default + showRawbg: + type: string + description: >- + If Raw BG is enabled when should it be shown? `never`, `always`, + `noise` + alarmTypes: + type: array + items: + type: string + enum: + - simple + - predict + description: 'Enabled alarm types, can be multiple' + alarmUrgentHigh: + type: boolean + description: >- + Enable/Disable client-side Urgent High alarms by default, for use + with `simple` alarms. + alarmHigh: + type: boolean + description: >- + Enable/Disable client-side High alarms by default, for use with + `simple` alarms. + alarmLow: + type: boolean + description: >- + Enable/Disable client-side Low alarms by default, for use with + `simple` alarms. + alarmUrgentLow: + type: boolean + description: >- + Enable/Disable client-side Urgent Low alarms by default, for use + with `simple` alarms. + alarmTimeagoWarn: + type: boolean + description: Enable/Disable client-side stale data alarms by default. + alarmTimeagoWarnMins: + type: number + description: Number of minutes before a stale data warning is generated. + alarmTimeagoUrgent: + type: boolean + description: Enable/Disable client-side urgent stale data alarms by default. + alarmTimeagoUrgentMins: + type: number + description: Number of minutes before a stale data warning is generated. + enable: + type: array + items: + type: string + description: Enabled features + thresholds: + $ref: '#/components/schemas/Threshold' + Threshold: + properties: + bg_high: + type: integer + description: High BG range. + bg_target_top: + type: integer + description: Top of target range. + bg_target_bottom: + type: integer + description: Bottom of target range. + bg_low: + type: integer + description: Low BG range. + ExtendedSettings: + description: Extended settings of client side plugins + MongoQuery: + description: Mongo Query object. + Error: + properties: + code: + type: integer + format: int32 + message: + type: string + fields: + type: object \ No newline at end of file diff --git a/tests/admintools.test.js b/tests/admintools.test.js index f1851010bb1..b5be4858edb 100644 --- a/tests/admintools.test.js +++ b/tests/admintools.test.js @@ -67,7 +67,7 @@ describe('admintools', function ( ) { self.localCookieStorage = self.localStorage = self.$.localStorage = require('./fixtures/localstorage'); - self.$.fn.tipsy = function mockTipsy ( ) { }; + self.$.fn.tooltip = function mockTooltip ( ) { }; self.$.fn.dialog = function mockDialog (opts) { function maybeCall (name, obj) { diff --git a/tests/cob.test.js b/tests/cob.test.js index 9f917cb4639..dbbecda0b67 100644 --- a/tests/cob.test.js +++ b/tests/cob.test.js @@ -8,6 +8,7 @@ describe('COB', function ( ) { var ctx = {}; ctx.settings = {}; ctx.language = require('../lib/language')(); + ctx.language.set('en'); var cob = require('../lib/plugins/cob')(ctx); diff --git a/tests/fixtures/headless.js b/tests/fixtures/headless.js index 567262ad04d..8b59b7b5dba 100644 --- a/tests/fixtures/headless.js +++ b/tests/fixtures/headless.js @@ -24,7 +24,7 @@ function headless (benv, binding) { //self.$ = require('jquery'); //self.$.localStorage = require(localStorage); - self.$.fn.tipsy = function mockTipsy ( ) { }; + self.$.fn.tooltip = function mockTooltip ( ) { }; var indexHtml = read(htmlFile, 'utf8'); self.$('body').html(indexHtml); @@ -37,7 +37,7 @@ function headless (benv, binding) { self.$.plot = function mockPlot () { }; - self.$.fn.tipsy = function mockTipsy ( ) { }; + self.$.fn.tooltip = function mockTooltip ( ) { }; self.$.fn.dialog = function mockDialog (opts) { function maybeCall (name, obj) { diff --git a/tests/hashauth.test.js b/tests/hashauth.test.js index 19fb50cc69e..c8b1bf50f3b 100644 --- a/tests/hashauth.test.js +++ b/tests/hashauth.test.js @@ -33,7 +33,7 @@ describe('hashauth', function ( ) { self.$ = require('jquery'); self.$.localStorage = require('./fixtures/localstorage'); - self.$.fn.tipsy = function mockTipsy ( ) { }; + self.$.fn.tooltip = function mockTooltip ( ) { }; var indexHtml = read(__dirname + '/../static/index.html', 'utf8'); self.$('body').html(indexHtml); diff --git a/tests/loop.test.js b/tests/loop.test.js index 78580470430..ca2d33a8fa7 100644 --- a/tests/loop.test.js +++ b/tests/loop.test.js @@ -7,6 +7,7 @@ var moment = require('moment'); var ctx = { language: require('../lib/language')() }; +ctx.language.set('en'); var env = require('../env')(); var loop = require('../lib/plugins/loop')(ctx); var sandbox = require('../lib/sandbox')(); diff --git a/tests/openaps.test.js b/tests/openaps.test.js index 798e3519960..296caf2939a 100644 --- a/tests/openaps.test.js +++ b/tests/openaps.test.js @@ -7,6 +7,7 @@ var moment = require('moment'); var ctx = { language: require('../lib/language')() }; +ctx.language.set('en'); var env = require('../env')(); var openaps = require('../lib/plugins/openaps')(ctx); var sandbox = require('../lib/sandbox')(); diff --git a/tests/pump.test.js b/tests/pump.test.js index deb2b359a5a..3907acbcb5e 100644 --- a/tests/pump.test.js +++ b/tests/pump.test.js @@ -7,6 +7,7 @@ var moment = require('moment'); var ctx = { language: require('../lib/language')() }; +ctx.language.set('en'); var env = require('../env')(); var pump = require('../lib/plugins/pump')(ctx); var sandbox = require('../lib/sandbox')(); @@ -253,7 +254,7 @@ describe('pump', function ( ) { , notifications: require('../lib/notifications')(env, ctx) , language: require('../lib/language')() }; - + ctx.language.set('en'); var sbx = sandbox.clientInit(ctx, now.valueOf(), {devicestatus: statuses}); pump.setProperties(sbx); @@ -265,7 +266,7 @@ describe('pump', function ( ) { pump.alexa.intentHandlers[1].intentHandler(function next(title, response) { title.should.equal('Pump battery'); - response.should.equal('Your battery is at 1.52 volts'); + response.should.equal('Your pump battery is at 1.52 volts'); done(); }, [], sbx); diff --git a/tests/rawbg.test.js b/tests/rawbg.test.js index 4697bea900a..017fcf9d6df 100644 --- a/tests/rawbg.test.js +++ b/tests/rawbg.test.js @@ -3,10 +3,13 @@ require('should'); describe('Raw BG', function ( ) { - var rawbg = require('../lib/plugins/rawbg')({ - settings: {} - , language: require('../lib/language')() - }); + var ctx = { + settings: {} + , language: require('../lib/language')() + }; + ctx.language.set('en'); + + var rawbg = require('../lib/plugins/rawbg')(ctx); var now = Date.now(); var data = { diff --git a/tests/upbat.test.js b/tests/upbat.test.js index 0d70e581721..8585d0d8f9c 100644 --- a/tests/upbat.test.js +++ b/tests/upbat.test.js @@ -9,7 +9,9 @@ describe('Uploader Battery', function ( ) { var sandbox = require('../lib/sandbox')(); var ctx = { settings: {} + , language: require('../lib/language')() }; + ctx.language.set('en'); var sbx = sandbox.clientInit(ctx, Date.now(), data); sbx.offerProperty = function mockedOfferProperty (name, setter) { @@ -22,7 +24,7 @@ describe('Uploader Battery', function ( ) { done(); }; - var upbat = require('../lib/plugins/upbat')(); + var upbat = require('../lib/plugins/upbat')(ctx); upbat.setProperties(sbx); }); @@ -38,11 +40,13 @@ describe('Uploader Battery', function ( ) { done(); } } + , language: require('../lib/language')() }; + ctx.language.set('en'); var sandbox = require('../lib/sandbox')(); var sbx = sandbox.clientInit(ctx, Date.now(), data); - var upbat = require('../lib/plugins/upbat')(); + var upbat = require('../lib/plugins/upbat')(ctx); upbat.setProperties(sbx); upbat.updateVisualisation(sbx); @@ -57,11 +61,13 @@ describe('Uploader Battery', function ( ) { done(); } } + , language: require('../lib/language')() }; + ctx.language.set('en'); var sandbox = require('../lib/sandbox')(); var sbx = sandbox.clientInit(ctx, Date.now(), {}); - var upbat = require('../lib/plugins/upbat')(); + var upbat = require('../lib/plugins/upbat')(ctx); upbat.setProperties(sbx); upbat.updateVisualisation(sbx); }); @@ -74,12 +80,13 @@ describe('Uploader Battery', function ( ) { options.hide.should.equal(true); done(); } - } + }, language: require('../lib/language')() }; + ctx.language.set('en'); var sandbox = require('../lib/sandbox')(); var sbx = sandbox.clientInit(ctx, Date.now(), {devicestatus: [{uploader: {battery: -1}}]}); - var upbat = require('../lib/plugins/upbat')(); + var upbat = require('../lib/plugins/upbat')(ctx); upbat.setProperties(sbx); upbat.updateVisualisation(sbx); }); @@ -88,11 +95,13 @@ describe('Uploader Battery', function ( ) { var ctx = { settings: {} + , language: require('../lib/language')() }; + ctx.language.set('en'); var sandbox = require('../lib/sandbox')(); var sbx = sandbox.clientInit(ctx, Date.now(), data); - var upbat = require('../lib/plugins/upbat')(); + var upbat = require('../lib/plugins/upbat')(ctx); upbat.setProperties(sbx); upbat.alexa.intentHandlers.length.should.equal(1); diff --git a/views/bgclock.html b/views/bgclock.html index 183a5bb829f..903a395d56a 100644 --- a/views/bgclock.html +++ b/views/bgclock.html @@ -1,83 +1,142 @@ - - Nightscout BG NOW - - - + -
-

-

-
- - - + + + + init( ); + diff --git a/views/clock.html b/views/clock.html index 95f56a1e3f5..c0ac35d64be 100644 --- a/views/clock.html +++ b/views/clock.html @@ -1,78 +1,132 @@ - - Nightscout BG NOW - - - + + + + Nightscout + + + + + + + + + + + + + + +
-
-

+
+
+
+
+
+ - + init( ); + diff --git a/webpack.config.js b/webpack.config.js index fd5b9beaac4..fd3bd1251ad 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -7,19 +7,7 @@ var sourceMapType = 'source-map'; if (process.env.NODE_ENV !== 'development') { - console.log('Production environment detected, enabling UglifyJsPlugin'); - - var uglify = new webpack.optimize.UglifyJsPlugin({ - compress: { - warnings: false - }, - output: { - comments: false - } - , sourceMap: true - }); - - pluginArray.push(uglify); + console.log('Production environment detected. Enabling --optimize-minimize'); /* console.log('Development environment detected, enabling Bundle Analyzer');