diff --git a/package-lock.json b/package-lock.json index 69f5aa89..9a78654f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,15 +5,40 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.13.8.tgz", - "integrity": "sha512-gxUs5rhnP576T8ZclKqxlspiChrqRtqaJo54wqNVFvYKEjRZKyMa+1AK6p0oD9zcIToEkcjknj3BbtQa27lLHg==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.13.10.tgz", + "integrity": "sha512-FC+YmeXwFdNMmqnX1nIOkXBQMxWQSbgYz5crWcb7FtOWTNH1IgM/22tZ6lpf3kiAfTtBbnb7oTkA4Y69nUaoQg==", "dev": true, "requires": { - "@angular-devkit/core": "7.3.8", + "@angular-devkit/core": "7.3.10", "rxjs": "6.3.3" }, "dependencies": { + "@angular-devkit/core": { + "version": "7.3.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.10.tgz", + "integrity": "sha512-h8Yj2+UfBsPI7jZ8X88tImO/7RPgNWUcKF8Uq/J5eUSN6z0FMO0lluD4sM7X8aikb7RK8MwkwrqB/xfxvvkOow==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "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" + } + }, "rxjs": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", @@ -26,21 +51,21 @@ } }, "@angular-devkit/build-angular": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.13.8.tgz", - "integrity": "sha512-uRb8CKC0hUdcE+Fv2Ov9LJNelyjsiMuddBpo8pdTKCIHVVC6hvip9S/Z18Tvb207kKI3k7Dn+Ji1J63mCqmQzA==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.13.10.tgz", + "integrity": "sha512-wBWZJh89pPHE06WRoUJ+tdGk+yyMGM+3j0I2gduoxmGvgXXjf48tM4QbXZZSJbHkOeYlCiuP/wiVyTkshzCwGA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.13.8", - "@angular-devkit/build-optimizer": "0.13.8", - "@angular-devkit/build-webpack": "0.13.8", - "@angular-devkit/core": "7.3.8", - "@ngtools/webpack": "7.3.8", + "@angular-devkit/architect": "0.13.10", + "@angular-devkit/build-optimizer": "0.13.10", + "@angular-devkit/build-webpack": "0.13.10", + "@angular-devkit/core": "7.3.10", + "@ngtools/webpack": "7.3.10", "ajv": "6.9.1", "autoprefixer": "9.4.6", "circular-dependency-plugin": "5.0.2", "clean-css": "4.2.1", - "copy-webpack-plugin": "4.6.0", + "copy-webpack-plugin": "5.1.1", "file-loader": "3.0.1", "glob": "7.1.3", "istanbul-instrumenter-loader": "3.0.1", @@ -51,7 +76,7 @@ "loader-utils": "1.2.3", "mini-css-extract-plugin": "0.5.0", "minimatch": "3.0.4", - "node-sass": "4.11.0", + "node-sass": "4.13.1", "open": "6.0.0", "parse5": "4.0.0", "postcss": "7.0.14", @@ -68,8 +93,8 @@ "style-loader": "0.23.1", "stylus": "0.54.5", "stylus-loader": "3.0.2", - "terser-webpack-plugin": "1.2.2", - "tree-kill": "1.2.1", + "terser-webpack-plugin": "1.4.3", + "tree-kill": "1.2.2", "webpack": "4.29.0", "webpack-dev-middleware": "3.5.1", "webpack-dev-server": "3.1.14", @@ -78,6 +103,19 @@ "webpack-subresource-integrity": "1.1.0-rc.6" }, "dependencies": { + "@angular-devkit/core": { + "version": "7.3.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.10.tgz", + "integrity": "sha512-h8Yj2+UfBsPI7jZ8X88tImO/7RPgNWUcKF8Uq/J5eUSN6z0FMO0lluD4sM7X8aikb7RK8MwkwrqB/xfxvvkOow==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, "ajv": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", @@ -108,9 +146,9 @@ } }, "@angular-devkit/build-optimizer": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.13.8.tgz", - "integrity": "sha512-RvYxtsdYuvpFb1iivVixylSVN/Q8LsQ449uYuqEe3OsDjQBvUVG2fMLPOQjmKWhi0NC9WSsNiUluxLDNdvd0Vw==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.13.10.tgz", + "integrity": "sha512-BbavzPeuq6Sy9uC7FwOQ4DhxXvd8xsFkW8t8bXemQwHFP3BqrulxvelVfStJMN6dvXlC3BKXzFQjSX7wAocSdA==", "dev": true, "requires": { "loader-utils": "1.2.3", @@ -124,26 +162,45 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", "dev": true - }, - "typescript": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", - "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", - "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.13.8.tgz", - "integrity": "sha512-WMyn1vUHyx+VfJKgYuEHrICwQzPMDTaUNB1zlvzZt9gX/9H+XnetrebeWBZCITPXHBw/377oA6wmiHWJ0yaZRw==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.13.10.tgz", + "integrity": "sha512-TiNW1qLRePWORdme1tglAqK1xnAsyqxDQ5qmo3zPyyw1v253CG+yS2kAEAqiHPKwz8E3h9ETNPoaz6jcaAEWeg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.13.8", - "@angular-devkit/core": "7.3.8", + "@angular-devkit/architect": "0.13.10", + "@angular-devkit/core": "7.3.10", "rxjs": "6.3.3" }, "dependencies": { + "@angular-devkit/core": { + "version": "7.3.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.10.tgz", + "integrity": "sha512-h8Yj2+UfBsPI7jZ8X88tImO/7RPgNWUcKF8Uq/J5eUSN6z0FMO0lluD4sM7X8aikb7RK8MwkwrqB/xfxvvkOow==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "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" + } + }, "rxjs": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", @@ -233,6 +290,25 @@ "symbol-observable": "1.2.0" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.13.8.tgz", + "integrity": "sha512-gxUs5rhnP576T8ZclKqxlspiChrqRtqaJo54wqNVFvYKEjRZKyMa+1AK6p0oD9zcIToEkcjknj3BbtQa27lLHg==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.3.8", + "rxjs": "6.3.3" + } + }, + "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" + } + }, "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", @@ -539,12 +615,12 @@ } }, "@babel/generator": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", - "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", "dev": true, "requires": { - "@babel/types": "^7.7.2", + "@babel/types": "^7.7.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -556,12 +632,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -571,32 +641,32 @@ } }, "@babel/helper-function-name": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", - "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-get-function-arity": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", - "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", - "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/highlight": { @@ -617,9 +687,9 @@ } }, "@babel/parser": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.3.tgz", - "integrity": "sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz", + "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==", "dev": true }, "@babel/runtime": { @@ -640,28 +710,28 @@ } }, "@babel/template": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", - "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/traverse": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", - "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.2", - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", - "@babel/parser": "^7.7.2", - "@babel/types": "^7.7.2", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -691,12 +761,6 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -706,9 +770,9 @@ } }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -716,12 +780,6 @@ "to-fast-properties": "^2.0.0" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -1254,18 +1312,43 @@ } }, "@ngtools/webpack": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.3.8.tgz", - "integrity": "sha512-gfjSKz+F/2T4tZHpnQ1XqelKP/CIfI87XdoHsOI53ceTUrAkVKsOb3ULmEfkcdsdQZ/HhmCiLivcutHcW8xkhQ==", + "version": "7.3.10", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.3.10.tgz", + "integrity": "sha512-2NVylZt3ybnBCRky+R4JTMXUGeJjoqRQ2OzCd5STjyyWE5tjPKbxMjF4claO3kl2ep09ML0QPi7ngZrZVTcEqA==", "dev": true, "requires": { - "@angular-devkit/core": "7.3.8", + "@angular-devkit/core": "7.3.10", "enhanced-resolve": "4.1.0", "rxjs": "6.3.3", - "tree-kill": "1.2.1", + "tree-kill": "1.2.2", "webpack-sources": "1.3.0" }, "dependencies": { + "@angular-devkit/core": { + "version": "7.3.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.10.tgz", + "integrity": "sha512-h8Yj2+UfBsPI7jZ8X88tImO/7RPgNWUcKF8Uq/J5eUSN6z0FMO0lluD4sM7X8aikb7RK8MwkwrqB/xfxvvkOow==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "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" + } + }, "rxjs": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", @@ -1329,6 +1412,21 @@ "wait-on": "4.0.2" }, "dependencies": { + "@openstapps/core": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@openstapps/core/-/core-0.34.0.tgz", + "integrity": "sha512-+TJQrNCJ4F27/J2Y4ASYT37ACiNlS7cigLPYLi/+VWnHeQ5pnq9ErOoDeWbaZvSRw+dA6hvRXv2WJrNR6l6hhQ==", + "requires": { + "@types/geojson": "1.0.6", + "@types/json-patch": "0.0.30", + "@types/node": "10.17.14", + "fast-clone": "1.5.13", + "http-status-codes": "1.4.0", + "json-patch": "0.7.0", + "jsonschema": "1.2.5", + "ts-optchain": "0.1.3" + } + }, "@openstapps/logger": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@openstapps/logger/-/logger-0.5.0.tgz", @@ -1836,9 +1934,9 @@ } }, "@openstapps/core": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@openstapps/core/-/core-0.34.0.tgz", - "integrity": "sha512-+TJQrNCJ4F27/J2Y4ASYT37ACiNlS7cigLPYLi/+VWnHeQ5pnq9ErOoDeWbaZvSRw+dA6hvRXv2WJrNR6l6hhQ==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@openstapps/core/-/core-0.36.0.tgz", + "integrity": "sha512-u97oQTAzstA3RyzCd5QVqdKZYADvp2Bv9POGThwv5J6k4d5zXi44lgEj4Y7Y/zXDXC1Fo+xD2ziQ8Yv0WDr5eg==", "requires": { "@types/geojson": "1.0.6", "@types/json-patch": "0.0.30", @@ -2377,9 +2475,9 @@ "integrity": "sha512-Cj2jcMOzrdvWMP+Vl+qlz942eQfJk96S9kRnB1ejVMl+w9/9mUn0+pF4J+v0Iv+6zCrmBBODZAXKsRo6Y91Cfw==" }, "@types/webpack-sources": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", - "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", + "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", "dev": true, "requires": { "@types/node": "*", @@ -2615,9 +2713,9 @@ } }, "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, "acorn-dynamic-import": { @@ -2680,9 +2778,9 @@ "dev": true }, "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.0.tgz", + "integrity": "sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw==", "dev": true }, "amdefine": { @@ -2926,6 +3024,14 @@ "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "assert": { @@ -3436,9 +3542,9 @@ "dev": true }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", "dev": true }, "body-parser": { @@ -3640,21 +3746,56 @@ "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", "dev": true, "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "browserify-zlib": { @@ -3667,14 +3808,15 @@ } }, "browserslist": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", - "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", + "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000984", - "electron-to-chromium": "^1.3.191", - "node-releases": "^1.1.25" + "caniuse-lite": "^1.0.30001088", + "electron-to-chromium": "^1.3.483", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" } }, "browserstack": { @@ -3687,9 +3829,9 @@ } }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "requires": { "base64-js": "^1.0.2", @@ -3773,24 +3915,63 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "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": "^5.2.4", - "unique-filename": "^1.1.0", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "cache-base": { @@ -3906,9 +4087,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000984", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000984.tgz", - "integrity": "sha512-n5tKOjMaZ1fksIpQbjERuqCyfgec/m9pferkFQbLmWtqLUdmt12hNhjSwsmPdqeiG2NkITOQhr1VYIwWSAceiA==", + "version": "1.0.30001090", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001090.tgz", + "integrity": "sha512-QzPRKDCyp7RhjczTPZaqK3CjPA5Ht2UnXhZhCI4f7QiB5JK6KEuZBxIzyWnB3wO4hgAj4GMRxAhuiacfw0Psjg==", "dev": true }, "canonical-path": { @@ -4410,13 +4591,10 @@ "dev": true }, "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "console-control-strings": { "version": "1.1.0", @@ -5111,19 +5289,46 @@ "dev": true }, "copy-webpack-plugin": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", - "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", "dev": true, "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } } }, "cordova-android": { @@ -5271,6 +5476,14 @@ "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "create-hash": { @@ -5443,12 +5656,6 @@ "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", "dev": true }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -5667,9 +5874,9 @@ "dev": true }, "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -5723,6 +5930,14 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "dir-glob": { @@ -5890,9 +6105,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.191", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.191.tgz", - "integrity": "sha512-jasjtY5RUy/TOyiUYM2fb4BDaPZfm6CXRFeJDMfFsXYADGxUN49RBqtgB7EL2RmJXeIRUk9lM1U6A5yk2YJMPQ==", + "version": "1.3.483", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz", + "integrity": "sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg==", "dev": true }, "elementtree": { @@ -5904,9 +6119,9 @@ } }, "elliptic": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", - "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -5916,6 +6131,14 @@ "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "emojis-list": { @@ -6115,6 +6338,12 @@ "es6-promise": "^4.0.3" } }, + "escalade": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", + "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -6215,9 +6444,9 @@ "dev": true }, "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", "dev": true }, "eventsource": { @@ -6616,14 +6845,14 @@ } }, "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, "find-up": { @@ -7384,17 +7613,6 @@ "rimraf": "2" } }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -7873,9 +8091,9 @@ } }, "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "dev": true, "optional": true, "requires": { @@ -7936,9 +8154,9 @@ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, "handlebars": { @@ -8071,13 +8289,39 @@ } }, "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "hash.js": { @@ -8424,60 +8668,6 @@ "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } } }, "imurmurhash": { @@ -8487,9 +8677,9 @@ "dev": true }, "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", "dev": true, "optional": true }, @@ -8508,6 +8698,12 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -9292,9 +9488,9 @@ "dev": true }, "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.2.tgz", + "integrity": "sha512-1hgLrLIrmCgZG+ID3VoLNLOSwjGnoZa8tyrUdEteMeIzsT6PH7PMLyUvbDwzNE56P3PNxyvuIOx4Uh2E5rzQIw==", "dev": true, "optional": true }, @@ -9379,9 +9575,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } @@ -9559,12 +9755,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", @@ -10001,13 +10191,6 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true, - "optional": true - }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -10026,13 +10209,6 @@ "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", "dev": true }, - "lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true, - "optional": true - }, "lodash.tail": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", @@ -10098,9 +10274,9 @@ } }, "loglevel": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", - "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", "dev": true }, "loose-envify": { @@ -10159,12 +10335,21 @@ } }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } } }, "make-error": { @@ -10453,6 +10638,14 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "mime": { @@ -10558,9 +10751,9 @@ } }, "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { "concat-stream": "^1.5.0", @@ -10569,10 +10762,22 @@ "flush-write-stream": "^1.0.0", "from2": "^2.1.0", "parallel-transform": "^1.1.0", - "pump": "^2.0.1", + "pump": "^3.0.0", "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" + }, + "dependencies": { + "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" + } + } } }, "mixin-deep": { @@ -10793,9 +10998,9 @@ } }, "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", "dev": true }, "node-gyp": { @@ -10878,18 +11083,15 @@ } }, "node-releases": { - "version": "1.1.25", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.25.tgz", - "integrity": "sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ==", - "dev": true, - "requires": { - "semver": "^5.3.0" - } + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "dev": true }, "node-sass": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz", - "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", + "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", "dev": true, "optional": true, "requires": { @@ -10900,12 +11102,10 @@ "get-stdin": "^4.0.1", "glob": "^7.0.3", "in-publish": "^2.0.0", - "lodash.assign": "^4.2.0", - "lodash.clonedeep": "^4.3.2", - "lodash.mergewith": "^4.6.0", + "lodash": "^4.17.15", "meow": "^3.7.0", "mkdirp": "^0.5.1", - "nan": "^2.10.0", + "nan": "^2.13.2", "node-gyp": "^3.8.0", "npmlog": "^4.0.0", "request": "^2.88.0", @@ -11197,6 +11397,19 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "optional": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -11604,9 +11817,9 @@ } }, "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "dev": true, "requires": { "asn1.js": "^4.0.0", @@ -11740,9 +11953,9 @@ } }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -11817,12 +12030,57 @@ } }, "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "^2.1.0" + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } } }, "pkginfo": { @@ -11853,20 +12111,29 @@ "dev": true }, "portfinder": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", - "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==", + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", "dev": true, "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -12222,6 +12489,14 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "pump": { @@ -12811,9 +13086,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.6.tgz", + "integrity": "sha512-MKuEYXFSGuRSi8FZ3A7imN1CeVn9Gpw0/SFJKdL1ejXJneI9a5rwlEZrKejhEFAA3O6yr3eIyl/WuvASvlT36g==", "dev": true, "optional": true, "requires": { @@ -12921,12 +13196,12 @@ } }, "selfsigned": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", "dev": true, "requires": { - "node-forge": "0.7.5" + "node-forge": "0.9.0" } }, "semver": { @@ -12973,9 +13248,9 @@ } }, "serialize-javascript": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", - "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", "dev": true }, "serve-index": { @@ -13286,9 +13561,9 @@ } }, "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", "dev": true }, "socket.io-client": { @@ -13530,9 +13805,9 @@ "dev": true }, "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -13589,9 +13864,9 @@ "dev": true }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -13659,12 +13934,12 @@ } }, "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "safe-buffer": "^5.1.1" + "figgy-pudding": "^3.5.1" } }, "stack-trace": { @@ -13846,12 +14121,6 @@ "ms": "^2.1.1" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -13996,13 +14265,12 @@ } }, "surge": { - "version": "0.20.5", - "resolved": "https://registry.npmjs.org/surge/-/surge-0.20.5.tgz", - "integrity": "sha512-iv7W7s1EjpXCJr/RjatFMozMjexiPQoD+S5OBrHRQBG/x6Hj7G9O3FzA63YM2z7qIgngc0X35QYSj5ONF/HHoA==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/surge/-/surge-0.21.3.tgz", + "integrity": "sha512-2rTlyC6ku3alrMAyI/8xexCZeiQu0X11rc3Sg8k2SC+9+V+X2dsohCnsTgFbDANZzlL2WojzxmnzLsJFEu/WIQ==", "dev": true, "requires": { "cli-table3": "^0.5.1", - "fstream-ignore": "^1.0.5", "inquirer": "^6.2.2", "is-domain": "0.0.1", "minimist": "1.1.1", @@ -14013,8 +14281,9 @@ "read": "1.0.5", "request": "^2.88.0", "split": "0.3.1", + "surge-fstream-ignore": "^1.0.6", "surge-ignore": "0.2.0", - "tarr": "1.0.3", + "tarr": "1.1.0", "url-parse-as-address": "1.0.0" }, "dependencies": { @@ -14025,9 +14294,9 @@ "dev": true }, "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -14045,12 +14314,6 @@ "through": "^2.3.6" } }, - "lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==", - "dev": true - }, "minimist": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.1.tgz", @@ -14077,6 +14340,17 @@ } } }, + "surge-fstream-ignore": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/surge-fstream-ignore/-/surge-fstream-ignore-1.0.6.tgz", + "integrity": "sha512-hNN52cz2fYCAzhlHmWPn4aE3bFbpBt01AkWFLljrtSzFvxlipLAeLuLtQ3t4f0RKoUkjzXWCAFK13WoET2iM1A==", + "dev": true, + "requires": { + "fstream": ">=1.0.12", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, "surge-ignore": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/surge-ignore/-/surge-ignore-0.2.0.tgz", @@ -14140,13 +14414,13 @@ } }, "tarr": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tarr/-/tarr-1.0.3.tgz", - "integrity": "sha512-ax05RcadKxg/EyogjIzzsT5NUl7B5Io9ASrv02bOdMFtt4E9w29Ok5kI66qqq7SNc5ai43DG91ZluBMtDjPoTQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tarr/-/tarr-1.1.0.tgz", + "integrity": "sha512-tENbQ43IQckay71stp1p1lljRhoEZpZk10FzEZKW2tJcMcnLwV3CfZdxBAERlH6nwnFvnHMS9eJOJl6IzSsG0g==", "dev": true, "requires": { "block-stream": "*", - "fstream": "^1.0.2", + "fstream": ">=1.0.12", "inherits": "2" } }, @@ -14169,14 +14443,14 @@ } }, "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "requires": { - "commander": "^2.19.0", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.10" + "source-map-support": "~0.5.12" }, "dependencies": { "source-map": { @@ -14184,203 +14458,51 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } } } }, "terser-webpack-plugin": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz", - "integrity": "sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", "dev": true, "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", + "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", - "terser": "^3.16.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" }, "dependencies": { - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, - "cacache": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", - "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "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.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "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" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "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" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "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" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } - }, - "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 } } }, @@ -14406,9 +14528,9 @@ } }, "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, "time-stamp": { @@ -14418,9 +14540,9 @@ "dev": true }, "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -14544,9 +14666,9 @@ "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" }, "tree-kill": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", - "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, "trim-newlines": { @@ -15222,9 +15344,9 @@ "dev": true }, "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, "void-elements": { @@ -15308,14 +15430,182 @@ } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^3.4.0", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + }, + "dependencies": { + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + } } }, "wbuf": { @@ -15421,9 +15711,9 @@ }, "dependencies": { "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true } } @@ -15583,9 +15873,9 @@ } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, "ms": { @@ -15606,9 +15896,9 @@ } }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -16043,9 +16333,9 @@ } }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", "dev": true, "optional": true, "requires": { @@ -16061,7 +16351,7 @@ "string-width": "^1.0.2", "which-module": "^1.0.0", "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "yargs-parser": "5.0.0-security.0" }, "dependencies": { "ansi-regex": { @@ -16120,13 +16410,14 @@ } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", "dev": true, "optional": true, "requires": { - "camelcase": "^3.0.0" + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" }, "dependencies": { "camelcase": { diff --git a/package.json b/package.json index 3da51ef6..e9d9370c 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@ngx-translate/http-loader": "4.0.0", "@openstapps/api": "0.22.0", "@openstapps/configuration": "0.22.0", - "@openstapps/core": "0.34.0", + "@openstapps/core": "0.36.0", "@openstapps/logger": "0.4.0", "cordova-android": "8.0.0", "cordova-browser": "6.0.0", @@ -72,8 +72,8 @@ "zone.js": "0.9.0" }, "devDependencies": { - "@angular-devkit/architect": "0.13.8", - "@angular-devkit/build-angular": "0.13.8", + "@angular-devkit/architect": "0.13.10", + "@angular-devkit/build-angular": "0.13.10", "@angular-devkit/core": "7.3.8", "@angular-devkit/schematics": "7.3.8", "@angular/cli": "7.3.8", @@ -99,7 +99,7 @@ "karma-jasmine-html-reporter": "1.4.2", "karma-mocha-reporter": "2.2.5", "protractor": "5.4.2", - "surge": "0.20.5", + "surge": "0.21.3", "ts-node": "8.0.3", "tslint": "5.15.0", "typescript": "3.2.4" diff --git a/src/app/_helpers/data/sample-facets.ts b/src/app/_helpers/data/sample-facets.ts new file mode 100644 index 00000000..6e298ea7 --- /dev/null +++ b/src/app/_helpers/data/sample-facets.ts @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2019, 2020 StApps + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +import {SCFacet, SCThingType} from '@openstapps/core'; + +export const facetsMock: SCFacet[] = [ + { + 'buckets': [ + { + 'count': 60, + 'key': 'academic event', + }, + { + 'count': 160, + 'key': 'message', + }, + { + 'count': 151, + 'key': 'date series', + }, + { + 'count': 106, + 'key': 'dish', + }, + { + 'count': 20, + 'key': 'building', + }, + { + 'count': 20, + 'key': 'semester', + }, + ], + 'field': 'type', + }, + { + 'buckets': [ + { + 'count': 12, + 'key': 'Max Mustermann', + }, + { + 'count': 2, + 'key': 'Foo Bar', + }, + ], + 'field': 'performers', + 'onlyOnType': SCThingType.AcademicEvent, + }, + { + 'buckets': [ + { + 'count': 5, + 'key': 'colloquium', + }, + { + 'count': 15, + 'key': 'course', + }, + ], + 'field': 'categories', + 'onlyOnType': SCThingType.AcademicEvent, + }, + { + 'buckets': [ + { + 'count': 5, + 'key': 'unipedia', + }], + 'field': 'categories', + 'onlyOnType': SCThingType.Article, + }, + { + 'buckets': [ + { + 'count': 5, + 'key': 'employees', + }, + { + 'count': 15, + 'key': 'students', + }], + 'field': 'audiences', + 'onlyOnType': SCThingType.Message, + }, + { + 'buckets': [ + { + 'count': 5, + 'key': 'main dish', + }, + { + 'count': 15, + 'key': 'salad', + }], + 'field': 'categories', + 'onlyOnType': SCThingType.Dish, + }, +]; diff --git a/src/app/_helpers/fake-backend.interceptor.ts b/src/app/_helpers/fake-backend.interceptor.ts index dd4a2c67..3074335a 100644 --- a/src/app/_helpers/fake-backend.interceptor.ts +++ b/src/app/_helpers/fake-backend.interceptor.ts @@ -25,10 +25,11 @@ import {Injectable} from '@angular/core'; import {SCIndexResponse, SCSettingInputType, SCThingOriginType, SCThingType} from '@openstapps/core'; import {Observable, of} from 'rxjs'; import {delay, map} from 'rxjs/operators'; +import {facetsMock} from './data/sample-facets'; import {SampleThings} from './data/sample-things'; // tslint:disable:no-magic-numbers -const sampleIndexResponse: SCIndexResponse = { +export const sampleIndexResponse: SCIndexResponse = { app: { campusPolygon: { coordinates: [ @@ -105,7 +106,7 @@ const sampleIndexResponse: SCIndexResponse = { }, }, ], - name: '', + name: 'main menu', translations: { de: { name: 'Hauptmenü', @@ -132,21 +133,6 @@ const sampleIndexResponse: SCIndexResponse = { }, }, }, - ], - name: 'Your Study-App', - translations: { - de: { - name: 'Deine Studi-App', - }, - en: { - name: 'Your Study-App', - }, - }, - }, - { - icon: '', - id: 'meta', - items: [ { icon: 'information', route: '/about', @@ -161,13 +147,13 @@ const sampleIndexResponse: SCIndexResponse = { }, }, ], - name: '', + name: 'Your Study-App', translations: { de: { - name: '', + name: 'Deine Studi-App', }, en: { - name: '', + name: 'Your Study-App', }, }, }, @@ -178,7 +164,8 @@ const sampleIndexResponse: SCIndexResponse = { { categories: ['profile'], defaultValue: 'student', - description: '', + description: 'The user group the app is going to be used.' + + 'This settings for example is getting used for the predefined price category of mensa meals.', inputType: SCSettingInputType.SingleChoice, name: 'group', order: 1, @@ -216,7 +203,7 @@ const sampleIndexResponse: SCIndexResponse = { { categories: ['profile'], defaultValue: 'en', - description: '', + description: 'The language this app is going to use.', inputType: SCSettingInputType.SingleChoice, name: 'language', order: 0, @@ -250,7 +237,8 @@ const sampleIndexResponse: SCIndexResponse = { { categories: ['privacy'], defaultValue: false, - description: '', + description: 'Allow the App to use the device location to provide additional information\'s based ' + + 'on your actual location.', inputType: SCSettingInputType.SingleChoice, name: 'geoLocation', order: 0, @@ -393,16 +381,16 @@ export class FakeBackendInterceptor implements HttpInterceptor { if (request.body.filter.arguments.field === 'uid') { return this.sampleFetcher.getSampleThing(request.body.filter.arguments.value) // tslint:disable-next-line:no-any - .pipe(map((sampleData: any) => { - return new HttpResponse({status: 200, body: {data: sampleData}}); - }), delay(this.RESPONSE_DELAY)); // add delay for skeleton screens to be seen (see !16) + .pipe(map((sampleData: any) => { + return new HttpResponse({status: 200, body: {data: sampleData}}); + }), delay(this.RESPONSE_DELAY)); // add delay for skeleton screens to be seen (see !16) } } return this.sampleFetcher.getSampleThings() // tslint:disable-next-line:no-any .pipe(map((sampleData: any) => { - return new HttpResponse({status: 200, body: {data: sampleData}}); + return new HttpResponse({status: 200, body: {data: sampleData, facets: facetsMock}}); }), delay(this.RESPONSE_DELAY)); // add delay for skeleton screens to be seen (see !16) } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 5ef16812..45a68df1 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -37,7 +37,7 @@ registerLocaleData(localeDe); /** * TODO - * + * * @param http TODO */ export function createTranslateLoader(http: HttpClient) { @@ -84,4 +84,5 @@ const providers : Provider[] = [ providers: environment.use_fake_backend ? [providers, fakeBackendProvider] : providers, }) -export class AppModule {} +export class AppModule { +} diff --git a/src/app/modules/config/config.provider.ts b/src/app/modules/config/config.provider.ts index 3da3f71b..b8b7d206 100644 --- a/src/app/modules/config/config.provider.ts +++ b/src/app/modules/config/config.provider.ts @@ -84,7 +84,7 @@ export class ConfigProvider { await this.init(); } catch (error) { // don't throw ConfigFetchError if saved config is available - if (!(error.name === 'ConfigFetchError' && this.initialised)) { + if (error.name === 'ConfigFetchError' && !this.initialised) { throw error; } } diff --git a/src/app/modules/data/data.module.ts b/src/app/modules/data/data.module.ts index 6b4cd967..ff5a0c40 100644 --- a/src/app/modules/data/data.module.ts +++ b/src/app/modules/data/data.module.ts @@ -16,10 +16,11 @@ import {CommonModule} from '@angular/common'; import {HttpClientModule} from '@angular/common/http'; import {NgModule} from '@angular/core'; import {FormsModule} from '@angular/forms'; -import {IonicModule} from '@ionic/angular'; +import {Events, IonicModule} from '@ionic/angular'; import {TranslateModule} from '@ngx-translate/core'; import {MarkdownModule} from 'ngx-markdown'; import {MomentModule} from 'ngx-moment'; +import {MenuModule} from '../menu/menu.module'; import {StorageModule} from '../storage/storage.module'; import {DataFacetsProvider} from './data-facets.provider'; import {DataRoutingModule} from './data-routing.module'; @@ -116,6 +117,7 @@ import {VideoListItem} from './types/video/video-list-item.component'; DataRoutingModule, HttpClientModule, MarkdownModule.forRoot(), + MenuModule, MomentModule.forRoot({ relativeTimeThresholdOptions: { 'm': 59, @@ -127,6 +129,7 @@ import {VideoListItem} from './types/video/video-list-item.component'; providers: [ DataProvider, DataFacetsProvider, + Events, StAppsWebHttpClient, ], }) diff --git a/src/app/modules/data/list/data-list.component.ts b/src/app/modules/data/list/data-list.component.ts index ef060901..92f30989 100644 --- a/src/app/modules/data/list/data-list.component.ts +++ b/src/app/modules/data/list/data-list.component.ts @@ -12,92 +12,157 @@ * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ -import {Component} from '@angular/core'; -import {AlertController} from '@ionic/angular'; -import {SCThing} from '@openstapps/core'; +import {Component, OnInit} from '@angular/core'; +import {AlertController, Events} from '@ionic/angular'; +import { + SCFacet, + SCSearchFilter, + SCSearchQuery, + SCSearchSort, + SCSettingValue, + SCSettingValues, + SCThing, +} from '@openstapps/core'; +import {Logger} from '@openstapps/logger'; import {Subject} from 'rxjs'; import {debounceTime, distinctUntilChanged} from 'rxjs/operators'; +import {MenuService} from '../../menu/menu.service'; import {DataProvider} from '../data.provider'; /** - * TODO + * DataListComponent queries things and shows list of things and context menu */ @Component({ selector: 'stapps-data-list', templateUrl: 'data-list.html', }) -export class DataListComponent { +export class DataListComponent implements OnInit { + /** - * TODO + * Api query filter */ - dataProvider: DataProvider; + filterQuery: SCSearchFilter | undefined; + /** - * TODO + * Thing counter to start query the next page from */ from = 0; /** - * TODO + * Container for queried things */ items: SCThing[]; /** - * TODO + * Page size of queries */ - loaded = false; + pageSize = 30; /** - * TODO + * Search value from search bar */ - query: string; - /** - * TODO - */ - queryChanged: Subject = new Subject(); + queryText: string; /** - * TODO + * Subject to handle search text changes */ - selectedItem: any; - /** - * TODO - */ - size = 30; + queryTextChanged: Subject = new Subject(); /** - * - * @param alertController TODO - * @param dataProvider TODO + * Time to wait for search query if search text is changing + */ + searchQueryDueTime = 1000; + + /** + * Api query sorting + */ + sortQuery: SCSearchSort | undefined; + + /** + * + * @param alertController AlertController + * @param dataProvider DataProvider + * @param events Events + * @param menuService MenuService */ constructor( private readonly alertController: AlertController, - dataProvider: DataProvider, - ) { - this.dataProvider = dataProvider; - this.queryChanged + private dataProvider: DataProvider, + private readonly events: Events, + private readonly menuService: MenuService, + ) { + this.queryTextChanged .pipe( - debounceTime(1000), + debounceTime(this.searchQueryDueTime), distinctUntilChanged()) .subscribe((model) => { this.from = 0; - this.query = model; - this.fetchItems(); + this.queryText = model; + this.fetchAndUpdateItems(); }); - this.fetchItems(); + + this.menuService.filterQueryChanged$.subscribe((query) => { + this.filterQuery = query; + this.fetchAndUpdateItems(); + }); + this.menuService.sortQueryChanged$.subscribe((query) => { + this.sortQuery = query; + this.fetchAndUpdateItems(); + }); + + this.fetchAndUpdateItems(); + + /** + * Subscribe to 'settings.changed' events + */ + this.events.subscribe('stapps.settings.changed', + (category: string, name: string, value: SCSettingValue | SCSettingValues) => { + Logger.log(`received event "settings.changed" with category: + ${category}, name: ${name}, value: ${JSON.stringify(value)}`); + }, + ); } /** - * TODO + * Fetches items with set query configuration + * + * @param append If true fetched data gets appended to existing, override otherwise (default false) */ - private async fetchItems(): Promise { - return this.dataProvider.search({ + private async fetchAndUpdateItems(append = false): Promise { + // build query search options + const searchOptions: SCSearchQuery = { from: this.from, - query: this.query, - size: this.size, - } as any) + size: this.pageSize, + }; + + if (this.queryText && this.queryText.length > 0) { + // add query string + searchOptions.query = this.queryText; + } + + if (this.filterQuery) { + // add query filtering + searchOptions.filter = this.filterQuery; + } + + if (this.sortQuery) { + // add query sorting + searchOptions.sort = [this.sortQuery]; + } + + return this.dataProvider.search(searchOptions) .then((result) => { + if (append) { + // append results + this.items = this.items.concat(result.data); + } else { + // override items with results this.items = result.data; - this.loaded = true; + } + // update filter options if result contains facets + if (typeof result.facets !== 'undefined') { + this.updateContextFilter(result.facets); + } }, async (err) => { const alert: HTMLIonAlertElement = await this.alertController.create({ buttons: ['Dismiss'], @@ -110,18 +175,52 @@ export class DataListComponent { } /** - * TODO + * Loads next page of things */ + // tslint:disable-next-line:no-any async loadMore(event: any): Promise { - this.from += this.size; - await this.fetchItems(); + this.from += this.pageSize; + await this.fetchAndUpdateItems(true); event.target.complete(); } /** - * TODO + * Initialises the sort context of menuService */ - search(query: string) { - this.queryChanged.next(query); + ngOnInit(): void { + // initialise sort option for context menu + this.menuService.setContextSort({ + name: 'sort', + reversed: false, + value: 'relevance', + values: [ + { + reversible: false, + value: 'relevance', + }, + { + reversible: true, + value: 'name', + }, + { + reversible: true, + value: 'type', + }, + ], + }); + } + + /** + * Search event of search bar + */ + searchStringChanged(queryValue: string) { + this.queryTextChanged.next(queryValue); + } + + /** + * Updates context filter in menuService with facets + */ + updateContextFilter(facets: SCFacet[]) { + this.menuService.updateContextFilter(facets); } } diff --git a/src/app/modules/data/list/data-list.html b/src/app/modules/data/list/data-list.html index 909e92e1..22f87808 100644 --- a/src/app/modules/data/list/data-list.html +++ b/src/app/modules/data/list/data-list.html @@ -1,11 +1,17 @@ + + + + + + - + diff --git a/src/app/modules/menu/context/context-menu.component.spec.ts b/src/app/modules/menu/context/context-menu.component.spec.ts new file mode 100644 index 00000000..a8934a3d --- /dev/null +++ b/src/app/modules/menu/context/context-menu.component.spec.ts @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2020 StApps + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +import {APP_BASE_HREF, CommonModule, Location, LocationStrategy, PathLocationStrategy} from '@angular/common'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {FormsModule} from '@angular/forms'; +import {ChildrenOutletContexts, RouterModule, UrlSerializer} from '@angular/router'; +import {IonicModule} from '@ionic/angular'; +import {TranslateModule,} from '@ngx-translate/core'; +import {SCFacet, SCThingType} from '@openstapps/core'; +import {ContextMenuComponent} from './context-menu.component'; +import {SettingsModule} from '../../settings/settings.module'; +import {MenuService} from '../menu.service'; +import {FilterContext, SortContext} from './context-type'; + +describe('ContextMenuComponent', async () => { + let fixture: ComponentFixture; + let instance: ContextMenuComponent; + + beforeEach(() => { + + TestBed.configureTestingModule({ + declarations: [ContextMenuComponent], + providers: [ + ChildrenOutletContexts, + Location, + UrlSerializer, + MenuService, + {provide: LocationStrategy, useClass: PathLocationStrategy}, + {provide: APP_BASE_HREF, useValue: '/'}, + ], + // tslint:disable-next-line:object-literal-sort-keys + imports: [ + FormsModule, + IonicModule.forRoot(), + TranslateModule.forRoot(), + CommonModule, + SettingsModule, + RouterModule.forRoot([]), + ], + }).compileComponents(); + + fixture = TestBed.createComponent(ContextMenuComponent); + instance = fixture.componentInstance; + }); + + it('should show items in sort context', () => { + instance.sortOption = getSortContextType(); + fixture.detectChanges(); + const sort: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-sort'); + const sortItem = sort.querySelector('.sort-item'); + expect(sortItem!.querySelector('ion-label')!.textContent).toContain('relevance'); + }); + + it('should show items in filter context', () => { + instance.filterOption = getFilterContextType(); + fixture.detectChanges(); + const filter: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-filter'); + const filterItem = filter.querySelector('.filter-group'); + expect(filterItem!.querySelector('ion-list-header')!.textContent).toContain('Type'); + }); + + it('should set sort context value and reverse on click', () => { + instance.sortOption = getSortContextType(); + fixture.detectChanges(); + const sort: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-sort'); + // @ts-ignore + const sortItem: HTMLElement = sort.querySelectorAll('.sort-item')[1]; + sortItem!.click(); + expect(instance.sortOption.value).toEqual('name'); + expect(instance.sortOption.reversed).toBe(false); + + // click again for reverse + sortItem!.click(); + expect(instance.sortOption.reversed).toBe(true); + }); + + it('should show all filterable facets', () => { + // get set facets with non empty buckets + const facets: SCFacet[] = getFilterContextType().options; + + instance.filterOption = getFilterContextType(); + fixture.detectChanges(); + // get filter context div + const filter: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-filter'); + // get all filter groups that represent a facet + const filterGroups = filter.querySelectorAll('.filter-group'); + + expect(filterGroups.length).toEqual(facets.length); + + for (const facet of facets) { + let filterGroup = undefined; + + // get filter option for facets field + filterGroups.forEach((element) => { + if (element.querySelector('ion-list-header')!.textContent!.toString().toLowerCase().indexOf(facet.field) > -1) { + filterGroup = element; + return; + } + }); + + expect(filterGroup).toBeDefined(); + + // @ts-ignore + const filterItems = filterGroup.querySelectorAll('.filter-item-label'); + + if (filterItems.length !== facet.buckets.length) { + console.log(JSON.stringify(facet)); + } + expect(filterItems.length).toEqual(facet.buckets.length); + + // check all buckets are shown + for (const bucket of facet.buckets) { + let filterItem; + + for (let i = 0; i < filterItems.length; i++) { + if (filterItems.item(i) + .textContent!.toString().toLowerCase() + .indexOf(bucket.key.toLowerCase()) > 0) { + filterItem = filterItems.item(i); + break; + } + } + expect(filterItem).toBeDefined(); + } + } + }); + + it('should reset filter', () => { + instance.filterOption = getFilterContextType(); + instance.filterOption.options = [{ + field: 'type', + buckets: [ + {count: 10, key: 'date series', checked: true} + ] + }]; + + fixture.detectChanges(); + + // click reset button + const resetButton: HTMLElement = fixture.debugElement.nativeElement.querySelector('.resetFilterButton'); + resetButton.click(); + + expect(instance.filterOption.options[0].buckets[0].checked).toEqual(false); + }); +}); + +function getSortContextType(): SortContext { + return { + name: 'sort', + reversed: false, + value: 'relevance', + values: [ + { + reversible: false, + value: 'relevance', + }, + { + reversible: true, + value: 'name', + }, + { + reversible: true, + value: 'date', + }, + { + reversible: true, + value: 'type', + }, + ] + } +} + +function getFilterContextType(): FilterContext { + return { + name: 'filter', + compact: false, + options: facetsMock.filter((facet) => facet.buckets.length > 0).map((facet) => { + return { + buckets: facet.buckets.map((bucket) => { + return { + count: bucket.count, + key: bucket.key, + checked: false, + } + }), + compact: false, + field: facet.field, + onlyOnType: facet.onlyOnType + } + }) + } +} + +const facetsMock: SCFacet[] = [ + { + 'buckets': [ + { + 'count': 60, + 'key': 'academic event', + }, + { + 'count': 160, + 'key': 'message', + }, + { + 'count': 151, + 'key': 'date series', + }, + { + 'count': 106, + 'key': 'dish', + }, + { + 'count': 20, + 'key': 'building', + }, + ], + 'field': 'type', + }, + { + 'buckets': [ + { + 'count': 12, + 'key': 'Max Mustermann', + }, + { + 'count': 2, + 'key': 'Foo Bar', + }, + ], + 'field': 'performers', + 'onlyOnType': SCThingType.AcademicEvent, + }, + { + 'buckets': [ + { + 'count': 5, + 'key': 'colloquium', + }, + { + 'count': 15, + 'key': 'course', + }, + ], + 'field': 'categories', + 'onlyOnType': SCThingType.AcademicEvent, + }, + { + 'buckets': [ + { + 'count': 5, + 'key': 'employees', + }, + { + 'count': 15, + 'key': 'students', + }, + ], + 'field': 'audiences', + 'onlyOnType': SCThingType.Message, + }, +]; diff --git a/src/app/modules/menu/context/context-menu.component.ts b/src/app/modules/menu/context/context-menu.component.ts new file mode 100644 index 00000000..e7c4a147 --- /dev/null +++ b/src/app/modules/menu/context/context-menu.component.ts @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2018, 2019, 2020 StApps + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +import {Component} from '@angular/core'; +import {LangChangeEvent, TranslateService} from '@ngx-translate/core'; +import { + SCLanguage, + SCThingTranslator, + SCThingType, + SCTranslations, +} from '@openstapps/core'; +import {MenuService} from '../menu.service'; +import {FilterContext, SortContext, SortContextOption} from './context-type'; + +/** + * The context menu + * + * It can be configured with sorting types and filtering on facets + * + * Example:
+ * `` + */ +@Component({ + selector: 'stapps-context', + templateUrl: 'context-menu.html', +}) +export class ContextMenuComponent { + + /** + * Amount of filter options shown on compact view + */ + compactFilterOptionCount = 5; + + /** + * Container for the filter context + */ + filterOption: FilterContext; + + /** + * Possible languages to be used for translation + */ + language: keyof SCTranslations; + + /** + * Mapping of SCThingType + */ + scThingType = SCThingType; + + /** + * Container for the sort context + */ + sortOption: SortContext; + + /** + * Core translator + */ + translator: SCThingTranslator; + + constructor(private translateService: TranslateService, + private readonly menuService: MenuService) { + this.language = this.translateService.currentLang as keyof SCTranslations; + this.translator = new SCThingTranslator(this.language); + + this.translateService.onLangChange.subscribe((event: LangChangeEvent) => { + this.language = event.lang as keyof SCTranslations; + this.translator = new SCThingTranslator(this.language); + }); + + this.menuService.filterContextChanged$.subscribe((filterContext) => { + this.filterOption = filterContext; + }); + + this.menuService.sortOptions.subscribe((sortContext) => { + this.sortOption = sortContext; + }); + } + + /** + * Sets selected filter options and updates listener + */ + filterChanged = () => { + this.menuService.contextFilterChanged(this.filterOption); + } + + /** + * Returns translated property name + */ + getTranslatedPropertyName(property: string, onlyForType?: SCThingType): string { + return (this.translator + // tslint:disable-next-line:no-any + .translatedPropertyNames(onlyForType ? onlyForType : SCThingType.AcademicEvent) as any)[property]; + } + + /** + * Returns translated type of given SCThingType string + */ + getTranslatedType(scThingType: string) { + return this.translator.translatedThingType(scThingType as SCThingType); + } + + /** + * Resets filter options + */ + resetFilter = (option: FilterContext) => { + option.options.forEach((filterFacet) => filterFacet.buckets.forEach((filterBucket) => { + filterBucket.checked = false; + })); + this.menuService.contextFilterChanged(this.filterOption); + } + + /** + * Updates selected sort option and updates listener + */ + sortChanged = (option: SortContext, value: SortContextOption) => { + if (option.value === value.value) { + if (value.reversible) { + option.reversed = !option.reversed; + } + } else { + option.value = value.value; + if (value.reversible) { + option.reversed = false; + } + } + this.menuService.contextSortChanged(option); + } +} diff --git a/src/app/modules/menu/context/context-menu.html b/src/app/modules/menu/context/context-menu.html new file mode 100644 index 00000000..c9373aeb --- /dev/null +++ b/src/app/modules/menu/context/context-menu.html @@ -0,0 +1,80 @@ + + + + + + + {{'menu.context.title' | translate | titlecase}} + + + + + + + + {{'menu.context.sort.title' | translate | titlecase}} + + + {{'menu.context.sort.' + value.value | translate | titlecase}} + + + + + + + + + + + +
+ + + {{'menu.context.filter.title' | translate | titlecase}} + + + + + + + + {{(facet.onlyOnType ? + getTranslatedPropertyName(facet.field, facet.onlyOnType) + : (getTranslatedPropertyName(facet.field))) | titlecase}} + {{facet.onlyOnType? ' | ' + (getTranslatedType(facet.onlyOnType) | titlecase) : ''}} + +
+ + + ({{bucket.count}}) {{facet.field === 'type' ? (getTranslatedType(bucket.key) | titlecase) : bucket.key | titlecase}} + + + + + + + {{'menu.context.filter.showAll' | translate}} + +
+
+ + {{'menu.context.filter.showAll' | translate}} + +
+
+
+ diff --git a/src/app/modules/menu/context/context-menu.scss b/src/app/modules/menu/context/context-menu.scss new file mode 100644 index 00000000..97a0d932 --- /dev/null +++ b/src/app/modules/menu/context/context-menu.scss @@ -0,0 +1,7 @@ +stapps-navigation { + ion-radio { + .radio-icon { + + } + } +} diff --git a/src/app/modules/menu/context/context-type.ts b/src/app/modules/menu/context/context-type.ts new file mode 100644 index 00000000..2abe8021 --- /dev/null +++ b/src/app/modules/menu/context/context-type.ts @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2020 StApps + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +import {SCFacet, SCFacetBucket} from '@openstapps/core'; + +export type ContextType = FilterContext | SortContext; + +/** + * A sort context + */ +export interface SortContext { + /** + * Name of the context + */ + name: 'sort'; + + /** + * Reverse option + */ + reversed: boolean; + + /** + * sort value + */ + value: string; + + /** + * Sort options + */ + values: SortContextOption[]; +} + +/** + * A sort context option + */ +export interface SortContextOption { + /** + * sort option is reversible + */ + reversible: boolean; + + /** + * sort option value + */ + value: string; +} + +/** + * A filter context + */ +export interface FilterContext { + /** + * Compact view of the filter options + */ + compact?: boolean; + /** + * Name of the context + */ + name: 'filter'; + + /** + * Filter values + */ + options: FilterFacet[]; +} + +export interface FilterFacet extends SCFacet { + /** + * FilterBuckets of a FilterFacet + */ + buckets: FilterBucket[]; + /** + * Compact view of the option buckets + */ + compact?: boolean; +} + +export interface FilterBucket extends SCFacetBucket { + /** + * Sets the Filter active + */ + checked: boolean; +} diff --git a/src/app/modules/menu/menu.module.ts b/src/app/modules/menu/menu.module.ts index 65c39a3c..a8710c37 100644 --- a/src/app/modules/menu/menu.module.ts +++ b/src/app/modules/menu/menu.module.ts @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018, 2019 StApps + * Copyright (C) 2018, 2019, 2020 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. @@ -14,27 +14,37 @@ */ import {CommonModule} from '@angular/common'; import {NgModule} from '@angular/core'; +import {FormsModule} from '@angular/forms'; import {RouterModule} from '@angular/router'; import {IonicModule} from '@ionic/angular'; +import {TranslateModule} from '@ngx-translate/core'; +import {SettingsModule} from '../settings/settings.module'; +import {ContextMenuComponent} from './context/context-menu.component'; +import {MenuService} from './menu.service'; import {NavigationComponent} from './navigation/navigation.component'; /** - * TODO + * Menu module */ @NgModule({ declarations: [ NavigationComponent, - ], - entryComponents: [ - NavigationComponent, + ContextMenuComponent, ], exports: [ NavigationComponent, + ContextMenuComponent, ], imports: [ + FormsModule, IonicModule.forRoot(), + TranslateModule.forChild(), CommonModule, RouterModule, + SettingsModule, + ], + providers: [ + MenuService, ], }) export class MenuModule {} diff --git a/src/app/modules/menu/menu.service.spec.ts b/src/app/modules/menu/menu.service.spec.ts new file mode 100644 index 00000000..c73aec6d --- /dev/null +++ b/src/app/modules/menu/menu.service.spec.ts @@ -0,0 +1,148 @@ +import {TestBed} from '@angular/core/testing'; + +import {MenuService} from './menu.service'; +import {SCFacet} from '@openstapps/core'; +import {FilterContext, SortContext} from './context/context-type'; + +describe('MenuService', () => { + let service: MenuService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [MenuService] + }); + service = TestBed.get(MenuService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should update filterOptions', (done) => { + service.filterContextChanged$.subscribe((result) => { + expect(result).toBeDefined(); + done(); + }); + service.updateContextFilter(facetsMock); + }); + + it('should update filterQuery', (done) => { + service.filterContextChanged$.subscribe(() => { + service.contextFilterChanged(filterContext); + }); + service.filterQueryChanged$.subscribe((result) => { + expect(result).toBeDefined(); + done(); + }); + service.updateContextFilter(facetsMock); + }); + + it('should update sortOptions', (done) => { + service.sortContextChanged$.subscribe((result) => { + expect(result).toBeDefined(); + done(); + }); + service.setContextSort(sortContext); + }); + + it('should update sortQuery', (done) => { + service.sortContextChanged$.subscribe(() => { + service.contextSortChanged(sortContext); + }); + service.sortQueryChanged$.subscribe((result) => { + expect(result).toBeDefined(); + done(); + }); + service.setContextSort(sortContext); + }); +}); + + +const facetsMock: SCFacet[] = + [{ + 'buckets': [ + { + 'count': 60, + 'key': 'academic event', + }, + { + 'count': 160, + 'key': 'message', + }, + { + 'count': 151, + 'key': 'date series', + }, + { + 'count': 106, + 'key': 'dish', + }, + { + 'count': 20, + 'key': 'building', + }, + { + 'count': 20, + 'key': 'semester', + }, + ], + 'field': 'type', + }]; + +const filterContext: FilterContext = { + name: 'filter', + options: [ + { + buckets: [ + { + checked: true, + count: 60, + key: 'academic event' + }, { + checked: false, + count: 160, + key: 'message', + }, + { + checked: false, + count: 151, + key: 'date series' + }, { + checked: false, + count: 106, + key: 'dish' + }, + { + checked: false, + count: 20, + key: 'building' + }, + { + checked: false, + count: 20, + key: 'semester' + } + ], + field: 'type' + }] +} + +const sortContext: SortContext = { + name: 'sort', + reversed: false, + value: 'name', + values: [ + { + reversible: false, + value: 'relevance', + }, + { + reversible: true, + value: 'name', + }, + { + reversible: true, + value: 'type', + }, + ], +} diff --git a/src/app/modules/menu/menu.service.ts b/src/app/modules/menu/menu.service.ts new file mode 100644 index 00000000..988ae2f5 --- /dev/null +++ b/src/app/modules/menu/menu.service.ts @@ -0,0 +1,221 @@ +/* + * Copyright (C) 2020 StApps + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +import {Injectable} from '@angular/core'; +import {SCFacet, SCFacetBucket, SCSearchFilter, SCSearchSort} from '@openstapps/core'; +import {Subject} from 'rxjs'; +import {FilterBucket, FilterContext, FilterFacet, SortContext} from './context/context-type'; + +/** + * MenuService provides bidirectional communication of context menu options and search queries + */ +@Injectable() +export class MenuService { + + /** + * Local filter context object + */ + contextFilter: FilterContext; + + /** + * Container for the filter context + */ + // tslint:disable-next-line:member-ordering + filterOptions = new Subject(); + + /** + * Observable filterContext streams + */ + // tslint:disable-next-line:member-ordering + filterContextChanged$ = this.filterOptions.asObservable(); + + /** + * Container for the filter query (SCSearchFilter) + */ + filterQuery = new Subject(); + + /** + * Observable filterContext streams + */ + // tslint:disable-next-line:member-ordering + filterQueryChanged$ = this.filterQuery.asObservable(); + + /** + * Container for the sort context + */ + // tslint:disable-next-line:member-ordering + sortOptions = new Subject(); + + /** + * Observable SortContext streams + */ + // tslint:disable-next-line:member-ordering + sortContextChanged$ = this.sortOptions.asObservable(); + + /** + * Container for the sort query + */ + sortQuery = new Subject(); + + /** + * Observable SortContext streams + */ + // tslint:disable-next-line:member-ordering + sortQueryChanged$ = this.sortQuery.asObservable(); + + /** + * Returns SCSearchFilter if filterContext value is set, undefined otherwise + * @param filterContext FilterContext to build SCSearchFilter from + */ + buildFilterQuery = (filterContext: FilterContext): SCSearchFilter | undefined => { + const filters: SCSearchFilter[] = []; + + filterContext.options.forEach((filterFacet) => { + filterFacet.buckets.forEach((filterBucket) => { + if (filterBucket.checked) { + filters.push( + { + arguments: { + field: filterFacet.field, + value: filterBucket.key, + }, + type: 'value', + }); + } + }); + }); + + if (filters.length > 0) { + return { + arguments: { + filters: filters, + operation: 'or', + }, + type: 'boolean', + }; + } + + return; + } + + /** + * Returns SCSearchSort if sorting value is set, undefined otherwise + * @param sortContext SortContext to build SCSearchSort from + */ + buildSortQuery = (sortContext: SortContext): SCSearchSort | undefined => { + if (sortContext.value && sortContext.value.length > 0) { + if (sortContext.value === 'name' || sortContext.value === 'type') { + return { + arguments: { + field: sortContext.value, + position: 0, + }, + order: sortContext.reversed ? 'desc' : 'asc', + type: 'ducet', + }; + } + } + + return; + } + + /** + * Updates filter query from filterContext + */ + contextFilterChanged(filterContext: FilterContext) { + this.filterQuery.next(this.buildFilterQuery(filterContext)); + } + + /** + * Updates sort query from sortContext + */ + contextSortChanged(sortContext: SortContext) { + this.sortQuery.next(this.buildSortQuery(sortContext)); + } + + /** + * Sets sort context + */ + setContextSort(sortContext: SortContext) { + this.sortOptions.next(sortContext); + } + + /** + * Updates the filter context options from given facets + */ + updateContextFilter(facets: SCFacet[]) { + // arrange facet field "type" to first position + facets.sort((a: SCFacet, b: SCFacet) => { + if (a.field === 'type') { + return -1; + } + + if (b.field === 'type') { + return 1; + } + + return 0; + }); + + if (!this.contextFilter) { + this.contextFilter = { + name: 'filter', + options: [], + }; + } + + this.updateContextFilterOptions(this.contextFilter, facets); + } + + /** + * Updates context filter with new facets. + * It preserves the checked status of existing filter options + */ + updateContextFilterOptions = (contextFilter: FilterContext, facets: SCFacet[]) => { + const newFilterOptions: FilterFacet[] = []; + + // iterate new facets + for (const facet of facets) { + if (facet.buckets.length > 0) { + const newFilterFacet: FilterFacet = { + buckets: [], + field: facet.field, + onlyOnType: facet.onlyOnType, + }; + newFilterOptions.push(newFilterFacet); + + // search existing filterOption + const filterOption = contextFilter.options.find((contextFacet: FilterFacet) => + contextFacet.field === facet.field && contextFacet.onlyOnType === facet.onlyOnType); + facet.buckets.forEach((bucket: SCFacetBucket) => { + // search existing bucket to preserve checked status + const existingFilterBucket = filterOption ? filterOption.buckets + .find((contextBucket: FilterBucket) => contextBucket.key === bucket.key) : undefined; + const filterBucket: FilterBucket = { + checked: existingFilterBucket ? existingFilterBucket.checked : false, + count: bucket.count, + key: bucket.key, + }; + newFilterFacet.buckets.push(filterBucket); + }); + } + } + + // update filter options + contextFilter.options = newFilterOptions; + this.contextFilter = contextFilter; + + this.filterOptions.next(contextFilter); + } +} diff --git a/src/app/modules/menu/navigation/navigation.component.ts b/src/app/modules/menu/navigation/navigation.component.ts index 2e2a0523..0a894873 100644 --- a/src/app/modules/menu/navigation/navigation.component.ts +++ b/src/app/modules/menu/navigation/navigation.component.ts @@ -14,17 +14,10 @@ */ import {Component} from '@angular/core'; import {LangChangeEvent, TranslateService} from '@ngx-translate/core'; -import { - SCAppConfigurationMenuCategory, - SCThing, - SCThingTranslator, - SCTranslations, -} from '@openstapps/core'; +import {SCAppConfigurationMenuCategory, SCLanguage, SCThingTranslator, SCTranslations} from '@openstapps/core'; import {Logger} from '@openstapps/logger'; import {ConfigProvider} from '../../config/config.provider'; -const logger = new Logger(); - /** * Generated class for the MenuPage page. * @@ -37,34 +30,42 @@ const logger = new Logger(); templateUrl: 'navigation.html', }) export class NavigationComponent { - language: keyof SCTranslations = 'en'; + + /** + * Possible languages to be used for translation + */ + language: keyof SCTranslations = 'en'; + + /** + * Menu entries from config module + */ menu: SCAppConfigurationMenuCategory[]; + + /** + * Core translator + */ translator: SCThingTranslator; constructor(private configProvider: ConfigProvider, public translateService: TranslateService) { - this.loadMenuEntries().then(() => - logger.log('menuEntries loaded from config: ' + JSON.stringify(this.menu))).catch((error) => { - logger.error(error); - - }); + this.loadMenuEntries(); translateService.onLangChange.subscribe((event: LangChangeEvent) => { - this.language = event.lang as keyof SCTranslations; - this.translator = new SCThingTranslator(this.language, 'en'); + this.language = event.lang as keyof SCTranslations; + this.translator = new SCThingTranslator(this.language); }); - this.translator = new SCThingTranslator('en', 'en'); + this.translator = new SCThingTranslator('en'); } /** - * TODO + * Loads menu entris from configProvider */ - // tslint:disable-next-line:prefer-function-over-method - ionViewDidLoad() { - // console.log('ionViewDidLoad MenuPage'); - } - async loadMenuEntries() { - this.menu = await this.configProvider.getValue('menus') as SCAppConfigurationMenuCategory[]; + try { + this.menu = await this.configProvider.getValue('menus') as SCAppConfigurationMenuCategory[]; + } catch (error) { + Logger.error(`error from loading menu entries: ${error}`); + } + } // openPage(page) { diff --git a/src/app/modules/menu/navigation/navigation.html b/src/app/modules/menu/navigation/navigation.html index 610ca2bf..9246a587 100644 --- a/src/app/modules/menu/navigation/navigation.html +++ b/src/app/modules/menu/navigation/navigation.html @@ -10,39 +10,16 @@
- - {{category.translations[language].name | titlecase}} - - - - - {{item.translations[language].title | titlecase}} - - - - - - {{category.translations[language].name | titlecase}} - - - - - {{item.translations[language].title | titlecase}} - - - - - - {{category.translations[language].name | titlecase}} - - - - - {{item.translations[language].title | titlecase}} - - - - + {{category.translations[language].name | titlecase}} + + + + + {{item.translations[language].title | titlecase}} + + + diff --git a/src/app/modules/settings/item/settings-item.component.ts b/src/app/modules/settings/item/settings-item.component.ts index 0c6d810c..e22df041 100644 --- a/src/app/modules/settings/item/settings-item.component.ts +++ b/src/app/modules/settings/item/settings-item.component.ts @@ -17,13 +17,13 @@ import {AlertController} from '@ionic/angular'; import {LangChangeEvent, TranslateService} from '@ngx-translate/core'; import { SCLanguage, + SCLanguageCode, SCSetting, SCSettingValue, SCSettingValues, SCThingTranslator, SCTranslations, } from '@openstapps/core'; -import {Logger} from '@openstapps/logger'; import {SettingsProvider} from '../settings.provider'; /** @@ -34,6 +34,12 @@ import {SettingsProvider} from '../settings.provider'; templateUrl: 'settings-item.html', }) export class SettingsItemComponent implements OnInit { + + /** + * If set the setting will be shown as compact view + */ + @Input() compactView = false; + /** * Flag for workaround for selected 'select option' not updating translation */ @@ -107,8 +113,6 @@ export class SettingsItemComponent implements OnInit { * NgInit */ ngOnInit(): void { - Logger.log(JSON.stringify(this.setting)); - this.translatedSetting = this.translator.translate(this.setting); } @@ -136,7 +140,7 @@ export class SettingsItemComponent implements OnInit { // handle general settings, with special actions switch (this.setting.name) { case 'language': - this.translateService.use(this.setting.value.toString()); + this.translateService.use(this.setting.value as SCLanguageCode); break; case 'geoLocation': if (!!this.setting.value) { @@ -146,7 +150,9 @@ export class SettingsItemComponent implements OnInit { default: } await this.settingsProvider - .setSettingValue(this.setting.categories[0], this.setting.name, this.setting.value); + .setSettingValue(this.setting.categories[0], + this.setting.name, + this.setting.value); } else { // reset setting this.setting.value = diff --git a/src/app/modules/settings/item/settings-item.html b/src/app/modules/settings/item/settings-item.html index 40a60c1a..0b34af0f 100644 --- a/src/app/modules/settings/item/settings-item.html +++ b/src/app/modules/settings/item/settings-item.html @@ -1,9 +1,12 @@ - {{ translatedSetting.name() | titlecase }} + + {{ translatedSetting.name() | titlecase }} + + - {{ translatedSetting.description() }} + {{ translatedSetting.description() }}
diff --git a/src/app/modules/settings/page/settings-page.component.ts b/src/app/modules/settings/page/settings-page.component.ts index 526e554b..3bf484b6 100644 --- a/src/app/modules/settings/page/settings-page.component.ts +++ b/src/app/modules/settings/page/settings-page.component.ts @@ -12,12 +12,11 @@ * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ -import {Component} from '@angular/core'; +import {ChangeDetectorRef, Component} from '@angular/core'; import {AlertController, ToastController} from '@ionic/angular'; import {LangChangeEvent, TranslateService} from '@ngx-translate/core'; import {SCLanguage, SCSettingMeta, SCThingTranslator, SCTranslations} from '@openstapps/core'; import {SettingsCache, SettingsProvider} from '../settings.provider'; - /** * Settings page component */ @@ -59,11 +58,13 @@ export class SettingsPageComponent { * @param settingsProvider SettingsProvider * @param toastController ToastController * @param translateService TranslateService + * @param changeDetectorRef ChangeDetectorRef */ constructor(private readonly alertController: AlertController, private readonly settingsProvider: SettingsProvider, private readonly toastController: ToastController, - private readonly translateService: TranslateService) { + private readonly translateService: TranslateService, + private readonly changeDetectorRef: ChangeDetectorRef) { this.language = translateService.currentLang as keyof SCTranslations; this.translator = new SCThingTranslator(this.language); @@ -72,8 +73,6 @@ export class SettingsPageComponent { this.translator = new SCThingTranslator(this.language); }); this.settingsCache = {}; - this.categoriesOrder = settingsProvider.getCategoriesOrder(); - } /** @@ -93,6 +92,9 @@ export class SettingsPageComponent { */ async loadSettings(): Promise { this.settingsCache = await this.settingsProvider.getCache(); + // categoriesOrder triggers updating the View, because it is used in the ngFor loop + this.categoriesOrder = this.settingsProvider.getCategoriesOrder(); + this.changeDetectorRef.detectChanges(); } /** diff --git a/src/app/modules/settings/settings.module.ts b/src/app/modules/settings/settings.module.ts index 771cd19e..96d8848c 100644 --- a/src/app/modules/settings/settings.module.ts +++ b/src/app/modules/settings/settings.module.ts @@ -17,7 +17,7 @@ import {NgModule} from '@angular/core'; import {FormsModule} from '@angular/forms'; import {RouterModule, Routes} from '@angular/router'; import {Geolocation} from '@ionic-native/geolocation/ngx'; -import {IonicModule} from '@ionic/angular'; +import {Events, IonicModule} from '@ionic/angular'; import {TranslateModule} from '@ngx-translate/core'; import {ConfigProvider} from '../config/config.provider'; @@ -37,6 +37,9 @@ const settingsRoutes: Routes = [ SettingsPageComponent, SettingsItemComponent, ], + exports: [ + SettingsItemComponent, + ], imports: [ CommonModule, FormsModule, @@ -46,6 +49,7 @@ const settingsRoutes: Routes = [ ], providers: [ ConfigProvider, + Events, Geolocation, SettingsProvider, ], diff --git a/src/app/modules/settings/settings.provider.ts b/src/app/modules/settings/settings.provider.ts index 34da2d2b..f4631a2a 100644 --- a/src/app/modules/settings/settings.provider.ts +++ b/src/app/modules/settings/settings.provider.ts @@ -14,12 +14,13 @@ */ import {Injectable} from '@angular/core'; import {Geolocation} from '@ionic-native/geolocation/ngx'; +import {Events} from '@ionic/angular'; import { SCSetting, SCSettingValue, SCSettingValues, } from '@openstapps/core'; -import deepmerge from 'deepmerge'; +import deepMerge from 'deepmerge'; import {ConfigProvider} from '../config/config.provider'; import {StorageProvider} from '../storage/storage.provider'; @@ -164,10 +165,12 @@ export class SettingsProvider { * @param storage TODO * @param configProvider TODO * @param geoLocation TODO + * @param events TODO */ constructor(private readonly storage: StorageProvider, private readonly configProvider: ConfigProvider, - private readonly geoLocation: Geolocation) { + private readonly geoLocation: Geolocation, + private readonly events: Events) { this.categoriesOrder = []; this.settingsCache = {}; } @@ -246,8 +249,9 @@ export class SettingsProvider { } await this.saveSettingValues(); } - this.initialized = true; + // publish provider initialised + this.events.publish('stapps.settings.initialised'); } /** @@ -339,7 +343,7 @@ export class SettingsProvider { * * @throws Exception if setting is not provided */ - public async getValue(category: string, name: string): Promise { + public async getValue(category: string, name: string): Promise { await this.init(); if (this.settingExists(category, name)) { // return a copy of the settings value @@ -395,7 +399,7 @@ export class SettingsProvider { const savedSettingsValues: SettingValuesContainer = await this.storage.get(STORAGE_KEY_SETTING_VALUES); const cacheSettingsValues = this.getSettingValuesFromCache(); - const mergedSettingValues = deepmerge(savedSettingsValues, cacheSettingsValues); + const mergedSettingValues = deepMerge(savedSettingsValues, cacheSettingsValues); await this.storage .put(STORAGE_KEY_SETTING_VALUES, mergedSettingValues); } else { @@ -412,7 +416,8 @@ export class SettingsProvider { } /** - * Sets a valid value of a setting and persists changes in storage + * Sets a valid value of a setting and persists changes in storage. Also the changes get published bey Events + * * @param category Category key name * @param name Setting key name * @param value Value to be set @@ -426,8 +431,11 @@ export class SettingsProvider { const setting: SCSetting = this.settingsCache[category].settings[name]; const isValueValid = SettingsProvider.validateValue(setting, value); if (isValueValid) { + // set and persist new value this.settingsCache[category].settings[name].value = value; await this.saveSettingValues(); + // publish setting changes + this.events.publish('stapps.settings.changed', category, name, value); } else { throw new Error(`Value "${value}" of type ${typeof value} is not valid for ${setting.inputType}`); diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index a663ab3d..f3940e22 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -18,8 +18,19 @@ "menu": { "context": { "title": "Kontext Menü", - "sort": "Sortierung", - "filter": "Filter" + "sort": { + "title": "Sortierung", + "relevance": "Relevanz", + "name": "Name", + "date": "Datum", + "type": "Typ" + }, + "filter": { + "title": "Filter", + "options": "Optionen", + "showAll": "alle anzeigen" + }, + "settings": "Einstellungen" } }, "settings": { diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 0827c9e2..47cc1222 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -17,16 +17,27 @@ }, "menu": { "context": { - "title": "Context Menu", - "sort": "Sort", - "filter": "Filter" + "title": "context menu", + "sort": { + "title": "sort", + "relevance": "relevance", + "name": "name", + "date": "date", + "type": "type" + }, + "filter": { + "title": "filter", + "options": "options", + "showAll": "show all" + }, + "settings": "settings" } }, "settings": { "resetAlert.title": "Reset all settings?", "resetAlert.message": "Are you shure to reset all settings to defaults values?", - "resetAlert.buttonYes": "Yes", - "resetAlert.buttonCancel": "Cancel", + "resetAlert.buttonYes": "yes", + "resetAlert.buttonCancel": "cancel", "resetToast.message": "Settings reset", "title": "Settings", "geoLocation": { diff --git a/src/environments/environment.web.ts b/src/environments/environment.web.ts index da306246..4d819c6c 100644 --- a/src/environments/environment.web.ts +++ b/src/environments/environment.web.ts @@ -16,5 +16,5 @@ export const environment = { backend_url: 'http://localhost:3000', backend_version: '1.0.0', use_fake_backend: true, - production: true, + production: false, };