diff --git a/.gitignore b/.gitignore index 3bbf48e79..5016d71f6 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ npm-debug.log* coverage/ dist/ node_modules/ +src/environments tmp/ temp/ hooks/ diff --git a/package-lock.json b/package-lock.json index e4c1e23e8..200a6b00a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,27 +12,6 @@ "requires": { "@angular-devkit/core": "7.1.0", "rxjs": "6.3.3" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.0.tgz", - "integrity": "sha512-mR0YNRBEWfK3y5JfPmENw6Qy8kk6jaJTjDOso1uOwRKWQDe642tnK0P1HTmZ+WBgp+RhYD4pHbKePqOHw/tsdQ==", - "dev": true, - "requires": { - "ajv": "6.5.3", - "chokidar": "2.0.4", - "fast-json-stable-stringify": "2.0.0", - "rxjs": "6.3.3", - "source-map": "0.7.3" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "@angular-devkit/build-angular": { @@ -90,38 +69,10 @@ "webpack-subresource-integrity": "1.1.0-rc.6" }, "dependencies": { - "@angular-devkit/core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.0.tgz", - "integrity": "sha512-mR0YNRBEWfK3y5JfPmENw6Qy8kk6jaJTjDOso1uOwRKWQDe642tnK0P1HTmZ+WBgp+RhYD4pHbKePqOHw/tsdQ==", - "dev": true, - "requires": { - "ajv": "6.5.3", - "chokidar": "2.0.4", - "fast-json-stable-stringify": "2.0.0", - "rxjs": "6.3.3", - "source-map": "0.7.3" - } - }, - "opn": { - "version": "5.3.0", - "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true } } @@ -173,57 +124,26 @@ "@angular-devkit/architect": "0.11.0", "@angular-devkit/core": "7.1.0", "rxjs": "6.3.3" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.0.tgz", - "integrity": "sha512-mR0YNRBEWfK3y5JfPmENw6Qy8kk6jaJTjDOso1uOwRKWQDe642tnK0P1HTmZ+WBgp+RhYD4pHbKePqOHw/tsdQ==", - "dev": true, - "requires": { - "ajv": "6.5.3", - "chokidar": "2.0.4", - "fast-json-stable-stringify": "2.0.0", - "rxjs": "6.3.3", - "source-map": "0.7.3" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "@angular-devkit/core": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.2.tgz", - "integrity": "sha512-LyjHGuLnLWrgX7SYDkKmc3eW4H5uuaoC+CXYjRfgx3qundrLfvTCRgNGC6FPjhQNnVXH9qar+j9P1aMmKFb4Lw==", - "dev": true, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.0.tgz", + "integrity": "sha512-mR0YNRBEWfK3y5JfPmENw6Qy8kk6jaJTjDOso1uOwRKWQDe642tnK0P1HTmZ+WBgp+RhYD4pHbKePqOHw/tsdQ==", "requires": { "ajv": "6.5.3", "chokidar": "2.0.4", "fast-json-stable-stringify": "2.0.0", "rxjs": "6.3.3", "source-map": "0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "@angular-devkit/schematics": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.1.2.tgz", - "integrity": "sha512-NFhHLYWf9gpGQm0s19lq+nAw3CZ0udBpoBLzCm8Crlmu6+7aAXgw7Fv5P4ukWJ/e1m7NDGVids+B6kBGXaY6Ig==", - "dev": true, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.1.0.tgz", + "integrity": "sha512-MIK6eT3x6EppUcz7KFwJ63z3gUVmi5dQPiN8p+kTpHE2SorZCQvQ6+YKUMw9VZ6WLEQOZYJfoQozKyEWllNlsw==", "requires": { - "@angular-devkit/core": "7.1.2", + "@angular-devkit/core": "7.1.0", "rxjs": "6.3.3" } }, @@ -242,75 +162,29 @@ "opn": "5.3.0", "semver": "5.5.1", "symbol-observable": "1.2.0" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.0.tgz", - "integrity": "sha512-mR0YNRBEWfK3y5JfPmENw6Qy8kk6jaJTjDOso1uOwRKWQDe642tnK0P1HTmZ+WBgp+RhYD4pHbKePqOHw/tsdQ==", - "dev": true, - "requires": { - "ajv": "6.5.3", - "chokidar": "2.0.4", - "fast-json-stable-stringify": "2.0.0", - "rxjs": "6.3.3", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.1.0.tgz", - "integrity": "sha512-MIK6eT3x6EppUcz7KFwJ63z3gUVmi5dQPiN8p+kTpHE2SorZCQvQ6+YKUMw9VZ6WLEQOZYJfoQozKyEWllNlsw==", - "dev": true, - "requires": { - "@angular-devkit/core": "7.1.0", - "rxjs": "6.3.3" - } - }, - "opn": { - "version": "5.3.0", - "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "@angular/common": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.1.3.tgz", - "integrity": "sha512-4LnvTevDJW9Fmpmg6KeEyYcz8O4pS88nkm8FwKz+bkbFEiPz6tIxzhDlGuCAH0UmU4GojdWKMWhvLLvTEyCMpw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.1.4.tgz", + "integrity": "sha512-oQPCilcf1H/OXmt4z6PfGoCSb1YPRBAXGs/KRBARm3tYan2r5CmV0BFwpWXWQrEMt8YQqqLiBQUQ64d8+VFm8Q==", "requires": { "tslib": "^1.9.0" } }, "@angular/compiler": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.1.3.tgz", - "integrity": "sha512-uOcMyP9UBr7EkBWDMnGe/f3A1OidDt3Mq1TCp/8ETAxjerD7HxPJgdP0psBm85j6S5LorTUIOUm6ETfVP09E7A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.1.0.tgz", + "integrity": "sha512-1Hjx6e+lVXZyXFFe4OW34ZpiaGEYyB1MQ7k2C+cMm0ABMQS3LsWT4DYhY7bk0mmMuuXQj66C62MX76ladDtdIg==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "@angular/compiler-cli": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.1.3.tgz", - "integrity": "sha512-24r/7+qyXnDNsKWPxOnMECmncqc+Ucvd/clHHmEXX50EJOw8cA9odOJI1LnO+aWcMVRkjTidL6kVlagddkyOMg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.1.0.tgz", + "integrity": "sha512-Q42B3YmjMNYWTxTWfyDDFa6HSVqwY3rZO5Kp3Q/NKhQ6w/WddduxjARf/OCbtp0bVX3wZNObS6nO4H65rNCtsw==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -606,12 +480,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "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": "9.0.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", @@ -645,47 +513,52 @@ } }, "@angular/core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.1.3.tgz", - "integrity": "sha512-Vv2Eolb5fZZZLIyodazDTIH6l3wT0ss7oJq+op0aqfrH43HlZ1LkkoovPskX2w0Om9bzPfvfPz+fWm36WXrFyA==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.1.4.tgz", + "integrity": "sha512-36uWLrmmlzf8JKaq2A5F2tPQEHvFSsbTQWOT559Drp1tzM2uSA7PysNHv5TXUshDn5i54S2EQFm4bj2YPp4Hzg==", "requires": { "tslib": "^1.9.0" } }, + "@angular/fire": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/fire/-/fire-5.1.1.tgz", + "integrity": "sha512-QfLVEhZYW3+3fh2d1z76/vab1GkLnEQWzFQK06D1ZaT8jZsVEdFMIPr7GSTJWAuOdqBRYq14iqzqEkJH3WHzig==" + }, "@angular/forms": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.1.3.tgz", - "integrity": "sha512-gzXuQAaYQU2Gus8CZCyQtD/mzzxlgHvFtGRRNg9/UksekftVSk7/l+oj57NGMGh/0MF5rpRB3BYATZlF/TGHsw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.1.4.tgz", + "integrity": "sha512-YB2lDRe7aMsaO5ZlbeFZGH+uTQOcpotFDKCmTckpefRJ7id6TlUSBYdYRH80qOQfPJGpsnqQvLZkL24UMasKtQ==", "requires": { "tslib": "^1.9.0" } }, "@angular/http": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.1.0.tgz", - "integrity": "sha512-Je3D374ccxTFGpFu9tXi6k95vTaG+3jYYtEQ7i43CHbaGyHR/KwMEr8DEzrABd1zCSxBX71WwHuReG2wBANfcA==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.1.4.tgz", + "integrity": "sha512-Lrjb99sHu0Cv7MBbVLev1I1Fe+DJcwG4v7juZB/5nE5opKmbQo3Lfqvt2dVrMOxHeju9ReFznEnuGNMK6+m6pQ==", "requires": { "tslib": "^1.9.0" } }, "@angular/language-service": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.1.0.tgz", - "integrity": "sha512-dgYCD4Kw6j14hPykprSkMJNCo05dKu+JroMR84/PA/J+weN39nAUj4+/TV4oElbRK2Mr/xtHzSkb259y3Rwm/Q==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.1.4.tgz", + "integrity": "sha512-Pvrk3W3+6XfrmpCRcTumfyplv6AQJXKfDdPFSbhdpHJlpdcQRo6TckA85Yln5/CXZSAiPaZeiejQt2OogrIRLg==", "dev": true }, "@angular/platform-browser": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.1.3.tgz", - "integrity": "sha512-cGMPzsrKN6Gz9Ah5Jlp2lWe5Y+k1bCYug8Unnux9BHMpRo++RxYB8rOVK4kpmXQajOh5+NbXDzGEoZwMtlZWYQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.1.0.tgz", + "integrity": "sha512-kCrmaNZukWaXk6qlvzyE1Dln/YB2XOGbhb9e+y3NE94beCgDTWseKViMevIoGm/H+Lzf0I2RPg8GMKkQ7pQwNQ==", "requires": { "tslib": "^1.9.0" } }, "@angular/platform-browser-dynamic": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.1.3.tgz", - "integrity": "sha512-QjcRuGW3MEqaPrWp/4jxOvYevljb1Yjxo0p8xWbtrvL+YVteEVPDWNk4NtzHhQW9j6NzWEjnV5ocNx9I+anXeg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.1.0.tgz", + "integrity": "sha512-0yG6e/ZOI9LNUGgSjJ7xUWZhC41z87klO0oEHhEzQeaDxO/SOBasbMiws4ETuhulMgOR81UCAVobXMoOQJbfWg==", "requires": { "tslib": "^1.9.0" } @@ -700,48 +573,20 @@ "@schematics/angular": "7.1.0", "parse5-html-rewriting-stream": "5.1.0", "rxjs": "6.3.3" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.0.tgz", - "integrity": "sha512-mR0YNRBEWfK3y5JfPmENw6Qy8kk6jaJTjDOso1uOwRKWQDe642tnK0P1HTmZ+WBgp+RhYD4pHbKePqOHw/tsdQ==", - "requires": { - "ajv": "6.5.3", - "chokidar": "2.0.4", - "fast-json-stable-stringify": "2.0.0", - "rxjs": "6.3.3", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.1.0.tgz", - "integrity": "sha512-MIK6eT3x6EppUcz7KFwJ63z3gUVmi5dQPiN8p+kTpHE2SorZCQvQ6+YKUMw9VZ6WLEQOZYJfoQozKyEWllNlsw==", - "requires": { - "@angular-devkit/core": "7.1.0", - "rxjs": "6.3.3" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } } }, "@angular/router": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.1.3.tgz", - "integrity": "sha512-vQMUppMmBmUna/sU3tziy9Mqa8HCO/hAp2huTfSA/KF6y9gf1B4J/pISOrHizXL32PisU8Vi0bw+pfIeW/nbQw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.1.0.tgz", + "integrity": "sha512-yrjNvCj7XbXmZSmQfXGEkWJ9ogRZmIk5GHyOfGKNNRXhQK2OBznY0Avyer2r3mcgV/RLrI1FYQyKN9mdLftf6g==", "requires": { "tslib": "^1.9.0" } }, "@angular/service-worker": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-7.1.0.tgz", - "integrity": "sha512-lmeJl8JDvmtDFM7h1gUs8vVsJhMuRKakBIwtQTWEX8TYRh/6fZCObHNjoGGps3BAPrgAbCyxJE2g3rhb/Y4YqA==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-7.1.4.tgz", + "integrity": "sha512-PpR+Y1U1lpiRjH4PH+bbW0ccIV1AyB1lCTfZBa5NvDqUnJ7/df91RVzlCweCL2d187wOYgd2MSfzvDzSdl0Hvw==", "requires": { "tslib": "^1.9.0" } @@ -756,12 +601,12 @@ } }, "@babel/generator": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.6.tgz", - "integrity": "sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz", + "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==", "dev": true, "requires": { - "@babel/types": "^7.1.6", + "@babel/types": "^7.2.2", "jsesc": "^2.5.1", "lodash": "^4.17.10", "source-map": "^0.5.0", @@ -773,6 +618,12 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -825,43 +676,43 @@ } }, "@babel/parser": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz", - "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz", + "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==", "dev": true }, "@babel/template": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", - "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", + "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.1.2", - "@babel/types": "^7.1.2" + "@babel/parser": "^7.2.2", + "@babel/types": "^7.2.2" } }, "@babel/traverse": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", - "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", + "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.1.6", + "@babel/generator": "^7.2.2", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.1.6", - "@babel/types": "^7.1.6", + "@babel/parser": "^7.2.3", + "@babel/types": "^7.2.2", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.10" }, "dependencies": { "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -882,9 +733,9 @@ } }, "@babel/types": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.6.tgz", - "integrity": "sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz", + "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -900,12 +751,210 @@ } } }, + "@firebase/app": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.3.5.tgz", + "integrity": "sha512-DaAlb74yzwXbkFXvfsUVFeurSETPJAvKNtVpAKlS6RThyD+Y+ci1/8JVw4INm2hihbj/edxlAUelg9eoOZNCKA==", + "requires": { + "@firebase/app-types": "0.3.2", + "@firebase/util": "0.2.3", + "dom-storage": "2.1.0", + "tslib": "1.9.0", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + } + } + }, + "@firebase/app-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.3.2.tgz", + "integrity": "sha512-ZD8lTgW07NGgo75bTyBJA8Lt9+NweNzot7lrsBtIvfciwUzaFJLsv2EShqjBeuhF7RpG6YFucJ6m67w5buCtzw==" + }, + "@firebase/auth": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.9.1.tgz", + "integrity": "sha512-kiJtKXzM7DD1UNTdWcMmmRoU4LBX95JPWgCUN6nzumO1Ed+1izsgE4OwYVbZo+inSlOp6au0JTJrecsHHBemug==", + "requires": { + "@firebase/auth-types": "0.5.0" + } + }, + "@firebase/auth-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.5.0.tgz", + "integrity": "sha512-DSjtsIjTy5RSiWyGHqiGkLcDgEgFEf2aD2O0t/0+lHmAzxUGrJFO5+IkPNV6i0ffmtiJaXQDJ7z7q4OdypDBCg==" + }, + "@firebase/database": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.3.8.tgz", + "integrity": "sha512-y+QJjxC62triL1g6e58sapkGKegvbNIp3hOttE6olYG/zzb+U4Q7lUbYjtMkVpGWKYSsQOPu8JkH3FNhFvX95Q==", + "requires": { + "@firebase/database-types": "0.3.2", + "@firebase/logger": "0.1.2", + "@firebase/util": "0.2.3", + "faye-websocket": "0.11.1", + "tslib": "1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + } + } + }, + "@firebase/database-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.3.2.tgz", + "integrity": "sha512-9ZYdvYQ6r3aaHJarhUM5Hf6lQWu3ZJme+RR0o8qfBb9L04TL3uNjt+AJFku1ysVPntTn+9GqJjiIB2/OC3JtwA==" + }, + "@firebase/firestore": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-0.9.2.tgz", + "integrity": "sha512-a4T0JOJSS7XjQux9Dclw1hBcPZ61k3mbLHckKtZ/W7UE4nGcZcSGdwnNtQp9Mv6RuRnbGH6x364C7iiGq2hwSg==", + "requires": { + "@firebase/firestore-types": "0.8.0", + "@firebase/logger": "0.1.2", + "@firebase/webchannel-wrapper": "0.2.11", + "grpc": "1.16.1", + "tslib": "1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + } + } + }, + "@firebase/firestore-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-0.8.0.tgz", + "integrity": "sha512-FdLy2TbZ6aAeT9eDmVMPAFsUqhjN2e+jcdVpl0Pz1W6ElRWWyr30hgTY7xIqIKpMs1iT6IF/8w9CKvI6fPbKxA==" + }, + "@firebase/functions": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.3.3.tgz", + "integrity": "sha512-t8CE1AQivqWeDJ1MvaITGn+x6Z78CVnJi3mLz/+2Vx7UwU4HRhkfJcxhrRnnMzWY9OoCJ9j1wUoDsXfKmU546w==", + "requires": { + "@firebase/functions-types": "0.2.1", + "@firebase/messaging-types": "0.2.3", + "isomorphic-fetch": "2.2.1", + "tslib": "1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + } + } + }, + "@firebase/functions-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.2.1.tgz", + "integrity": "sha512-hH78lgDoa5E1peBSXnfQyshENmh/5a8aia+S4Ocjc53OUWRJ4VqYwWUV5gE4b2mqVKTpN4akJccLq2pCnNGZcA==" + }, + "@firebase/logger": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.2.tgz", + "integrity": "sha512-4NHGRIbZChg9vDUxynzYrw14G/U/71v0pea+jXPicrpflL0N0PSCULXGGSTmzn9fqZ5W5djEwVLBCVwKndXG8w==" + }, + "@firebase/messaging": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.3.7.tgz", + "integrity": "sha512-8tZgRVJuvmFe5HDUiKvGAsK/jehrMnoUx95XU3RkZHX2D5QHjXAvvXIfFQ118EtG5/whZoEo1nCjEHAd9mSalA==", + "requires": { + "@firebase/messaging-types": "0.2.3", + "@firebase/util": "0.2.3", + "tslib": "1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + } + } + }, + "@firebase/messaging-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.2.3.tgz", + "integrity": "sha512-avwCgZzcx2uxIW/wT3p3G/EyHftIrvMyiTS7AA7dxDlzfx+8dpAeTsb1+jsHJT4F6foSh5HG17Nw8sDzYuxH1Q==" + }, + "@firebase/polyfill": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.3.tgz", + "integrity": "sha512-xs8IZf1WEbufYXyfV8YjmiFZOaujRRq0T03NteihYfuGVTTym7z5SmvLvEHLEUjf2fgeobPEzZ2JgrCQHS+QHw==", + "requires": { + "core-js": "2.5.5", + "promise-polyfill": "7.1.2", + "whatwg-fetch": "2.0.4" + }, + "dependencies": { + "core-js": { + "version": "2.5.5", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + } + } + }, + "@firebase/storage": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.2.4.tgz", + "integrity": "sha512-uqA6CoZYkugk69ImqB16VBPP7JRPRfZwcUP9CsE0GPVGQkZQQfBGwzIyEoFA8lUfVLrvxQiL0sQvHUXZ945LMg==", + "requires": { + "@firebase/storage-types": "0.2.3", + "tslib": "1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + } + } + }, + "@firebase/storage-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.2.3.tgz", + "integrity": "sha512-RaZeam2LgsB7xwAtOQr4G0Geoyf7D5TnLF3a12By6Rh0Z9PqBSlWn0SVYGW3SkmxIdqvWZMZvCyamUlqQvQzWw==" + }, + "@firebase/util": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.3.tgz", + "integrity": "sha512-ngAG4qYpcnnshUKbBlEiR9+j37U7dTrTVJlS4v7ahW1ROuyLT9xj6cWyHQANzcTR2yKLmEv3yfwoZwedz7V0oQ==", + "requires": { + "tslib": "1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + } + } + }, + "@firebase/webchannel-wrapper": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.11.tgz", + "integrity": "sha512-WyMXDxk/WZ+f2lOCeEvDWUce2f5Kk2sNfvArK8f+PlUnzFdy/MBzLXrmbMgyZXP7GP4ooUxYV8Sdmoh1hGk1Uw==" + }, "@ionic-native/core": { "version": "5.0.0-beta.15", "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.0.0-beta.15.tgz", "integrity": "sha512-71Fiy/UlchvjkWpRaZ90E9hrrf+v/x+CCl6JPGg3nLGYqrVtja5xJCU0jVsGQMrYdgfcwK9d1KLC/3GPvOQK1w==", "requires": { - "@types/cordova": "0.0.34" + "@types/cordova": "^0.0.34" } }, "@ionic-native/in-app-browser": { @@ -913,7 +962,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/in-app-browser/-/in-app-browser-5.0.0-beta.15.tgz", "integrity": "sha512-C6OO6SUwKeTsDeyN1DpTgCidrcPo1Ny2HOYQpAG4/8Wlkbl0R2Z3vK63wZuRf3hR+4VNge/SRWsXT6qRTFPa8g==", "requires": { - "@types/cordova": "0.0.34" + "@types/cordova": "^0.0.34" } }, "@ionic-native/splash-screen": { @@ -921,7 +970,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/splash-screen/-/splash-screen-5.0.0-beta.15.tgz", "integrity": "sha512-ZoMw1kmTtKP0ylmtkr5KyJtmrUnJbtO+DIeUp7R/58wdKlvY7nq/y5oNAdmJKuJ6Oe88LqpTz5jm+V2DzXr/gA==", "requires": { - "@types/cordova": "0.0.34" + "@types/cordova": "^0.0.34" } }, "@ionic-native/status-bar": { @@ -929,16 +978,15 @@ "resolved": "https://registry.npmjs.org/@ionic-native/status-bar/-/status-bar-5.0.0-beta.15.tgz", "integrity": "sha512-FSKOCeLq8H9JvdjY7v4wYJCK8Lj/PAnDc+ddvA1j9u2vXOMDABnpTXc+WLssBf3El9n9LPHNa+Kk0nsxV02obA==", "requires": { - "@types/cordova": "0.0.34" + "@types/cordova": "^0.0.34" } }, "@ionic/angular": { - "version": "4.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-4.0.0-beta.19.tgz", - "integrity": "sha512-yDXx6tduSW9DliplVQv0xnTrxyCFltk3PcKkQDWKCcIwd5nsfPg/5ZcoM3CHKNmmp5mkDljdz8IxCR3VEvdcgQ==", + "version": "4.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-4.0.0-beta.16.tgz", + "integrity": "sha512-JrU1r0+tRw9IMy3+4dr3ikPwZSkYryGzrj9k3izAT4ex24V5wQxO4HUgUe6mz4deWcAKGryNkbU0s+XfSDkceg==", "requires": { - "@ionic/core": "4.0.0-beta.19", - "tslib": "^1.9.3" + "@ionic/core": "4.0.0-beta.16" } }, "@ionic/angular-toolkit": { @@ -950,105 +998,15 @@ "@schematics/angular": "^7.0.3", "tslib": "^1.9.0", "typescript": "^3.1.5" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.0.6.tgz", - "integrity": "sha512-RPSXUtLrpYDTqAEL0rCyDKxES76EomsPBvUUZTD6UkE2pihoh9ZIxkzhzlE+HU/xdqm28+smQYFhvvEAXFWwSQ==", - "dev": true, - "requires": { - "ajv": "6.5.3", - "chokidar": "2.0.4", - "fast-json-stable-stringify": "2.0.0", - "rxjs": "6.3.3", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.0.6.tgz", - "integrity": "sha512-S/3CrBDoh/BD4mBq8RNGQ8sgNFDsveCuFHDkOyct8+NDg2wcRkEGigyq8eZwVN/iVKCwjxc0I/bC336edoNMIQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "7.0.6", - "rxjs": "6.3.3" - } - }, - "@schematics/angular": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.0.6.tgz", - "integrity": "sha512-jOHL+vSu1cqAo3kRNDmgkq/GR2EDkJx5/h0VXGlbtdEpq892LipKHtyPgXa269AABgPKb3TSNBwZls6g2L9FCw==", - "dev": true, - "requires": { - "@angular-devkit/core": "7.0.6", - "@angular-devkit/schematics": "7.0.6", - "typescript": "3.1.6" - } - }, - "ajv": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", - "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "typescript": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz", - "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } } }, "@ionic/cli-framework": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-1.3.0.tgz", - "integrity": "sha512-hJVWOqZVJXD0pa1amVFPlX7emXdEM6YpbllXkMQwYSubt9TXPRgUboC3JYxvwEfTscnvWO5OnKGZ29f0/zpTQg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-1.5.1.tgz", + "integrity": "sha512-O979w3XRftVfhiQJXv6c2IaOM4mY7z/8BOu54dR2ZJ/zYir6QW65loq6XQ373AqxoQpMc1xHMZqpYyTTVTScRw==", "dev": true, "requires": { - "@ionic/utils-fs": "0.0.4", + "@ionic/utils-fs": "0.0.6", "chalk": "^2.3.0", "debug": "^4.0.0", "inquirer": "^6.0.0", @@ -1058,9 +1016,9 @@ "rimraf": "^2.6.2", "slice-ansi": "^2.0.0", "stream-combiner2": "^1.1.1", - "string-width": "^2.1.1", + "string-width": "^3.0.0", "strip-ansi": "^5.0.0", - "tree-kill": "1.2.0", + "tree-kill": "1.2.1", "tslib": "^1.9.0", "untildify": "^3.0.2", "wrap-ansi": "^4.0.0", @@ -1068,15 +1026,15 @@ }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", "dev": true }, "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -1101,24 +1059,14 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", + "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "strip-ansi": "^5.0.0" } }, "strip-ansi": { @@ -1128,20 +1076,12 @@ "dev": true, "requires": { "ansi-regex": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", - "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==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", "dev": true }, "wrap-ansi": { @@ -1155,6 +1095,22 @@ "strip-ansi": "^4.0.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -1169,21 +1125,29 @@ } }, "@ionic/core": { - "version": "4.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-4.0.0-beta.19.tgz", - "integrity": "sha512-v9Bddlws7+1zpiPblgNQBzCFBrEMtkii+AUPJ+/fSb0uIuDTGlRKPfHrRscxnSgGOch+leOArFQ4N3WBrZZmFQ==", + "version": "4.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-4.0.0-beta.16.tgz", + "integrity": "sha512-dZxJV30uOchQKZWY51ejhayIhg/dZR1dYY6agrBB/sGAZhNEwWgc5tV6IbpQvzx3rSXb9kJi7lZRs/bM9ztoYw==", "requires": { - "ionicons": "4.5.0" + "@types/node": "10.11.0", + "ionicons": "4.4.7" + }, + "dependencies": { + "@types/node": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.0.tgz", + "integrity": "sha512-R4Dvw6KjSYn/SpvjRchBOwXr14vVVcFXCtnM3f0aLvlJS8a599rrcEoihcP2/+Z/f75E5GNPd4aWM7j1yei9og==" + } } }, "@ionic/lab": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@ionic/lab/-/lab-1.0.13.tgz", - "integrity": "sha512-pnYgzfPPdAs3Z9snhHGDaAm2i3Fj0s1K6eAVbCH9hfUE8slv8DTjlcYO2FLDQ0JlFwEaAtL+zXp4guMK/TEWiw==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@ionic/lab/-/lab-1.0.16.tgz", + "integrity": "sha512-I9AzTdZeLTQM0rGpLMv5kYagqfP708jz6IVpLe3O5GI4wHgK7MWR/2PekOhz3QhzAxKcm/i5UcbbAkolWPtKnw==", "dev": true, "requires": { - "@ionic/cli-framework": "1.3.0", - "@ionic/utils-fs": "0.0.4", + "@ionic/cli-framework": "1.5.1", + "@ionic/utils-fs": "0.0.6", "chalk": "^2.3.0", "express": "^4.16.2", "tslib": "^1.9.0" @@ -1200,21 +1164,21 @@ } }, "@ionic/utils-fs": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-0.0.4.tgz", - "integrity": "sha512-eipaSkrX3ODCQzGKxFgruq2J28RoEm+JC0jJv5S64OXATxsnbwuReTmA2EMJyevLJrORWM0yvsgqmiLHH5VYJg==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-0.0.6.tgz", + "integrity": "sha512-/7EbKNbKiRK1C+WuZ/omgD/XaUZeE/CUXtlMAHeGb3pIilcRF+xwMvLu6Vt63O+EwZ/nSIRQI7nb5YP0yUhkUg==", "dev": true, "requires": { "debug": "^4.0.0", "ncp": "^2.0.0", - "through2": "^2.0.3", + "through2": "^3.0.0", "tslib": "^1.9.0" }, "dependencies": { "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -1225,6 +1189,16 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true + }, + "through2": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz", + "integrity": "sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ==", + "dev": true, + "requires": { + "readable-stream": "2 || 3", + "xtend": "~4.0.1" + } } } }, @@ -1241,27 +1215,6 @@ "webpack-sources": "1.2.0" }, "dependencies": { - "@angular-devkit/core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.0.tgz", - "integrity": "sha512-mR0YNRBEWfK3y5JfPmENw6Qy8kk6jaJTjDOso1uOwRKWQDe642tnK0P1HTmZ+WBgp+RhYD4pHbKePqOHw/tsdQ==", - "dev": true, - "requires": { - "ajv": "6.5.3", - "chokidar": "2.0.4", - "fast-json-stable-stringify": "2.0.0", - "rxjs": "6.3.3", - "source-map": "0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1288,34 +1241,6 @@ "@angular-devkit/core": "7.1.0", "@angular-devkit/schematics": "7.1.0", "typescript": "3.1.6" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.0.tgz", - "integrity": "sha512-mR0YNRBEWfK3y5JfPmENw6Qy8kk6jaJTjDOso1uOwRKWQDe642tnK0P1HTmZ+WBgp+RhYD4pHbKePqOHw/tsdQ==", - "requires": { - "ajv": "6.5.3", - "chokidar": "2.0.4", - "fast-json-stable-stringify": "2.0.0", - "rxjs": "6.3.3", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.1.0.tgz", - "integrity": "sha512-MIK6eT3x6EppUcz7KFwJ63z3gUVmi5dQPiN8p+kTpHE2SorZCQvQ6+YKUMw9VZ6WLEQOZYJfoQozKyEWllNlsw==", - "requires": { - "@angular-devkit/core": "7.1.0", - "rxjs": "6.3.3" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } } }, "@schematics/update": { @@ -1332,43 +1257,6 @@ "rxjs": "6.3.3", "semver": "5.5.1", "semver-intersect": "1.4.0" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.0.tgz", - "integrity": "sha512-mR0YNRBEWfK3y5JfPmENw6Qy8kk6jaJTjDOso1uOwRKWQDe642tnK0P1HTmZ+WBgp+RhYD4pHbKePqOHw/tsdQ==", - "dev": true, - "requires": { - "ajv": "6.5.3", - "chokidar": "2.0.4", - "fast-json-stable-stringify": "2.0.0", - "rxjs": "6.3.3", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.1.0.tgz", - "integrity": "sha512-MIK6eT3x6EppUcz7KFwJ63z3gUVmi5dQPiN8p+kTpHE2SorZCQvQ6+YKUMw9VZ6WLEQOZYJfoQozKyEWllNlsw==", - "dev": true, - "requires": { - "@angular-devkit/core": "7.1.0", - "rxjs": "6.3.3" - } - }, - "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "@types/cordova": { @@ -1404,9 +1292,9 @@ "dev": true }, "@types/selenium-webdriver": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.13.tgz", - "integrity": "sha512-rI0LGoMiZGUM+tjDakQpwZOvcmQoubiJ7hxqrYU12VRxBuGGvOThxrBOU/QmJKlKg1WG6FMzuvcEyLffvVSsmw==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.14.tgz", + "integrity": "sha512-4GbNCDs98uHCT/OMv40qQC/OpoPbYn9XdXeTiFwHBBFO6eJhYEPUu2zDKirXSbHlvDV8oZ9l8EQ+HrEx/YS9DQ==", "dev": true }, "@webassemblyjs/ast": { @@ -1682,9 +1570,9 @@ } }, "ajv-errors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", - "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "dev": true }, "ajv-keywords": { @@ -1699,10 +1587,18 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "angularfire2": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/angularfire2/-/angularfire2-5.1.1.tgz", + "integrity": "sha512-xW37qu3y9yZyqEYF/j2CIMaavwaufhlESfVKQ6FVCcSI2XaZ7bwlNwLJ6AIMyUL2uuf5P+iHyh9HnnJJkmCyFQ==", + "requires": { + "@angular/fire": "5.1.1" + } + }, "ansi-colors": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.1.tgz", - "integrity": "sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, "ansi-escapes": { @@ -1720,8 +1616,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.1", @@ -1804,9 +1699,9 @@ "optional": true }, "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, "array-slice": { @@ -1854,6 +1749,15 @@ "dev": true, "optional": true }, + "ascli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", + "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", + "requires": { + "colour": "~0.7.1", + "optjs": "~3.2.2" + } + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -2010,7 +1914,7 @@ }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } @@ -2030,6 +1934,14 @@ "lodash": "^4.17.4", "source-map": "^0.5.7", "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "babel-messages": { @@ -2108,8 +2020,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -2275,6 +2186,17 @@ "qs": "6.5.2", "raw-body": "2.3.3", "type-is": "~1.6.16" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "bonjour": { @@ -2295,7 +2217,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2406,14 +2327,14 @@ } }, "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.6.tgz", + "integrity": "sha512-kMGKs4BTzRWviZ8yru18xBpx+CyHG9eqgRbj9XbE3IMgtczf4aiA0Y1YCpVdvUieKGZ03kolSPXqTcscBCb9qw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000899", - "electron-to-chromium": "^1.3.82", - "node-releases": "^1.0.1" + "caniuse-lite": "^1.0.30000921", + "electron-to-chromium": "^1.3.92", + "node-releases": "^1.1.1" } }, "browserstack": { @@ -2434,14 +2355,6 @@ "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } } }, "buffer-alloc": { @@ -2502,6 +2415,14 @@ "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", "dev": true }, + "bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "requires": { + "long": "~3" + } + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -2527,6 +2448,14 @@ "ssri": "^5.2.4", "unique-filename": "^1.1.0", "y18n": "^4.0.0" + }, + "dependencies": { + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + } } }, "cache-base": { @@ -2554,9 +2483,7 @@ "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true, - "optional": true + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" }, "camelcase-keys": { "version": "2.1.0", @@ -2570,9 +2497,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000910", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000910.tgz", - "integrity": "sha512-u/nxtHGAzCGZzIxt3dA/tpSPOcirBZFWKwz1EPz4aaupnBI2XR0Rbr74g0zc6Hzy41OEM4uMoZ38k56TpYAWjQ==", + "version": "1.0.30000925", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000925.tgz", + "integrity": "sha512-zcYupoUxtW46rOikuDF7vfL9N1Qe9ZuUBTz3n3q8fFsoJIs/h9UN6Vg/0QpjsmvImXw9mVc3g+ZBfqvUz/iALA==", "dev": true }, "canonical-path": { @@ -2724,7 +2651,6 @@ "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.1", "strip-ansi": "^3.0.1", @@ -2758,8 +2684,7 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codelyzer": { "version": "4.5.0", @@ -2775,10 +2700,16 @@ "sprintf-js": "^1.1.1" }, "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true } } @@ -2813,6 +2744,11 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, + "colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" + }, "combine-lists": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", @@ -2893,12 +2829,11 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "resolved": "http://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { @@ -2972,7 +2907,7 @@ }, "content-disposition": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "resolved": "http://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", "dev": true }, @@ -3039,17 +2974,40 @@ } }, "cordova-android": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-7.0.0.tgz", - "integrity": "sha1-yVvt/PvDhjsYDE0p7/7E95Nh0Z0=", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-7.1.4.tgz", + "integrity": "sha512-Rtvu002I83uzfVyCsE6p2krFKVHt9TSAqZUATes+zH+o9cdxYGrLHY+PKCQo4SLCdSMdrkIHCDnQPTYTp/d7+g==", "requires": { - "android-versions": "^1.2.1", - "cordova-common": "^2.2.0", + "abbrev": "*", + "android-versions": "1.4.0", + "ansi": "*", + "balanced-match": "*", + "base64-js": "1.2.0", + "big-integer": "1.6.32", + "bplist-parser": "*", + "brace-expansion": "*", + "concat-map": "*", + "cordova-common": "2.2.5", + "cordova-registry-mapper": "*", "elementtree": "0.1.6", - "nopt": "^3.0.1", - "properties-parser": "^0.2.3", - "q": "^1.4.1", - "shelljs": "^0.5.3" + "glob": "5.0.15", + "inflight": "*", + "inherits": "*", + "minimatch": "*", + "nopt": "3.0.1", + "once": "*", + "path-is-absolute": "1.0.1", + "plist": "2.1.0", + "properties-parser": "0.2.3", + "q": "1.4.1", + "sax": "0.3.5", + "semver": "5.5.0", + "shelljs": "0.5.3", + "underscore": "*", + "unorm": "*", + "wrappy": "*", + "xmlbuilder": "8.2.2", + "xmldom": "*" }, "dependencies": { "abbrev": { @@ -3057,8 +3015,11 @@ "bundled": true }, "android-versions": { - "version": "1.2.1", - "bundled": true + "version": "1.4.0", + "bundled": true, + "requires": { + "semver": "^5.4.1" + } }, "ansi": { "version": "0.3.1", @@ -3069,11 +3030,11 @@ "bundled": true }, "base64-js": { - "version": "0.0.8", + "version": "1.2.0", "bundled": true }, "big-integer": { - "version": "1.6.26", + "version": "1.6.32", "bundled": true }, "bplist-parser": { @@ -3084,7 +3045,7 @@ } }, "brace-expansion": { - "version": "1.1.8", + "version": "1.1.11", "bundled": true, "requires": { "balanced-match": "^1.0.0", @@ -3096,7 +3057,7 @@ "bundled": true }, "cordova-common": { - "version": "2.2.0", + "version": "2.2.5", "bundled": true, "requires": { "ansi": "^0.3.1", @@ -3105,10 +3066,8 @@ "elementtree": "0.1.6", "glob": "^5.0.13", "minimatch": "^3.0.0", - "osenv": "^0.1.3", - "plist": "^1.2.0", + "plist": "^2.1.0", "q": "^1.4.1", - "semver": "^5.0.1", "shelljs": "^0.5.3", "underscore": "^1.8.3", "unorm": "^1.3.3" @@ -3148,10 +3107,6 @@ "version": "2.0.3", "bundled": true }, - "lodash": { - "version": "3.10.1", - "bundled": true - }, "minimatch": { "version": "3.0.4", "bundled": true, @@ -3160,7 +3115,7 @@ } }, "nopt": { - "version": "3.0.6", + "version": "3.0.1", "bundled": true, "requires": { "abbrev": "1" @@ -3173,33 +3128,16 @@ "wrappy": "1" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "path-is-absolute": { "version": "1.0.1", "bundled": true }, "plist": { - "version": "1.2.0", + "version": "2.1.0", "bundled": true, "requires": { - "base64-js": "0.0.8", - "util-deprecate": "1.0.2", - "xmlbuilder": "4.0.0", + "base64-js": "1.2.0", + "xmlbuilder": "8.2.2", "xmldom": "0.1.x" } }, @@ -3208,7 +3146,7 @@ "bundled": true }, "q": { - "version": "1.5.1", + "version": "1.4.1", "bundled": true }, "sax": { @@ -3216,7 +3154,7 @@ "bundled": true }, "semver": { - "version": "5.4.1", + "version": "5.5.0", "bundled": true }, "shelljs": { @@ -3224,27 +3162,20 @@ "bundled": true }, "underscore": { - "version": "1.8.3", + "version": "1.9.1", "bundled": true }, "unorm": { "version": "1.4.1", "bundled": true }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, "wrappy": { "version": "1.0.2", "bundled": true }, "xmlbuilder": { - "version": "4.0.0", - "bundled": true, - "requires": { - "lodash": "^3.5.0" - } + "version": "8.2.2", + "bundled": true }, "xmldom": { "version": "0.1.27", @@ -3297,49 +3228,41 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "bundled": true }, "ansi": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" + "bundled": true }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "bundled": true }, "base64-js": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", - "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=" + "bundled": true }, "big-integer": { "version": "1.6.32", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.32.tgz", - "integrity": "sha512-ljKJdR3wk9thHfLj4DtrNiOSTxvGFaMjWrG4pW75juXC4j7+XuKJVFdg4kgFMYp85PVkO05dFMj2dk2xVsH4xw==" + "bundled": true }, "bplist-creator": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz", - "integrity": "sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU=", + "bundled": true, "requires": { "stream-buffers": "~2.2.0" } }, "bplist-parser": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", - "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=", + "bundled": true, "requires": { "big-integer": "^1.6.7" } }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "bundled": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3347,13 +3270,11 @@ }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "bundled": true }, "cordova-common": { "version": "2.2.5", - "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-2.2.5.tgz", - "integrity": "sha1-+TzvKtSUz8v1bEbj1hKqqctfzDI=", + "bundled": true, "requires": { "ansi": "^0.3.1", "bplist-parser": "^0.1.0", @@ -3370,21 +3291,18 @@ }, "cordova-registry-mapper": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/cordova-registry-mapper/-/cordova-registry-mapper-1.1.15.tgz", - "integrity": "sha1-4kS5GFuBdUc7/2B5MkkFEV+D3Hw=" + "bundled": true }, "elementtree": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.6.tgz", - "integrity": "sha1-KsTEbqMFFsjEy9teOsdBjlkt4gw=", + "bundled": true, "requires": { "sax": "0.3.5" } }, "glob": { "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "bundled": true, "requires": { "inflight": "^1.0.4", "inherits": "2", @@ -3395,8 +3313,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3404,13 +3321,11 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "bundled": true }, "ios-sim": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/ios-sim/-/ios-sim-6.1.3.tgz", - "integrity": "sha512-xnpRKFH8ytVuSs+qlfBttVjNqFRovONT+K940518eVXWC151AJbzC6L0TCGnxyMPF5ghVCGcyGterfMOJKVb3w==", + "bundled": true, "requires": { "bplist-parser": "^0.0.6", "nopt": "1.0.9", @@ -3420,13 +3335,11 @@ "dependencies": { "bplist-parser": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.0.6.tgz", - "integrity": "sha1-ONo0cYF9+dRKs4kuJ3B7u9daEbk=" + "bundled": true }, "nopt": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.9.tgz", - "integrity": "sha1-O8DXy6e/sNWmdtvtfA6+SKT9RU4=", + "bundled": true, "requires": { "abbrev": "1" } @@ -3435,37 +3348,32 @@ }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "requires": { "brace-expansion": "^1.1.7" } }, "nopt": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "bundled": true, "requires": { "abbrev": "1" } }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "requires": { "wrappy": "1" } }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "bundled": true }, "plist": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz", - "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=", + "bundled": true, "requires": { "base64-js": "1.2.0", "xmlbuilder": "8.2.2", @@ -3474,23 +3382,19 @@ }, "q": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + "bundled": true }, "sax": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.3.5.tgz", - "integrity": "sha1-iPz8H3PAyLvVt8d2ttPzUB7tBz0=" + "bundled": true }, "shelljs": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", - "integrity": "sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM=" + "bundled": true }, "simctl": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/simctl/-/simctl-1.1.1.tgz", - "integrity": "sha512-yY1WQMq/pneY5jQb2+lFp45qEtcz4yKBu1NOPo2OFDVCkwSkQhpkoaAaO1fWhq4IU0+8TQ2r1PMGSTedP0A/Og==", + "bundled": true, "requires": { "shelljs": "^0.2.6", "tail": "^0.4.0" @@ -3498,15 +3402,13 @@ "dependencies": { "shelljs": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz", - "integrity": "sha1-kEktcv/MgVmXa6umL7D2iE8MM3g=" + "bundled": true } } }, "simple-plist": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-0.2.1.tgz", - "integrity": "sha1-cXZts1IyaSjPOoByQrp2IyJjZyM=", + "bundled": true, "requires": { "bplist-creator": "0.0.7", "bplist-parser": "0.1.1", @@ -3515,13 +3417,11 @@ "dependencies": { "base64-js": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.1.2.tgz", - "integrity": "sha1-1kAMrBxMZgl22Q0HoENR2JOV9eg=" + "bundled": true }, "plist": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-2.0.1.tgz", - "integrity": "sha1-CjLKlIGxw2TpLhjcVch23p0B2os=", + "bundled": true, "requires": { "base64-js": "1.1.2", "xmlbuilder": "8.2.2", @@ -3532,38 +3432,31 @@ }, "stream-buffers": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" + "bundled": true }, "tail": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/tail/-/tail-0.4.0.tgz", - "integrity": "sha1-0p3nJ1DMmdseBTr/E8NZ7PtxMAI=" + "bundled": true }, "underscore": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + "bundled": true }, "unorm": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", - "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=" + "bundled": true }, "uuid": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" + "bundled": true }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "bundled": true }, "xcode": { "version": "0.9.3", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-0.9.3.tgz", - "integrity": "sha1-kQqJwWrubMC0LKgFptC0z4chHPM=", + "bundled": true, "requires": { "pegjs": "^0.10.0", "simple-plist": "^0.2.1", @@ -3572,18 +3465,15 @@ }, "xml-escape": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.1.0.tgz", - "integrity": "sha1-OQTBQ/qOs6ADDsZG0pAqLxtwbEQ=" + "bundled": true }, "xmlbuilder": { "version": "8.2.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", - "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=" + "bundled": true }, "xmldom": { "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + "bundled": true } } }, @@ -3603,9 +3493,9 @@ "integrity": "sha512-6ucQ6FdlLdBm8kJfFnzozmBTjru/0xekHP/dAhjoCZggkGRlgs8TsUJFkxa/bV+qi7Dlo50JjmpE4UMWAO+aOQ==" }, "cordova-plugin-ionic-webview": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-2.2.3.tgz", - "integrity": "sha512-U6ufU5VVwDZuRvv9MwFixAu37r5VnXoi15T/Fg29BTGZJRZKnQ9lsJfVKtm/uLp4ITc85/3RBubOyUkRE/SOuQ==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-2.3.1.tgz", + "integrity": "sha512-tGKRp2iEYbOwZ2sT/uBU2C1YW1a43QI3YGi4WMH4LsgUdDjYGj4OZ8o7xQtRlxOKpdAjtSyLn1wz3Jip04elMg==" }, "cordova-plugin-splashscreen": { "version": "5.0.2", @@ -3623,9 +3513,9 @@ "integrity": "sha1-tehezbv+Wu3tQKG/TuI3LmfZb7Q=" }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.1.tgz", + "integrity": "sha512-L72mmmEayPJBejKIWe2pYtGis5r0tQ5NaJekdhyXgeMQTpJoBsH0NL4ElY2LfSoV15xeQWKQ+XTTOZdyero5Xg==" }, "core-util-is": { "version": "1.0.2", @@ -3809,8 +3699,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -4055,6 +3944,11 @@ "void-elements": "^2.0.0" } }, + "dom-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", + "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -4099,9 +3993,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz", - "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw==", + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.96.tgz", + "integrity": "sha512-ZUXBUyGLeoJxp4Nt6G/GjBRLnyz8IKQGexZ2ndWaoegThgMGFO1tdDYID5gBV32/1S83osjJHyfzvanE/8HY4Q==", "dev": true }, "elliptic": { @@ -4119,6 +4013,12 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -4135,7 +4035,6 @@ "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, "requires": { "iconv-lite": "~0.4.13" } @@ -4464,7 +4363,7 @@ }, "expand-range": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", "dev": true, "requires": { @@ -4520,7 +4419,7 @@ }, "expand-range": { "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { @@ -4549,12 +4448,6 @@ "kind-of": "^3.0.2" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", @@ -4615,7 +4508,7 @@ "dependencies": { "array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, @@ -4661,17 +4554,6 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } } }, "extglob": { @@ -4774,10 +4656,9 @@ "dev": true }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "requires": { "websocket-driver": ">=0.5.1" } @@ -4888,6 +4769,21 @@ "locate-path": "^2.0.0" } }, + "firebase": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-5.7.2.tgz", + "integrity": "sha512-RrjQ9q4dM9Q97vd+ucfuOAjby4vsjdW350ohy+Rw0lsA4Y+bJ0RAVnYimXqGfPfoIAErRJj6HctutE4gg1G2xw==", + "requires": { + "@firebase/app": "0.3.5", + "@firebase/auth": "0.9.1", + "@firebase/database": "0.3.8", + "@firebase/firestore": "0.9.2", + "@firebase/functions": "0.3.3", + "@firebase/messaging": "0.3.7", + "@firebase/polyfill": "0.3.3", + "@firebase/storage": "0.2.4" + } + }, "flush-write-stream": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", @@ -4899,9 +4795,9 @@ } }, "follow-redirects": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", - "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.0.tgz", + "integrity": "sha512-4Oh4eI3S9OueVV41AgJ1oLjpaJUhbJ7JDGOMhe0AFqoSejl5Q2nn3eGglAzRUKVKZE8jG5MNn66TjCJMAnpsWA==", "dev": true, "requires": { "debug": "=3.1.0" @@ -5012,8 +4908,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.4", @@ -5027,25 +4922,21 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "bundled": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "bundled": true }, "aproba": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "bundled": true, "optional": 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=", + "bundled": true, "optional": true, "requires": { "delegates": "^1.0.0", @@ -5054,13 +4945,11 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "bundled": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "bundled": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5068,35 +4957,29 @@ }, "chownr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "bundled": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "bundled": true }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "bundled": true }, "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=" + "bundled": true }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "bundled": true, "optional": true }, "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "bundled": true, "optional": true, "requires": { "ms": "2.0.0" @@ -5104,26 +4987,22 @@ }, "deep-extend": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "bundled": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "bundled": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bundled": true, "optional": true }, "fs-minipass": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "bundled": true, "optional": true, "requires": { "minipass": "^2.2.1" @@ -5131,14 +5010,12 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "bundled": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "bundled": true, "optional": true, "requires": { "aproba": "^1.0.3", @@ -5153,8 +5030,7 @@ }, "glob": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "bundled": true, "optional": true, "requires": { "fs.realpath": "^1.0.0", @@ -5167,14 +5043,12 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "bundled": true, "optional": true }, "iconv-lite": { "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "bundled": true, "optional": true, "requires": { "safer-buffer": "^2.1.0" @@ -5182,8 +5056,7 @@ }, "ignore-walk": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "bundled": true, "optional": true, "requires": { "minimatch": "^3.0.4" @@ -5191,8 +5064,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "optional": true, "requires": { "once": "^1.3.0", @@ -5201,46 +5073,39 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "bundled": true }, "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "bundled": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "bundled": true, "requires": { "number-is-nan": "^1.0.0" } }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "bundled": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "bundled": true }, "minipass": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", - "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", + "bundled": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -5248,8 +5113,7 @@ }, "minizlib": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "bundled": true, "optional": true, "requires": { "minipass": "^2.2.1" @@ -5257,22 +5121,19 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "bundled": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "bundled": true, "optional": true }, "needle": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", - "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", + "bundled": true, "optional": true, "requires": { "debug": "^2.1.2", @@ -5282,8 +5143,7 @@ }, "node-pre-gyp": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz", - "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", + "bundled": true, "optional": true, "requires": { "detect-libc": "^1.0.2", @@ -5300,8 +5160,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "bundled": true, "optional": true, "requires": { "abbrev": "1", @@ -5310,14 +5169,12 @@ }, "npm-bundled": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", - "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", + "bundled": true, "optional": true }, "npm-packlist": { "version": "1.1.10", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", - "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", + "bundled": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", @@ -5326,8 +5183,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "bundled": true, "optional": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -5338,39 +5194,33 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "bundled": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "bundled": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "requires": { "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "bundled": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "bundled": true, "optional": true, "requires": { "os-homedir": "^1.0.0", @@ -5379,20 +5229,17 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "bundled": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "bundled": true, "optional": true }, "rc": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", - "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", + "bundled": true, "optional": true, "requires": { "deep-extend": "^0.5.1", @@ -5403,16 +5250,14 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "bundled": true, "optional": true } } }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "bundled": true, "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -5426,8 +5271,7 @@ }, "rimraf": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "bundled": true, "optional": true, "requires": { "glob": "^7.0.5" @@ -5435,43 +5279,638 @@ }, "safe-buffer": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "bundled": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, "optional": true }, + "semver": { + "version": "5.5.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } + } + }, + "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.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "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.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "optional": true, + "requires": { + "globule": "^1.0.0" + } + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "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 + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "optional": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "grpc": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.16.1.tgz", + "integrity": "sha512-7uHN1Nd3UqfvwgQ6f5U3+EZb/0iuHJ9mbPH+ydaTkszJsUi3nwdz6DuSh0eJwYVXXn6Gojv2khiQAadMongGKg==", + "requires": { + "lodash": "^4.17.5", + "nan": "^2.0.0", + "node-pre-gyp": "^0.12.0", + "protobufjs": "^5.0.3" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.1", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true + } + } + }, + "ms": { + "version": "2.0.0", + "bundled": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true + }, + "npm-packlist": { + "version": "1.1.12", + "bundled": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, "sax": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "optional": true + "bundled": true }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "optional": true + "version": "5.6.0", + "bundled": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "optional": true + "bundled": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "optional": true + "bundled": true }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5480,251 +5919,56 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, + "bundled": true, "requires": { "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "requires": { "ansi-regex": "^2.0.0" } }, "strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "optional": true + "bundled": true }, "tar": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", - "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", - "optional": true, + "version": "4.4.8", + "bundled": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true + "bundled": 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==", - "optional": true, + "version": "1.1.3", + "bundled": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "bundled": true }, "yallist": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" - } - } - }, - "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.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "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.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "optional": true, - "requires": { - "globule": "^1.0.0" - } - }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "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 - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } + "bundled": true } } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "dev": true, - "optional": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, "handle-thing": { "version": "1.2.5", "resolved": "http://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", @@ -5777,9 +6021,9 @@ }, "dependencies": { "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -5787,27 +6031,6 @@ "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } } } }, @@ -5895,9 +6118,9 @@ } }, "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -5966,8 +6189,7 @@ "http-parser-js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", - "dev": true + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" }, "http-proxy": { "version": "1.17.0", @@ -6092,10 +6314,9 @@ } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -6187,9 +6408,9 @@ } }, "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -6254,7 +6475,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -6336,9 +6556,9 @@ } }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, "invariant": { @@ -6353,13 +6573,12 @@ "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ionicons": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-4.5.0.tgz", - "integrity": "sha512-nNkS/0wmPcW4Lbg+NqivlOl14BGKKpaZZzZVQzH63MuZZvuu5u8F/JCwcUYiPOAYGp02w0UaDL/slz+HZOuB3Q==" + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-4.4.7.tgz", + "integrity": "sha512-6DOSIWGJnMY7nP69Ov4WduUA/zInJ8bc4/Y/orj76hrL9AgtMozEb4MciZ7ocPxr97wc8J+1c5uHpNZSaWE8KQ==" }, "ip": { "version": "1.1.5", @@ -6381,7 +6600,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { "kind-of": "^3.0.2" @@ -6436,7 +6655,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { "kind-of": "^3.0.2" @@ -6513,7 +6732,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6597,8 +6815,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-typedarray": { "version": "1.0.0", @@ -6624,9 +6841,9 @@ "dev": true }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { "version": "3.0.3", @@ -6648,6 +6865,15 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -6946,9 +7172,9 @@ "dev": true }, "js-base64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", - "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.0.tgz", + "integrity": "sha512-wlEBIZ5LP8usDylWbDNhKPEFVFdI5hCHpnVoT/Ysvoi/PRhJENm/Rlh9TvjYB38HFfKZN7OzEbRjmjvLkFw11g==", "dev": true, "optional": true }, @@ -7062,14 +7288,8 @@ }, "es6-promise": { "version": "3.0.2", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", "dev": true }, "process-nextick-args": { @@ -7094,7 +7314,7 @@ }, "string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true } @@ -7136,9 +7356,9 @@ }, "dependencies": { "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true }, "source-map": { @@ -7208,7 +7428,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, "requires": { "invert-kv": "^1.0.0" } @@ -7344,8 +7563,7 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash.assign": { "version": "4.2.0", @@ -7468,6 +7686,11 @@ "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", "dev": true }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7489,9 +7712,9 @@ } }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -7542,25 +7765,36 @@ }, "dependencies": { "cacache": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz", - "integrity": "sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", "dev": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + } } }, "mississippi": { @@ -7599,6 +7833,18 @@ "requires": { "figgy-pudding": "^3.5.1" } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true } } }, @@ -7799,7 +8045,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -7829,9 +8074,9 @@ } }, "minizlib": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.1.tgz", - "integrity": "sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, "requires": { "minipass": "^2.2.1" @@ -7938,15 +8183,14 @@ }, "mute-stream": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "resolved": "http://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "optional": true + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" }, "nanomatch": { "version": "1.2.13", @@ -7990,6 +8234,15 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, "node-fetch-npm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", @@ -8077,9 +8330,9 @@ } }, "node-releases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.4.tgz", - "integrity": "sha512-GqRV9GcHw8JCRDaP/JoeNMNzEGzHAknMvIHqMb2VeTOmg1Cf9+ej8bkV12tHfzWHQMCkQ5zUFgwFUkfraynNCw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.2.tgz", + "integrity": "sha512-j1gEV/zX821yxdWp/1vBMN0pSUjuH9oGUdLCb4PfUko6ZW7KdRs3Z+QGGwDUhYtSpQvdVVyLd2V0YvLsmdg5jQ==", "dev": true, "requires": { "semver": "^5.3.0" @@ -8136,7 +8389,7 @@ }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true, "optional": true @@ -8267,8 +8520,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "oauth-sign": { "version": "0.9.0", @@ -8378,7 +8630,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -8393,9 +8644,9 @@ } }, "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "version": "5.3.0", + "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -8433,6 +8684,11 @@ "wordwrap": "~1.0.0" } }, + "optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" + }, "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", @@ -8458,8 +8714,6 @@ "version": "1.4.0", "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "optional": true, "requires": { "lcid": "^1.0.0" } @@ -8564,25 +8818,36 @@ }, "dependencies": { "cacache": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz", - "integrity": "sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", "dev": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + } } }, "get-stream": { @@ -8622,6 +8887,12 @@ "once": "^1.3.1" } }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -8646,6 +8917,12 @@ "yallist": "^3.0.2" } }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", @@ -8655,9 +8932,9 @@ } }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", + "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", "dev": true }, "parallel-transform": { @@ -8723,10 +9000,9 @@ } }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" }, "parse5-html-rewriting-stream": { "version": "5.1.0", @@ -8735,13 +9011,6 @@ "requires": { "parse5": "^5.1.0", "parse5-sax-parser": "^5.1.0" - }, - "dependencies": { - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - } } }, "parse5-sax-parser": { @@ -8750,13 +9019,6 @@ "integrity": "sha512-VEhdEDhBkoSILPmsZ96SoIIUow3hZbtgQsqXw7r8DxxnqsCIO0fwkT9mWgBcf9SPjVUh92liuEprHrrYzXBPWQ==", "requires": { "parse5": "^5.1.0" - }, - "dependencies": { - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - } } }, "parseqs": { @@ -8790,7 +9052,7 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, @@ -8834,6 +9096,13 @@ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", "requires": { "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } } }, "path-type": { @@ -9025,6 +9294,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "promise-polyfill": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz", + "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==" + }, "promise-retry": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", @@ -9035,6 +9309,17 @@ "retry": "^0.10.0" } }, + "protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "requires": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + } + }, "protoduck": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", @@ -9134,6 +9419,12 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -9145,14 +9436,14 @@ }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, "webdriver-manager": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", - "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.1.tgz", + "integrity": "sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA==", "dev": true, "requires": { "adm-zip": "^0.4.9", @@ -9199,9 +9490,9 @@ "dev": true }, "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", "dev": true }, "public-encrypt": { @@ -9261,9 +9552,9 @@ }, "dependencies": { "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -9382,11 +9673,22 @@ "http-errors": "1.6.3", "iconv-lite": "0.4.23", "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "raw-loader": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", "dev": true }, @@ -9480,13 +9782,6 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } } }, "readdirp": { @@ -9557,7 +9852,7 @@ }, "regexpu-core": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { @@ -9574,7 +9869,7 @@ }, "regjsparser": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "resolved": "http://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { @@ -9667,7 +9962,7 @@ }, "resolve": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, @@ -9779,8 +10074,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass-graph": { "version": "2.2.4", @@ -9793,6 +10087,37 @@ "lodash": "^4.0.0", "scss-tokenizer": "^0.2.3", "yargs": "^7.0.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, + "optional": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "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" + } + } } }, "sass-loader": { @@ -9897,9 +10222,9 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", "dev": true }, "semver-dsl": { @@ -9950,9 +10275,9 @@ } }, "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", "dev": true }, "serve-index": { @@ -10148,6 +10473,11 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -10315,6 +10645,17 @@ "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.0.1" + }, + "dependencies": { + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } } }, "sockjs-client": { @@ -10340,15 +10681,6 @@ "ms": "^2.1.1" } }, - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -10384,9 +10716,9 @@ "dev": true }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" }, "source-map-loader": { "version": "0.2.4", @@ -10451,9 +10783,9 @@ "dev": true }, "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -10477,9 +10809,9 @@ } }, "spdx-license-ids": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "spdy": { @@ -10530,14 +10862,14 @@ }, "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", - "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", + "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -10606,7 +10938,7 @@ }, "stream-browserify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { @@ -10684,9 +11016,8 @@ }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -10695,7 +11026,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" @@ -10705,7 +11036,6 @@ "version": "3.0.1", "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -10820,9 +11150,9 @@ "dev": true }, "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", "dev": true }, "tar": { @@ -10838,9 +11168,9 @@ } }, "terser": { - "version": "3.10.12", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.10.12.tgz", - "integrity": "sha512-3ODPC1eVt25EVNb04s/PkHxOmzKBQUF6bwwuR6h2DbEF8/j265Y1UkwNtOk9am/pRxfJ5HPapOlUlO6c16mKQQ==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.13.1.tgz", + "integrity": "sha512-ogyZye4DFqOtMzT92Y3Nxxw8OvXmL39HOALro4fc+EUYFFF9G/kk0znkvwMz6PPYgBtdKAodh3FPR70eugdaQA==", "dev": true, "requires": { "commander": "~2.17.1", @@ -10873,24 +11203,24 @@ }, "dependencies": { "cacache": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz", - "integrity": "sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", "dev": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" } }, @@ -10924,6 +11254,15 @@ "path-exists": "^3.0.0" } }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -10943,9 +11282,9 @@ } }, "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -10999,6 +11338,18 @@ "requires": { "figgy-pudding": "^3.5.1" } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true } } }, @@ -11175,9 +11526,9 @@ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "tslint": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", - "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz", + "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -11195,12 +11546,12 @@ }, "dependencies": { "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } } } @@ -11216,7 +11567,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -11430,11 +11781,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" } } }, @@ -11507,7 +11853,7 @@ "dependencies": { "lru-cache": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", "dev": true } @@ -11577,7 +11923,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { @@ -11781,6 +12127,19 @@ } } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -11799,6 +12158,21 @@ "xregexp": "4.0.0" } }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -11808,6 +12182,15 @@ "locate-path": "^3.0.0" } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", @@ -11846,20 +12229,20 @@ "dev": true }, "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "^0.10.0", + "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" } }, "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -11880,6 +12263,16 @@ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -11988,7 +12381,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true, "requires": { "http-parser-js": ">=0.4.0", "websocket-extensions": ">=0.1.1" @@ -11997,8 +12389,12 @@ "websocket-extensions": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" }, "when": { "version": "3.6.4", @@ -12031,6 +12427,11 @@ "string-width": "^1.0.2 || 2" } }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -12050,7 +12451,6 @@ "version": "2.1.0", "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -12059,8 +12459,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.3.0", @@ -12108,6 +12507,11 @@ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", @@ -12127,10 +12531,9 @@ "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { "version": "2.1.2", @@ -12139,41 +12542,17 @@ "dev": true }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "optional": true, + "version": "3.32.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", + "camelcase": "^2.0.1", + "cliui": "^3.0.3", "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", "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" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "optional": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true, - "optional": true - } + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" } }, "yargs-parser": { diff --git a/package.json b/package.json index 8ad3f4b1c..cce7076b4 100644 --- a/package.json +++ b/package.json @@ -17,22 +17,24 @@ }, "private": true, "dependencies": { - "@angular/common": "7.1.3", - "@angular/core": "7.1.3", - "@angular/forms": "7.1.3", + "@angular/common": "~7.1.0", + "@angular/core": "~7.1.0", + "@angular/fire": "^5.1.1", + "@angular/forms": "~7.1.0", "@angular/http": "~7.1.0", - "@angular/platform-browser": "7.1.3", - "@angular/platform-browser-dynamic": "7.1.3", + "@angular/platform-browser": "7.1.0", + "@angular/platform-browser-dynamic": "7.1.0", "@angular/pwa": "0.11.0", - "@angular/router": "7.1.3", + "@angular/router": "7.1.0", "@angular/service-worker": "~7.1.0", "@ionic-native/core": "5.0.0-beta.15", "@ionic-native/in-app-browser": "5.0.0-beta.15", "@ionic-native/splash-screen": "5.0.0-beta.15", "@ionic-native/status-bar": "5.0.0-beta.15", - "@ionic/angular": "4.0.0-beta.19", + "@ionic/angular": "^4.0.0-beta.16", "@ionic/storage": "^2.1.3", - "cordova-android": "7.0.0", + "angularfire2": "^5.1.1", + "cordova-android": "^7.0.0", "cordova-ios": "^4.5.5", "cordova-plugin-device": "^2.0.2", "cordova-plugin-inappbrowser": "^3.0.0", @@ -42,6 +44,7 @@ "cordova-plugin-statusbar": "^2.4.2", "cordova-plugin-whitelist": "^1.3.2", "core-js": "^2.5.7", + "firebase": "^5.7.2", "rxjs": "6.3.3", "sw-toolbox": "3.6.0", "zone.js": "^0.8.26" @@ -49,11 +52,11 @@ "devDependencies": { "@angular-devkit/architect": "0.11.0", "@angular-devkit/build-angular": "0.11.0", - "@angular-devkit/core": "7.1.2", - "@angular-devkit/schematics": "7.1.2", + "@angular-devkit/core": "7.1.0", + "@angular-devkit/schematics": "7.1.0", "@angular/cli": "7.1.0", - "@angular/compiler": "7.1.3", - "@angular/compiler-cli": "7.1.3", + "@angular/compiler": "7.1.0", + "@angular/compiler-cli": "7.1.0", "@angular/language-service": "~7.1.0", "@ionic/angular-toolkit": "1.2.0", "@ionic/lab": "^1.0.0", @@ -90,4 +93,4 @@ "cordova-plugin-ionic-keyboard": {} } } -} \ No newline at end of file +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 0b9bb3fdd..e59c938fd 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { CheckTutorial } from './providers/check-tutorial.service'; +// import { CheckTutorial } from './providers/check-tutorial.service'; const routes: Routes = [ { @@ -31,7 +31,7 @@ const routes: Routes = [ { path: 'tutorial', loadChildren: './pages/tutorial/tutorial.module#TutorialModule', - canLoad: [CheckTutorial] + // canLoad: [CheckTutorial] } ]; diff --git a/src/app/app.component.html b/src/app/app.component.html index b0b2d99d5..d79c1b7c1 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -14,7 +14,7 @@ Navigate - + {{p.title}} @@ -73,7 +73,7 @@ - + Support diff --git a/src/app/app.component.ts b/src/app/app.component.ts index c65fb2307..eaf41a7db 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -17,22 +17,22 @@ export class AppComponent implements OnInit { appPages = [ { title: 'Schedule', - url: '/app/tabs/schedule', + url: '/app/tabs/(schedule:schedule)', icon: 'calendar' }, { title: 'Speakers', - url: '/app/tabs/speakers', + url: '/app/tabs/(speakers:speakers)', icon: 'contacts' }, { title: 'Map', - url: '/app/tabs/map', + url: '/app/tabs/(map:map)', icon: 'map' }, { title: 'About', - url: '/app/tabs/about', + url: '/app/tabs/(about:about)', icon: 'information-circle' } ]; @@ -89,15 +89,19 @@ export class AppComponent implements OnInit { }); } + navigate(url: string) { + return this.router.navigateByUrl(url); + } + logout() { this.userData.logout().then(() => { - return this.router.navigateByUrl('/app/tabs/schedule'); + return this.openTutorial(); }); } openTutorial() { this.menu.enable(false); - this.storage.set('ion_did_tutorial', false); + this.storage.set('ion_did_tutorial', 'false'); this.router.navigateByUrl('/tutorial'); } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 6ebafab6d..bc4c62526 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -7,10 +7,14 @@ import { StatusBar } from '@ionic-native/status-bar/ngx'; import { IonicModule } from '@ionic/angular'; import { IonicStorageModule } from '@ionic/storage'; +import { environment } from '../environments/environment'; +import { AngularFireModule } from 'angularfire2'; +import { AngularFirestoreModule } from 'angularfire2/firestore'; +import { AngularFireStorageModule } from 'angularfire2/storage'; +import { AngularFireAuthModule } from 'angularfire2/auth'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { environment } from '../environments/environment'; @NgModule({ imports: [ @@ -21,7 +25,11 @@ import { environment } from '../environments/environment'; IonicStorageModule.forRoot(), ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production - }) + }), + AngularFireModule.initializeApp(environment.firebase, 'ionic-conference'), + AngularFireAuthModule, + AngularFirestoreModule, + AngularFireStorageModule ], declarations: [AppComponent], providers: [InAppBrowser, SplashScreen, StatusBar], diff --git a/src/app/directive/drop-zone.directive.ts b/src/app/directive/drop-zone.directive.ts new file mode 100644 index 000000000..10bc775a1 --- /dev/null +++ b/src/app/directive/drop-zone.directive.ts @@ -0,0 +1,31 @@ +import { Directive, HostListener, Output, EventEmitter } from '@angular/core'; + +@Directive({ + selector: '[appDropZone]' +}) +export class DropZoneDirective { + + @Output() dropped = new EventEmitter(); + @Output() hovered = new EventEmitter(); + + constructor() { } + + @HostListener('drop', ['$event']) + onDrop($event) { + $event.preventDefault(); + this.dropped.emit($event.dataTransfer.files); + this.hovered.emit(false); + } + + @HostListener('dragover', ['$event']) + onDragOver($event) { + $event.preventDefault(); + this.hovered.emit(true); + } + + @HostListener('dragleave', ['$event']) + onDragLeave($event) { + $event.preventDefault(); + this.hovered.emit(false); + } +} diff --git a/src/app/interfaces/user-options.ts b/src/app/interfaces/user-options.ts deleted file mode 100644 index 16437e175..000000000 --- a/src/app/interfaces/user-options.ts +++ /dev/null @@ -1,5 +0,0 @@ - -export interface UserOptions { - username: string; - password: string; -} diff --git a/src/app/models.ts b/src/app/models.ts new file mode 100644 index 000000000..38bea0872 --- /dev/null +++ b/src/app/models.ts @@ -0,0 +1,73 @@ +// These are the categories for filtering stuff +export interface Track { + id?: string; + name: string; +} + +export interface Speaker { + id?: string; + name: string; + profilePic?: string; + twitter?: string; + github?: string; + instagram?: string; + about?: string; + location?: string; + email: string; + phone?: string; + sessions?: { id: string, name: string }[]; // session id & name +} + +export interface Session { + id?: string; + name: string; + date: string; // 2018-12-06 + timeStart: string; // 15:30 for 3:30pm + timeEnd?: string; + location?: string; + description?: string; + speakerIDs: string[]; // speaker's id + tracks: string[]; // name of track + hide?: boolean; +} + +export interface Map { + id?: string; + name: string; + lat: number; + lng: number; + center?: boolean; +} + +export interface User { + id?: string; + avatar?: string; + username: string; + password: string; + email: string; + favorites: { id: string, name: string }[]; // session's id and name. + trackFilter: { name: string, isChecked: boolean }[]; +} + +export interface Support { + id?: string; + userId: string; + date: string; // 2018-12-19 + support: string; +} + +export interface PartOfDay { + indexKey?: number; + name: string; // morning, afternoon, evening, overnight + timeFrom: string; + timeTo: string; +} + +export interface Schedule { + date: string; // 2018-12-06 + groups: { + indexKey: number + partOfDay: string, + sessions: any[] + }[]; +} diff --git a/src/app/pages/about/about.html b/src/app/pages/about/about.html index ebf908aa7..f9c6d4106 100644 --- a/src/app/pages/about/about.html +++ b/src/app/pages/about/about.html @@ -1,5 +1,5 @@ - + diff --git a/src/app/pages/about/about.ts b/src/app/pages/about/about.ts index 5d2e3b301..3e5fb0363 100644 --- a/src/app/pages/about/about.ts +++ b/src/app/pages/about/about.ts @@ -8,6 +8,7 @@ import { PopoverPage } from '../about-popover/about-popover'; selector: 'page-about', templateUrl: 'about.html', styleUrls: ['./about.scss'], + encapsulation: ViewEncapsulation.None }) export class AboutPage { conferenceDate = '2047-05-17'; diff --git a/src/app/pages/account/account.html b/src/app/pages/account/account.html index 176248f12..3909f0222 100644 --- a/src/app/pages/account/account.html +++ b/src/app/pages/account/account.html @@ -1,5 +1,5 @@ - + @@ -8,16 +8,25 @@ -
- avatar -

{{username}}

+
+ avatar + avatar +

{{user.username}}

- Update Picture + Update Picture Change Username + Change Email Change Password Support Logout +

{{ jobDescription }}

+ + + diff --git a/src/app/pages/account/account.module.ts b/src/app/pages/account/account.module.ts index da13bb878..ba5a81e63 100644 --- a/src/app/pages/account/account.module.ts +++ b/src/app/pages/account/account.module.ts @@ -4,6 +4,9 @@ import { IonicModule } from '@ionic/angular'; import { AccountPage } from './account'; import { AccountPageRoutingModule } from './account-routing.module'; +import { UploadImageComponent } from '../upload-image/upload-image.component'; +import { FileSizePipe } from '../../pipe/file-size.pipe'; +import { DropZoneDirective } from '../../directive/drop-zone.directive'; @NgModule({ imports: [ @@ -13,6 +16,9 @@ import { AccountPageRoutingModule } from './account-routing.module'; ], declarations: [ AccountPage, + UploadImageComponent, + FileSizePipe, + DropZoneDirective ] }) export class AccountModule { } diff --git a/src/app/pages/account/account.ts b/src/app/pages/account/account.ts index d65456d0a..10999eaa0 100644 --- a/src/app/pages/account/account.ts +++ b/src/app/pages/account/account.ts @@ -1,46 +1,73 @@ import { AfterViewInit, Component, ViewEncapsulation } from '@angular/core'; import { Router } from '@angular/router'; - import { AlertController } from '@ionic/angular'; import { UserData } from '../../providers/user-data'; - +import { User } from '../../models'; @Component({ selector: 'page-account', templateUrl: 'account.html', styleUrls: ['./account.scss'], + encapsulation: ViewEncapsulation.None }) export class AccountPage implements AfterViewInit { - username: string; + users: User[]; + user: User; + succeed: boolean; + loadImage: boolean; + jobDescription: string; - constructor( - public alertCtrl: AlertController, - public router: Router, - public userData: UserData - ) { } + constructor(public alertCtrl: AlertController, + public router: Router, + public userProvider: UserData) {} ngAfterViewInit() { - this.getUsername(); + this.userProvider.getUsers().subscribe( + users => this.users = users + ); + this.userProvider.getUserId().then(id => { + this.userProvider.getUserById(id).then(data => { this.user = data; }); + }); } - updatePicture() { - console.log('Clicked to update picture'); + updatePicture(path: string) { + const oldUrl = this.user.avatar; + const id = this.user.id; + + this.user.avatar = path; + this.userProvider.updateUser(this.user); + + this.loadImage = false; + this.user = null; + this.userProvider.getUserById(id).then(data => { this.user = data; }); + this.userProvider.deleteUrl(oldUrl); + } + + onExit() { + this.loadImage = false; } // Present an alert with the current username populated // clicking OK will update the username and display it // clicking Cancel will close the alert and do nothing async changeUsername() { - const alert = await this.alertCtrl.create({ + this.succeed = false; + const changeForm = await this.alertCtrl.create({ header: 'Change Username', buttons: [ 'Cancel', { text: 'Ok', handler: (data: any) => { - this.userData.setUsername(data.username); - this.getUsername(); + if (this.isTheValueUsed(data.username)) { + alert(data.username + ' was used already. Try another.'); + } else { + this.user.username = data.username; + this.userProvider.updateUser(this.user); + this.succeed = true; + this.jobDescription = 'Username has been changed.'; + } } } ], @@ -48,26 +75,102 @@ export class AccountPage implements AfterViewInit { { type: 'text', name: 'username', - value: this.username, - placeholder: 'username' + value: this.user.username, + placeholder: 'new username' + } + ] + }); + await changeForm.present(); + } + + async changeEmail() { + this.succeed = false; + const changeForm = await this.alertCtrl.create({ + header: 'Change Email', + buttons: [ + 'Cancel', + { + text: 'Ok', + handler: (data: any) => { + if (this.isTheValueUsed(data.email)) { + alert(data.email + ' was used already. Try another.'); + } else { + this.user.email = data.email; + this.userProvider.updateUser(this.user); + this.succeed = true; + this.jobDescription = 'Email has been changed.'; + } + } + } + ], + inputs: [ + { + type: 'email', + name: 'email', + value: this.user.email, + placeholder: 'new email' } ] }); - await alert.present(); + await changeForm.present(); } - getUsername() { - this.userData.getUsername().then((username) => { - this.username = username; + async changePassword() { + this.succeed = false; + const changeForm = await this.alertCtrl.create({ + header: 'Change Password', + buttons: [ + 'Cancel', + { + text: 'Ok', + handler: (data: any) => { + if (this.user.password !== data.currentPW) { + alert('Current password does not match your password.'); + } else if (data.newPW.length < 4) { + alert('Password should be more than 3 characters.'); + } else if (data.newPW !== data.confirmPW) { + alert('New password does not match Confirm password.'); + } else { + this.user.password = data.newPW; + this.userProvider.updateUser(this.user); + this.succeed = true; + this.jobDescription = 'Password has been changed.'; + } + } + } + ], + inputs: [ + { + type: 'password', + name: 'newPW', + placeholder: 'new password' + }, + { + type: 'password', + name: 'confirmPW', + placeholder: 'confirm password' + }, + { + type: 'password', + name: 'currentPW', + placeholder: 'current password' + } + ] }); + await changeForm.present(); } - changePassword() { - console.log('Clicked to change password'); + isTheValueUsed(value: string) { + if (value.indexOf('@') < 0) { + return this.users.find( + user => user.username.toLowerCase() === value.toLowerCase()); + } + return this.users.find( + user => user.email.toLowerCase() === value.toLowerCase()); } logout() { - this.userData.logout(); + this.userProvider.logout(); this.router.navigateByUrl('/login'); } diff --git a/src/app/pages/login/login.html b/src/app/pages/login/login.html index 4b7d92aa8..b228c32a3 100644 --- a/src/app/pages/login/login.html +++ b/src/app/pages/login/login.html @@ -1,5 +1,5 @@ - + @@ -17,25 +17,25 @@ Username - -

+

Username is required

Password - + -

+

Password is required

diff --git a/src/app/pages/login/login.ts b/src/app/pages/login/login.ts index eca7d56e2..6f747691d 100644 --- a/src/app/pages/login/login.ts +++ b/src/app/pages/login/login.ts @@ -1,34 +1,53 @@ -import { Component, ViewEncapsulation } from '@angular/core'; +import { Component, ViewEncapsulation, OnInit } from '@angular/core'; import { NgForm } from '@angular/forms'; import { Router } from '@angular/router'; import { UserData } from '../../providers/user-data'; - -import { UserOptions } from '../../interfaces/user-options'; - - +import { User } from '../../models'; @Component({ selector: 'page-login', templateUrl: 'login.html', styleUrls: ['./login.scss'], + encapsulation: ViewEncapsulation.None }) -export class LoginPage { - login: UserOptions = { username: '', password: '' }; - submitted = false; - - constructor( - public userData: UserData, - public router: Router - ) { } +export class LoginPage implements OnInit { + username: ''; + password: '' ; + users: User[]; + + constructor(public userData: UserData, + public router: Router, + private userProvider: UserData) { } + + ngOnInit() { + this.userProvider.getUsers().subscribe( + (data: User[]) => { this.users = data; } + ); + } onLogin(form: NgForm) { - this.submitted = true; - if (form.valid) { - this.userData.login(this.login.username); - this.router.navigateByUrl('/app/tabs/schedule'); + const user = this.findUser(this.username.toLowerCase().trim()); + if (user) { + if (user.password === this.password) { + this.userData.login(user); + // this.router.navigateByUrl('/app/tabs/schedule') + this.router.navigateByUrl('/app/tabs/(schedule:schedule)'); + } else { + alert('Invalid password. Try again.'); + } + } else { + alert('User not found. Try again.'); + } + } + } + + findUser(data: string) { + if (data.indexOf('@') > -1) { + return this.users.find(user => user.email.toLowerCase() === data); } + return this.users.find(user => user.username.toLowerCase() === data); } onSignup() { diff --git a/src/app/pages/map/map.html b/src/app/pages/map/map.html index 68d390b2f..b234023b6 100644 --- a/src/app/pages/map/map.html +++ b/src/app/pages/map/map.html @@ -1,5 +1,5 @@ - + diff --git a/src/app/pages/map/map.ts b/src/app/pages/map/map.ts index 27a531f97..e01a24bc7 100644 --- a/src/app/pages/map/map.ts +++ b/src/app/pages/map/map.ts @@ -1,35 +1,41 @@ -import { Component, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, ElementRef, ViewChild, ViewEncapsulation } from '@angular/core'; + import { ConferenceData } from '../../providers/conference-data'; + import { Platform } from '@ionic/angular'; +declare var google: any; + @Component({ selector: 'page-map', templateUrl: 'map.html', - styleUrls: ['./map.scss'] + styleUrls: ['./map.scss'], + encapsulation: ViewEncapsulation.None }) -export class MapPage implements AfterViewInit { +export class MapPage { + @ViewChild('mapCanvas') mapElement: ElementRef; - constructor(public confData: ConferenceData, public platform: Platform) {} + constructor( + public dataProvider: ConferenceData, + public platform: Platform + ) { } - async ngAfterViewInit() { - const googleMaps = await getGoogleMaps( - 'AIzaSyB8pf6ZdFQj5qw7rc_HSGrhUwQKfIe9ICw' - ); - this.confData.getMap().subscribe((mapData: any) => { + ionViewDidEnter() { + this.dataProvider.getMap().subscribe((mapData: any) => { const mapEle = this.mapElement.nativeElement; - const map = new googleMaps.Map(mapEle, { - center: mapData.find((d: any) => d.center), + const map = new google.maps.Map(mapEle, { + center: mapData.find((loc: any) => loc.center), zoom: 16 }); mapData.forEach((markerData: any) => { - const infoWindow = new googleMaps.InfoWindow({ + const infoWindow = new google.maps.InfoWindow({ content: `
${markerData.name}
` }); - const marker = new googleMaps.Marker({ + const marker = new google.maps.Marker({ position: markerData, map, title: markerData.name @@ -40,33 +46,9 @@ export class MapPage implements AfterViewInit { }); }); - googleMaps.event.addListenerOnce(map, 'idle', () => { + google.maps.event.addListenerOnce(map, 'idle', () => { mapEle.classList.add('show-map'); }); }); } } - -function getGoogleMaps(apiKey: string): Promise { - const win = window as any; - const googleModule = win.google; - if (googleModule && googleModule.maps) { - return Promise.resolve(googleModule.maps); - } - - return new Promise((resolve, reject) => { - const script = document.createElement('script'); - script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&v=3.31`; - script.async = true; - script.defer = true; - document.body.appendChild(script); - script.onload = () => { - const googleModule2 = win.google; - if (googleModule2 && googleModule2.maps) { - resolve(googleModule2.maps); - } else { - reject('google maps not available'); - } - }; - }); -} diff --git a/src/app/pages/schedule-filter/schedule-filter.html b/src/app/pages/schedule-filter/schedule-filter.html index ffafd4cd0..4bb361d3c 100644 --- a/src/app/pages/schedule-filter/schedule-filter.html +++ b/src/app/pages/schedule-filter/schedule-filter.html @@ -1,5 +1,5 @@ - + Cancel @@ -19,12 +19,11 @@ Tracks - + {{track.name}} - + - diff --git a/src/app/pages/schedule-filter/schedule-filter.ts b/src/app/pages/schedule-filter/schedule-filter.ts index 816631471..e2bc7692d 100644 --- a/src/app/pages/schedule-filter/schedule-filter.ts +++ b/src/app/pages/schedule-filter/schedule-filter.ts @@ -2,51 +2,51 @@ import { AfterViewInit, Component, ViewEncapsulation } from '@angular/core'; import { ModalController } from '@ionic/angular'; import { ConferenceData } from '../../providers/conference-data'; - +import { UserData } from '../../providers/user-data'; +import { User } from '../../models'; @Component({ selector: 'page-schedule-filter', templateUrl: 'schedule-filter.html', styleUrls: ['./schedule-filter.scss'], + encapsulation: ViewEncapsulation.None }) export class ScheduleFilterPage implements AfterViewInit { - - tracks: {name: string, isChecked: boolean}[] = []; + user: User; + trackFilter: { name: string, isChecked: boolean }[] = []; constructor( - public confData: ConferenceData, - public modalCtrl: ModalController + public dataProvider: ConferenceData, + public modalCtrl: ModalController, + public userProvider: UserData ) { } // TODO use the ionViewDidEnter event ngAfterViewInit() { - // passed in array of track names that should be excluded (unchecked) - const excludedTrackNames = []; // this.navParams.data.excludedTracks; - - this.confData.getTracks().subscribe((trackNames: string[]) => { - trackNames.forEach(trackName => { - this.tracks.push({ - name: trackName, - isChecked: (excludedTrackNames.indexOf(trackName) === -1) - }); - }); + this.userProvider.getUser().then(user => { + this.user = user; + this.trackFilter = user.trackFilter; }); } resetFilters() { // reset all of the toggles to be checked - this.tracks.forEach(track => { + this.trackFilter.forEach(track => { track.isChecked = true; }); } applyFilters() { + // update user's trackFilter + this.user.trackFilter = this.trackFilter; + this.userProvider.updateUser(this.user); + // Pass back a new array of track names to exclude - const excludedTrackNames = this.tracks.filter(c => !c.isChecked).map(c => c.name); + const excludedTrackNames = this.trackFilter.filter(c => !c.isChecked).map(c => c.name); this.dismiss(excludedTrackNames); } - dismiss(data?: any) { + dismiss(data: any) { // using the injected ModalController this page // can "dismiss" itself and pass back data this.modalCtrl.dismiss(data); diff --git a/src/app/pages/schedule-track/schedule-track.html b/src/app/pages/schedule-track/schedule-track.html new file mode 100644 index 000000000..a499c53c6 --- /dev/null +++ b/src/app/pages/schedule-track/schedule-track.html @@ -0,0 +1,25 @@ + + + + One Track Session + + + + Cancel + + + + + + + + + Tracks + + + + {{track.name}} + + + + diff --git a/src/app/pages/schedule-track/schedule-track.scss b/src/app/pages/schedule-track/schedule-track.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/pages/schedule-track/schedule-track.ts b/src/app/pages/schedule-track/schedule-track.ts new file mode 100644 index 000000000..f985cb83d --- /dev/null +++ b/src/app/pages/schedule-track/schedule-track.ts @@ -0,0 +1,41 @@ +import { AfterViewInit, Component, ViewEncapsulation } from '@angular/core'; +import { ModalController } from '@ionic/angular'; + +import { ConferenceData } from '../../providers/conference-data'; +import { UserData } from '../../providers/user-data'; +import { Track } from '../../models'; + +@Component({ + selector: 'page-schedule-track', + templateUrl: './schedule-track.html', + styleUrls: ['./schedule-track.scss'], + encapsulation: ViewEncapsulation.None + +}) +export class ScheduleTrackPage implements AfterViewInit { + tracks: Track[] = []; + + constructor(private dataProvider: ConferenceData, + public modalCtrl: ModalController) { } + + ngAfterViewInit() { + this.dataProvider.getTracks().subscribe( + (tracks: Track[]) => { this.tracks = tracks; } + ); + } + + applyTrack(name: string) { + // Pass back a new array of track names to exclude + const excludedTracks = []; + this.tracks.forEach( + (track) => { if (track.name !== name ) { excludedTracks.push(track.name); } + }); + this.dismiss(excludedTracks); + } + + dismiss(data: any) { + // using the injected ModalController this page + // can "dismiss" itself and pass back data + this.modalCtrl.dismiss(data); + } +} diff --git a/src/app/pages/schedule/schedule.html b/src/app/pages/schedule/schedule.html index 348eafce6..d04a30178 100644 --- a/src/app/pages/schedule/schedule.html +++ b/src/app/pages/schedule/schedule.html @@ -1,13 +1,16 @@ - + - + All + + Track + Favorites @@ -21,41 +24,45 @@ - + - - - - - {{group.time}} - - - - - + + + + -

{{session.name}}

-

- {{session.timeStart}} — {{session.timeEnd}}: {{session.location}} -

+ {{daily.date}} : {{group.partOfDay}}
-
- - - Favorite - - - Remove - - -
+ + + + + +

{{session.name}}

+

+ {{session.timeStart}} — {{session.timeEnd}}: {{session.location}} +

+
+
+ + + Favorite + + + Remove + + +
+
- - No Sessions Found + +

No Sessions Found

+

You may

+

Login or Signup!

diff --git a/src/app/pages/schedule/schedule.module.ts b/src/app/pages/schedule/schedule.module.ts index 77ba69818..90f545e15 100644 --- a/src/app/pages/schedule/schedule.module.ts +++ b/src/app/pages/schedule/schedule.module.ts @@ -5,6 +5,7 @@ import { IonicModule } from '@ionic/angular'; import { SchedulePage } from './schedule'; import { ScheduleFilterPage } from '../schedule-filter/schedule-filter'; +import { ScheduleTrackPage } from '../schedule-track/schedule-track'; import { SchedulePageRoutingModule } from './schedule-routing.module'; @NgModule({ @@ -16,10 +17,12 @@ import { SchedulePageRoutingModule } from './schedule-routing.module'; ], declarations: [ SchedulePage, - ScheduleFilterPage + ScheduleFilterPage, + ScheduleTrackPage ], entryComponents: [ - ScheduleFilterPage + ScheduleFilterPage, + ScheduleTrackPage ] }) export class ScheduleModule { } diff --git a/src/app/pages/schedule/schedule.scss b/src/app/pages/schedule/schedule.scss index 0f366a99d..6cc1ffc80 100644 --- a/src/app/pages/schedule/schedule.scss +++ b/src/app/pages/schedule/schedule.scss @@ -17,3 +17,13 @@ $categories: ( padding-left: 10px; } } + +.notFound { + display: inline; + text-align: center; +} +.notFound h4 { + margin-top: 70px; + font-size: 24px; +} + diff --git a/src/app/pages/schedule/schedule.ts b/src/app/pages/schedule/schedule.ts index d603f6e41..d29b3f3f2 100644 --- a/src/app/pages/schedule/schedule.ts +++ b/src/app/pages/schedule/schedule.ts @@ -1,41 +1,69 @@ -import { Component, ViewChild, OnInit } from '@angular/core'; +import { Component, ViewChild, OnInit, ViewEncapsulation } from '@angular/core'; import { Router } from '@angular/router'; -import { AlertController, IonList, LoadingController, ModalController, ToastController } from '@ionic/angular'; +import { AlertController, List, LoadingController, ModalController, ToastController } from '@ionic/angular'; import { ScheduleFilterPage } from '../schedule-filter/schedule-filter'; +import { ScheduleTrackPage } from '../schedule-track/schedule-track'; import { ConferenceData } from '../../providers/conference-data'; import { UserData } from '../../providers/user-data'; +import { User, Session, PartOfDay } from '../../models'; @Component({ selector: 'page-schedule', templateUrl: 'schedule.html', styleUrls: ['./schedule.scss'], + encapsulation: ViewEncapsulation.None }) export class SchedulePage implements OnInit { // Gets a reference to the list element - @ViewChild('scheduleList') scheduleList: IonList; + @ViewChild('scheduleList') scheduleList: List; - dayIndex = 0; + user: User; queryText = ''; - segment = 'all'; - excludeTracks: any = []; - shownSessions: any = []; - groups: any = []; - confDate: string; + segment = ''; + excludeTracks: any[] = []; + + start = '2019-01-10'; + end = '2019-01-15'; + changePeriod = true; + + partsOfDay: PartOfDay[]; + sessions: Session[]; + schedule: { + date: string, + groups: { + indexKey: number + partOfDay: string, + sessions: any[] + }[] + }[] = []; constructor( public alertCtrl: AlertController, - public confData: ConferenceData, + public dataProvider: ConferenceData, public loadingCtrl: LoadingController, public modalCtrl: ModalController, public router: Router, public toastCtrl: ToastController, - public user: UserData + public userProvider: UserData ) { } ngOnInit() { // this.app.setTitle('Schedule'); - this.updateSchedule(); + this.userProvider.isLoggedIn().then(loggedIn => { + if (loggedIn) { + this.userProvider.getUser().then(user => { + user.trackFilter.forEach(track => { + if (!track.isChecked) { this.excludeTracks.push(track.name); } + }); + this.user = user; + this.dataProvider.getPartsOfDay().subscribe( + response => { this.partsOfDay = response ; } + ); + this.updateSchedule(); + }); + } + }); } updateSchedule() { @@ -44,12 +72,104 @@ export class SchedulePage implements OnInit { this.scheduleList.closeSlidingItems(); } - this.confData.getTimeline(this.dayIndex, this.queryText, this.excludeTracks, this.segment).subscribe((data: any) => { - this.shownSessions = data.shownSessions; - this.groups = data.groups; + if (this.schedule.length === 0 || this.changePeriod) { + this.changePeriod = false; + this.dataProvider.getSessionInPeriod(this.start, this.end).subscribe( + (response: Session[]) => { + this.sessions = response; + this.buildSchedule(); + }); + } + } + + getFilterOption() { + return { + queryText: this.queryText.toLowerCase().trim(), + segment: this.segment, + excludeTracks: this.excludeTracks + }; + } + + buildSchedule() { + const filterOption = this.getFilterOption(); + this.sessions.forEach(session => { + session = this.dataProvider.filterSession(session, filterOption); + const partOfDay = this.partsOfDay.find(part => part.timeFrom <= session.timeStart && part.timeTo >= session.timeStart); + const newGroup = { + indexKey: partOfDay.indexKey, + partOfDay: partOfDay.name, + sessions: [session] + }; + const newItem = { date: session.date, groups: [newGroup]}; + + const sIndex = this.schedule.findIndex(item => item.date === session.date); + if (sIndex < 0) { + this.schedule.push(newItem); + } else { + const gIndex = this.schedule[sIndex].groups.findIndex( + group => group.partOfDay === partOfDay.name + ); + if (gIndex < 0) { + this.schedule[sIndex].groups.push(newGroup); + } else { + this.schedule[sIndex].groups[gIndex].sessions.push(session); + } + } + }); + this.schedule.sort((a, b) => { + if (a.date > b.date) { return 1; } + return -1; + }); + this.schedule.forEach(item => { + item.groups.sort((a, b) => a.indexKey - b.indexKey); + item.groups.forEach(group => { + group.sessions.sort((a, b) => { + if (a.timeStart > b.timeStart) { return 1; } + return -1; + }); + }); + }); + } + + updateFilter() { + const filterOption = this.getFilterOption(); + this.schedule.forEach(daily => { + daily.groups.forEach(group => { + group.sessions.forEach(session => { + session = this.dataProvider.filterSession(session, filterOption); + }); + }); }); } + processBySegment() { + if (this.segment === 'one') { + this.chooseTrack(); + } else if (this.segment === 'all') { + this.excludeTracks = []; + this.updateFilter(); + } else if (this.segment === 'favorites') { + this.updateFilter(); + } + } + + async chooseTrack() { + const modal = await this.modalCtrl.create({ + component: ScheduleTrackPage, + componentProps: { excludedTracks: this.excludeTracks } + }); + await modal.present(); + + const { data } = await modal.onWillDismiss(); + if (data) { + this.excludeTracks = data; + this.segment = 'user'; + this.updateFilter(); + } else { + this.segment = ''; + } + } + async presentFilter() { const modal = await this.modalCtrl.create({ component: ScheduleFilterPage, @@ -60,18 +180,25 @@ export class SchedulePage implements OnInit { const { data } = await modal.onWillDismiss(); if (data) { this.excludeTracks = data; - this.updateSchedule(); + this.segment = 'user'; + this.updateFilter(); } } - async addFavorite(slidingItem: HTMLIonItemSlidingElement, sessionData: any) { - if (this.user.hasFavorite(sessionData.name)) { + goToSessionDetail(sessionData: any) { + // go to the session detail page + // and pass in the session data + this.router.navigateByUrl(`app/tabs/(schedule:session/${sessionData.id})`); + } + +async addFavorite(slidingItem: HTMLIonItemSlidingElement, sessionData: any) { + if (this.userProvider.hasFavorite(sessionData.name)) { // woops, they already favorited it! What shall we do!? // prompt them to remove it this.removeFavorite(slidingItem, sessionData, 'Favorite already added'); } else { // remember this session as a user favorite - this.user.addFavorite(sessionData.name); + this.userProvider.addFavorite(sessionData.name); // create an alert instance const alert = await this.alertCtrl.create({ @@ -107,7 +234,7 @@ export class SchedulePage implements OnInit { text: 'Remove', handler: () => { // they want to remove this session from their favorites - this.user.removeFavorite(sessionData.name); + this.userProvider.removeFavorite(sessionData.name); this.updateSchedule(); // close the sliding item and hide the option buttons diff --git a/src/app/pages/session-detail/session-detail.html b/src/app/pages/session-detail/session-detail.html index 34e3dafb6..2a77aef36 100644 --- a/src/app/pages/session-detail/session-detail.html +++ b/src/app/pages/session-detail/session-detail.html @@ -1,7 +1,7 @@ - + - + {{session?.name}} diff --git a/src/app/pages/session-detail/session-detail.ts b/src/app/pages/session-detail/session-detail.ts index 80b0c7daa..898f2bdee 100644 --- a/src/app/pages/session-detail/session-detail.ts +++ b/src/app/pages/session-detail/session-detail.ts @@ -1,8 +1,9 @@ import { Component } from '@angular/core'; - -import { ConferenceData } from '../../providers/conference-data'; import { ActivatedRoute } from '@angular/router'; + import { UserData } from '../../providers/user-data'; +import { SessionData } from '../../providers/session-data'; +import { Session, User } from '../../models'; @Component({ selector: 'page-session-detail', @@ -10,52 +11,46 @@ import { UserData } from '../../providers/user-data'; templateUrl: 'session-detail.html' }) export class SessionDetailPage { - session: any; + session: Session; + user: User; isFavorite = false; - defaultHref = ''; + constructor( - private dataProvider: ConferenceData, + private sessionProvider: SessionData, private userProvider: UserData, private route: ActivatedRoute ) {} + + ionViewWillEnter() { + const id = this.route.snapshot.paramMap.get('sessionId'); + this.sessionProvider.getSession(id) + .then( data => { + data.id = id; + this.session = data; + this.userProvider.getUser().then(user => { + this.user = user; + this.user.favorites.forEach(favorite => { + if (favorite.id === this.session.id) { this.isFavorite = true; } + }); + }); + } + ); + } + sessionClick(item: string) { console.log('Clicked', item); } + toggleFavorite() { - if (this.userProvider.hasFavorite(this.session.name)) { - this.userProvider.removeFavorite(this.session.name); - this.isFavorite = false; + if (this.isFavorite) { + const index = this.user.favorites.findIndex(f => f.id === this.session.id); + if (index > -1) { + this.user.favorites.splice(index, 1); + } } else { - this.userProvider.addFavorite(this.session.name); - this.isFavorite = true; + this.user.favorites.push({id: this.session.id, name: this.session.name }); } - } - ionViewWillEnter() { - this.dataProvider.load().subscribe((data: any) => { - if ( - data && - data.schedule && - data.schedule[0] && - data.schedule[0].groups - ) { - const sessionId = this.route.snapshot.paramMap.get('sessionId'); - for (const group of data.schedule[0].groups) { - if (group && group.sessions) { - for (const session of group.sessions) { - if (session && session.id === sessionId) { - this.session = session; - this.isFavorite = this.userProvider.hasFavorite( - this.session.name - ); - break; - } - } - } - } - } - }); - } - ionViewDidEnter() { - this.defaultHref = `/app/tabs/schedule`; + this.userProvider.updateUser(this.user); + this.isFavorite = !this.isFavorite; } } diff --git a/src/app/pages/signup/signup.html b/src/app/pages/signup/signup.html index 38c5bed9c..fd0f2fdeb 100644 --- a/src/app/pages/signup/signup.html +++ b/src/app/pages/signup/signup.html @@ -1,5 +1,5 @@ - + @@ -26,9 +26,21 @@

+ + Email + + + + +

+ Email is required +

+
+ Password - + @@ -36,6 +48,22 @@ Password is required

+ + + Confirm Password + + + + +

+ Confirm Password is required +

+
+ +

+ Password does not match with Confirm Password +

+
diff --git a/src/app/pages/signup/signup.ts b/src/app/pages/signup/signup.ts index 1bc639081..627623bc4 100644 --- a/src/app/pages/signup/signup.ts +++ b/src/app/pages/signup/signup.ts @@ -1,33 +1,65 @@ -import { Component, ViewEncapsulation } from '@angular/core'; +import { Component, ViewEncapsulation, OnInit } from '@angular/core'; import { NgForm } from '@angular/forms'; import { Router } from '@angular/router'; import { UserData } from '../../providers/user-data'; - -import { UserOptions } from '../../interfaces/user-options'; - - +import { ConferenceData } from '../../providers/conference-data'; +import { User, Track } from '../../models'; @Component({ selector: 'page-signup', templateUrl: 'signup.html', styleUrls: ['./signup.scss'], + encapsulation: ViewEncapsulation.None }) -export class SignupPage { - signup: UserOptions = { username: '', password: '' }; +export class SignupPage implements OnInit { + users: User[]; + signup: User = { + username: '', password: '', email: '', favorites: [], trackFilter: [] + }; + tracks: Track[]; + confirmPassword = ''; submitted = false; - constructor( - public router: Router, - public userData: UserData - ) {} + constructor(public router: Router, + public userProvider: UserData, + public dataProvider: ConferenceData) {} + + ngOnInit() { + this.userProvider.getUsers().subscribe( + (data: User[]) => { this.users = data; } + ); + this.dataProvider.getTracks().subscribe( + (tracks: Track[]) => { this.tracks = tracks; } + ); + } onSignup(form: NgForm) { this.submitted = true; - - if (form.valid) { - this.userData.signup(this.signup.username); - this.router.navigateByUrl('/app/tabs/schedule'); + if (form.valid && this.signup.password === this.confirmPassword) { + if (this.isNameUsed(this.signup.username)) { + alert('Name is already taken.'); + } else if (this.isEmailUsed(this.signup.email)) { + alert('Email is already taken.'); + } else { + this.setTrackFilter(); + this.userProvider.signup(this.signup); + this.router.navigateByUrl('/app/tabs/(speakers:speakers)'); + } } } + + setTrackFilter() { + this.tracks.forEach(track => { + this.signup.trackFilter.push({ name: track.name, isChecked: true }); + }); + } + + isNameUsed(name) { + return this.users.find(ur => ur.username.toLowerCase() === name.toLowerCase()); + } + + isEmailUsed(email) { + return this.users.find(ur => ur.email.toLowerCase() === email.toLowerCase()); + } } diff --git a/src/app/pages/speaker-detail/speaker-detail.html b/src/app/pages/speaker-detail/speaker-detail.html index d50199ab3..1eb361bd7 100644 --- a/src/app/pages/speaker-detail/speaker-detail.html +++ b/src/app/pages/speaker-detail/speaker-detail.html @@ -1,7 +1,7 @@ - + - + {{speaker?.name}} @@ -12,16 +12,20 @@
- + - + - +

{{speaker?.about}}

+

{{speaker?.location}}

+

{{speaker?.email}}

+

{{speaker?.phone}}

+

Sessions involved: {{speaker?.sessions.length}}

diff --git a/src/app/pages/speaker-detail/speaker-detail.ts b/src/app/pages/speaker-detail/speaker-detail.ts index fb148a176..29729b5d5 100644 --- a/src/app/pages/speaker-detail/speaker-detail.ts +++ b/src/app/pages/speaker-detail/speaker-detail.ts @@ -1,32 +1,55 @@ import { Component, ViewEncapsulation } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { ConferenceData } from '../../providers/conference-data'; +import { InAppBrowser } from '@ionic-native/in-app-browser/ngx'; + +import { SpeakerData } from '../../providers/speaker-data'; +import { Speaker } from '../../models'; @Component({ selector: 'page-speaker-detail', templateUrl: 'speaker-detail.html', styleUrls: ['./speaker-detail.scss'], + encapsulation: ViewEncapsulation.None }) export class SpeakerDetailPage { - speaker: any; + speaker: Speaker; constructor( - private dataProvider: ConferenceData, + private speakerProvider: SpeakerData, private router: Router, - private route: ActivatedRoute + private route: ActivatedRoute, + public inAppBrowser: InAppBrowser ) {} ionViewWillEnter() { - this.dataProvider.load().subscribe((data: any) => { - const speakerId = this.route.snapshot.paramMap.get('speakerId'); - if (data && data.speakers) { - for (const speaker of data.speakers) { - if (speaker && speaker.id === speakerId) { - this.speaker = speaker; - break; - } - } - } - }); + const id = this.route.snapshot.paramMap.get('speakerId'); + this.speakerProvider.getSpeaker(id) + .then( data => { this.speaker = data; } + ); + } + + goToSessionDetail(session: any) { + this.router.navigateByUrl(`app/tabs/(schedule:session/${session.id})`); + } + + goToSpeakerTwitter() { + this.inAppBrowser.create( + `https://twitter.com/${this.speaker.twitter}`, + '_blank' + ); + } + + goToSpeakergithub() { + this.inAppBrowser.create( + `https://github.com/${this.speaker.github}`, + '_blank' + ); + } + + goToSpeakerInstagram() { + this.inAppBrowser.create( + `https://instagram.com/${this.speaker.instagram}`, + '_blank' + ); } } diff --git a/src/app/pages/speaker-list/speaker-list.html b/src/app/pages/speaker-list/speaker-list.html index 05cd974a4..89bdf002e 100644 --- a/src/app/pages/speaker-list/speaker-list.html +++ b/src/app/pages/speaker-list/speaker-list.html @@ -1,5 +1,5 @@ - + @@ -14,7 +14,7 @@ - + Speaker profile pic @@ -24,11 +24,11 @@ - +

{{session.name}}

- +

About {{speaker.name}}

diff --git a/src/app/pages/speaker-list/speaker-list.ts b/src/app/pages/speaker-list/speaker-list.ts index e50e5debd..ae6b943ec 100644 --- a/src/app/pages/speaker-list/speaker-list.ts +++ b/src/app/pages/speaker-list/speaker-list.ts @@ -1,32 +1,35 @@ import { Component, ViewEncapsulation } from '@angular/core'; import { Router } from '@angular/router'; import { InAppBrowser } from '@ionic-native/in-app-browser/ngx'; -import { ActionSheetController } from '@ionic/angular'; +import { ActionSheetController, AlertController } from '@ionic/angular'; -import { ConferenceData } from '../../providers/conference-data'; +import { Speaker } from '../../models'; +import { SpeakerData } from '../../providers/speaker-data'; @Component({ selector: 'page-speaker-list', templateUrl: 'speaker-list.html', styleUrls: ['./speaker-list.scss'], + encapsulation: ViewEncapsulation.None }) export class SpeakerListPage { - speakers: any[] = []; + speakers: Speaker[]; constructor( public actionSheetCtrl: ActionSheetController, - public confData: ConferenceData, + public alertCtrl: AlertController, + private speakerProvider: SpeakerData, public inAppBrowser: InAppBrowser, public router: Router ) {} ionViewDidEnter() { - this.confData.getSpeakers().subscribe((speakers: any[]) => { - this.speakers = speakers; - }); + this.speakerProvider.getSpeakers().subscribe( + speakers => { this.speakers = speakers; } + ); } - goToSpeakerTwitter(speaker: any) { + goToSpeakerTwitter(speaker: Speaker) { this.inAppBrowser.create( `https://twitter.com/${speaker.twitter}`, '_blank' diff --git a/src/app/pages/support/support.html b/src/app/pages/support/support.html index 278e9856f..44e69e5e2 100644 --- a/src/app/pages/support/support.html +++ b/src/app/pages/support/support.html @@ -1,14 +1,13 @@ - + Support - - + @@ -26,9 +25,12 @@ Support message is required

-
Submit
+ +

You need to login first!

+
+ diff --git a/src/app/pages/support/support.scss b/src/app/pages/support/support.scss index e6e125144..ca558fcfd 100644 --- a/src/app/pages/support/support.scss +++ b/src/app/pages/support/support.scss @@ -1,13 +1,19 @@ -.support-logo { - padding: 20px 0; - min-height: 200px; - text-align: center; -} +page-support { + .support-logo { + padding: 20px 0; + min-height: 200px; + text-align: center; + } -.support-logo img { - max-width: 150px; -} + .support-logo img { + max-width: 150px; + } -.list { - margin-bottom: 0; -} + .list { + margin-bottom: 0; + } + + .support-msg h4 { + margin: 200px 80px; + } +} \ No newline at end of file diff --git a/src/app/pages/support/support.ts b/src/app/pages/support/support.ts index 4d55f8e5d..d32db0846 100644 --- a/src/app/pages/support/support.ts +++ b/src/app/pages/support/support.ts @@ -1,38 +1,41 @@ import { Component, ViewEncapsulation } from '@angular/core'; import { NgForm } from '@angular/forms'; +import { Storage } from '@ionic/storage'; import { AlertController, ToastController } from '@ionic/angular'; - +import { UserData } from '../../providers/user-data'; +import { SupportData } from '../../providers/support-data'; @Component({ selector: 'page-support', templateUrl: 'support.html', styleUrls: ['./support.scss'], + encapsulation: ViewEncapsulation.None }) export class SupportPage { + isLoggedIn = false; submitted = false; supportMessage: string; - constructor( - public alertCtrl: AlertController, - public toastCtrl: ToastController - ) { } + constructor(public alertCtrl: AlertController, + public toastCtrl: ToastController, + private userData: UserData, + private supportData: SupportData, + public storage: Storage) { + } async ionViewDidEnter() { - const toast = await this.toastCtrl.create({ - message: 'This does not actually send a support request.', - duration: 3000 - }); - await toast.present(); + this.userData.isLoggedIn() + .then(res => this.isLoggedIn = res); } async submit(form: NgForm) { this.submitted = true; if (form.valid) { + this.supportData.addSupport(this.supportMessage); this.supportMessage = ''; this.submitted = false; - const toast = await this.toastCtrl.create({ message: 'Your support request has been sent.', duration: 3000 @@ -40,26 +43,4 @@ export class SupportPage { await toast.present(); } } - - // If the user enters text in the support question and then navigates - // without submitting first, ask if they meant to leave the page - // async ionViewCanLeave(): Promise { - // // If the support message is empty we should just navigate - // if (!this.supportMessage || this.supportMessage.trim().length === 0) { - // return true; - // } - - // return new Promise((resolve: any, reject: any) => { - // const alert = await this.alertCtrl.create({ - // title: 'Leave this page?', - // message: 'Are you sure you want to leave this page? Your support message will not be submitted.', - // buttons: [ - // { text: 'Stay', handler: reject }, - // { text: 'Leave', role: 'cancel', handler: resolve } - // ] - // }); - - // await alert.present(); - // }); - // } } diff --git a/src/app/pages/tabs-page/tabs-page-routing.module.ts b/src/app/pages/tabs-page/tabs-page-routing.module.ts index fa31409c5..6ebfeac42 100644 --- a/src/app/pages/tabs-page/tabs-page-routing.module.ts +++ b/src/app/pages/tabs-page/tabs-page-routing.module.ts @@ -1,7 +1,14 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; + import { TabsPage } from './tabs-page'; + +import { AboutPage } from '../about/about'; +import { MapPage } from '../map/map'; import { SchedulePage } from '../schedule/schedule'; +import { SessionDetailPage } from '../session-detail/session-detail'; +import { SpeakerDetailPage } from '../speaker-detail/speaker-detail'; +import { SpeakerListPage } from '../speaker-list/speaker-list'; const routes: Routes = [ @@ -9,58 +16,44 @@ const routes: Routes = [ path: 'tabs', component: TabsPage, children: [ + // tab one { path: 'schedule', - children: [ - { - path: '', - component: SchedulePage, - }, - { - path: 'session/:sessionId', - loadChildren: '../session-detail/session-detail.module#SessionDetailModule' - } - ] + component: SchedulePage, + outlet: 'schedule' + }, + { + path: 'session/:sessionId', + component: SessionDetailPage, + outlet: 'schedule' }, + // tab two { path: 'speakers', - children: [ - { - path: '', - loadChildren: '../speaker-list/speaker-list.module#SpeakerListModule' - }, - { - path: 'session/:sessionId', - loadChildren: '../session-detail/session-detail.module#SessionDetailModule' - }, - { - path: 'speaker-details/:speakerId', - loadChildren: '../speaker-detail/speaker-detail.module#SpeakerDetailModule' - } - ] + component: SpeakerListPage, + outlet: 'speakers' }, { - path: 'map', - children: [ - { - path: '', - loadChildren: '../map/map.module#MapModule' - } - ] + path: 'session/:sessionId', + component: SessionDetailPage, + outlet: 'speakers' }, { - path: 'about', - children: [ - { - path: '', - loadChildren: '../about/about.module#AboutModule' - } - ] + path: 'speaker-details/:speakerId', + component: SpeakerDetailPage, + outlet: 'speakers' }, + // tab three { - path: '', - redirectTo: '/app/tabs/schedule', - pathMatch: 'full' + path: 'map', + component: MapPage, + outlet: 'map' + }, + // tab four + { + path: 'about', + component: AboutPage, + outlet: 'about' } ] } @@ -71,4 +64,3 @@ const routes: Routes = [ exports: [RouterModule] }) export class TabsPageRoutingModule { } - diff --git a/src/app/pages/tabs-page/tabs-page.html b/src/app/pages/tabs-page/tabs-page.html index d7da8656e..70e29fbb2 100644 --- a/src/app/pages/tabs-page/tabs-page.html +++ b/src/app/pages/tabs-page/tabs-page.html @@ -1,25 +1,41 @@ - + Schedule - + Speakers - + Map - + About + + + + + + + + + + + + + + + + diff --git a/src/app/pages/tutorial/tutorial.ts b/src/app/pages/tutorial/tutorial.ts index 79fc63ca3..9e6751bf7 100644 --- a/src/app/pages/tutorial/tutorial.ts +++ b/src/app/pages/tutorial/tutorial.ts @@ -1,7 +1,7 @@ import { Component, ViewChild, ViewEncapsulation } from '@angular/core'; import { Router } from '@angular/router'; -import { MenuController, IonSlides } from '@ionic/angular'; +import { MenuController, Slides } from '@ionic/angular'; import { Storage } from '@ionic/storage'; @@ -9,11 +9,12 @@ import { Storage } from '@ionic/storage'; selector: 'page-tutorial', templateUrl: 'tutorial.html', styleUrls: ['./tutorial.scss'], + encapsulation: ViewEncapsulation.None }) export class TutorialPage { showSkip = true; - @ViewChild('slides') slides: IonSlides; + @ViewChild('slides') slides: Slides; constructor( public menu: MenuController, @@ -23,7 +24,7 @@ export class TutorialPage { startApp() { this.router - .navigateByUrl('/app/tabs/schedule') + .navigateByUrl('/app/tabs/(speakers:speakers)') .then(() => this.storage.set('ion_did_tutorial', 'true')); } diff --git a/src/app/pages/upload-image/upload-image.component.html b/src/app/pages/upload-image/upload-image.component.html new file mode 100644 index 000000000..38bbdb835 --- /dev/null +++ b/src/app/pages/upload-image/upload-image.component.html @@ -0,0 +1,26 @@ +
Upload User's Avatar
+
+ +

Image Drop Zone

+

Drag and Drop a File

+
+ +
+ +
+ +
+ + + {{ pct | number }}% +
+ +
+ {{ snap.bytesTransferred | fileSize }} of {{ snap.totalBytes | fileSize }} +
diff --git a/src/app/pages/upload-image/upload-image.component.scss b/src/app/pages/upload-image/upload-image.component.scss new file mode 100644 index 000000000..3c4bf3bd1 --- /dev/null +++ b/src/app/pages/upload-image/upload-image.component.scss @@ -0,0 +1,43 @@ +.title { + font-size: 1.4em; + margin-top: 40px; +} + +.dropzone { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + font-weight: 200; + height: 300px; + border: 2px dashed #f16624; + border-radius: 5px; + background: white; + margin: 40px 0; + + &.hovering { + border: 2px solid #f16624; + color: #dadada !important; + } + + .file-label { + font-size: 1em; + } +} + +progress::-webkit-progress-value { + transition: width 0.1s ease; +} + +img { + width: 250px +} + +button { + padding: 10px; + width: 150px; + font-size: 1em; + font-weight: 400; + background-color: #f16624; + color: white +} diff --git a/src/app/pages/upload-image/upload-image.component.ts b/src/app/pages/upload-image/upload-image.component.ts new file mode 100644 index 000000000..c8005536c --- /dev/null +++ b/src/app/pages/upload-image/upload-image.component.ts @@ -0,0 +1,72 @@ +import { Component, Output, Input, EventEmitter } from '@angular/core'; +import { AngularFireStorage, AngularFireUploadTask } from 'angularfire2/storage'; +import { AngularFirestore } from 'angularfire2/firestore'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +@Component({ + selector: 'upload-image', + templateUrl: './upload-image.component.html', + styleUrls: ['./upload-image.component.scss'] +}) +export class UploadImageComponent { + + @Input() username: string; + @Output() exit = new EventEmitter(); + @Output() updateUser = new EventEmitter(); + + // Main task + task: AngularFireUploadTask; + + // State for dropzone CSS toggling + isHovering: boolean; + + // Progress monitoring + percentage: Observable; + + snapshot: Observable; + + // constructor(private db: AngularFirestore) { } + constructor(private storage: AngularFireStorage, private db: AngularFirestore) { } + + toggleHover(event: boolean) { + this.isHovering = event; + } + + startUpload(event: FileList) { + // The File object + const file = event.item(0); + + // Client-side validation example + if (!file || file.type.split('/')[0] !== 'image') { + console.error('unsupported file type :( '); + return; + } + + // The storage path + const path = `avatars/${new Date().getTime()}_${file.name}`; + + // Totally optional metadata + const customMetadata = { app: 'My AngularFire-powered PWA!' }; + + // const ref = this.storage.ref(path); + // this.task = ref.put(file, { customMetadata }); + // The main task + this.task = this.storage.upload(path, file, { customMetadata }); + + // Progress monitoring + this.percentage = this.task.percentageChanges(); + this.snapshot = this.task.snapshotChanges().pipe( + tap(snap => { + if (snap.bytesTransferred === snap.totalBytes) { + this.updateUser.emit(path); + } + }) + ); + } + + // Determines if the upload task is active + isActive(snapshot) { + return snapshot.state === 'running' && snapshot.bytesTransferred < snapshot.totalBytes; + } +} diff --git a/src/app/pipe/file-size.pipe.ts b/src/app/pipe/file-size.pipe.ts new file mode 100644 index 000000000..3bc76a88d --- /dev/null +++ b/src/app/pipe/file-size.pipe.ts @@ -0,0 +1,25 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +const FILE_SIZE_UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; +const FILE_SIZE_UNITS_LONG = ['Bytes', 'Kilobytes', 'Megabytes', 'Gigabytes', 'Pettabytes', 'Exabytes', 'Zettabytes', 'Yottabytes']; + +@Pipe({ + name: 'fileSize' +}) +export class FileSizePipe implements PipeTransform { + + transform(sizeInBytes: number, longForm: boolean): string { + const units = longForm + ? FILE_SIZE_UNITS_LONG + : FILE_SIZE_UNITS; + + let power = Math.round(Math.log(sizeInBytes) / Math.log(1024)); + power = Math.min(power, units.length - 1); + + const size = sizeInBytes / Math.pow(1024, power); // size in new units + const formattedSize = Math.round(size * 100) / 100; // keep up to 2 decimals + const unit = units[power]; + + return size ? `${formattedSize} ${unit}` : '0'; + } +} diff --git a/src/app/providers/conference-data.ts b/src/app/providers/conference-data.ts index 9891292d4..82cc9e51f 100644 --- a/src/app/providers/conference-data.ts +++ b/src/app/providers/conference-data.ts @@ -1,117 +1,80 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { of } from 'rxjs'; +import { AngularFirestore, + AngularFirestoreCollection, + AngularFirestoreDocument } from 'angularfire2/firestore'; +import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; - import { UserData } from './user-data'; +import { Track, Session, PartOfDay } from '../models'; @Injectable({ providedIn: 'root' }) export class ConferenceData { - data: any; + tracksCollection: AngularFirestoreCollection ; + trackDoc: AngularFirestoreDocument ; + tracks: Observable ; + track: Observable ; - constructor(public http: HttpClient, public user: UserData) {} + sessionsCollection: AngularFirestoreCollection; + sessions: Observable ; + session: Observable ; - load(): any { - if (this.data) { - return of(this.data); - } else { - return this.http - .get('assets/data/data.json') - .pipe(map(this.processData, this)); - } - } + partsOfDayCollection: AngularFirestoreCollection; + partsOfDay: Observable; - processData(data: any) { - // just some good 'ol JS fun with objects and arrays - // build up the data by linking speakers to sessions - this.data = data; + mapsCollection: AngularFirestoreCollection; + maps: Observable; - this.data.tracks = []; + data: any; - // loop through each day in the schedule - this.data.schedule.forEach((day: any) => { - // loop through each timeline group in the day - day.groups.forEach((group: any) => { - // loop through each session in the timeline group - group.sessions.forEach((session: any) => { - session.speakers = []; - if (session.speakerNames) { - session.speakerNames.forEach((speakerName: any) => { - const speaker = this.data.speakers.find( - (s: any) => s.name === speakerName - ); - if (speaker) { - session.speakers.push(speaker); - speaker.sessions = speaker.sessions || []; - speaker.sessions.push(session); - } - }); - } + constructor( + public http: HttpClient, + public userProvider: UserData, + private afs: AngularFirestore) { + this.tracksCollection = this.afs.collection( + 'tracks', ref => ref.orderBy('name', 'asc')); + this.partsOfDayCollection = this.afs.collection( + 'partsOfDay', ref => ref.orderBy('indexKey', 'asc')); + this.mapsCollection = this.afs.collection( + 'maps', ref => ref.orderBy('name', 'asc')); + } - if (session.tracks) { - session.tracks.forEach((track: any) => { - if (this.data.tracks.indexOf(track) < 0) { - this.data.tracks.push(track); - } - }); - } - }); + getPartsOfDay(): Observable { + this.partsOfDay = this.partsOfDayCollection.snapshotChanges() + .pipe(map(response => { + return response.map(action => { + const data = action.payload.doc.data() as any; + return data; }); - }); - - return this.data; + })); + return this.partsOfDay ; } - getTimeline( - dayIndex: number, - queryText = '', - excludeTracks: any[] = [], - segment = 'all' - ) { - return this.load().pipe( - map((data: any) => { - const day = data.schedule[dayIndex]; - day.shownSessions = 0; - - queryText = queryText.toLowerCase().replace(/,|\.|-/g, ' '); - const queryWords = queryText.split(' ').filter(w => !!w.trim().length); - - day.groups.forEach((group: any) => { - group.hide = true; - - group.sessions.forEach((session: any) => { - // check if this session should show or not - this.filterSession(session, queryWords, excludeTracks, segment); - - if (!session.hide) { - // if this session is not hidden then this group should show - group.hide = false; - day.shownSessions++; - } - }); - }); - - return day; - }) - ); + getSessionInPeriod(start, end): Observable { + this.sessionsCollection = this.afs.collection( + 'sessions', ref => ref.where('date', '>=', start) + .where('date', '<=', end) + .orderBy('date', 'asc')); + this.sessions = this.sessionsCollection.snapshotChanges() + .pipe(map(response => { + return response.map(action => { + const data = action.payload.doc.data() as any; + data.id = action.payload.doc.id; + return data; + }); + })); + return this.sessions ; } - filterSession( - session: any, - queryWords: string[], - excludeTracks: any[], - segment: string - ) { + filterSession(session: any, options: any) { let matchesQueryText = false; - if (queryWords.length) { + if (options.queryText.length > 0) { // of any query word is in the session name than it passes the query test - queryWords.forEach((queryWord: string) => { - if (session.name.toLowerCase().indexOf(queryWord) > -1) { - matchesQueryText = true; - } - }); + if (session.name.toLowerCase().indexOf(options.queryText) > -1) { + matchesQueryText = true; + } } else { // if there are no query words then this session passes the query test matchesQueryText = true; @@ -121,7 +84,7 @@ export class ConferenceData { // exclude tracks then this session passes the track test let matchesTracks = false; session.tracks.forEach((trackName: string) => { - if (excludeTracks.indexOf(trackName) === -1) { + if (options.excludeTracks.indexOf(trackName) === -1) { matchesTracks = true; } }); @@ -129,43 +92,39 @@ export class ConferenceData { // if the segement is 'favorites', but session is not a user favorite // then this session does not pass the segment test let matchesSegment = false; - if (segment === 'favorites') { - if (this.user.hasFavorite(session.name)) { - matchesSegment = true; - } + if (options.segment === 'favorites') { + this.userProvider.getUser().then(user => { + matchesSegment = (user.favorites.findIndex(f => f.name === session.name) > -1); + // all tests must be true if it should not be hidden + session.hide = !(matchesQueryText && matchesTracks && matchesSegment); + }); } else { - matchesSegment = true; + // doesn't matter about favorites. + session.hide = !(matchesQueryText && matchesTracks); } - - // all tests must be true if it should not be hidden - session.hide = !(matchesQueryText && matchesTracks && matchesSegment); + return session; } - getSpeakers() { - return this.load().pipe( - map((data: any) => { - return data.speakers.sort((a: any, b: any) => { - const aName = a.name.split(' ').pop(); - const bName = b.name.split(' ').pop(); - return aName.localeCompare(bName); + getTracks(): Observable { + this.tracks = this.tracksCollection.snapshotChanges() + .pipe(map(response => { + return response.map(action => { + const data = action.payload.doc.data() as Track; + data.id = action.payload.doc.id; + return data; }); - }) - ); - } - - getTracks() { - return this.load().pipe( - map((data: any) => { - return data.tracks.sort(); - }) - ); + })); + return this.tracks ; } getMap() { - return this.load().pipe( - map((data: any) => { - return data.map; - }) - ); + this.maps = this.mapsCollection.snapshotChanges() + .pipe(map(response => { + return response.map(action => { + const data = action.payload.doc.data() as any; + return data; + }); + })); + return this.maps ; } } diff --git a/src/app/providers/function-data.ts b/src/app/providers/function-data.ts new file mode 100644 index 000000000..dc8816c89 --- /dev/null +++ b/src/app/providers/function-data.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class FunctionlData { + + getDateFormat(date: Date) { + if (!date) { + date = new Date(); + } + const dateArray = date.toLocaleDateString().split('/'); + return dateArray[2] + '-' + + this.reform2digits(dateArray[0]) + '-' + + this.reform2digits(dateArray[1]); + } + + getAmPmTimeFormat(time: string): string { + if (!time) { return '00:00 am' ; } + let t = +time.split(':')[0]; + let m = time.split(':')[1]; + if (t > 11) { + m = m + ' pm'; + t = (t === 12) ? t : t - 12 ; + } else { + m = m + ' am'; + } + return this.reform2digits(t) + ':' + m ; + } + + get24HoursFormat(time: string): string { + if (!time) { return '' ; } + const data = time.split(' '); + let t = +data[0].split(':')[0]; + const m = data[0].split(':')[1]; + if (data[1] === 'pm' && t < 12) { t = t + 12 ; } + const realTime = (t < 10 ? '0' : '') + t; + return realTime + ':' + m ; + } + + reform2digits(value): string { + value = +value; + return ((value < 10) ? '0' : '') + value ; + } +} diff --git a/src/app/providers/session-data.ts b/src/app/providers/session-data.ts new file mode 100644 index 000000000..f723b31cc --- /dev/null +++ b/src/app/providers/session-data.ts @@ -0,0 +1,62 @@ +import { Injectable } from '@angular/core'; +import { AngularFirestore, + AngularFirestoreCollection, + AngularFirestoreDocument } from 'angularfire2/firestore'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { Session } from '../models'; + +@Injectable({ + providedIn: 'root' +}) +export class SessionData { + sessionsCollection: AngularFirestoreCollection ; + sessionDoc: AngularFirestoreDocument ; + sessions: Observable ; + session: Observable ; + id: string; + + constructor(private afs: AngularFirestore) { + this.sessionsCollection = this.afs.collection( + 'sessions', ref => ref.orderBy('date', 'asc')); + } + + getSessions(): Observable { + this.sessions = this.sessionsCollection.snapshotChanges() + .pipe(map(response => { + return response.map(action => { + const data = action.payload.doc.data() as Session; + data.id = action.payload.doc.id; + return data; + }); + })); + return this.sessions ; + } + + addNewSession(session: Session) { + return this.sessionsCollection.add(session) + .then(docRef => { + const id = docRef.id; + return id; + }); + } + + updateSession(id: string, session: Session) { + this.sessionDoc = this.afs.doc(`sessions/${id}`); + this.sessionDoc.update(session); + } + + deleteSession(session: Session) { + this.sessionDoc = this.afs.doc(`sessions/${session.id}`); + this.sessionDoc.delete(); + } + + getSession(id: string) { + return this.sessionsCollection.doc(id).ref.get() + .then(doc => { + const res = doc.data() as Session ; + return res; + }); + } +} diff --git a/src/app/providers/speaker-data.ts b/src/app/providers/speaker-data.ts new file mode 100644 index 000000000..436966d59 --- /dev/null +++ b/src/app/providers/speaker-data.ts @@ -0,0 +1,83 @@ +import { Injectable } from '@angular/core'; +import { AngularFirestore, + AngularFirestoreCollection, + AngularFirestoreDocument } from 'angularfire2/firestore'; +import { AngularFireStorage } from 'angularfire2/storage'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { Speaker } from '../models'; + +@Injectable({ + providedIn: 'root' +}) +export class SpeakerData { + speakersCollection: AngularFirestoreCollection ; + speakerDoc: AngularFirestoreDocument ; + speakers: Observable ; + speaker: Observable ; + + constructor(private afs: AngularFirestore, + private fireStorage: AngularFireStorage) { + this.speakersCollection = this.afs.collection( + 'speakers', ref => ref.orderBy('name', 'asc')); + } + + getSpeakers(): Observable { + this.speakers = this.speakersCollection.snapshotChanges() + .pipe(map(response => { + return response.map(action => { + const data = action.payload.doc.data() as Speaker; + data.id = action.payload.doc.id; + this.fireStorage.ref(data.profilePic).getDownloadURL().subscribe(url => { + data.profilePic = url; + }); + return data; + }); + })); + return this.speakers ; + } + + getSpeaker(id: string) { + return this.speakersCollection.doc(id).ref.get() + .then(doc => { + const speaker = doc.data() as Speaker; + this.fireStorage.ref(speaker.profilePic).getDownloadURL().subscribe(url => { + speaker.profilePic = url; + }); + return speaker; + }); + } + + addNewSpeaker(speaker: Speaker) { + this.speakersCollection.add(speaker) ; + } + + updateSpeaker(speaker: Speaker) { + this.speakerDoc = this.afs.doc(`speakers/${speaker.id}`); + delete(speaker.id); + this.speakerDoc.update(speaker); + } + + getSpeakerName(id: string) { + this.speakerDoc = this.afs.doc(`speakers/${id}`); + const name = this.speakerDoc.snapshotChanges.name; + return name; + } + + updateSpeakers() { + this.getSpeakers().subscribe( + (speakers: Speaker[]) => { + speakers.forEach( speaker => { + const id = speaker.id; + delete(speaker.id); + speaker.instagram = ''; + speaker.github = 'hogusong'; + if (!speaker.twitter) { speaker.twitter = 'YoungSongJS'; } + this.speakerDoc = this.afs.doc(`speakers/${id}`); + this.speakerDoc.update(speaker); + }); + } + ); + } +} diff --git a/src/app/providers/support-data.ts b/src/app/providers/support-data.ts new file mode 100644 index 000000000..4168b2520 --- /dev/null +++ b/src/app/providers/support-data.ts @@ -0,0 +1,54 @@ +import { Injectable } from '@angular/core'; +import { Events } from '@ionic/angular'; +import { AngularFirestore, + AngularFirestoreCollection, + AngularFirestoreDocument } from 'angularfire2/firestore'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { Support } from '../models'; +import { FunctionlData } from './function-data'; +import { UserData } from './user-data'; + +@Injectable({ + providedIn: 'root' +}) +export class SupportData { + supportsCollection: AngularFirestoreCollection ; + supportDoc: AngularFirestoreDocument ; + supports: Observable ; + support: Observable ; + + constructor(private afs: AngularFirestore, + private functionProvider: FunctionlData, + private userProvider: UserData, + public events: Events) { + this.supportsCollection = this.afs.collection( + 'supports', ref => ref.orderBy('date', 'asc')); + } + + getSupports(): Observable { + this.supports = this.supportsCollection.snapshotChanges() + .pipe(map(response => { + return response.map(action => { + const data = action.payload.doc.data() as Support; + data.id = action.payload.doc.id; + return data; + }); + })); + return this.supports; + } + + addSupport(message: string) { + const date = this.functionProvider.getDateFormat(null); + this.userProvider.getUserId() + .then(id => { + const support: Support = { + date: date, + userId: id, + support: message + }; + this.supportsCollection.add(support); + }); + } +} diff --git a/src/app/providers/user-data.ts b/src/app/providers/user-data.ts index c171627b1..23c082b3a 100644 --- a/src/app/providers/user-data.ts +++ b/src/app/providers/user-data.ts @@ -1,20 +1,53 @@ import { Injectable } from '@angular/core'; import { Events } from '@ionic/angular'; import { Storage } from '@ionic/storage'; +import { AngularFirestore, + AngularFirestoreCollection, + AngularFirestoreDocument } from 'angularfire2/firestore'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { User } from '../models'; +import { AngularFireStorage } from 'angularfire2/storage'; @Injectable({ providedIn: 'root' }) export class UserData { + usersCollection: AngularFirestoreCollection ; + userDoc: AngularFirestoreDocument ; + users: Observable ; _favorites: string[] = []; HAS_LOGGED_IN = 'hasLoggedIn'; HAS_SEEN_TUTORIAL = 'hasSeenTutorial'; - constructor( - public events: Events, - public storage: Storage - ) { } + constructor(private afs: AngularFirestore, + private fireStorage: AngularFireStorage, + public events: Events, + public storage: Storage) { + this.usersCollection = this.afs.collection( + 'users', ref => ref.orderBy('username', 'asc')); + } + + getUsers(): Observable { + this.users = this.usersCollection.snapshotChanges() + .pipe(map(response => { + return response.map(action => { + const data = action.payload.doc.data() as User; + data.id = action.payload.doc.id; + return data; + }); + })); + return this.users; + } + + signup(user: User) { + this.usersCollection.add(user) + .then(res => { + user.id = res.id; + this.login(user); + }); + } hasFavorite(sessionName: string): boolean { return (this._favorites.indexOf(sessionName) > -1); @@ -31,47 +64,73 @@ export class UserData { } } - login(username: string): Promise { + login(user: User): Promise { return this.storage.set(this.HAS_LOGGED_IN, true).then(() => { - this.setUsername(username); + this.setUser(user); return this.events.publish('user:login'); }); } - signup(username: string): Promise { - return this.storage.set(this.HAS_LOGGED_IN, true).then(() => { - this.setUsername(username); - return this.events.publish('user:signup'); - }); - } - logout(): Promise { return this.storage.remove(this.HAS_LOGGED_IN).then(() => { - return this.storage.remove('username'); + return this.storage.remove('user'); }).then(() => { this.events.publish('user:logout'); }); } - setUsername(username: string): Promise { - return this.storage.set('username', username); + setUser(user: User): Promise { + return this.storage.set('user', user); } - getUsername(): Promise { - return this.storage.get('username').then((value) => { - return value; + updateUser(user: User) { + const id = user.id; + delete(user.id); + this.userDoc = this.afs.doc(`users/${id}`); + this.userDoc.update(user) + .then(() => { + user.id = id; + this.storage.set('user', user); }); } - isLoggedIn(): Promise { - return this.storage.get(this.HAS_LOGGED_IN).then((value) => { - return value === true; + deleteUrl(oldUrl) { + if (oldUrl) { + this.fireStorage.storage.refFromURL(oldUrl).delete(); + } + } + + getUserById(id: string) { + return this.usersCollection.doc(id).ref.get() + .then(doc => { + const user = doc.data() as User; + user.id = id; + if (user.avatar) { + this.fireStorage.ref(user.avatar).getDownloadURL().subscribe(url => { + user.avatar = url; + }); + } + return user; }); } + getUser(): Promise { + return this.storage.get('user').then(user => user); + } + + getUsername(): Promise { + return this.storage.get('user').then(value => value.username); + } + + getUserId(): Promise { + return this.storage.get('user').then(value => value.id); + } + + isLoggedIn(): Promise { + return this.storage.get(this.HAS_LOGGED_IN).then(value => value); + } + checkHasSeenTutorial(): Promise { - return this.storage.get(this.HAS_SEEN_TUTORIAL).then((value) => { - return value; - }); + return this.storage.get(this.HAS_SEEN_TUTORIAL).then(value => value); } } diff --git a/src/assets/data/data.json b/src/assets/data/data.json index 717bc0a35..fcbe9776c 100755 --- a/src/assets/data/data.json +++ b/src/assets/data/data.json @@ -3,7 +3,7 @@ "schedule": [{ "date": "2047-05-17", "groups": [{ - "time": "8:00 am", + "time": "Morning", "sessions": [{ "name": "Breakfast", "timeStart": "8:00 am", @@ -11,10 +11,7 @@ "location": "Dining Hall", "tracks": ["Food"], "id": "1" - }] - }, { - "time": "9:15 am", - "sessions": [{ + }, { "name": "Getting Started with Ionic", "location": "Hall 2", "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", @@ -22,6 +19,7 @@ "timeStart": "9:30 am", "timeEnd": "9:45 am", "tracks": ["Ionic"], + "hide": true, "id": "2" }, { "name": "Ionic Tooling", @@ -41,10 +39,7 @@ "timeEnd": "9:30 am", "tracks": ["Ionic"], "id": "4" - }] - }, { - "time": "10:00 am", - "sessions": [{ + }, { "name": "Migrating to Ionic", "location": "Hall 1", "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", @@ -80,10 +75,7 @@ "timeEnd": "11:00 am", "tracks": ["Services"], "id": "8" - }] - }, { - "time": "11:00 am", - "sessions": [{ + }, { "name": "Ionic Workshop", "location": "Hall 1", "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", @@ -112,7 +104,7 @@ "id": "11" }] }, { - "time": "12:00 pm", + "time": "Afternoon", "sessions": [{ "name": "Lunch", "location": "Dining Hall", @@ -121,10 +113,7 @@ "timeEnd": "1:00 pm", "tracks": ["Food"], "id": "12" - }] - }, { - "time": "1:00 pm", - "sessions": [{ + }, { "name": "Ionic in the Enterprise", "location": "Hall 1", "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", @@ -151,10 +140,7 @@ "timeEnd": "2:00 pm", "tracks": ["Services"], "id": "15" - }] - }, { - "time": "2:00 pm", - "sessions": [{ + }, { "name": "Push Notifications in Ionic", "location": "Hall 2", "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", @@ -181,10 +167,7 @@ "timeEnd": "3:00 pm", "tracks": ["Design"], "id": "18" - }] - }, { - "time": "3:00", - "sessions": [{ + }, { "name": "Angular Directives in Ionic", "location": "Hall 1", "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with Angular, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and Angular.", diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts deleted file mode 100644 index 3612073bc..000000000 --- a/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true -}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts deleted file mode 100644 index ad4196020..000000000 --- a/src/environments/environment.ts +++ /dev/null @@ -1,15 +0,0 @@ -// The file contents for the current environment will overwrite these during build. -// The build system defaults to the dev environment which uses `environment.ts`, but if you do -// `ng build --env=prod` then `environment.prod.ts` will be used instead. -// The list of which env maps to which file can be found in `.angular-cli.json`. -export const environment = { - production: false -}; - -/* - * In development mode, to ignore zone related error stack frames such as - * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can - * import the following file, but please comment it out in production mode - * because it will have performance impact when throw error - */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/src/index.html b/src/index.html index b6e26a29c..46281cc6b 100644 --- a/src/index.html +++ b/src/index.html @@ -29,7 +29,7 @@ - +