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 {}