From 3c079cd189e3b75d3b203bd46ab57378f99e88cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wieland=20Sch=C3=B6bl?= Date: Tue, 19 Jan 2021 13:50:51 +0000 Subject: [PATCH] feat: show menu for multiple days for canteens and cafes Closes #19, #79 --- package-lock.json | 1000 ++++++++++------- package.json | 2 +- .../_helpers/data/resources/test-resources.ts | 27 +- src/app/_helpers/data/sample-things.ts | 60 +- src/app/_helpers/fake-backend.interceptor.ts | 8 +- src/app/_helpers/fakesearch/filters.ts | 170 +++ src/app/_helpers/ts-logger.ts | 19 + src/app/app.component.ts | 2 + src/app/modules/data/data-routing.module.ts | 2 + src/app/modules/data/data.module.ts | 6 + src/app/modules/data/data.provider.ts | 2 +- .../detail/data-detail-content.component.ts | 1 + .../skeleton-segment-button.component.ts | 25 + .../elements/skeleton-segment-button.html | 4 + .../modules/data/list/data-list.component.ts | 76 +- src/app/modules/data/list/data-list.html | 16 +- .../data/list/food-data-list.component.ts | 126 +++ .../place/place-detail-content.component.ts | 26 +- .../types/place/place-detail-content.html | 1 + .../mensa/place-mensa-detail.component.ts | 132 +++ .../special/mensa/place-mensa-service.ts | 63 ++ .../place/special/mensa/place-mensa.html | 24 + .../context/context-menu.component.spec.ts | 4 +- .../menu/context/context-menu.component.ts | 38 +- .../context-menu.service.spec.ts} | 12 +- .../context-menu.service.ts} | 20 +- src/app/modules/menu/menu.module.ts | 4 +- 27 files changed, 1347 insertions(+), 523 deletions(-) create mode 100644 src/app/_helpers/fakesearch/filters.ts create mode 100644 src/app/_helpers/ts-logger.ts create mode 100644 src/app/modules/data/elements/skeleton-segment-button.component.ts create mode 100644 src/app/modules/data/elements/skeleton-segment-button.html create mode 100644 src/app/modules/data/list/food-data-list.component.ts create mode 100644 src/app/modules/data/types/place/special/mensa/place-mensa-detail.component.ts create mode 100644 src/app/modules/data/types/place/special/mensa/place-mensa-service.ts create mode 100644 src/app/modules/data/types/place/special/mensa/place-mensa.html rename src/app/modules/menu/{menu.service.spec.ts => context/context-menu.service.spec.ts} (90%) rename src/app/modules/menu/{menu.service.ts => context/context-menu.service.ts} (92%) diff --git a/package-lock.json b/package-lock.json index 89a7f455..08584ced 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2226,9 +2226,9 @@ } }, "@krlwlfrt/async-pool": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@krlwlfrt/async-pool/-/async-pool-0.3.0.tgz", - "integrity": "sha512-N4uQIfGTsVw1/fE3Z7DWh878dyFhVkuFYyMiQyW8QTd21yjn91rlub5SERssQXMPKDzYKNGrban3FKSQAtXisQ==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@krlwlfrt/async-pool/-/async-pool-0.4.1.tgz", + "integrity": "sha512-mSLEhCiL6jvWuF5vtBUFzMlgvwt1Tte4io7A3B2slClFBVsajmonDV1qk2myq5EQvNy3g5KkN2QNSLoCE4r8og==" }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", @@ -2283,7 +2283,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.3", "run-parallel": "^1.1.9" @@ -2292,14 +2291,12 @@ "@nodelib/fs.stat": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" }, "@nodelib/fs.walk": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.3", "fastq": "^1.6.0" @@ -2323,29 +2320,30 @@ } }, "@openstapps/api": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@openstapps/api/-/api-0.22.0.tgz", - "integrity": "sha512-PrKhL/Xe5IVeGplsMQPZajXzjJ8Mjo8iW7Kcn2dQh/I/1dd04jggrO/DPB+L2H/QOlG/+7Wcwa9lcNiwm4JI/A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@openstapps/api/-/api-0.25.0.tgz", + "integrity": "sha512-4bJhoGc3AjKRgy1AO3LxPoMJYTmHZgrWUbxZMEB18IjtxtgG7V5c/cAvCKUP/wViv1EZTjxWa5Iq2tWwKv30Kg==", "requires": { - "@krlwlfrt/async-pool": "0.3.0", - "@openstapps/core": "0.34.0", - "@openstapps/core-tools": "0.14.0", + "@krlwlfrt/async-pool": "0.4.1", + "@openstapps/core": "0.38.1", + "@openstapps/core-tools": "0.16.0", "@openstapps/logger": "0.5.0", - "@types/cli-progress": "1.8.1", - "@types/express": "4.17.6", - "@types/morgan": "1.9.0", - "@types/node": "10.17.14", - "@types/request": "2.48.4", + "@types/cli-progress": "3.8.0", + "@types/express": "4.17.8", + "@types/morgan": "1.9.2", + "@types/node": "10.17.44", + "@types/request": "2.48.5", "@types/traverse": "0.6.32", "@types/uuid": "3.4.7", "@types/wait-on": "4.0.0", - "cli-progress": "3.6.0", - "commander": "5.0.0-3", + "body-parser": "1.19.0", + "cli-progress": "3.8.2", + "commander": "6.2.0", "express": "4.17.1", "fast-clone": "1.5.13", - "jsonschema": "1.2.5", - "moment": "2.24.0", - "morgan": "1.9.1", + "json-schema": "0.2.5", + "moment": "2.29.1", + "morgan": "1.10.0", "request": "2.88.2", "traverse": "0.6.6", "uuid": "3.4.0", @@ -2353,18 +2351,20 @@ }, "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==", + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@openstapps/core/-/core-0.38.1.tgz", + "integrity": "sha512-fGGA+G9KSsqeYt6fqXnYIWFcnI6a6tW6caiDiO8o9AgU00bE2Hk/BpI5hXe6bRbBn/nPfK/lk0G5vJaNv88mUw==", "requires": { + "@openstapps/core-tools": "0.16.0", "@types/geojson": "1.0.6", "@types/json-patch": "0.0.30", - "@types/node": "10.17.14", + "@types/json-schema": "7.0.6", + "@types/node": "10.17.44", "fast-clone": "1.5.13", - "http-status-codes": "1.4.0", + "http-status-codes": "2.1.4", "json-patch": "0.7.0", - "jsonschema": "1.2.5", - "ts-optchain": "0.1.3" + "json-schema": "0.2.5", + "ts-optchain": "0.1.8" } }, "@openstapps/logger": { @@ -2384,14 +2384,14 @@ "version": "10.17.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" } } }, - "@types/node": { - "version": "10.17.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.14.tgz", - "integrity": "sha512-G0UmX5uKEmW+ZAhmZ6PLTQ5eu/VPaT+d/tdLd5IFsKRPcbe6lPxocBtcYBFSaLaCW8O60AX90e91Nsp8lVHCNw==" - }, "@types/nodemailer": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.0.tgz", @@ -2430,11 +2430,43 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "http-status-codes": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.1.4.tgz", + "integrity": "sha512-MZVIsLKGVOVE1KEnldppe6Ij+vmemMuApDfjhVSLzyYP+td0bREEYyAoIw9yFePoBXManCuBqmiNP5FqJS5Xkg==" + }, + "json-schema": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.5.tgz", + "integrity": "sha512-gWJOWYFrhQ8j7pVm0EM8Slr+EPVq1Phf6lvzvD/WCeqkrx/f2xBI0xOsRRS9xCn3I4vKtP519dvs3TP09r24wQ==" + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + } + }, "nodemailer": { "version": "6.4.4", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.4.tgz", @@ -2447,6 +2479,11 @@ "requires": { "has-flag": "^4.0.0" } + }, + "ts-optchain": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/ts-optchain/-/ts-optchain-0.1.8.tgz", + "integrity": "sha512-crvloFKZlPIysdVcP7Ej1w4HijBx7NmLdeorqfxOvt87DcUIbhKV4ZaSgCL+IQ+zzTgDx5zDuNHRvUbTIr9aqw==" } } }, @@ -2544,43 +2581,193 @@ } }, "@openstapps/core-tools": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@openstapps/core-tools/-/core-tools-0.14.0.tgz", - "integrity": "sha512-ndnQ4HtqMjIUZOEnwPwW17rKmzCvJ3wwZr1fZnBBQk85JV8RZffcj1uOTjzTBk5A5yoXbkIGUztjqkeGwbyuJg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@openstapps/core-tools/-/core-tools-0.16.0.tgz", + "integrity": "sha512-agcRBjavO7TlgjDvoJEnUgXzDOW5w6us2VENZ73DUC+8QKc9okdjDuVIMy2oBrKGgOxJBg0G/xKqQN9CARqqAg==", "requires": { "@krlwlfrt/async-pool": "0.3.0", - "@openstapps/logger": "0.4.0", + "@openstapps/logger": "0.5.0", "@types/glob": "7.1.1", "@types/got": "9.6.9", - "@types/mustache": "0.8.32", - "@types/node": "10.17.14", + "@types/json-schema": "7.0.6", + "@types/mustache": "4.0.0", + "@types/node": "10.17.21", "ajv": "6.11.0", + "better-ajv-errors": "0.6.7", "chai": "4.2.0", - "commander": "2.20.3", - "deepmerge": "3.3.0", - "del": "4.1.1", + "commander": "4.1.1", + "deepmerge": "4.2.2", + "del": "5.1.0", "flatted": "2.0.1", "glob": "7.1.6", - "got": "9.6.0", + "got": "10.5.5", "humanize-string": "2.1.0", - "jsonschema": "1.2.5", - "mustache": "3.0.1", + "json-schema": "0.2.5", + "mustache": "4.0.0", "plantuml-encoder": "1.4.0", "toposort": "2.0.2", - "ts-json-schema-generator": "0.42.0", + "ts-json-schema-generator": "0.60.0", "ts-node": "8.6.2", - "typedoc": "0.14.2" + "typedoc": "0.18.0", + "typescript": "3.8.3" }, "dependencies": { + "@krlwlfrt/async-pool": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@krlwlfrt/async-pool/-/async-pool-0.3.0.tgz", + "integrity": "sha512-N4uQIfGTsVw1/fE3Z7DWh878dyFhVkuFYyMiQyW8QTd21yjn91rlub5SERssQXMPKDzYKNGrban3FKSQAtXisQ==" + }, + "@openstapps/logger": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@openstapps/logger/-/logger-0.5.0.tgz", + "integrity": "sha512-SLjoeFoXuCagz1WRlFvX2+zoIJr+zehAJe6egNPrYdlI3IpnUYNk06HzWzNM95Iozzfy7eKJjft8plO4VQtQQg==", + "requires": { + "@types/node": "10.17.17", + "@types/nodemailer": "6.4.0", + "chalk": "3.0.0", + "flatted": "2.0.1", + "moment": "2.24.0", + "nodemailer": "6.4.4" + }, + "dependencies": { + "@types/node": { + "version": "10.17.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", + "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" + } + } + }, "@types/node": { - "version": "10.17.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.14.tgz", - "integrity": "sha512-G0UmX5uKEmW+ZAhmZ6PLTQ5eu/VPaT+d/tdLd5IFsKRPcbe6lPxocBtcYBFSaLaCW8O60AX90e91Nsp8lVHCNw==" + "version": "10.17.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.21.tgz", + "integrity": "sha512-PQKsydPxYxF1DsAFWmunaxd3sOi3iMt6Zmx/tgaagHYmwJ/9cRH91hQkeJZaUGWbvn0K5HlSVEXkn5U/llWPpQ==" + }, + "@types/nodemailer": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.0.tgz", + "integrity": "sha512-KY7bFWB0MahRZvVW4CuW83qcCDny59pJJ0MQ5ifvfcjNwPlIT0vW4uARO4u1gtkYnWdhSvURegecY/tzcukJcA==", + "requires": { + "@types/node": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "requires": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" + }, + "json-schema": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.5.tgz", + "integrity": "sha512-gWJOWYFrhQ8j7pVm0EM8Slr+EPVq1Phf6lvzvD/WCeqkrx/f2xBI0xOsRRS9xCn3I4vKtP519dvs3TP09r24wQ==" + }, + "nodemailer": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.4.tgz", + "integrity": "sha512-2GqGu5o3FBmDibczU3+LZh9lCEiKmNx7LvHl512p8Kj+Kn5FQVOICZv85MDFz/erK0BDd5EJp3nqQLpWCZD1Gg==" + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } }, "ts-node": { "version": "8.6.2", @@ -2596,26 +2783,6 @@ } } }, - "@openstapps/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@openstapps/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-p12Jt2xg0o/0N4NcHGwmHSM7K6eXsyMTnzEmm1ulIn5c8WUYUQEArYgYwGUMriWv2La3Ec+SCxf7RpTq0yehKA==", - "requires": { - "@types/node": "10.14.12", - "@types/nodemailer": "6.2.0", - "chalk": "2.4.2", - "flatted": "2.0.1", - "moment": "2.24.0", - "nodemailer": "6.2.1" - }, - "dependencies": { - "@types/node": { - "version": "10.14.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.12.tgz", - "integrity": "sha512-QcAKpaO6nhHLlxWBvpc4WeLrTvPqlHOvaj0s5GriKkA1zq+bsFBPpfYCvQhLqLgYlIko8A9YrPdaMHCo5mBcpg==" - } - } - }, "@schematics/angular": { "version": "9.1.12", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.12.tgz", @@ -2655,16 +2822,16 @@ } }, "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-1.2.0.tgz", + "integrity": "sha512-mwhXGkRV5dlvQc4EgPDxDxO6WuMBVymGFd1CA+2Y+z5dG9MNspoQ+AWjl/Ld1MnpCL8AKbosZlDVohqcIwuWsw==" }, "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", "requires": { - "defer-to-connect": "^1.0.1" + "defer-to-connect": "^2.0.0" } }, "@types/body-parser": { @@ -2674,13 +2841,17 @@ "requires": { "@types/connect": "*", "@types/node": "*" - }, - "dependencies": { - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" - } + } + }, + "@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" } }, "@types/caseless": { @@ -2689,18 +2860,11 @@ "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" }, "@types/cli-progress": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-1.8.1.tgz", - "integrity": "sha512-W31ZRQPQ1CM42pb5iqs3TzQlMv/RDRsPZ6pTCsl71oLFqFI/TYors3Pukj6tMinlUmXmv+Az5RD/94fZPcxMrw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.8.0.tgz", + "integrity": "sha512-2OV7ybuYQc6ju6Xlg8ncQcPA/vVbMTSGS0vygjszi9O7swC63S6f2oAnP4CE+4ppRo7eCQovlj268KySt1MaUQ==", "requires": { "@types/node": "*" - }, - "dependencies": { - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" - } } }, "@types/connect": { @@ -2709,13 +2873,6 @@ "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", "requires": { "@types/node": "*" - }, - "dependencies": { - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" - } } }, "@types/cordova": { @@ -2738,9 +2895,9 @@ "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" }, "@types/express": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz", - "integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==", + "version": "4.17.8", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.8.tgz", + "integrity": "sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ==", "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "*", @@ -2756,13 +2913,6 @@ "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*" - }, - "dependencies": { - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" - } } }, "@types/form-data": { @@ -2774,21 +2924,6 @@ "form-data": "*" } }, - "@types/fs-extra": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz", - "integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==", - "requires": { - "@types/node": "*" - }, - "dependencies": { - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" - } - } - }, "@types/geojson": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-1.0.6.tgz", @@ -2819,27 +2954,12 @@ "@types/node": "*", "@types/tough-cookie": "*", "form-data": "^2.5.0" - }, - "dependencies": { - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" - } } }, - "@types/handlebars": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.1.0.tgz", - "integrity": "sha512-gq9YweFKNNB1uFK71eRqsd4niVkXrxHugqWFQkeLRJvGjnxsLr16bYtcsG4tOFwmYi0Bax+wCkbf1reUfdl4kA==", - "requires": { - "handlebars": "*" - } - }, - "@types/highlight.js": { - "version": "9.12.4", - "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.4.tgz", - "integrity": "sha512-t2szdkwmg2JJyuCM20e8kR2X59WCE5Zkl4bzm1u1Oukjm79zpbiAv+QjnwLnuuV0WHEcX2NgUItu0pAMKuOPww==" + "@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" }, "@types/jasmine": { "version": "3.3.12", @@ -2864,18 +2984,15 @@ "@types/json-schema": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", - "dev": true + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" }, - "@types/lodash": { - "version": "4.14.163", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.163.tgz", - "integrity": "sha512-BeZM/FZaV53emqyHxn9L39Oz6XbHMBRLA1b1quROku48J/1kYYxPmVOJ/qSQheb81on4BI7H6QDo6bkUuRaDNQ==" - }, - "@types/marked": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.2.tgz", - "integrity": "sha512-cDB930/7MbzaGF6U3IwSQp6XBru8xWajF5PV2YZZeV8DyiliTuld11afVztGI9+yJZ29il5E+NpGA6ooV/Cjkg==" + "@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "requires": { + "@types/node": "*" + } }, "@types/mime": { "version": "2.0.3", @@ -2894,38 +3011,22 @@ "dev": true }, "@types/morgan": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.0.tgz", - "integrity": "sha512-warrzirh5dlTMaETytBTKR886pRXwr+SMZD87ZE13gLMR8Pzz69SiYFkvoDaii78qGP1iyBIUYz5GiXyryO//A==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.2.tgz", + "integrity": "sha512-edtGMEdit146JwwIeyQeHHg9yID4WSolQPxpEorHmN3KuytuCHyn2ELNr5Uxy8SerniFbbkmgKMrGM933am5BQ==", "requires": { - "@types/express": "*" + "@types/node": "*" } }, "@types/mustache": { - "version": "0.8.32", - "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-0.8.32.tgz", - "integrity": "sha512-RTVWV485OOf4+nO2+feurk0chzHkSjkjALiejpHltyuMf/13fGymbbNNFrSKdSSUg1TIwzszXdWsVirxgqYiFA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.0.0.tgz", + "integrity": "sha512-AVBOcLJenbpCIJcHUvGWj+YMlaiwcFlGK1YEH2mePXkB5B/vQLrFkHG9IpBH71mXnkbibc4V8Nnn1wJSxcgCEA==" }, "@types/node": { "version": "10.17.44", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.44.tgz", - "integrity": "sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw==", - "dev": true - }, - "@types/nodemailer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.2.0.tgz", - "integrity": "sha512-WGGEk/BGRLuYF3gyoTwbtKg5tCexZzb5lkTsis2k7GkAzlg4x2299/SC6Ssdj3X/5TzT1BHVc8zcFg/7KSzBLw==", - "requires": { - "@types/node": "*" - }, - "dependencies": { - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" - } - } + "integrity": "sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -2950,21 +3051,22 @@ "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" }, "@types/request": { - "version": "2.48.4", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.4.tgz", - "integrity": "sha512-W1t1MTKYR8PxICH+A4HgEIPuAC3sbljoEVfyZbeFJJDbr30guDspJri2XOaM2E+Un7ZjrihaDi7cf6fPa2tbgw==", + "version": "2.48.5", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", + "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", "requires": { "@types/caseless": "*", "@types/node": "*", "@types/tough-cookie": "*", "form-data": "^2.5.0" - }, - "dependencies": { - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" - } + } + }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" } }, "@types/selenium-webdriver": { @@ -2989,35 +3091,12 @@ } }, "@types/serve-static": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.6.tgz", - "integrity": "sha512-nuRJmv7jW7VmCVTn+IgYDkkbbDGyIINOeu/G0d74X3lm6E5KfMeQPJhxIt1ayQeQB3cSxvYs1RA/wipYoFB4EA==", + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.7.tgz", + "integrity": "sha512-3diZWucbR+xTmbDlU+FRRxBf+31OhFew7cJXML/zh9NmvSPTNoFecAwHB66BUqFgENJtqMiyl7JAwUE/siqdLw==", "requires": { "@types/mime": "*", "@types/node": "*" - }, - "dependencies": { - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" - } - } - }, - "@types/shelljs": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.8.tgz", - "integrity": "sha512-lD3LWdg6j8r0VRBFahJVaxoW0SIcswxKaFUrmKl33RJVeeoNYQAz4uqCJ5Z6v4oIBOsC5GozX+I5SorIKiTcQA==", - "requires": { - "@types/glob": "*", - "@types/node": "*" - }, - "dependencies": { - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" - } } }, "@types/source-list-map": { @@ -3351,7 +3430,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -3446,7 +3524,8 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "ansi-styles": { "version": "3.2.1", @@ -3590,6 +3669,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, "requires": { "array-uniq": "^1.0.1" } @@ -3597,7 +3677,8 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "array-unique": { "version": "0.3.2", @@ -3788,8 +3869,7 @@ "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "atob": { "version": "2.1.2", @@ -4011,6 +4091,27 @@ "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=", "dev": true }, + "better-ajv-errors": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-0.6.7.tgz", + "integrity": "sha512-PYgt/sCzR4aGpyNy5+ViSQ77ognMnWq7745zM+/flYO4/Yisdtp9wDQW2IKCyVYPUxQt3E/b5GBSwfhd1LPdlg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/runtime": "^7.0.0", + "chalk": "^2.4.1", + "core-js": "^3.2.1", + "json-to-ast": "^2.0.3", + "jsonpointer": "^4.0.1", + "leven": "^3.1.0" + }, + "dependencies": { + "core-js": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.7.0.tgz", + "integrity": "sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA==" + } + } + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -4503,18 +4604,27 @@ "unset-value": "^1.0.0" } }, + "cacheable-lookup": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", + "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", + "requires": { + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" + } + }, "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", + "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^4.1.0", - "responselike": "^1.0.2" + "responselike": "^2.0.0" }, "dependencies": { "get-stream": { @@ -4524,11 +4634,6 @@ "requires": { "pump": "^3.0.0" } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" } } }, @@ -4795,8 +4900,7 @@ "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, "cli-cursor": { "version": "3.1.0", @@ -4808,12 +4912,47 @@ } }, "cli-progress": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.6.0.tgz", - "integrity": "sha512-elg6jkiDedYrvwqWSae2FGvtbMo37Lo04oI9jJ5cI43Ge3jrDPWzeL3axv7MgBLYHDY/kGio/CXa49m4MWMrNw==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.8.2.tgz", + "integrity": "sha512-qRwBxLldMSfxB+YGFgNRaj5vyyHe1yMpVeDL79c+7puGujdKJHQHydgqXDcrkvQgJ5U/d3lpf6vffSoVVUftVQ==", "requires": { "colors": "^1.1.2", - "string-width": "^2.1.1" + "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "cli-spinners": { @@ -4912,6 +5051,13 @@ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "requires": { "mimic-response": "^1.0.0" + }, + "dependencies": { + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + } } }, "coa": { @@ -4931,6 +5077,11 @@ "integrity": "sha512-3Jfe6ZmmGzvdQWFo3MUzobn3WdX++jc3Tj0rsviJWYPnP7NGMFEE4qheNeOXeJgB1TTgxYT8XuNvhS/u596yGg==", "dev": true }, + "code-error-fragment": { + "version": "0.0.230", + "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", + "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==" + }, "codelyzer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.1.2.tgz", @@ -5031,9 +5182,9 @@ } }, "commander": { - "version": "5.0.0-3", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0-3.tgz", - "integrity": "sha512-8lfJT6SUoBSqxsXxICEeSB6+/YeVUDshV4jfrDneRcrC3H/bZ9YossoD5KCtNJlmKFUsWFZJg1b9MmEvLD3BCA==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==" }, "commondir": { "version": "1.0.1", @@ -6485,11 +6636,11 @@ "dev": true }, "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", "requires": { - "mimic-response": "^1.0.0" + "mimic-response": "^2.0.0" } }, "dedent": { @@ -6567,9 +6718,9 @@ } }, "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==" }, "define-properties": { "version": "1.1.3", @@ -6625,6 +6776,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, "requires": { "@types/glob": "^7.1.1", "globby": "^6.1.0", @@ -6728,7 +6880,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "requires": { "path-type": "^4.0.0" } @@ -7648,7 +7799,6 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7662,7 +7812,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -7671,7 +7820,6 @@ "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, "requires": { "to-regex-range": "^5.0.1" } @@ -7680,7 +7828,6 @@ "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, "requires": { "is-glob": "^4.0.1" } @@ -7688,14 +7835,12 @@ "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 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.0.5" @@ -7705,7 +7850,6 @@ "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, "requires": { "is-number": "^7.0.0" } @@ -7738,7 +7882,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -8041,6 +8184,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -8298,6 +8442,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, "requires": { "pump": "^3.0.0" } @@ -8550,6 +8695,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, "requires": { "array-union": "^1.0.1", "glob": "^7.0.3", @@ -8561,7 +8707,8 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true } } }, @@ -8575,21 +8722,40 @@ } }, "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "version": "10.5.5", + "resolved": "https://registry.npmjs.org/got/-/got-10.5.5.tgz", + "integrity": "sha512-B13HHkCkTA7KxyxTrFoZfrurBX1fZxjMTKpmIfoVzh0Xfs9aZV7xEfI6EKuERQOIPbomh5LE4xDkfK6o2VXksw==", "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", + "@sindresorhus/is": "^1.0.0", + "@szmarczak/http-timer": "^4.0.0", + "@types/cacheable-request": "^6.0.1", + "cacheable-lookup": "^2.0.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" + "get-stream": "^5.0.0", + "lowercase-keys": "^2.0.0", + "mimic-response": "^2.0.0", + "p-cancelable": "^2.0.0", + "p-event": "^4.0.0", + "responselike": "^2.0.0", + "to-readable-stream": "^2.0.0", + "type-fest": "^0.9.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "type-fest": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.9.0.tgz", + "integrity": "sha512-j55pzONIdg7rdtJTRZPKIbV0FosUqYdhHK1aAYJIrUvejv1VVyBokrILE8KQDT4emW/1Ev9tx+yZG+AxuSBMmA==" + } } }, "graceful-fs": { @@ -8597,6 +8763,11 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -8786,9 +8957,9 @@ "dev": true }, "highlight.js": { - "version": "9.18.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.3.tgz", - "integrity": "sha512-zBZAmhSupHIl5sITeMqIJnYCDfAEc3Gdkqj65wC1lpI468MMQeeQkhcIAvk+RylAkxrCcI9xy9piHiXeQ1BdzQ==" + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.3.2.tgz", + "integrity": "sha512-3jRT7OUYsVsKvukNKZCtnvRcFyCJqSEIuIMsEybAXRiFSwpt65qjPd/Pr+UOdYt7WJlt+lj3+ypUsHiySBp/Jw==" }, "hmac-drbg": { "version": "1.0.1", @@ -9094,8 +9265,7 @@ "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" }, "ignore-walk": { "version": "3.0.3", @@ -9165,8 +9335,7 @@ "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "indexes-of": { "version": "1.0.1", @@ -9557,8 +9726,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.1.0", @@ -9569,13 +9737,13 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -9633,6 +9801,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, "requires": { "is-path-inside": "^2.1.0" } @@ -9641,6 +9810,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, "requires": { "path-is-inside": "^1.0.2" } @@ -10037,9 +10207,9 @@ "dev": true }, "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "json-parse-better-errors": { "version": "1.0.2", @@ -10081,6 +10251,15 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "json-to-ast": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", + "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", + "requires": { + "code-error-fragment": "0.0.230", + "grapheme-splitter": "^1.0.4" + } + }, "json3": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", @@ -10115,6 +10294,11 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, + "jsonpointer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.1.0.tgz", + "integrity": "sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg==" + }, "jsonschema": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.5.tgz", @@ -10382,11 +10566,11 @@ } }, "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", + "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", "requires": { - "json-buffer": "3.0.0" + "json-buffer": "3.0.1" } }, "killable": { @@ -10455,8 +10639,7 @@ "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "levenary": { "version": "1.1.1", @@ -10807,9 +10990,9 @@ } }, "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, "lru-cache": { "version": "5.1.1", @@ -10831,8 +11014,7 @@ "lunr": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" }, "macos-release": { "version": "2.4.1", @@ -10965,9 +11147,9 @@ } }, "marked": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz", - "integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.4.tgz", + "integrity": "sha512-6x5TFGCTKSQBLTZtOburGxCxFEBJEGYVLwCMTBCxzvyuisGcC20UNzDSJhCr/cJ/Kmh6ulfJm10g6WWEAJ3kvg==" }, "md5.js": { "version": "1.3.5", @@ -11110,8 +11292,7 @@ "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "methods": { "version": "1.1.2", @@ -11182,9 +11363,9 @@ "dev": true }, "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" }, "min-indent": { "version": "1.0.1", @@ -11405,6 +11586,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "dev": true, "requires": { "basic-auth": "~2.0.0", "debug": "2.6.9", @@ -11461,9 +11643,9 @@ } }, "mustache": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.1.tgz", - "integrity": "sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.0.0.tgz", + "integrity": "sha512-FJgjyX/IVkbXBXYUwH+OYwQKqWpFPLaLVESd70yHjSDunwzV2hZOoTBvPf4KLoxesUzzyfTH6F784Uqd7Wm5yA==" }, "mute-stream": { "version": "0.0.8", @@ -11633,11 +11815,6 @@ "integrity": "sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg==", "dev": true }, - "nodemailer": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.2.1.tgz", - "integrity": "sha512-TagB7iuIi9uyNgHExo8lUDq3VK5/B0BpbkcjIgNvxbtVrjNqq0DwAOTuzALPVkK76kMhTSzIgHqg8X1uklVs6g==" - }, "nopt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", @@ -11835,7 +12012,8 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "object-component": { "version": "0.0.3", @@ -12237,15 +12415,22 @@ } }, "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==" + }, + "p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "requires": { + "p-timeout": "^3.1.0" + } }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "2.3.0", @@ -12268,7 +12453,8 @@ "p-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true }, "p-retry": { "version": "3.0.1", @@ -12279,6 +12465,14 @@ "retry": "^0.12.0" } }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -12554,7 +12748,8 @@ "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, "path-key": { "version": "2.0.1", @@ -12574,8 +12769,7 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pathval": { "version": "1.1.0", @@ -12648,23 +12842,25 @@ "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, "requires": { "pinkie": "^2.0.0" } @@ -13392,11 +13588,6 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, "prismjs": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.22.0.tgz", @@ -14340,11 +14531,11 @@ "dev": true }, "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", "requires": { - "lowercase-keys": "^1.0.0" + "lowercase-keys": "^2.0.0" } }, "restore-cursor": { @@ -14381,8 +14572,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "revalidator": { "version": "0.1.8", @@ -14412,6 +14602,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "requires": { "glob": "^7.1.3" } @@ -14453,8 +14644,7 @@ "run-parallel": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==" }, "run-queue": { "version": "1.0.3", @@ -14923,8 +15113,7 @@ "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "smart-buffer": { "version": "4.1.0", @@ -15680,6 +15869,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -15723,6 +15913,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -16418,9 +16609,9 @@ } }, "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", + "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==" }, "to-regex": { "version": "3.0.2", @@ -16487,25 +16678,26 @@ "dev": true }, "ts-json-schema-generator": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-0.42.0.tgz", - "integrity": "sha512-UAfnxm4u10t3HC81DUPFgyIiXpa5XHotNlUEPqbhdoiW+MU+MYNtPCgeU/VK/F+mBmw6uPow+5VCEUNZYwMupQ==", + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-0.60.0.tgz", + "integrity": "sha512-hXSlkb2kID3WJq9CHrnIxlLdIiGuRvrajJT8mQEaHI8xWNk5Sy+wRXvWlHRUn64RpUR9dyydI4d33aKb/CXssw==", "requires": { - "commander": "~2.20.0", - "glob": "~7.1.4", + "@types/json-schema": "^7.0.4", + "commander": "~4.1.1", + "glob": "~7.1.6", "json-stable-stringify": "^1.0.1", - "typescript": "~3.4.5" + "typescript": "~3.7.5" }, "dependencies": { "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" }, "typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==" + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", + "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==" } } }, @@ -16775,46 +16967,68 @@ "dev": true }, "typedoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.14.2.tgz", - "integrity": "sha512-aEbgJXV8/KqaVhcedT7xG6d2r+mOvB5ep3eIz1KuB5sc4fDYXcepEEMdU7XSqLFO5hVPu0nllHi1QxX2h/QlpQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.18.0.tgz", + "integrity": "sha512-UgDQwapCGQCCdYhEQzQ+kGutmcedklilgUGf62Vw6RdI29u6FcfAXFQfRTiJEbf16aK3YnkB20ctQK1JusCRbA==", "requires": { - "@types/fs-extra": "^5.0.3", - "@types/handlebars": "^4.0.38", - "@types/highlight.js": "^9.12.3", - "@types/lodash": "^4.14.110", - "@types/marked": "^0.4.0", - "@types/minimatch": "3.0.3", - "@types/shelljs": "^0.8.0", - "fs-extra": "^7.0.0", - "handlebars": "^4.0.6", - "highlight.js": "^9.13.1", - "lodash": "^4.17.10", - "marked": "^0.4.0", + "fs-extra": "^9.0.1", + "handlebars": "^4.7.6", + "highlight.js": "^10.0.0", + "lodash": "^4.17.15", + "lunr": "^2.3.8", + "marked": "^1.1.1", "minimatch": "^3.0.0", - "progress": "^2.0.0", - "shelljs": "^0.8.2", - "typedoc-default-themes": "^0.5.0", - "typescript": "3.2.x" + "progress": "^2.0.3", + "shelljs": "^0.8.4", + "typedoc-default-themes": "^0.10.2" }, "dependencies": { - "typescript": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", - "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==" + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + } + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" } } }, "typedoc-default-themes": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.5.0.tgz", - "integrity": "sha1-bcJDPnjti+qOiHo6zeLzF4W9Yic=" + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.10.2.tgz", + "integrity": "sha512-zo09yRj+xwLFE3hyhJeVHWRSPuKEIAsFK5r2u47KL/HBKqpwdUSanoaz5L34IKiSATFrjG5ywmIu98hPVMfxZg==", + "requires": { + "lunr": "^2.3.8" + } }, "typescript": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", - "dev": true + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" }, "uglify-js": { "version": "3.11.4", @@ -17110,14 +17324,6 @@ "integrity": "sha1-+4CQGIPzOLPL7TU49fqiatr38uc=", "dev": true }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", diff --git a/package.json b/package.json index 73d42b01..e7b9b433 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@ionic/storage": "2.2.0", "@ngx-translate/core": "11.0.1", "@ngx-translate/http-loader": "4.0.0", - "@openstapps/api": "0.22.0", + "@openstapps/api": "0.25.0", "@openstapps/configuration": "0.25.0", "@openstapps/core": "0.36.0", "cordova-android": "8.0.0", diff --git a/src/app/_helpers/data/resources/test-resources.ts b/src/app/_helpers/data/resources/test-resources.ts index 66b1e8a7..9c333728 100644 --- a/src/app/_helpers/data/resources/test-resources.ts +++ b/src/app/_helpers/data/resources/test-resources.ts @@ -13,6 +13,9 @@ * this program. If not, see . */ /* tslint:disable */ + +import moment from 'moment' + export const sampleResources = [{ 'errorNames': [], "instance": { @@ -981,8 +984,8 @@ export const sampleResources = [{ 'offers': [ { 'availability': 'in stock', - 'availabilityStarts': '2017-01-30T00:00:00.000Z', - 'availabilityEnds': '2017-01-30T23:59:59.999Z', + 'availabilityStarts': moment().startOf('day').add(2,'days').toISOString(), + 'availabilityEnds': moment().endOf('day').add(2,'days').toISOString(), 'prices': { 'default': 6.5, 'student': 5, @@ -1101,8 +1104,8 @@ export const sampleResources = [{ 'offers': [ { 'availability': 'in stock', - 'availabilityStarts': '2017-01-30T00:00:00.000Z', - 'availabilityEnds': '2017-01-30T23:59:59.999Z', + 'availabilityStarts': moment().startOf('day').toISOString(), + 'availabilityEnds': moment().endOf('day').add(2,'days').toISOString(), 'prices': { 'default': 4.85, 'student': 2.85, @@ -1117,7 +1120,7 @@ export const sampleResources = [{ 'type': 'remote' }, 'type': 'organization', - 'uid': '3b9b3df6-3a7a-58cc-922f-c7335c002634' + 'uid': 'b7206fb5-bd77-5572-928f-16aa70910f64' }, 'inPlace': { 'geo': { @@ -1138,7 +1141,7 @@ export const sampleResources = [{ 'alternateNames': [ 'MensaHardenberg' ], - 'uid': '72fbc8a3-ebd1-58f9-9526-ad65cba2e402', + 'uid': 'b7206fb5-bd77-5572-928f-16aa70910f64', 'address': { 'addressCountry': 'Germany', 'addressLocality': 'Berlin', @@ -1191,8 +1194,8 @@ export const sampleResources = [{ 'uid': '3b9b3df6-3a7a-58cc-922f-c7335c002634' }, 'availability': 'in stock', - 'availabilityStarts': '2017-01-30T00:00:00.000Z', - 'availabilityEnds': '2017-01-30T23:59:59.999Z', + 'availabilityStarts': moment().startOf('day').add(2,'days').toISOString(), + 'availabilityEnds': moment().endOf('day').add(2,'days').toISOString(), 'inPlace': { 'geo': { 'point': { @@ -1264,8 +1267,8 @@ export const sampleResources = [{ ], 'offers': [ { - 'availabilityEnds': '2017-03-27T23:59:59.000Z', - 'availabilityStarts': '2017-03-27T00:00:00.000Z', + 'availabilityEnds': moment().endOf('day').toISOString(), + 'availabilityStarts': moment().startOf('day').toISOString(), 'availability': 'in stock', 'inPlace': { 'type': 'room', @@ -1273,7 +1276,7 @@ export const sampleResources = [{ 'categories': [ 'cafe' ], - 'uid': 'e5492c9c-064e-547c-8633-c8fc8955cfcf', + 'uid': 'b7206fb5-bd77-5572-928f-16aa70910f64', 'alternateNames': [ 'Cafeteria LEVEL' ], @@ -1306,7 +1309,7 @@ export const sampleResources = [{ 'type': 'remote' }, 'type': 'organization', - 'uid': '3b9b3df6-3a7a-58cc-922f-c7335c002634' + 'uid': 'b7206fb5-bd77-5572-928f-16aa70910f64' } } ], diff --git a/src/app/_helpers/data/sample-things.ts b/src/app/_helpers/data/sample-things.ts index 26894780..70854b82 100644 --- a/src/app/_helpers/data/sample-things.ts +++ b/src/app/_helpers/data/sample-things.ts @@ -14,10 +14,13 @@ */ import {HttpClient} from '@angular/common/http'; import {Injectable} from '@angular/core'; -import {SCAcademicEvent, SCArticle, SCBook, SCBuilding, SCCatalog, - SCDateSeries, SCDish, SCFavorite, SCMessage, SCPerson, SCRoom, - SCThing, SCThingOriginType, SCThingType, SCToDo, SCToDoPriority} from '@openstapps/core'; +import { + SCAcademicEvent, SCArticle, SCBook, SCBuilding, SCCatalog, + SCDateSeries, SCDish, SCFavorite, SCMessage, SCPerson, SCRoom, SCSearchFilter, + SCThing, SCThingOriginType, SCThingType, SCToDo, SCToDoPriority, +} from '@openstapps/core'; import {Observable, of} from 'rxjs'; +import {checkFilter} from '../fakesearch/filters'; import {sampleResources} from './resources/test-resources'; // tslint:disable:no-magic-numbers @@ -339,7 +342,7 @@ const sampleDateSeries: SCDateSeries[] = [ }, ]; -export const sampleThingsMap: {[key in SCThingType | string]: SCThing[]} = { +export const sampleThingsMap: { [key in SCThingType | string]: SCThing[] } = { 'academic event': sampleAcademicEvents, article: sampleArticles, book: sampleBooks, @@ -364,35 +367,6 @@ export const sampleThingsMap: {[key in SCThingType | string]: SCThing[]} = { tour: [], video: [], }; -// tslint:enable:no-magic-numbers - -/** - * TODO - * - * provides all or certain sample things to be used in tests or backendless development - */ -export function getSampleThings(...uids: string[]): SCThing[] { - const sampleThings: SCThing[] = []; - if (typeof uids !== 'undefined' && uids.length > 0) { - uids.forEach((uid) => { - Object.keys(sampleThingsMap) - .forEach((key) => { - sampleThingsMap[key].forEach((thing) => { - if (thing.uid === uid) { - sampleThings.push(thing); - } - }); - }); - }); - } else { - Object.keys(sampleThingsMap) - .forEach((key) => { - sampleThings.push(...sampleThingsMap[key]); - }); - } - - return sampleThings; -} /** * TODO @@ -407,17 +381,13 @@ export class SampleThings { constructor(http: HttpClient) { this.http = http; } - // getSampleThings(): Observable { - // return this.http.get('http://localhost:8100/assets/json/joined.json'); - // // return of(sampleDishes[0]); - // } /** * TODO */ - // tslint:disable-next-line:prefer-function-over-method + // tslint:disable-next-line:prefer-function-over-method no-any getSampleThing(uid: string): Observable { - // const jsonContent: any[] = await this.http.get('http://localhost:8100/assets/json/joined.json').toPromise(); + // tslint:disable-next-line:no-any const sampleThings: any[] = []; for (const resource of sampleResources) { if (resource.instance.uid as SCThingType === uid) { @@ -433,16 +403,18 @@ export class SampleThings { /** * TODO */ - // tslint:disable-next-line:prefer-function-over-method - getSampleThings(): Observable { - // const jsonContent: any[] = await this.http.get('http://localhost:8100/assets/json/joined.json').toPromise(); + // tslint:disable-next-line:prefer-function-over-method no-any + getSampleThings(filter?: SCSearchFilter): Observable { + // tslint:disable-next-line:no-any const sampleThings: any[] = []; - sampleResources.forEach((resource) => { + for (const resource of sampleResources) { // tslint:disable-next-line:max-line-length // if ([SCThingType.Video].includes(resource.instance.type as SCThingType)) { + if (typeof filter === 'undefined' || checkFilter(resource.instance as SCThing, filter)) { sampleThings.push(resource.instance); + } // } - }); + } return of(sampleThings); } diff --git a/src/app/_helpers/fake-backend.interceptor.ts b/src/app/_helpers/fake-backend.interceptor.ts index 9b4a4727..47ec9beb 100644 --- a/src/app/_helpers/fake-backend.interceptor.ts +++ b/src/app/_helpers/fake-backend.interceptor.ts @@ -382,13 +382,13 @@ 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() + return this.sampleFetcher.getSampleThings(request.body.filter) // tslint:disable-next-line:no-any .pipe(map((sampleData: any) => { return new HttpResponse({status: 200, body: {data: sampleData, facets: facetsMock}}); diff --git a/src/app/_helpers/fakesearch/filters.ts b/src/app/_helpers/fakesearch/filters.ts new file mode 100644 index 00000000..ef7fce99 --- /dev/null +++ b/src/app/_helpers/fakesearch/filters.ts @@ -0,0 +1,170 @@ +/* + * 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 {SCSearchBooleanFilter, SCSearchFilter, SCSearchValueFilter, SCThing} from '@openstapps/core'; +import {logger} from '../ts-logger'; + +/** + * Checks if any filter applies to an SCThing + */ +export function checkFilter(thing: SCThing, filter: SCSearchFilter): boolean { + switch (filter.type) { + case 'availability': /*TODO*/ + break; + case 'boolean': + return applyBooleanFilter(thing, filter); + case 'distance': /*TODO*/ + break; + case 'value': + return applyValueFilter(thing, filter); + } + + void logger.error(`Not implemented filter method "${filter.type}" in fake backend!`); + + return false; +} + +/** + * Checks if a value filter applies to an SCThing + */ +function applyValueFilter(thing: SCThing, filter: SCSearchValueFilter): boolean { + const path = filter.arguments.field.split('.'); + const thingFieldValue = traverseToFieldPath(thing, path, filter.arguments.value); + + if (!(thingFieldValue.found)) { + return false; + } + + return thingFieldValue.result; +} + +/** + * Object that can be accessed using foo[bar] + */ +interface IndexableObject { + // tslint:disable-next-line:no-any + [key: string]: any; +} + +/** + * Result of a search for a field and comparison to a desired value + */ +type FieldSearchResult = { + /** + * Weather the field was found + */ + found: true; + + /** + * The result of the comparison + */ + result: boolean; +} | { + /** + * Weather the field was found + */ + found: false; +}; + +// tslint:disable-next-line:completed-docs +function traverseToFieldPath(value: IndexableObject, path: string[], desiredFieldValue: unknown): FieldSearchResult { + if (path.length === 0) { + void logger.error(`Value filter provided with zero length path`); + + return {found: false}; + } + + if (value.hasOwnProperty(path[0])) { + const nestedProperty = value[path[0]]; + + if (path.length === 1) { + return esStyleFieldHandler(nestedProperty, (nestedValue) => { + return { + found: true, + result: nestedValue === desiredFieldValue, + }; + }); + } + + return esStyleFieldHandler(nestedProperty, (nestedValue) => { + if (typeof nestedValue === 'object') { + return traverseToFieldPath( + nestedValue as IndexableObject, + // tslint:disable-next-line:no-magic-numbers + path.slice(1), + desiredFieldValue); + } + + return {found: false}; + }); + } + + return {found: false}; +} + +/** + * ES treats arrays like normal fields + */ +function esStyleFieldHandler(field: T | T[], + handler: (value: T) => FieldSearchResult): FieldSearchResult { + if (Array.isArray(field)) { + for (const nestedField of field) { + const result = handler(nestedField); + + if (result.found && result.result) { + return result; + } + } + + // TODO: found is not accurate + return {found: false}; + } + + return handler(field); +} + +/** + * Checks if a boolean filter applies to an SCThing + */ +function applyBooleanFilter(thing: SCThing, filter: SCSearchBooleanFilter): boolean { + let out = false; + + switch (filter.arguments.operation) { + case 'and': + out = true; + for (const nesterFilter of filter.arguments.filters) { + out = out && checkFilter(thing, nesterFilter); + } + + return out; + case 'or': + for (const nesterFilter of filter.arguments.filters) { + out = out || checkFilter(thing, nesterFilter); + } + + return out; + case 'not': + if (filter.arguments.filters.length === 1) { + return !checkFilter(thing, filter.arguments.filters[0]); + } + void logger.error(`Too many filters for "not" boolean operation`); + + return false; + } + + void logger.error(`Not implemented boolean filter "${filter.arguments.operation}"`); + + return false; +} diff --git a/src/app/_helpers/ts-logger.ts b/src/app/_helpers/ts-logger.ts new file mode 100644 index 00000000..7dce02c7 --- /dev/null +++ b/src/app/_helpers/ts-logger.ts @@ -0,0 +1,19 @@ +/* + * 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 {NGXLogger} from 'ngx-logger'; + +export let logger: NGXLogger; + +export const initLogger = (newLogger: NGXLogger) => logger = newLogger; diff --git a/src/app/app.component.ts b/src/app/app.component.ts index f15e212d..834c6b68 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -21,6 +21,7 @@ import {NGXLogger} from 'ngx-logger'; import {ConfigProvider} from './modules/config/config.provider'; import {SettingsProvider} from './modules/settings/settings.provider'; +import {initLogger} from './_helpers/ts-logger'; /** * TODO */ @@ -60,6 +61,7 @@ export class AppComponent { private readonly settingsProvider: SettingsProvider, private readonly configProvider: ConfigProvider, private readonly logger: NGXLogger) { + initLogger(logger); this.initializeApp(); // this language will be used as a fallback when a translation isn't found in the current language diff --git a/src/app/modules/data/data-routing.module.ts b/src/app/modules/data/data-routing.module.ts index 674a1af8..ee06eac1 100644 --- a/src/app/modules/data/data-routing.module.ts +++ b/src/app/modules/data/data-routing.module.ts @@ -16,10 +16,12 @@ import {NgModule} from '@angular/core'; import {RouterModule, Routes} from '@angular/router'; import {DataDetailComponent} from './detail/data-detail.component'; import {DataListComponent} from './list/data-list.component'; +import {FoodDataListComponent} from './list/food-data-list.component'; const dataRoutes: Routes = [ {path: 'search', component: DataListComponent}, {path: 'data-detail/:uid', component: DataDetailComponent}, + {path: 'canteen', component: FoodDataListComponent}, ]; /** diff --git a/src/app/modules/data/data.module.ts b/src/app/modules/data/data.module.ts index 12b86faf..d25a8384 100644 --- a/src/app/modules/data/data.module.ts +++ b/src/app/modules/data/data.module.ts @@ -35,9 +35,11 @@ import {OriginDetailComponent} from './elements/origin-detail.component'; import {OriginInListComponent} from './elements/origin-in-list.component'; import {SimpleCardComponent} from './elements/simple-card.component'; import {SkeletonListItem} from './elements/skeleton-list-item.component'; +import {SkeletonSegment} from './elements/skeleton-segment-button.component'; import {SkeletonSimpleCard} from './elements/skeleton-simple-card.component'; import {DataListItem} from './list/data-list-item.component'; import {DataListComponent} from './list/data-list.component'; +import {FoodDataListComponent} from './list/food-data-list.component'; import {StAppsWebHttpClient} from './stapps-web-http-client.provider'; import {ArticleDetailContentComponent} from './types/article/article-detail-content.component'; import {ArticleListItem} from './types/article/article-list-item.component'; @@ -59,6 +61,7 @@ import {PersonDetailContentComponent} from './types/person/person-detail-content import {PersonListItem} from './types/person/person-list-item.component'; import {PlaceDetailContentComponent} from './types/place/place-detail-content.component'; import {PlaceListItem} from './types/place/place-list-item.component'; +import {PlaceMensaDetailComponent} from './types/place/special/mensa/place-mensa-detail.component'; import {SemesterDetailContentComponent} from './types/semester/semester-detail-content.component'; import {SemesterListItem} from './types/semester/semester-list-item.component'; import {VideoDetailContentComponent} from './types/video/video-detail-content.component'; @@ -80,6 +83,7 @@ import {VideoListItem} from './types/video/video-list-item.component'; CatalogListItem, DataDetailComponent, DataDetailContentComponent, + FoodDataListComponent, DataListComponent, DataListItem, DateSeriesDetailContentComponent, @@ -101,9 +105,11 @@ import {VideoListItem} from './types/video/video-list-item.component'; PersonListItem, PlaceDetailContentComponent, PlaceListItem, + PlaceMensaDetailComponent, SemesterDetailContentComponent, SemesterListItem, SkeletonListItem, + SkeletonSegment, VideoDetailContentComponent, VideoListItem, ], diff --git a/src/app/modules/data/data.provider.ts b/src/app/modules/data/data.provider.ts index de7ca641..f670cc92 100644 --- a/src/app/modules/data/data.provider.ts +++ b/src/app/modules/data/data.provider.ts @@ -16,9 +16,9 @@ import {Injectable} from '@angular/core'; import {Client} from '@openstapps/api/lib/client'; import {SCSearchQuery, SCSearchResponse, SCThingOriginType, SCThings, SCThingType} from '@openstapps/core'; import {SCSaveableThing} from '@openstapps/core'; +import {environment} from '../../../environments/environment'; import {StorageProvider} from '../storage/storage.provider'; import {StAppsWebHttpClient} from './stapps-web-http-client.provider'; -import {environment} from './../../../environments/environment'; export enum DataScope { Local = 'local', diff --git a/src/app/modules/data/detail/data-detail-content.component.ts b/src/app/modules/data/detail/data-detail-content.component.ts index 6dc7d06f..96e1c864 100644 --- a/src/app/modules/data/detail/data-detail-content.component.ts +++ b/src/app/modules/data/detail/data-detail-content.component.ts @@ -27,4 +27,5 @@ export class DataDetailContentComponent { * TODO */ @Input() item: SCThings; + } diff --git a/src/app/modules/data/elements/skeleton-segment-button.component.ts b/src/app/modules/data/elements/skeleton-segment-button.component.ts new file mode 100644 index 00000000..dae4a0df --- /dev/null +++ b/src/app/modules/data/elements/skeleton-segment-button.component.ts @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2019 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'; + +/** + * TODO + */ +@Component({ + selector: 'stapps-skeleton-segment-button', + templateUrl: 'skeleton-segment-button.html', +}) +export class SkeletonSegment { +} diff --git a/src/app/modules/data/elements/skeleton-segment-button.html b/src/app/modules/data/elements/skeleton-segment-button.html new file mode 100644 index 00000000..ad9cad92 --- /dev/null +++ b/src/app/modules/data/elements/skeleton-segment-button.html @@ -0,0 +1,4 @@ + + + + diff --git a/src/app/modules/data/list/data-list.component.ts b/src/app/modules/data/list/data-list.component.ts index 7d18da68..3da20aad 100644 --- a/src/app/modules/data/list/data-list.component.ts +++ b/src/app/modules/data/list/data-list.component.ts @@ -22,9 +22,9 @@ import { SCThing, } from '@openstapps/core'; import {NGXLogger} from 'ngx-logger'; -import {Subject} from 'rxjs'; +import {Subject, Subscription} from 'rxjs'; import {debounceTime, distinctUntilChanged} from 'rxjs/operators'; -import {MenuService} from '../../menu/menu.service'; +import {ContextMenuService} from '../../menu/context/context-menu.service'; import {SettingsProvider} from '../../settings/settings.provider'; import {DataProvider} from '../data.provider'; @@ -34,6 +34,7 @@ import {DataProvider} from '../data.provider'; @Component({ selector: 'stapps-data-list', templateUrl: 'data-list.html', + providers: [ContextMenuService], }) export class DataListComponent implements OnInit { @@ -50,7 +51,7 @@ export class DataListComponent implements OnInit { /** * Container for queried things */ - items: SCThing[]; + items: Promise; /** * Page size of queries @@ -77,22 +78,27 @@ export class DataListComponent implements OnInit { */ sortQuery: SCSearchSort | undefined; + /** + * Array of all subscriptions to Observables + */ + subscriptions: Subscription[] = []; + /** * * @param alertController AlertController * @param dataProvider DataProvider - * @param menuService MenuService + * @param contextMenuService ContextMenuService * @param settingsProvider SettingsProvider * @param logger An angular logger */ constructor( - private readonly alertController: AlertController, - private readonly dataProvider: DataProvider, - private readonly menuService: MenuService, - private readonly settingsProvider: SettingsProvider, - private readonly logger: NGXLogger, + protected readonly alertController: AlertController, + protected dataProvider: DataProvider, + protected readonly contextMenuService: ContextMenuService, + protected readonly settingsProvider: SettingsProvider, + protected readonly logger: NGXLogger, ) { - this.queryTextChanged + this.subscriptions.push(this.queryTextChanged .pipe( debounceTime(this.searchQueryDueTime), distinctUntilChanged()) @@ -100,30 +106,32 @@ export class DataListComponent implements OnInit { this.from = 0; this.queryText = model; this.fetchAndUpdateItems(); - }); + })); - this.menuService.filterQueryChanged$.subscribe((query) => { + this.subscriptions.push(this.contextMenuService.filterQueryChanged$.subscribe((query) => { this.filterQuery = query; + this.from = 0; this.fetchAndUpdateItems(); - }); - this.menuService.sortQueryChanged$.subscribe((query) => { + })); + this.subscriptions.push(this.contextMenuService.sortQueryChanged$.subscribe((query) => { this.sortQuery = query; + this.from = 0; this.fetchAndUpdateItems(); - }); + })); this.fetchAndUpdateItems(); /** * Subscribe to 'settings.changed' events */ - this.settingsProvider.settingsActionChanged$.subscribe(({type, payload}) => { + this.subscriptions.push(this.settingsProvider.settingsActionChanged$.subscribe(({type, payload}) => { if (type === 'stapps.settings.changed') { const {category, name, value} = payload!; this.logger.log(`received event "settings.changed" with category: ${category}, name: ${name}, value: ${JSON.stringify(value)}`); } }, - ); + )); } /** @@ -131,7 +139,7 @@ export class DataListComponent implements OnInit { * * @param append If true fetched data gets appended to existing, override otherwise (default false) */ - private async fetchAndUpdateItems(append = false): Promise { + protected async fetchAndUpdateItems(append = false): Promise { // build query search options const searchOptions: SCSearchQuery = { from: this.from, @@ -154,17 +162,17 @@ export class DataListComponent implements OnInit { } return this.dataProvider.search(searchOptions) - .then((result) => { + .then(async (result) => { if (append) { + let items = await this.items; // append results - this.items = this.items.concat(result.data); + items = items.concat(result.data); + this.items = (async () => items)(); } else { // override items with results - this.items = result.data; - } - // update filter options if result contains facets - if (typeof result.facets !== 'undefined') { - this.updateContextFilter(result.facets); + this.items = (async () => { + this.updateContextFilter(result.facets); + return result.data} )(); } }, async (err) => { const alert: HTMLIonAlertElement = await this.alertController.create({ @@ -188,11 +196,10 @@ export class DataListComponent implements OnInit { } /** - * Initialises the sort context of menuService + * Initialises the possible sort options in ContextMenuService */ ngOnInit(): void { - // initialise sort option for context menu - this.menuService.setContextSort({ + this.contextMenuService.setContextSort({ name: 'sort', reversed: false, value: 'relevance', @@ -213,6 +220,15 @@ export class DataListComponent implements OnInit { }); } + /** + * Unsubscribe from Observables + */ + ngOnDestroy() { + for (let sub of this.subscriptions) { + sub.unsubscribe(); + } + } + /** * Search event of search bar */ @@ -221,9 +237,9 @@ export class DataListComponent implements OnInit { } /** - * Updates context filter in menuService with facets + * Updates the possible filter options in ContextMenuService with facets */ updateContextFilter(facets: SCFacet[]) { - this.menuService.updateContextFilter(facets); + this.contextMenuService.updateContextFilter(facets); } } diff --git a/src/app/modules/data/list/data-list.html b/src/app/modules/data/list/data-list.html index 70721fc6..a91fe533 100644 --- a/src/app/modules/data/list/data-list.html +++ b/src/app/modules/data/list/data-list.html @@ -6,7 +6,7 @@ - + @@ -17,13 +17,15 @@ - - - - - + +
+ + + +
+ -
+ diff --git a/src/app/modules/data/list/food-data-list.component.ts b/src/app/modules/data/list/food-data-list.component.ts new file mode 100644 index 00000000..a2ce60e9 --- /dev/null +++ b/src/app/modules/data/list/food-data-list.component.ts @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2018-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 { + SCSearchQuery, SCThing, +} from '@openstapps/core'; +import {DataListComponent} from './data-list.component'; + +/** + * TODO + */ +@Component({ + selector: 'stapps-data-list', + templateUrl: 'data-list.html', +}) +export class FoodDataListComponent extends DataListComponent { + /** + * Fetches items with set query configuration + * + * @param append If true fetched data gets appended to existing, override otherwise (default false) + */ + protected async fetchAndUpdateItems(append = false): Promise { + try { + // build query search options + const searchOptions: SCSearchQuery = { + from: this.from, + size: this.pageSize, + }; + + if (this.queryText && this.queryText.length > 0) { + // add query string + searchOptions.query = this.queryText; + } + + if (this.sortQuery) { + // add query sorting + searchOptions.sort = [this.sortQuery]; + } + + searchOptions.filter = { + arguments: { + filters: [ + { + arguments: { + field: 'categories', + value: 'canteen', + }, + type: 'value', + }, + { + arguments: { + field: 'categories', + value: 'student canteen', + }, + type: 'value', + }, + { + arguments: { + field: 'categories', + value: 'cafe', + }, + type: 'value', + }, + { + arguments: { + field: 'categories', + value: 'restaurant', + }, + type: 'value', + }, + ], + operation: 'or', + }, + type: 'boolean', + }; + + if (this.filterQuery !== undefined) { + searchOptions.filter = { + arguments: { + filters: [ + searchOptions.filter, + this.filterQuery, + ], + operation: 'and', + }, + type: 'boolean', + }; + } + + const result = await this.dataProvider.search(searchOptions); + + this.items = (async () => { + this.updateContextFilter(result.facets); + let items: SCThing[]; + if(append) { + items = (await this.items).concat(result.data); + } else { + items = result.data; + } + + return items; + })(); + } catch (err) { + const alert: HTMLIonAlertElement = await this.alertController.create({ + buttons: ['Dismiss'], + header: 'Error', + subHeader: err.message, + }); + + await alert.present(); + } + } + +} diff --git a/src/app/modules/data/types/place/place-detail-content.component.ts b/src/app/modules/data/types/place/place-detail-content.component.ts index f265f5c7..85ca75c6 100644 --- a/src/app/modules/data/types/place/place-detail-content.component.ts +++ b/src/app/modules/data/types/place/place-detail-content.component.ts @@ -14,12 +14,14 @@ */ import {Component, Input} from '@angular/core'; import {SCBuilding, SCFloor, SCPointOfInterest, SCRoom, SCThing, SCTranslations} from '@openstapps/core'; -import {SCThingTranslator} from '@openstapps/core'; +import {SCThings, SCThingTranslator} from '@openstapps/core'; +import {DataProvider} from '../../data.provider'; /** * TODO */ @Component({ + providers: [ DataProvider ], selector: 'stapps-place-detail-content', templateUrl: 'place-detail-content.html', }) @@ -47,4 +49,26 @@ export class PlaceDetailContentComponent { constructor() { this.translator = new SCThingTranslator(this.language); } + + /** + * TODO + * + * @param item TODO + */ + // tslint:disable-next-line:completed-docs prefer-function-over-method + hasCategories(item: SCThings): item is SCThings & { categories: string[]; } { + // tslint:disable-next-line:completed-docs + return typeof (item as { categories: string[]; }).categories !== 'undefined'; + } + + /** + * Helper function as 'typeof' is not accessible in HTML + * + * @param item TODO + */ + isMensaThing(item: SCThings): boolean { + return this.hasCategories(item) && + ((item.categories as string[]).includes('canteen') || (item.categories as string[]).includes('cafe') + || (item.categories as string[]).includes('student canteen') || (item.categories as string[]).includes('restaurant')); + } } diff --git a/src/app/modules/data/types/place/place-detail-content.html b/src/app/modules/data/types/place/place-detail-content.html index 41aeec54..57244af8 100644 --- a/src/app/modules/data/types/place/place-detail-content.html +++ b/src/app/modules/data/types/place/place-detail-content.html @@ -1,3 +1,4 @@ + diff --git a/src/app/modules/data/types/place/special/mensa/place-mensa-detail.component.ts b/src/app/modules/data/types/place/special/mensa/place-mensa-detail.component.ts new file mode 100644 index 00000000..c4efb7ac --- /dev/null +++ b/src/app/modules/data/types/place/special/mensa/place-mensa-detail.component.ts @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2019 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 moment, {Moment} from 'moment'; + +import {AfterViewInit, ChangeDetectorRef, Component, Input} from '@angular/core'; +import {SCDish, SCPlace, SCThing, SCThingTranslator, SCTranslations} from '@openstapps/core'; +import {PlaceMensaService} from './place-mensa-service'; + +/** + * TODO + */ +@Component({ + providers: [PlaceMensaService], + selector: 'stapps-place-mensa-detail-content', + templateUrl: 'place-mensa.html', +}) +export class PlaceMensaDetailComponent implements AfterViewInit { + + /** + * TODO + */ + dishes: Promise> | null = null; + + /** + * number of days to display mensa menus for + */ + displayRange = 5; + + /** + * TODO + */ + @Input() item: SCPlace; + + /** + * TODO + */ + @Input() language: keyof SCTranslations; + + /** + * TODO + */ + selectedDay: string; + + /** + * First day to display menu items for + */ + startingDay: Moment; + + /** + * TODO + */ + translator: SCThingTranslator; + + + constructor(private mensaService: PlaceMensaService, private changeDectectorRef: ChangeDetectorRef) { + // TODO: translation + this.translator = new SCThingTranslator(this.language); + this.startingDay = moment(); + this.startingDay.hour(0); + this.startingDay.minute(0); + this.startingDay.millisecond(0); + } + + /** + * TODO + */ + ngAfterViewInit() { + this.dishes = this.mensaService.getAllDishes(this.item) + .then((dishesResult) => { + const out = this.splitDishes(dishesResult, this.item, this.startingDay, this.displayRange); + for (const key in out) { + if (out.hasOwnProperty(key)) { + this.selectedDay = key; + break; + } + } + this.changeDectectorRef.detectChanges(); + + return out; + }); + } + + /** + * Splits a list of dishes with availability start and end into multiple lists by day + */ + // tslint:disable-next-line:prefer-function-over-method + splitDishes(dishes: SCDish[], place: SCPlace, startingDay: Moment, displayRange: number): Record { + const out: Record = {}; + + for (let i = 0; i < displayRange; i++) { + const nextDay: Moment = moment(startingDay) + .add(1, 'days'); + const selectedDishes: SCDish[] = []; + for (const dish of dishes) { + // go through all offers + if (dish.offers === undefined) { continue; } + for (const offer of dish.offers) { + if (offer.inPlace === undefined || offer.inPlace.uid !== place.uid) { continue; } + // get availabilities + const availabilityStarts = offer.availabilityStarts === undefined ? undefined : moment(offer.availabilityStarts); + const availabilityEnds = offer.availabilityEnds === undefined ? undefined : moment(offer.availabilityEnds); + + if ((availabilityStarts === undefined || availabilityStarts.isBefore(nextDay)) + && (availabilityEnds === undefined || availabilityEnds.isAfter(startingDay))) { + selectedDishes.push(dish); + break; + } + } + } + if (selectedDishes.length) { + out[startingDay.format('YYYY-MM-DD')] = selectedDishes; + } + // tslint:disable-next-line:no-parameter-reassignment + startingDay = nextDay; + } + + return out; + } +} diff --git a/src/app/modules/data/types/place/special/mensa/place-mensa-service.ts b/src/app/modules/data/types/place/special/mensa/place-mensa-service.ts new file mode 100644 index 00000000..0d2448b3 --- /dev/null +++ b/src/app/modules/data/types/place/special/mensa/place-mensa-service.ts @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2019 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 {SCDish, SCPlace, SCThingType} from '@openstapps/core'; +import {DataProvider} from '../../../../data.provider'; + +/** + * TODO + */ +@Injectable({ + providedIn: 'root', +}) +export class PlaceMensaService { + constructor(private dataProvider: DataProvider) { } + + /** + * Fetches all dishes for this building + */ + async getAllDishes(place: SCPlace): Promise { + // use filter to get all dishes with the building's uid in one of the offer's inPlace field + // TODO: make sure this actually works with ES + const result = await this.dataProvider.search({ + filter: { + arguments: { + filters: [ + { + arguments: { + field: 'offers.inPlace.uid', + value: place.uid, + }, + type: 'value', + }, + { + arguments: { + field: 'type', + value: SCThingType.Dish, + }, + type: 'value', + }, + ], + operation: 'and', + }, + type: 'boolean', + }, + size: 1000, + }); + + return result.data as SCDish[]; + } +} diff --git a/src/app/modules/data/types/place/special/mensa/place-mensa.html b/src/app/modules/data/types/place/special/mensa/place-mensa.html new file mode 100644 index 00000000..d6dbb57c --- /dev/null +++ b/src/app/modules/data/types/place/special/mensa/place-mensa.html @@ -0,0 +1,24 @@ + +
+ + + {{day.key | amParse:'YYYY-MM-DD' | amDateFormat:'dddd, L'}} + + +
+
+ + + +
+
+
+ + + + + + + + +
diff --git a/src/app/modules/menu/context/context-menu.component.spec.ts b/src/app/modules/menu/context/context-menu.component.spec.ts index a8934a3d..b4a102ff 100644 --- a/src/app/modules/menu/context/context-menu.component.spec.ts +++ b/src/app/modules/menu/context/context-menu.component.spec.ts @@ -21,7 +21,7 @@ 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 {ContextMenuService} from '../context/context-menu.service'; import {FilterContext, SortContext} from './context-type'; describe('ContextMenuComponent', async () => { @@ -36,7 +36,7 @@ describe('ContextMenuComponent', async () => { ChildrenOutletContexts, Location, UrlSerializer, - MenuService, + ContextMenuService, {provide: LocationStrategy, useClass: PathLocationStrategy}, {provide: APP_BASE_HREF, useValue: '/'}, ], diff --git a/src/app/modules/menu/context/context-menu.component.ts b/src/app/modules/menu/context/context-menu.component.ts index e7c4a147..ac412bfe 100644 --- a/src/app/modules/menu/context/context-menu.component.ts +++ b/src/app/modules/menu/context/context-menu.component.ts @@ -20,8 +20,9 @@ import { SCThingType, SCTranslations, } from '@openstapps/core'; -import {MenuService} from '../menu.service'; +import {ContextMenuService} from './context-menu.service'; import {FilterContext, SortContext, SortContextOption} from './context-type'; +import {Subscription} from 'rxjs'; /** * The context menu @@ -68,30 +69,45 @@ export class ContextMenuComponent { */ translator: SCThingTranslator; + /** + * Array of all Subscriptions + */ + subscriptions: Subscription[] = []; + + constructor(private translateService: TranslateService, - private readonly menuService: MenuService) { + private readonly contextMenuService: ContextMenuService) { this.language = this.translateService.currentLang as keyof SCTranslations; this.translator = new SCThingTranslator(this.language); - this.translateService.onLangChange.subscribe((event: LangChangeEvent) => { + this.subscriptions.push(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.subscriptions.push(this.contextMenuService.filterContextChanged$.subscribe((filterContext) => { this.filterOption = filterContext; - }); + })); - this.menuService.sortOptions.subscribe((sortContext) => { + this.subscriptions.push(this.contextMenuService.sortOptions.subscribe((sortContext) => { this.sortOption = sortContext; - }); + })); + } + + /** + * Unsubscribe from Observables + */ + ngOnDestroy() { + for (let sub of this.subscriptions) { + sub.unsubscribe(); + } } /** * Sets selected filter options and updates listener */ filterChanged = () => { - this.menuService.contextFilterChanged(this.filterOption); + this.contextMenuService.contextFilterChanged(this.filterOption); } /** @@ -117,7 +133,7 @@ export class ContextMenuComponent { option.options.forEach((filterFacet) => filterFacet.buckets.forEach((filterBucket) => { filterBucket.checked = false; })); - this.menuService.contextFilterChanged(this.filterOption); + this.contextMenuService.contextFilterChanged(this.filterOption); } /** @@ -134,6 +150,6 @@ export class ContextMenuComponent { option.reversed = false; } } - this.menuService.contextSortChanged(option); + this.contextMenuService.contextSortChanged(option); } } diff --git a/src/app/modules/menu/menu.service.spec.ts b/src/app/modules/menu/context/context-menu.service.spec.ts similarity index 90% rename from src/app/modules/menu/menu.service.spec.ts rename to src/app/modules/menu/context/context-menu.service.spec.ts index c73aec6d..d8a3c067 100644 --- a/src/app/modules/menu/menu.service.spec.ts +++ b/src/app/modules/menu/context/context-menu.service.spec.ts @@ -1,17 +1,17 @@ import {TestBed} from '@angular/core/testing'; -import {MenuService} from './menu.service'; +import {ContextMenuService} from './context-menu.service'; import {SCFacet} from '@openstapps/core'; -import {FilterContext, SortContext} from './context/context-type'; +import {FilterContext, SortContext} from './context-type'; -describe('MenuService', () => { - let service: MenuService; +describe('ContextMenuService', () => { + let service: ContextMenuService; beforeEach(() => { TestBed.configureTestingModule({ - providers: [MenuService] + providers: [ContextMenuService] }); - service = TestBed.get(MenuService); + service = TestBed.get(ContextMenuService); }); it('should be created', () => { diff --git a/src/app/modules/menu/menu.service.ts b/src/app/modules/menu/context/context-menu.service.ts similarity index 92% rename from src/app/modules/menu/menu.service.ts rename to src/app/modules/menu/context/context-menu.service.ts index 988ae2f5..cb2add3b 100644 --- a/src/app/modules/menu/menu.service.ts +++ b/src/app/modules/menu/context/context-menu.service.ts @@ -15,13 +15,13 @@ 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'; +import {FilterBucket, FilterContext, FilterFacet, SortContext} from './context-type'; /** - * MenuService provides bidirectional communication of context menu options and search queries + * ContextMenuService provides bidirectional communication of context menu options and search queries */ @Injectable() -export class MenuService { +export class ContextMenuService { /** * Local filter context object @@ -82,9 +82,10 @@ export class MenuService { const filters: SCSearchFilter[] = []; filterContext.options.forEach((filterFacet) => { + const optionFilters: SCSearchFilter[] = []; filterFacet.buckets.forEach((filterBucket) => { if (filterBucket.checked) { - filters.push( + optionFilters.push( { arguments: { field: filterFacet.field, @@ -94,13 +95,22 @@ export class MenuService { }); } }); + if (optionFilters.length > 0) { + filters.push({ + arguments: { + filters: optionFilters, + operation: 'or', + }, + type: 'boolean', + }); + } }); if (filters.length > 0) { return { arguments: { filters: filters, - operation: 'or', + operation: 'and', }, type: 'boolean', }; diff --git a/src/app/modules/menu/menu.module.ts b/src/app/modules/menu/menu.module.ts index a8710c37..1d7ebbea 100644 --- a/src/app/modules/menu/menu.module.ts +++ b/src/app/modules/menu/menu.module.ts @@ -20,7 +20,7 @@ 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 {ContextMenuService} from './context/context-menu.service'; import {NavigationComponent} from './navigation/navigation.component'; /** @@ -44,7 +44,7 @@ import {NavigationComponent} from './navigation/navigation.component'; SettingsModule, ], providers: [ - MenuService, + ContextMenuService, ], }) export class MenuModule {}