diff --git a/.babelrc b/.babelrc
index 93271d5..0226a4e 100644
--- a/.babelrc
+++ b/.babelrc
@@ -1,6 +1,8 @@
{
"presets": [
"es2015-node",
+ "es2016",
+ "es2017",
"react",
"stage-0"
],
diff --git a/.editorconfig b/.editorconfig
index 178e917..f483b98 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -9,5 +9,8 @@ insert_final_newline = true
tab_width = 2
trim_trailing_whitespace = true
+[Makefile]
+indent_style = tab
+
[*.md]
trim_trailing_whitespace = false
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..dd3021d
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+loglevel = "http"
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..1514a4a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,14 @@
+# Workaround for bug in npm@3
+# @see https://github.com/npm/npm/issues/9727
+shrinkwrap:
+ @rm -rf .tmp
+ @mkdir .tmp
+ @cp package.json .tmp/package.json
+ @npm cache clean
+ @cd .tmp && npm install --production && npm shrinkwrap
+ @rm npm-shrinkwrap.json
+ @cp .tmp/npm-shrinkwrap.json npm-shrinkwrap.json
+ @rm -rf .tmp
+ @npm install
+ @npm prune
+.PHONY: shrinkwrap
diff --git a/build/clean.js b/build/clean.js
index 9323080..89ad09e 100644
--- a/build/clean.js
+++ b/build/clean.js
@@ -1,10 +1,7 @@
-import path from 'path';
-
-import del from 'del';
import gulp from 'gulp';
+import del from 'del';
-gulp.task('clean', (done) => {
- del.sync(path.resolve(__dirname, '..', 'dist', '*'));
- done();
+gulp.task('clean', () => {
+ return del(['dist/**/*', '.tmp']);
});
diff --git a/build/deploy.js b/build/deploy.js
new file mode 100644
index 0000000..ab47caf
--- /dev/null
+++ b/build/deploy.js
@@ -0,0 +1,31 @@
+import path from 'path';
+
+import gulp from 'gulp';
+import runSequence from 'run-sequence';
+import zip from 'gulp-zip';
+import Application from 'azur';
+
+
+gulp.task('compile', (done) => {
+ runSequence('clean', 'webpack-prod', done);
+});
+
+gulp.task('package', ['compile'], () => {
+ return gulp.src(['dist/**/*', 'server.js', 'iisnode.yml', 'package.json', 'npm-shrinkwrap.json', 'README.md'], { base: '.' })
+ .pipe(zip('app.zip'))
+ .pipe(gulp.dest('.tmp'));
+});
+
+gulp.task('deploy', ['package'], () => {
+ const app = new Application({
+ appName: process.env.AZURE_APP_NAME,
+ username: process.env.AZURE_GIT_USERNAME,
+ password: process.env.AZURE_GIT_PASSWORD,
+ gitName: 'Automated Deployments',
+ gitEmail: 'noreply@nhardy.id.au',
+ });
+
+ return app.deploy({
+ archiveFilePath: path.resolve(__dirname, '..', '.tmp/app.zip'),
+ });
+});
diff --git a/build/tasks.js b/build/tasks.js
index f2f2718..16a1ea7 100644
--- a/build/tasks.js
+++ b/build/tasks.js
@@ -4,14 +4,15 @@ import runSequence from 'run-sequence';
import './clean';
import './serve';
import './webpack';
+import './deploy';
-gulp.task('dev', () => {
- runSequence('clean', 'webpack-client-dev', 'webpack-server-dev', 'serve');
+gulp.task('dev', (done) => {
+ runSequence('clean', 'webpack-client-dev', 'webpack-server-dev', 'serve', done);
});
-gulp.task('prod', () => {
- runSequence('clean', 'webpack-prod', 'serve');
+gulp.task('prod', (done) => {
+ runSequence('clean', 'webpack-prod', 'serve', done);
});
gulp.task('default', () => {
diff --git a/build/webpack/factory.js b/build/webpack/factory.js
index 07edee7..133fd09 100644
--- a/build/webpack/factory.js
+++ b/build/webpack/factory.js
@@ -129,6 +129,8 @@ export default function webpackFactory({ production = false, client = false, wri
production && ['es2015', { modules: false }],
!production && 'modern/webpack2',
!production && 'modern/safari9',
+ 'es2016',
+ 'es2017',
'stage-0',
'react',
].filter(identity),
diff --git a/circle.yml b/circle.yml
index a08c64d..9a5ded2 100644
--- a/circle.yml
+++ b/circle.yml
@@ -1,8 +1,20 @@
machine:
node:
version: 6.5.0
+dependencies:
+ pre:
+ - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
+ - sudo apt-get update
+ - sudo apt-get install -y libstdc++-4.9-dev
+ override:
+ - npm install --no-progress --quiet
test:
pre:
- npm run lint
override:
- npm test
+deployment:
+ production:
+ branch: master
+ commands:
+ - npm run deploy
diff --git a/config/index.js b/config/index.js
index 158de3c..759dcb4 100644
--- a/config/index.js
+++ b/config/index.js
@@ -1,5 +1,5 @@
export default {
- port: 8000,
+ port: process.env.PORT || 8000,
helps: {
baseUrl: 'http://uts-helps.azurewebsites.net/api',
headers: {
diff --git a/iisnode.yml b/iisnode.yml
new file mode 100644
index 0000000..2f70c98
--- /dev/null
+++ b/iisnode.yml
@@ -0,0 +1,18 @@
+# For documentation see https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/iisnode.yml
+
+loggingEnabled: false
+debuggingEnabled: false
+# devErrorsEnabled: false
+node_env: production
+nodeProcessCountPerApplication: 1
+maxConcurrentRequestsPerProcess: 1024
+maxNamedPipeConnectionRetry: 24
+namedPipeConnectionRetryDelay: 250
+maxNamedPipeConnectionPoolSize: 512
+maxNamedPipePooledConnectionAge: 30000
+asyncCompletionThreadCount: 0
+initialRequestBufferSize: 4096
+maxRequestBufferSize: 65536
+watchedFiles: *.js;iisnode.yml;node_modules\*;dist\*
+uncFileChangesPollingInterval: 5000
+gracefulShutdownTimeout: 60000
diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
new file mode 100644
index 0000000..f2ca672
--- /dev/null
+++ b/npm-shrinkwrap.json
@@ -0,0 +1,1568 @@
+{
+ "name": "web-scaffold",
+ "version": "0.0.0",
+ "dependencies": {
+ "abbrev": {
+ "version": "1.0.9",
+ "from": "abbrev@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz"
+ },
+ "accepts": {
+ "version": "1.3.3",
+ "from": "accepts@>=1.3.3 <1.4.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz"
+ },
+ "amdefine": {
+ "version": "1.0.0",
+ "from": "amdefine@>=0.0.4",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz"
+ },
+ "ansi-regex": {
+ "version": "2.0.0",
+ "from": "ansi-regex@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz"
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "from": "ansi-styles@>=2.2.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz"
+ },
+ "anymatch": {
+ "version": "1.3.0",
+ "from": "anymatch@>=1.3.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz"
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "from": "arr-diff@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz"
+ },
+ "arr-flatten": {
+ "version": "1.0.1",
+ "from": "arr-flatten@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz"
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "from": "array-flatten@1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "from": "array-unique@>=0.2.1 <0.3.0",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz"
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "from": "arrify@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz"
+ },
+ "asap": {
+ "version": "2.0.5",
+ "from": "asap@>=2.0.3 <2.1.0",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz"
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "from": "asn1@>=0.2.3 <0.3.0",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz"
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "from": "assert-plus@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz"
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "from": "async-each@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz"
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "from": "asynckit@>=0.4.0 <0.5.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "from": "aws-sign2@>=0.6.0 <0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz"
+ },
+ "aws4": {
+ "version": "1.4.1",
+ "from": "aws4@>=1.2.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz"
+ },
+ "babel-code-frame": {
+ "version": "6.16.0",
+ "from": "babel-code-frame@>=6.16.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.16.0.tgz",
+ "dependencies": {
+ "js-tokens": {
+ "version": "2.0.0",
+ "from": "js-tokens@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz"
+ }
+ }
+ },
+ "babel-messages": {
+ "version": "6.8.0",
+ "from": "babel-messages@>=6.8.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz"
+ },
+ "babel-polyfill": {
+ "version": "6.16.0",
+ "from": "babel-polyfill@>=6.7.4 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.16.0.tgz"
+ },
+ "babel-runtime": {
+ "version": "6.11.6",
+ "from": "babel-runtime@>=6.9.1 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.11.6.tgz"
+ },
+ "babel-template": {
+ "version": "6.16.0",
+ "from": "babel-template@>=6.7.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz"
+ },
+ "babel-traverse": {
+ "version": "6.16.0",
+ "from": "babel-traverse@>=6.16.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.16.0.tgz"
+ },
+ "babel-types": {
+ "version": "6.16.0",
+ "from": "babel-types@>=6.16.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.16.0.tgz"
+ },
+ "babylon": {
+ "version": "6.11.4",
+ "from": "babylon@>=6.11.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.11.4.tgz"
+ },
+ "balanced-match": {
+ "version": "0.4.2",
+ "from": "balanced-match@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz"
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.0",
+ "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz"
+ },
+ "binary-extensions": {
+ "version": "1.7.0",
+ "from": "binary-extensions@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.7.0.tgz"
+ },
+ "bl": {
+ "version": "1.1.2",
+ "from": "bl@>=1.1.2 <1.2.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz",
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.0.6",
+ "from": "readable-stream@>=2.0.5 <2.1.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz"
+ }
+ }
+ },
+ "bluebird": {
+ "version": "3.4.6",
+ "from": "bluebird@>=3.4.6 <4.0.0",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.6.tgz"
+ },
+ "body-parser": {
+ "version": "1.15.2",
+ "from": "body-parser@>=1.15.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.15.2.tgz"
+ },
+ "boom": {
+ "version": "2.10.1",
+ "from": "boom@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz"
+ },
+ "brace-expansion": {
+ "version": "1.1.6",
+ "from": "brace-expansion@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz"
+ },
+ "braces": {
+ "version": "1.8.5",
+ "from": "braces@>=1.8.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz"
+ },
+ "buffer-shims": {
+ "version": "1.0.0",
+ "from": "buffer-shims@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz"
+ },
+ "bytes": {
+ "version": "2.4.0",
+ "from": "bytes@2.4.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz"
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "from": "caseless@>=0.11.0 <0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz"
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "from": "chalk@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
+ },
+ "chokidar": {
+ "version": "1.6.0",
+ "from": "chokidar@>=1.4.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.0.tgz"
+ },
+ "classnames": {
+ "version": "2.2.5",
+ "from": "classnames@>=2.2.5 <3.0.0",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz"
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "from": "combined-stream@>=1.0.5 <1.1.0",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz"
+ },
+ "commander": {
+ "version": "2.9.0",
+ "from": "commander@>=2.9.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz"
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "from": "concat-map@0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ },
+ "configstore": {
+ "version": "1.4.0",
+ "from": "configstore@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-1.4.0.tgz"
+ },
+ "content-disposition": {
+ "version": "0.5.1",
+ "from": "content-disposition@0.5.1",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz"
+ },
+ "content-type": {
+ "version": "1.0.2",
+ "from": "content-type@>=1.0.2 <1.1.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz"
+ },
+ "cookie": {
+ "version": "0.3.1",
+ "from": "cookie@0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz"
+ },
+ "cookie-parser": {
+ "version": "1.4.3",
+ "from": "cookie-parser@>=1.4.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz"
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "from": "cookie-signature@1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"
+ },
+ "core-js": {
+ "version": "2.4.1",
+ "from": "core-js@>=2.4.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz"
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "from": "core-util-is@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "from": "cryptiles@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz"
+ },
+ "dashdash": {
+ "version": "1.14.0",
+ "from": "dashdash@>=1.12.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz",
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ }
+ }
+ },
+ "debug": {
+ "version": "2.2.0",
+ "from": "debug@>=2.2.0 <2.3.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz"
+ },
+ "deep-equal": {
+ "version": "1.0.1",
+ "from": "deep-equal@1.0.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz"
+ },
+ "deep-extend": {
+ "version": "0.4.1",
+ "from": "deep-extend@>=0.4.0 <0.5.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz"
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "from": "delayed-stream@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ },
+ "depd": {
+ "version": "1.1.0",
+ "from": "depd@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz"
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "from": "destroy@>=1.0.4 <1.1.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz"
+ },
+ "dom-walk": {
+ "version": "0.1.1",
+ "from": "dom-walk@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz"
+ },
+ "duplexer": {
+ "version": "0.1.1",
+ "from": "duplexer@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz"
+ },
+ "duplexify": {
+ "version": "3.4.5",
+ "from": "duplexify@>=3.2.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.4.5.tgz"
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "from": "ecc-jsbn@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz"
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "from": "ee-first@1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
+ },
+ "encodeurl": {
+ "version": "1.0.1",
+ "from": "encodeurl@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz"
+ },
+ "encoding": {
+ "version": "0.1.12",
+ "from": "encoding@>=0.1.11 <0.2.0",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz"
+ },
+ "end-of-stream": {
+ "version": "1.0.0",
+ "from": "end-of-stream@1.0.0",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz"
+ },
+ "error-stack-parser": {
+ "version": "1.3.6",
+ "from": "error-stack-parser@>=1.3.6 <2.0.0",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz"
+ },
+ "es6-promise": {
+ "version": "3.3.1",
+ "from": "es6-promise@>=3.0.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz"
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "from": "escape-html@>=1.0.3 <1.1.0",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "from": "escape-string-regexp@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "from": "esutils@>=2.0.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz"
+ },
+ "etag": {
+ "version": "1.7.0",
+ "from": "etag@>=1.7.0 <1.8.0",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz"
+ },
+ "event-stream": {
+ "version": "3.3.4",
+ "from": "event-stream@>=3.3.0 <3.4.0",
+ "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz"
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "from": "expand-brackets@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz"
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "from": "expand-range@>=1.8.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz"
+ },
+ "express": {
+ "version": "4.14.0",
+ "from": "express@>=4.14.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.14.0.tgz"
+ },
+ "extend": {
+ "version": "3.0.0",
+ "from": "extend@>=3.0.0 <3.1.0",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz"
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "from": "extglob@>=0.3.1 <0.4.0",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz"
+ },
+ "extsprintf": {
+ "version": "1.0.2",
+ "from": "extsprintf@1.0.2",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz"
+ },
+ "fbjs": {
+ "version": "0.8.5",
+ "from": "fbjs@>=0.8.4 <0.9.0",
+ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.5.tgz",
+ "dependencies": {
+ "core-js": {
+ "version": "1.2.7",
+ "from": "core-js@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz"
+ }
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.0",
+ "from": "filename-regex@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz"
+ },
+ "fill-range": {
+ "version": "2.2.3",
+ "from": "fill-range@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz"
+ },
+ "finalhandler": {
+ "version": "0.5.0",
+ "from": "finalhandler@0.5.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz"
+ },
+ "font-awesome": {
+ "version": "4.6.3",
+ "from": "font-awesome@>=4.6.3 <5.0.0",
+ "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.6.3.tgz"
+ },
+ "for-in": {
+ "version": "0.1.6",
+ "from": "for-in@>=0.1.5 <0.2.0",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.6.tgz"
+ },
+ "for-own": {
+ "version": "0.1.4",
+ "from": "for-own@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz"
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "from": "forever-agent@>=0.6.1 <0.7.0",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
+ },
+ "form-data": {
+ "version": "2.0.0",
+ "from": "form-data@>=2.0.0 <2.1.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz"
+ },
+ "forwarded": {
+ "version": "0.1.0",
+ "from": "forwarded@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz"
+ },
+ "fresh": {
+ "version": "0.3.0",
+ "from": "fresh@0.3.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz"
+ },
+ "from": {
+ "version": "0.1.3",
+ "from": "from@>=0.0.0 <1.0.0",
+ "resolved": "https://registry.npmjs.org/from/-/from-0.1.3.tgz"
+ },
+ "gemini-scrollbar": {
+ "version": "1.4.3",
+ "from": "gemini-scrollbar@>=1.4.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/gemini-scrollbar/-/gemini-scrollbar-1.4.3.tgz"
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "from": "generate-function@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz"
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "from": "generate-object-property@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz"
+ },
+ "getpass": {
+ "version": "0.1.6",
+ "from": "getpass@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz",
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ }
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "from": "glob-base@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz"
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "from": "glob-parent@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz"
+ },
+ "global": {
+ "version": "4.3.1",
+ "from": "global@>=4.3.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.3.1.tgz"
+ },
+ "globals": {
+ "version": "8.18.0",
+ "from": "globals@>=8.3.0 <9.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz"
+ },
+ "got": {
+ "version": "3.3.1",
+ "from": "got@>=3.2.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-3.3.1.tgz",
+ "dependencies": {
+ "object-assign": {
+ "version": "3.0.0",
+ "from": "object-assign@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz"
+ }
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.9",
+ "from": "graceful-fs@>=4.1.2 <5.0.0",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.9.tgz"
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "from": "graceful-readlink@>=1.0.0",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "from": "har-validator@>=2.0.6 <2.1.0",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz"
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "from": "has-ansi@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "from": "hawk@>=3.1.3 <3.2.0",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz"
+ },
+ "history": {
+ "version": "2.1.2",
+ "from": "history@>=2.1.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/history/-/history-2.1.2.tgz"
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "from": "hoek@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz"
+ },
+ "hoist-non-react-statics": {
+ "version": "1.2.0",
+ "from": "hoist-non-react-statics@>=1.0.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz"
+ },
+ "http-errors": {
+ "version": "1.5.0",
+ "from": "http-errors@>=1.5.0 <1.6.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.0.tgz"
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "from": "http-signature@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz"
+ },
+ "iconv-lite": {
+ "version": "0.4.13",
+ "from": "iconv-lite@0.4.13",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz"
+ },
+ "ignore-by-default": {
+ "version": "1.0.1",
+ "from": "ignore-by-default@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz"
+ },
+ "immutable": {
+ "version": "3.8.1",
+ "from": "immutable@>=3.7.6 <4.0.0",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.1.tgz"
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "from": "imurmurhash@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ },
+ "infinity-agent": {
+ "version": "2.0.3",
+ "from": "infinity-agent@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/infinity-agent/-/infinity-agent-2.0.3.tgz"
+ },
+ "inherits": {
+ "version": "2.0.1",
+ "from": "inherits@2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
+ },
+ "ini": {
+ "version": "1.3.4",
+ "from": "ini@>=1.3.0 <1.4.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz"
+ },
+ "invariant": {
+ "version": "2.2.1",
+ "from": "invariant@>=2.2.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz"
+ },
+ "ipaddr.js": {
+ "version": "1.1.1",
+ "from": "ipaddr.js@1.1.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.1.1.tgz"
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "from": "is-binary-path@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz"
+ },
+ "is-buffer": {
+ "version": "1.1.4",
+ "from": "is-buffer@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz"
+ },
+ "is-dotfile": {
+ "version": "1.0.2",
+ "from": "is-dotfile@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz"
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "from": "is-equal-shallow@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz"
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "from": "is-extendable@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "from": "is-extglob@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz"
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "from": "is-finite@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz"
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "from": "is-glob@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
+ },
+ "is-my-json-valid": {
+ "version": "2.15.0",
+ "from": "is-my-json-valid@>=2.12.4 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz"
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "from": "is-npm@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz"
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "from": "is-number@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz"
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "from": "is-posix-bracket@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz"
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "from": "is-primitive@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz"
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "from": "is-property@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz"
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "from": "is-redirect@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz"
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "from": "is-stream@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz"
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "from": "is-typedarray@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "from": "isarray@1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "from": "isobject@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz"
+ },
+ "isomorphic-fetch": {
+ "version": "2.2.1",
+ "from": "isomorphic-fetch@>=2.2.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz"
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "from": "isstream@>=0.1.2 <0.2.0",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
+ },
+ "jodid25519": {
+ "version": "1.0.2",
+ "from": "jodid25519@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz"
+ },
+ "js-tokens": {
+ "version": "1.0.3",
+ "from": "js-tokens@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz"
+ },
+ "jsbn": {
+ "version": "0.1.0",
+ "from": "jsbn@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz"
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "from": "json-schema@0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz"
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "from": "json-stringify-safe@>=5.0.1 <5.1.0",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
+ },
+ "jsonpointer": {
+ "version": "4.0.0",
+ "from": "jsonpointer@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.0.tgz"
+ },
+ "jsprim": {
+ "version": "1.3.1",
+ "from": "jsprim@>=1.2.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz"
+ },
+ "kind-of": {
+ "version": "3.0.4",
+ "from": "kind-of@>=3.0.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz"
+ },
+ "latest-version": {
+ "version": "1.0.1",
+ "from": "latest-version@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-1.0.1.tgz"
+ },
+ "lodash": {
+ "version": "4.16.4",
+ "from": "lodash@>=4.2.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.4.tgz"
+ },
+ "lodash-es": {
+ "version": "4.16.4",
+ "from": "lodash-es@>=4.16.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.16.4.tgz"
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "from": "lodash._baseassign@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz"
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "from": "lodash._basecopy@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz"
+ },
+ "lodash._bindcallback": {
+ "version": "3.0.1",
+ "from": "lodash._bindcallback@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz"
+ },
+ "lodash._createassigner": {
+ "version": "3.1.1",
+ "from": "lodash._createassigner@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz"
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "from": "lodash._getnative@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz"
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "from": "lodash._isiterateecall@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz"
+ },
+ "lodash.assign": {
+ "version": "3.2.0",
+ "from": "lodash.assign@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz"
+ },
+ "lodash.defaults": {
+ "version": "3.1.2",
+ "from": "lodash.defaults@>=3.1.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz"
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "from": "lodash.isarguments@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz"
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "from": "lodash.isarray@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz"
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "from": "lodash.keys@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz"
+ },
+ "lodash.restparam": {
+ "version": "3.6.1",
+ "from": "lodash.restparam@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz"
+ },
+ "loose-envify": {
+ "version": "1.2.0",
+ "from": "loose-envify@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz"
+ },
+ "lowercase-keys": {
+ "version": "1.0.0",
+ "from": "lowercase-keys@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz"
+ },
+ "map-stream": {
+ "version": "0.1.0",
+ "from": "map-stream@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz"
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "from": "media-typer@0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "from": "merge-descriptors@1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz"
+ },
+ "methods": {
+ "version": "1.1.2",
+ "from": "methods@>=1.1.2 <1.2.0",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "from": "micromatch@>=2.1.5 <3.0.0",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz"
+ },
+ "mime": {
+ "version": "1.3.4",
+ "from": "mime@1.3.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz"
+ },
+ "mime-db": {
+ "version": "1.24.0",
+ "from": "mime-db@>=1.24.0 <1.25.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.24.0.tgz"
+ },
+ "mime-types": {
+ "version": "2.1.12",
+ "from": "mime-types@>=2.1.11 <2.2.0",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.12.tgz"
+ },
+ "min-document": {
+ "version": "2.19.0",
+ "from": "min-document@>=2.19.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz"
+ },
+ "minimatch": {
+ "version": "3.0.3",
+ "from": "minimatch@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz"
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "from": "minimist@0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "from": "mkdirp@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz"
+ },
+ "moment": {
+ "version": "2.15.1",
+ "from": "moment@>=2.6.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.15.1.tgz"
+ },
+ "moment-timezone": {
+ "version": "0.5.5",
+ "from": "moment-timezone@>=0.5.5 <0.6.0",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.5.tgz"
+ },
+ "ms": {
+ "version": "0.7.1",
+ "from": "ms@0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "from": "negotiator@0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz"
+ },
+ "nested-error-stacks": {
+ "version": "1.0.2",
+ "from": "nested-error-stacks@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz"
+ },
+ "node-fetch": {
+ "version": "1.6.3",
+ "from": "node-fetch@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz"
+ },
+ "node-uuid": {
+ "version": "1.4.7",
+ "from": "node-uuid@>=1.4.7 <1.5.0",
+ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz"
+ },
+ "nodemon": {
+ "version": "1.11.0",
+ "from": "nodemon@>=1.9.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.11.0.tgz"
+ },
+ "nopt": {
+ "version": "1.0.10",
+ "from": "nopt@>=1.0.10 <1.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz"
+ },
+ "normalize-path": {
+ "version": "2.0.1",
+ "from": "normalize-path@>=2.0.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz"
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "from": "number-is-nan@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz"
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "from": "oauth-sign@>=0.8.1 <0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz"
+ },
+ "object-assign": {
+ "version": "4.1.0",
+ "from": "object-assign@>=4.0.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz"
+ },
+ "object.omit": {
+ "version": "2.0.0",
+ "from": "object.omit@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz"
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "from": "on-finished@>=2.3.0 <2.4.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"
+ },
+ "once": {
+ "version": "1.3.3",
+ "from": "once@>=1.3.0 <1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz"
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "from": "os-homedir@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz"
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "from": "os-tmpdir@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
+ },
+ "osenv": {
+ "version": "0.1.3",
+ "from": "osenv@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz"
+ },
+ "package-json": {
+ "version": "1.2.0",
+ "from": "package-json@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz"
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "from": "parse-glob@>=3.0.4 <4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz"
+ },
+ "parseurl": {
+ "version": "1.3.1",
+ "from": "parseurl@>=1.3.1 <1.4.0",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz"
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "from": "path-is-absolute@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "from": "path-to-regexp@0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz"
+ },
+ "pause-stream": {
+ "version": "0.0.11",
+ "from": "pause-stream@0.0.11",
+ "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz"
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "from": "pinkie@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "from": "pinkie-promise@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz"
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "from": "prepend-http@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz"
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "from": "preserve@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz"
+ },
+ "process": {
+ "version": "0.5.2",
+ "from": "process@>=0.5.1 <0.6.0",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz"
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "from": "process-nextick-args@>=1.0.6 <1.1.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz"
+ },
+ "promise": {
+ "version": "7.1.1",
+ "from": "promise@>=7.1.1 <8.0.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz"
+ },
+ "proxy-addr": {
+ "version": "1.1.2",
+ "from": "proxy-addr@>=1.1.2 <1.2.0",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.2.tgz"
+ },
+ "ps-tree": {
+ "version": "1.1.0",
+ "from": "ps-tree@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz"
+ },
+ "qs": {
+ "version": "6.2.0",
+ "from": "qs@6.2.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz"
+ },
+ "query-string": {
+ "version": "3.0.3",
+ "from": "query-string@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-3.0.3.tgz"
+ },
+ "randomatic": {
+ "version": "1.1.5",
+ "from": "randomatic@>=1.1.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz"
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "from": "range-parser@>=1.2.0 <1.3.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz"
+ },
+ "raw-body": {
+ "version": "2.1.7",
+ "from": "raw-body@>=2.1.7 <2.2.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz"
+ },
+ "rc": {
+ "version": "1.1.6",
+ "from": "rc@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz",
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "from": "minimist@>=1.2.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz"
+ }
+ }
+ },
+ "rc-switch": {
+ "version": "1.4.2",
+ "from": "rc-switch@>=1.4.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-1.4.2.tgz"
+ },
+ "react": {
+ "version": "15.3.2",
+ "from": "react@>=15.0.1 <16.0.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-15.3.2.tgz"
+ },
+ "react-deep-force-update": {
+ "version": "2.0.1",
+ "from": "react-deep-force-update@>=2.0.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-2.0.1.tgz"
+ },
+ "react-dom": {
+ "version": "15.3.2",
+ "from": "react-dom@>=15.0.1 <16.0.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.3.2.tgz"
+ },
+ "react-helmet": {
+ "version": "3.1.0",
+ "from": "react-helmet@>=3.0.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-3.1.0.tgz"
+ },
+ "react-hot-loader": {
+ "version": "3.0.0-beta.5",
+ "from": "react-hot-loader@>=3.0.0-beta <4.0.0",
+ "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-3.0.0-beta.5.tgz"
+ },
+ "react-proxy": {
+ "version": "3.0.0-alpha.1",
+ "from": "react-proxy@>=3.0.0-alpha.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-3.0.0-alpha.1.tgz"
+ },
+ "react-redux": {
+ "version": "4.4.5",
+ "from": "react-redux@>=4.4.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-4.4.5.tgz"
+ },
+ "react-router": {
+ "version": "2.8.1",
+ "from": "react-router@>=2.0.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-2.8.1.tgz",
+ "dependencies": {
+ "warning": {
+ "version": "3.0.0",
+ "from": "warning@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz"
+ }
+ }
+ },
+ "react-router-redux": {
+ "version": "4.0.6",
+ "from": "react-router-redux@>=4.0.2 <5.0.0",
+ "resolved": "https://registry.npmjs.org/react-router-redux/-/react-router-redux-4.0.6.tgz"
+ },
+ "react-side-effect": {
+ "version": "1.0.2",
+ "from": "react-side-effect@1.0.2",
+ "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.0.2.tgz",
+ "dependencies": {
+ "core-js": {
+ "version": "1.2.7",
+ "from": "core-js@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz"
+ },
+ "fbjs": {
+ "version": "0.1.0-alpha.10",
+ "from": "fbjs@0.1.0-alpha.10",
+ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.1.0-alpha.10.tgz"
+ },
+ "whatwg-fetch": {
+ "version": "0.9.0",
+ "from": "whatwg-fetch@>=0.9.0 <0.10.0",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz"
+ }
+ }
+ },
+ "react-sticky": {
+ "version": "5.0.5",
+ "from": "react-sticky@>=5.0.3 <6.0.0",
+ "resolved": "https://registry.npmjs.org/react-sticky/-/react-sticky-5.0.5.tgz"
+ },
+ "read-all-stream": {
+ "version": "3.1.0",
+ "from": "read-all-stream@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz"
+ },
+ "readable-stream": {
+ "version": "2.1.5",
+ "from": "readable-stream@>=2.0.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz"
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "from": "readdirp@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz"
+ },
+ "redbox-react": {
+ "version": "1.3.1",
+ "from": "redbox-react@>=1.2.5 <2.0.0",
+ "resolved": "https://registry.npmjs.org/redbox-react/-/redbox-react-1.3.1.tgz"
+ },
+ "reduce-reducers": {
+ "version": "0.1.2",
+ "from": "reduce-reducers@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/reduce-reducers/-/reduce-reducers-0.1.2.tgz"
+ },
+ "redux": {
+ "version": "3.6.0",
+ "from": "redux@>=3.3.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-3.6.0.tgz"
+ },
+ "redux-actions": {
+ "version": "0.10.1",
+ "from": "redux-actions@>=0.10.1 <0.11.0",
+ "resolved": "https://registry.npmjs.org/redux-actions/-/redux-actions-0.10.1.tgz"
+ },
+ "redux-connect": {
+ "version": "3.0.0",
+ "from": "redux-connect@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/redux-connect/-/redux-connect-3.0.0.tgz"
+ },
+ "redux-thunk": {
+ "version": "2.1.0",
+ "from": "redux-thunk@>=2.0.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.1.0.tgz"
+ },
+ "regenerator-runtime": {
+ "version": "0.9.5",
+ "from": "regenerator-runtime@>=0.9.5 <0.10.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz"
+ },
+ "regex-cache": {
+ "version": "0.4.3",
+ "from": "regex-cache@>=0.4.2 <0.5.0",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz"
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "from": "registry-url@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz"
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "from": "repeat-element@>=1.1.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz"
+ },
+ "repeat-string": {
+ "version": "1.5.4",
+ "from": "repeat-string@>=1.5.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz"
+ },
+ "repeating": {
+ "version": "1.1.3",
+ "from": "repeating@>=1.1.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz"
+ },
+ "request": {
+ "version": "2.75.0",
+ "from": "request@>=2.75.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz"
+ },
+ "semver": {
+ "version": "5.3.0",
+ "from": "semver@>=5.0.3 <6.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz"
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "from": "semver-diff@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz"
+ },
+ "send": {
+ "version": "0.14.1",
+ "from": "send@0.14.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.14.1.tgz"
+ },
+ "serve-static": {
+ "version": "1.11.1",
+ "from": "serve-static@>=1.11.1 <1.12.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.1.tgz"
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "from": "set-immediate-shim@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz"
+ },
+ "setprototypeof": {
+ "version": "1.0.1",
+ "from": "setprototypeof@1.0.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.1.tgz"
+ },
+ "shallowequal": {
+ "version": "0.2.2",
+ "from": "shallowequal@0.2.2",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz"
+ },
+ "slide": {
+ "version": "1.1.6",
+ "from": "slide@>=1.1.5 <2.0.0",
+ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz"
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "from": "sntp@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz"
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "from": "source-map@>=0.4.4 <0.5.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz"
+ },
+ "source-map-support": {
+ "version": "0.4.3",
+ "from": "source-map-support@>=0.4.0 <0.5.0",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.3.tgz",
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.6",
+ "from": "source-map@>=0.5.3 <0.6.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
+ }
+ }
+ },
+ "split": {
+ "version": "0.3.3",
+ "from": "split@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz"
+ },
+ "sshpk": {
+ "version": "1.10.1",
+ "from": "sshpk@>=1.7.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.1.tgz",
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ }
+ }
+ },
+ "stackframe": {
+ "version": "0.3.1",
+ "from": "stackframe@>=0.3.1 <0.4.0",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz"
+ },
+ "statuses": {
+ "version": "1.3.0",
+ "from": "statuses@>=1.3.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz"
+ },
+ "stream-combiner": {
+ "version": "0.0.4",
+ "from": "stream-combiner@>=0.0.4 <0.1.0",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz"
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "from": "stream-shift@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz"
+ },
+ "strict-uri-encode": {
+ "version": "1.1.0",
+ "from": "strict-uri-encode@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz"
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "from": "string_decoder@>=0.10.0 <0.11.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
+ },
+ "string-length": {
+ "version": "1.0.1",
+ "from": "string-length@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz"
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "from": "stringstream@>=0.0.4 <0.1.0",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz"
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "from": "strip-ansi@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
+ },
+ "strip-json-comments": {
+ "version": "1.0.4",
+ "from": "strip-json-comments@>=1.0.4 <1.1.0",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz"
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "from": "supports-color@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
+ },
+ "symbol-observable": {
+ "version": "1.0.2",
+ "from": "symbol-observable@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.2.tgz"
+ },
+ "through": {
+ "version": "2.3.8",
+ "from": "through@>=2.3.1 <2.4.0",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+ },
+ "timed-out": {
+ "version": "2.0.0",
+ "from": "timed-out@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz"
+ },
+ "to-fast-properties": {
+ "version": "1.0.2",
+ "from": "to-fast-properties@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz"
+ },
+ "touch": {
+ "version": "1.0.0",
+ "from": "touch@1.0.0",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-1.0.0.tgz"
+ },
+ "tough-cookie": {
+ "version": "2.3.1",
+ "from": "tough-cookie@>=2.3.0 <2.4.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.1.tgz"
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "from": "tunnel-agent@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz"
+ },
+ "tweetnacl": {
+ "version": "0.14.3",
+ "from": "tweetnacl@>=0.14.0 <0.15.0",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.3.tgz"
+ },
+ "type-is": {
+ "version": "1.6.13",
+ "from": "type-is@>=1.6.13 <1.7.0",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz"
+ },
+ "ua-parser-js": {
+ "version": "0.7.10",
+ "from": "ua-parser-js@>=0.7.9 <0.8.0",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.10.tgz"
+ },
+ "undefsafe": {
+ "version": "0.0.3",
+ "from": "undefsafe@0.0.3",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz"
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "from": "unpipe@1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
+ },
+ "update-notifier": {
+ "version": "0.5.0",
+ "from": "update-notifier@0.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.5.0.tgz"
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "from": "util-deprecate@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ },
+ "utils-merge": {
+ "version": "1.0.0",
+ "from": "utils-merge@1.0.0",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz"
+ },
+ "uuid": {
+ "version": "2.0.3",
+ "from": "uuid@>=2.0.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz"
+ },
+ "vary": {
+ "version": "1.1.0",
+ "from": "vary@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.0.tgz"
+ },
+ "verror": {
+ "version": "1.3.6",
+ "from": "verror@1.3.6",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz"
+ },
+ "warning": {
+ "version": "2.1.0",
+ "from": "warning@2.1.0",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-2.1.0.tgz"
+ },
+ "whatwg-fetch": {
+ "version": "1.0.0",
+ "from": "whatwg-fetch@>=0.10.0",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-1.0.0.tgz"
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "from": "wrappy@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ },
+ "write-file-atomic": {
+ "version": "1.2.0",
+ "from": "write-file-atomic@>=1.1.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.2.0.tgz"
+ },
+ "xdg-basedir": {
+ "version": "2.0.0",
+ "from": "xdg-basedir@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz"
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "from": "xtend@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
+ }
+ }
+}
diff --git a/package.json b/package.json
index 378a3ea..fdf14ed 100644
--- a/package.json
+++ b/package.json
@@ -4,13 +4,15 @@
"description": "An example web scaffold",
"main": "server.js",
"scripts": {
+ "shrink": "make shrinkwrap",
"cover": "babel-node ./node_modules/.bin/isparta cover _mocha -- --reporter dot",
"lint": "eslint ./src ./test ./build",
"lint:fix": "eslint --fix ./src ./test ./build",
"dev": "gulp dev",
"prod": "gulp prod",
- "start": "gulp",
- "test": "mocha"
+ "start": "node server.js",
+ "test": "mocha",
+ "deploy": "gulp deploy"
},
"repository": {
"type": "git",
@@ -25,13 +27,15 @@
"devDependencies": {
"app-module-path": "^2.0.0",
"autoprefixer": "^6.3.6",
+ "azur": "0.0.1",
"babel-cli": "^6.9.0",
"babel-loader": "^6.2.4",
"babel-plugin-transform-async-to-module-method": "^6.7.0",
"babel-plugin-transform-decorators-legacy": "^1.3.4",
- "babel-polyfill": "^6.7.4",
"babel-preset-es2015": "^6.13.2",
"babel-preset-es2015-node": "^6.1.0",
+ "babel-preset-es2016": "^6.16.0",
+ "babel-preset-es2017": "^6.16.0",
"babel-preset-modern": "^1.1.0",
"babel-preset-react": "^6.5.0",
"babel-preset-stage-0": "^6.5.0",
@@ -41,7 +45,8 @@
"css-loader": "^0.25.0",
"del": "^2.2.2",
"eslint": "^3.6.0",
- "eslint-config-nhardy": "^0.2.0",
+ "eslint-config-nhardy": "^0.2.1",
+ "eslint-plugin-babel": "^3.3.0",
"eslint-plugin-import": "^1.16.0",
"eslint-plugin-jsx-a11y": "^2.2.2",
"eslint-plugin-mocha": "^4.5.1",
@@ -50,6 +55,7 @@
"file-loader": "^0.9.0",
"gulp": "^3.9.1",
"gulp-util": "^3.0.7",
+ "gulp-zip": "^3.2.0",
"isparta": "^4.0.0",
"json-loader": "^0.5.4",
"loader-utils": "^0.2.16",
@@ -69,6 +75,7 @@
"webpack-node-externals": "^1.0.0"
},
"dependencies": {
+ "babel-polyfill": "^6.7.4",
"bluebird": "^3.4.6",
"body-parser": "^1.15.2",
"classnames": "^2.2.5",
diff --git a/server.js b/server.js
old mode 100644
new mode 100755
diff --git a/src/app/actions/classes.js b/src/app/actions/classes.js
index ee3aeb2..f4f2eb3 100644
--- a/src/app/actions/classes.js
+++ b/src/app/actions/classes.js
@@ -9,6 +9,10 @@ export const GET_WORKSHOPS_REQUEST = 'GET_WORKSHOPS_REQUEST';
export const GET_WORKSHOPS_SUCCESS = 'GET_WORKSHOPS_SUCCESS';
export const GET_WORKSHOPS_FAILURE = 'GET_WORKSHOPS_FAILURE';
+export const GET_WORKSHOP_REQUEST = 'GET_WORKSHOP_REQUEST';
+export const GET_WORKSHOP_SUCCESS = 'GET_WORKSHOP_SUCCESS';
+export const GET_WORKSHOP_FAILURE = 'GET_WORKSHOP_FAILURE';
+
export function getWorkshopSets() {
return {
types: [GET_WORKSHOP_SETS_REQUEST, GET_WORKSHOP_SETS_SUCCESS, GET_WORKSHOP_SETS_FAILURE],
@@ -31,3 +35,13 @@ export function getWorkshops(workshopSetId) {
},
};
}
+
+export function getWorkshop(workshopId) {
+ return {
+ types: [GET_WORKSHOP_REQUEST, GET_WORKSHOP_SUCCESS, GET_WORKSHOP_FAILURE],
+ workshopId,
+ endpoint: {
+ url: `${baseUrl()}/workshop/${workshopId}`,
+ },
+ };
+}
diff --git a/src/app/components/WorkshopsList/Workshop/index.js b/src/app/components/WorkshopsList/Workshop/index.js
index 2899db5..4cc2fa6 100644
--- a/src/app/components/WorkshopsList/Workshop/index.js
+++ b/src/app/components/WorkshopsList/Workshop/index.js
@@ -66,7 +66,7 @@ export default class Workshop extends Component {
- {availability ? 'Book this session' : 'Add to waiting list'}
+ {availability ? 'Book this session' : 'Add to waiting list'}
);
diff --git a/src/app/lib/requireLogin.js b/src/app/lib/requireLogin.js
index 55fd1b0..9fcc8b1 100644
--- a/src/app/lib/requireLogin.js
+++ b/src/app/lib/requireLogin.js
@@ -2,8 +2,16 @@ import { ensureData } from 'app/actions/sso';
export default function requireLogin({ dispatch, getState }) {
- // Do nothing on the server
- if (__SERVER__) return (nextState, replace) => {}; // eslint-disable-line no-unused-vars
+ if (__SERVER__) {
+ return (nextState, replace) => {
+ replace({
+ pathname: '/login',
+ query: {
+ redirect: nextState.location.pathname,
+ },
+ });
+ };
+ }
return (nextState, replace, callback) => {
dispatch(ensureData()).then(() => {
diff --git a/src/app/reducers/classes.js b/src/app/reducers/classes.js
index b2444f2..c5bbcae 100644
--- a/src/app/reducers/classes.js
+++ b/src/app/reducers/classes.js
@@ -6,6 +6,9 @@ import {
GET_WORKSHOPS_REQUEST,
GET_WORKSHOPS_SUCCESS,
GET_WORKSHOPS_FAILURE,
+ GET_WORKSHOP_REQUEST,
+ GET_WORKSHOP_SUCCESS,
+ GET_WORKSHOP_FAILURE,
} from 'app/actions/classes';
@@ -16,6 +19,7 @@ const initialState = {
items: [],
},
workshops: {},
+ workshop: {},
};
export default function classesReducer(state = initialState, action = {}) {
@@ -93,6 +97,50 @@ export default function classesReducer(state = initialState, action = {}) {
},
};
+ case GET_WORKSHOP_REQUEST:
+ return {
+ ...state,
+ workshops: {
+ ...state.workshops,
+ [action.workshopId]: {
+ ...state.workshops[action.workshopId],
+ loading: true,
+ },
+ },
+ };
+
+ case GET_WORKSHOP_SUCCESS:
+ return {
+ ...state,
+ workshops: {
+ ...state.workshops,
+ [action.workshopId]: {
+ ...state.workshops[action.workshopId],
+ loading: false,
+ loaded: true,
+ // TODO: Check if this actually returns an array
+ items: action.response.Results.map(camelCaseObject)
+ .map(({ workshopId, ...props }) => ({
+ id: workshopId,
+ ...props,
+ })),
+ },
+ },
+ };
+
+ case GET_WORKSHOP_FAILURE:
+ return {
+ ...state,
+ workshops: {
+ ...state.workshops,
+ [action.workshopId]: {
+ ...state.workshops[action.workshopId],
+ loading: false,
+ error: action.error,
+ },
+ },
+ };
+
default:
return state;
}
diff --git a/src/app/reducers/sso.js b/src/app/reducers/sso.js
index 7d2e770..61b2c81 100644
--- a/src/app/reducers/sso.js
+++ b/src/app/reducers/sso.js
@@ -46,7 +46,6 @@ export default function ssoReducer(state = initialState, action = {}) {
return {
...state,
token: action.token,
- loaded: true,
};
case SSO_RETRIEVE_REQUEST:
@@ -58,6 +57,7 @@ export default function ssoReducer(state = initialState, action = {}) {
return {
...state,
user: action.response,
+ loaded: true,
error: null,
};
@@ -66,6 +66,7 @@ export default function ssoReducer(state = initialState, action = {}) {
...state,
token: null,
user: null,
+ loaded: true,
error: true,
};
diff --git a/src/app/routes.js b/src/app/routes.js
index 0fc3c80..2344ea1 100644
--- a/src/app/routes.js
+++ b/src/app/routes.js
@@ -1,11 +1,12 @@
import React from 'react';
-import { Route, IndexRoute } from 'react-router';
+import { Redirect, Route, IndexRoute } from 'react-router';
import { clearRouteError } from 'app/actions/routeError';
import requireLogin from 'app/lib/requireLogin';
import App from 'app/components/App';
import CategoriesView from 'app/views/Categories';
import WorkshopsView from 'app/views/Workshops';
+import BookView from 'app/views/Book';
import FaqView from 'app/views/Faq';
import LoginView from 'app/views/Login';
import SettingsView from 'app/views/Settings';
@@ -19,10 +20,12 @@ export default function getRoutes(store) {
return (
+
+
diff --git a/src/app/views/Book/index.js b/src/app/views/Book/index.js
new file mode 100644
index 0000000..26ff582
--- /dev/null
+++ b/src/app/views/Book/index.js
@@ -0,0 +1,50 @@
+import React, { Component } from 'react';
+import { connect } from 'react-redux';
+import { asyncConnect } from 'redux-connect';
+import Helmet from 'react-helmet';
+
+import { setRouteError } from 'app/actions/routeError';
+import { getWorkshop } from 'app/actions/classes';
+import * as appPropTypes from 'app/components/propTypes';
+import DefaultLayout from 'app/layouts/Default';
+import Form from 'app/components/Form';
+
+
+@asyncConnect([
+ {
+ promise: async ({ store: { dispatch, getState }, params: { workshopId } }) => {
+ const workshop = () => getState().classes.workshop[workshopId] || {};
+
+ if (!workshop().loaded) await dispatch(getWorkshop(workshopId));
+
+ // TODO: Better errors for this call
+ if (!workshop().loaded) {
+ dispatch(setRouteError({ status: 404 }));
+ return;
+ }
+ },
+ },
+])
+@connect((state, { params: { workshopId } }) => ({
+ workshop: state.classes.workshop[workshopId],
+}))
+export default class LoginView extends Component {
+ static propTypes = {
+ workshop: appPropTypes.workshop,
+ };
+
+ submit = () => {};
+
+ render() {
+ return (
+
+
+
+
+ );
+ }
+}
diff --git a/src/app/views/Categories/index.js b/src/app/views/Categories/index.js
index 94ddb36..9939e2b 100644
--- a/src/app/views/Categories/index.js
+++ b/src/app/views/Categories/index.js
@@ -15,9 +15,7 @@ import CategoriesList from 'app/components/CategoriesList';
promise: async ({ store: { dispatch, getState } }) => {
const loaded = () => getState().classes.workshopSets.loaded;
- if (!loaded()) {
- await dispatch(getWorkshopSets());
- }
+ if (!loaded()) await dispatch(getWorkshopSets());
if (!loaded()) dispatch(setRouteError());
},
diff --git a/src/app/views/Login/index.js b/src/app/views/Login/index.js
index 0b97519..7c5b5d2 100644
--- a/src/app/views/Login/index.js
+++ b/src/app/views/Login/index.js
@@ -1,7 +1,11 @@
import querystring from 'querystring';
-import React, { Component } from 'react';
+import React, { Component, PropTypes } from 'react';
+import { connect } from 'react-redux';
+import { withRouter } from 'react-router';
+import { routerShape } from 'react-router/lib/PropTypes';
import Helmet from 'react-helmet';
+import { get } from 'lodash-es';
import config from 'app/config';
import * as appPropTypes from 'app/components/propTypes';
@@ -9,30 +13,57 @@ import DefaultLayout from 'app/layouts/Default';
import Form from 'app/components/Form';
-export default class LoginView extends Component { // eslint-disable-line react/prefer-stateless-function
+@connect(state => ({
+ loaded: state.sso.loaded,
+ user: state.sso.user,
+}))
+@withRouter
+export default class LoginView extends Component {
+ static propTypes = {
+ loaded: PropTypes.bool,
+ user: appPropTypes.user,
+ router: routerShape,
+ };
+
static contextTypes = {
location: appPropTypes.location,
};
+ state = {};
+
+ componentWillReceiveProps(nextProps) {
+ if (!nextProps.user) return;
+ this.props.router.replace(this.getRedirect());
+ this.setState({ willRedirect: true });
+ }
+
+ getRedirect = () => {
+ return get(this.context.location, 'query.redirect', '/');
+ };
+
render() {
+ const { loaded } = this.props;
+ const { willRedirect } = this.state;
const loginParams = {
client: config.sso.client,
- redirect: this.context.location.query.redirect,
+ redirect: this.getRedirect(),
};
const loginUrl = `/api/sso/login?${querystring.stringify(loginParams)}`;
return (
-
+ {loaded && !willRedirect && (
+
+ )}
);
}
diff --git a/src/app/views/Workshops/index.js b/src/app/views/Workshops/index.js
index dcd397c..f07d97b 100644
--- a/src/app/views/Workshops/index.js
+++ b/src/app/views/Workshops/index.js
@@ -19,9 +19,7 @@ import styles from './styles.styl';
{
promise: async ({ store: { dispatch, getState }, params: { workshopSetId } }) => {
const workshopSets = () => getState().classes.workshopSets;
- if (!workshopSets().loaded) {
- await dispatch(getWorkshopSets());
- }
+ if (!workshopSets().loaded) await dispatch(getWorkshopSets());
if (!workshopSets().loaded) {
dispatch(setRouteError());
diff --git a/src/server/index.js b/src/server/index.js
index eb55c62..53e0503 100644
--- a/src/server/index.js
+++ b/src/server/index.js
@@ -30,4 +30,7 @@ app.get('/callback', callbackHandler);
app.use(mainMiddleware);
app.use(errorMiddleware);
-app.listen(config.port + (__DEVELOPMENT__ ? 1 : 0));
+let port = config.port;
+if (__DEVELOPMENT__) port += 1;
+
+app.listen(port);