diff --git a/assets/js/tracker.js b/assets/js/tracker.js index 7e99c37..db476a3 100644 --- a/assets/js/tracker.js +++ b/assets/js/tracker.js @@ -1,13 +1,6 @@ 'use strict'; -/* cookies.js - https://github.com/ScottHamper/Cookies */ -(function(d,f){"use strict";var h=function(d){if("object"!==typeof d.document)throw Error("Cookies.js requires a `window` with a `document` object");var b=function(a,e,c){return 1===arguments.length?b.get(a):b.set(a,e,c)};b._document=d.document;b._cacheKeyPrefix="cookey.";b._maxExpireDate=new Date("Fri, 31 Dec 9999 23:59:59 UTC");b.defaults={path:"/",secure:!1};b.get=function(a){b._cachedDocumentCookie!==b._document.cookie&&b._renewCache();a=b._cache[b._cacheKeyPrefix+a];return a===f?f:decodeURIComponent(a)}; -b.set=function(a,e,c){c=b._getExtendedOptions(c);c.expires=b._getExpiresDate(e===f?-1:c.expires);b._document.cookie=b._generateCookieString(a,e,c);return b};b.expire=function(a,e){return b.set(a,f,e)};b._getExtendedOptions=function(a){return{path:a&&a.path||b.defaults.path,domain:a&&a.domain||b.defaults.domain,expires:a&&a.expires||b.defaults.expires,secure:a&&a.secure!==f?a.secure:b.defaults.secure}};b._isValidDate=function(a){return"[object Date]"===Object.prototype.toString.call(a)&&!isNaN(a.getTime())}; -b._getExpiresDate=function(a,e){e=e||new Date;"number"===typeof a?a=Infinity===a?b._maxExpireDate:new Date(e.getTime()+1E3*a):"string"===typeof a&&(a=new Date(a));if(a&&!b._isValidDate(a))throw Error("`expires` parameter cannot be converted to a valid Date instance");return a};b._generateCookieString=function(a,b,c){a=a.replace(/[^#$&+\^`|]/g,encodeURIComponent);a=a.replace(/\(/g,"%28").replace(/\)/g,"%29");b=(b+"").replace(/[^!#$&-+\--:<-\[\]-~]/g,encodeURIComponent);c=c||{};a=a+"="+b+(c.path?";path="+ -c.path:"");a+=c.domain?";domain="+c.domain:"";a+=c.expires?";expires="+c.expires.toUTCString():"";return a+=c.secure?";secure":""};b._getCacheFromString=function(a){var e={};a=a?a.split("; "):[];for(var c=0;cb?a.length:b,c=a.substr(0,b),d;try{d=decodeURIComponent(c)}catch(k){console&&"function"=== -typeof console.error&&console.error('Could not decode cookie with key "'+c+'"',k)}return{key:d,value:a.substr(b+1)}};b._renewCache=function(){b._cache=b._getCacheFromString(b._document.cookie);b._cachedDocumentCookie=b._document.cookie};b._areEnabled=function(){var a="1"===b.set("cookies.js",1).get("cookies.js");b.expire("cookies.js");return a};b.enabled=b._areEnabled();return b},g=d&&"object"===typeof d.document?h(d):h;"function"===typeof define&&define.amd?define(function(){return g}):"object"=== -typeof exports?("object"===typeof module&&"object"===typeof module.exports&&(exports=module.exports=g),exports.Cookies=g):d.Cookies=g})("undefined"===typeof window?this:window); - +var cookies = require('cookies-js'); var queue = window.fathom.q || []; var trackerUrl = ''; var commands = { @@ -19,11 +12,6 @@ var commands = { function stringifyObject(json) { var keys = Object.keys(json); - // omit empty - keys = keys.filter(function(k) { - return json[k].length > 0; - }); - return '?' + keys.map(function(k) { return encodeURIComponent(k) + '=' + @@ -36,6 +24,25 @@ function generateKey() { return Array(16).join().split(',').map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join(''); } +function getData() { + var data = Cookies.get('_fathom'); + + if(data) { + try{ + data = JSON.parse(data); + return data; + } catch(e) { + console.error(e); + } + } + + return { + sid: generateKey(), + isNew: true, + pagesViewed: [], + } +} + function setTrackerUrl(v) { trackerUrl = v; } @@ -51,12 +58,6 @@ function trackPageview() { return; } - // set cookie with random visitor key, valid for 24 hours. - // visitor can delete this cookie in order to be forgotten - if(!Cookies.get('_fathom')) { - Cookies.set('_fathom', generateKey(), { expires: 60 * 60 * 24 }); - } - // get the path or canonical var path = location.pathname + location.search; @@ -68,21 +69,31 @@ function trackPageview() { path = a.pathname; } + let referrer = ''; + if(document.referrer.indexOf(location.hostname) < 0) { + referrer = document.referrer; + } + + let data = getData(); + var d = { - vk: Cookies.get('_fathom'), - h: location.hostname, - t: document.title, - l: navigator.language, + sid: data.sid, p: path, - sr: screen.width + "x" + screen.height, t: document.title, - ru: document.referrer, - rk: "", + r: referrer, scheme: location.protocol.substring(0, location.protocol.length - 1), + u: data.pagesViewed.indexOf(path) == -1 ? 1 : 0, + b: data.isNew ? 1 : 0, // because only new visitors can bounce. we update this server-side. + n: data.isNew ? 1 : 0, }; var i = document.createElement('img'); i.src = trackerUrl + stringifyObject(d); + i.addEventListener('load', function() { + data.pagesViewed.push(path); + data.isNew = false; + Cookies.set('_fathom', JSON.stringify(data), { expires: 60 * 60 * 24}); + }); document.body.appendChild(i); } diff --git a/fathom.go b/fathom.go index 9d25786..ff11c14 100644 --- a/fathom.go +++ b/fathom.go @@ -1,13 +1,13 @@ package main import ( + "os" + "github.com/joho/godotenv" - "github.com/robfig/cron" "github.com/usefathom/fathom/pkg/commands" - "github.com/usefathom/fathom/pkg/count" + "github.com/usefathom/fathom/pkg/counter" "github.com/usefathom/fathom/pkg/datastore" "gopkg.in/alecthomas/kingpin.v2" - "os" "github.com/kelseyhightower/envconfig" log "github.com/sirupsen/logrus" @@ -50,11 +50,6 @@ func main() { db := datastore.Init(dbcfg.Driver, dbcfg.Host, dbcfg.Name, dbcfg.User, dbcfg.Password) defer db.Close() - // setup cron to run count.Archive every hour - c := cron.New() - c.AddFunc("@hourly", count.Archive) - c.Start() - // parse & run cli commands app.Version("1.0") app.UsageTemplate(kingpin.CompactUsageTemplate) @@ -66,8 +61,10 @@ func main() { commands.Server(*serverPort, *serverWebRoot) case "archive": - commands.Archive() - + err := counter.Aggregate() + if err != nil { + log.Warn(err) + } } } diff --git a/gulpfile.js b/gulpfile.js index 9247fe6..e63b8a6 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -10,9 +10,10 @@ const gutil = require('gulp-util') const sass = require('gulp-sass') const uglify = require('gulp-uglify') const pump = require('pump') +const es = require('event-stream'); const debug = process.env.NODE_ENV !== 'production'; -let defaultTasks = [ 'browserify', 'sass', 'tracker', 'html', 'img' ] ; +let defaultTasks = [ 'browserify', 'sass', 'html', 'img' ] ; if( ! debug ) { defaultTasks.push( 'minify' ); } @@ -20,29 +21,33 @@ if( ! debug ) { gulp.task('default', defaultTasks); gulp.task('browserify', function () { - return browserify({ - entries: './assets/js/script.js', - debug: debug - }) - .transform("babelify", { - presets: ["es2015"], - plugins: [ - "transform-decorators-legacy", - ["transform-react-jsx", { "pragma":"h" } ] - ] - }) - .bundle() - .on('error', function(err){ - console.log(err.message); - this.emit('end'); - }) - .pipe(source('script.js')) - .pipe(buffer()) - .pipe(gulp.dest('./build/js/')) + let files = [ + './assets/js/script.js', + './assets/js/tracker.js', + ]; + + var tasks = files.map(function(entry) { + return browserify({ + entries: entry, + debug: debug + }) + .transform("babelify", { + presets: ["es2015"], + plugins: [ + "transform-decorators-legacy", + ["transform-react-jsx", { "pragma":"h" } ] + ] + }) + .bundle() + .pipe(source(entry.split('/').pop())) + .pipe(gulp.dest('./build/js/')) + }); + // create a merged stream + return es.merge.apply(null, tasks); }); gulp.task('minify', function(cb) { - process.env.NODE_ENV = 'production'; + process.env.NODE_ENV = 'production'; // why is this here? pump([ gulp.src('./build/js/*.js'), @@ -61,11 +66,6 @@ gulp.task('html', function() { .pipe(gulp.dest('./build')) }); -gulp.task('tracker', function() { - return gulp.src('./assets/js/tracker.js') - .pipe(gulp.dest('./build/js')) -}); - gulp.task('sass', function () { var files = './assets/sass/[^_]*.scss'; return gulp.src(files) @@ -76,7 +76,7 @@ gulp.task('sass', function () { }); gulp.task('watch', ['default'], function() { - gulp.watch(['./assets/js/**/*.js'], ['browserify', 'tracker'] ); + gulp.watch(['./assets/js/**/*.js'], ['browserify'] ); gulp.watch(['./assets/sass/**/**/*.scss'], ['sass'] ); gulp.watch(['./assets/**/*.html'], ['html'] ); gulp.watch(['./assets/img/**/*'], ['img'] ); diff --git a/package-lock.json b/package-lock.json index a8b6c93..9d6da51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,8 @@ "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", "dev": true, "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, "abbrev": { @@ -30,8 +30,8 @@ "integrity": "sha512-efP54n3d1aLfjL2UMdaXa6DsswwzJeI5rqhbFvXMrKiJ6eJFpf+7R0zN7t8IC+XKn2YOAFAv6xbBNgHUkoHWLw==", "dev": true, "requires": { - "acorn": "5.5.3", - "xtend": "4.0.1" + "acorn": "^5.4.1", + "xtend": "^4.0.1" }, "dependencies": { "acorn": { @@ -54,7 +54,7 @@ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { - "ansi-wrap": "0.1.0" + "ansi-wrap": "^0.1.0" } }, "ansi-gray": { @@ -102,8 +102,8 @@ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "dev": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "arr-diff": { @@ -190,9 +190,9 @@ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -222,7 +222,7 @@ "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", "dev": true, "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" } }, "async-foreach": { @@ -261,9 +261,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -272,25 +272,25 @@ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" }, "dependencies": { "convert-source-map": { @@ -307,14 +307,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" }, "dependencies": { "jsesc": { @@ -331,9 +331,9 @@ "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.2" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" } }, "babel-helper-call-delegate": { @@ -342,10 +342,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -354,10 +354,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-function-name": { @@ -366,11 +366,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -379,8 +379,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -389,8 +389,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -399,8 +399,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -409,9 +409,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-replace-supers": { @@ -420,12 +420,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -434,8 +434,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-messages": { @@ -444,7 +444,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -453,7 +453,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-syntax-decorators": { @@ -474,9 +474,9 @@ "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=", "dev": true, "requires": { - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -485,7 +485,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -494,7 +494,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -503,11 +503,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -516,15 +516,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -533,8 +533,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -543,7 +543,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -552,8 +552,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -562,7 +562,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -571,9 +571,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -582,7 +582,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -591,9 +591,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -602,10 +602,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -614,9 +614,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -625,9 +625,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -636,8 +636,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -646,12 +646,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -660,8 +660,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -670,7 +670,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -679,9 +679,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -690,7 +690,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -699,7 +699,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -708,9 +708,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-react-jsx": { @@ -719,9 +719,9 @@ "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "dev": true, "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-regenerator": { @@ -730,7 +730,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-strict-mode": { @@ -739,8 +739,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-preset-es2015": { @@ -749,30 +749,30 @@ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" } }, "babel-register": { @@ -781,13 +781,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.5", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -796,8 +796,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -806,11 +806,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -819,15 +819,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.5" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -836,10 +836,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babelify": { @@ -866,13 +866,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -881,7 +881,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -890,7 +890,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -899,7 +899,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -908,9 +908,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -934,7 +934,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "beeper": { @@ -949,8 +949,8 @@ "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { - "readable-stream": "2.3.6", - "safe-buffer": "5.1.1" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, "block-stream": { @@ -959,7 +959,7 @@ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "bn.js": { @@ -974,7 +974,7 @@ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { @@ -983,7 +983,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -993,16 +993,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -1011,7 +1011,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1028,12 +1028,12 @@ "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", "dev": true, "requires": { - "JSONStream": "1.3.2", - "combine-source-map": "0.8.0", - "defined": "1.0.0", - "safe-buffer": "5.1.1", - "through2": "2.0.3", - "umd": "3.0.3" + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" } }, "browser-resolve": { @@ -1059,54 +1059,54 @@ "integrity": "sha512-yotdAkp/ZbgDesHQBYU37zjc29JDH4iXT8hjzM1fdUVWogjARX0S1cKeX24Ci6zZ+jG+ADmCTRt6xvtmJnI+BQ==", "dev": true, "requires": { - "JSONStream": "1.3.2", - "assert": "1.4.1", - "browser-pack": "6.1.0", - "browser-resolve": "1.11.2", - "browserify-zlib": "0.2.0", - "buffer": "5.1.0", - "cached-path-relative": "1.0.1", - "concat-stream": "1.6.2", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "defined": "1.0.0", - "deps-sort": "2.0.0", - "domain-browser": "1.2.0", - "duplexer2": "0.1.4", - "events": "2.0.0", - "glob": "7.1.2", - "has": "1.0.1", - "htmlescape": "1.1.1", - "https-browserify": "1.0.0", - "inherits": "2.0.3", - "insert-module-globals": "7.0.6", - "labeled-stream-splicer": "2.0.1", - "mkdirp": "0.5.1", - "module-deps": "6.0.2", - "os-browserify": "0.3.0", - "parents": "1.0.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "read-only-stream": "2.0.0", - "readable-stream": "2.3.6", - "resolve": "1.7.1", - "shasum": "1.0.2", - "shell-quote": "1.6.1", - "stream-browserify": "2.0.1", - "stream-http": "2.8.1", - "string_decoder": "1.1.1", - "subarg": "1.0.0", - "syntax-error": "1.4.0", - "through2": "2.0.3", - "timers-browserify": "1.4.2", + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", "tty-browserify": "0.0.1", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "1.0.1", - "xtend": "4.0.1" + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" } }, "browserify-aes": { @@ -1115,12 +1115,12 @@ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -1129,9 +1129,9 @@ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.1", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -1140,9 +1140,9 @@ "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { @@ -1151,8 +1151,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -1161,13 +1161,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -1176,7 +1176,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "buffer": { @@ -1185,8 +1185,8 @@ "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", "dev": true, "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.11" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, "buffer-from": { @@ -1219,15 +1219,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "cached-path-relative": { @@ -1248,8 +1248,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "caseless": { @@ -1264,11 +1264,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "cipher-base": { @@ -1277,8 +1277,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "class-utils": { @@ -1287,10 +1287,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -1299,7 +1299,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -1310,9 +1310,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "clone": { @@ -1339,9 +1339,9 @@ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "dev": true, "requires": { - "inherits": "2.0.3", - "process-nextick-args": "2.0.0", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, "code-point-at": { @@ -1356,8 +1356,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { @@ -1366,7 +1366,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -1387,10 +1387,10 @@ "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", "dev": true, "requires": { - "convert-source-map": "1.1.3", - "inline-source-map": "0.6.2", - "lodash.memoize": "3.0.4", - "source-map": "0.5.7" + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" } }, "combined-stream": { @@ -1399,7 +1399,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -1425,10 +1425,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "console-browserify": { @@ -1437,7 +1437,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "console-control-strings": { @@ -1458,6 +1458,11 @@ "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true }, + "cookies-js": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookies-js/-/cookies-js-1.2.3.tgz", + "integrity": "sha1-AzFQSefFK+4/cxhqaRZ+qw3bLTE=" + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -1481,8 +1486,8 @@ "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -1491,11 +1496,11 @@ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.4", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -1504,12 +1509,12 @@ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.1", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { @@ -1518,8 +1523,8 @@ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "dev": true, "requires": { - "lru-cache": "4.1.2", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "which": "^1.2.9" }, "dependencies": { "lru-cache": { @@ -1528,8 +1533,8 @@ "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } } } @@ -1540,7 +1545,7 @@ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "crypto-browserify": { @@ -1549,17 +1554,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "currently-unhandled": { @@ -1568,7 +1573,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "d3": { @@ -1576,37 +1581,37 @@ "resolved": "https://registry.npmjs.org/d3/-/d3-5.1.0.tgz", "integrity": "sha512-2ltUUsAuolg5+AfgRBkZBFOUcR+UsWc2vAixBSiw6cFqdSCEufPavYI6lPdL68dgNOaMp4sggwJ3BnJElm7tyQ==", "requires": { - "d3-array": "1.2.1", - "d3-axis": "1.0.8", - "d3-brush": "1.0.4", - "d3-chord": "1.0.4", - "d3-collection": "1.0.4", - "d3-color": "1.1.0", - "d3-contour": "1.2.0", - "d3-dispatch": "1.0.3", - "d3-drag": "1.2.1", - "d3-dsv": "1.0.8", - "d3-ease": "1.0.3", - "d3-fetch": "1.1.0", - "d3-force": "1.1.0", - "d3-format": "1.2.2", - "d3-geo": "1.10.0", - "d3-hierarchy": "1.1.6", - "d3-interpolate": "1.1.6", - "d3-path": "1.0.5", - "d3-polygon": "1.0.3", - "d3-quadtree": "1.0.3", - "d3-random": "1.1.0", - "d3-scale": "2.0.0", - "d3-scale-chromatic": "1.2.0", - "d3-selection": "1.3.0", - "d3-shape": "1.2.0", - "d3-time": "1.0.8", - "d3-time-format": "2.1.1", - "d3-timer": "1.0.7", - "d3-transition": "1.1.1", - "d3-voronoi": "1.1.2", - "d3-zoom": "1.7.1" + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" } }, "d3-array": { @@ -1624,11 +1629,11 @@ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz", "integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=", "requires": { - "d3-dispatch": "1.0.3", - "d3-drag": "1.2.1", - "d3-interpolate": "1.1.6", - "d3-selection": "1.3.0", - "d3-transition": "1.1.1" + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" } }, "d3-chord": { @@ -1636,8 +1641,8 @@ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz", "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=", "requires": { - "d3-array": "1.2.1", - "d3-path": "1.0.5" + "d3-array": "1", + "d3-path": "1" } }, "d3-collection": { @@ -1655,7 +1660,7 @@ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.2.0.tgz", "integrity": "sha512-nDzZ2KDnrgTrhMjV8TH0RNrljk6uPNAGkG/v/1SKNVvJa2JU8szjh7o2ZYTX8yufA2oCI5HyeMqbzwiB+oDoIA==", "requires": { - "d3-array": "1.2.1" + "d3-array": "^1.1.1" } }, "d3-dispatch": { @@ -1668,8 +1673,8 @@ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz", "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==", "requires": { - "d3-dispatch": "1.0.3", - "d3-selection": "1.3.0" + "d3-dispatch": "1", + "d3-selection": "1" } }, "d3-dsv": { @@ -1677,9 +1682,9 @@ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz", "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==", "requires": { - "commander": "2.15.1", - "iconv-lite": "0.4.21", - "rw": "1.3.3" + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" } }, "d3-ease": { @@ -1692,7 +1697,7 @@ "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.0.tgz", "integrity": "sha512-j+V4vtT6dceQbcKYLtpTueB8Zvc+wb9I93WaFtEQIYNADXl0c1ZJMN3qQo0CssiTsAqK8pePwc7f4qiW+b0WOg==", "requires": { - "d3-dsv": "1.0.8" + "d3-dsv": "1" } }, "d3-force": { @@ -1700,10 +1705,10 @@ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", "requires": { - "d3-collection": "1.0.4", - "d3-dispatch": "1.0.3", - "d3-quadtree": "1.0.3", - "d3-timer": "1.0.7" + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" } }, "d3-format": { @@ -1716,7 +1721,7 @@ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.10.0.tgz", "integrity": "sha512-VK/buVGgexthTTqGRNXQ/LSo3EbOFu4p2Pjud5drSIaEnOaF2moc8A3P7WEljEO1JEBEwbpAJjFWMuJiUtoBcw==", "requires": { - "d3-array": "1.2.1" + "d3-array": "1" } }, "d3-hierarchy": { @@ -1729,7 +1734,7 @@ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==", "requires": { - "d3-color": "1.1.0" + "d3-color": "1" } }, "d3-path": { @@ -1762,10 +1767,10 @@ "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz", "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==", "requires": { - "d3-collection": "1.0.4", - "d3-dispatch": "1.0.3", - "d3-dsv": "1.0.8", - "xmlhttprequest": "1.8.0" + "d3-collection": "1", + "d3-dispatch": "1", + "d3-dsv": "1", + "xmlhttprequest": "1" } }, "d3-scale": { @@ -1773,12 +1778,12 @@ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.0.0.tgz", "integrity": "sha512-Sa2Ny6CoJT7x6dozxPnvUQT61epGWsgppFvnNl8eJEzfJBG0iDBBTJAtz2JKem7Mb+NevnaZiDiIDHsuWkv6vg==", "requires": { - "d3-array": "1.2.1", - "d3-collection": "1.0.4", - "d3-format": "1.2.2", - "d3-interpolate": "1.1.6", - "d3-time": "1.0.8", - "d3-time-format": "2.1.1" + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" } }, "d3-scale-chromatic": { @@ -1786,8 +1791,8 @@ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.2.0.tgz", "integrity": "sha512-qQUhLi8fPe/F0b0M46C6eFUbms5IIMHuhJ5DKjjzBUvm1b6aPtygJzGbrMdMUD/ckLBq+NdWwHeN2cpMDp4Q5Q==", "requires": { - "d3-color": "1.1.0", - "d3-interpolate": "1.1.6" + "d3-color": "1", + "d3-interpolate": "1" } }, "d3-selection": { @@ -1800,7 +1805,7 @@ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", "requires": { - "d3-path": "1.0.5" + "d3-path": "1" } }, "d3-time": { @@ -1813,7 +1818,7 @@ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", "requires": { - "d3-time": "1.0.8" + "d3-time": "1" } }, "d3-timer": { @@ -1826,7 +1831,7 @@ "resolved": "https://registry.npmjs.org/d3-tip/-/d3-tip-0.7.1.tgz", "integrity": "sha1-eMv1VPZ7cgpw47DxkeFM/+aM3Xk=", "requires": { - "d3": "4.13.0" + "d3": "^4.2" }, "dependencies": { "d3": { @@ -1876,7 +1881,7 @@ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz", "integrity": "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==", "requires": { - "d3-array": "1.2.1" + "d3-array": "1" } }, "d3-hierarchy": { @@ -1889,13 +1894,13 @@ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", "requires": { - "d3-array": "1.2.1", - "d3-collection": "1.0.4", - "d3-color": "1.0.3", - "d3-format": "1.2.2", - "d3-interpolate": "1.1.6", - "d3-time": "1.0.8", - "d3-time-format": "2.1.1" + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" } } } @@ -1905,12 +1910,12 @@ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz", "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==", "requires": { - "d3-color": "1.1.0", - "d3-dispatch": "1.0.3", - "d3-ease": "1.0.3", - "d3-interpolate": "1.1.6", - "d3-selection": "1.3.0", - "d3-timer": "1.0.7" + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" } }, "d3-voronoi": { @@ -1923,11 +1928,11 @@ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz", "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==", "requires": { - "d3-dispatch": "1.0.3", - "d3-drag": "1.2.1", - "d3-interpolate": "1.1.6", - "d3-selection": "1.3.0", - "d3-transition": "1.1.1" + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" } }, "dashdash": { @@ -1936,7 +1941,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -1991,7 +1996,7 @@ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "requires": { - "clone": "1.0.4" + "clone": "^1.0.2" } }, "define-property": { @@ -2000,8 +2005,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -2010,7 +2015,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -2019,7 +2024,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2028,9 +2033,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -2071,10 +2076,10 @@ "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", "dev": true, "requires": { - "JSONStream": "1.3.2", - "shasum": "1.0.2", - "subarg": "1.0.0", - "through2": "2.0.3" + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" } }, "des.js": { @@ -2083,8 +2088,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "detect-file": { @@ -2099,7 +2104,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "detective": { @@ -2108,9 +2113,9 @@ "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", "dev": true, "requires": { - "acorn-node": "1.3.0", - "defined": "1.0.0", - "minimist": "1.2.0" + "acorn-node": "^1.3.0", + "defined": "^1.0.0", + "minimist": "^1.1.1" }, "dependencies": { "minimist": { @@ -2127,9 +2132,9 @@ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "domain-browser": { @@ -2138,13 +2143,19 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.2" } }, "ecc-jsbn": { @@ -2154,7 +2165,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "elliptic": { @@ -2163,13 +2174,13 @@ "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "end-of-stream": { @@ -2177,7 +2188,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "error-ex": { @@ -2186,7 +2197,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { @@ -2201,6 +2212,21 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "event-stream": { + "version": "3.3.4", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, "events": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/events/-/events-2.0.0.tgz", @@ -2213,8 +2239,8 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "expand-brackets": { @@ -2223,13 +2249,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -2238,7 +2264,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -2247,7 +2273,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -2258,7 +2284,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } }, "extend": { @@ -2273,8 +2299,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -2283,7 +2309,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -2294,14 +2320,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -2310,7 +2336,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -2319,7 +2345,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -2328,7 +2354,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -2337,7 +2363,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2346,9 +2372,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -2371,9 +2397,9 @@ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", "dev": true, "requires": { - "ansi-gray": "0.1.1", - "color-support": "1.1.3", - "time-stamp": "1.1.0" + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "time-stamp": "^1.0.0" } }, "fill-range": { @@ -2382,10 +2408,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -2394,7 +2420,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -2411,8 +2437,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "findup-sync": { @@ -2421,10 +2447,10 @@ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "requires": { - "detect-file": "1.0.0", - "is-glob": "3.1.0", - "micromatch": "3.1.10", - "resolve-dir": "1.0.1" + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" } }, "fined": { @@ -2433,11 +2459,11 @@ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0", - "object.pick": "1.3.0", - "parse-filepath": "1.0.2" + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" } }, "first-chunk-stream": { @@ -2464,7 +2490,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "forever-agent": { @@ -2479,9 +2505,9 @@ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "fragment-cache": { @@ -2490,9 +2516,15 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2505,10 +2537,10 @@ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" }, "dependencies": { "graceful-fs": { @@ -2531,14 +2563,14 @@ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "gaze": { @@ -2547,7 +2579,7 @@ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", "dev": true, "requires": { - "globule": "0.1.0" + "globule": "~0.1.0" } }, "generate-function": { @@ -2562,7 +2594,7 @@ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, "requires": { - "is-property": "1.0.2" + "is-property": "^1.0.0" } }, "get-caller-file": { @@ -2589,7 +2621,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2606,12 +2638,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-stream": { @@ -2620,12 +2652,12 @@ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", "dev": true, "requires": { - "glob": "4.5.3", - "glob2base": "0.0.12", - "minimatch": "2.0.10", - "ordered-read-streams": "0.1.0", - "through2": "0.6.5", - "unique-stream": "1.0.0" + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" }, "dependencies": { "glob": { @@ -2634,10 +2666,10 @@ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" } }, "isarray": { @@ -2652,7 +2684,7 @@ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.0.0" } }, "readable-stream": { @@ -2661,10 +2693,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -2679,8 +2711,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } @@ -2691,7 +2723,7 @@ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", "dev": true, "requires": { - "gaze": "0.5.2" + "gaze": "^0.5.1" } }, "glob2base": { @@ -2700,7 +2732,7 @@ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", "dev": true, "requires": { - "find-index": "0.1.1" + "find-index": "^0.1.1" } }, "global-modules": { @@ -2709,9 +2741,9 @@ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { @@ -2720,11 +2752,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.0" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { @@ -2739,9 +2771,9 @@ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", "dev": true, "requires": { - "glob": "3.1.21", - "lodash": "1.0.2", - "minimatch": "0.2.14" + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" }, "dependencies": { "glob": { @@ -2750,9 +2782,9 @@ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", "dev": true, "requires": { - "graceful-fs": "1.2.3", - "inherits": "1.0.2", - "minimatch": "0.2.14" + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" } }, "graceful-fs": { @@ -2779,8 +2811,8 @@ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "dev": true, "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "lru-cache": "2", + "sigmund": "~1.0.0" } } } @@ -2790,7 +2822,7 @@ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", "requires": { - "sparkles": "1.0.0" + "sparkles": "^1.0.0" } }, "graceful-fs": { @@ -2799,7 +2831,7 @@ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", "dev": true, "requires": { - "natives": "1.1.3" + "natives": "^1.1.0" } }, "gulp": { @@ -2808,19 +2840,19 @@ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", "dev": true, "requires": { - "archy": "1.0.0", - "chalk": "1.1.3", - "deprecated": "0.0.1", - "gulp-util": "3.0.8", - "interpret": "1.1.0", - "liftoff": "2.5.0", - "minimist": "1.2.0", - "orchestrator": "0.3.8", - "pretty-hrtime": "1.0.3", - "semver": "4.3.6", - "tildify": "1.2.0", - "v8flags": "2.1.1", - "vinyl-fs": "0.3.14" + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" }, "dependencies": { "minimist": { @@ -2843,14 +2875,14 @@ "integrity": "sha512-OMQEgWNggpog8Tc5v1MuI6eo+5iiPkVeLL76iBhDoEEScLUPfZlpvzmgTnLkpcqdrNodZxpz5qcv6mS2rulk3g==", "dev": true, "requires": { - "chalk": "2.4.0", - "lodash.clonedeep": "4.5.0", - "node-sass": "4.8.3", - "plugin-error": "1.0.1", - "replace-ext": "1.0.0", - "strip-ansi": "4.0.0", - "through2": "2.0.3", - "vinyl-sourcemaps-apply": "0.2.1" + "chalk": "^2.3.0", + "lodash.clonedeep": "^4.3.2", + "node-sass": "^4.8.3", + "plugin-error": "^1.0.1", + "replace-ext": "^1.0.0", + "strip-ansi": "^4.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" }, "dependencies": { "ansi-regex": { @@ -2865,7 +2897,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2874,9 +2906,9 @@ "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "replace-ext": { @@ -2891,7 +2923,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -2900,7 +2932,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -2910,13 +2942,13 @@ "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.0.tgz", "integrity": "sha1-DfAzHXKg0wLj434QlIXd3zPG0co=", "requires": { - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash": "4.17.5", - "make-error-cause": "1.2.2", - "through2": "2.0.3", - "uglify-js": "3.3.21", - "vinyl-sourcemaps-apply": "0.2.1" + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash": "^4.13.1", + "make-error-cause": "^1.1.1", + "through2": "^2.0.0", + "uglify-js": "^3.0.5", + "vinyl-sourcemaps-apply": "^0.2.0" } }, "gulp-util": { @@ -2925,24 +2957,24 @@ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", "dev": true, "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.3", - "beeper": "1.1.1", - "chalk": "1.1.3", - "dateformat": "2.2.0", - "fancy-log": "1.3.2", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", "replace-ext": "0.0.1", - "through2": "2.0.3", - "vinyl": "0.5.3" + "through2": "^2.0.0", + "vinyl": "^0.5.0" }, "dependencies": { "minimist": { @@ -2964,7 +2996,7 @@ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "requires": { - "glogg": "1.0.1" + "glogg": "^1.0.0" } }, "har-validator": { @@ -2973,10 +3005,10 @@ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, "requires": { - "chalk": "1.1.3", - "commander": "2.15.1", - "is-my-json-valid": "2.17.2", - "pinkie-promise": "2.0.1" + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" } }, "has": { @@ -2985,7 +3017,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -2994,7 +3026,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -3008,7 +3040,7 @@ "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", "requires": { - "sparkles": "1.0.0" + "sparkles": "^1.0.0" } }, "has-unicode": { @@ -3023,9 +3055,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -3034,8 +3066,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -3044,7 +3076,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3055,8 +3087,8 @@ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { @@ -3065,8 +3097,8 @@ "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, "hawk": { @@ -3075,10 +3107,10 @@ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hmac-drbg": { @@ -3087,9 +3119,9 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { @@ -3104,8 +3136,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "homedir-polyfill": { @@ -3114,7 +3146,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -3135,9 +3167,9 @@ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -3151,7 +3183,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "^2.1.0" } }, "ieee754": { @@ -3172,7 +3204,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "inflight": { @@ -3181,8 +3213,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3202,7 +3234,7 @@ "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "~0.5.3" } }, "insert-module-globals": { @@ -3211,15 +3243,15 @@ "integrity": "sha512-R3sidKJr3SsggqQQ5cEwQb3pWG8RNx0UnpyeiOSR6jorRIeAOzH2gkTWnNdMnyRiVbjrG047K7UCtlMkQ1Mo9w==", "dev": true, "requires": { - "JSONStream": "1.3.2", - "combine-source-map": "0.8.0", - "concat-stream": "1.6.2", - "is-buffer": "1.1.6", - "lexical-scope": "1.2.0", - "path-is-absolute": "1.0.1", - "process": "0.11.10", - "through2": "2.0.3", - "xtend": "4.0.1" + "JSONStream": "^1.0.3", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "lexical-scope": "^1.2.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" } }, "interpret": { @@ -3234,7 +3266,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -3249,8 +3281,8 @@ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "requires": { - "is-relative": "1.0.0", - "is-windows": "1.0.2" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, "is-accessor-descriptor": { @@ -3259,7 +3291,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -3280,7 +3312,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-data-descriptor": { @@ -3289,7 +3321,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-descriptor": { @@ -3298,9 +3330,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -3329,7 +3361,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -3338,7 +3370,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -3347,7 +3379,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } }, "is-my-ip-valid": { @@ -3362,11 +3394,11 @@ "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", "dev": true, "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, "is-number": { @@ -3375,7 +3407,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-odd": { @@ -3384,7 +3416,7 @@ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -3401,7 +3433,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-property": { @@ -3416,7 +3448,7 @@ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "requires": { - "is-unc-path": "1.0.0" + "is-unc-path": "^1.0.0" } }, "is-typedarray": { @@ -3431,7 +3463,7 @@ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "requires": { - "unc-path-regex": "0.1.2" + "unc-path-regex": "^0.1.2" } }, "is-utf8": { @@ -3506,7 +3538,7 @@ "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -3565,7 +3597,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "labeled-stream-splicer": { @@ -3574,9 +3606,9 @@ "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", "dev": true, "requires": { - "inherits": "2.0.3", - "isarray": "2.0.4", - "stream-splicer": "2.0.0" + "inherits": "^2.0.1", + "isarray": "^2.0.4", + "stream-splicer": "^2.0.0" }, "dependencies": { "isarray": { @@ -3593,7 +3625,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "lexical-scope": { @@ -3602,7 +3634,7 @@ "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", "dev": true, "requires": { - "astw": "2.2.0" + "astw": "^2.0.0" } }, "liftoff": { @@ -3611,14 +3643,14 @@ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", "dev": true, "requires": { - "extend": "3.0.1", - "findup-sync": "2.0.0", - "fined": "1.1.0", - "flagged-respawn": "1.0.0", - "is-plain-object": "2.0.4", - "object.map": "1.0.1", - "rechoir": "0.6.2", - "resolve": "1.7.1" + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" } }, "load-json-file": { @@ -3627,11 +3659,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, "dependencies": { "graceful-fs": { @@ -3646,7 +3678,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -3728,7 +3760,7 @@ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", "dev": true, "requires": { - "lodash._root": "3.0.1" + "lodash._root": "^3.0.0" } }, "lodash.isarguments": { @@ -3749,9 +3781,9 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, "lodash.memoize": { @@ -3778,15 +3810,15 @@ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", "dev": true, "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" } }, "lodash.templatesettings": { @@ -3795,8 +3827,8 @@ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", "dev": true, "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" } }, "loose-envify": { @@ -3805,7 +3837,7 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "loud-rejection": { @@ -3814,8 +3846,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lru-cache": { @@ -3834,7 +3866,7 @@ "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", "requires": { - "make-error": "1.3.4" + "make-error": "^1.2.0" } }, "make-iterator": { @@ -3843,7 +3875,7 @@ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -3866,13 +3898,19 @@ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "md5.js": { @@ -3881,8 +3919,8 @@ "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "meow": { @@ -3891,16 +3929,16 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": 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" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "dependencies": { "minimist": { @@ -3917,19 +3955,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3946,8 +3984,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime-db": { @@ -3962,7 +4000,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "minimalistic-assert": { @@ -3983,7 +4021,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3998,8 +4036,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -4008,7 +4046,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -4028,21 +4066,21 @@ "integrity": "sha512-KWBI3009iRnHjRlxRhe8nJ6kdeBTg4sMi5N6AZgg5f1/v5S7EBCRBOY854I4P5Anl4kx6AJH+4bBBC2Gi3nkvg==", "dev": true, "requires": { - "JSONStream": "1.3.2", - "browser-resolve": "1.11.2", - "cached-path-relative": "1.0.1", - "concat-stream": "1.6.2", - "defined": "1.0.0", - "detective": "5.1.0", - "duplexer2": "0.1.4", - "inherits": "2.0.3", - "parents": "1.0.1", - "readable-stream": "2.3.6", - "resolve": "1.7.1", - "stream-combiner2": "1.1.1", - "subarg": "1.0.0", - "through2": "2.0.3", - "xtend": "4.0.1" + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" } }, "ms": { @@ -4066,7 +4104,7 @@ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "dev": true, "requires": { - "readable-stream": "1.1.14" + "readable-stream": "~1.1.9" } }, "isarray": { @@ -4081,10 +4119,10 @@ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -4107,18 +4145,18 @@ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "kind-of": { @@ -4141,19 +4179,19 @@ "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", "dev": true, "requires": { - "fstream": "1.0.11", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.79.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.0" + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "2", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" }, "dependencies": { "graceful-fs": { @@ -4176,25 +4214,25 @@ "integrity": "sha512-tfFWhUsCk/Y19zarDcPo5xpj+IW3qCfOjVdHtYeG6S1CKbQOh1zqylnQK6cV3z9k80yxAnFX9Y+a9+XysDhhfg==", "dev": true, "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.2", - "get-stdin": "4.0.1", - "glob": "7.1.2", - "in-publish": "2.0.0", - "lodash.assign": "4.2.0", - "lodash.clonedeep": "4.5.0", - "lodash.mergewith": "4.6.1", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.10.0", - "node-gyp": "3.6.2", - "npmlog": "4.1.2", - "request": "2.79.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.0", - "true-case-path": "1.0.2" + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "node-gyp": "^3.3.1", + "npmlog": "^4.0.0", + "request": "~2.79.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" }, "dependencies": { "gaze": { @@ -4203,7 +4241,7 @@ "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", "dev": true, "requires": { - "globule": "1.2.0" + "globule": "^1.0.0" } }, "globule": { @@ -4212,9 +4250,9 @@ "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", "dev": true, "requires": { - "glob": "7.1.2", - "lodash": "4.17.5", - "minimatch": "3.0.4" + "glob": "~7.1.1", + "lodash": "~4.17.4", + "minimatch": "~3.0.2" } } } @@ -4225,7 +4263,7 @@ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.1.1" + "abbrev": "1" } }, "normalize-package-data": { @@ -4234,10 +4272,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "4.3.6", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "npmlog": { @@ -4246,10 +4284,10 @@ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -4276,9 +4314,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -4287,7 +4325,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -4298,7 +4336,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.defaults": { @@ -4307,10 +4345,10 @@ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { - "array-each": "1.0.1", - "array-slice": "1.1.0", - "for-own": "1.0.0", - "isobject": "3.0.1" + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" } }, "object.map": { @@ -4319,8 +4357,8 @@ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dev": true, "requires": { - "for-own": "1.0.0", - "make-iterator": "1.0.1" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, "object.pick": { @@ -4329,7 +4367,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "once": { @@ -4337,7 +4375,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "orchestrator": { @@ -4346,9 +4384,9 @@ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", "dev": true, "requires": { - "end-of-stream": "0.1.5", - "sequencify": "0.0.7", - "stream-consume": "0.1.1" + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" }, "dependencies": { "end-of-stream": { @@ -4357,7 +4395,7 @@ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", "dev": true, "requires": { - "once": "1.3.3" + "once": "~1.3.0" } }, "once": { @@ -4366,7 +4404,7 @@ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } } } @@ -4395,7 +4433,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { @@ -4410,8 +4448,8 @@ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "pako": { @@ -4426,7 +4464,7 @@ "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", "dev": true, "requires": { - "path-platform": "0.11.15" + "path-platform": "~0.11.15" } }, "parse-asn1": { @@ -4435,11 +4473,11 @@ "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.16" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-filepath": { @@ -4448,9 +4486,9 @@ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, "requires": { - "is-absolute": "1.0.0", - "map-cache": "0.2.2", - "path-root": "0.1.1" + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" } }, "parse-json": { @@ -4459,7 +4497,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse-passwd": { @@ -4486,7 +4524,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -4513,7 +4551,7 @@ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { - "path-root-regex": "0.1.2" + "path-root-regex": "^0.1.0" } }, "path-root-regex": { @@ -4528,9 +4566,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "graceful-fs": { @@ -4541,17 +4579,26 @@ } } }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" + } + }, "pbkdf2": { "version": "3.0.16", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "dev": true, "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.1", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "pify": { @@ -4572,7 +4619,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "plugin-error": { @@ -4581,10 +4628,10 @@ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { - "ansi-colors": "1.1.0", - "arr-diff": "4.0.0", - "arr-union": "3.1.0", - "extend-shallow": "3.0.2" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" } }, "posix-character-classes": { @@ -4633,11 +4680,11 @@ "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "pump": { @@ -4645,8 +4692,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "punycode": { @@ -4679,7 +4726,7 @@ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -4688,8 +4735,8 @@ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "read-only-stream": { @@ -4698,7 +4745,7 @@ "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.2" } }, "read-pkg": { @@ -4707,9 +4754,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -4718,8 +4765,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -4727,13 +4774,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rechoir": { @@ -4742,7 +4789,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.7.1" + "resolve": "^1.1.6" } }, "redent": { @@ -4751,8 +4798,8 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "regenerate": { @@ -4773,9 +4820,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-not": { @@ -4784,8 +4831,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -4794,9 +4841,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -4811,7 +4858,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } }, "remove-trailing-separator": { @@ -4838,7 +4885,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "replace-ext": { @@ -4853,26 +4900,26 @@ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", "dev": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.7.0", - "caseless": "0.11.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.4.3", - "uuid": "3.2.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "qs": "~6.3.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1", + "uuid": "^3.0.0" } }, "require-directory": { @@ -4893,7 +4940,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-dir": { @@ -4902,8 +4949,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, "resolve-url": { @@ -4924,7 +4971,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "ripemd160": { @@ -4933,8 +4980,8 @@ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "rw": { @@ -4953,7 +5000,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -4967,10 +5014,10 @@ "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", "dev": true, "requires": { - "glob": "7.1.2", - "lodash": "4.17.5", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" } }, "scss-tokenizer": { @@ -4979,8 +5026,8 @@ "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "dev": true, "requires": { - "js-base64": "2.4.3", - "source-map": "0.4.4" + "js-base64": "^2.1.8", + "source-map": "^0.4.2" }, "dependencies": { "source-map": { @@ -4989,7 +5036,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -5018,10 +5065,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -5030,7 +5077,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5041,8 +5088,8 @@ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shasum": { @@ -5051,8 +5098,8 @@ "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { - "json-stable-stringify": "0.0.1", - "sha.js": "2.4.11" + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" } }, "shell-quote": { @@ -5061,10 +5108,10 @@ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "dev": true, "requires": { - "array-filter": "0.0.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" } }, "sigmund": { @@ -5091,14 +5138,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -5107,7 +5154,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -5116,7 +5163,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5127,9 +5174,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -5138,7 +5185,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -5147,7 +5194,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -5156,7 +5203,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -5165,9 +5212,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -5184,7 +5231,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "sntp": { @@ -5193,7 +5240,7 @@ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "source-map": { @@ -5207,11 +5254,11 @@ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", "dev": true, "requires": { - "atob": "2.1.0", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -5220,7 +5267,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "source-map-url": { @@ -5240,8 +5287,8 @@ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -5256,8 +5303,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -5266,13 +5313,22 @@ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", "dev": true }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sshpk": { @@ -5281,14 +5337,14 @@ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -5305,8 +5361,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -5315,7 +5371,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -5326,7 +5382,7 @@ "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.1" } }, "stream-browserify": { @@ -5335,8 +5391,17 @@ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "~0.1.1" } }, "stream-combiner2": { @@ -5345,8 +5410,8 @@ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", "dev": true, "requires": { - "duplexer2": "0.1.4", - "readable-stream": "2.3.6" + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, "stream-consume": { @@ -5361,11 +5426,11 @@ "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "stream-splicer": { @@ -5374,8 +5439,8 @@ "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, "string-width": { @@ -5384,9 +5449,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -5394,7 +5459,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringstream": { @@ -5409,7 +5474,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -5418,8 +5483,8 @@ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", "dev": true, "requires": { - "first-chunk-stream": "1.0.0", - "is-utf8": "0.2.1" + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" } }, "strip-indent": { @@ -5428,7 +5493,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "subarg": { @@ -5437,7 +5502,7 @@ "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.1.0" }, "dependencies": { "minimist": { @@ -5460,7 +5525,7 @@ "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", "dev": true, "requires": { - "acorn-node": "1.3.0" + "acorn-node": "^1.2.0" } }, "tar": { @@ -5469,9 +5534,9 @@ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "through": { @@ -5485,8 +5550,8 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "tildify": { @@ -5495,7 +5560,7 @@ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } }, "time-stamp": { @@ -5510,7 +5575,7 @@ "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", "dev": true, "requires": { - "process": "0.11.10" + "process": "~0.11.0" } }, "to-arraybuffer": { @@ -5531,7 +5596,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -5540,10 +5605,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -5552,8 +5617,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "tough-cookie": { @@ -5562,7 +5627,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "trim-newlines": { @@ -5583,7 +5648,7 @@ "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", "dev": true, "requires": { - "glob": "6.0.4" + "glob": "^6.0.4" }, "dependencies": { "glob": { @@ -5592,11 +5657,11 @@ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -5631,8 +5696,8 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.21.tgz", "integrity": "sha512-uy82472lH8tshK3jS3c5IFb5MmNKd/5qyBd0ih8sM42L3jWvxnE339U9gZU1zufnLVs98Stib9twq8dLm2XYCA==", "requires": { - "commander": "2.15.1", - "source-map": "0.6.1" + "commander": "~2.15.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -5660,10 +5725,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -5672,7 +5737,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -5681,10 +5746,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -5701,8 +5766,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -5711,9 +5776,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -5765,7 +5830,7 @@ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -5816,7 +5881,7 @@ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "1.1.1" + "user-home": "^1.1.1" } }, "validate-npm-package-license": { @@ -5825,8 +5890,8 @@ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "verror": { @@ -5835,9 +5900,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" }, "dependencies": { "assert-plus": { @@ -5854,8 +5919,8 @@ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", "dev": true, "requires": { - "clone": "1.0.4", - "clone-stats": "0.0.1", + "clone": "^1.0.0", + "clone-stats": "^0.0.1", "replace-ext": "0.0.1" } }, @@ -5865,8 +5930,8 @@ "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=", "dev": true, "requires": { - "bl": "1.2.2", - "through2": "2.0.3" + "bl": "^1.2.1", + "through2": "^2.0.3" } }, "vinyl-fs": { @@ -5875,14 +5940,14 @@ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", "dev": true, "requires": { - "defaults": "1.0.3", - "glob-stream": "3.1.18", - "glob-watcher": "0.0.6", - "graceful-fs": "3.0.11", - "mkdirp": "0.5.1", - "strip-bom": "1.0.0", - "through2": "0.6.5", - "vinyl": "0.4.6" + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" }, "dependencies": { "clone": { @@ -5903,10 +5968,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -5921,8 +5986,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } }, "vinyl": { @@ -5931,8 +5996,8 @@ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" + "clone": "^0.2.0", + "clone-stats": "^0.0.1" } } } @@ -5943,8 +6008,8 @@ "integrity": "sha1-84pa+53R6Ttl1VBGmsYYKsT1S44=", "dev": true, "requires": { - "through2": "2.0.3", - "vinyl": "2.1.0" + "through2": "^2.0.3", + "vinyl": "^2.1.0" }, "dependencies": { "clone": { @@ -5971,12 +6036,12 @@ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "dev": true, "requires": { - "clone": "2.1.2", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.1.2", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } } } @@ -5986,7 +6051,7 @@ "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.1" } }, "vm-browserify": { @@ -6001,7 +6066,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -6016,7 +6081,7 @@ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrap-ansi": { @@ -6025,8 +6090,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { @@ -6062,19 +6127,19 @@ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "dev": 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": "5.0.0" + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "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": "^5.0.0" }, "dependencies": { "camelcase": { @@ -6091,7 +6156,7 @@ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "dev": true, "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" }, "dependencies": { "camelcase": { diff --git a/package.json b/package.json index 10df1ce..cbf3eda 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "license": "MIT", - "repository": { - "type" : "git" - , "url" : "https://github.com/usefathom/fathom.git" + "repository": { + "type": "git", + "url": "https://github.com/usefathom/fathom.git" }, "devDependencies": { "babel-core": "^6.26.0", @@ -11,6 +11,7 @@ "babel-preset-es2015": "^6.18.0", "babelify": "^8.0.0", "browserify": "^16.2.0", + "event-stream": "^3.3.4", "gulp": "^3.9.1", "gulp-rename": "^1.2.2", "gulp-sass": "^4.0.1", @@ -19,6 +20,7 @@ "vinyl-source-stream": "^2.0.0" }, "dependencies": { + "cookies-js": "^1.2.3", "d3": "^5.1.0", "d3-tip": "^0.7.1", "decko": "^1.2.0", diff --git a/pkg/api/bounces.go b/pkg/api/bounces.go deleted file mode 100644 index a24e0e3..0000000 --- a/pkg/api/bounces.go +++ /dev/null @@ -1,18 +0,0 @@ -package api - -import ( - "net/http" - - "github.com/usefathom/fathom/pkg/datastore" -) - -// URL: /api/bounces/count -var GetBouncesCountHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - result, err := datastore.TotalBounces(before, after) - if err != nil { - return err - } - - return respond(w, envelope{Data: result}) -}) diff --git a/pkg/api/browsers.go b/pkg/api/browsers.go deleted file mode 100644 index ffe0cb8..0000000 --- a/pkg/api/browsers.go +++ /dev/null @@ -1,16 +0,0 @@ -package api - -import ( - "github.com/usefathom/fathom/pkg/count" - "net/http" -) - -// URL: /api/browsers -var GetBrowsersHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - results, err := count.Browsers(before, after, getRequestedLimit(r)) - if err != nil { - return err - } - return respond(w, envelope{Data: results}) -}) diff --git a/pkg/api/collect.go b/pkg/api/collect.go index 4eb2303..72472dd 100644 --- a/pkg/api/collect.go +++ b/pkg/api/collect.go @@ -1,11 +1,8 @@ package api import ( - "crypto/md5" "encoding/base64" - "encoding/hex" "net/http" - "strings" "time" "github.com/mssola/user_agent" @@ -15,13 +12,13 @@ import ( log "github.com/sirupsen/logrus" ) -var buffer []*models.Pageview -var bufferSize = 250 +var buffer []*models.RawPageview +var bufferSize = 50 var timeout = 200 * time.Millisecond func persistPageviews() { if len(buffer) > 0 { - err := datastore.SavePageviews(buffer) + err := datastore.SaveRawPageviews(buffer) if err != nil { log.Errorf("error saving pageviews: %s", err) } @@ -31,7 +28,7 @@ func persistPageviews() { } } -func processBuffer(pv chan *models.Pageview) { +func processBuffer(pv chan *models.RawPageview) { for { select { case pageview := <-pv: @@ -47,11 +44,10 @@ func processBuffer(pv chan *models.Pageview) { /* middleware */ func NewCollectHandler() http.Handler { - pageviews := make(chan *models.Pageview, bufferSize) + pageviews := make(chan *models.RawPageview, bufferSize) go processBuffer(pageviews) return HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - // abort if this is a bot. userAgent := r.UserAgent() ua := user_agent.New(userAgent) @@ -60,96 +56,26 @@ func NewCollectHandler() http.Handler { } q := r.URL.Query() - - // find page - page, err := datastore.GetPageByHostnameAndPath(q.Get("h"), q.Get("p")) - if err != nil && err != datastore.ErrNoResults { - return err - } - - // page does not exist yet, get details & save it - if page == nil { - page = &models.Page{ - Scheme: "http", - Hostname: q.Get("h"), - Path: q.Get("p"), - Title: q.Get("t"), - } - - if scheme := q.Get("scheme"); scheme != "" { - page.Scheme = scheme - } - - err = datastore.SavePage(page) - if err != nil { - return err - } - } - - // find visitor by anonymized key from query params now := time.Now() - visitorKey := q.Get("vk") - visitorKey = enhanceVisitorKey(visitorKey, now.Format("2006-01-02"), userAgent, q.Get("l"), q.Get("sr")) - visitor, err := datastore.GetVisitorByKey(visitorKey) - if err != nil && err != datastore.ErrNoResults { - return err - } - - // visitor is new, save it - if visitor == nil { - visitor = &models.Visitor{ - BrowserLanguage: q.Get("l"), - ScreenResolution: q.Get("sr"), - DeviceOS: ua.OS(), - Country: "", - Key: visitorKey, - } - - // add browser details - visitor.BrowserName, visitor.BrowserVersion = ua.Browser() - - // get rid of exact browser versions - visitor.BrowserVersion = parseMajorMinor(visitor.BrowserVersion) - err = datastore.SaveVisitor(visitor) - if err != nil { - return err - } - } else { - lastPageview, err := datastore.GetLastPageviewForVisitor(visitor.ID) - if err != nil && err != datastore.ErrNoResults { - return err - } - - if lastPageview != nil && lastPageview.Timestamp.After(now.Add(-30*time.Minute)) { - lastPageview.Bounced = false - lastPageview.TimeOnPage = now.Unix() - lastPageview.Timestamp.Unix() - - // TODO: Delay storage until in buffer? - err := datastore.UpdatePageview(lastPageview) - if err != nil { - return err - } - } - } // get pageview details - pageview := &models.Pageview{ - PageID: page.ID, - VisitorID: visitor.ID, - ReferrerUrl: q.Get("ru"), - ReferrerKeyword: q.Get("rk"), - TimeOnPage: 0, - Bounced: true, // TODO: Only mark as bounced if no other pageviews in this session - Timestamp: now, + pageview := &models.RawPageview{ + SessionID: q.Get("sid"), + Pathname: q.Get("p"), + IsNewVisitor: q.Get("n") == "1", + IsUnique: q.Get("u") == "1", + IsBounce: q.Get("b") != "0", + Referrer: q.Get("r"), + Duration: 0, + Timestamp: now, } - // only store referrer URL if not coming from own site - if strings.Contains(pageview.ReferrerUrl, page.Hostname) { - pageview.ReferrerUrl = "" + err := datastore.SaveRawPageview(pageview) + if err != nil { + return err } - // push onto channel - pageviews <- pageview + //pageviews <- pageview // don't you cache this w.Header().Set("Content-Type", "image/gif") @@ -164,9 +90,3 @@ func NewCollectHandler() http.Handler { return nil }) } - -// generateVisitorKey generates the "unique" visitor key from date, user agent + screen resolution -func enhanceVisitorKey(key string, date string, userAgent string, lang string, screenRes string) string { - byteKey := md5.Sum([]byte(date + userAgent + lang + screenRes)) - return hex.EncodeToString(byteKey[:]) -} diff --git a/pkg/api/languages.go b/pkg/api/languages.go deleted file mode 100644 index 18d30ba..0000000 --- a/pkg/api/languages.go +++ /dev/null @@ -1,18 +0,0 @@ -package api - -import ( - "net/http" - - "github.com/usefathom/fathom/pkg/count" -) - -// URL: /api/languages -var GetLanguagesHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - results, err := count.Languages(before, after, getRequestedLimit(r)) - if err != nil { - return err - } - - return respond(w, envelope{Data: results}) -}) diff --git a/pkg/api/page_stats.go b/pkg/api/page_stats.go new file mode 100644 index 0000000..d627c17 --- /dev/null +++ b/pkg/api/page_stats.go @@ -0,0 +1,14 @@ +package api + +import ( + "github.com/usefathom/fathom/pkg/models" + "net/http" +) + +// URL: /api/stats/page +var GetPageStatsHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { + //before, after := getRequestedPeriods(r) + //limit := getRequestedLimit(r) + var result []*models.PageStats + return respond(w, envelope{Data: result}) +}) diff --git a/pkg/api/pageviews.go b/pkg/api/pageviews.go deleted file mode 100644 index 383970f..0000000 --- a/pkg/api/pageviews.go +++ /dev/null @@ -1,42 +0,0 @@ -package api - -import ( - "net/http" - - "github.com/usefathom/fathom/pkg/count" - "github.com/usefathom/fathom/pkg/datastore" -) - -// URL: /api/pageviews -var GetPageviewsHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - limit := getRequestedLimit(r) - results, err := count.Pageviews(before, after, limit) - if err != nil { - return err - } - - return respond(w, envelope{Data: results}) -}) - -// URL: /api/pageviews/count -var GetPageviewsCountHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - result, err := datastore.TotalPageviews(before, after) - if err != nil { - return err - } - - return respond(w, envelope{Data: result}) -}) - -// URL: /api/pageviews/group/day -var GetPageviewsPeriodCountHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - results, err := datastore.TotalPageviewsPerDay(before, after) - if err != nil { - return err - } - - return respond(w, envelope{Data: results}) -}) diff --git a/pkg/api/params.go b/pkg/api/params.go index 047b144..5e4a15f 100644 --- a/pkg/api/params.go +++ b/pkg/api/params.go @@ -7,13 +7,15 @@ import ( "time" ) +// TODO: Move params into Params struct (with defaults) + const defaultPeriod = 7 const defaultLimit = 10 func getRequestedLimit(r *http.Request) int64 { limit, err := strconv.ParseInt(r.URL.Query().Get("limit"), 10, 64) if err != nil || limit == 0 { - limit = 10 + limit = defaultLimit } return limit @@ -30,7 +32,7 @@ func getRequestedPeriods(r *http.Request) (int64, int64) { after, err = strconv.ParseInt(r.URL.Query().Get("after"), 10, 64) if err != nil || before == 0 { - after = time.Now().AddDate(0, 0, -7).Unix() + after = time.Now().AddDate(0, 0, -defaultPeriod).Unix() } return before, after diff --git a/pkg/api/referrer_stats.go b/pkg/api/referrer_stats.go new file mode 100644 index 0000000..f108dc8 --- /dev/null +++ b/pkg/api/referrer_stats.go @@ -0,0 +1,14 @@ +package api + +import ( + "github.com/usefathom/fathom/pkg/models" + "net/http" +) + +// URL: /api/stats/referrer +var GetReferrerStatsHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { + // before, after := getRequestedPeriods(r) + // limit := getRequestedLimit(r) + var result []*models.ReferrerStats + return respond(w, envelope{Data: result}) +}) diff --git a/pkg/api/referrers.go b/pkg/api/referrers.go deleted file mode 100644 index ebeaff4..0000000 --- a/pkg/api/referrers.go +++ /dev/null @@ -1,17 +0,0 @@ -package api - -import ( - "net/http" - - "github.com/usefathom/fathom/pkg/count" -) - -// URL: /api/referrers -var GetReferrersHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - results, err := count.Referrers(before, after, getRequestedLimit(r)) - if err != nil { - return err - } - return respond(w, envelope{Data: results}) -}) diff --git a/pkg/api/routes.go b/pkg/api/routes.go new file mode 100644 index 0000000..2de693b --- /dev/null +++ b/pkg/api/routes.go @@ -0,0 +1,20 @@ +package api + +import ( + "github.com/gorilla/mux" + "net/http" +) + +func Routes(webroot string) *mux.Router { + // register routes + r := mux.NewRouter() + r.Handle("/collect", NewCollectHandler()).Methods(http.MethodGet) + r.Handle("/api/session", LoginHandler).Methods(http.MethodPost) + r.Handle("/api/session", LogoutHandler).Methods(http.MethodDelete) + + r.Handle("/api/stats/page", Authorize(GetPageStatsHandler)).Methods(http.MethodGet) + + r.Path("/tracker.js").Handler(http.FileServer(http.Dir(webroot + "/js/"))) + r.PathPrefix("/").Handler(http.FileServer(http.Dir(webroot))) + return r +} diff --git a/pkg/api/screens.go b/pkg/api/screens.go deleted file mode 100644 index c59743c..0000000 --- a/pkg/api/screens.go +++ /dev/null @@ -1,17 +0,0 @@ -package api - -import ( - "net/http" - - "github.com/usefathom/fathom/pkg/count" -) - -// URL: /api/screen-resolutions -var GetScreenResolutionsHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - results, err := count.Screens(before, after, getRequestedLimit(r)) - if err != nil { - return err - } - return respond(w, envelope{Data: results}) -}) diff --git a/pkg/api/site_stats.go b/pkg/api/site_stats.go new file mode 100644 index 0000000..f280442 --- /dev/null +++ b/pkg/api/site_stats.go @@ -0,0 +1,44 @@ +package api + +import ( + "github.com/usefathom/fathom/pkg/models" + "net/http" +) + +// URL: /api/stats/site +var GetSiteStatsHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { + // before, after := getRequestedPeriods(r) + // limit := getRequestedLimit(r) + + var results []*models.SiteStats + return respond(w, envelope{Data: results}) +}) + +// URL: /api/stats/site/pageviews +var GetSiteStatsPageviewsHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { + // before, after := getRequestedPeriods(r) + // limit := getRequestedLimit(r) + var result int + return respond(w, envelope{Data: result}) +}) + +// URL: /api/stats/site/visitors +var GetSiteStatsVisitorsHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { + // before, after := getRequestedPeriods(r) + var result int + return respond(w, envelope{Data: result}) +}) + +// URL: /api/stats/site/avg-duration +var GetSiteStatsAvgDurationHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { + // before, after := getRequestedPeriods(r) + var result int + return respond(w, envelope{Data: result}) +}) + +// URL: /api/stats/site/avg-bounce +var GetSiteStatusAvgBounceHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { + // before, after := getRequestedPeriods(r) + var result int + return respond(w, envelope{Data: result}) +}) diff --git a/pkg/api/time.go b/pkg/api/time.go deleted file mode 100644 index 3fba86b..0000000 --- a/pkg/api/time.go +++ /dev/null @@ -1,20 +0,0 @@ -package api - -import ( - "net/http" - - "github.com/usefathom/fathom/pkg/datastore" -) - -// TODO: Come up with more consistent URL names. -// URL: /api/time-on-site/count -var GetTimeOnSiteCountHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - result, err := datastore.AvgTimeOnSite(before, after) - - if err != nil { - return err - } - - return respond(w, envelope{Data: result}) -}) diff --git a/pkg/api/visitors.go b/pkg/api/visitors.go deleted file mode 100644 index 848cf35..0000000 --- a/pkg/api/visitors.go +++ /dev/null @@ -1,38 +0,0 @@ -package api - -import ( - "net/http" - - "github.com/usefathom/fathom/pkg/datastore" -) - -// URL: /api/visitors/count -var GetVisitorsCountHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - result, err := datastore.TotalVisitors(before, after) - if err != nil { - return err - } - - return respond(w, envelope{Data: result}) -}) - -// URL: /api/visitors/count/realtime -var GetVisitorsRealtimeCountHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - result, err := datastore.RealtimeVisitors() - if err != nil { - return err - } - return respond(w, envelope{Data: result}) -}) - -// URL: /api/visitors/count/group/:period -var GetVisitorsPeriodCountHandler = HandlerFunc(func(w http.ResponseWriter, r *http.Request) error { - before, after := getRequestedPeriods(r) - results, err := datastore.TotalVisitorsPerDay(before, after) - if err != nil { - return err - } - - return respond(w, envelope{Data: results}) -}) diff --git a/pkg/commands/archive.go b/pkg/commands/archive.go deleted file mode 100644 index 1522080..0000000 --- a/pkg/commands/archive.go +++ /dev/null @@ -1,10 +0,0 @@ -package commands - -import ( - "github.com/usefathom/fathom/pkg/count" -) - -// Archive processes unarchived data (pageviews to aggregated count tables) -func Archive() { - count.Archive() -} diff --git a/pkg/commands/server.go b/pkg/commands/server.go index 4d7eb44..eaf43aa 100644 --- a/pkg/commands/server.go +++ b/pkg/commands/server.go @@ -2,40 +2,21 @@ package commands import ( "fmt" - "github.com/gorilla/handlers" - "github.com/gorilla/mux" - "github.com/usefathom/fathom/pkg/api" "log" "net/http" "os" + + "github.com/gorilla/handlers" + "github.com/usefathom/fathom/pkg/api" ) // Server starts the HTTP server, listening on the given port func Server(port int, webroot string) { - - // register routes - r := mux.NewRouter() - r.Handle("/collect", api.NewCollectHandler()).Methods("GET") - r.Handle("/api/session", api.LoginHandler).Methods("POST") - r.Handle("/api/session", api.LogoutHandler).Methods("DELETE") - r.Handle("/api/visitors/count", api.Authorize(api.GetVisitorsCountHandler)).Methods("GET") - r.Handle("/api/visitors/count/group/{period}", api.Authorize(api.GetVisitorsPeriodCountHandler)).Methods("GET") - r.Handle("/api/visitors/count/realtime", api.Authorize(api.GetVisitorsRealtimeCountHandler)).Methods("GET") - r.Handle("/api/pageviews/count", api.Authorize(api.GetPageviewsCountHandler)).Methods("GET") - r.Handle("/api/pageviews/count/group/{period}", api.Authorize(api.GetPageviewsPeriodCountHandler)).Methods("GET") - r.Handle("/api/pageviews", api.Authorize(api.GetPageviewsHandler)).Methods("GET") - r.Handle("/api/languages", api.Authorize(api.GetLanguagesHandler)).Methods("GET") - r.Handle("/api/referrers", api.Authorize(api.GetReferrersHandler)).Methods("GET") - r.Handle("/api/screen-resolutions", api.Authorize(api.GetScreenResolutionsHandler)).Methods("GET") - //r.Handle("/api/countries", api.Authorize(api.GetCountriesHandler)).Methods("GET") - r.Handle("/api/browsers", api.Authorize(api.GetBrowsersHandler)).Methods("GET") - r.Handle("/api/bounces/count", api.Authorize(api.GetBouncesCountHandler)).Methods("GET") - r.Handle("/api/time-on-site/count", api.Authorize(api.GetTimeOnSiteCountHandler)).Methods("GET") - - r.Path("/tracker.js").Handler(http.FileServer(http.Dir(webroot + "/js/"))) - r.PathPrefix("/").Handler(http.FileServer(http.Dir(webroot))) - + r := api.Routes(webroot) log.Printf("Now serving %s on port %d/\n", webroot, port) + err := http.ListenAndServe(fmt.Sprintf(":%d", port), handlers.LoggingHandler(os.Stdout, r)) - log.Println(err) + if err != nil { + log.Println(err) + } } diff --git a/pkg/count/bounces.go b/pkg/count/bounces.go deleted file mode 100644 index 7c97acd..0000000 --- a/pkg/count/bounces.go +++ /dev/null @@ -1,22 +0,0 @@ -package count - -import ( - "log" - "time" - - "github.com/usefathom/fathom/pkg/datastore" -) - -// CreateBouncesTotals aggregates pageview data for each page into daily totals -func CreateBouncesTotals(since string) { - tomorrow := time.Now().AddDate(0, 0, 1).Format("2006-01-02") - totals, err := datastore.BouncesCountPerPageAndDay(tomorrow, since) - if err != nil { - log.Fatal(err) - } - - err = datastore.SavePageTotals("bounced", totals) - if err != nil { - log.Fatal(err) - } -} diff --git a/pkg/count/browsers.go b/pkg/count/browsers.go deleted file mode 100644 index c1a4a2c..0000000 --- a/pkg/count/browsers.go +++ /dev/null @@ -1,39 +0,0 @@ -package count - -import ( - "log" - "time" - - "github.com/usefathom/fathom/pkg/datastore" - "github.com/usefathom/fathom/pkg/models" -) - -// Browsers returns a point slice containing browser data per browser name -func Browsers(before int64, after int64, limit int64) ([]*models.Total, error) { - points, err := datastore.TotalsPerBrowser(before, after, limit) - if err != nil { - return nil, err - } - - total, err := datastore.TotalBrowsers(before, after) - if err != nil { - return nil, err - } - - points = calculatePercentagesOfTotal(points, total) - return points, nil -} - -// CreateBrowserTotals aggregates screen data into daily totals -func CreateBrowserTotals(since string) { - tomorrow := time.Now().AddDate(0, 0, 1).Format("2006-01-02") - totals, err := datastore.BrowserCountPerDay(tomorrow, since) - if err != nil { - log.Fatal(err) - } - - err = datastore.SaveTotals("browser_names", totals) - if err != nil { - log.Fatal(err) - } -} diff --git a/pkg/count/count.go b/pkg/count/count.go deleted file mode 100644 index da0bc2e..0000000 --- a/pkg/count/count.go +++ /dev/null @@ -1,46 +0,0 @@ -package count - -import ( - "time" - - log "github.com/sirupsen/logrus" - - "github.com/usefathom/fathom/pkg/datastore" - "github.com/usefathom/fathom/pkg/models" -) - -func getLastArchivedDate() string { - value, _ := datastore.GetOption("last_archived") - if value == "" { - return time.Now().AddDate(-1, 0, 0).Format("2006-01-02") - } - - return value -} - -// Archive aggregates data into daily totals -func Archive() { - start := time.Now() - - lastArchived := getLastArchivedDate() - CreatePageviewTotals(lastArchived) - CreateVisitorTotals(lastArchived) - CreateScreenTotals(lastArchived) - CreateLanguageTotals(lastArchived) - CreateBrowserTotals(lastArchived) - CreateReferrerTotals(lastArchived) - CreateBouncesTotals(lastArchived) - datastore.SetOption("last_archived", time.Now().Format("2006-01-02")) - - end := time.Now() - log.Infof("finished aggregating metrics. ran for %dms.", (end.UnixNano()-start.UnixNano())/1000000) -} - -func calculatePercentagesOfTotal(totals []*models.Total, total int) []*models.Total { - // calculate percentage values for each point - for _, p := range totals { - p.PercentageOfTotal = float64(p.Count) / float64(total) * 100.00 - } - - return totals -} diff --git a/pkg/count/count_test.go b/pkg/count/count_test.go deleted file mode 100644 index 4136fab..0000000 --- a/pkg/count/count_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package count - -import ( - "testing" - - "github.com/usefathom/fathom/pkg/models" -) - -func TestCalculatePointPercentages(t *testing.T) { - totals := []*models.Total{ - &models.Total{ - Value: "Foo", - Count: 5, - }, - } - - totals = calculatePercentagesOfTotal(totals, 100) - - if totals[0].PercentageOfTotal != 5.00 { - t.Errorf("Percentage value should be 5.00, is %.2f", totals[0].PercentageOfTotal) - } -} diff --git a/pkg/count/languages.go b/pkg/count/languages.go deleted file mode 100644 index 55fae48..0000000 --- a/pkg/count/languages.go +++ /dev/null @@ -1,39 +0,0 @@ -package count - -import ( - "log" - "time" - - "github.com/usefathom/fathom/pkg/datastore" - "github.com/usefathom/fathom/pkg/models" -) - -// Languages returns a point slice containing language data per language -func Languages(before int64, after int64, limit int64) ([]*models.Total, error) { - points, err := datastore.TotalsPerLanguage(before, after, limit) - if err != nil { - return nil, err - } - - total, err := datastore.TotalLanguages(before, after) - if err != nil { - return nil, err - } - - points = calculatePercentagesOfTotal(points, total) - return points, nil -} - -// CreateLanguageTotals aggregates screen data into daily totals -func CreateLanguageTotals(since string) { - tomorrow := time.Now().AddDate(0, 0, 1).Format("2006-01-02") - totals, err := datastore.LanguageCountPerDay(tomorrow, since) - if err != nil { - log.Fatal(err) - } - - err = datastore.SaveTotals("browser_languages", totals) - if err != nil { - log.Fatal(err) - } -} diff --git a/pkg/count/pageviews.go b/pkg/count/pageviews.go deleted file mode 100644 index 77c6347..0000000 --- a/pkg/count/pageviews.go +++ /dev/null @@ -1,39 +0,0 @@ -package count - -import ( - "log" - "time" - - "github.com/usefathom/fathom/pkg/datastore" - "github.com/usefathom/fathom/pkg/models" -) - -// Pageviews returns a point slice containing language data per language -func Pageviews(before int64, after int64, limit int64) ([]*models.Total, error) { - points, err := datastore.TotalPageviewsPerPage(before, after, limit) - if err != nil { - return nil, err - } - - total, err := datastore.TotalPageviews(before, after) - if err != nil { - return nil, err - } - - points = calculatePercentagesOfTotal(points, total) - return points, nil -} - -// CreatePageviewTotals aggregates pageview data for each page into daily totals -func CreatePageviewTotals(since string) { - tomorrow := time.Now().AddDate(0, 0, 1).Format("2006-01-02") - totals, err := datastore.PageviewCountPerPageAndDay(tomorrow, since) - if err != nil { - log.Fatal(err) - } - - err = datastore.SavePageTotals("pageviews", totals) - if err != nil { - log.Fatal(err) - } -} diff --git a/pkg/count/referrers.go b/pkg/count/referrers.go deleted file mode 100644 index 423e249..0000000 --- a/pkg/count/referrers.go +++ /dev/null @@ -1,39 +0,0 @@ -package count - -import ( - "log" - "time" - - "github.com/usefathom/fathom/pkg/datastore" - "github.com/usefathom/fathom/pkg/models" -) - -// Referrers returns a point slice containing browser data per browser name -func Referrers(before int64, after int64, limit int64) ([]*models.Total, error) { - points, err := datastore.TotalsPerReferrer(before, after, limit) - if err != nil { - return nil, err - } - - total, err := datastore.TotalReferrers(before, after) - if err != nil { - return nil, err - } - - points = calculatePercentagesOfTotal(points, total) - return points, nil -} - -// CreateReferrerTotals aggregates screen data into daily totals -func CreateReferrerTotals(since string) { - tomorrow := time.Now().AddDate(0, 0, 1).Format("2006-01-02") - totals, err := datastore.ReferrerCountPerDay(tomorrow, since) - if err != nil { - log.Fatal(err) - } - - err = datastore.SaveTotals("referrers", totals) - if err != nil { - log.Fatal(err) - } -} diff --git a/pkg/count/screens.go b/pkg/count/screens.go deleted file mode 100644 index 6337c39..0000000 --- a/pkg/count/screens.go +++ /dev/null @@ -1,39 +0,0 @@ -package count - -import ( - "log" - "time" - - "github.com/usefathom/fathom/pkg/datastore" - "github.com/usefathom/fathom/pkg/models" -) - -// Screens returns a point slice containing screen data per size -func Screens(before int64, after int64, limit int64) ([]*models.Total, error) { - points, err := datastore.TotalsPerScreen(before, after, limit) - if err != nil { - return nil, err - } - - total, err := datastore.TotalScreens(before, after) - if err != nil { - return nil, err - } - - points = calculatePercentagesOfTotal(points, total) - return points, nil -} - -// CreateScreenTotals aggregates screen data into daily totals -func CreateScreenTotals(since string) { - tomorrow := time.Now().AddDate(0, 0, 1).Format("2006-01-02") - totals, err := datastore.ScreenCountPerDay(tomorrow, since) - if err != nil { - log.Fatal(err) - } - - err = datastore.SaveTotals("screens", totals) - if err != nil { - log.Fatal(err) - } -} diff --git a/pkg/count/visitors.go b/pkg/count/visitors.go deleted file mode 100644 index ac6edd0..0000000 --- a/pkg/count/visitors.go +++ /dev/null @@ -1,23 +0,0 @@ -package count - -import ( - "log" - "time" - - "github.com/usefathom/fathom/pkg/datastore" -) - -// CreateVisitorTotals aggregates visitor data into daily totals -func CreateVisitorTotals(since string) { - tomorrow := time.Now().AddDate(0, 0, 1).Format("2006-01-02") - totals, err := datastore.VisitorCountPerDay(tomorrow, since) - if err != nil { - log.Fatal(err) - } - - err = datastore.SaveVisitorTotals(totals) - if err != nil { - log.Fatal(err) - } - -} diff --git a/pkg/counter/counter.go b/pkg/counter/counter.go new file mode 100644 index 0000000..1ba3de3 --- /dev/null +++ b/pkg/counter/counter.go @@ -0,0 +1,71 @@ +package counter + +import ( + "time" + + "github.com/usefathom/fathom/pkg/datastore" + "github.com/usefathom/fathom/pkg/models" +) + +func Aggregate() error { + + // Get unprocessed pageviews + pageviews, err := datastore.GetRawPageviews() + if err != nil && err != datastore.ErrNoResults { + return err + } + + // Do we have anything to process? + if len(pageviews) == 0 { + return nil + } + + // site stats + date := time.Now() + siteStats, err := getSiteStats(date) + if err != nil { + return err + } + + for _, p := range pageviews { + siteStats.Pageviews += 1 + + if p.IsNewVisitor { + siteStats.Visitors += 1 + siteStats.BouncedN += 1 + + if p.IsBounce { + siteStats.Bounced += 1 + } + + // TODO: duration + } + } + + // TODO: page stats + + // TODO: referrer stats + + err = datastore.SaveSiteStats(siteStats) + if err != nil { + return err + } + + // TODO: delete data + return nil +} + +func getSiteStats(date time.Time) (*models.SiteStats, error) { + stats, err := datastore.GetSiteStats(date) + if err != nil && err != datastore.ErrNoResults { + return nil, err + } + + if stats == nil { + return &models.SiteStats{ + Date: date, + }, nil + } + + return stats, nil +} diff --git a/pkg/datastore/bounces.go b/pkg/datastore/bounces.go deleted file mode 100644 index 2892bdf..0000000 --- a/pkg/datastore/bounces.go +++ /dev/null @@ -1,17 +0,0 @@ -package datastore - -import "github.com/usefathom/fathom/pkg/models" - -func BouncesCountPerPageAndDay(before string, after string) ([]*models.Total, error) { - query := dbx.Rebind(`SELECT - pv.page_id, - ( COUNT(*) * 100 ) DIV ( SELECT ( COUNT(*) ) FROM pageviews WHERE page_id = pv.page_id AND bounced IS NOT NULL ) AS count, - ( COUNT(DISTINCT(pv.visitor_id)) * 100 ) DIV ( SELECT ( COUNT(*) ) FROM pageviews WHERE page_id = pv.page_id AND bounced IS NOT NULL ) AS count_unique, - DATE_FORMAT(pv.timestamp, '%Y-%m-%d') AS date_group - FROM pageviews pv - WHERE pv.bounced = 1 AND pv.bounced IS NOT NULL AND pv.timestamp < ? AND pv.timestamp > ? - GROUP BY pv.page_id, date_group`) - var results []*models.Total - err := dbx.Select(&results, query, before, after) - return results, err -} diff --git a/pkg/datastore/browsers.go b/pkg/datastore/browsers.go deleted file mode 100644 index d5233ef..0000000 --- a/pkg/datastore/browsers.go +++ /dev/null @@ -1,21 +0,0 @@ -package datastore - -import "github.com/usefathom/fathom/pkg/models" - -func BrowserCountPerDay(before string, after string) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(` - SELECT - v.browser_name AS value, - COUNT(*) AS count, - COUNT(DISTINCT(pv.visitor_id)) AS count_unique, - DATE_FORMAT(pv.timestamp, '%Y-%m-%d') AS date_group - FROM pageviews pv - LEFT JOIN visitors v ON v.id = pv.visitor_id - WHERE pv.timestamp < ? AND pv.timestamp > ? - GROUP BY date_group, v.browser_name`) - - err := dbx.Select(&results, query, before, after) - return results, err -} diff --git a/pkg/datastore/datastore.go b/pkg/datastore/datastore.go index fdb4df6..a9e9b3c 100644 --- a/pkg/datastore/datastore.go +++ b/pkg/datastore/datastore.go @@ -44,6 +44,7 @@ func getDSN(driver string, host string, name string, user string, password strin return dsn } +// TODO: Move to command (but still auto-run on boot). func runMigrations(driver string) { migrations := migrate.FileMigrationSource{ Dir: "pkg/datastore/migrations", // TODO: Move to bindata diff --git a/pkg/datastore/languages.go b/pkg/datastore/languages.go deleted file mode 100644 index 1947264..0000000 --- a/pkg/datastore/languages.go +++ /dev/null @@ -1,21 +0,0 @@ -package datastore - -import "github.com/usefathom/fathom/pkg/models" - -func LanguageCountPerDay(before string, after string) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(` - SELECT - v.browser_language AS value, - COUNT(*) AS count, - COUNT(DISTINCT(pv.visitor_id)) AS count_unique, - DATE_FORMAT(pv.timestamp, '%Y-%m-%d') AS date_group - FROM pageviews pv - LEFT JOIN visitors v ON v.id = pv.visitor_id - WHERE pv.timestamp < ? AND pv.timestamp > ? - GROUP BY date_group, v.browser_language`) - - err := dbx.Select(&results, query, before, after) - return results, err -} diff --git a/pkg/datastore/migrations/6_raw_pageviews.sql b/pkg/datastore/migrations/6_raw_pageviews.sql new file mode 100644 index 0000000..e2347b7 --- /dev/null +++ b/pkg/datastore/migrations/6_raw_pageviews.sql @@ -0,0 +1,17 @@ +-- +migrate Up + +CREATE TABLE raw_pageviews( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + session_id VARCHAR(16) NOT NULL, + pathname VARCHAR(255) NOT NULL, + is_new_visitor TINYINT(1) NOT NULL, + is_unique TINYINT(1) NOT NULL, + is_bounce TINYINT(1) NULL, + referrer VARCHAR(255) NULL, + duration INT(4) NULL, + timestamp DATETIME NOT NULL +); + +-- +migrate Down + +DROP TABLE IF EXISTS raw_pageviews; diff --git a/pkg/datastore/migrations/7_daily_page_stats.sql b/pkg/datastore/migrations/7_daily_page_stats.sql new file mode 100644 index 0000000..4c452d4 --- /dev/null +++ b/pkg/datastore/migrations/7_daily_page_stats.sql @@ -0,0 +1,16 @@ +-- +migrate Up + +CREATE TABLE daily_page_stats( + pathname VARCHAR(255) NOT NULL, + views INT NOT NULL, + unique_views INT NOT NULL, + bounced INT NOT NULL, + bounced_n INT NOT NULL, + avg_duration INT NOT NULL, + avg_duration_n INT NOT NULL, + date DATE NOT NULL +); + +-- +migrate Down + +DROP TABLE IF EXISTS daily_page_stats; diff --git a/pkg/datastore/migrations/8_daily_site_stats.sql b/pkg/datastore/migrations/8_daily_site_stats.sql new file mode 100644 index 0000000..ee16fb2 --- /dev/null +++ b/pkg/datastore/migrations/8_daily_site_stats.sql @@ -0,0 +1,15 @@ +-- +migrate Up + +CREATE TABLE daily_site_stats( + visitors INT NOT NULL, + pageviews INT NOT NULL, + bounced INT NOT NULL, + bounced_n INT NOT NULL, + avg_duration INT NOT NULL, + avg_duration_n INT NOT NULL, + date DATE NOT NULL +); + +-- +migrate Down + +DROP TABLE IF EXISTS daily_site_stats; diff --git a/pkg/datastore/migrations/9_daily_referrer_stats.sql b/pkg/datastore/migrations/9_daily_referrer_stats.sql new file mode 100644 index 0000000..f81092e --- /dev/null +++ b/pkg/datastore/migrations/9_daily_referrer_stats.sql @@ -0,0 +1,16 @@ +-- +migrate Up + +CREATE TABLE daily_referrer_stats( + url VARCHAR(255) NOT NULL, + visitors INT NOT NULL, + pageviews INT NOT NULL, + bounced INT NOT NULL, + bounced_n INT NOT NULL, + avg_duration INT NOT NULL, + avg_duration_n INT NOT NULL, + date DATE NOT NULL +); + +-- +migrate Down + +DROP TABLE IF EXISTS daily_referrer_stats; diff --git a/pkg/datastore/page_stats.go b/pkg/datastore/page_stats.go new file mode 100644 index 0000000..1ea451e --- /dev/null +++ b/pkg/datastore/page_stats.go @@ -0,0 +1 @@ +package datastore diff --git a/pkg/datastore/pages.go b/pkg/datastore/pages.go deleted file mode 100644 index a886128..0000000 --- a/pkg/datastore/pages.go +++ /dev/null @@ -1,34 +0,0 @@ -package datastore - -import ( - "database/sql" - "github.com/usefathom/fathom/pkg/models" -) - -// GetPageByHostnameAndPath retrieves a page from the connected database -func GetPageByHostnameAndPath(hostname, path string) (*models.Page, error) { - p := &models.Page{} - query := dbx.Rebind(`SELECT * FROM pages WHERE hostname = ? AND path = ? LIMIT 1`) - err := dbx.Get(p, query, hostname, path) - if err != nil { - if err == sql.ErrNoRows { - return nil, ErrNoResults - } - - return nil, err - } - - return p, nil -} - -// SavePage inserts the page model in the connected database -func SavePage(p *models.Page) error { - query := dbx.Rebind(`INSERT INTO pages(scheme, hostname, path) VALUES(?, ?, ?)`) - result, err := dbx.Exec(query, p.Scheme, p.Hostname, p.Path) - if err != nil { - return err - } - - p.ID, _ = result.LastInsertId() - return nil -} diff --git a/pkg/datastore/pageviews.go b/pkg/datastore/pageviews.go index 245179d..ccf39dd 100644 --- a/pkg/datastore/pageviews.go +++ b/pkg/datastore/pageviews.go @@ -1,5 +1,6 @@ package datastore +/* import ( "database/sql" @@ -95,3 +96,5 @@ func PageviewCountPerPageAndDay(before string, after string) ([]*models.Total, e err := dbx.Select(&results, query, before, after) return results, err } + +*/ diff --git a/pkg/datastore/raw_pageviews.go b/pkg/datastore/raw_pageviews.go new file mode 100644 index 0000000..661bdc0 --- /dev/null +++ b/pkg/datastore/raw_pageviews.go @@ -0,0 +1,32 @@ +package datastore + +import ( + "github.com/usefathom/fathom/pkg/models" +) + +const sqlInsertRawPageview = `INSERT INTO raw_pageviews(session_id, pathname, is_new_visitor, is_unique, is_bounce, referrer, duration, timestamp) VALUES(?, ?, ?, ?, ?, ?, ?, ?)` +const sqlSelectRawPageviews = `SELECT * FROM raw_pageviews` + +// SaveRawPageview inserts a single pageview model into the connected database +func SaveRawPageview(p *models.RawPageview) error { + query := dbx.Rebind(sqlInsertRawPageview) + result, err := dbx.Exec(query, p.SessionID, p.Pathname, p.IsNewVisitor, p.IsUnique, p.IsBounce, p.Referrer, p.Duration, p.Timestamp) + if err != nil { + return err + } + + p.ID, _ = result.LastInsertId() + return nil +} + +// SaveRawPageviews inserts multiple pageviews +func SaveRawPageviews(p []*models.RawPageview) error { + return nil // TODO: Implement this method +} + +func GetRawPageviews() ([]*models.RawPageview, error) { + var results []*models.RawPageview + query := dbx.Rebind(sqlSelectRawPageviews) + err := dbx.Select(&results, query) + return results, err +} diff --git a/pkg/datastore/referrer_stats.go b/pkg/datastore/referrer_stats.go new file mode 100644 index 0000000..1ea451e --- /dev/null +++ b/pkg/datastore/referrer_stats.go @@ -0,0 +1 @@ +package datastore diff --git a/pkg/datastore/referrers.go b/pkg/datastore/referrers.go deleted file mode 100644 index 4bff611..0000000 --- a/pkg/datastore/referrers.go +++ /dev/null @@ -1,22 +0,0 @@ -package datastore - -import "github.com/usefathom/fathom/pkg/models" - -func ReferrerCountPerDay(before string, after string) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(` - SELECT - pv.referrer_url AS value, - COUNT(*) AS count, - COUNT(DISTINCT(pv.visitor_id)) AS count_unique, - DATE_FORMAT(pv.timestamp, '%Y-%m-%d') AS date_group - FROM pageviews pv - WHERE pv.referrer_url IS NOT NULL - AND pv.referrer_url != '' - AND pv.timestamp < ? AND pv.timestamp > ? - GROUP BY date_group, pv.referrer_url`) - - err := dbx.Select(&results, query, before, after) - return results, err -} diff --git a/pkg/datastore/screens.go b/pkg/datastore/screens.go deleted file mode 100644 index 9618766..0000000 --- a/pkg/datastore/screens.go +++ /dev/null @@ -1,21 +0,0 @@ -package datastore - -import "github.com/usefathom/fathom/pkg/models" - -func ScreenCountPerDay(before string, after string) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(` - SELECT - v.screen_resolution AS value, - COUNT(*) AS count, - COUNT(DISTINCT(pv.visitor_id)) AS count_unique, - DATE_FORMAT(pv.timestamp, '%Y-%m-%d') AS date_group - FROM pageviews pv - LEFT JOIN visitors v ON v.id = pv.visitor_id - WHERE pv.timestamp < ? AND pv.timestamp > ? - GROUP BY date_group, v.screen_resolution`) - - err := dbx.Select(&results, query, before, after) - return results, err -} diff --git a/pkg/datastore/site_stats.go b/pkg/datastore/site_stats.go new file mode 100644 index 0000000..b4f4660 --- /dev/null +++ b/pkg/datastore/site_stats.go @@ -0,0 +1,35 @@ +package datastore + +import ( + "database/sql" + "github.com/usefathom/fathom/pkg/models" + "time" +) + +const sqlSelectSiteStat = `SELECT * FROM daily_site_stats WHERE date = ? LIMIT 1` +const sqlInsertSiteStats = `INSERT INTO daily_site_stats(visitors, pageviews, bounced, bounced_n, avg_duration, avg_duration_n, date) VALUES(?, ?, ?, ?, ?, ?, ?)` + +/* +visitors INT NOT NULL, +pageviews INT NOT NULL, +bounced INT NOT NULL, +bounced_n INT NOT NULL, +avg_duration INT NOT NULL, +avg_duration_n INT NOT NULL, +date DATE NOT NULL +*/ +func GetSiteStats(date time.Time) (*models.SiteStats, error) { + stats := &models.SiteStats{} + query := dbx.Rebind(sqlSelectSiteStat) + err := dbx.Get(stats, query, date) + if err != nil && err == sql.ErrNoRows { + return nil, ErrNoResults + } + return stats, err +} + +func SaveSiteStats(s *models.SiteStats) error { + query := dbx.Rebind(sqlInsertSiteStats) + _, err := dbx.Exec(query, s.Visitors, s.Pageviews, s.Bounced, s.BouncedN, s.AvgDuration, s.AvgDurationN, s.Date) + return err +} diff --git a/pkg/datastore/time_on_site.go b/pkg/datastore/time_on_site.go deleted file mode 100644 index 5f4655c..0000000 --- a/pkg/datastore/time_on_site.go +++ /dev/null @@ -1,20 +0,0 @@ -package datastore - -// TODO: Store in visitors table? Or other table? -func AvgTimeOnSite(before int64, after int64) (int64, error) { - query := dbx.Rebind(` - SELECT ROUND(AVG(time_on_site)) FROM ( - SELECT SUM(time_on_page) AS time_on_site - FROM pageviews - WHERE time_on_page > 0 AND UNIX_TIMESTAMP(timestamp) < ? AND UNIX_TIMESTAMP(timestamp) > ? - GROUP BY visitor_id - ) AS time_on_site_query`) - - var total int64 - err := dbx.Get(&total, query, before, after) - if err != nil { - return 0, err - } - - return total, nil -} diff --git a/pkg/datastore/total.go b/pkg/datastore/total.go deleted file mode 100644 index 44c5a21..0000000 --- a/pkg/datastore/total.go +++ /dev/null @@ -1,35 +0,0 @@ -package datastore - -import ( - "fmt" - - "github.com/usefathom/fathom/pkg/models" -) - -func SaveTotals(metric string, totals []*models.Total) error { - query := fmt.Sprintf(`INSERT INTO total_%s( value, count, count_unique, date) VALUES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE count = ?, count_unique = ?`, metric) - query = dbx.Rebind(query) - - tx, err := dbx.Begin() - if err != nil { - return err - } - - stmt, err := tx.Prepare(query) - if err != nil { - return err - } - defer stmt.Close() - - for _, t := range totals { - result, err := stmt.Exec(t.Value, t.Count, t.CountUnique, t.Date, t.Count, t.CountUnique) - if err != nil { - return err - } - - t.ID, _ = result.LastInsertId() - } - - err = tx.Commit() - return err -} diff --git a/pkg/datastore/total_bounces.go b/pkg/datastore/total_bounces.go deleted file mode 100644 index 7754d28..0000000 --- a/pkg/datastore/total_bounces.go +++ /dev/null @@ -1,33 +0,0 @@ -package datastore - -// TotalBounces returns the total number of pageviews between the given timestamps -func TotalBounces(before int64, after int64) (int64, error) { - var total int64 - - query := dbx.Rebind(` - SELECT COALESCE(ROUND(AVG(t.count), 0), 0) - FROM total_bounced t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - err := dbx.Get(&total, query, before, after) - if err != nil { - return 0, err - } - - return total, nil -} - -// TotalUniqueBounces returns the total number of unique pageviews between the given timestamps -func TotalUniqueBounces(before int64, after int64) (int64, error) { - var total int64 - - query := dbx.Rebind(` - SELECT COALESCE(AVG(t.count_unique), 0) - FROM total_bounced t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - err := dbx.Get(&total, query, before, after) - if err != nil { - return 0, err - } - - return total, nil -} diff --git a/pkg/datastore/total_browsers.go b/pkg/datastore/total_browsers.go deleted file mode 100644 index 3e010f9..0000000 --- a/pkg/datastore/total_browsers.go +++ /dev/null @@ -1,47 +0,0 @@ -package datastore - -import "github.com/usefathom/fathom/pkg/models" - -// TotalBrowsers returns the total # of browsers between two given timestamps -func TotalBrowsers(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT - COALESCE(SUM(t.count), 0) - FROM total_browser_names t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - err := dbx.Get(&total, query, before, after) - return total, err -} - -// TotalUniqueBrowsers returns the total # of unique browsers between two given timestamps -func TotalUniqueBrowsers(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT - COALESCE(SUM(t.count_unique), 0) - FROM total_browser_names t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - err := dbx.Get(&total, query, before, after) - return total, err -} - -func TotalsPerBrowser(before int64, after int64, limit int64) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(` - SELECT - t.value AS value, - COALESCE(SUM(t.count), 0) AS count, - COALESCE(SUM(t.count_unique), 0) AS count_unique - FROM total_browser_names t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ? - GROUP BY t.value - ORDER BY count DESC - LIMIT ?`) - - err := dbx.Select(&results, query, before, after, limit) - return results, err -} diff --git a/pkg/datastore/total_languages.go b/pkg/datastore/total_languages.go deleted file mode 100644 index 4248d82..0000000 --- a/pkg/datastore/total_languages.go +++ /dev/null @@ -1,49 +0,0 @@ -package datastore - -import "github.com/usefathom/fathom/pkg/models" - -// TotalLanguages returns the total # of browser languages between two given timestamps -func TotalLanguages(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT - COALESCE(SUM(t.count), 0) - FROM total_browser_languages t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - - err := dbx.Get(&total, query, before, after) - return total, err -} - -// TotalUniqueLanguages returns the total # of unique browser languages between two given timestamps -func TotalUniqueLanguages(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT - COALESCE(SUM(t.count_unique), 0) - FROM total_browser_languages t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - - err := dbx.Get(&total, query, before, after) - return total, err -} - -func TotalsPerLanguage(before int64, after int64, limit int64) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(` - SELECT - t.value AS value, - COALESCE(SUM(t.count), 0) AS count, - COALESCE(SUM(t.count_unique), 0) AS count_unique - FROM total_browser_languages t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ? - GROUP BY t.value - ORDER BY count DESC - LIMIT ?`) - - err := dbx.Select(&results, query, before, after, limit) - return results, err -} diff --git a/pkg/datastore/total_pageviews.go b/pkg/datastore/total_pageviews.go deleted file mode 100644 index b6392dc..0000000 --- a/pkg/datastore/total_pageviews.go +++ /dev/null @@ -1,106 +0,0 @@ -package datastore - -import ( - "fmt" - - "github.com/usefathom/fathom/pkg/models" -) - -// TotalPageviews returns the total number of pageviews between the given timestamps -func TotalPageviews(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT COALESCE(SUM(t.count), 0) - FROM total_pageviews t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - err := dbx.Get(&total, query, before, after) - if err != nil { - return 0, err - } - - return total, nil -} - -// TotalUniquePageviews returns the total number of unique pageviews between the given timestamps -func TotalUniquePageviews(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT COALESCE(SUM(t.count_unique), 0) - FROM total_pageviews t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - err := dbx.Get(&total, query, before, after) - if err != nil { - return 0, err - } - - return total, nil -} - -// TotalPageviewsPerDay returns a slice of data points representing the number of pageviews per day -func TotalPageviewsPerDay(before int64, after int64) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(` - SELECT - CONCAT(p.scheme, "://", p.hostname, p.path) AS value, - COALESCE(SUM(t.count), 0) AS count, - COALESCE(SUM(t.count_unique), 0) AS count_unique, - DATE_FORMAT(t.date, '%Y-%m-%d') AS label - FROM total_pageviews t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ? - GROUP BY label, p.hostname, p.path, p.scheme`) - - err := dbx.Select(&results, query, before, after) - if err != nil { - return results, err - } - - return results, nil -} - -// TotalPageviewsPerPage returns a set of pageview counts, grouped by page (hostname + path) -func TotalPageviewsPerPage(before int64, after int64, limit int64) ([]*models.Total, error) { - var results []*models.Total - query := dbx.Rebind(` - SELECT - CONCAT(p.scheme, "://", p.hostname, p.path) AS value, - COALESCE(SUM(t.count), 0) AS count, - COALESCE(SUM(t.count_unique), 0) AS count_unique - FROM total_pageviews t - LEFT JOIN pages p ON p.id = t.page_id - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ? - GROUP BY p.hostname, p.path, p.scheme - ORDER BY count DESC - LIMIT ?`) - err := dbx.Select(&results, query, before, after, limit) - if err != nil { - return results, err - } - - return results, nil -} - -// SavePageviewTotals saves the given totals in the connected database -// Differs slightly from the metric specific totals because of the normalized pages (to save storage) -func SavePageTotals(metric string, totals []*models.Total) error { - tx, err := dbx.Begin() - if err != nil { - return nil - } - - query := fmt.Sprintf(`INSERT INTO total_%s( page_id, count, count_unique, date ) VALUES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE count = ?, count_unique = ?`, metric) - query = dbx.Rebind(query) - stmt, err := tx.Prepare(query) - if err != nil { - return err - } - - for _, t := range totals { - _, err = stmt.Exec(t.PageID, t.Count, t.CountUnique, t.Date, t.Count, t.CountUnique) - } - - err = tx.Commit() - return err -} diff --git a/pkg/datastore/total_referrers.go b/pkg/datastore/total_referrers.go deleted file mode 100644 index bb5916d..0000000 --- a/pkg/datastore/total_referrers.go +++ /dev/null @@ -1,49 +0,0 @@ -package datastore - -import "github.com/usefathom/fathom/pkg/models" - -// TotalReferrers returns the total # of referrers between two given timestamps -func TotalReferrers(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT - COALESCE(SUM(t.count), 0) - FROM total_referrers t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - - err := dbx.Get(&total, query, before, after) - return total, err -} - -// TotalUniqueReferrers returns the total # of unique referrers between two given timestamps -func TotalUniqueReferrers(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT - COALESCE(SUM(t.count_unique), 0) - FROM total_referrers t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - - err := dbx.Get(&total, query, before, after) - return total, err -} - -func TotalsPerReferrer(before int64, after int64, limit int64) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(` - SELECT - t.value, - COALESCE(SUM(t.count), 0) AS count, - COALESCE(SUM(t.count_unique), 0) AS count_unique - FROM total_referrers t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ? - GROUP BY t.value - ORDER BY count DESC - LIMIT ?`) - - err := dbx.Select(&results, query, before, after, limit) - return results, err -} diff --git a/pkg/datastore/total_screens.go b/pkg/datastore/total_screens.go deleted file mode 100644 index 436d865..0000000 --- a/pkg/datastore/total_screens.go +++ /dev/null @@ -1,47 +0,0 @@ -package datastore - -import "github.com/usefathom/fathom/pkg/models" - -// TotalScreens returns the total # of screens between two given timestamps -func TotalScreens(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT - COALESCE(SUM(t.count), 0) - FROM total_screens t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - err := dbx.Get(&total, query, before, after) - return total, err -} - -// TotalUniqueScreens returns the total # of unique screens between two given timestamps -func TotalUniqueScreens(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT - COALESCE(SUM(t.count_unique), 0) - FROM total_screens t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - err := dbx.Get(&total, query, before, after) - return total, err -} - -func TotalsPerScreen(before int64, after int64, limit int64) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(` - SELECT - t.value AS value, - COALESCE(SUM(t.count), 0) AS count, - COALESCE(SUM(t.count_unique), 0) AS count_unique - FROM total_screens t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ? - GROUP BY t.value - ORDER BY count DESC - LIMIT ?`) - - err := dbx.Select(&results, query, before, after, limit) - return results, err -} diff --git a/pkg/datastore/total_visitors.go b/pkg/datastore/total_visitors.go deleted file mode 100644 index cd39535..0000000 --- a/pkg/datastore/total_visitors.go +++ /dev/null @@ -1,52 +0,0 @@ -package datastore - -import "github.com/usefathom/fathom/pkg/models" - -// TotalVisitors returns the number of total visitors between the given timestamps -func TotalVisitors(before int64, after int64) (int, error) { - var total int - - query := dbx.Rebind(` - SELECT COALESCE(SUM(t.count), 0) - FROM total_visitors t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ?`) - err := dbx.Get(&total, query, before, after) - return total, err -} - -// TotalVisitorsPerDay returns a point slice containing visitor data per day -func TotalVisitorsPerDay(before int64, after int64) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(`SELECT - COALESCE(SUM(t.count), 0) AS count, - COALESCE(SUM(t.count_unique), 0) AS count_unique, - DATE_FORMAT(t.date, '%Y-%m-%d') AS label - FROM total_visitors t - WHERE UNIX_TIMESTAMP(t.date) <= ? AND UNIX_TIMESTAMP(t.date) >= ? - GROUP BY label`) - - err := dbx.Select(&results, query, before, after) - return results, err -} - -// SaveVisitorTotals saves the given totals in the connected datastore -func SaveVisitorTotals(totals []*models.Total) error { - tx, err := dbx.Begin() - if err != nil { - return nil - } - - query := dbx.Rebind(`INSERT INTO total_visitors( count, date ) VALUES( ?, ? ) ON DUPLICATE KEY UPDATE count = ?`) - stmt, err := tx.Prepare(query) - if err != nil { - return err - } - - for _, t := range totals { - _, err = stmt.Exec(t.Count, t.Date, t.Count) - } - - err = tx.Commit() - return err -} diff --git a/pkg/datastore/visitors.go b/pkg/datastore/visitors.go deleted file mode 100644 index 305a3f2..0000000 --- a/pkg/datastore/visitors.go +++ /dev/null @@ -1,62 +0,0 @@ -package datastore - -import ( - "database/sql" - - "github.com/usefathom/fathom/pkg/models" -) - -// GetVisitorByKey ... -func GetVisitorByKey(key string) (*models.Visitor, error) { - v := &models.Visitor{} - query := dbx.Rebind(`SELECT v.id FROM visitors v WHERE v.visitor_key = ? LIMIT 1`) - err := dbx.Get(v, query, key) - if err != nil { - if err == sql.ErrNoRows { - return nil, ErrNoResults - } - - return nil, err - } - - return v, nil -} - -// SaveVisitor inserts a single visitor model into the connected database -func SaveVisitor(v *models.Visitor) error { - query := dbx.Rebind(`INSERT INTO visitors(visitor_key, device_os, browser_name, browser_version, browser_language, screen_resolution, country) VALUES( ?, ?, ?, ?, ?, ?, ? )`) - result, err := dbx.Exec(query, v.Key, v.DeviceOS, v.BrowserName, v.BrowserVersion, v.BrowserLanguage, v.ScreenResolution, v.Country) - if err != nil { - return err - } - - v.ID, _ = result.LastInsertId() - return nil -} - -// RealtimeVisitors returns the total number of visitors in the last 3 minutes -// TODO: Query visitors table instead, using a last_seen column. -func RealtimeVisitors() (int, error) { - var result int - query := dbx.Rebind(` - SELECT COUNT(DISTINCT(pv.visitor_id)) - FROM pageviews pv - WHERE pv.timestamp >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 HOUR_MINUTE) AND pv.timestamp <= CURRENT_TIMESTAMP`) - err := dbx.Get(&result, query) - return result, err -} - -func VisitorCountPerDay(before string, after string) ([]*models.Total, error) { - var results []*models.Total - - query := dbx.Rebind(` - SELECT - COUNT(DISTINCT(pv.visitor_id)) AS count, - DATE_FORMAT(pv.timestamp, '%Y-%m-%d') AS date_group - FROM pageviews pv - WHERE pv.timestamp < ? AND pv.timestamp > ? - GROUP BY date_group`) - - err := dbx.Select(&results, query, before, after) - return results, err -} diff --git a/pkg/models/count.go b/pkg/models/count.go deleted file mode 100644 index 2e7c4ca..0000000 --- a/pkg/models/count.go +++ /dev/null @@ -1,8 +0,0 @@ -package models - -type Count struct { - URL string `json:"url"` - Views int64 `json:"views"` - Uniques int64 `json:"uniques"` - PercentOfTotal float64 `json:"percent_of_total"` -} diff --git a/pkg/models/page.go b/pkg/models/page.go deleted file mode 100644 index 5427568..0000000 --- a/pkg/models/page.go +++ /dev/null @@ -1,9 +0,0 @@ -package models - -type Page struct { - ID int64 `json:"-"` - Scheme string `json:"scheme"` - Hostname string `json:"hostname"` - Path string `json:"path"` - Title string `json:"title"` -} diff --git a/pkg/models/page_stats.go b/pkg/models/page_stats.go new file mode 100644 index 0000000..be0c282 --- /dev/null +++ b/pkg/models/page_stats.go @@ -0,0 +1,16 @@ +package models + +import ( + "time" +) + +type PageStats struct { + Pathname string `db:"pathname"` + Views int64 `db:"views"` + UniqueViews int64 `db:"unique_views"` + Bounced int64 `db:"bounced"` + BouncedN int64 `db:"bounced_n"` + AvgDuration int64 `db:"avg_duration"` + AvgDurationN int64 `db:"avg_duration_n"` + Date time.Time `db:"date"` +} diff --git a/pkg/models/raw_pageview.go b/pkg/models/raw_pageview.go new file mode 100644 index 0000000..ae6ddd9 --- /dev/null +++ b/pkg/models/raw_pageview.go @@ -0,0 +1,17 @@ +package models + +import ( + "time" +) + +type RawPageview struct { + ID int64 `db:"id"` + SessionID string `db:"session_id"` + Pathname string `db:"pathname"` + IsNewVisitor bool `db:"is_new_visitor"` + IsUnique bool `db:"is_unique"` + IsBounce bool `db:"is_bounce"` + Referrer string `db:"referrer"` + Duration int64 `db:"duration"` + Timestamp time.Time `db:"timestamp"` +} diff --git a/pkg/models/referrer_stats.go b/pkg/models/referrer_stats.go new file mode 100644 index 0000000..b0ea50a --- /dev/null +++ b/pkg/models/referrer_stats.go @@ -0,0 +1,16 @@ +package models + +import ( + "time" +) + +type ReferrerStats struct { + URL string `db:"url"` + Visitors int64 `db:"visitors"` + Pageviews int64 `db:"pageviews"` + Bounced int64 `db:"bounced"` + BouncedN int64 `db:"bounced_n"` + AvgDuration int64 `db:"avg_duration"` + AvgDurationN int64 `db:"avg_duration_n"` + Date time.Time `db:"date"` +} diff --git a/pkg/models/site_stats.go b/pkg/models/site_stats.go new file mode 100644 index 0000000..86dc4d4 --- /dev/null +++ b/pkg/models/site_stats.go @@ -0,0 +1,15 @@ +package models + +import ( + "time" +) + +type SiteStats struct { + Visitors int64 `db:"visitors"` + Pageviews int64 `db:"pageviews"` + Bounced int64 `db:"bounced"` + BouncedN int64 `db:"bounced_n"` + AvgDuration int64 `db:"avg_duration"` + AvgDurationN int64 `db:"avg_duration_n"` + Date time.Time `db:"date"` +} diff --git a/pkg/models/total.go b/pkg/models/total.go deleted file mode 100644 index 6ad277d..0000000 --- a/pkg/models/total.go +++ /dev/null @@ -1,12 +0,0 @@ -package models - -// Total represents a daily aggregated total for a metric -type Total struct { - ID int64 `json:"-"` - PageID int64 `db:"page_id" json:"-"` - Value string `db:"value" json:"value"` - Count int64 `db:"count" json:"count"` - CountUnique int64 `db:"count_unique" json:"count_unique"` - PercentageOfTotal float64 `db:"-" json:"percentage_of_total"` - Date string `db:"date_group" json:"date,omitempty"` -} diff --git a/pkg/models/visitor.go b/pkg/models/visitor.go deleted file mode 100644 index d0213ad..0000000 --- a/pkg/models/visitor.go +++ /dev/null @@ -1,12 +0,0 @@ -package models - -type Visitor struct { - ID int64 - Key string - BrowserName string - BrowserVersion string - BrowserLanguage string - Country string - DeviceOS string - ScreenResolution string -}