diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
index 80ee8e0ec8..ae9c9709f5 100644
--- a/npm-shrinkwrap.json
+++ b/npm-shrinkwrap.json
@@ -4208,700 +4208,6 @@
"from": "fs.realpath@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
},
- "fsevents": {
- "version": "1.1.1",
- "from": "fsevents@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.1.tgz",
- "optional": true,
- "dependencies": {
- "abbrev": {
- "version": "1.1.0",
- "from": "abbrev@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz",
- "optional": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "from": "ansi-regex@>=2.0.0 <3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.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",
- "optional": true
- },
- "aproba": {
- "version": "1.1.1",
- "from": "aproba@>=1.0.3 <2.0.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz",
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.2",
- "from": "are-we-there-yet@>=1.1.2 <1.2.0",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz",
- "optional": true
- },
- "asn1": {
- "version": "0.2.3",
- "from": "asn1@>=0.2.3 <0.3.0",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
- "optional": true
- },
- "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",
- "optional": true
- },
- "asynckit": {
- "version": "0.4.0",
- "from": "asynckit@>=0.4.0 <0.5.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "optional": true
- },
- "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",
- "optional": true
- },
- "aws4": {
- "version": "1.6.0",
- "from": "aws4@>=1.2.1 <2.0.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
- "optional": true
- },
- "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.1",
- "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
- "optional": true
- },
- "block-stream": {
- "version": "0.0.9",
- "from": "block-stream@*",
- "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.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"
- },
- "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"
- },
- "caseless": {
- "version": "0.11.0",
- "from": "caseless@>=0.11.0 <0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
- "optional": true
- },
- "chalk": {
- "version": "1.1.3",
- "from": "chalk@>=1.1.1 <2.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "from": "code-point-at@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.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",
- "optional": true
- },
- "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"
- },
- "console-control-strings": {
- "version": "1.1.0",
- "from": "console-control-strings@>=1.1.0 <1.2.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.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",
- "optional": true
- },
- "dashdash": {
- "version": "1.14.1",
- "from": "dashdash@>=1.12.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "optional": true,
- "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",
- "optional": true
- }
- }
- },
- "debug": {
- "version": "2.2.0",
- "from": "debug@>=2.2.0 <2.3.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
- "optional": true
- },
- "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",
- "optional": true
- },
- "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"
- },
- "delegates": {
- "version": "1.0.0",
- "from": "delegates@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "optional": true
- },
- "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",
- "optional": true
- },
- "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",
- "optional": true
- },
- "extend": {
- "version": "3.0.0",
- "from": "extend@>=3.0.0 <3.1.0",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz",
- "optional": true
- },
- "extsprintf": {
- "version": "1.0.2",
- "from": "extsprintf@1.0.2",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.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",
- "optional": true
- },
- "form-data": {
- "version": "2.1.2",
- "from": "form-data@>=2.1.1 <2.2.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz",
- "optional": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "from": "fs.realpath@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
- },
- "fstream": {
- "version": "1.0.10",
- "from": "fstream@>=1.0.2 <2.0.0",
- "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz"
- },
- "fstream-ignore": {
- "version": "1.0.5",
- "from": "fstream-ignore@>=1.0.5 <1.1.0",
- "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz",
- "optional": true
- },
- "gauge": {
- "version": "2.7.3",
- "from": "gauge@>=2.7.1 <2.8.0",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.3.tgz",
- "optional": true
- },
- "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",
- "optional": true
- },
- "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",
- "optional": true
- },
- "getpass": {
- "version": "0.1.6",
- "from": "getpass@>=0.1.1 <0.2.0",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz",
- "optional": true,
- "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",
- "optional": true
- }
- }
- },
- "glob": {
- "version": "7.1.1",
- "from": "glob@>=7.0.5 <8.0.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz"
- },
- "graceful-fs": {
- "version": "4.1.11",
- "from": "graceful-fs@>=4.1.2 <5.0.0",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.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",
- "optional": true
- },
- "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",
- "optional": true
- },
- "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",
- "optional": true
- },
- "has-unicode": {
- "version": "2.0.1",
- "from": "has-unicode@>=2.0.0 <3.0.0",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "optional": true
- },
- "hawk": {
- "version": "3.1.3",
- "from": "hawk@>=3.1.3 <3.2.0",
- "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
- "optional": true
- },
- "hoek": {
- "version": "2.16.3",
- "from": "hoek@>=2.0.0 <3.0.0",
- "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.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",
- "optional": true
- },
- "inflight": {
- "version": "1.0.6",
- "from": "inflight@>=1.0.4 <2.0.0",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
- },
- "inherits": {
- "version": "2.0.3",
- "from": "inherits@>=2.0.1 <2.1.0",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.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",
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.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",
- "optional": true
- },
- "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",
- "optional": true
- },
- "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",
- "optional": true
- },
- "isarray": {
- "version": "1.0.0",
- "from": "isarray@>=1.0.0 <1.1.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.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",
- "optional": true
- },
- "jodid25519": {
- "version": "1.0.2",
- "from": "jodid25519@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
- "optional": true
- },
- "jsbn": {
- "version": "0.1.1",
- "from": "jsbn@>=0.1.0 <0.2.0",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "optional": true
- },
- "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",
- "optional": true
- },
- "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",
- "optional": true
- },
- "jsonpointer": {
- "version": "4.0.1",
- "from": "jsonpointer@>=4.0.0 <5.0.0",
- "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
- "optional": true
- },
- "jsprim": {
- "version": "1.3.1",
- "from": "jsprim@>=1.2.2 <2.0.0",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz",
- "optional": true
- },
- "mime-db": {
- "version": "1.26.0",
- "from": "mime-db@>=1.26.0 <1.27.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz"
- },
- "mime-types": {
- "version": "2.1.14",
- "from": "mime-types@>=2.1.7 <2.2.0",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz"
- },
- "minimatch": {
- "version": "3.0.3",
- "from": "minimatch@>=3.0.2 <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.1 <0.6.0",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz"
- },
- "ms": {
- "version": "0.7.1",
- "from": "ms@0.7.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
- "optional": true
- },
- "node-pre-gyp": {
- "version": "0.6.33",
- "from": "node-pre-gyp@>=0.6.29 <0.7.0",
- "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz",
- "optional": true
- },
- "nopt": {
- "version": "3.0.6",
- "from": "nopt@>=3.0.6 <3.1.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "optional": true
- },
- "npmlog": {
- "version": "4.0.2",
- "from": "npmlog@>=4.0.1 <5.0.0",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz",
- "optional": true
- },
- "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",
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "from": "object-assign@>=4.1.0 <5.0.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "from": "once@>=1.3.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.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"
- },
- "pinkie": {
- "version": "2.0.4",
- "from": "pinkie@>=2.0.0 <3.0.0",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "optional": true
- },
- "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",
- "optional": true
- },
- "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"
- },
- "punycode": {
- "version": "1.4.1",
- "from": "punycode@>=1.4.1 <2.0.0",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "optional": true
- },
- "qs": {
- "version": "6.3.1",
- "from": "qs@>=6.3.0 <6.4.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.1.tgz",
- "optional": true
- },
- "rc": {
- "version": "1.1.7",
- "from": "rc@>=1.1.6 <1.2.0",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz",
- "optional": true,
- "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",
- "optional": true
- }
- }
- },
- "readable-stream": {
- "version": "2.2.2",
- "from": "readable-stream@>=2.0.0 <3.0.0||>=1.1.13 <2.0.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz",
- "optional": true
- },
- "request": {
- "version": "2.79.0",
- "from": "request@>=2.79.0 <3.0.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
- "optional": true
- },
- "rimraf": {
- "version": "2.5.4",
- "from": "rimraf@>=2.5.4 <2.6.0",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz"
- },
- "semver": {
- "version": "5.3.0",
- "from": "semver@>=5.3.0 <5.4.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "from": "set-blocking@>=2.0.0 <2.1.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "from": "signal-exit@>=3.0.0 <4.0.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "optional": true
- },
- "sntp": {
- "version": "1.0.9",
- "from": "sntp@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
- "optional": true
- },
- "sshpk": {
- "version": "1.10.2",
- "from": "sshpk@>=1.7.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.2.tgz",
- "optional": true,
- "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",
- "optional": true
- }
- }
- },
- "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-width": {
- "version": "1.0.2",
- "from": "string-width@>=1.0.1 <2.0.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.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",
- "optional": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "from": "strip-ansi@>=3.0.1 <4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "from": "strip-json-comments@>=2.0.1 <2.1.0",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "optional": true
- },
- "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",
- "optional": true
- },
- "tar": {
- "version": "2.2.1",
- "from": "tar@>=2.2.1 <2.3.0",
- "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz"
- },
- "tar-pack": {
- "version": "3.3.0",
- "from": "tar-pack@>=3.3.0 <3.4.0",
- "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.3.0.tgz",
- "optional": true,
- "dependencies": {
- "once": {
- "version": "1.3.3",
- "from": "once@>=1.3.3 <1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
- "optional": true
- },
- "readable-stream": {
- "version": "2.1.5",
- "from": "readable-stream@>=2.1.4 <2.2.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz",
- "optional": true
- }
- }
- },
- "tough-cookie": {
- "version": "2.3.2",
- "from": "tough-cookie@>=2.3.0 <2.4.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
- "optional": true
- },
- "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",
- "optional": true
- },
- "tweetnacl": {
- "version": "0.14.5",
- "from": "tweetnacl@>=0.14.0 <0.15.0",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "optional": true
- },
- "uid-number": {
- "version": "0.0.6",
- "from": "uid-number@>=0.0.6 <0.1.0",
- "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz",
- "optional": true
- },
- "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"
- },
- "uuid": {
- "version": "3.0.1",
- "from": "uuid@>=3.0.0 <4.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz",
- "optional": true
- },
- "verror": {
- "version": "1.3.6",
- "from": "verror@1.3.6",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz",
- "optional": true
- },
- "wide-align": {
- "version": "1.1.0",
- "from": "wide-align@>=1.1.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz",
- "optional": true
- },
- "wrappy": {
- "version": "1.0.2",
- "from": "wrappy@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.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",
- "optional": true
- }
- }
- },
"fstream": {
"version": "1.0.11",
"from": "fstream@>=1.0.2 <2.0.0",
@@ -6128,6 +5434,11 @@
"from": "he@>=1.1.0 <1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz"
},
+ "hellojs": {
+ "version": "1.15.1",
+ "from": "hellojs@>=1.15.1 <2.0.0",
+ "resolved": "http://registry.npmjs.org/hellojs/-/hellojs-1.15.1.tgz"
+ },
"hmac-drbg": {
"version": "1.0.1",
"from": "hmac-drbg@>=1.0.0 <2.0.0",
@@ -7717,7 +7028,7 @@
"lazy-debug-legacy": {
"version": "0.0.1",
"from": "lazy-debug-legacy@>=0.0.0 <0.1.0",
- "resolved": "http://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz"
+ "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz"
},
"lazy-req": {
"version": "1.1.0",
diff --git a/package.json b/package.json
index d717c13f75..12cbb1c8a0 100644
--- a/package.json
+++ b/package.json
@@ -69,6 +69,7 @@
"gulp-uglify": "^1.4.2",
"gulp.spritesmith": "^4.1.0",
"habitica-markdown": "^1.3.0",
+ "hellojs": "^1.15.1",
"html-webpack-plugin": "^2.8.1",
"image-size": "~0.3.2",
"in-app-purchase": "^1.1.6",
diff --git a/website/client/app.vue b/website/client/app.vue
index 7697892f88..6f05b18552 100644
--- a/website/client/app.vue
+++ b/website/client/app.vue
@@ -2,15 +2,18 @@
#app
- app-menu
- .container-fluid
+ app-menu(v-if="userLoggedIn")
+ .container-fluid(v-if="userLoggedIn")
app-header
router-view
+
+ router-view(v-if="!userLoggedIn")
-
\ No newline at end of file
+
diff --git a/website/client/assets/images/auth/midground_foreground_extended.png b/website/client/assets/images/auth/midground_foreground_extended.png
new file mode 100644
index 0000000000..e030b8a61b
Binary files /dev/null and b/website/client/assets/images/auth/midground_foreground_extended.png differ
diff --git a/website/client/assets/images/auth/midground_foreground_extended2.png b/website/client/assets/images/auth/midground_foreground_extended2.png
new file mode 100644
index 0000000000..5976cd9681
Binary files /dev/null and b/website/client/assets/images/auth/midground_foreground_extended2.png differ
diff --git a/website/client/assets/images/auth/repeatinghill_leftslope.png b/website/client/assets/images/auth/repeatinghill_leftslope.png
new file mode 100644
index 0000000000..952123e055
Binary files /dev/null and b/website/client/assets/images/auth/repeatinghill_leftslope.png differ
diff --git a/website/client/assets/images/auth/repeatinghill_rightslope.png b/website/client/assets/images/auth/repeatinghill_rightslope.png
new file mode 100644
index 0000000000..cf7bbecc12
Binary files /dev/null and b/website/client/assets/images/auth/repeatinghill_rightslope.png differ
diff --git a/website/client/assets/images/auth/seamless_mountains_demo.png b/website/client/assets/images/auth/seamless_mountains_demo.png
new file mode 100644
index 0000000000..c9c2f4e9b7
Binary files /dev/null and b/website/client/assets/images/auth/seamless_mountains_demo.png differ
diff --git a/website/client/assets/images/auth/seamless_stars_varied_opacity.png b/website/client/assets/images/auth/seamless_stars_varied_opacity.png
new file mode 100644
index 0000000000..0abababa1b
Binary files /dev/null and b/website/client/assets/images/auth/seamless_stars_varied_opacity.png differ
diff --git a/website/client/assets/svg/google.svg b/website/client/assets/svg/google.svg
new file mode 100644
index 0000000000..6fdd374c1b
--- /dev/null
+++ b/website/client/assets/svg/google.svg
@@ -0,0 +1,8 @@
+
diff --git a/website/client/assets/svg/gryphon.svg b/website/client/assets/svg/gryphon.svg
new file mode 100644
index 0000000000..fdff439489
--- /dev/null
+++ b/website/client/assets/svg/gryphon.svg
@@ -0,0 +1,3 @@
+
diff --git a/website/client/assets/svg/habitica-logo.svg b/website/client/assets/svg/habitica-logo.svg
new file mode 100644
index 0000000000..e23bdf1981
--- /dev/null
+++ b/website/client/assets/svg/habitica-logo.svg
@@ -0,0 +1,7 @@
+
diff --git a/website/client/components/appMenu.vue b/website/client/components/appMenu.vue
index b48fbde378..8c2f92b2d5 100644
--- a/website/client/components/appMenu.vue
+++ b/website/client/components/appMenu.vue
@@ -48,147 +48,147 @@ nav.navbar.navbar-inverse.fixed-top.navbar-toggleable-sm
router-link.dropdown-item(:to="{name: 'stats'}") {{ $t('stats') }}
router-link.dropdown-item(:to="{name: 'achievements'}") {{ $t('achievements') }}
router-link.dropdown-item(:to="{name: 'settings'}") {{ $t('settings') }}
- router-link.dropdown-item(to="/logout") {{ $t('logout') }}
+ a.nav-link.dropdown-item(to="/", @click.prevent='logout()') {{ $t('logout') }}
diff --git a/website/client/components/auth/registerLogin.vue b/website/client/components/auth/registerLogin.vue
new file mode 100644
index 0000000000..7be5b3e007
--- /dev/null
+++ b/website/client/components/auth/registerLogin.vue
@@ -0,0 +1,230 @@
+
+.form-wrapper
+ #top-background
+ .seamless_stars_varied_opacity_repeat
+
+ #login-form
+ .text-center
+ div
+ .svg-icon.gryphon(v-html="icons.gryphon")
+ div
+ .svg-icon.habitica-logo(v-html="icons.habiticaIcon")
+ .form-group.row.text-center
+ .col-6
+ .btn.btn-secondary.social-button(@click='socialAuth("facebook")', v-once)
+ .svg-icon.social-icon(v-html="icons.facebookIcon")
+ | {{this.registering ? $t('signUpWithSocial', {social: 'Facebook'}) : $t('loginWithSocial', {social: 'Facebook'})}}
+ .col-6
+ .btn.btn-secondary.social-button(@click='socialAuth("google")', v-once)
+ .svg-icon.social-icon(v-html="icons.googleIcon")
+ | {{this.registering ? $t('signUpWithSocial', {social: 'Google'}) : $t('loginWithSocial', {social: 'Google'})}}
+ .form-group
+ label(for='usernameInput', v-once) {{$t('username')}}
+ input#usernameInput.form-control(type='text', :placeholder='$t("usernamePlaceholder")', v-model='username')
+ .form-group(v-if='registering')
+ label(for='emailInput', v-once) {{$t('email')}}
+ input#emailInput.form-control(type='email', :placeholder='$t("emailPlaceholder")', v-model='email')
+ .form-group
+ label(for='passwordInput', v-once) {{$t('password')}}
+ input#passwordInput.form-control(type='password', :placeholder='$t("passwordPlaceholder")', v-model='password')
+ .form-group(v-if='registering')
+ label(for='confirmPasswordInput', v-once) {{$t('confirmPassword')}}
+ input#confirmPasswordInput.form-control(type='password', :placeholder='$t("confirmPasswordPlaceholder")', v-model='passwordConfirm')
+ small.form-text(v-once) {{$t('termsAndAgreement')}}
+ .text-center
+ .btn.btn-info(@click='register()', v-if='registering', v-once) {{$t('joinHabitica')}}
+ .btn.btn-info(@click='login()', v-if='!registering', v-once) {{$t('login')}}
+
+ #bottom-background
+ .seamless_mountains_demo_repeat
+ .midground_foreground_extended2
+
+
+
+
+
diff --git a/website/client/components/static/home.vue b/website/client/components/static/home.vue
new file mode 100644
index 0000000000..eef1253435
--- /dev/null
+++ b/website/client/components/static/home.vue
@@ -0,0 +1,30 @@
+
+nav
+ a(href='/login') Login
+ a(href='/register') Register
+
+
+
+
diff --git a/website/client/main.js b/website/client/main.js
index dd8809fa1b..3e69523450 100644
--- a/website/client/main.js
+++ b/website/client/main.js
@@ -36,33 +36,8 @@ if (authSettings) {
}
export default new Vue({
+ el: '#app',
router,
store: generateStore(),
render: h => h(AppComponent),
- beforeCreate () {
- // Setup listener for title
- this.$store.watch(state => state.title, (title) => {
- document.title = title;
- });
-
- // Mount the app when user and tasks are loaded
- const userDataWatcher = this.$store.watch(state => [state.user.data, state.tasks.data], ([user, tasks]) => {
- if (user && user._id && tasks && Array.isArray(tasks.habits)) {
- userDataWatcher(); // remove the watcher
- this.$mount('#app');
- }
- });
-
- // Load the user and the user tasks
- Promise.all([
- this.$store.dispatch('user:fetch'),
- this.$store.dispatch('tasks:fetchUserTasks'),
- ]).catch((err) => {
- console.error('Impossible to fetch user. Copy into localStorage a valid habit-mobile-settings object.', err); // eslint-disable-line no-console
- });
- },
- mounted () { // Remove the loading screen when the app is mounted
- let loadingScreen = document.getElementById('loading-screen');
- if (loadingScreen) document.body.removeChild(loadingScreen);
- },
-});
\ No newline at end of file
+});
diff --git a/website/client/router.js b/website/client/router.js
index 93f9a7364e..52e1d70a25 100644
--- a/website/client/router.js
+++ b/website/client/router.js
@@ -7,6 +7,9 @@ import EmptyView from './components/emptyView';
import ParentPage from './components/parentPage';
import Page from './components/page';
+// Static Pages
+const Home = () => import(/* webpackChunkName: "static" */'./components/static/home');
+const RegisterLogin = () => import(/* webpackChunkName: "auth" */'./components/auth/registerLogin');
// All the main level
// components are loaded in separate webpack chunks.
@@ -45,6 +48,9 @@ export default new VueRouter({
return { x: 0, y: 0 };
},
routes: [
+ { name: 'home', path: '/home', component: Home },
+ { name: 'register', path: '/register', component: RegisterLogin },
+ { name: 'login', path: '/login', component: RegisterLogin },
{ name: 'tasks', path: '/', component: UserTasks },
{
path: '/inventory',
diff --git a/website/client/store/actions/auth.js b/website/client/store/actions/auth.js
new file mode 100644
index 0000000000..31a05020de
--- /dev/null
+++ b/website/client/store/actions/auth.js
@@ -0,0 +1,83 @@
+import axios from 'axios';
+
+export async function register (store, params) {
+ let url = '/api/v3/user/auth/local/register';
+ let result = await axios.post(url, {
+ username: params.username,
+ email: params.email,
+ password: params.password,
+ confirmPassword: params.passwordConfirm,
+ });
+
+ let user = result.data.data;
+
+ let userLocalData = JSON.stringify({
+ auth: {
+ apiId: user._id,
+ apiToken: user.apiToken,
+ },
+ });
+ localStorage.setItem('habit-mobile-settings', userLocalData);
+
+ // @TODO: I think we just need analytics here
+ // Auth.runAuth(res.data._id, res.data.apiToken);
+ // Analytics.register();
+ // $scope.registrationInProgress = false;
+ // Alert.authErrorAlert(data, status, headers, config)
+ // Analytics.login();
+ // Analytics.updateUser();
+
+ store.state.user.data = user;
+}
+
+export async function login (store, params) {
+ let url = '/api/v3/user/auth/local/login';
+ let result = await axios.post(url, {
+ username: params.username,
+ // email: params.email,
+ password: params.password,
+ });
+
+ let user = result.data.data;
+
+ let userLocalData = JSON.stringify({
+ auth: {
+ apiId: user.id,
+ apiToken: user.apiToken,
+ },
+ });
+
+ localStorage.setItem('habit-mobile-settings', userLocalData);
+
+ // @TODO: I think we just need analytics here
+ // Auth.runAuth(res.data._id, res.data.apiToken);
+ // Analytics.register();
+ // $scope.registrationInProgress = false;
+ // Alert.authErrorAlert(data, status, headers, config)
+ // Analytics.login();
+ // Analytics.updateUser();
+
+ // @TODO: Update the api to return the user?
+ // store.state.user.data = user;
+}
+
+export async function socialAuth (store, params) {
+ let url = '/api/v3/user/auth/social';
+ let result = await axios.post(url, {
+ network: params.auth.network,
+ authResponse: params.auth.authResponse,
+ });
+
+ // @TODO: Analytics
+
+ let user = result.data.data;
+
+ let userLocalData = JSON.stringify({
+ auth: {
+ apiId: user.id,
+ apiToken: user.apiToken,
+ },
+ });
+
+ localStorage.setItem('habit-mobile-settings', userLocalData);
+}
diff --git a/website/client/store/actions/index.js b/website/client/store/actions/index.js
index d86a04db6c..b47a7540e6 100644
--- a/website/client/store/actions/index.js
+++ b/website/client/store/actions/index.js
@@ -6,6 +6,7 @@ import * as tasks from './tasks';
import * as guilds from './guilds';
import * as party from './party';
import * as members from './members';
+import * as auth from './auth';
import * as quests from './quests';
// Actions should be named as 'actionName' and can be accessed as 'namespace:actionName'
@@ -18,6 +19,7 @@ const actions = flattenAndNamespace({
guilds,
party,
members,
+ auth,
quests,
});
diff --git a/website/common/locales/en/newClient.json b/website/common/locales/en/newClient.json
index 7605789369..35fe7fbb17 100644
--- a/website/common/locales/en/newClient.json
+++ b/website/common/locales/en/newClient.json
@@ -112,6 +112,15 @@
"guildInformationPlaceHolder": "This is our party’s description. It describes what we do in this party. If you want to learn more about what we do in this party, read the description. Party on.",
"updateParty": "Update Party",
"upgrade": "Upgrade",
+ "signUpWithSocial": "Sign up with <%= social %>",
+ "loginWithSocial": "Login with <%= social %>",
+ "confirmPassword": "Confirm Password",
+ "usernamePlaceholder": "e.g., HabitRabbit",
+ "emailPlaceholder": "e.g., rabbit@habitica.com",
+ "passwordPlaceholder": "e.g., •••••••••••• ",
+ "confirmPasswordPlaceholder": "Make sure it’s the same password!",
+ "termsAndAgreement": "By clicking the button below, you are indicating that you have read and agree to the Terms of Service and Privacy Policy.",
+ "joinHabitica": "Join Habitica",
"showAllAnimals": "Show All <%= color %> <%= type %>",
"showLessAnimals": "Show Less <%= color %> <%= type %>",
"quickInventory": "Quick Inventory",