From 95f7521dbddc13a6acb5835ae05dd5535cce067f Mon Sep 17 00:00:00 2001 From: Karl-Philipp Wulfert Date: Wed, 20 Mar 2019 15:46:59 +0100 Subject: [PATCH] feat: use mustache instead of tangular --- .npmignore | 1 + package-lock.json | 671 +++++++-------------------------- package.json | 26 +- reports/2019-03-27.md | 132 +++++++ src/common.ts | 27 +- src/tasks/report.ts | 312 +++++++-------- templates/md/assigneeFooter.md | 2 - templates/md/assigneeHeader.md | 8 - templates/md/header.md | 1 - templates/md/issue.md | 1 - templates/report.md.mustache | 14 + 11 files changed, 450 insertions(+), 745 deletions(-) create mode 100644 reports/2019-03-27.md delete mode 100644 templates/md/assigneeFooter.md delete mode 100644 templates/md/assigneeHeader.md delete mode 100644 templates/md/header.md delete mode 100644 templates/md/issue.md create mode 100644 templates/report.md.mustache diff --git a/.npmignore b/.npmignore index 3c7e2b4b..106bcab7 100644 --- a/.npmignore +++ b/.npmignore @@ -10,3 +10,4 @@ !package-lock.json !README.md !src +!templates diff --git a/package-lock.json b/package-lock.json index 84200135..a8655409 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@openstapps/configuration": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@openstapps/configuration/-/configuration-0.6.0.tgz", - "integrity": "sha512-ArEbUWMwBqrzYzhYKEdQPoYA0M8jxdmCahouukbbrlWz6Ca3h5K1n3C7FG8g17bMYoVkthkJXt4uHMYtsQTY1A==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@openstapps/configuration/-/configuration-0.7.0.tgz", + "integrity": "sha512-oQjT4AE3xyMvzdfrpQ18P95i8bp5Bvwlc8SiBOwid0sjGC8ATdLsveZrwF9NHsIxGh8STodfOi/COvae5DnNWA==", "dev": true, "requires": { "@types/chalk": "2.2.0", @@ -84,33 +84,43 @@ } }, "@slack/client": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@slack/client/-/client-4.9.0.tgz", - "integrity": "sha512-1M23/RXWOen9miake8B6LVdb6VjZby3dQf4u9Prk/k66NuCxgGfAmXgsMhLMq4S9QJp9wBYH/DajI7fZgy1o5g==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@slack/client/-/client-4.12.0.tgz", + "integrity": "sha512-ltbdkcIWk2eIptCCT/oPmeCGlG8xb3kXfwuPTtvNujioLMo2xXqiPdfl7xK+AeUfnvj3fJLYbpTPuBTscuhgzw==", "requires": { "@types/form-data": "^2.2.1", "@types/is-stream": "^1.1.0", - "@types/loglevel": "^1.5.3", "@types/node": ">=6.0.0", - "@types/p-cancelable": "^0.3.0", - "@types/p-queue": "^2.3.1", - "@types/p-retry": "^1.0.1", - "@types/retry": "^0.10.2", + "@types/p-cancelable": "^1.0.0", + "@types/p-queue": "^2.3.2", + "@types/p-retry": "^3.0.0", + "@types/retry": "^0.12.0", "@types/ws": "^5.1.1", "axios": "^0.18.0", - "eventemitter3": "^3.0.0", + "eventemitter3": "^3.1.0", "finity": "^0.5.4", - "form-data": "^2.3.1", + "form-data": "^2.3.3", "is-stream": "^1.1.0", - "loglevel": "^1.6.1", - "object.entries": "^1.0.4", + "object.entries": "^1.1.0", "object.getownpropertydescriptors": "^2.0.3", - "object.values": "^1.0.4", - "p-cancelable": "^0.3.0", - "p-queue": "^2.3.0", - "p-retry": "^2.0.0", + "object.values": "^1.1.0", + "p-cancelable": "~1.0.0", + "p-queue": "^2.4.2", + "p-retry": "^3.0.1", "retry": "^0.12.0", "ws": "^5.2.0" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } } }, "@types/caseless": { @@ -132,14 +142,6 @@ "resolved": "https://registry.npmjs.org/@types/circular-json/-/circular-json-0.4.0.tgz", "integrity": "sha512-7+kYB7x5a7nFWW1YPBh3KxhwKfiaI4PbZ1RvzBU91LZy7lWJO822CI+pqzSre/DZ7KsCuMKdHnLHHFu8AyXbQg==" }, - "@types/del": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/del/-/del-3.0.1.tgz", - "integrity": "sha512-y6qRq6raBuu965clKgx6FHuiPu3oHdtmzMPXi8Uahsjdq1L6DL5fS/aY5/s71YwM7k6K1QIWvem5vNwlnNGIkQ==", - "requires": { - "@types/glob": "*" - } - }, "@types/events": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", @@ -184,15 +186,6 @@ "integrity": "sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ==", "dev": true }, - "@types/inquirer": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-0.0.43.tgz", - "integrity": "sha512-xgyfKZVMFqE8aIKy1xfFVsX2MxyXUNgjgmbF6dRbR3sL+ZM5K4ka/9L4mmTwX8eTeVYtduyXu0gUVwVJa1HbNw==", - "requires": { - "@types/rx": "*", - "@types/through": "*" - } - }, "@types/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz", @@ -207,11 +200,6 @@ "integrity": "sha512-Z3TNyBL8Vd/M9D9Ms2S3LmFq2sSMzahodD6rCS9V2N44HUMINb75jNkSuwAx7eo2ufqTdfOdtGQpNbieUjPQmw==", "dev": true }, - "@types/loglevel": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/loglevel/-/loglevel-1.5.4.tgz", - "integrity": "sha512-8dx4ckP0vndJeN+iKZwdGiapLqFjVQ3JLOt92uqK0C63acs5NcPLbUOpfXCJkKVRjZLBQjw8NIGNBSsnatFnFQ==" - }, "@types/marked": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.2.tgz", @@ -223,10 +211,15 @@ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, + "@types/mustache": { + "version": "0.8.32", + "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-0.8.32.tgz", + "integrity": "sha512-RTVWV485OOf4+nO2+feurk0chzHkSjkjALiejpHltyuMf/13fGymbbNNFrSKdSSUg1TIwzszXdWsVirxgqYiFA==" + }, "@types/node": { - "version": "10.12.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.27.tgz", - "integrity": "sha512-e9wgeY6gaY21on3ve0xAjgBVjGDWq/xUteK0ujsE53bUoxycMkqfnkUgMt6ffZtykZ5X12Mg3T7Pw4TRCObDKg==" + "version": "10.12.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.30.tgz", + "integrity": "sha512-nsqTN6zUcm9xtdJiM9OvOJ5EF0kOI8f1Zuug27O/rgtxCRJHGqncSWfCMZUP852dCKPsDsYXGvBhxfRjDBkF5Q==" }, "@types/nodemailer": { "version": "4.6.5", @@ -238,9 +231,12 @@ } }, "@types/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@types/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-sP+9Ivnpil7cdmvr5O+145aXm65YX8Y+Lrul1ojdYz6yaE05Dqonn6Z9v5eqJCQ0UeSGcTRtepMlZDh9ywdKgw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/p-cancelable/-/p-cancelable-1.0.1.tgz", + "integrity": "sha512-MGdhuVx7X2yJe4dgOnDQcZQAYgiC/QK1O5HUPgTMTxWYiOlyWEO5DWmPBlXQBU1F6/JM7aSgYBDrpt7kurC6dw==", + "requires": { + "p-cancelable": "*" + } }, "@types/p-queue": { "version": "2.3.2", @@ -248,18 +244,13 @@ "integrity": "sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ==" }, "@types/p-retry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/p-retry/-/p-retry-1.0.1.tgz", - "integrity": "sha512-HgQPG9kkUb4EpTeUv2taH2nBZsVUb5aOTSw3X2YozcTG1ttmGcLaLKx1MbAz1evVfUEDTCAPmdz2HiFztIyWrw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-LkZCWg4JxFdQR/nGNZcMiyKAbNG3DKBRS6nn6Hg4dLS82zxkdBJJcvf4zXFvDCEI+e4dZdQX6wreqs9RDGMRfw==", "requires": { - "@types/retry": "*" + "p-retry": "*" } }, - "@types/pad": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/pad/-/pad-1.0.2.tgz", - "integrity": "sha512-33KsQV8vWV4t/q4DE6j7u5ToMuh8kA+c90as7uXZPtWhoBPGkWv7iZUK92AO/Oebbz54MwkZMuyado3L4QT11Q==" - }, "@types/request": { "version": "2.48.1", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz", @@ -280,127 +271,9 @@ } }, "@types/retry": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.10.2.tgz", - "integrity": "sha512-LqJkY4VQ7S09XhI7kA3ON71AxauROhSv74639VsNXC9ish4IWHnIi98if+nP1MxQV3RMPqXSCYgpPsDHjlg9UQ==" - }, - "@types/rx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/rx/-/rx-4.1.1.tgz", - "integrity": "sha1-WY/JSla67ZdfGUV04PVy/Y5iekg=", - "requires": { - "@types/rx-core": "*", - "@types/rx-core-binding": "*", - "@types/rx-lite": "*", - "@types/rx-lite-aggregates": "*", - "@types/rx-lite-async": "*", - "@types/rx-lite-backpressure": "*", - "@types/rx-lite-coincidence": "*", - "@types/rx-lite-experimental": "*", - "@types/rx-lite-joinpatterns": "*", - "@types/rx-lite-testing": "*", - "@types/rx-lite-time": "*", - "@types/rx-lite-virtualtime": "*" - } - }, - "@types/rx-core": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/rx-core/-/rx-core-4.0.3.tgz", - "integrity": "sha1-CzNUsSOM7b4rdPYybxOdvHpZHWA=" - }, - "@types/rx-core-binding": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz", - "integrity": "sha512-5pkfxnC4w810LqBPUwP5bg7SFR/USwhMSaAeZQQbEHeBp57pjKXRlXmqpMrLJB4y1oglR/c2502853uN0I+DAQ==", - "requires": { - "@types/rx-core": "*" - } - }, - "@types/rx-lite": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/rx-lite/-/rx-lite-4.0.5.tgz", - "integrity": "sha512-KZk5XTR1dm/kNgBx8iVpjno6fRYtAUQWBOmj+O8j724+nk097sz4fOoHJNpCkOJUtHUurZlJC7QvSFCZHbkC+w==", - "requires": { - "@types/rx-core": "*", - "@types/rx-core-binding": "*" - } - }, - "@types/rx-lite-aggregates": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz", - "integrity": "sha512-MAGDAHy8cRatm94FDduhJF+iNS5//jrZ/PIfm+QYw9OCeDgbymFHChM8YVIvN2zArwsRftKgE33QfRWvQk4DPg==", - "requires": { - "@types/rx-lite": "*" - } - }, - "@types/rx-lite-async": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz", - "integrity": "sha512-vTEv5o8l6702ZwfAM5aOeVDfUwBSDOs+ARoGmWAKQ6LOInQ8J4/zjM7ov12fuTpktUKdMQjkeCp07Vd73mPkxw==", - "requires": { - "@types/rx-lite": "*" - } - }, - "@types/rx-lite-backpressure": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz", - "integrity": "sha512-Y6aIeQCtNban5XSAF4B8dffhIKu6aAy/TXFlScHzSxh6ivfQBQw6UjxyEJxIOt3IT49YkS+siuayM2H/Q0cmgA==", - "requires": { - "@types/rx-lite": "*" - } - }, - "@types/rx-lite-coincidence": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz", - "integrity": "sha512-1VNJqzE9gALUyMGypDXZZXzR0Tt7LC9DdAZQ3Ou/Q0MubNU35agVUNXKGHKpNTba+fr8GdIdkC26bRDqtCQBeQ==", - "requires": { - "@types/rx-lite": "*" - } - }, - "@types/rx-lite-experimental": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz", - "integrity": "sha1-xTL1y98/LBXaFt7Ykw0bKYQCPL0=", - "requires": { - "@types/rx-lite": "*" - } - }, - "@types/rx-lite-joinpatterns": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz", - "integrity": "sha1-9w/jcFGKhDLykVjMkv+1a05K/D4=", - "requires": { - "@types/rx-lite": "*" - } - }, - "@types/rx-lite-testing": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz", - "integrity": "sha1-IbGdEfTf1v/vWp0WSOnIh5v+Iek=", - "requires": { - "@types/rx-lite-virtualtime": "*" - } - }, - "@types/rx-lite-time": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz", - "integrity": "sha512-ukO5sPKDRwCGWRZRqPlaAU0SKVxmWwSjiOrLhoQDoWxZWg6vyB9XLEZViKOzIO6LnTIQBlk4UylYV0rnhJLxQw==", - "requires": { - "@types/rx-lite": "*" - } - }, - "@types/rx-lite-virtualtime": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz", - "integrity": "sha512-3uC6sGmjpOKatZSVHI2xB1+dedgml669ZRvqxy+WqmGJDVusOdyxcKfyzjW0P3/GrCiN4nmRkLVMhPwHCc5QLg==", - "requires": { - "@types/rx-lite": "*" - } - }, - "@types/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "@types/shelljs": { "version": "0.8.1", @@ -412,14 +285,6 @@ "@types/node": "*" } }, - "@types/through": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.29.tgz", - "integrity": "sha512-9a7C5VHh+1BKblaYiq+7Tfc+EOmjMdZaD1MYtkQjSoxgB69tBjW98ry6SKsi4zEIWztLOMRuL87A3bdT/Fc/4w==", - "requires": { - "@types/node": "*" - } - }, "@types/tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.4.tgz", @@ -461,11 +326,6 @@ "json-schema-traverse": "^0.3.0" } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -473,10 +333,13 @@ "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "arg": { "version": "4.1.0", @@ -505,19 +368,6 @@ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -591,6 +441,12 @@ "js-tokens": "^3.0.2" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -603,6 +459,12 @@ "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, @@ -667,58 +529,18 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, "circular-json": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==" }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -728,6 +550,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -735,7 +558,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "combined-stream": { "version": "1.0.6", @@ -1023,14 +847,6 @@ } } }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { - "clone": "^1.0.2" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1039,19 +855,6 @@ "object-keys": "^1.0.12" } }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1135,7 +938,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "esprima": { "version": "4.0.1", @@ -1159,16 +963,6 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -1184,14 +978,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -1504,25 +1290,6 @@ "path-is-absolute": "^1.0.0" } }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -1566,7 +1333,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-symbols": { "version": "1.0.0", @@ -1595,14 +1363,6 @@ "sshpk": "^1.7.0" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", @@ -1629,46 +1389,6 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "requires": { - "ansi-regex": "^4.0.0" - } - } - } - }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", @@ -1705,49 +1425,18 @@ "number-is-nan": "^1.0.0" } }, - "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=" - }, "is-obj": { "version": "1.0.1", "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } - }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -1813,9 +1502,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", + "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -1927,11 +1616,6 @@ "lodash._reinterpolate": "~3.0.0" } }, - "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" - }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -1990,11 +1674,6 @@ "mime-db": "~1.35.0" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2052,10 +1731,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "mustache": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.1.tgz", + "integrity": "sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA==" }, "normalize-package-data": { "version": "2.5.0", @@ -2089,7 +1768,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-keys": { "version": "1.1.0", @@ -2135,14 +1815,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -2164,12 +1836,13 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.0.0.tgz", + "integrity": "sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA==" }, "p-limit": { "version": "1.3.0", @@ -2189,20 +1862,15 @@ "p-limit": "^1.1.0" } }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" - }, "p-queue": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz", "integrity": "sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==" }, "p-retry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-2.0.0.tgz", - "integrity": "sha512-ZbCuzAmiwJ45q4evp/IG9D+5MUllGSUeCWwPt3j/tdYSi1KPkSD+46uqmAA1LhccDhOXv8kYZKNb8x78VflzfA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "requires": { "retry": "^0.12.0" } @@ -2213,14 +1881,6 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "pad": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/pad/-/pad-2.2.2.tgz", - "integrity": "sha512-w5m0/ISM+Jc/xsxNwKzHhOX+KHKYP3tT+UMmZfCgMSLdCccbjMNYx6LtafOql60qI4NYv13ZGAkSiehJj9ttcQ==", - "requires": { - "wcwidth": "^1.0.1" - } - }, "parse-github-repo-url": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", @@ -2248,11 +1908,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "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=" - }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -2276,17 +1931,20 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "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" } @@ -2511,15 +2169,6 @@ "path-parse": "^1.0.6" } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -2529,26 +2178,11 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, "requires": { "glob": "^7.1.3" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "requires": { - "tslib": "^1.9.0" - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2562,7 +2196,8 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true }, "shelljs": { "version": "0.8.3", @@ -2578,7 +2213,8 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, "source-map": { "version": "0.6.1", @@ -2587,9 +2223,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -2673,30 +2309,6 @@ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -2728,15 +2340,13 @@ "dev": true }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tangular": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tangular/-/tangular-2.0.1.tgz", - "integrity": "sha512-8CVEU6f+PuDotu2B0mbLiatYlMWyWLsDK4syISrc0W6nZMU38MVtrciYt0snSkloilzOrhGqtqb7hj5CrYq5hg==" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } }, "tempfile": { "version": "1.1.1", @@ -2765,7 +2375,8 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "through2": { "version": "2.0.5", @@ -2777,19 +2388,6 @@ "xtend": "~4.0.1" } }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -2819,9 +2417,9 @@ "dev": true }, "ts-node": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.2.tgz", - "integrity": "sha512-MosTrinKmaAcWgO8tqMjMJB22h+sp3Rd1i4fdoWY4mhBDekOwIAKI/bzmRi7IcbCmjquccYg2gcF6NBkLgr0Tw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz", + "integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==", "dev": true, "requires": { "arg": "^4.1.0", @@ -2834,12 +2432,13 @@ "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true }, "tslint": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.13.0.tgz", - "integrity": "sha512-ECOOQRxXCYnUUePG5h/+Z1Zouobk3KFpIHA9aKBB/nnMxs97S1JJPDGt5J4cGm1y9U9VmVlfboOxA8n1kSNzGw==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz", + "integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -2854,7 +2453,7 @@ "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", - "tsutils": "^2.27.2" + "tsutils": "^2.29.0" } }, "tslint-eslint-rules": { @@ -2875,9 +2474,9 @@ "dev": true }, "tsutils": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.8.0.tgz", - "integrity": "sha512-XQdPhgcoTbCD8baXC38PQ0vpTZ8T3YrE+vR66YIj/xvDt1//8iAhafpIT/4DmvzzC1QFapEImERu48Pa01dIUA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.9.1.tgz", + "integrity": "sha512-hrxVtLtPqQr//p8/msPT1X1UYXUjizqSit5d9AQ5k38TcV38NyecL5xODNxa73cLe/5sdiJ+w1FqzDhRBA/anA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -2948,9 +2547,9 @@ "dev": true }, "typescript": { - "version": "3.3.3333", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3333.tgz", - "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==", + "version": "3.3.4000", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.4000.tgz", + "integrity": "sha512-jjOcCZvpkl2+z7JFn0yBOoLQyLoIkNZAs/fYJkUG6VKy6zLPHJGfQJYFHzibB6GJaF/8QrcECtlQ5cpvRHSMEA==", "dev": true }, "uglify-js": { @@ -3010,14 +2609,6 @@ "extsprintf": "^1.2.0" } }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "requires": { - "defaults": "^1.0.3" - } - }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", diff --git a/package.json b/package.json index 77f3be73..1eea0bd4 100644 --- a/package.json +++ b/package.json @@ -24,35 +24,25 @@ "dependencies": { "@openstapps/gitlab-api": "0.5.1", "@openstapps/logger": "0.0.5", - "@slack/client": "4.9.0", - "@types/del": "3.0.1", + "@slack/client": "4.12.0", "@types/glob": "7.1.1", - "@types/inquirer": "0.0.43", - "@types/node": "10.12.27", - "@types/pad": "1.0.2", - "@types/request": "2.48.1", - "@types/semver": "5.5.0", + "@types/mustache": "0.8.32", + "@types/node": "10.12.30", "async-pool-native": "0.1.0", "commander": "2.19.0", - "del": "3.0.0", "glob": "7.1.3", - "inquirer": "6.2.2", "moment": "2.24.0", - "pad": "2.2.2", - "request": "2.88.0", - "semver": "5.6.0", - "tangular": "2.0.1", - "toposort": "2.0.2" + "mustache": "3.0.1" }, "devDependencies": { - "@openstapps/configuration": "0.6.0", + "@openstapps/configuration": "0.7.0", "conventional-changelog-cli": "2.0.12", "prepend-file-cli": "1.0.6", "rimraf": "2.6.3", - "ts-node": "8.0.2", - "tslint": "5.13.0", + "ts-node": "8.0.3", + "tslint": "5.14.0", "typedoc": "0.14.2", - "typescript": "3.3.3333" + "typescript": "3.3.4000" }, "main": "lib/common.js", "typings": "lib/common.d.ts", diff --git a/reports/2019-03-27.md b/reports/2019-03-27.md new file mode 100644 index 00000000..d3d1aa5d --- /dev/null +++ b/reports/2019-03-27.md @@ -0,0 +1,132 @@ +# Meeting 2019-03-27 + + ## Rainer Killinger + + ### open: 4, closed: 3 + + quota closed: 42% + + | __title__ | __status__ | __project__ | __weeks__ | + | --- | --- | --- | --- | + | __[Insert sample data from the StappsCore into the backend](https://gitlab.com/openstapps/minimal-connector/issues/4)__
__Labels:__ meeting | | [openstapps/minimal-connector](https://gitlab.com/openstapps/minimal-connector) | 0 | +| __[Simplify translation implementation](https://gitlab.com/openstapps/core/issues/43)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 0 | +| __[Update transport security in nginx configuration](https://gitlab.com/openstapps/proxy/issues/1)__
__Labels:__ meeting | [](https://gitlab.com/openstapps/proxy/merge_requests/3) | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 | +| __[Add notion of study modules](https://gitlab.com/openstapps/core/issues/20)__
__Labels:__ feature, meeting | [](https://gitlab.com/openstapps/core/merge_requests/10) | [openstapps/core](https://gitlab.com/openstapps/core) | 11 | +| __[Manual docker image publishing fails](https://gitlab.com/openstapps/backend/issues/28)__
__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 1 | +| __[Fix folder permissions for elasticsearch volume](https://gitlab.com/openstapps/minimal-deployment/issues/5)__
__Labels:__ meeting | | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 0 | +| __[Test docker image building](https://gitlab.com/openstapps/proxy/issues/7)__
__Labels:__ meeting, testing | | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 1 | + ## Jovan Krunić + + ### open: 33, closed: 1 + + quota closed: 2% + + | __title__ | __status__ | __project__ | __weeks__ | + | --- | --- | --- | --- | + | __[Improve image docs and standardize usage](https://gitlab.com/openstapps/core/issues/44)__
__Labels:__ __bug__, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 0 | +| __[Include sample JSON files within the published package](https://gitlab.com/openstapps/core/issues/46)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 0 | +| __[Use review apps from gitlab to provide demo](https://gitlab.com/openstapps/app/issues/42)__
__Labels:__ feature, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 0 | +| __[Make sure appearance is compatible with (new) devices with cutouts](https://gitlab.com/openstapps/app/issues/40)__
__Labels:__ improvement, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 3 | +| __[Inconsistency in definitions of things without references](https://gitlab.com/openstapps/core/issues/41)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 3 | +| __[Show dishes for multiple days](https://gitlab.com/openstapps/app/issues/39)__
__Labels:__ feature, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 3 | +| __[Use fake backend - backendless development](https://gitlab.com/openstapps/app/issues/37)__
__Labels:__ improvement, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 3 | +| __[add a main page for the group (whole project)](https://gitlab.com/openstapps/openstapps.gitlab.io/issues/1)__
__Labels:__ documentation, meeting, organization | | [openstapps/openstapps.gitlab.io](https://gitlab.com/openstapps/openstapps.gitlab.io) | 6 | +| __[upgrade to Ionic 4.0 (stable)](https://gitlab.com/openstapps/app/issues/35)__
__Labels:__ improvement, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 6 | +| __[Develop a prototype for authentication](https://gitlab.com/openstapps/backend/issues/8)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 | +| __[Add examples for routes](https://gitlab.com/openstapps/core/issues/17)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 13 | +| __[(TODO: complete) school module: evaluate and create a prototype of a generic app](https://gitlab.com/openstapps/app/issues/29)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[List of most recent searches](https://gitlab.com/openstapps/app/issues/28)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Sorting by categories should be default for certain views](https://gitlab.com/openstapps/app/issues/25)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Evaluate solutions for adding monitoring (automatic error reports)](https://gitlab.com/openstapps/app/issues/24)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Todos module - predefined and user-defined tasks](https://gitlab.com/openstapps/app/issues/23)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Add deep-linking support](https://gitlab.com/openstapps/app/issues/22)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Show menus of (student) canteens for multiple days](https://gitlab.com/openstapps/app/issues/19)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Limit loaded places by the current zoom level](https://gitlab.com/openstapps/app/issues/18)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Appointment system module - queue number and estimated waiting time](https://gitlab.com/openstapps/app/issues/17)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __["About" module - app information and policies](https://gitlab.com/openstapps/app/issues/16)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Catalog tree module - catalog of university events](https://gitlab.com/openstapps/app/issues/15)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Styles and images](https://gitlab.com/openstapps/app/issues/14)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Home module - home page with widgets](https://gitlab.com/openstapps/app/issues/13)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Map module: show places and position](https://gitlab.com/openstapps/app/issues/12)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Export persons into the phone's contact list](https://gitlab.com/openstapps/app/issues/11)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Favorites module - save frequently used data as favorites](https://gitlab.com/openstapps/app/issues/10)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Events (timetable) module - schedule and calendar](https://gitlab.com/openstapps/app/issues/8)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[First start module: initial information and settings](https://gitlab.com/openstapps/app/issues/6)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 | +| __[Use skeleton screens](https://gitlab.com/openstapps/app/issues/4)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 | +| __[Data synchronization and consistency](https://gitlab.com/openstapps/app/issues/2)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 | +| __[Data module - data handling and presentation](https://gitlab.com/openstapps/app/issues/1)__
__Labels:__ meeting | [](https://gitlab.com/openstapps/app/merge_requests/2) | [openstapps/app](https://gitlab.com/openstapps/app) | 14 | +| __[Add an npm initializer package](https://gitlab.com/openstapps/projectmanagement/issues/2)__
__Labels:__ meeting | | [openstapps/projectmanagement](https://gitlab.com/openstapps/projectmanagement) | 15 | +| __[Backend should "wait" for the database container to be ready](https://gitlab.com/openstapps/minimal-deployment/issues/1)__
__Labels:__ meeting | | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 6 | + ## Karl-Philipp Wulfert + + ### open: 9, closed: 0 + + quota closed: 0% + + | __title__ | __status__ | __project__ | __weeks__ | + | --- | --- | --- | --- | + | __[Add systemd service file and error handler](https://gitlab.com/openstapps/proxy/issues/5)__
__Labels:__ feature, meeting | [](https://gitlab.com/openstapps/proxy/merge_requests/2) | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 | +| __[Add issue templates](https://gitlab.com/openstapps/minimal-deployment/issues/3)__
__Labels:__ meeting | | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 3 | +| __[Remove links to old GitLab instance](https://gitlab.com/openstapps/proxy/issues/3)__
__Labels:__ meeting | | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 | +| __[Throws error in `production` environment: "... doesn't set an transport agent ..."](https://gitlab.com/openstapps/logger/issues/4)__
__Labels:__ meeting | | [openstapps/logger](https://gitlab.com/openstapps/logger) | 7 | +| __[Support adding links to external services of a university/school](https://gitlab.com/openstapps/app/issues/21)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Include place when exporting events into the native calendar](https://gitlab.com/openstapps/app/issues/20)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Evaluate use of clickable alphabet for lists](https://gitlab.com/openstapps/app/issues/7)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[`circular-json` is deprecated](https://gitlab.com/openstapps/logger/issues/2)__
__Labels:__ meeting | [](https://gitlab.com/openstapps/logger/merge_requests/2) | [openstapps/logger](https://gitlab.com/openstapps/logger) | 15 | +| __[Test coverage levels are too low](https://gitlab.com/openstapps/logger/issues/1)__
__Labels:__ meeting | | [openstapps/logger](https://gitlab.com/openstapps/logger) | 15 | + ## Michel Jonathan Schmitz + + ### open: 7, closed: 0 + + quota closed: 0% + + | __title__ | __status__ | __project__ | __weeks__ | + | --- | --- | --- | --- | + | __[Provide context based search](https://gitlab.com/openstapps/core/issues/45)__
__Labels:__ feature, meeting | [](https://gitlab.com/openstapps/core/merge_requests/34) | [openstapps/core](https://gitlab.com/openstapps/core) | 0 | +| __[minimal connector and app should be part of the minimal deployment](https://gitlab.com/openstapps/minimal-deployment/issues/2)__
__Labels:__ meeting | [](https://gitlab.com/openstapps/minimal-deployment/merge_requests/2) | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 3 | +| __[Easy access for connector developers](https://gitlab.com/openstapps/minimal-connector/issues/3)__
__Labels:__ meeting | [](https://gitlab.com/openstapps/minimal-connector/merge_requests/3) | [openstapps/minimal-connector](https://gitlab.com/openstapps/minimal-connector) | 5 | +| __[Provide context based search](https://gitlab.com/openstapps/backend/issues/11)__
__Labels:__ feature, meeting | [](https://gitlab.com/openstapps/backend/merge_requests/12) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 | +| __[Do not exclude externals from reflection](https://gitlab.com/openstapps/core-tools/issues/7)__
__Labels:__ meeting | | [openstapps/core-tools](https://gitlab.com/openstapps/core-tools) | 9 | +| __[UML generation for data models](https://gitlab.com/openstapps/core-tools/issues/3)__
__Labels:__ Doing, meeting | [](https://gitlab.com/openstapps/core-tools/merge_requests/2) | [openstapps/core-tools](https://gitlab.com/openstapps/core-tools) | 10 | +| __[Unclear documentation](https://gitlab.com/openstapps/projectmanagement/issues/6)__
__Labels:__ meeting | | [openstapps/projectmanagement](https://gitlab.com/openstapps/projectmanagement) | 15 | + ## Sebastian Lange + + ### open: 5, closed: 2 + + quota closed: 28% + + | __title__ | __status__ | __project__ | __weeks__ | + | --- | --- | --- | --- | + | __[Follow-up from "Resolve "Config module - Provider for app configuration""](https://gitlab.com/openstapps/app/issues/41)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 0 | +| __[Config module - Provider for app configuration](https://gitlab.com/openstapps/app/issues/34)__
__Labels:__ feature, meeting | [](https://gitlab.com/openstapps/app/merge_requests/5) | [openstapps/app](https://gitlab.com/openstapps/app) | 7 | +| __[Initialize settings with from backend served app configuration](https://gitlab.com/openstapps/app/issues/30)__
__Labels:__ feature, meeting | [](https://gitlab.com/openstapps/app/merge_requests/7) | [openstapps/app](https://gitlab.com/openstapps/app) | 13 | +| __[Use i18n](https://gitlab.com/openstapps/app/issues/5)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 | +| __[Menu module - main and context menu](https://gitlab.com/openstapps/app/issues/3)__
__Labels:__ meeting | [](https://gitlab.com/openstapps/app/merge_requests/9) | [openstapps/app](https://gitlab.com/openstapps/app) | 14 | +| __[Update core dependency to v0.12.0](https://gitlab.com/openstapps/backend/issues/30)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 | +| __[Remodeling of Buckets in SCFacets](https://gitlab.com/openstapps/core/issues/42)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 1 | + ## Wieland Schöbl + + ### open: 17, closed: 1 + + quota closed: 5% + + | __title__ | __status__ | __project__ | __weeks__ | + | --- | --- | --- | --- | + | __[SCIndexResponse: additionalProperty "uid" exists in instance when not allowed](https://gitlab.com/openstapps/backend/issues/32)__
__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 | +| __[There are still occcurences of `isProductiveEnvironment`](https://gitlab.com/openstapps/backend/issues/29)__
__Labels:__ __bug__, meeting | [](https://gitlab.com/openstapps/backend/merge_requests/11) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 | +| __[Refactoring of search (query building)](https://gitlab.com/openstapps/backend/issues/13)__
__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 | +| __[Backend should throw an Error if someone tries to close an empty bulk process](https://gitlab.com/openstapps/backend/issues/7)__
__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 | +| __[Implement unit tests](https://gitlab.com/openstapps/backend/issues/31)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 | +| __[Add better documentation](https://gitlab.com/openstapps/backend/issues/26)__
__Labels:__ feature, meeting | [](https://gitlab.com/openstapps/backend/merge_requests/7) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 2 | +| __[Automatically check database version](https://gitlab.com/openstapps/backend/issues/24)__
__Labels:__ feature, meeting | [](https://gitlab.com/openstapps/backend/merge_requests/6) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 3 | +| __[Publish documentation to gitlab pages](https://gitlab.com/openstapps/backend/issues/22)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 3 | +| __[backend version should be provided by the requested path instead of the `X-StApps-Version` header](https://gitlab.com/openstapps/proxy/issues/2)__
__Labels:__ meeting | | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 | +| __[Dynamic Data should be accesible by the search route as well](https://gitlab.com/openstapps/backend/issues/17)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 | +| __[Link documentation for routes in the README.ms](https://gitlab.com/openstapps/backend/issues/10)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 | +| __[Develop a monitoring solution for backend load](https://gitlab.com/openstapps/backend/issues/9)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 | +| __[Aggregations for the first letters of search results](https://gitlab.com/openstapps/backend/issues/6)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 | +| __[Boosting of academic terms should be done dynamically](https://gitlab.com/openstapps/backend/issues/4)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 | +| __[Develop a new plugin structure that registers plugins via HTTP](https://gitlab.com/openstapps/backend/issues/2)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 9 | +| __[Elasticsearch Mapping files should be generated from the StAppsCore schema](https://gitlab.com/openstapps/core-tools/issues/6)__
__Labels:__ meeting | [](https://gitlab.com/openstapps/core-tools/merge_requests/8) | [openstapps/core-tools](https://gitlab.com/openstapps/core-tools) | 9 | +| __[Add model for routes that register backend plugins](https://gitlab.com/openstapps/core/issues/15)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 14 | +| __[Closing a bulk fails for SCThingTypes that contain a space character](https://gitlab.com/openstapps/backend/issues/25)__
__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 3 | diff --git a/src/common.ts b/src/common.ts index a84fa157..5554ffe1 100644 --- a/src/common.ts +++ b/src/common.ts @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 StApps + * Copyright (C) 2018, 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. @@ -20,9 +20,11 @@ import {readFile, unlink, writeFile} from 'fs'; import * as glob from 'glob'; import {promisify} from 'util'; -/** - * Instantiated logger - */ +export const readFilePromisified = promisify(readFile); +export const globPromisified = promisify(glob); +export const writeFilePromisified = promisify(writeFile); +export const unlinkPromisified = promisify(unlink); + export const logger = new Logger(); /** @@ -65,20 +67,3 @@ export async function getSubGroups(api: Api, groups: number[]): Promise export function flatten2dArray(arr: T[][]): T[] { return ([] as T[]).concat(...arr); } - -/** - * Promisified version of readFile - */ -export const readFilePromisified = promisify(readFile); -/** - * Promisified version of glob - */ -export const globPromisified = promisify(glob); -/** - * Promisified version of writeFile - */ -export const writeFilePromisified = promisify(writeFile); -/** - * Promisified version of unlink - */ -export const unlinkPromisified = promisify(unlink); diff --git a/src/tasks/report.ts b/src/tasks/report.ts index ae37dc6b..c9852838 100644 --- a/src/tasks/report.ts +++ b/src/tasks/report.ts @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 StApps + * Copyright (C) 2018, 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. @@ -15,15 +15,61 @@ import {Api} from '@openstapps/gitlab-api'; import {Issue, IssueState, MembershipScope, MergeRequestState, Project, User} from '@openstapps/gitlab-api/lib/types'; import {asyncPool} from 'async-pool-native/dist/async-pool'; -import {readFileSync, writeFile} from 'fs'; import * as moment from 'moment'; -import {join} from 'path'; +import {render} from 'mustache'; +import {join, resolve} from 'path'; import {cwd} from 'process'; -import {promisify} from 'util'; -import {flatten2dArray, getProjects, getSubGroups, logger} from '../common'; +import {flatten2dArray, getProjects, logger, readFilePromisified, writeFilePromisified} from '../common'; import {BOLD_LABELS, GROUPS, LABEL_WEIGHTS} from '../configuration'; -const asyncWriteFile = promisify(writeFile); +/** + * A structure for template compilation + */ +export interface StructureForTemplate { + issuesByAssignee: AssigneeWithIssues[]; + meetingDay: string; +} + +/** + * A map + */ +export interface IssuesGroupedByAssigneeId { + [assigneeId: number]: AssigneeWithIssues; +} + +/** + * An assignee with assigned issues + */ +export interface AssigneeWithIssues { + assignee: User; + issueCounts: { + closed: number; + opened: number; + }; + issues: IssueWithMeta[]; + quota: number; +} + +/** + * Issue with meta information + */ +export interface IssueWithMeta extends Issue { + $branchExists: boolean; + $labels: string; + $mergeRequestUrl: string; + $project: string; + $weeksOpen: number; +} + +/** + * Merge request data + */ +export interface MergeRequestsForProjects { + [projectId: string]: Array<{ + issue_iid: number; + web_url: string; + }>; +} /** * Check if issue state is opened or closed @@ -41,8 +87,7 @@ export function issueStateIsOpenedOrClosed(state: IssueState): state is IssueSta * @param projectId Project ID to get data about merge requests for * @param issueIid Issue IID in certain project (relative ID, and not issue's GitLab API ID) */ - -export function getMergeRequestUrls(projectMergeRequests: MergeRequestData, +export function getMergeRequestUrls(projectMergeRequests: MergeRequestsForProjects, projectId: number, issueIid: number): string[] { if (typeof projectMergeRequests[projectId] === 'undefined' || projectMergeRequests[projectId].length === 0) { @@ -56,72 +101,15 @@ export function getMergeRequestUrls(projectMergeRequests: MergeRequestData, }); } -/** - * An assignee with his/her issues - */ -export interface AssigneeWithIssues { - assignee: User; - issueCounts: { - closed: number; - opened: number; - }; - issues: Issue[]; - quota: number; -} - -export interface MergeRequestData { - [k: string]: Array<{ - issue_iid: number; - web_url: string; - }>; -} - -/** - * Tangular compiled template - */ -export type TangularCompiled = (model?: any, $?: any) => string; - -/** - * Convert an issue to a markdown table row - * - * @param issue Issue to convert - * @param projectBranches Map of branches for project IDs - * @param projectMergeRequests Map of merge requests for project IDs - * @param template Template to render this issue with - */ -function issueToString(issue: any, - projectBranches: any, - projectMergeRequests: any, - template: any): string { - issue._labels = issue.labels.map((label: string) => { - // print specific labels bold - if (BOLD_LABELS.indexOf(label) >= 0) { - label = '__' + label + '__'; - } - - return label; - }).join(', '); - - /* tslint:disable: max-line-length */ - return template({ - branchExists: typeof projectBranches[issue.project_id] !== 'undefined' && projectBranches[issue.project_id].indexOf(issue.iid) >= 0, - issue: issue, - // take the first URL from the merge request urls array (usually if there are URLs, then there is that only one) - mergeRequestUrl: getMergeRequestUrls(projectMergeRequests, issue.project_id, issue.iid)[0], - project: issue.web_url.replace('https://gitlab.com/', '').split('/issues/')[0], - weeksOpen: moment().diff(moment(issue.created_at), 'weeks'), - }); - /* tslint:enable */ -} - /** * Get issues from all groups with a specific milestone * * @param api GitLab API to make requests with * @param label Label to filter by + * @param groups List of groups to get issues for */ -export async function getIssues(api: Api, label: string): Promise { - const issueResults = await asyncPool(2, GROUPS, (groupId) => { +export async function getIssues(api: Api, label: string, groups: number[]): Promise { + const issueResults = await asyncPool(2, groups, (groupId) => { return api.getIssues({ groupId: groupId, }); @@ -142,7 +130,7 @@ export async function getIssues(api: Api, label: string): Promise { * @param api GitLab API To make requests with * @param projects List of projects */ -export async function getIdsOfIssuesWithBranchesForProjects( +export async function getIssueBranches( api: Api, projects: Project[]): Promise<{ [k: string]: number[] }> { const projectBranches: { [k: string]: number[] } = {}; @@ -164,14 +152,28 @@ export async function getIdsOfIssuesWithBranchesForProjects( } /** - * Group a list of issues by their assignees + * Get issues grouped by assignees * - * @param issues List of issues to group + * @param api GitLab API to make requests with + * @param label Label to generate report for */ -export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeWithIssues } { - const issuesByAssignee: { - [k: number]: AssigneeWithIssues; - } = {}; +export async function getIssuesGroupedByAssignees(api: Api, label: string): Promise { + const issuesByAssignee: IssuesGroupedByAssigneeId = {}; + + const groups = flatten2dArray(await asyncPool(2, GROUPS, async (groupId) => { + return (await api.getSubGroupsForGroup(groupId)).map((group) => { + return group.id; + }); + })); + groups.push.apply(groups, GROUPS); + + const [issues, projects] = await Promise.all([ + getIssues(api, label, groups), + getProjects(api, groups), + ]); + + const issueBranches = await getIssueBranches(api, projects); + const mergeRequests = await getMergeRequests(api, projects); issues.forEach((issue) => { if (issue.assignee === null) { @@ -195,12 +197,33 @@ export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeW issue.state = IssueState.OPENED; } + const issueWithMeta: IssueWithMeta = { + ...issue, + ...{ + $branchExists: typeof issueBranches[issue.project_id] !== 'undefined' + && issueBranches[issue.project_id].indexOf(issue.iid) >= 0, + $issue: issue, + $labels: issue.labels.map((issueLabel: string) => { + // print specific labels bold + if (BOLD_LABELS.indexOf(issueLabel) >= 0) { + issueLabel = '__' + issueLabel + '__'; + } + + return issueLabel; + }).join(', '), + $mergeRequestUrl: getMergeRequestUrls(mergeRequests, issue.project_id, issue.iid)[0], + $project: issue.web_url.replace('https://gitlab.com/', '').split('/issues/')[0], + $weeksOpen: moment().diff(moment(issue.created_at), 'weeks'), + }, + }; + if (issueStateIsOpenedOrClosed(issue.state)) { issuesByAssignee[issue.assignee.id].issueCounts[issue.state]++; - issuesByAssignee[issue.assignee.id].issues.push(issue); + issuesByAssignee[issue.assignee.id].issues.push(issueWithMeta); } }); + // calculate quota Object.keys(issuesByAssignee).forEach((_assigneeId) => { const assigneeId = parseInt(_assigneeId, 10); @@ -211,25 +234,37 @@ export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeW ); }); - return issuesByAssignee; -} + // sort issues by weight of labels and status + Object.keys(issuesByAssignee).forEach((_assigneeId) => { + const assigneeId = parseInt(_assigneeId, 10); -/** - * Compile templates - */ -export function compileTemplates(): { [k: string]: TangularCompiled } { - const tangular: { compile: (template: string) => TangularCompiled } = require('tangular'); + issuesByAssignee[assigneeId].issues.sort((a, b) => { + let weightA = 0; + let weightB = 0; - const templates = { - assigneeFooter: tangular.compile(readFileSync('templates/md/assigneeFooter.md').toString()), - assigneeHeader: tangular.compile(readFileSync('templates/md/assigneeHeader.md').toString()), - header: tangular.compile(readFileSync('templates/md/header.md').toString()), - issue: tangular.compile(readFileSync('templates/md/issue.md').toString()), - }; + Object.keys(LABEL_WEIGHTS).forEach((issueLabel) => { + if (a.labels.indexOf(issueLabel) >= 0) { + weightA += LABEL_WEIGHTS[issueLabel]; + } - logger.log('Compiled templates.'); + if (b.labels.indexOf(issueLabel) >= 0) { + weightB += LABEL_WEIGHTS[issueLabel]; + } + }); - return templates; + if (a.state === IssueState.CLOSED) { + weightA -= 10; + } + + if (b.state === IssueState.CLOSED) { + weightB -= 10; + } + + return weightB - weightA; + }); + }); + + return Object.values(issuesByAssignee); } /** @@ -261,9 +296,9 @@ export function getNextMeetingDay() { * @param api GitLab API to make requests with * @param projects List of projects */ -export async function getMergeRequestsForProjects(api: Api, - projects: Project[]): Promise { - const projectMergeRequests: MergeRequestData = {}; +export async function getMergeRequests(api: Api, + projects: Project[]): Promise { + const projectMergeRequests: MergeRequestsForProjects = {}; // iterate over projects await asyncPool(2, projects, async (project) => { @@ -292,72 +327,41 @@ export async function getMergeRequestsForProjects(api: Api, return projectMergeRequests; } -export async function generateReport(api: Api, label: string): Promise { - const templates = compileTemplates(); +/** + * Generate a report + * + * @param api GitLab API to make requests with + * @param label Label to generate report for + * @param template Template to generate report with + */ +export async function generateReport(api: Api, label: string, template: string): Promise { + const issuesGroupedByAssignee = await getIssuesGroupedByAssignees(api, label); - const groupIds: number[] = []; - groupIds.push.apply(groupIds, GROUPS); - groupIds.push.apply(groupIds, (await getSubGroups(api, GROUPS)).map((group) => group.id)); + const structureForTemplate: StructureForTemplate = { + issuesByAssignee: issuesGroupedByAssignee, + meetingDay: getNextMeetingDay(), + }; - logger.log(`Getting data for ${groupIds.length} group(s).`); - - const projects = await getProjects(api, groupIds); - const issues = await getIssues(api, label); - - const issuesGroupedByAssignee = groupIssuesByAssignee(issues); - - const issueBranches = await getIdsOfIssuesWithBranchesForProjects(api, projects); - const mergeRequests = await getMergeRequestsForProjects(api, projects); - - let markdown = templates.header(); - - Object.keys(issuesGroupedByAssignee).forEach((_assigneeId) => { - const assigneeId = parseInt(_assigneeId, 10); - - markdown += templates.assigneeHeader(issuesGroupedByAssignee[assigneeId]); - - issuesGroupedByAssignee[assigneeId].issues.sort((a, b) => { - let weightA = 0; - let weightB = 0; - - Object.keys(LABEL_WEIGHTS).forEach((issueLabel) => { - if (a.labels.indexOf(issueLabel) >= 0) { - weightA += LABEL_WEIGHTS[issueLabel]; - } - - if (b.labels.indexOf(issueLabel) >= 0) { - weightB += LABEL_WEIGHTS[issueLabel]; - } - }); - - if (a.state === IssueState.CLOSED) { - weightA -= 10; - } - - if (b.state === IssueState.CLOSED) { - weightB -= 10; - } - - return weightB - weightA; - }).forEach((issue) => { - markdown += issueToString( - issue, - issueBranches, - mergeRequests, - templates.issue, - ); - }); - - markdown += templates.assigneeFooter(issuesGroupedByAssignee[assigneeId]); - }); - - return markdown; + return render( + template, + structureForTemplate, + ); } +/** + * Generate a markdown report + * + * @param api GitLab API to make requests with + * @param label Label to generate report for + */ export async function report(api: Api, label: string) { const meetingDay = getNextMeetingDay(); - const markdown = generateReport(api, label); + const markdown = await generateReport( + api, + label, + (await readFilePromisified(resolve(__dirname, '..', '..', 'templates', 'report.md.mustache'))).toString(), + ); let filename = join(cwd(), 'reports', meetingDay + '.md'); @@ -365,7 +369,7 @@ export async function report(api: Api, label: string) { filename = join(cwd(), 'reports', `${label}.md`); } - await asyncWriteFile(filename, markdown); + await writeFilePromisified(filename, markdown); logger.ok(`Wrote file '${filename}'.`); } diff --git a/templates/md/assigneeFooter.md b/templates/md/assigneeFooter.md deleted file mode 100644 index 139597f9..00000000 --- a/templates/md/assigneeFooter.md +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/templates/md/assigneeHeader.md b/templates/md/assigneeHeader.md deleted file mode 100644 index d8a12002..00000000 --- a/templates/md/assigneeHeader.md +++ /dev/null @@ -1,8 +0,0 @@ -## {{ assignee.name }} - -### open: {{ issueCounts.opened }}, closed: {{ issueCounts.closed }} - -quota closed: {{ quota }}% - -| __title__ | __status__ | __project__ | __weeks__ | -| --- | --- | --- | --- | diff --git a/templates/md/header.md b/templates/md/header.md deleted file mode 100644 index 4217d1a3..00000000 --- a/templates/md/header.md +++ /dev/null @@ -1 +0,0 @@ -# Meeting {{ meetingDay }} diff --git a/templates/md/issue.md b/templates/md/issue.md deleted file mode 100644 index 97a7e246..00000000 --- a/templates/md/issue.md +++ /dev/null @@ -1 +0,0 @@ -| __[{{ if issue.state !== 'closed' }} {{ issue.title }} {{ else }} ~~{{ issue.title }}~~ {{ fi }}]({{ issue.web_url }})__
__Labels:__ {{ issue._labels }} | {{ if branchExists }} {{ fi}} {{ if mergeRequestUrl !== undefined }} {{ fi }} | [{{ project }}](https://gitlab.com/{{ project }}) | {{ weeksOpen }} | diff --git a/templates/report.md.mustache b/templates/report.md.mustache new file mode 100644 index 00000000..94667b2d --- /dev/null +++ b/templates/report.md.mustache @@ -0,0 +1,14 @@ +# Meeting {{meetingDay}} + +{{#issuesByAssignee}} + ## {{#assignee.avatar_url}} {{/assignee.avatar_url}}{{assignee.name}} + + ### open: {{issueCounts.opened}}, closed: {{issueCounts.closed}} + + quota closed: {{quota}}% + + | __title__ | __status__ | __project__ | __weeks__ | + | --- | --- | --- | --- | + {{#issues}}| __[{{title}}]({{&web_url}})__
__Labels:__ {{$labels}} | {{#$branchExists}}{{/$branchExists}}{{#$mergeRequestUrl}}[]({{&$mergeRequestUrl}}){{/$mergeRequestUrl}} | [{{$project}}](https://gitlab.com/{{&$project}}) | {{$weeksOpen}} | + {{/issues}} +{{/issuesByAssignee}}