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 ( + + +
+

Book

+ + +
+
+ ); + } +} 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 ( -
-

Login

- - - - - Forgot password? - -
+ {loaded && !willRedirect && ( +
+

Login

+ + + + + Forgot password? + +
+ )}
); } 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);