From: Artem Motchanyi Date: Fri, 23 Feb 2018 14:34:56 +0000 (+0200) Subject: [SECARSP-110][SECARSP-112] Registration/login/logout components are implemented X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d96e11c84bfe7ff023f5a5f86b2ecccf18eb7e46;p=platform%2Fcore%2Fsecurity%2Fsuspicious-activity-monitor.git [SECARSP-110][SECARSP-112] Registration/login/logout components are implemented Change-Id: Ie365cde2c18bb55fd5ee19abc24424c5037ba90f --- diff --git a/dashboard/bs-config.json b/dashboard/bs-config.json new file mode 100644 index 0000000..c2048fb --- /dev/null +++ b/dashboard/bs-config.json @@ -0,0 +1,6 @@ +{ + "port": 8080, + "server": { + "baseDir": "./dist" + } +} diff --git a/dashboard/config.ts b/dashboard/config.ts new file mode 100644 index 0000000..e053f0e --- /dev/null +++ b/dashboard/config.ts @@ -0,0 +1,2 @@ +export const SERVER_URL = 'http://106.125.46.74:11000/dashboard'; +export const AUTH_PROVIDER = 'email'; diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index a6d6657..cc185ab 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -47,9 +47,9 @@ } }, "@angular/animations": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.1.3.tgz", - "integrity": "sha512-DlcANlrQ2aaspCZZ6yHdEx1PaLKT1q3/xkdTgoKNTJfj9eautcrEuar8NoH0dkzXuQT0i9GewK6+zsF581rpdQ==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.6.tgz", + "integrity": "sha512-LMfg1NYTPPu+mEweOcwWEHM7Aaw7OnzjGE7UeUGYHd4ujQlOc8f6u4Z0X4Wfo4vIpHIz8ClNKbSuQ8+5S4Ofsg==", "requires": { "tslib": "1.8.1" } @@ -121,83 +121,83 @@ } }, "@angular/common": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.1.3.tgz", - "integrity": "sha512-n0bzjfOVZH7+FPHQ3nnE3aAgMWebz4afO/Wh01LZNfVgcjdBxHblAYcMaoJeR7zW7f1zm51P6aDa4XlVtsVupQ==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.6.tgz", + "integrity": "sha512-gJrUKW9rDeVGP0pBNGDEEP/U+vBtgIVd1+52X5mc+dNFuUQdQ2kNTK5+fbDfwVstEWE86gloHlG2GS2Ga94R3Q==", "requires": { "tslib": "1.8.1" } }, "@angular/compiler": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.1.3.tgz", - "integrity": "sha512-YQyL52+CtduFqyodv3m+s8qNDRbmEyEv/ZZHEWNKxKFr7RQ5n7+pbjdincwGf2c2mBw4EqWLgyCdd9SFmjJd0w==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.6.tgz", + "integrity": "sha512-RVIIIbCmJwkfmL1jYmwTV2ve5k2JaNqVXKg8eT/wWiaCeqqZOydbIdcBUfgRxqn4ABZYgaeDNmjrsMl6acKv0A==", "requires": { "tslib": "1.8.1" } }, "@angular/compiler-cli": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.1.3.tgz", - "integrity": "sha512-5pmVgFch67qYxl04PitagfUgiw0k7Ak1Cvj5LY2gs0961SHo8qLRA2/4xUKAxv4rFy+fx2Qr9KD99YB+wbsb3A==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.6.tgz", + "integrity": "sha512-HKA6AvM6LZVkNFEDoQ9cRzPkiUpLIuJ+ndACg8cXkEDV30FetBiNC2p8viB14fdSzcuTnU+MULODhW/Tk3OAqA==", "dev": true, "requires": { "chokidar": "1.7.0", "minimist": "1.2.0", - "reflect-metadata": "0.1.10", - "tsickle": "0.25.6" + "reflect-metadata": "0.1.12", + "tsickle": "0.27.2" } }, "@angular/core": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.1.3.tgz", - "integrity": "sha512-lGlILYCumA5s8Pf+egDW6kjlrEQwnpUG2fBQ4SNRChzzRoTWeJ1XPCrEI9YyFvC8qUsYcDIZwHWBXQQqhdEvmQ==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.6.tgz", + "integrity": "sha512-BOkF7RM4VcqfIlQeOz17FucfocUmyZBsGIWxVSggeCBz2pQDyOUJ1IqrDh5c4yldW9G4Gjhhn/AkPykvPevI3w==", "requires": { "tslib": "1.8.1" } }, "@angular/forms": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.1.3.tgz", - "integrity": "sha512-DTUg7agXPjvacWHojl0vXuvyJ0Ik9I0D23KKWyzHZHlxXb4vfN7KYP9qIOMwadLLIog8MEu4a6EGgKAoPsZ/Ng==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.6.tgz", + "integrity": "sha512-Zo0uADD9nx6esfRx7oLLqw4uiA4zjvBh+MVeJj6ZfL7TYOJzLYyawt4qsvJFQ02tweldjs/duWaaf4tLHf6L0g==", "requires": { "tslib": "1.8.1" } }, "@angular/http": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.1.3.tgz", - "integrity": "sha512-Ptnu15yjYnvKucLBRKrJqneFMkQYjfwDFgVASLb+YJhRzNFBnqcK8JdfilhP7f0WESANDcwtC/YoaShpiyugNA==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.6.tgz", + "integrity": "sha512-8ecA0HrDY88vO9YKl6aG82budd0+vwFoECmZ9xRCiNu+HqlgJ7siyLzwdjllmoi90pJbvhQITytfy2zEmDBNIA==", "requires": { "tslib": "1.8.1" } }, "@angular/language-service": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.1.3.tgz", - "integrity": "sha512-qj5K02LdG637YzqgtQVHVwZbzLHWm2WZOHPthu0M04RjS6bZxD4Ng828IXxFydrxoyTcDO/x0Uy2OAb7+rbBQw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.6.tgz", + "integrity": "sha512-46PaLwRCVhzOb3/zvvznSqF1WQ7ITADCnFuhc09TS1YKH2yf62sOjnnuAo1ZZDdN6UI/Y1zajaBrhpupTit9Rw==", "dev": true }, "@angular/platform-browser": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.1.3.tgz", - "integrity": "sha512-APMYMgEith68hsuSS8PpE0Dn1dEhJN1IkaIeL+ZlmhZQ4GktVAvMV2ySFYHoQofT5QIWEnvbT2r/cvgW9+8IUQ==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.6.tgz", + "integrity": "sha512-5jP0TeOCCM2SfXjC8306x6p3hdj7+GLuWsXuKyqozqdnr69RKI0vssY0XUzU0If/YsLWVoW/aY6wuiF8ybfIuA==", "requires": { "tslib": "1.8.1" } }, "@angular/platform-browser-dynamic": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.1.3.tgz", - "integrity": "sha512-LKyHzN0LZqcw8nL19yJsbqPMBZ2nxPYFDkbsBicxfr9RHWbWbDuIZXY5l742guzAFBPHhccx9Lpjd3Gwxi7syg==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.6.tgz", + "integrity": "sha512-forNn/W2nYDGfHTw7qWX20d6FCICeI1hYoGGAXcjuODmFix1ebzFaxG1IOzGZqf/J3Zj43pEMdPMEp5tiukSVA==", "requires": { "tslib": "1.8.1" } }, "@angular/router": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.1.3.tgz", - "integrity": "sha512-dhrrk2jfbIQEGWkonRyAjrJSt/a3aLmRRWiSL3UUZhfUqMUGhaxwJn7hYB1uQyvhqTGKYncBvjMrdGFmsQInNQ==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.6.tgz", + "integrity": "sha512-10Otnr5nmDWrlCpR5DTuDZmLj2hGf8WX1yFkfQ8H4EJWYe3YCTwGvz5D/smrWL6m6I2rOFgYOO3rFj9iYvMumA==", "requires": { "tslib": "1.8.1" } @@ -747,6 +747,12 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true + }, "async-foreach": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", @@ -754,6 +760,12 @@ "dev": true, "optional": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1104,23 +1116,679 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-sync": { + "version": "2.23.6", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.23.6.tgz", + "integrity": "sha512-loCO5NQKZXfBJrEvmLwF1TPSECCsPopNd29qduoysLmpw8op2lgolGMjz3oI/MjG4duzB9TfDs7k58djRSwPwg==", + "dev": true, + "requires": { + "browser-sync-ui": "1.0.1", + "bs-recipes": "1.3.4", + "chokidar": "1.7.0", + "connect": "3.5.0", + "connect-history-api-fallback": "1.5.0", + "dev-ip": "1.0.1", + "easy-extender": "2.3.2", + "eazy-logger": "3.0.2", + "emitter-steward": "1.0.0", + "etag": "1.8.1", + "fresh": "0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "1.15.2", + "immutable": "3.8.2", + "localtunnel": "1.8.3", + "micromatch": "2.3.11", + "opn": "4.0.2", + "portscanner": "2.1.1", + "qs": "6.2.1", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "serve-index": "1.8.0", + "serve-static": "1.12.2", + "server-destroy": "1.0.1", + "socket.io": "2.0.4", + "ua-parser-js": "0.7.12", + "yargs": "6.4.0" + }, + "dependencies": { + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "connect": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.5.0.tgz", + "integrity": "sha1-s1dSWgtMH1BZnNmD4dnv7qlncZg=", + "dev": true, + "requires": { + "debug": "2.2.0", + "finalhandler": "0.5.0", + "parseurl": "1.3.2", + "utils-merge": "1.0.0" + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "engine.io": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", + "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==", + "dev": true, + "requires": { + "accepts": "1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "3.1.0", + "engine.io-parser": "2.1.2", + "uws": "9.14.0", + "ws": "3.3.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.5.tgz", + "integrity": "sha512-Rv9vgb83zrNVhRircUXHi4mtbJhgy2oWtJOCZEbCLFs2HiDSWmh/aOEj8TwoKsn8zXGqTuQuPSoU4v3E10bR6A==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "3.1.0", + "engine.io-parser": "2.1.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "3.3.3", + "xmlhttprequest-ssl": "1.5.5", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "1.0.2" + } + }, + "finalhandler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", + "integrity": "sha1-6VCKvs6bbbqHGmlCodeRG5GRGsc=", + "dev": true, + "requires": { + "debug": "2.2.0", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "3.0.1", + "universalify": "0.1.1" + } + }, + "http-errors": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", + "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "setprototypeof": "1.0.2", + "statuses": "1.3.1" + } + }, + "http-proxy": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", + "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "qs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz", + "integrity": "sha1-zgPF/wk1vB2daanxTL0Y5WjWdiU=", + "dev": true + }, + "send": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.2.tgz", + "integrity": "sha1-+R+rRAO8+H5xb3DOtdsvV4vcF9Y=", + "dev": true, + "requires": { + "debug": "2.6.4", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.0", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "1.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.4.tgz", + "integrity": "sha1-dYaps8OXQcAoKuM0RcTorHRzT+A=", + "dev": true, + "requires": { + "ms": "0.7.3" + }, + "dependencies": { + "ms": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", + "dev": true + } + } + }, + "fresh": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + } + }, + "ms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-1.0.0.tgz", + "integrity": "sha1-Wa3NIu3FQ/e1OBhi0xOHsfS8lHM=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "serve-index": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz", + "integrity": "sha1-fF2WwT+xMRAfk8HFd0+FFqHnjTs=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "batch": "0.5.3", + "debug": "2.2.0", + "escape-html": "1.0.3", + "http-errors": "1.5.1", + "mime-types": "2.1.17", + "parseurl": "1.3.2" + } + }, + "serve-static": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.2.tgz", + "integrity": "sha1-5UbicmCBuBtLzsjpCAjrzdMjr7o=", + "dev": true, + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.2" + } + }, + "setprototypeof": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", + "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=", + "dev": true + }, + "socket.io": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", + "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "engine.io": "3.1.5", + "socket.io-adapter": "1.1.1", + "socket.io-client": "2.0.4", + "socket.io-parser": "3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", + "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.6.9", + "engine.io-client": "3.1.5", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "3.1.2", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", + "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "2.6.9", + "has-binary2": "1.0.2", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "dev": true + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "yargs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "browser-sync-ui": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-1.0.1.tgz", + "integrity": "sha512-RIxmwVVcUFhRd1zxp7m2FfLnXHf59x4Gtj8HFwTA//3VgYI3AKkaQAuDL8KDJnE59XqCshxZa13JYuIWtZlKQg==", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "async-each-series": "0.1.1", + "connect-history-api-fallback": "1.5.0", + "immutable": "3.8.2", + "server-destroy": "1.0.1", + "socket.io-client": "2.0.4", + "stream-throttle": "0.1.3" + }, + "dependencies": { + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "engine.io-client": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.5.tgz", + "integrity": "sha512-Rv9vgb83zrNVhRircUXHi4mtbJhgy2oWtJOCZEbCLFs2HiDSWmh/aOEj8TwoKsn8zXGqTuQuPSoU4v3E10bR6A==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "3.1.0", + "engine.io-parser": "2.1.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "3.3.3", + "xmlhttprequest-ssl": "1.5.5", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "1.0.2" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "socket.io-client": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", + "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.6.9", + "engine.io-client": "3.1.5", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "3.1.2", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", + "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "2.6.9", + "has-binary2": "1.0.2", + "isarray": "2.0.1" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + } } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "browserify-aes": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", @@ -1201,6 +1869,12 @@ "electron-to-chromium": "1.3.30" } }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -1879,6 +2553,15 @@ "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", "dev": true }, + "connect-logger": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/connect-logger/-/connect-logger-0.0.1.tgz", + "integrity": "sha1-TZmZeKHSC7RgjnzUNNdBZSJVF0s=", + "dev": true, + "requires": { + "moment": "2.20.1" + } + }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", @@ -2740,6 +3423,12 @@ "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", "dev": true }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -3040,6 +3729,32 @@ "typechecker": "4.4.1" } }, + "easy-extender": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.2.tgz", + "integrity": "sha1-PTJI/r4rFZYHMW2PnPSRwWZIIh0=", + "dev": true, + "requires": { + "lodash": "3.10.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "eazy-logger": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", + "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "dev": true, + "requires": { + "tfunk": "3.1.0" + } + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -3104,6 +3819,12 @@ "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=", "dev": true }, + "emitter-steward": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emitter-steward/-/emitter-steward-1.0.0.tgz", + "integrity": "sha1-80Ea3pdYp1Zd+Eiy2gy70bRsvWQ=", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -5453,6 +6174,23 @@ } } }, + "has-binary2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", + "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, "has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", @@ -5939,6 +6677,12 @@ "dev": true, "optional": true }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true + }, "import-local": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", @@ -6202,6 +6946,15 @@ "kind-of": "3.2.2" } }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "3.3.2" + } + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -7014,6 +7767,25 @@ "ejs": "2.5.7" } }, + "limiter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.2.tgz", + "integrity": "sha512-JIKZ0xb6fZZYa3deZ0BgXCgX6HgV8Nx3mFGeFHmFWW8Fb2c08e0CyE+G3nalpD0xGvGssjGb1UdFr+PprxZEbw==", + "dev": true + }, + "lite-server": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lite-server/-/lite-server-2.3.0.tgz", + "integrity": "sha1-W0zI9dX9SDYQVICrKsSKOg3isMg=", + "dev": true, + "requires": { + "browser-sync": "2.23.6", + "connect-history-api-fallback": "1.5.0", + "connect-logger": "0.0.1", + "lodash": "4.17.4", + "minimist": "1.2.0" + } + }, "live-server": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.1.0.tgz", @@ -7132,6 +7904,55 @@ "json5": "0.5.1" } }, + "localtunnel": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.8.3.tgz", + "integrity": "sha1-3MWSL9hWUQN9S94k/ZMkjQsk6wU=", + "dev": true, + "requires": { + "debug": "2.6.8", + "openurl": "1.1.1", + "request": "2.81.0", + "yargs": "3.29.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "yargs": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", + "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "window-size": "0.1.4", + "y18n": "3.2.1" + } + } + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -7242,6 +8063,12 @@ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", "dev": true }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", @@ -7746,6 +8573,12 @@ "integrity": "sha1-4rbN65zhn5kxelNyLz2/XfXqqrI=", "dev": true }, + "moment": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", + "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==", + "dev": true + }, "morgan": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", @@ -8283,6 +9116,12 @@ "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", "dev": true }, + "object-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", + "dev": true + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -8340,6 +9179,12 @@ "integrity": "sha1-Nu/zIgE3nv3xGA+0ReUajiQl+fY=", "dev": true }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, "opn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", @@ -8760,6 +9605,24 @@ } } }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "1.0.8" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", @@ -10145,9 +11008,9 @@ } }, "reflect-metadata": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", - "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", + "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", "dev": true }, "regenerate": { @@ -10335,6 +11198,16 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "2.6.9", + "minimatch": "3.0.4" + } + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -10377,6 +11250,12 @@ "aproba": "1.2.0" } }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, "rxjs": { "version": "5.5.5", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.5.tgz", @@ -10621,6 +11500,12 @@ "send": "0.16.1" } }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -11192,6 +12077,16 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "2.12.2", + "limiter": "1.1.2" + } + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -11682,6 +12577,43 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "tfunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", + "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "object-path": "0.9.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -11848,15 +12780,32 @@ } }, "tsickle": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.25.6.tgz", - "integrity": "sha1-tZXbFrI2chgk7u2ouyYjZbR+8zQ=", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.2.tgz", + "integrity": "sha512-KW+ZgY0t2cq2Qib1sfdgMiRnk+cr3brUtzZoVWjv+Ot3jNxVorFBUH+6In6hl8Dg7BI2AAFf69NHkwvZNMSFwA==", "dev": true, "requires": { "minimist": "1.2.0", "mkdirp": "0.5.1", - "source-map": "0.5.7", - "source-map-support": "0.4.18" + "source-map": "0.6.1", + "source-map-support": "0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.3.tgz", + "integrity": "sha512-eKkTgWYeBOQqFGXRfKabMFdnWepo51vWqEdoeikaEPFiJC7MCU5j2h4+6Q8npkZTeLGbSyecZvRxiSoWl3rh+w==", + "dev": true, + "requires": { + "source-map": "0.6.1" + } + } } }, "tslib": { @@ -11955,6 +12904,12 @@ "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==", "dev": true }, + "ua-parser-js": { + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz", + "integrity": "sha1-BMgamb3V3FImPqKdJMa/jUgYpLs=", + "dev": true + }, "uglify-js": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.5.tgz", @@ -12199,6 +13154,13 @@ "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", "dev": true }, + "uws": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", + "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==", + "dev": true, + "optional": true + }, "v8flags": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", diff --git a/dashboard/package.json b/dashboard/package.json index dfe0655..15221ca 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -5,6 +5,7 @@ "scripts": { "ng": "ng", "conventional-changelog": "conventional-changelog", + "dev": "npm run build && lite-server", "start": "ng serve", "build": "ng build", "build:prod": "npm run build -- --prod --aot", @@ -22,15 +23,15 @@ "release:changelog": "npm run conventional-changelog -- -p angular -i CHANGELOG.md -s" }, "dependencies": { - "@angular/animations": "~5.1.0", - "@angular/common": "~5.1.0", - "@angular/compiler": "~5.1.0", - "@angular/core": "~5.1.0", - "@angular/forms": "~5.1.0", - "@angular/http": "~5.1.0", - "@angular/platform-browser": "~5.1.0", - "@angular/platform-browser-dynamic": "~5.1.0", - "@angular/router": "~5.1.0", + "@angular/animations": "~5.2.6", + "@angular/common": "~5.2.6", + "@angular/compiler": "~5.2.6", + "@angular/core": "~5.2.6", + "@angular/forms": "~5.2.6", + "@angular/http": "~5.2.6", + "@angular/platform-browser": "~5.2.6", + "@angular/platform-browser-dynamic": "~5.2.6", + "@angular/router": "~5.2.6", "@nebular/auth": "2.0.0-rc.4", "@nebular/theme": "2.0.0-rc.4", "@ng-bootstrap/ng-bootstrap": "1.0.0-beta.8", @@ -49,8 +50,8 @@ }, "devDependencies": { "@angular/cli": "1.6.3", - "@angular/compiler-cli": "~5.1.0", - "@angular/language-service": "~5.1.0", + "@angular/compiler-cli": "~5.2.6", + "@angular/language-service": "~5.2.6", "@compodoc/compodoc": "1.0.1", "@types/jasmine": "2.5.54", "@types/jasminewd2": "2.0.3", @@ -73,6 +74,7 @@ "ts-node": "3.2.2", "tslint": "5.7.0", "tslint-language-service": "0.9.6", - "typescript": "2.5.3" + "typescript": "2.5.3", + "lite-server": "^2.3.0" } } diff --git a/dashboard/src/app/@core/auth/auth-guard.service.ts b/dashboard/src/app/@core/auth/auth-guard.service.ts new file mode 100644 index 0000000..3bc5c2e --- /dev/null +++ b/dashboard/src/app/@core/auth/auth-guard.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { CanActivate, Router } from '@angular/router'; +import { NbAuthService } from '@nebular/auth'; +import { tap } from 'rxjs/operators/tap'; + +@Injectable() +export class AuthGuardService implements CanActivate { + + constructor(private authService: NbAuthService, private router: Router) { } + + canActivate() { + return this.authService.isAuthenticated() + .pipe( + tap(authenticated => { + if (!authenticated) { + this.router.navigate(['auth/login']); + } + }), + ); + } +} diff --git a/dashboard/src/app/@core/auth/auth-interceptor.ts b/dashboard/src/app/@core/auth/auth-interceptor.ts new file mode 100644 index 0000000..bd8aba1 --- /dev/null +++ b/dashboard/src/app/@core/auth/auth-interceptor.ts @@ -0,0 +1,20 @@ +import { AuthService } from './auth.service'; +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http'; + +@Injectable() +export class AuthInterceptor implements HttpInterceptor { + private token: string; + constructor(private authService: AuthService) { } + + intercept(req: HttpRequest, next: HttpHandler) { + const authReq = req.clone({ + setHeaders: { + 'Authorization': 'Bearer ' + this.authService.getToken().getValue(), + 'Content-Type': 'application/json', + }, + }); + + return next.handle(authReq); + } +} diff --git a/dashboard/src/app/@core/auth/auth.service.ts b/dashboard/src/app/@core/auth/auth.service.ts new file mode 100644 index 0000000..48548d6 --- /dev/null +++ b/dashboard/src/app/@core/auth/auth.service.ts @@ -0,0 +1,41 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { NbAuthService, NbAuthSimpleToken, NbAuthJWTToken, NbTokenService } from '@nebular/auth'; +import { SERVER_URL } from '../../../../config'; +import { Observable } from 'rxjs/Observable'; +import { tap } from 'rxjs/operators'; + +@Injectable() +export class AuthService { + private logoutUrl = SERVER_URL + '/auth/logout'; + private token: NbAuthJWTToken; + + constructor( + private nbAuthService: NbAuthService, + private http: HttpClient, + private nbTokenService: NbTokenService) { + this.onTokenChange() + .subscribe((token: NbAuthJWTToken) => { + if (token) { + this.token = token; + } + }); + } + + logout(): Observable { + return this.http.delete(this.logoutUrl).pipe( + tap( + ok => this.nbTokenService.clear().pipe(), + error => console.error(`logout error`), + ), + ); + } + + onTokenChange(): Observable { + return this.nbAuthService.onTokenChange(); + } + + getToken(): NbAuthJWTToken { + return this.token; + } +} diff --git a/dashboard/src/app/@core/auth/index.ts b/dashboard/src/app/@core/auth/index.ts new file mode 100644 index 0000000..52f752c --- /dev/null +++ b/dashboard/src/app/@core/auth/index.ts @@ -0,0 +1,3 @@ +export * from './auth-guard.service'; +export * from './auth-interceptor'; +export * from './auth.service'; diff --git a/dashboard/src/app/@core/core.module.ts b/dashboard/src/app/@core/core.module.ts index 25ddcc9..04dff78 100644 --- a/dashboard/src/app/@core/core.module.ts +++ b/dashboard/src/app/@core/core.module.ts @@ -1,25 +1,54 @@ import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { NbAuthModule, NbDummyAuthProvider } from '@nebular/auth'; +import { NbAuthModule, NbEmailPassAuthProvider } from '@nebular/auth'; import { throwIfAlreadyLoaded } from './module-import-guard'; import { DataModule } from './data/data.module'; import { AnalyticsService } from './utils/analytics.service'; +import { SERVER_URL } from '../../../config'; +import { AuthInterceptor } from './auth/auth-interceptor'; +import { HTTP_INTERCEPTORS } from '@angular/common/http'; const NB_CORE_PROVIDERS = [ ...DataModule.forRoot().providers, ...NbAuthModule.forRoot({ providers: { email: { - service: NbDummyAuthProvider, + service: NbEmailPassAuthProvider, config: { - delay: 3000, + token: { + key: 'id_token', + }, + baseEndpoint: SERVER_URL, login: { - rememberMe: true, + endpoint: '/auth/login', + redirect: { + success: '/home/dashboard', + }, + }, + register: { + endpoint: '/auth/register', + redirect: { + success: '/auth/login', + }, }, }, }, }, + forms: { + register: { + terms: false, + }, + validation: { + password: { + minLength: 6, + maxLength: 100, + }, + fullName: { + required: true, + }, + }, + }, }).providers, AnalyticsService, ]; @@ -32,6 +61,13 @@ const NB_CORE_PROVIDERS = [ NbAuthModule, ], declarations: [], + providers: [ + { + provide: HTTP_INTERCEPTORS, + useClass: AuthInterceptor, + multi: true, + }, + ], }) export class CoreModule { constructor( @Optional() @SkipSelf() parentModule: CoreModule) { diff --git a/dashboard/src/app/@theme/components/header/header.component.html b/dashboard/src/app/@theme/components/header/header.component.html index 67a6136..c33f226 100644 --- a/dashboard/src/app/@theme/components/header/header.component.html +++ b/dashboard/src/app/@theme/components/header/header.component.html @@ -13,7 +13,7 @@ [class.right]="position === 'normal'" [class.left]="position === 'inverse'"> - + diff --git a/dashboard/src/app/@theme/components/header/header.component.ts b/dashboard/src/app/@theme/components/header/header.component.ts index a3192b6..7d0dabe 100644 --- a/dashboard/src/app/@theme/components/header/header.component.ts +++ b/dashboard/src/app/@theme/components/header/header.component.ts @@ -1,8 +1,12 @@ import { Component, Input, OnInit } from '@angular/core'; import { NbMenuService, NbSidebarService } from '@nebular/theme'; +import { NbUserMenuItem } from '@nebular/theme/components/user/user.component'; import { UserService } from '../../../@core/data/users.service'; import { AnalyticsService } from '../../../@core/utils/analytics.service'; +import { AuthService } from '../../../@core/auth'; +import { Router } from '@angular/router'; +import { tap } from 'rxjs/operators'; @Component({ selector: 'ngx-header', @@ -12,19 +16,20 @@ import { AnalyticsService } from '../../../@core/utils/analytics.service'; export class HeaderComponent implements OnInit { @Input() position = 'normal'; - user: any; + user = {}; - userMenu = [{ title: 'Log out' }]; + userMenu = [{ title: 'Log out', target: 'logout' }]; constructor(private menuService: NbMenuService, private userService: UserService, private sidebarService: NbSidebarService, - private analyticsService: AnalyticsService) { + private analyticsService: AnalyticsService, + private authService: AuthService, + private router: Router) { } ngOnInit() { - this.userService.getUsers() - .subscribe((users: any) => this.user = users.admin); + this.user = this.authService.getToken().getPayload(); } goToHome() { @@ -39,4 +44,10 @@ export class HeaderComponent implements OnInit { startSearch() { this.analyticsService.trackEvent('startSearch'); } + + menuItemClick(event) { + if (event.target === 'logout') { + this.authService.logout().subscribe(() => this.router.navigate(['/auth/login'])); + } + } } diff --git a/dashboard/src/app/app-routing.module.ts b/dashboard/src/app/app-routing.module.ts index 4307aa0..4e4de97 100644 --- a/dashboard/src/app/app-routing.module.ts +++ b/dashboard/src/app/app-routing.module.ts @@ -1,14 +1,18 @@ import { ExtraOptions, RouterModule, Routes } from '@angular/router'; import { NgModule } from '@angular/core'; +import { AuthGuardService } from './@core/auth/auth-guard.service'; import { NbAuthComponent, - NbLogoutComponent, NbRegisterComponent, NbLoginComponent, } from '@nebular/auth'; const routes: Routes = [ - { path: '', loadChildren: 'app/pages/pages.module#PagesModule' }, + { + path: 'home', + canActivate: [AuthGuardService], + loadChildren: 'app/pages/pages.module#PagesModule', + }, { path: 'auth', component: NbAuthComponent, @@ -25,14 +29,10 @@ const routes: Routes = [ path: 'register', component: NbRegisterComponent, }, - { - path: 'logout', - component: NbLogoutComponent, - }, ], }, - { path: '', redirectTo: 'pages', pathMatch: 'full' }, - { path: '**', redirectTo: 'pages' }, + { path: '', redirectTo: 'home', pathMatch: 'full' }, + { path: '**', redirectTo: 'home' }, ]; const config: ExtraOptions = { diff --git a/dashboard/src/app/app.module.ts b/dashboard/src/app/app.module.ts index 67cf380..87d8fc6 100644 --- a/dashboard/src/app/app.module.ts +++ b/dashboard/src/app/app.module.ts @@ -1,19 +1,17 @@ -/** - * @license - * Copyright Akveo. All Rights Reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - */ import { APP_BASE_HREF } from '@angular/common'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { NgModule } from '@angular/core'; import { HttpModule } from '@angular/http'; +import { HttpClientModule } from '@angular/common/http'; import { CoreModule } from './@core/core.module'; import { AppComponent } from './app.component'; import { AppRoutingModule } from './app-routing.module'; import { ThemeModule } from './@theme/theme.module'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { NB_AUTH_TOKEN_WRAPPER_TOKEN, NbAuthJWTToken } from '@nebular/auth'; +import { AuthGuardService, AuthService } from './@core/auth'; @NgModule({ declarations: [AppComponent], @@ -21,6 +19,7 @@ import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; BrowserModule, BrowserAnimationsModule, HttpModule, + HttpClientModule, AppRoutingModule, NgbModule.forRoot(), @@ -29,7 +28,16 @@ import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; ], bootstrap: [AppComponent], providers: [ - { provide: APP_BASE_HREF, useValue: '/' }, + { + provide: APP_BASE_HREF, + useValue: '/', + }, + { + provide: NB_AUTH_TOKEN_WRAPPER_TOKEN, + useClass: NbAuthJWTToken, + }, + AuthGuardService, + AuthService, ], }) export class AppModule { diff --git a/dashboard/src/app/pages/pages-menu.ts b/dashboard/src/app/pages/pages-menu.ts index 21b42bd..ffdee5e 100644 --- a/dashboard/src/app/pages/pages-menu.ts +++ b/dashboard/src/app/pages/pages-menu.ts @@ -4,12 +4,12 @@ export const MENU_ITEMS: NbMenuItem[] = [ { title: 'Dashboard', icon: 'nb-bar-chart', - link: '/dashboard', + link: '/home/dashboard', home: true, }, { title: 'Devices', icon: 'nb-keypad', - link: '/devices', + link: '/home/devices', }, ]; diff --git a/dashboard/src/assets/images/nick.png b/dashboard/src/assets/images/nick.png deleted file mode 100644 index 0045d24..0000000 Binary files a/dashboard/src/assets/images/nick.png and /dev/null differ