From 4d56d12ccbda38f3cd6facbf43aef635363e8fcf Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Tue, 3 Apr 2018 22:14:54 -0400 Subject: [PATCH] stub out angular with webpack --- .gitignore | 1 + package-lock.json | 742 ++++++++++++++++++++- package.json | 46 +- src/manifest.json | 1 + src/popup2/accounts/login.component.html | 3 + src/popup2/accounts/login.component.ts | 44 ++ src/popup2/app-routing.module.ts | 21 + src/popup2/app.component.ts | 39 ++ src/popup2/app.d.ts | 1 + src/popup2/app.module.ts | 44 ++ src/popup2/index.html | 14 + src/popup2/main.ts | 15 + src/popup2/services/auth-guard.service.ts | 31 + src/popup2/services/broadcaster.service.ts | 33 + src/popup2/services/services.module.ts | 35 + src/popup2/services/validation.service.ts | 37 + src/scss/popup.scss | 3 + tsconfig.json | 3 + webpack2.js | 150 +++++ 19 files changed, 1225 insertions(+), 38 deletions(-) create mode 100644 src/popup2/accounts/login.component.html create mode 100644 src/popup2/accounts/login.component.ts create mode 100644 src/popup2/app-routing.module.ts create mode 100644 src/popup2/app.component.ts create mode 100644 src/popup2/app.d.ts create mode 100644 src/popup2/app.module.ts create mode 100644 src/popup2/index.html create mode 100644 src/popup2/main.ts create mode 100644 src/popup2/services/auth-guard.service.ts create mode 100644 src/popup2/services/broadcaster.service.ts create mode 100644 src/popup2/services/services.module.ts create mode 100644 src/popup2/services/validation.service.ts create mode 100644 src/scss/popup.scss create mode 100644 webpack2.js diff --git a/.gitignore b/.gitignore index 7c1cc3c130..7ddf7d4eb5 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,6 @@ webfonts/ *.pem *.zip build/ +build2/ build.safariextension/ coverage/ diff --git a/package-lock.json b/package-lock.json index 6e45215be4..707ffd1b59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,15 +4,156 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@angular/animations": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.0.tgz", + "integrity": "sha512-JLR42YHiJppO4ruAkFxgbzghUDtHkXHkKPM8udd2qyt16T7e1OX7EEOrrmldUu59CC56tZnJ/32p4SrYmxyBSA==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/common": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.0.tgz", + "integrity": "sha512-yMFn2isC7/XOs56/2Kzzbb1AASHiwipAPOVFtKe7TdZQClO8fJXwCnk326rzr615+CG0eSBNQWeiFGyWN2riBA==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/compiler": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.0.tgz", + "integrity": "sha512-RfYa4ESgjGX0T0ob/Xz00IF7nd2xZkoyRy6oKgL82q42uzB3xZUDMrFNgeGxAUs3H22IkL46/5SSPOMOTMZ0NA==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.0.tgz", + "integrity": "sha512-s2ne45DguNUubhC1YgybGECC4Tyx3G4EZCntUiRMDWWkmKXSK+6dgHMesyDo8R5Oat8VfN4Anf8l3JHS1He8kg==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/forms": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.0.tgz", + "integrity": "sha512-g1/SF9lY0ZwzJ0w4NXbFsTGGEuUdgtaZny8DmkaqtmA7idby3FW398X0tv25KQfVYKtL+p9Jp1Y8EI0CvrIsvw==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/http": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.0.tgz", + "integrity": "sha512-V5Cl24dP3rCXTTQvDc0TIKoWqBRAa0DWAQbtr7iuDAt5a1vPGdKz5K1sEiiV6ziwX6gzjiwHjUvL+B+WbIUrQA==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/platform-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.0.tgz", + "integrity": "sha512-c6cR15MfopPwGZ097HdRuAi9+R9BhA3bRRFpP2HmrSSB/BW4ZNovUYwB2QUMSYbd9s0lYTtnavqGm6DKcyF2QA==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.0.tgz", + "integrity": "sha512-xG1eNoi8sm4Jcly2y98r5mqYVe3XV8sUJCtOhvGBYtvt4dKEQ5tOns6fWQ0nUbl6Vv3Y0xgGUS1JCtfut3DuaQ==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.0.tgz", + "integrity": "sha512-VXDXtp2A1GQEUEhXg0ZzqHdTUERLgDSo3/Mmpzt+dgLMKlXDSCykcm4gINwE5VQLGD1zQvDFCCRv3seGRNfrqA==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/upgrade": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-5.2.0.tgz", + "integrity": "sha512-ezWfhBCiP7RX+59scxfYfjDMRw+qq0BVbm/EfOXdYFU0NHWo7lXJ3v+cUi18G+5GVjzwRiJDIKWhw1QEyq2nug==", + "requires": { + "tslib": "1.9.0" + } + }, + "@ngtools/webpack": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz", + "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==", + "dev": true, + "requires": { + "chalk": "2.2.2", + "enhanced-resolve": "3.4.1", + "loader-utils": "1.1.0", + "magic-string": "0.22.5", + "semver": "5.5.0", + "source-map": "0.5.7", + "tree-kill": "1.2.0", + "webpack-sources": "1.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, "@types/angular": { "version": "1.6.43", "resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.6.43.tgz", - "integrity": "sha512-3GrHCRZS62ruJjHMtOx3WYsS0I8i0FRcIqOwqIfWXnlR9g2FebEhUNdMk3LZIvfhZ08xe+S1x2iwP1t9vKCHag==" + "integrity": "sha512-3GrHCRZS62ruJjHMtOx3WYsS0I8i0FRcIqOwqIfWXnlR9g2FebEhUNdMk3LZIvfhZ08xe+S1x2iwP1t9vKCHag==", + "dev": true }, "@types/chrome": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.51.tgz", "integrity": "sha512-cm8z9kDWM3DiDAMvG1aVTnOWC8gDzP2cE4PfgAFNe79SqDNMPaW8uIVB4OON0EY0h/g5P69hieJ8N2nc0yNkfQ==", + "dev": true, "requires": { "@types/filesystem": "0.0.28" } @@ -21,6 +162,7 @@ "version": "0.0.28", "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.28.tgz", "integrity": "sha1-P9dzWDDyx0E8taxFeAvEWQRpew4=", + "dev": true, "requires": { "@types/filewriter": "0.0.28" } @@ -28,7 +170,8 @@ "@types/filewriter": { "version": "0.0.28", "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.28.tgz", - "integrity": "sha1-wFTor02d11205jq8dviFFocU1LM=" + "integrity": "sha1-wFTor02d11205jq8dviFFocU1LM=", + "dev": true }, "@types/jasmine": { "version": "2.8.6", @@ -39,42 +182,50 @@ "@types/jquery": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.0.tgz", - "integrity": "sha512-szaKV2OQgwxYTGTY6qd9eeBfGGCaP7n2OGit4JdbOcfGgc9VWjfhMhnu5AVNhIAu8WWDIB36q9dfPVba1fGeIQ==" + "integrity": "sha512-szaKV2OQgwxYTGTY6qd9eeBfGGCaP7n2OGit4JdbOcfGgc9VWjfhMhnu5AVNhIAu8WWDIB36q9dfPVba1fGeIQ==", + "dev": true }, "@types/lunr": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@types/lunr/-/lunr-2.1.5.tgz", - "integrity": "sha512-esk3CG25hRtHsVHm+LOjiSFYdw8be3uIY653WUwR43Bro914HSimPgPpqgajkhTJ0awK3RQfaIxP7zvbtCpcyg==" + "integrity": "sha512-esk3CG25hRtHsVHm+LOjiSFYdw8be3uIY653WUwR43Bro914HSimPgPpqgajkhTJ0awK3RQfaIxP7zvbtCpcyg==", + "dev": true }, "@types/node-forge": { "version": "0.6.10", "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-0.6.10.tgz", - "integrity": "sha512-O66D2B9OZDP+vTvfDJUJnk/HfOueeerLXNZQtVY+1ICbp6hO0ySkOtt+N+MGa24YS48JzavN6C2BjYBnKTGwiw==" + "integrity": "sha512-O66D2B9OZDP+vTvfDJUJnk/HfOueeerLXNZQtVY+1ICbp6hO0ySkOtt+N+MGa24YS48JzavN6C2BjYBnKTGwiw==", + "dev": true }, "@types/papaparse": { "version": "4.1.31", "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-4.1.31.tgz", - "integrity": "sha512-8+d1hk3GgF+NJ6mMZZ5zKimqIOc+8OTzpLw4RQ8wnS1NkJh/dMH3NEhSud4Ituq2SGXJjOG6wIczCBAKsSsBdQ==" + "integrity": "sha512-8+d1hk3GgF+NJ6mMZZ5zKimqIOc+8OTzpLw4RQ8wnS1NkJh/dMH3NEhSud4Ituq2SGXJjOG6wIczCBAKsSsBdQ==", + "dev": true }, "@types/safari-extension": { "version": "0.0.27", "resolved": "https://registry.npmjs.org/@types/safari-extension/-/safari-extension-0.0.27.tgz", - "integrity": "sha1-ogS6Sqa6Lv+LcP5aGW/Nq1x1GCY=" + "integrity": "sha1-ogS6Sqa6Lv+LcP5aGW/Nq1x1GCY=", + "dev": true }, "@types/safari-extension-content": { "version": "0.0.14", "resolved": "https://registry.npmjs.org/@types/safari-extension-content/-/safari-extension-content-0.0.14.tgz", - "integrity": "sha1-Y44W0a0ML8jFjj8ikT5hZxwU9BQ=" + "integrity": "sha1-Y44W0a0ML8jFjj8ikT5hZxwU9BQ=", + "dev": true }, "@types/tldjs": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@types/tldjs/-/tldjs-1.7.1.tgz", - "integrity": "sha1-BdPvPLbgPPOt8eSgQ8FHDPIOF5k=" + "integrity": "sha1-BdPvPLbgPPOt8eSgQ8FHDPIOF5k=", + "dev": true }, "@types/webcrypto": { "version": "0.0.28", "resolved": "https://registry.npmjs.org/@types/webcrypto/-/webcrypto-0.0.28.tgz", - "integrity": "sha512-jzAoSUvqA+183nJO/Sc73CREQJsv+p77WJdn532GqA3YXQzlwRwHhClVa7U4O8iB2sJSR7G3v6f1mJFNkwA9YQ==" + "integrity": "sha512-jzAoSUvqA+183nJO/Sc73CREQJsv+p77WJdn532GqA3YXQzlwRwHhClVa7U4O8iB2sJSR7G3v6f1mJFNkwA9YQ==", + "dev": true }, "@uirouter/angularjs": { "version": "1.0.15", @@ -478,6 +629,11 @@ "integrity": "sha1-n4NQykghRaRNARp1W4+zYj1gVEw=", "dev": true }, + "angular2-toaster": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/angular2-toaster/-/angular2-toaster-4.0.2.tgz", + "integrity": "sha512-/ndYYbV/7WZx6ujm6avFUqfb+FKbrx7oT+3mYj8i0o9N26Ug+BseFjy6oRnlVVedl39yRP6hhea81QgKmoYbbQ==" + }, "angulartics": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/angulartics/-/angulartics-1.4.0.tgz", @@ -490,6 +646,14 @@ "integrity": "sha1-rzLbDQqnBNBYNqzqcvBp8JEbelE=", "dev": true }, + "angulartics2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/angulartics2/-/angulartics2-5.0.1.tgz", + "integrity": "sha512-QYBp7km7xTf/57zKKnYreM0OQ1Pq0kd4L9HJTC79vy7+RG1XqrkA944jTGKDERLWtjEAlQuSyZMS9J5IZZ56sw==", + "requires": { + "tslib": "1.9.0" + } + }, "ansi-align": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", @@ -742,6 +906,16 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.5" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -916,6 +1090,12 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1023,7 +1203,7 @@ "dev": true, "requires": { "babel-runtime": "6.26.0", - "core-js": "2.5.3", + "core-js": "2.4.1", "regenerator-runtime": "0.10.5" }, "dependencies": { @@ -1041,7 +1221,7 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.3", + "core-js": "2.4.1", "regenerator-runtime": "0.11.1" } }, @@ -1213,6 +1393,15 @@ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", "dev": true }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", @@ -2003,6 +2192,18 @@ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", "dev": true }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "1.0.0", + "is-plain-object": "2.0.4", + "kind-of": "6.0.2", + "shallow-clone": "1.0.0" + } + }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", @@ -2256,6 +2457,12 @@ "date-now": "0.1.4" } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -2317,10 +2524,9 @@ } }, "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" }, "core-util-is": { "version": "1.0.2", @@ -2763,6 +2969,12 @@ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -5412,6 +5624,18 @@ } } }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -5481,6 +5705,22 @@ } } }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, "gaze": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", @@ -6344,6 +6584,12 @@ "sparkles": "1.0.0" } }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -6714,6 +6960,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -7693,7 +7945,7 @@ "colors": "1.1.2", "combine-lists": "1.0.1", "connect": "3.6.6", - "core-js": "2.5.3", + "core-js": "2.4.1", "di": "0.0.1", "dom-serialize": "2.2.1", "expand-braces": "0.1.2", @@ -8253,6 +8505,12 @@ "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", "dev": true }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", + "dev": true + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -8289,6 +8547,12 @@ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", "dev": true }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, "lodash.template": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", @@ -8408,8 +8672,7 @@ "lunr": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.1.6.tgz", - "integrity": "sha512-ydJpB8CX8cZ/VE+KMaYaFcZ6+o2LruM6NG76VXdflYTgluvVemz1lW4anE+pyBbLvxJHZdvD1Jy/fOqdzAEJog==", - "dev": true + "integrity": "sha512-ydJpB8CX8cZ/VE+KMaYaFcZ6+o2LruM6NG76VXdflYTgluvVemz1lW4anE+pyBbLvxJHZdvD1Jy/fOqdzAEJog==" }, "macaddress": { "version": "0.2.8", @@ -8417,6 +8680,15 @@ "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", "dev": true }, + "magic-string": { + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "dev": true, + "requires": { + "vlq": "0.2.3" + } + }, "make-dir": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", @@ -8679,6 +8951,24 @@ } } }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "0.1.8", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -8928,8 +9218,36 @@ "node-forge": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", - "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=", - "dev": true + "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=" + }, + "node-gyp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "dev": true, + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } }, "node-libs-browser": { "version": "2.1.0", @@ -8995,6 +9313,141 @@ } } }, + "node-sass": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.8.3.tgz", + "integrity": "sha512-tfFWhUsCk/Y19zarDcPo5xpj+IW3qCfOjVdHtYeG6S1CKbQOh1zqylnQK6cV3z9k80yxAnFX9Y+a9+XysDhhfg==", + "dev": true, + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.2", + "get-stdin": "4.0.1", + "glob": "7.1.2", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.1", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.10.0", + "node-gyp": "3.6.2", + "npmlog": "4.1.2", + "request": "2.79.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.0", + "true-case-path": "1.0.2" + }, + "dependencies": { + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "which": "1.3.0" + } + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true, + "requires": { + "globule": "1.2.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.5", + "minimatch": "3.0.4" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.14.1", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" + } + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.4.3", + "uuid": "3.2.1" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + } + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -9052,6 +9505,18 @@ "path-key": "2.0.1" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", @@ -9366,6 +9831,16 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -11224,6 +11699,14 @@ "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "dev": true }, + "rxjs": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", + "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "requires": { + "symbol-observable": "1.0.1" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -11246,6 +11729,101 @@ "ret": "0.1.15" } }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.5", + "scss-tokenizer": "0.2.3", + "yargs": "7.1.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "sass-loader": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", + "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", + "dev": true, + "requires": { + "clone-deep": "2.0.2", + "loader-utils": "1.1.0", + "lodash.tail": "4.1.1", + "neo-async": "2.5.0", + "pify": "3.0.0" + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -11261,6 +11839,27 @@ "ajv": "5.5.2" } }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "2.4.3", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, "select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", @@ -11368,6 +11967,25 @@ "safe-buffer": "5.1.1" } }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "0.1.1", + "kind-of": "5.1.0", + "mixin-object": "2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -11438,7 +12056,7 @@ "dev": true, "requires": { "babel-runtime": "6.26.0", - "core-js": "2.5.3", + "core-js": "2.4.1", "regenerator-runtime": "0.9.6" } }, @@ -12076,6 +12694,15 @@ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true }, + "stdout-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", + "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "dev": true, + "requires": { + "readable-stream": "2.3.5" + } + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", @@ -12361,6 +12988,11 @@ "integrity": "sha1-0sMepJKyK2qNiHrqFZiaI4/AhK4=", "dev": true }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, "table": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", @@ -12430,6 +13062,17 @@ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, "tar-stream": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", @@ -12659,6 +13302,12 @@ "integrity": "sha1-0EsigOTHkqWBVCnve4tgxkyczDQ=", "dev": true }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -12671,6 +13320,30 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "true-case-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", + "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "dev": true, + "requires": { + "glob": "6.0.4" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, "ts-loader": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-3.5.0.tgz", @@ -12730,8 +13403,7 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" }, "tslint": { "version": "5.9.1", @@ -13410,6 +14082,12 @@ } } }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -13495,7 +14173,7 @@ "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", "dev": true, "requires": { - "core-js": "2.5.3", + "core-js": "2.4.1", "regenerator-runtime": "0.10.5" } }, @@ -13940,6 +14618,15 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, "widest-line": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", @@ -14199,6 +14886,11 @@ "lodash": "4.17.5", "readable-stream": "2.3.5" } + }, + "zone.js": { + "version": "0.8.19", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.19.tgz", + "integrity": "sha512-l9rofaOs6a4y1W8zt4pDmnCUCnYG377dG+5SZlXNWrTWYUuXFqcJZiOarhYiRVR0NI9sH/8ooPJiz4uprB/Mkg==" } } } diff --git a/package.json b/package.json index fc6f075afc..a1799bcf7b 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,8 @@ "start:firefox": "web-ext run --source-dir ./dist/", "dev": "gulp build && webpack --config webpack.dev.js", "dev:watch": "gulp build && webpack --config webpack.dev.js --watch", + "dev2": "webpack --config webpack2.js", + "dev2:watch": "webpack --config webpack2.js --watch", "prod": "gulp build && webpack --config webpack.prod.js", "dist": "npm run prod && gulp dist", "dist:firefox": "npm run prod && gulp dist:firefox", @@ -20,7 +22,18 @@ "test:watch": "karma start" }, "devDependencies": { + "@ngtools/webpack": "1.10.2", + "@types/angular": "^1.6.34", + "@types/chrome": "0.0.51", "@types/jasmine": "^2.8.2", + "@types/jquery": "^3.2.16", + "@types/lunr": "2.1.5", + "@types/node-forge": "0.6.10", + "@types/papaparse": "4.1.31", + "@types/safari-extension": "^0.0.27", + "@types/safari-extension-content": "^0.0.14", + "@types/tldjs": "1.7.1", + "@types/webcrypto": "^0.0.28", "angular": "1.6.9", "angular-animate": "1.6.9", "angular-sweetalert": "1.1.2", @@ -59,11 +72,11 @@ "karma-typescript": "^3.0.8", "less": "^3.0.0-alpha.3", "less-loader": "^4.0.5", - "lunr": "2.1.6", "ng-infinite-scroll": "1.3.0", "ngclipboard": "1.1.1", - "node-forge": "0.7.1", + "node-sass": "^4.7.2", "papaparse": "4.3.5", + "sass-loader": "^6.0.6", "style-loader": "^0.19.0", "sweetalert": "1.1.3", "tldjs": "2.0.0", @@ -76,16 +89,23 @@ "webpack-merge": "^4.1.0" }, "dependencies": { - "@types/angular": "^1.6.34", - "@types/chrome": "0.0.51", - "@types/jquery": "^3.2.16", - "@types/lunr": "2.1.5", - "@types/node-forge": "0.6.10", - "@types/papaparse": "4.1.31", - "@types/safari-extension": "^0.0.27", - "@types/safari-extension-content": "^0.0.14", - "@types/tldjs": "1.7.1", - "@types/webcrypto": "^0.0.28", - "@uirouter/angularjs": "^1.0.10" + "@angular/animations": "5.2.0", + "@angular/common": "5.2.0", + "@angular/compiler": "5.2.0", + "@angular/core": "5.2.0", + "@angular/forms": "5.2.0", + "@angular/http": "5.2.0", + "@angular/platform-browser": "5.2.0", + "@angular/platform-browser-dynamic": "5.2.0", + "@angular/router": "5.2.0", + "@angular/upgrade": "5.2.0", + "@uirouter/angularjs": "^1.0.10", + "angular2-toaster": "4.0.2", + "angulartics2": "5.0.1", + "core-js": "2.4.1", + "lunr": "2.1.6", + "node-forge": "0.7.1", + "rxjs": "5.5.6", + "zone.js": "0.8.19" } } diff --git a/src/manifest.json b/src/manifest.json index 90d78dadcb..6785e04a52 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -78,6 +78,7 @@ "webRequest", "webRequestBlocking" ], + "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "commands": { "autofill_login": { "suggested_key": { diff --git a/src/popup2/accounts/login.component.html b/src/popup2/accounts/login.component.html new file mode 100644 index 0000000000..c13e25d391 --- /dev/null +++ b/src/popup2/accounts/login.component.html @@ -0,0 +1,3 @@ +
+ Login Form +
diff --git a/src/popup2/accounts/login.component.ts b/src/popup2/accounts/login.component.ts new file mode 100644 index 0000000000..aa5c52cd87 --- /dev/null +++ b/src/popup2/accounts/login.component.ts @@ -0,0 +1,44 @@ +import * as template from './login.component.html'; + +import { + Component, + ComponentFactoryResolver, + ViewChild, + ViewContainerRef, +} from '@angular/core'; +import { Router } from '@angular/router'; + +import { ToasterService } from 'angular2-toaster'; +import { Angulartics2 } from 'angulartics2'; + +import { AuthResult } from 'jslib/models/domain/authResult'; + +import { AuthService } from 'jslib/abstractions/auth.service'; +import { I18nService } from 'jslib/abstractions/i18n.service'; +import { SyncService } from 'jslib/abstractions/sync.service'; + +@Component({ + selector: 'app-login', + template: template, +}) +export class LoginComponent { + @ViewChild('environment', { read: ViewContainerRef }) environmentModal: ViewContainerRef; + + email: string = ''; + masterPassword: string = ''; + showPassword: boolean = false; + formPromise: Promise; + + constructor(private router: Router, private analytics: Angulartics2, + private toasterService: ToasterService) { } + + async submit() { + + } + + togglePassword() { + this.analytics.eventTrack.next({ action: 'Toggled Master Password on Login' }); + this.showPassword = !this.showPassword; + document.getElementById('masterPassword').focus(); + } +} diff --git a/src/popup2/app-routing.module.ts b/src/popup2/app-routing.module.ts new file mode 100644 index 0000000000..812caa6311 --- /dev/null +++ b/src/popup2/app-routing.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { + RouterModule, + Routes, +} from '@angular/router'; + +import { LoginComponent } from './accounts/login.component'; + +const routes: Routes = [ + { path: '', redirectTo: '/login', pathMatch: 'full' }, + { path: 'login', component: LoginComponent }, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes, { + useHash: true, + /*enableTracing: true,*/ + })], + exports: [RouterModule], +}) +export class AppRoutingModule { } diff --git a/src/popup2/app.component.ts b/src/popup2/app.component.ts new file mode 100644 index 0000000000..7444c940f1 --- /dev/null +++ b/src/popup2/app.component.ts @@ -0,0 +1,39 @@ +import { + ToasterConfig, + ToasterContainerComponent, +} from 'angular2-toaster'; +import { Angulartics2GoogleAnalytics } from 'angulartics2/ga'; + +import { + Component, + ComponentFactoryResolver, + NgZone, + OnDestroy, + OnInit, + Type, + ViewChild, + ViewContainerRef, +} from '@angular/core'; +import { Router } from '@angular/router'; + +import { ToasterService } from 'angular2-toaster'; +import { Angulartics2 } from 'angulartics2'; + +@Component({ + selector: 'app-root', + styles: [], + template: ` + + `, +}) +export class AppComponent { + toasterConfig: ToasterConfig = new ToasterConfig({ + showCloseButton: true, + mouseoverTimerStop: true, + animation: 'flyRight', + limit: 5, + }); + + constructor(private angulartics2GoogleAnalytics: Angulartics2GoogleAnalytics, private analytics: Angulartics2, + private toasterService: ToasterService) { } +} diff --git a/src/popup2/app.d.ts b/src/popup2/app.d.ts new file mode 100644 index 0000000000..7bf7506fcf --- /dev/null +++ b/src/popup2/app.d.ts @@ -0,0 +1 @@ +declare module '*.html'; diff --git a/src/popup2/app.module.ts b/src/popup2/app.module.ts new file mode 100644 index 0000000000..789e71c1ef --- /dev/null +++ b/src/popup2/app.module.ts @@ -0,0 +1,44 @@ +import 'core-js'; +import 'zone.js/dist/zone'; + +import { ToasterModule } from 'angular2-toaster'; +import { Angulartics2Module } from 'angulartics2'; +import { Angulartics2GoogleAnalytics } from 'angulartics2/ga'; + +import { AppRoutingModule } from './app-routing.module'; +import { ServicesModule } from './services/services.module'; + +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + +import { AppComponent } from './app.component'; + +import { LoginComponent } from './accounts/login.component'; + +@NgModule({ + imports: [ + BrowserModule, + BrowserAnimationsModule, + FormsModule, + AppRoutingModule, + ServicesModule, + Angulartics2Module.forRoot([Angulartics2GoogleAnalytics], { + pageTracking: { + clearQueryParams: true, + }, + }), + ToasterModule, + ], + declarations: [ + AppComponent, + LoginComponent, + ], + entryComponents: [ + + ], + providers: [], + bootstrap: [AppComponent], +}) +export class AppModule { } diff --git a/src/popup2/index.html b/src/popup2/index.html new file mode 100644 index 0000000000..ab5f5d55a4 --- /dev/null +++ b/src/popup2/index.html @@ -0,0 +1,14 @@ + + + + + + Bitwarden + + + + +
+
+ + diff --git a/src/popup2/main.ts b/src/popup2/main.ts new file mode 100644 index 0000000000..45d09780a1 --- /dev/null +++ b/src/popup2/main.ts @@ -0,0 +1,15 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +// tslint:disable-next-line +require('../scss/popup.scss'); +// tslint:disable-next-line +require('../scripts/duo.js'); + +import { AppModule } from './app.module'; + +//if (!isDev()) { +// enableProdMode(); +//} + +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/src/popup2/services/auth-guard.service.ts b/src/popup2/services/auth-guard.service.ts new file mode 100644 index 0000000000..bb6cdd2376 --- /dev/null +++ b/src/popup2/services/auth-guard.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { + CanActivate, + Router, +} from '@angular/router'; + +import { CryptoService } from 'jslib/abstractions/crypto.service'; +import { MessagingService } from 'jslib/abstractions/messaging.service'; +import { UserService } from 'jslib/abstractions/user.service'; + +@Injectable() +export class AuthGuardService implements CanActivate { + constructor(private cryptoService: CryptoService, private userService: UserService, private router: Router, + private messagingService: MessagingService) { } + + async canActivate() { + const isAuthed = await this.userService.isAuthenticated(); + if (!isAuthed) { + this.messagingService.send('logout'); + return false; + } + + const key = await this.cryptoService.getKey(); + if (key == null) { + this.router.navigate(['lock']); + return false; + } + + return true; + } +} diff --git a/src/popup2/services/broadcaster.service.ts b/src/popup2/services/broadcaster.service.ts new file mode 100644 index 0000000000..fe747e7b0b --- /dev/null +++ b/src/popup2/services/broadcaster.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; + +@Injectable() +export class BroadcasterService { + subscribers: Map any> = new Map any>(); + + send(message: any, id?: string) { + if (id != null) { + if (this.subscribers.has(id)) { + this.subscribers.get(id)(message); + } + return; + } + + this.subscribers.forEach((value) => { + value(message); + }); + } + + subscribe(id: string, messageCallback: (message: any) => any) { + if (this.subscribers.has(id)) { + return; + } + + this.subscribers.set(id, messageCallback); + } + + unsubscribe(id: string) { + if (this.subscribers.has(id)) { + this.subscribers.delete(id); + } + } +} diff --git a/src/popup2/services/services.module.ts b/src/popup2/services/services.module.ts new file mode 100644 index 0000000000..95f7f77f04 --- /dev/null +++ b/src/popup2/services/services.module.ts @@ -0,0 +1,35 @@ +import { + APP_INITIALIZER, + NgModule, +} from '@angular/core'; + +import { ToasterModule } from 'angular2-toaster'; + +import { AuthGuardService } from './auth-guard.service'; +import { BroadcasterService } from './broadcaster.service'; +import { ValidationService } from './validation.service'; + +function initFactory(): Function { + return async () => { + + }; +} + +@NgModule({ + imports: [ + ToasterModule, + ], + declarations: [], + providers: [ + ValidationService, + AuthGuardService, + { + provide: APP_INITIALIZER, + useFactory: initFactory, + deps: [], + multi: true, + }, + ], +}) +export class ServicesModule { +} diff --git a/src/popup2/services/validation.service.ts b/src/popup2/services/validation.service.ts new file mode 100644 index 0000000000..cc7ee9ce65 --- /dev/null +++ b/src/popup2/services/validation.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@angular/core'; + +import { ToasterService } from 'angular2-toaster'; + +import { I18nService } from 'jslib/abstractions/i18n.service'; + +@Injectable() +export class ValidationService { + constructor(private toasterService: ToasterService, private i18nService: I18nService) { } + + showError(data: any): string[] { + const defaultErrorMessage = this.i18nService.t('unexpectedError'); + const errors: string[] = []; + + if (data == null || typeof data !== 'object') { + errors.push(defaultErrorMessage); + } else if (data.validationErrors == null) { + errors.push(data.message ? data.message : defaultErrorMessage); + } else { + for (const key in data.validationErrors) { + if (!data.validationErrors.hasOwnProperty(key)) { + continue; + } + + data.validationErrors[key].forEach((item: string) => { + errors.push(item); + }); + } + } + + if (errors.length > 0) { + this.toasterService.popAsync('error', this.i18nService.t('errorOccurred'), errors[0]); + } + + return errors; + } +} diff --git a/src/scss/popup.scss b/src/scss/popup.scss new file mode 100644 index 0000000000..8b70edc5fc --- /dev/null +++ b/src/scss/popup.scss @@ -0,0 +1,3 @@ +body { + color: black; +} diff --git a/tsconfig.json b/tsconfig.json index 7c0d752ff9..f55dd15b86 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,8 @@ "compilerOptions": { "moduleResolution": "node", "noImplicitAny": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, "module": "es6", "target": "ES2016", "allowJs": true, @@ -20,6 +22,7 @@ "dist", "jslib/dist", "build", + "build2", "build.safariextension", "coverage", "store", diff --git a/webpack2.js b/webpack2.js new file mode 100644 index 0000000000..3f9064a32d --- /dev/null +++ b/webpack2.js @@ -0,0 +1,150 @@ +const path = require('path'); +const webpack = require('webpack'); +const CleanWebpackPlugin = require('clean-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); + +const isVendorModule = (module) => { + if (!module.context) { + return false; + } + + const nodeModule = module.context.indexOf('node_modules') !== -1; + const bitwardenModule = module.context.indexOf('@bitwarden') !== -1; + return nodeModule && !bitwardenModule; +}; + +const extractCss = new ExtractTextPlugin({ + filename: '[name].css', + disable: false, + allChunks: true +}); + +module.exports = { + entry: { + 'popup/main': './src/popup2/main.ts', + 'background': './src/background.ts', + 'content/autofill': './src/content/autofill.js', + 'content/autofiller': './src/content/autofiller.js', + 'content/notificationBar': './src/content/notificationBar.js', + 'content/shortcuts': './src/content/shortcuts.js', + 'downloader/downloader': './src/downloader/downloader.ts', + '2fa/2fa': './src/2fa/2fa.ts', + }, + module: { + rules: [ + { + test: /\.ts$/, + enforce: 'pre', + loader: 'tslint-loader' + }, + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules\/(?!(@bitwarden)\/).*/ + }, + { + test: /\.(html)$/, + loader: 'html-loader' + }, + { + test: /.(ttf|otf|eot|svg|woff(2)?)(\?[a-z0-9]+)?$/, + exclude: /loading.svg/, + use: [{ + loader: 'file-loader', + options: { + name: '[name].[ext]', + outputPath: 'popup/fonts/', + publicPath: './fonts/' + } + }] + }, + { + test: /\.(jpe?g|png|gif|svg)$/i, + exclude: /.*(fontawesome-webfont|glyphicons-halflings-regular)\.svg/, + use: [{ + loader: 'file-loader', + options: { + name: '[name].[ext]', + outputPath: 'popup/images/', + publicPath: './images/' + } + }] + }, + { + test: /\.scss$/, + use: extractCss.extract({ + use: [ + { + loader: 'css-loader', + }, + { + loader: 'sass-loader', + } + ], + publicPath: '../' + }) + }, + ] + }, + plugins: [ + new CleanWebpackPlugin([ + path.resolve(__dirname, 'build2/*') + ]), + // ref: https://github.com/angular/angular/issues/20357 + new webpack.ContextReplacementPlugin( + /\@angular(\\|\/)core(\\|\/)esm5/, + path.resolve(__dirname, './src') + ), + new webpack.optimize.CommonsChunkPlugin({ + name: 'popup/vendor', + chunks: ['popup/main'], + minChunks: isVendorModule + }), + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + chunks: ['background'], + minChunks: isVendorModule + }), + new HtmlWebpackPlugin({ + template: './src/popup2/index.html', + filename: 'popup/index.html', + chunks: ['popup/vendor', 'popup/main', 'fonts'] + }), + new HtmlWebpackPlugin({ + template: './src/background.html', + filename: 'background.html', + chunks: ['vendor', 'background'] + }), + new HtmlWebpackPlugin({ + template: './src/downloader/index.html', + filename: 'downloader/index.html', + chunks: ['downloader/downloader'] + }), + new HtmlWebpackPlugin({ + template: './src/2fa/index.html', + filename: '2fa/index.html', + chunks: ['2fa/2fa'] + }), + new CopyWebpackPlugin([ + './src/manifest.json', + { from: './src/_locales', to: '_locales' }, + { from: './src/edge', to: 'edge' }, + { from: './src/safari', to: 'safari' }, + { from: './src/images', to: 'images' }, + { from: './src/content/autofill.css', to: 'content' } + ]), + extractCss + ], + resolve: { + extensions: ['.tsx', '.ts', '.js'], + alias: { + jslib: path.join(__dirname, 'jslib/src') + } + }, + output: { + filename: '[name].js', + path: path.resolve(__dirname, 'build2') + } +};