From f3b3d06df5d692d9aa33fb83667e7d68f82026e5 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sat, 1 Jan 2022 10:48:12 +0000 Subject: [PATCH 01/18] Install new dep --- packages/web/package-lock.json | 308 ++++++++++++++++++++++++++++++++- packages/web/package.json | 1 + 2 files changed, 307 insertions(+), 2 deletions(-) diff --git a/packages/web/package-lock.json b/packages/web/package-lock.json index 073494d99..eda56d7b4 100644 --- a/packages/web/package-lock.json +++ b/packages/web/package-lock.json @@ -2629,6 +2629,11 @@ "@prisma/client": "^3.5.0" } }, + "@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, "@microsoft/fetch-event-source": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz", @@ -2893,6 +2898,22 @@ "@prisma/engines-version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727" } }, + "@prisma/debug": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-3.7.0.tgz", + "integrity": "sha512-3FdQRGUt2zSe1D+RnCh2wmbCiMmhX+BKNRnC6Ic8KHayXMbEuRR4Ofgt0AZHRCdEQBwVFvM2Yep9zN3hNnWssw==", + "requires": { + "@types/debug": "4.1.7", + "ms": "2.1.3" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, "@prisma/engines": { "version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727.tgz", @@ -2904,6 +2925,62 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727.tgz", "integrity": "sha512-vtoO2ys6mSfc8ONTWdcYztKN3GBU1tcKBj0aXObyjzSuGwHFcM/pEA0xF+n1W4/0TAJgfoPX2khNEit6g0jtNA==" }, + "@prisma/generator-helper": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-3.7.0.tgz", + "integrity": "sha512-jH5Sd9vXO+ER7yZrx7ah1gcUGcBW7ljk31t+TMMET6J8Wd7LOKgVWJ6O5IkPfw7KGuuFp8SolcivvGTsH4gsSA==", + "requires": { + "@prisma/debug": "3.7.0", + "@types/cross-spawn": "6.0.2", + "chalk": "4.1.2", + "cross-spawn": "7.0.3" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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" + } + } + } + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -3264,6 +3341,14 @@ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" }, + "@types/cross-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", + "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", + "requires": { + "@types/node": "*" + } + }, "@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", @@ -3525,8 +3610,7 @@ "@types/node": { "version": "14.18.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.0.tgz", - "integrity": "sha512-0GeIl2kmVMXEnx8tg1SlG6Gg8vkqirrW752KqolYo1PHevhhZN3bhJ67qHj+bQaINhX0Ra3TlWwRvMCd9iEfNQ==", - "dev": true + "integrity": "sha512-0GeIl2kmVMXEnx8tg1SlG6Gg8vkqirrW752KqolYo1PHevhhZN3bhJ67qHj+bQaINhX0Ra3TlWwRvMCd9iEfNQ==" }, "@types/node-fetch": { "version": "2.5.12", @@ -5979,6 +6063,11 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, "decode-named-character-reference": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.1.tgz", @@ -6175,6 +6264,15 @@ } } }, + "dindist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dindist/-/dindist-1.0.2.tgz", + "integrity": "sha512-RLoPvdwNGOO4OAABtng/uP81K1MVfbBJpe9f+/e6w530SqSJcFfRzuDRf1kJX+mhxwo6TFOuj5khaDQGZJZUYg==", + "requires": { + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.4" + } + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -7187,6 +7285,14 @@ } } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -7613,6 +7719,62 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "floggy": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/floggy/-/floggy-0.3.1.tgz", + "integrity": "sha512-qNvfLv+wAvzLEG3KemsbrXZDxOq0hx83+NuzVXkFMpIP/Qh2DHK5Qr2kdQL/j7P8+GkHP0JQcGnvnPZLQE2B1w==", + "requires": { + "chalk": "^4.1.2", + "fp-ts": "^2.11.3", + "lodash": "^4.17.21", + "strip-ansi": "6" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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" + } + } + } + }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -7654,6 +7816,11 @@ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, + "fp-ts": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.11.5.tgz", + "integrity": "sha512-OqlwJq1BdpB83BZXTqI+dNcA6uYk6qk4u9Cgnt64Y+XS7dwdbp/mobx8S2KXf2AXH+scNmA/UVK3SEFHR3vHZA==" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -8017,6 +8184,14 @@ "form-data": "^3.0.0" } }, + "graphql-scalars": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/graphql-scalars/-/graphql-scalars-1.14.1.tgz", + "integrity": "sha512-IrJ2SI9IkCmWHyr7yIvtPNGWTWF3eTS+iNnw1DQMmEtsOgs1dUmT0ge+8M1+1xm+q3/5ZqB95yUYyThDyOTE+Q==", + "requires": { + "tslib": "~2.3.0" + } + }, "graphql-tag": { "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", @@ -8279,6 +8454,14 @@ "react-is": "^16.7.0" } }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, "html-parse-stringify": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", @@ -10852,6 +11035,39 @@ } } }, + "nexus-prisma": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/nexus-prisma/-/nexus-prisma-0.35.0.tgz", + "integrity": "sha512-loDL1emSv469s6ENJ8GIkbWAG1QavNShFfnZFrlxkEnAJZP023JwJOdJ/QcMCnu0LV2pTNB1YWl0F/wB1JvamQ==", + "requires": { + "@prisma/generator-helper": "^3.6.0", + "debug": "^4.3.3", + "decimal.js": "^10.3.1", + "dindist": "^1.0.2", + "expand-tilde": "^2.0.2", + "fs-jetpack": "^4.3.0", + "graphql-scalars": "^1.13.6", + "kleur": "^4.1.4", + "lodash": "^4.17.21", + "ono": "^7.1.3", + "pkg-up": "^3.1.0", + "pluralize": "^8.0.0", + "semver": "^7.3.5", + "setset": "^0.0.8", + "ts-replace-all": "^1.0.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -11571,6 +11787,14 @@ "mimic-fn": "^2.1.0" } }, + "ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-9jnfVriq7uJM4o5ganUY54ntUm+5EK21EGaQ5NWnkWg3zz5ywbbonlBguRcnmF1/HDiIe3zxNxXcO1YPBmPcQQ==", + "requires": { + "@jsdevtools/ono": "7.1.3" + } + }, "opencollective-postinstall": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", @@ -11802,6 +12026,11 @@ "lines-and-columns": "^1.1.6" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -11964,6 +12193,54 @@ "find-up": "^4.0.0" } }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, "platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", @@ -13454,6 +13731,25 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "setset": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/setset/-/setset-0.0.8.tgz", + "integrity": "sha512-NNyiUBzR6Q4Z0zHuSinXJehFEH/u2DoHSfHit5vQVqZHEwqlwzfxAOo5SfgkyFfgN85UJbax9jPXSULNyKIcBw==", + "requires": { + "@jsdevtools/ono": "^7.1.3", + "floggy": "^0.3.1", + "lodash": "^4.17.20", + "tslib": "^2.2.0", + "type-fest": "^0.20.0" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -14683,6 +14979,14 @@ "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" }, + "ts-replace-all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ts-replace-all/-/ts-replace-all-1.0.0.tgz", + "integrity": "sha512-6uBtdkw3jHXkPtx/e9xB/5vcngMm17CyJYsS2YZeQ+9FdRnt6Ev5g931Sg2p+dxbtMGoCm13m3ax/obicTZIkQ==", + "requires": { + "core-js": "^3.4.1" + } + }, "tsconfig-paths": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", diff --git a/packages/web/package.json b/packages/web/package.json index 1359aab5f..543e9b514 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -72,6 +72,7 @@ "next-i18next": "^7.0.1", "nexus": "^1.0.0", "nexus-plugin-prisma": "^0.35.0", + "nexus-prisma": "^0.35.0", "node-fetch": "^2.6.1", "nprogress": "^0.2.0", "query-string": "^7.0.1", From df4ad8d14d8ce7012438c3e64b6f70f120e465f4 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sat, 1 Jan 2022 10:48:28 +0000 Subject: [PATCH 02/18] Uninstall old dep --- packages/web/package-lock.json | 41 ++-------------------------------- packages/web/package.json | 1 - 2 files changed, 2 insertions(+), 40 deletions(-) diff --git a/packages/web/package-lock.json b/packages/web/package-lock.json index eda56d7b4..d5b261c1f 100644 --- a/packages/web/package-lock.json +++ b/packages/web/package-lock.json @@ -5280,7 +5280,8 @@ "camelcase": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==" + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true }, "caniuse-lite": { "version": "1.0.30001285", @@ -6097,11 +6098,6 @@ "mimic-response": "^1.0.0" } }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -6481,16 +6477,6 @@ "once": "^1.4.0" } }, - "endent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", - "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", - "requires": { - "dedent": "^0.7.0", - "fast-json-parse": "^1.0.3", - "objectorarray": "^1.0.5" - } - }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -11012,29 +10998,6 @@ "tslib": "^2.0.3" } }, - "nexus-plugin-prisma": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/nexus-plugin-prisma/-/nexus-plugin-prisma-0.35.0.tgz", - "integrity": "sha512-zZh96Ol6eqDGGd2caZLayjDW5ruUxNdoglyAMa/bOTBfnxu1Keb9kOyD+n7zVV+Mot8t0GRvWS4XilXoKZF/Tg==", - "requires": { - "camelcase": "^6.2.0", - "endent": "^2.0.1", - "fs-jetpack": "^4.1.0", - "lodash": "^4.17.20", - "pluralize": "^8.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, "nexus-prisma": { "version": "0.35.0", "resolved": "https://registry.npmjs.org/nexus-prisma/-/nexus-prisma-0.35.0.tgz", diff --git a/packages/web/package.json b/packages/web/package.json index 543e9b514..48cf8100b 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -71,7 +71,6 @@ "next": "^11.1.0", "next-i18next": "^7.0.1", "nexus": "^1.0.0", - "nexus-plugin-prisma": "^0.35.0", "nexus-prisma": "^0.35.0", "node-fetch": "^2.6.1", "nprogress": "^0.2.0", From 0e4f22aacea244c1a5a2855a480d59701853d06f Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sat, 1 Jan 2022 11:34:18 +0000 Subject: [PATCH 03/18] Update j-db-client --- packages/j-db-client/package.json | 2 +- packages/j-db-client/prisma/schema.prisma | 4 ++++ packages/web/package-lock.json | 19 +++++++++---------- packages/web/package.json | 2 +- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/j-db-client/package.json b/packages/j-db-client/package.json index 35b6e13e5..d2f2294d0 100644 --- a/packages/j-db-client/package.json +++ b/packages/j-db-client/package.json @@ -1,6 +1,6 @@ { "name": "@journaly/j-db-client", - "version": "13.16.4", + "version": "14.0.0-ALPHA1", "description": "Journaly's internal database client.", "main": "dist/index", "scripts": { diff --git a/packages/j-db-client/prisma/schema.prisma b/packages/j-db-client/prisma/schema.prisma index 9c0f99691..e94cafd39 100644 --- a/packages/j-db-client/prisma/schema.prisma +++ b/packages/j-db-client/prisma/schema.prisma @@ -3,6 +3,10 @@ generator prisma_client { binaryTargets = ["native", "rhel-openssl-1.0.x"] } +generator nexusPrisma { + provider = "nexus-prisma" +} + datasource db { provider = "postgresql" url = env("DATABASE_URL") diff --git a/packages/web/package-lock.json b/packages/web/package-lock.json index d5b261c1f..956e0c289 100644 --- a/packages/web/package-lock.json +++ b/packages/web/package-lock.json @@ -2622,9 +2622,8 @@ "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" }, "@journaly/j-db-client": { - "version": "13.16.4", - "resolved": "https://registry.npmjs.org/@journaly/j-db-client/-/j-db-client-13.16.4.tgz", - "integrity": "sha512-Xthvj+BbQ3tbgSOV0WM6unvqDXnFy5CDQLnrWlFfiTMUi18c/Ra6EzDJTRp0P7hOPphAtQp4KKtdVfyQww2YFQ==", + "version": "file:../j-db-client/journaly-j-db-client-14.0.0-ALPHA1.tgz", + "integrity": "sha512-9l7KXxrqpdaJYA/l0q+0uZpv2w+8+PBCuANR7pU22NIQsRSYatEgK5gK68PlStRWJIkCv/ur+MpYjh3gjlD1bw==", "requires": { "@prisma/client": "^3.5.0" } @@ -2891,11 +2890,11 @@ "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==" }, "@prisma/client": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.6.0.tgz", - "integrity": "sha512-ycSGY9EZGROtje0iCNsgC5Zqi/ttX2sO7BNMYaLsUMiTlf3F69ZPH+08pRo0hrDfkZzyimXYqeXJlaoYDH1w7A==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.7.0.tgz", + "integrity": "sha512-fUJMvBOX5C7JPc0e3CJD6Gbelbu4dMJB4ScYpiht8HMUnRShw20ULOipTopjNtl6ekHQJ4muI7pXlQxWS9nMbw==", "requires": { - "@prisma/engines-version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727" + "@prisma/engines-version": "3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f" } }, "@prisma/debug": { @@ -2921,9 +2920,9 @@ "dev": true }, "@prisma/engines-version": { - "version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727.tgz", - "integrity": "sha512-vtoO2ys6mSfc8ONTWdcYztKN3GBU1tcKBj0aXObyjzSuGwHFcM/pEA0xF+n1W4/0TAJgfoPX2khNEit6g0jtNA==" + "version": "3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f.tgz", + "integrity": "sha512-+qx2b+HK7BKF4VCa0LZ/t1QCXsu6SmvhUQyJkOD2aPpmOzket4fEnSKQZSB0i5tl7rwCDsvAiSeK8o7rf+yvwg==" }, "@prisma/generator-helper": { "version": "3.7.0", diff --git a/packages/web/package.json b/packages/web/package.json index 48cf8100b..0567d7621 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -39,7 +39,7 @@ "dependencies": { "@apollo/client": "^3.3.12", "@apollo/react-ssr": "^4.0.0", - "@journaly/j-db-client": "13.16.4", + "@journaly/j-db-client": "file://../j-db-client/journaly-j-db-client-14.0.0-ALPHA1.tgz", "@stripe/react-stripe-js": "^1.2.2", "@stripe/stripe-js": "^1.12.1", "@types/bcryptjs": "^2.4.2", From c2c99bcd9212a80871da9ddbf41c5ba9890bca18 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sat, 1 Jan 2022 11:34:42 +0000 Subject: [PATCH 04/18] Possibly update resolvers index to work? --- packages/web/resolvers/index.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/web/resolvers/index.ts b/packages/web/resolvers/index.ts index f856a4c4c..4b10c8a5d 100644 --- a/packages/web/resolvers/index.ts +++ b/packages/web/resolvers/index.ts @@ -1,7 +1,6 @@ import * as path from 'path' import { makeSchema, declarativeWrappingPlugin } from 'nexus' -import { nexusPrisma } from 'nexus-plugin-prisma' import CommentTypes from './comment' import TopicTypes from './topic' @@ -51,12 +50,7 @@ const schemaOpts: Parameters[0] = { ...NotificationTypes, ], shouldGenerateArtifacts: reflectionRun, - plugins: [ - nexusPrisma({ - shouldGenerateArtifacts: reflectionRun, - }), - declarativeWrappingPlugin(), - ], + plugins: [declarativeWrappingPlugin()], } if (reflectionRun) { From b18d1c9f476d191b9006f8f0666f3c00c5110f81 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sat, 1 Jan 2022 11:36:02 +0000 Subject: [PATCH 05/18] An initial experiment in with user.ts --- packages/web/resolvers/user.ts | 71 +++++++++++++++++----------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/packages/web/resolvers/user.ts b/packages/web/resolvers/user.ts index e3ba5ad4b..4637afb35 100644 --- a/packages/web/resolvers/user.ts +++ b/packages/web/resolvers/user.ts @@ -14,6 +14,8 @@ import { InAppNotificationType, } from '@journaly/j-db-client' +import { User, UserBadge } from 'nexus-prisma' + import { NotAuthorizedError, UserInputError } from './errors' import { generateThumbbusterUrl, @@ -34,13 +36,11 @@ const DatedActivityCount = objectType({ }) const User = objectType({ - name: 'User', - sourceType: 'prisma.User', + name: User.$name, definition(t) { - t.model.id() - t.model.name() - t.string('email', { - nullable: true, + t.field(User.id) + t.field(User.name) + t.nullable.string('email', { resolve(parent, _args, ctx) { const { userId } = ctx.request @@ -51,19 +51,19 @@ const User = objectType({ return null }, }) - t.model.handle() - t.model.bio() - t.model.userRole() - t.model.city() - t.model.country() - t.model.badges({ pagination: false }) - t.model.posts({ pagination: false }) - t.model.savedPosts({ pagination: false }) - t.model.profileImage() - t.model.createdAt() - t.model.membershipSubscription() - t.model.isStudent() - t.model.socialMedia({ + t.field(User.handle) + t.field(User.bio) + t.field(User.userRole) + t.field(User.city) + t.field(User.country) + t.field(User.badges) + t.field(User.posts) + t.field(User.savedPosts) + t.field(User.profileImage) + t.field(User.createdAt) + t.field(User.membershipSubscription) + t.field(User.isStudent) + t.field(User.socialMedia, { type: 'SocialMedia', resolve: async (parent, _args, ctx) => { return ctx.db.socialMedia.findFirst({ @@ -73,12 +73,14 @@ const User = objectType({ }) }, }) - t.model.languages({ pagination: false }) - t.model.following({ pagination: false }) - t.model.followedBy({ pagination: false }) - t.model.lastFourCardNumbers() - t.model.cardBrand() - t.model.userInterests({ type: 'UserInterest', pagination: false }) + t.field(User.languages) + t.field(User.following) + t.field(User.followedBy) + t.field(User.lastFourCardNumbers) + t.field(User.cardBrand) + t.field(User.userInterests, { + type: 'UserInterests', + }) t.boolean('emailAddressVerified', { async resolve(parent, _args, ctx, _info) { const auth = await ctx.db.auth.findUnique({ @@ -147,15 +149,12 @@ const User = objectType({ return ctx.db.inAppNotification.findMany({ where: { - userId: userId + userId: userId, }, take: 99, - orderBy: [ - { readStatus: 'desc' }, - { bumpedAt: 'desc' }, - ] + orderBy: [{ readStatus: 'desc' }, { bumpedAt: 'desc' }], }) - } + }, }) t.list.field('activityGraphData', { type: 'DatedActivityCount', @@ -209,7 +208,7 @@ const User = objectType({ ON post_activity.date = post_comment_activity.date ; ` - return stats as any || [] + return (stats as any) || [] }, }) }, @@ -225,11 +224,11 @@ const InitiateAvatarImageUploadResponse = objectType({ }) const UserBadge = objectType({ - name: 'UserBadge', + name: UserBadge.$name, definition(t) { - t.model.id() - t.model.type() - t.model.createdAt() + t.field(UserBadge.id) + t.field(UserBadge.type) + t.field(UserBadge.createdAt) }, }) From c54819e0f04ce857d72026363285e21319e4ffee Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sun, 16 Jan 2022 10:07:30 +0000 Subject: [PATCH 06/18] Add documentation and fix import conflicts with types --- packages/j-db-client/package-lock.json | 2 +- packages/j-db-client/package.json | 2 +- packages/j-db-client/prisma/schema.prisma | 320 ++-- packages/web/package-lock.json | 1747 ++++++++++----------- packages/web/package.json | 2 +- packages/web/resolvers/user.ts | 12 +- 6 files changed, 1042 insertions(+), 1043 deletions(-) diff --git a/packages/j-db-client/package-lock.json b/packages/j-db-client/package-lock.json index ddeec5958..f5aee79b6 100644 --- a/packages/j-db-client/package-lock.json +++ b/packages/j-db-client/package-lock.json @@ -1,6 +1,6 @@ { "name": "@journaly/j-db-client", - "version": "13.15.0-ALPHA15", + "version": "14.0.0-ALPHA3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/j-db-client/package.json b/packages/j-db-client/package.json index d2f2294d0..4d43e5708 100644 --- a/packages/j-db-client/package.json +++ b/packages/j-db-client/package.json @@ -1,6 +1,6 @@ { "name": "@journaly/j-db-client", - "version": "14.0.0-ALPHA1", + "version": "14.0.0-ALPHA5", "description": "Journaly's internal database client.", "main": "dist/index", "scripts": { diff --git a/packages/j-db-client/prisma/schema.prisma b/packages/j-db-client/prisma/schema.prisma index e94cafd39..def8ae3f2 100644 --- a/packages/j-db-client/prisma/schema.prisma +++ b/packages/j-db-client/prisma/schema.prisma @@ -12,6 +12,7 @@ datasource db { url = env("DATABASE_URL") } +/// Journaly Users. model User { id Int @id @default(autoincrement()) name String? @@ -56,6 +57,7 @@ model User { isStudent Boolean @default(false) } +/// Contains authentication-related data for each User. model Auth { id Int @id @default(autoincrement()) userId Int @unique @@ -67,50 +69,7 @@ model Auth { user User @relation(fields: [userId], references: [id]) } -model LanguageLearning { - id Int @id @default(autoincrement()) - userId Int - languageId Int - createdAt DateTime @default(now()) - language Language @relation(fields: [languageId], references: [id]) - user User @relation(fields: [userId], references: [id]) - - @@unique([userId, languageId]) -} - -model LanguageRelation { - id Int @id @default(autoincrement()) - userId Int - languageId Int - createdAt DateTime @default(now()) - level LanguageLevel - language Language @relation(fields: [languageId], references: [id]) - user User @relation(fields: [userId], references: [id]) - - @@unique([userId, languageId]) -} - -model LanguageNative { - id Int @id @default(autoincrement()) - userId Int - languageId Int - createdAt DateTime @default(now()) - language Language @relation(fields: [languageId], references: [id]) - user User @relation(fields: [userId], references: [id]) - - @@unique([userId, languageId]) -} - -model SocialMedia { - id Int @id @default(autoincrement()) - userId Int @unique - website String - youtube String - instagram String - facebook String - user User @relation(fields: [userId], references: [id]) -} - +/// Journaly Posts, which Users can create and publish on the platform. model Post { id Int @id @default(autoincrement()) title String @@ -146,6 +105,101 @@ model Post { newPostNotifications NewPostNotification[] } +/// Threads can contain many Comments that correspond to a conversation around some particular inline feedback in a Post. +model Thread { + id Int @id @default(autoincrement()) + startIndex Int + endIndex Int + highlightedContent String + postId Int + archived Boolean @default(false) + post Post @relation(fields: [postId], references: [id]) + comments Comment[] + subscriptions ThreadSubscription[] +} + +/// Represents inline feedback Comments specifically, those which appear inside of Threads within a Post. +model Comment { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + body String + authorId Int + threadId Int + author User @relation(fields: [authorId], references: [id]) + thread Thread @relation(fields: [threadId], references: [id]) + thanks CommentThanks[] + PendingNotification PendingNotification[] + authorLanguageLevel LanguageLevel @default(BEGINNER) + threadCommentNotifications ThreadCommentNotification[] +} + +/// General Comments that are left underneath a Post and do not appear inside of Threads. +model PostComment { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + body String + authorId Int + postId Int + author User @relation(fields: [authorId], references: [id]) + post Post @relation(fields: [postId], references: [id]) + PendingNotification PendingNotification[] + thanks PostCommentThanks[] + postCommentNotifications PostCommentNotification[] + authorLanguageLevel LanguageLevel @default(BEGINNER) +} + +/// Thanks that an inline feedback Comment receives from Users in the community. +model CommentThanks { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + authorId Int + commentId Int + author User @relation(fields: [authorId], references: [id]) + comment Comment @relation(fields: [commentId], references: [id], onDelete: Cascade) + PendingNotification PendingNotification[] + ThreadCommentThanksNotification ThreadCommentThanksNotification[] + + @@unique([authorId, commentId]) +} + +/// Thanks that a general PostComment receives from Users in the community. +model PostCommentThanks { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + authorId Int + postCommentId Int? + author User @relation(fields: [authorId], references: [id]) + PostComment PostComment? @relation(fields: [postCommentId], references: [id]) + PendingNotification PendingNotification[] + + @@unique([authorId, postCommentId]) +} + +/// Claps that a Post has received from Users in the community. +model PostClap { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + postId Int + authorId Int + author User @relation(fields: [authorId], references: [id]) + post Post @relation(fields: [postId], references: [id]) + PendingNotification PendingNotification[] + postClapNotifications PostClapNotification[] + + @@unique([authorId, postId]) +} + +/// Images that are used in the headline/title section of a Post, which also appear in any kind of Post feed (My Feed, My Posts, Profile) +model HeadlineImage { + id Int @id @default(autoincrement()) + smallSize String + largeSize String + Post Post[] +} + +/// Represents A Many-To-Many Relationship between Languages and other models, such as Users LEARNING a Language. model Language { id Int @id @default(autoincrement()) name String @@ -159,6 +213,44 @@ model Language { @@unique([name, dialect]) } +/// The intermediary table for our M2M relationship with Languages. +model LanguageRelation { + id Int @id @default(autoincrement()) + userId Int + languageId Int + createdAt DateTime @default(now()) + level LanguageLevel + language Language @relation(fields: [languageId], references: [id]) + user User @relation(fields: [userId], references: [id]) + + @@unique([userId, languageId]) +} + +/// Each record represents a Language a User is learning. +model LanguageLearning { + id Int @id @default(autoincrement()) + userId Int + languageId Int + createdAt DateTime @default(now()) + language Language @relation(fields: [languageId], references: [id]) + user User @relation(fields: [userId], references: [id]) + + @@unique([userId, languageId]) +} + +/// Each Record represents a Language a User speaks natively. +model LanguageNative { + id Int @id @default(autoincrement()) + userId Int + languageId Int + createdAt DateTime @default(now()) + language Language @relation(fields: [languageId], references: [id]) + user User @relation(fields: [userId], references: [id]) + + @@unique([userId, languageId]) +} + +/// A core Topic which can have a M2M relationship with, for example, PostTopics or UserInterests. model Topic { id Int @id @default(autoincrement()) devName String @@ -168,16 +260,7 @@ model Topic { userInterests UserInterest[] } -model TopicTranslation { - id Int @id @default(autoincrement()) - uiLanguage UILanguage - name String - topicId Int - topic Topic @relation(fields: [topicId], references: [id]) - - @@unique([uiLanguage, topicId]) -} - +/// Topics a User is interested in. model UserInterest { id Int @id @default(autoincrement()) userId Int @@ -189,6 +272,7 @@ model UserInterest { @@unique([userId, topicId]) } +/// Topics that a Post has been written about. model PostTopic { id Int @id @default(autoincrement()) postId Int @@ -199,93 +283,18 @@ model PostTopic { @@unique([postId, topicId]) } -model PostClap { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - postId Int - authorId Int - author User @relation(fields: [authorId], references: [id]) - post Post @relation(fields: [postId], references: [id]) - PendingNotification PendingNotification[] - postClapNotifications PostClapNotification[] - - @@unique([authorId, postId]) -} - -model CommentThanks { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - authorId Int - commentId Int - author User @relation(fields: [authorId], references: [id]) - comment Comment @relation(fields: [commentId], references: [id], onDelete: Cascade) - PendingNotification PendingNotification[] - ThreadCommentThanksNotification ThreadCommentThanksNotification[] - - @@unique([authorId, commentId]) -} - -model PostCommentThanks { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - authorId Int - postCommentId Int? - author User @relation(fields: [authorId], references: [id]) - PostComment PostComment? @relation(fields: [postCommentId], references: [id]) - PendingNotification PendingNotification[] - - @@unique([authorId, postCommentId]) -} - -model Comment { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - body String - authorId Int - threadId Int - author User @relation(fields: [authorId], references: [id]) - thread Thread @relation(fields: [threadId], references: [id]) - thanks CommentThanks[] - PendingNotification PendingNotification[] - authorLanguageLevel LanguageLevel @default(BEGINNER) - threadCommentNotifications ThreadCommentNotification[] -} - -model PostComment { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - body String - authorId Int - postId Int - author User @relation(fields: [authorId], references: [id]) - post Post @relation(fields: [postId], references: [id]) - PendingNotification PendingNotification[] - thanks PostCommentThanks[] - postCommentNotifications PostCommentNotification[] - authorLanguageLevel LanguageLevel @default(BEGINNER) -} - -model Thread { - id Int @id @default(autoincrement()) - startIndex Int - endIndex Int - highlightedContent String - postId Int - archived Boolean @default(false) - post Post @relation(fields: [postId], references: [id]) - comments Comment[] - subscriptions ThreadSubscription[] -} +/// Translations of core Topics. +model TopicTranslation { + id Int @id @default(autoincrement()) + uiLanguage UILanguage + name String + topicId Int + topic Topic @relation(fields: [topicId], references: [id]) -model HeadlineImage { - id Int @id @default(autoincrement()) - smallSize String - largeSize String - Post Post[] + @@unique([uiLanguage, topicId]) } +/// Writing Prompts that can be shown to Users to help them think of Topics to write about. model Prompt { id Int @id @default(autoincrement()) text String @@ -293,6 +302,7 @@ model Prompt { topic Topic @relation(fields: [topicId], references: [id]) } +/// Represents a subscription that any User has to a given Thread. Users are subscribed if they authored the post or left comments in that Thread. model ThreadSubscription { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) @@ -304,6 +314,7 @@ model ThreadSubscription { @@unique([userId, threadId]) } +/// Represents a subscription that any User has to PostComments in given Post. Users are subscribed if they authored the post or left any PostComments on it. model PostCommentSubscription { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) @@ -315,6 +326,7 @@ model PostCommentSubscription { @@unique([userId, postId]) } +/// Represents a Journaly Premium Subscription. model MembershipSubscription { id Int @id @default(autoincrement()) period MembershipSubscriptionPeriod @@ -330,6 +342,7 @@ model MembershipSubscription { user User @relation(fields: [userId], references: [id]) } +/// Each record contains information from an individual Journaly Premium invoice, which would be created on every recurring MembershipSubscription payment. model MembershipSubscriptionInvoice { id Int @id @default(autoincrement()) userId Int @@ -342,6 +355,7 @@ model MembershipSubscriptionInvoice { MembershipSubscriptionInvoiceItem MembershipSubscriptionInvoiceItem[] } +/// Each record contains individual items from a MembershipSubscriptionInvoice and corresponds heavily to Stripe's subscription datamodel. model MembershipSubscriptionInvoiceItem { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) @@ -356,6 +370,7 @@ model MembershipSubscriptionInvoiceItem { invoice MembershipSubscriptionInvoice @relation(fields: [invoiceId], references: [id]) } +/// Each record is a badge that a User has earned for a particular accomplishment, corresponding to a BadgeType. model UserBadge { id Int @id @default(autoincrement()) type BadgeType @@ -366,6 +381,7 @@ model UserBadge { @@unique([userId, type]) } +/// Each record represents a single occurence on the platform that a User will be notified about in the Daily Digest Email. Table is cleared daily when the notifications are processed and emails are sent out. model PendingNotification { id Int @id @default(autoincrement()) type EmailNotificationType @@ -386,6 +402,7 @@ model PendingNotification { user User @relation(fields: [userId], references: [id]) } +/// Each record corresponds to a single, top-level In App Notification within the Notification Feed, which groups individual notifications together based on their InAppNotificationType. model InAppNotification { id Int @id @default(autoincrement()) type InAppNotificationType @@ -406,6 +423,7 @@ model InAppNotification { newPostNotifications NewPostNotification[] } +/// A single notification instance of a Comment within a Thread receiving CommentThanks from a User in the community. model ThreadCommentThanksNotification { id Int @id @default(autoincrement()) @@ -415,6 +433,7 @@ model ThreadCommentThanksNotification { notification InAppNotification @relation(fields: [notificationId], references: [id], onDelete: Cascade) } +/// A single notification instance of an inline feedback Comment being left within a Thread that a User is subscribed to on a Post. model ThreadCommentNotification { id Int @id @default(autoincrement()) notificationId Int @@ -423,6 +442,7 @@ model ThreadCommentNotification { comment Comment @relation(fields: [commentId], references: [id], onDelete: Cascade) } +/// A single notification instance of a PostComment being left on a Post that a User is subscribed to. model PostCommentNotification { id Int @id @default(autoincrement()) notificationId Int @@ -431,6 +451,7 @@ model PostCommentNotification { postComment PostComment @relation(fields: [postCommentId], references: [id], onDelete: Cascade) } +/// A single notification a User receives when a new User follows them. model NewFollowerNotification { id Int @id @default(autoincrement()) notificationId Int @@ -439,6 +460,7 @@ model NewFollowerNotification { followingUser User @relation(fields: [followingUserId], references: [id], onDelete: Cascade) } +/// A single notification a User receives when a User claps for one of their Posts. model PostClapNotification { id Int @id @default(autoincrement()) notificationId Int @@ -447,6 +469,7 @@ model PostClapNotification { postClap PostClap @relation(fields: [postClapId], references: [id], onDelete: Cascade) } +/// A single notification a User receives when another User they follow publishes a new Post. model NewPostNotification { id Int @id @default(autoincrement()) notificationId Int @@ -455,6 +478,18 @@ model NewPostNotification { post Post @relation(fields: [postId], references: [id], onDelete: Cascade) } +/// Contains social media information that each User can optionally include on their profile. +model SocialMedia { + id Int @id @default(autoincrement()) + userId Int @unique + website String + youtube String + instagram String + facebook String + user User @relation(fields: [userId], references: [id]) +} + +/// The different levels to which a User may speak a language. enum LanguageLevel { BEGINNER INTERMEDIATE @@ -462,24 +497,28 @@ enum LanguageLevel { NATIVE } +/// The role of each User in the administrative hierarchy. enum UserRole { ADMIN MODERATOR USER } +/// The publishing status of a Post. enum PostStatus { DRAFT PUBLISHED PRIVATE } +/// The different Languages we support within the U.I. enum UILanguage { ENGLISH GERMAN SPANISH } +/// The various types of badges that Users can earn. enum BadgeType { ALPHA_USER BETA_USER @@ -490,6 +529,7 @@ enum BadgeType { NECROMANCER } +/// Each type of notification a User may receive within an email, such as the Daily Digest Email. enum EmailNotificationType { THREAD_COMMENT POST_COMMENT @@ -498,6 +538,7 @@ enum EmailNotificationType { POST_CLAP } +/// Each type of notification a User may receive within the In-App Notification Feed. enum InAppNotificationType { THREAD_COMMENT POST_COMMENT @@ -507,11 +548,13 @@ enum InAppNotificationType { NEW_FOLLOWER } +/// The read/unread status of a notification a User may receive within the In-App Notification Feed. enum NotificationReadStatus { READ UNREAD } +/// The different Journaly Premium Membership recurring payment periods that we offer. enum MembershipSubscriptionPeriod { MONTHLY QUARTERLY @@ -519,6 +562,7 @@ enum MembershipSubscriptionPeriod { STUDENT_ANNUALLY } +/// The status indicating whether or not a User has verified their email address. enum EmailVerificationStatus { PENDING VERIFIED diff --git a/packages/web/package-lock.json b/packages/web/package-lock.json index 6125ba226..3221a53df 100644 --- a/packages/web/package-lock.json +++ b/packages/web/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@apollo/client": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.5.6.tgz", - "integrity": "sha512-XHoouuEJ4L37mtfftcHHO1caCRrKKAofAwqRoq28UQIPMJk+e7n3X9OtRRNXKk/9tmhNkwelSary+EilfPwI7A==", + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.5.7.tgz", + "integrity": "sha512-HSLqTGp3sp/PVIWYLLr5v3fjQSr6Fxg6Z5RQj5Q9ALyseIVudD8GZk1jHplaUblTFMBueXGw3Z6DXObuVAr3tw==", "requires": { "@graphql-typed-document-node/core": "^3.0.0", "@wry/context": "^0.6.0", @@ -55,13 +55,13 @@ "resolved": "https://registry.npmjs.org/@apollo/react-ssr/-/react-ssr-4.0.0.tgz", "integrity": "sha512-IW+x5M6eTTMbKwCfgox+BwfnZVhKTNiAjAHVdeOIc5jHIuG4oyB/gWcEonHRK6RKb+zLV1rOqpdwnJc6wchxLA==", "requires": { - "@apollo/client": "^3.5.6" + "@apollo/client": "^3.5.7" }, "dependencies": { "@apollo/client": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.5.6.tgz", - "integrity": "sha512-XHoouuEJ4L37mtfftcHHO1caCRrKKAofAwqRoq28UQIPMJk+e7n3X9OtRRNXKk/9tmhNkwelSary+EilfPwI7A==", + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.5.7.tgz", + "integrity": "sha512-HSLqTGp3sp/PVIWYLLr5v3fjQSr6Fxg6Z5RQj5Q9ALyseIVudD8GZk1jHplaUblTFMBueXGw3Z6DXObuVAr3tw==", "requires": { "@graphql-typed-document-node/core": "^3.0.0", "@wry/context": "^0.6.0", @@ -132,26 +132,26 @@ } }, "@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", "dev": true }, "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", + "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.7", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -161,44 +161,45 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.16.7" } }, "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", "dev": true }, "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -226,23 +227,23 @@ } }, "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "dev": true, "requires": { - "@babel/types": "^7.16.0", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -255,46 +256,46 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" }, "dependencies": { "browserslist": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", - "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001280", - "electron-to-chromium": "^1.3.896", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -315,284 +316,309 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", - "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz", + "integrity": "sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.16.7" } }, "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", "dev": true }, "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.16.7" } }, "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", "dev": true }, "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } @@ -608,110 +634,111 @@ }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, "@babel/helpers": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", - "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", "dev": true, "requires": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", - "@babel/types": "^7.16.0" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.16.7" } }, "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", "dev": true }, "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } @@ -723,26 +750,26 @@ "dev": true }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", - "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", - "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", + "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.0" + "@babel/plugin-transform-parameters": "^7.16.7" } }, "@babel/plugin-syntax-class-properties": { @@ -755,12 +782,12 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.0.tgz", - "integrity": "sha512-dH91yCo0RyqfzWgoM5Ji9ir8fQ+uFbt9KHM3d2x4jZOuHS6wNA+CRmRUP/BWCsHG2bjc7A2Way6AvH1eQk0wig==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", + "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-jsx": { @@ -781,274 +808,276 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", - "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", - "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", - "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-classes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", - "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", - "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", - "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", + "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.0.tgz", - "integrity": "sha512-vs/F5roOaO/+WxKfp9PkvLsAyj0G+Q0zbFimHm9X2KDgabN2XmNFoAafmeGEYspUlIF9+MvVmyek9UyHiqeG/w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", + "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-flow": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-flow": "^7.16.7" } }, "@babel/plugin-transform-for-of": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", - "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", - "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", - "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", - "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", - "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", - "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" } }, "@babel/plugin-transform-parameters": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", - "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", - "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz", - "integrity": "sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", + "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz", - "integrity": "sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", + "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/plugin-syntax-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz", - "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", - "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", - "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", - "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.3.tgz", - "integrity": "sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", + "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==", "dev": true, "requires": { - "core-js-pure": "^3.19.0", + "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" }, "dependencies": { "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.16.7" } }, "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", "dev": true }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } @@ -1072,12 +1101,12 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.16.7" } } } @@ -1324,9 +1353,9 @@ } }, "yargs": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz", - "integrity": "sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -1647,12 +1676,6 @@ } } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -2203,20 +2226,20 @@ } }, "@graphql-tools/import": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-6.6.1.tgz", - "integrity": "sha512-i9WA6k+erJMci822o9w9DoX+uncVBK60LGGYW8mdbhX0l7wEubUpA000thJ1aarCusYh0u+ZT9qX0HyVPXu25Q==", + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-6.6.5.tgz", + "integrity": "sha512-w0/cYuhrr2apn+iGoTToCqt65x2NN2iHQyqRNk/Zw1NJ+e8/C3eKVw0jmW4pYQvSocuPxL4UCSI56SdKO7m3+Q==", "dev": true, "requires": { - "@graphql-tools/utils": "8.5.3", + "@graphql-tools/utils": "8.6.1", "resolve-from": "5.0.0", "tslib": "~2.3.0" }, "dependencies": { "@graphql-tools/utils": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.5.3.tgz", - "integrity": "sha512-HDNGWFVa8QQkoQB0H1lftvaO1X5xUaUDk1zr1qDe0xN1NL0E/CrQdJ5UKLqOvH4hkqVUPxQsyOoAZFkaH6rLHg==", + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.1.tgz", + "integrity": "sha512-uxcfHCocp4ENoIiovPxUWZEHOnbXqj3ekWc0rm7fUhW93a1xheARNHcNKhwMTR+UKXVJbTFQdGI1Rl5XdyvDBg==", "dev": true, "requires": { "tslib": "~2.3.0" @@ -2414,9 +2437,9 @@ }, "dependencies": { "@graphql-tools/utils": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.5.3.tgz", - "integrity": "sha512-HDNGWFVa8QQkoQB0H1lftvaO1X5xUaUDk1zr1qDe0xN1NL0E/CrQdJ5UKLqOvH4hkqVUPxQsyOoAZFkaH6rLHg==", + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.1.tgz", + "integrity": "sha512-uxcfHCocp4ENoIiovPxUWZEHOnbXqj3ekWc0rm7fUhW93a1xheARNHcNKhwMTR+UKXVJbTFQdGI1Rl5XdyvDBg==", "dev": true, "requires": { "tslib": "~2.3.0" @@ -2447,9 +2470,9 @@ } }, "@graphql-tools/utils": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.5.3.tgz", - "integrity": "sha512-HDNGWFVa8QQkoQB0H1lftvaO1X5xUaUDk1zr1qDe0xN1NL0E/CrQdJ5UKLqOvH4hkqVUPxQsyOoAZFkaH6rLHg==", + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.1.tgz", + "integrity": "sha512-uxcfHCocp4ENoIiovPxUWZEHOnbXqj3ekWc0rm7fUhW93a1xheARNHcNKhwMTR+UKXVJbTFQdGI1Rl5XdyvDBg==", "dev": true, "requires": { "tslib": "~2.3.0" @@ -2622,8 +2645,8 @@ "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" }, "@journaly/j-db-client": { - "version": "file:../j-db-client/journaly-j-db-client-14.0.0-ALPHA1.tgz", - "integrity": "sha512-9l7KXxrqpdaJYA/l0q+0uZpv2w+8+PBCuANR7pU22NIQsRSYatEgK5gK68PlStRWJIkCv/ur+MpYjh3gjlD1bw==", + "version": "file:../j-db-client/journaly-j-db-client-14.0.0-ALPHA5.tgz", + "integrity": "sha512-LrT5tdAdJhYsTHl0R2MwWTHPNk7LpvRQzghHV8uEn5DerPPtWRro2l9h9GunWsp2WVJVgn9r4qQCxdeuzGw2cA==", "requires": { "@prisma/client": "^3.5.0" } @@ -2640,9 +2663,9 @@ "dev": true }, "@microsoft/load-themed-styles": { - "version": "1.10.234", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.234.tgz", - "integrity": "sha512-kDCxWdgqPs5+Kb0e9+lxyGDOvdXDUvtqw0UVlQD2Qh19BOSTbadxn4jlSjGe0tY3Z9EOWhIeQ7Wshmgf5H66LA==" + "version": "1.10.242", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.242.tgz", + "integrity": "sha512-+uhhXr7BqYDD+ZZmVhtEZkc2e5x8zUe39ELtcN7qNm3I5ru7e8VTe0CBInIkhpXHIJJ4jqBcp0NqdcC4axxOiw==" }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", @@ -2885,51 +2908,60 @@ "dev": true }, "@popperjs/core": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", - "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==" + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", + "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==" }, "@prisma/client": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.7.0.tgz", - "integrity": "sha512-fUJMvBOX5C7JPc0e3CJD6Gbelbu4dMJB4ScYpiht8HMUnRShw20ULOipTopjNtl6ekHQJ4muI7pXlQxWS9nMbw==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.8.1.tgz", + "integrity": "sha512-NxD1Xbkx1eT1mxSwo1RwZe665mqBETs0VxohuwNfFIxMqcp0g6d4TgugPxwZ4Jb4e5wCu8mQ9quMedhNWIWcZQ==", "requires": { - "@prisma/engines-version": "3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f" + "@prisma/engines-version": "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" } }, "@prisma/debug": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-3.7.0.tgz", - "integrity": "sha512-3FdQRGUt2zSe1D+RnCh2wmbCiMmhX+BKNRnC6Ic8KHayXMbEuRR4Ofgt0AZHRCdEQBwVFvM2Yep9zN3hNnWssw==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-3.8.1.tgz", + "integrity": "sha512-ft4VPTYME1UBJ7trfrBuF2w9jX1ipDy786T9fAEskNGb+y26gPDqz5fiEWc2kgHNeVdz/qTI/V3wXILRyEcgxQ==", "requires": { "@types/debug": "4.1.7", - "ms": "2.1.3" + "ms": "2.1.3", + "strip-ansi": "6.0.1" }, "dependencies": { "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } } } }, "@prisma/engines": { - "version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727.tgz", - "integrity": "sha512-dRClHS7DsTVchDKzeG72OaEyeDskCv91pnZ72Fftn0mp4BkUvX2LvWup65hCNzwwQm5IDd6A88APldKDnMiEMA==", + "version": "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f.tgz", + "integrity": "sha512-bHYubuItSN/DGYo36aDu7xJiJmK52JOSHs4MK+KbceAtwS20BCWadRgtpQ3iZ2EXfN/B1T0iCXlNraaNwnpU2w==", "dev": true }, "@prisma/engines-version": { - "version": "3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f.tgz", - "integrity": "sha512-+qx2b+HK7BKF4VCa0LZ/t1QCXsu6SmvhUQyJkOD2aPpmOzket4fEnSKQZSB0i5tl7rwCDsvAiSeK8o7rf+yvwg==" + "version": "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f.tgz", + "integrity": "sha512-G2JH6yWt6ixGKmsRmVgaQYahfwMopim0u/XLIZUo2o/mZ5jdu7+BL+2V5lZr7XiG1axhyrpvlyqE/c0OgYSl3g==" }, "@prisma/generator-helper": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-3.7.0.tgz", - "integrity": "sha512-jH5Sd9vXO+ER7yZrx7ah1gcUGcBW7ljk31t+TMMET6J8Wd7LOKgVWJ6O5IkPfw7KGuuFp8SolcivvGTsH4gsSA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-3.8.1.tgz", + "integrity": "sha512-3zSy+XTEjmjLj6NO+/YPN1Cu7or3xA11TOoOnLRJ9G4pTT67RJXjK0L9Xy5n+3I0Xlb7xrWCgo8MvQQLMWzxPA==", "requires": { - "@prisma/debug": "3.7.0", + "@prisma/debug": "3.8.1", "@types/cross-spawn": "6.0.2", "chalk": "4.1.2", "cross-spawn": "7.0.3" @@ -3076,17 +3108,17 @@ "dev": true }, "@stripe/react-stripe-js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-1.6.0.tgz", - "integrity": "sha512-tMmsPD+wkpiiVJZgQ1E06tklG5MZHG462s6OWja9abpxq76kerAxMFN+KdhUg0LIEY79THbzvH3s/WGHasnV3w==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-1.7.0.tgz", + "integrity": "sha512-L20v8Jq0TDZFL2+y+uXD751t6q9SalSFkSYZpmZ2VWrGZGK7HAGfRQ804dzYSSr5fGenW6iz6y7U0YKfC/TK3g==", "requires": { "prop-types": "^15.7.2" } }, "@stripe/stripe-js": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.21.2.tgz", - "integrity": "sha512-iIXe+XF9XdyO4/1i+TPRdsjy4rFOkYLeCsmB/uuSrCVs+Y0nxCdaRK3oD6n7c7lEi1sxDbAQX615wlt9E4EqWQ==" + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.22.0.tgz", + "integrity": "sha512-fm8TR8r4LwbXgBIYdPmeMjJJkxxFC66tvoliNnmXOpUgZSgQKoNPW3ON0ZphZIiif1oqWNhAaSrr7tOvGu+AFg==" }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "5.4.0", @@ -3161,6 +3193,14 @@ "@svgr/plugin-jsx": "^5.5.0", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } } }, "@svgr/hast-util-to-babel-ast": { @@ -3237,9 +3277,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3258,9 +3298,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3300,9 +3340,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3329,9 +3369,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3346,6 +3386,13 @@ "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", "requires": { "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" + } } }, "@types/debug": { @@ -3384,9 +3431,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.26", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.26.tgz", - "integrity": "sha512-zeu3tpouA043RHxW0gzRxwCHchMgftE8GArRsvYT0ByDMbn19olQHx5jLue0LxWY6iYtXb7rXmuVtSkhy9YZvQ==", + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", "requires": { "@types/node": "*", "@types/qs": "*", @@ -3394,9 +3441,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3409,9 +3456,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3433,9 +3480,9 @@ }, "dependencies": { "@types/react": { - "version": "17.0.37", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", - "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", + "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3456,9 +3503,9 @@ "dev": true }, "@types/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==" + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz", + "integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==" }, "@types/http-proxy-agent": { "version": "2.0.2", @@ -3509,17 +3556,17 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "@types/jsonwebtoken": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.6.tgz", - "integrity": "sha512-+P3O/xC7nzVizIi5VbF34YtqSonFsdnbXBnWUCYRiKOi1f9gA4sEFvXkrGr/QVV23IbMYvcoerI7nnhDUiWXRQ==", + "version": "8.5.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.7.tgz", + "integrity": "sha512-CBHN+1unePowgS94ayLE7aVp7AfyhgG/3l2O+AjkhOMY4kAAfVI1OnbbLnOeDMAdTNLP5ZjJ3kdZanRtRQaK3Q==", "requires": { "@types/node": "*" }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3553,9 +3600,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3607,9 +3654,10 @@ "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, "@types/node": { - "version": "14.18.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.0.tgz", - "integrity": "sha512-0GeIl2kmVMXEnx8tg1SlG6Gg8vkqirrW752KqolYo1PHevhhZN3bhJ67qHj+bQaINhX0Ra3TlWwRvMCd9iEfNQ==" + "version": "14.18.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.5.tgz", + "integrity": "sha512-LMy+vDDcQR48EZdEx5wRX1q/sEl6NdGuHXPnfeL8ixkwCOSZ2qnIyIZmcCbdX0MeRqHhAcHmX+haCbrS8Run+A==", + "dev": true }, "@types/node-fetch": { "version": "2.5.12", @@ -3621,9 +3669,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3636,9 +3684,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3725,9 +3773,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -3737,9 +3785,9 @@ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "@types/uuid": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.3.tgz", - "integrity": "sha512-0LbEEx1zxrYB3pgpd1M5lEhLcXjKJnYghvhTRgaBeUivLHMDM1TzF3IJ6hXU2+8uA4Xz+5BA63mtZo5DjVT8iA==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, "@types/websocket": { @@ -3760,9 +3808,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -4029,9 +4077,9 @@ } }, "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, "acorn-jsx": { @@ -4629,9 +4677,9 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "aws-sdk": { - "version": "2.1044.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1044.0.tgz", - "integrity": "sha512-n55uGUONQGXteGGG1QlZ1rKx447KSuV/x6jUGNf2nOl41qMI8ZgLUhNUt0uOtw3qJrCTanzCyR/JKBq2PMiqEQ==", + "version": "2.1058.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1058.0.tgz", + "integrity": "sha512-q6bTq1DBBeBaU6GKKoTHmJj16WOQHhOoK7jwV93IT8pO0P1XH99gesFofhew3eT0h8Ev7quVKutk4B1kfnIXPQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -4882,27 +4930,27 @@ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", "dev": true, "requires": { - "bytes": "3.1.0", + "bytes": "3.1.1", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", "dev": true }, "debug": { @@ -4914,19 +4962,6 @@ "ms": "2.0.0" } }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4936,12 +4971,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4949,34 +4978,22 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", "dev": true }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true } } }, @@ -5203,9 +5220,9 @@ "dev": true }, "keyv": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", - "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.5.tgz", + "integrity": "sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -5277,15 +5294,15 @@ } }, "camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "caniuse-lite": { - "version": "1.0.30001285", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001285.tgz", - "integrity": "sha512-KAOkuUtcQ901MtmvxfKD+ODHH9YVDYnBt+TGYSz2KIfnq22CiArbUxXPN9067gNbgMlnNYRSwho8OPXZPALB9Q==" + "version": "1.0.30001299", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz", + "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw==" }, "capital-case": { "version": "1.0.4", @@ -5476,12 +5493,11 @@ } }, "cli-progress": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.9.1.tgz", - "integrity": "sha512-AXxiCe2a0Lm0VN+9L0jzmfQSkcZm5EYspfqXKaSIQKqIk+0hnkZ3/v1E9B39mkD6vYhKih3c/RPsJBSwq9O99Q==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.10.0.tgz", + "integrity": "sha512-kLORQrhYCAtUPLZxqsAt2YJGOvRdt34+O6jl5cQGb7iF3dM55FQZlTR+rQyIK9JUcO9bBMwZsTlND+3dmFU2Cw==", "dev": true, "requires": { - "colors": "^1.1.2", "string-width": "^4.2.0" } }, @@ -5693,20 +5709,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "safe-buffer": "5.2.1" } }, "content-type": { @@ -5780,14 +5788,14 @@ } }, "core-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", - "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==" + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==" }, "core-js-pure": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.3.tgz", - "integrity": "sha512-N3JruInmCyt7EJj5mAq3csCgGYgiSqu7p7TQp2KOztr180/OAIxyIvL1FCjzgmQk/t3Yniua50Fsak7FShI9lA==" + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.3.tgz", + "integrity": "sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA==" }, "core-util-is": { "version": "1.0.3", @@ -6008,9 +6016,9 @@ "dev": true }, "damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, "dashdash": { @@ -6034,14 +6042,14 @@ "dev": true }, "date-fns": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.27.0.tgz", - "integrity": "sha512-sj+J0Mo2p2X1e306MHq282WS4/A8Pz/95GIFcsPNMPMZVI3EUrAdSv90al1k+p74WGLCruMXk23bfEDZa71X9Q==" + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==" }, "date-fns-tz": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.1.6.tgz", - "integrity": "sha512-nyy+URfFI3KUY7udEJozcoftju+KduaqkVfwyTIE0traBiVye09QnyWKLZK7drRr5h9B7sPJITmQnS3U6YOdQg==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.2.2.tgz", + "integrity": "sha512-vWtn44eEqnLbkACb7T5G5gPgKR4nY8NkNMOCyoY49NsRGHrcDmY2aysCyzDeA+u+vcDBn/w6nQqEDyouRs4m8w==" }, "debounce": { "version": "1.2.1", @@ -6401,9 +6409,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.13.tgz", - "integrity": "sha512-ih5tIhzEuf78pBY70FXLo+Pw73R5MPPPcXb4CGBMJaCQt/qo/IGIesKXmswpemVCKSE2Bulr5FslUv7gAWJoOw==" + "version": "1.4.46", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.46.tgz", + "integrity": "sha512-UtV0xUA/dibCKKP2JMxOpDtXR74zABevuUEH4K0tvduFSIoxRVcYmQsbB51kXsFTX8MmOyWMt8tuZAlmDOqkrQ==" }, "elegant-spinner": { "version": "1.0.1", @@ -6830,14 +6838,13 @@ } }, "eslint-module-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", - "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", "dev": true, "requires": { "debug": "^3.2.7", - "find-up": "^2.1.0", - "pkg-dir": "^2.0.0" + "find-up": "^2.1.0" }, "dependencies": { "debug": { @@ -6897,22 +6904,13 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } } } }, "eslint-plugin-import": { - "version": "2.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", - "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -6920,14 +6918,14 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.1", + "eslint-module-utils": "^2.7.2", "has": "^1.0.3", "is-core-module": "^2.8.0", "is-glob": "^4.0.3", "minimatch": "^3.0.4", "object.values": "^1.1.5", "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" + "tsconfig-paths": "^3.12.0" }, "dependencies": { "debug": { @@ -6994,9 +6992,9 @@ } }, "eslint-plugin-react": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz", - "integrity": "sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz", + "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -7279,17 +7277,17 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", "dev": true, "requires": { "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -7303,25 +7301,19 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.6", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7344,21 +7336,9 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", "dev": true } } @@ -7509,9 +7489,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -7566,9 +7546,9 @@ } }, "fbjs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.1.tgz", - "integrity": "sha512-8+vkGyT4lNDRKHQNPp0yh/6E7FfkLg89XqQbOYnvntRh+8RiSD43yrh9E5ejp1muCizTL4nDVG+y8W4e+LROHg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.2.tgz", + "integrity": "sha512-qv+boqYndjElAJHNN3NoM8XuwQZ1j2m3kEvTgdle8IDjr6oUbkEpvABWtj/rQl3vq4ew7dnElBxL4YJAwTVqQQ==", "dev": true, "requires": { "cross-fetch": "^3.0.4", @@ -7802,9 +7782,9 @@ "dev": true }, "fp-ts": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.11.5.tgz", - "integrity": "sha512-OqlwJq1BdpB83BZXTqI+dNcA6uYk6qk4u9Cgnt64Y+XS7dwdbp/mobx8S2KXf2AXH+scNmA/UVK3SEFHR3vHZA==" + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.11.7.tgz", + "integrity": "sha512-UUpeygu50mV/J96Nk92fzHDznYXJxsO20wrUZGJppja1f8P+fhCaclcqcfubEyrH7XXPsmYn98CJF0BVAEn3ZQ==" }, "fragment-cache": { "version": "0.2.1", @@ -7844,9 +7824,9 @@ } }, "fs-jetpack": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-4.3.0.tgz", - "integrity": "sha512-Zx4OJ8HyKvZL9sgxegMGRCgAJSQET5Cqpj/SESwnzqHruHvhkilJBGLoZf6EiYr3UWJDqcPoWDX7aAfaj7D9Qw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-4.3.1.tgz", + "integrity": "sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ==", "requires": { "minimatch": "^3.0.2", "rimraf": "^2.6.3" @@ -8071,9 +8051,9 @@ } }, "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "graphql": { "version": "15.8.0", @@ -8447,6 +8427,11 @@ "parse-passwd": "^1.0.0" } }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, "html-parse-stringify": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", @@ -8651,9 +8636,9 @@ } }, "i18next-http-middleware": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.1.4.tgz", - "integrity": "sha512-OVjxnw1w9RqhrOBSsXBXbk/7kzpLu+YvaL0LZnLHTCzjs8dMG8/BuoaDxi1l30T1lUfmweb+er/xwRHV3lp0RQ==" + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.1.5.tgz", + "integrity": "sha512-kk67719/uiURzRI9fhdfWjrM05ycXyPHHxGmqnFIsw55yHqEbfPgTl2JEA32lxYJclrr4qY2ifd/VVer4l+WMw==" }, "iconv-lite": { "version": "0.4.19", @@ -8666,9 +8651,9 @@ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "ignore-walk": { @@ -8971,9 +8956,9 @@ "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" }, "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "requires": { "has": "^1.0.3" @@ -9099,9 +9084,9 @@ } }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, "is-number": { "version": "7.0.0", @@ -9241,11 +9226,11 @@ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" }, "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" } }, "is-windows": { @@ -9316,9 +9301,9 @@ }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" }, "has-flag": { "version": "4.0.0", @@ -10168,9 +10153,9 @@ } }, "mdast-util-gfm-table": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.1.tgz", - "integrity": "sha512-NByKuaSg5+M6r9DZBPXFUmhMHGFf9u+WE76EeStN01ghi8hpnydiWBXr+qj0XCRWI7SAMNtEjGvip6zci9axQA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.2.tgz", + "integrity": "sha512-pPekvCTChFBF8uCq8bVyQwar8NBU/TaXIy44jj/UzmjMgPBHIa1B1ge8a0JVgzhqgXQAMvGT+PgiKlicdLGfDQ==", "requires": { "markdown-table": "^3.0.0", "mdast-util-to-markdown": "^1.0.0" @@ -10330,9 +10315,9 @@ } }, "micromark-extension-gfm-autolink-literal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.2.tgz", - "integrity": "sha512-z2Asd0v4iV/QoI1l23J1qB6G8IqVWTKmwdlP45YQfdGW47ZzpddyzSxZ78YmlucOLqIbS5H98ekKf9GunFfnLA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==", "requires": { "micromark-util-character": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", @@ -10342,9 +10327,9 @@ } }, "micromark-extension-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-PJKhBNyrNIo694ZQCE/FBBQOQSb6YC0Wi5Sv0OCah5XunnNaYbtak9CSv9/eq4YeFMMyd1jX84IRwUSE+7ioLA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz", + "integrity": "sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==", "requires": { "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", @@ -10355,9 +10340,9 @@ } }, "micromark-extension-gfm-table": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.4.tgz", - "integrity": "sha512-IK2yzl7ycXeFFvZ8qiH4j5am529ihjOFD7NMo8Nhyq+VGwgWe4+qeI925RRrJuEzX3KyQ+1vzY8BIIvqlgOJhw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz", + "integrity": "sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==", "requires": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -10367,17 +10352,17 @@ } }, "micromark-extension-gfm-tagfilter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.0.tgz", - "integrity": "sha512-GGUZhzQrOdHR8RHU2ru6K+4LMlj+pBdNuXRtw5prOflDOk2hHqDB0xEgej1AHJ2VETeycX7tzQh2EmaTUOmSKg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz", + "integrity": "sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==", "requires": { "micromark-util-types": "^1.0.0" } }, "micromark-extension-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-8AZib9xxPtppTKig/d00i9uKi96kVgoqin7+TRtGprDb8uTUrN1ZfJ38ga8yUdmu7EDQxr2xH8ltZdbCcmdshg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz", + "integrity": "sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==", "requires": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -10495,9 +10480,9 @@ } }, "micromark-util-encode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.0.tgz", - "integrity": "sha512-cJpFVM768h6zkd8qJ1LNRrITfY4gwFt+tziPcIf71Ui8yFzY9wG3snZQqiWVq93PG4Sw6YOtcNiKJfVIs9qfGg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", + "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==" }, "micromark-util-html-tag-name": { "version": "1.0.0", @@ -10751,9 +10736,9 @@ } }, "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + "version": "3.1.32", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.32.tgz", + "integrity": "sha512-F8mf7R3iT9bvThBoW4tGXhXFHCctyCiUUPrWF8WaTqa3h96d9QybkSeba43XVOOE3oiLfkVDe4bT8MeGmkrTxw==" }, "nanomatch": { "version": "1.2.13", @@ -11416,9 +11401,9 @@ } }, "keyv": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", - "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.5.tgz", + "integrity": "sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -11613,9 +11598,9 @@ } }, "object-inspect": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", - "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" }, "object-is": { "version": "1.1.5", @@ -12143,9 +12128,9 @@ "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pkg-dir": { "version": "4.2.0", @@ -12288,18 +12273,18 @@ } }, "prisma": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-3.6.0.tgz", - "integrity": "sha512-6SqgHS/5Rq6HtHjsWsTxlj+ySamGyCLBUQfotc2lStOjPv52IQuDVpp58GieNqc9VnfuFyHUvTZw7aQB+G2fvQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-3.8.1.tgz", + "integrity": "sha512-Q8zHwS9m70TaD7qI8u+8hTAmiTpK+IpvRYF3Rgb/OeWGQJOMgZCFFvNCiSfoLEQ95wilK7ctW3KOpc9AuYnRUA==", "dev": true, "requires": { - "@prisma/engines": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727" + "@prisma/engines": "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" } }, "prismjs": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", - "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ==" }, "process": { "version": "0.11.10", @@ -12345,13 +12330,13 @@ } }, "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "property-information": { @@ -12417,17 +12402,17 @@ "dev": true }, "qs": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.2.tgz", - "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "requires": { "side-channel": "^1.0.4" } }, "query-string": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.0.1.tgz", - "integrity": "sha512-uIw3iRvHnk9to1blJCG3BTc+Ro56CBowJXKmNNAm3RulvPBzWLRqKSiiDk+IplJhsydwtuNMHi8UGQFcCLVfkA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.0.tgz", + "integrity": "sha512-wnJ8covk+S9isYR5JIXPt93kFUmI2fQ4R/8130fuq+qwLiGVTurg7Klodgfw4NSz/oe7xnyi09y3lSrogUeM3g==", "requires": { "decode-uri-component": "^0.2.0", "filter-obj": "^1.1.0", @@ -12583,11 +12568,12 @@ "integrity": "sha512-bJvY348vayIvEUmSK7Fvea/NgqbT2racA2IbnJz/aPlQ3GBtaTeDITH6rtCa6y++obZzG6E3Q8VuoXPir7QYUg==" }, "react-i18next": { - "version": "11.14.3", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.14.3.tgz", - "integrity": "sha512-Hf2aanbKgYxPjG8ZdKr+PBz9sY6sxXuZWizxCYyJD2YzvJ0W9JTQcddVEjDaKyBoCyd3+5HTerdhc9ehFugc6g==", + "version": "11.15.3", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.15.3.tgz", + "integrity": "sha512-RSUEM4So3Tu2JHV0JsZ5Yje+4nz66YViMfPZoywxOy0xyn3L7tE2CHvJ7Y9LUsrTU7vGmZ5bwb8PpjnkatdIxg==", "requires": { "@babel/runtime": "^7.14.5", + "html-escaper": "^2.0.2", "html-parse-stringify": "^3.0.1" } }, @@ -12597,9 +12583,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-markdown": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-7.1.1.tgz", - "integrity": "sha512-bXS7indkcPlCLB6wRFFzX8Xdghr62TBxUF2587o+CUkaZlNaoILb2qNt+5pYmTZuCOC+OeEcdJ+06mu5whtCVQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-7.1.2.tgz", + "integrity": "sha512-ibMcc0EbfmbwApqJD8AUr0yls8BSrKzIbHaUsPidQljxToCqFh34nwtu3CXNEItcVJNzpjDHrhK8A+MAh2JW3A==", "requires": { "@types/hast": "^2.0.0", "@types/unist": "^2.0.0", @@ -12718,9 +12704,9 @@ } }, "vfile": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.2.0.tgz", - "integrity": "sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.0.tgz", + "integrity": "sha512-Tj44nY/48OQvarrE4FAjUfrv7GZOYzPbl5OD65HxVKwLJKMPU7zmfV8cCgCnzKWnSfYG2f3pxu+ALqs7j22xQQ==", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -12729,9 +12715,9 @@ } }, "vfile-message": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", - "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.0.tgz", + "integrity": "sha512-4QJbBk+DkPEhBXq3f260xSaWtjE4gPKOfulzfMFF8ZNwaPZieWsg3iVlcmF04+eebzpcpeXOOFMfrYzJHVYg+g==", "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^3.0.0" @@ -12838,9 +12824,9 @@ } }, "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -12897,44 +12883,45 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.16.7" } }, "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", "dev": true }, "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } @@ -12949,12 +12936,6 @@ "color-convert": "^2.0.1" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -13114,9 +13095,9 @@ } }, "vfile": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.2.0.tgz", - "integrity": "sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.0.tgz", + "integrity": "sha512-Tj44nY/48OQvarrE4FAjUfrv7GZOYzPbl5OD65HxVKwLJKMPU7zmfV8cCgCnzKWnSfYG2f3pxu+ALqs7j22xQQ==", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -13125,9 +13106,9 @@ } }, "vfile-message": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", - "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.0.tgz", + "integrity": "sha512-4QJbBk+DkPEhBXq3f260xSaWtjE4gPKOfulzfMFF8ZNwaPZieWsg3iVlcmF04+eebzpcpeXOOFMfrYzJHVYg+g==", "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^3.0.0" @@ -13192,9 +13173,9 @@ } }, "vfile": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.2.0.tgz", - "integrity": "sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.0.tgz", + "integrity": "sha512-Tj44nY/48OQvarrE4FAjUfrv7GZOYzPbl5OD65HxVKwLJKMPU7zmfV8cCgCnzKWnSfYG2f3pxu+ALqs7j22xQQ==", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -13203,9 +13184,9 @@ } }, "vfile-message": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", - "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.0.tgz", + "integrity": "sha512-4QJbBk+DkPEhBXq3f260xSaWtjE4gPKOfulzfMFF8ZNwaPZieWsg3iVlcmF04+eebzpcpeXOOFMfrYzJHVYg+g==", "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^3.0.0" @@ -13214,9 +13195,9 @@ } }, "remark-slate": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/remark-slate/-/remark-slate-1.8.0.tgz", - "integrity": "sha512-KYZCehGs4gTaEt5i0TQqSYnYTO3/EFZ4K3x9i4dVydEximrBZoRcIJcF4+cAnF5glJYaBQhdNvhHk3vINgP9vg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/remark-slate/-/remark-slate-1.8.2.tgz", + "integrity": "sha512-b/WFvUPZsGqyaQOr+8WS/NDmLaiHiTt3lw3+V91S96PLvqr30ryngxO+XjMxqzZzKUO5DpYimWbfhtb68iNXFw==", "requires": { "@types/escape-html": "^1.0.0", "escape-html": "^1.0.3" @@ -13298,9 +13279,9 @@ } }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "uuid": { @@ -13335,13 +13316,14 @@ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", + "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { @@ -13450,9 +13432,9 @@ } }, "sade": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", - "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "requires": { "mri": "^1.1.0" } @@ -13538,9 +13520,9 @@ "dev": true }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dev": true, "requires": { "debug": "2.6.9", @@ -13550,9 +13532,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -13575,35 +13557,10 @@ } } }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -13629,15 +13586,15 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "set-blocking": { @@ -13770,14 +13727,6 @@ "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", "totalist": "^1.0.0" - }, - "dependencies": { - "totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "dev": true - } } }, "sisteransi": { @@ -14056,9 +14005,9 @@ "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -14305,18 +14254,18 @@ "dev": true }, "stripe": { - "version": "8.191.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-8.191.0.tgz", - "integrity": "sha512-3oyuIbuW3WDsbGnMUtIZPkr+sOUJ3NEtEwghd81ZuWc+Tq09MrgWXGekbVnbxA3TMFwfKOILw6QoiPA7za4JUg==", + "version": "8.197.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-8.197.0.tgz", + "integrity": "sha512-EQLgqFiX1wNQEeve6QnUcGIby6XtXXzbzEWPJiZ68qFj02YFjNjLLxl9atueKgUQ+YRbrMAlrc6ECwvm+cf/Rw==", "requires": { "@types/node": ">=8.1.0", "qs": "^6.6.0" }, "dependencies": { "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" } } }, @@ -14356,9 +14305,9 @@ } }, "stylis": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz", - "integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg==" + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" }, "stylis-rule-sheet": { "version": "0.0.10", @@ -14392,6 +14341,12 @@ "has-flag": "^3.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -14493,9 +14448,9 @@ } }, "swot-node": { - "version": "2.0.304", - "resolved": "https://registry.npmjs.org/swot-node/-/swot-node-2.0.304.tgz", - "integrity": "sha512-IA++4G4Dhr2OkanzgrgWwfwTGrIqbS91aycOhHGcn2nbe0WNROdi72NuKYPQfu6JmuJj4FWMjJ2PNADDjucMZg==", + "version": "2.0.343", + "resolved": "https://registry.npmjs.org/swot-node/-/swot-node-2.0.343.tgz", + "integrity": "sha512-r4dejeTYPrOsiv5VrcEn34zrR1grsnh+dUSR6sOtEOO2VPyXHuF5NX2ibbXzxGtVPt4nQpdjlaEafeBhHA3unw==", "requires": { "academic-tld": "^1.0.4", "tldjs": "2.3.1" @@ -14529,9 +14484,9 @@ } }, "table": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.5.tgz", - "integrity": "sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -14542,9 +14497,9 @@ }, "dependencies": { "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -14872,9 +14827,10 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "totalist": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz", - "integrity": "sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true }, "tough-cookie": { "version": "2.5.0", @@ -15343,15 +15299,14 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "uvu": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.2.tgz", - "integrity": "sha512-m2hLe7I2eROhh+tm3WE5cTo/Cv3WQA7Oc9f7JB6uWv+/zVKvfAm53bMyOoGOSZeQ7Ov2Fu9pLhFr7p07bnT20w==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.3.tgz", + "integrity": "sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==", "requires": { "dequal": "^2.0.0", "diff": "^5.0.0", "kleur": "^4.0.3", - "sade": "^1.7.3", - "totalist": "^2.0.0" + "sade": "^1.7.3" }, "dependencies": { "diff": { diff --git a/packages/web/package.json b/packages/web/package.json index 8e4a30d3e..9ec9f0c74 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -39,7 +39,7 @@ "dependencies": { "@apollo/client": "^3.3.12", "@apollo/react-ssr": "^4.0.0", - "@journaly/j-db-client": "file://../j-db-client/journaly-j-db-client-14.0.0-ALPHA1.tgz", + "@journaly/j-db-client": "file://../j-db-client/journaly-j-db-client-14.0.0-ALPHA5.tgz", "@stripe/react-stripe-js": "^1.2.2", "@stripe/stripe-js": "^1.12.1", "@types/bcryptjs": "^2.4.2", diff --git a/packages/web/resolvers/user.ts b/packages/web/resolvers/user.ts index ed2a3e9bc..cfc279d98 100644 --- a/packages/web/resolvers/user.ts +++ b/packages/web/resolvers/user.ts @@ -35,7 +35,7 @@ const DatedActivityCount = objectType({ }, }) -const User = objectType({ +const UserType = objectType({ name: User.$name, definition(t) { t.field(User.id) @@ -223,7 +223,7 @@ const InitiateAvatarImageUploadResponse = objectType({ }, }) -const UserBadge = objectType({ +const UserBadgeType = objectType({ name: UserBadge.$name, definition(t) { t.field(UserBadge.id) @@ -678,8 +678,8 @@ const UserMutations = extendType({ type: InAppNotificationType.NEW_FOLLOWER, key: {}, subNotification: { - followingUserId: follower.id - } + followingUserId: follower.id, + }, }) return follower @@ -784,8 +784,8 @@ const UserMutations = extendType({ }) export default [ - User, - UserBadge, + UserType, + UserBadgeType, UserQueries, UserMutations, InitiateAvatarImageUploadResponse, From c6420973689dc80cdab7b71a90df6138e5cf4733 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sun, 16 Jan 2022 14:15:53 +0000 Subject: [PATCH 07/18] Another big push --- packages/web/resolvers/clap.ts | 19 +- packages/web/resolvers/comment.ts | 59 ++-- packages/web/resolvers/headlineImage.ts | 13 +- packages/web/resolvers/language.ts | 27 +- packages/web/resolvers/notification.ts | 112 ++++--- packages/web/resolvers/post.ts | 74 ++--- packages/web/resolvers/socialMedia.ts | 17 +- packages/web/resolvers/subscription.ts | 370 ++++++++++++------------ packages/web/resolvers/thanks.ts | 17 +- packages/web/resolvers/topic.ts | 33 ++- 10 files changed, 388 insertions(+), 353 deletions(-) diff --git a/packages/web/resolvers/clap.ts b/packages/web/resolvers/clap.ts index 841bfc81a..93bf3f8fa 100644 --- a/packages/web/resolvers/clap.ts +++ b/packages/web/resolvers/clap.ts @@ -1,13 +1,15 @@ import { extendType, intArg, objectType } from 'nexus' import { EmailNotificationType, InAppNotificationType } from '@journaly/j-db-client' import { createInAppNotification, createEmailNotification, hasAuthorPermissions } from './utils' +import { PostClap } from 'nexus-prisma' -const PostClap = objectType({ - name: 'PostClap', +const PostClapType = objectType({ + name: PostClap.$name, + description: PostClap.$description, definition(t) { - t.model.id() - t.model.author() - t.model.post() + t.field(PostClap.id) + t.field(PostClap.author) + t.field(PostClap.post) }, }) @@ -60,14 +62,13 @@ const PostClapMutations = extendType({ postClap, }) - await createInAppNotification(ctx.db, { userId: post.authorId, type: InAppNotificationType.POST_CLAP, - key: { postId: post.id, }, + key: { postId: post.id }, subNotification: { postClapId: postClap.id, - } + }, }) return postClap @@ -115,4 +116,4 @@ const PostClapMutations = extendType({ }, }) -export default [PostClap, PostClapMutations] +export default [PostClapType, PostClapMutations] diff --git a/packages/web/resolvers/comment.ts b/packages/web/resolvers/comment.ts index dc7fc01b2..e36866228 100644 --- a/packages/web/resolvers/comment.ts +++ b/packages/web/resolvers/comment.ts @@ -14,6 +14,7 @@ import { LanguageLevel, PrismaClient, } from '@journaly/j-db-client' +import { Comment, PostComment, Thread } from 'nexus-prisma' import { hasAuthorPermissions, @@ -25,16 +26,16 @@ import { } from './utils' import { NotFoundError } from './errors' -const Thread = objectType({ - name: 'Thread', +const ThreadType = objectType({ + name: Thread.$name, definition(t) { - t.model.id() - t.model.archived() - t.model.startIndex() - t.model.endIndex() - t.model.highlightedContent() - t.model.postId() - t.model.comments({ + t.field(Thread.id) + t.field(Thread.archived) + t.field(Thread.startIndex) + t.field(Thread.endIndex) + t.field(Thread.highlightedContent) + t.field(Thread.postId) + t.field(Thread.comments, { pagination: false, ordering: { createdAt: true, @@ -43,31 +44,30 @@ const Thread = objectType({ }, }) -const Comment = objectType({ - name: 'Comment', +const CommentType = objectType({ + name: Comment.$name, definition(t) { - t.model.id() - t.model.author() - t.model.body() - t.model.createdAt() - t.model.authorLanguageLevel() - t.model.thanks({ pagination: false }) - t.model.thread() + t.field(Comment.id) + t.field(Comment.author) + t.field(Comment.body) + t.field(Comment.createdAt) + t.field(Comment.authorLanguageLevel) + t.field(Comment.thanks, { pagination: false }) + t.field(Comment.thread) }, }) -const PostComment = objectType({ - name: 'PostComment', +const PostCommentType = objectType({ + name: PostComment.$name, definition(t) { - t.model.id() - t.model.author() - t.model.body() - t.model.createdAt() - t.model.authorLanguageLevel() + t.field(PostComment.id) + t.field(PostComment.author) + t.field(PostComment.body) + t.field(PostComment.createdAt) + t.field(PostComment.authorLanguageLevel) }, }) - type CreateCommentArg = { thread: ThreadWithRels<{ subscriptions: { user: true } @@ -595,9 +595,4 @@ const CommentMutations = extendType({ }, }) -export default [ - Thread, - Comment, - PostComment, - CommentMutations, -] +export default [ThreadType, CommentType, PostCommentType, CommentMutations] diff --git a/packages/web/resolvers/headlineImage.ts b/packages/web/resolvers/headlineImage.ts index f831540e0..3c11e9495 100644 --- a/packages/web/resolvers/headlineImage.ts +++ b/packages/web/resolvers/headlineImage.ts @@ -1,12 +1,13 @@ import { objectType } from 'nexus' +import { HeadlineImage } from 'nexus-prisma' -const HeadlineImage = objectType({ - name: 'HeadlineImage', +const HeadlineImageType = objectType({ + name: HeadlineImage.$name, definition(t) { - t.model.id() - t.model.smallSize() - t.model.largeSize() + t.field(HeadlineImage.id) + t.field(HeadlineImage.smallSize) + t.field(HeadlineImage.largeSize) }, }) -export default [HeadlineImage] +export default [HeadlineImageType] diff --git a/packages/web/resolvers/language.ts b/packages/web/resolvers/language.ts index 91a52544f..2ff68dd1c 100644 --- a/packages/web/resolvers/language.ts +++ b/packages/web/resolvers/language.ts @@ -1,23 +1,24 @@ import { arg, booleanArg, intArg, objectType, extendType } from 'nexus' import { PostStatus } from '@journaly/j-db-client' +import { LanguageRelation, Language } from 'nexus-prisma' -const LanguageRelation = objectType({ - name: 'LanguageRelation', +const LanguageRelationType = objectType({ + name: LanguageRelation.$name, definition(t) { - t.model.id() - t.model.language() - t.model.level() + t.field(LanguageRelation.id) + t.field(LanguageRelation.language) + t.field(LanguageRelation.level) }, }) -const Language = objectType({ - name: 'Language', +const LanguageType = objectType({ + name: Language.$name, definition(t) { - t.model.id() - t.model.name() - t.model.devName() - t.model.posts({ pagination: false }) - t.model.dialect() + t.field(Language.id) + t.field(Language.name) + t.field(Language.devName) + t.field(Language.posts, { pagination: false }) + t.field(Language.dialect) t.int('postCount', { resolve(parent, _, ctx) { return ctx.db.post.count({ @@ -143,4 +144,4 @@ const LanguageMutations = extendType({ }, }) -export default [LanguageRelation, Language, LanguageQueries, LanguageMutations] +export default [LanguageRelationType, LanguageType, LanguageQueries, LanguageMutations] diff --git a/packages/web/resolvers/notification.ts b/packages/web/resolvers/notification.ts index 1e4c62997..bd6de7b51 100644 --- a/packages/web/resolvers/notification.ts +++ b/packages/web/resolvers/notification.ts @@ -1,70 +1,86 @@ import { arg, extendType, intArg, objectType } from 'nexus' +import { + InAppNotification, + ThreadCommentNotification, + PostCommentNotification, + NewPostNotification, + NewFollowerNotification, + PostClapNotification, + ThreadCommentThanksNotification, +} from 'nexus-prisma' -const InAppNotification = objectType({ - name: 'InAppNotification', +const InAppNotificationType = objectType({ + name: InAppNotification.$name, + description: InAppNotification.$description, definition(t) { - t.model.id() - t.model.userId() - t.model.type() - t.model.bumpedAt() - t.model.readStatus() - t.model.post() - t.model.readStatus() - t.model.triggeringUser() - t.model.threadCommentNotifications({ pagination: false }) - t.model.postCommentNotifications({ pagination: false }) - t.model.newFollowerNotifications({ pagination: false }) - t.model.postClapNotifications({ pagination: false }) - t.model.threadCommentThanksNotifications({ pagination: false }) - t.model.newPostNotifications({ pagination: false }) + t.field(InAppNotification.id) + t.field(InAppNotification.userId) + t.field(InAppNotification.type) + t.field(InAppNotification.bumpedAt) + t.field(InAppNotification.readStatus) + t.field(InAppNotification.post) + t.field(InAppNotification.readStatus) + t.field(InAppNotification.triggeringUser) + t.field(InAppNotification.threadCommentNotifications, { pagination: false }) + t.field(InAppNotification.postCommentNotifications, { pagination: false }) + t.field(InAppNotification.newFollowerNotifications, { pagination: false }) + t.field(InAppNotification.postClapNotifications, { pagination: false }) + t.field(InAppNotification.threadCommentThanksNotifications, { pagination: false }) + t.field(InAppNotification.newPostNotifications, { pagination: false }) }, }) -const ThreadCommentNotification = objectType({ - name: 'ThreadCommentNotification', +const ThreadCommentNotificationType = objectType({ + name: ThreadCommentNotification.$name, + description: ThreadCommentNotification.$description, definition(t) { - t.model.id() - t.model.comment() + t.field(ThreadCommentNotification.id) + t.field(ThreadCommentNotification.comment) }, }) -const PostCommentNotification = objectType({ - name: 'PostCommentNotification', +const PostCommentNotificationType = objectType({ + name: PostCommentNotification.$name, + description: PostCommentNotification.$description, definition(t) { - t.model.id() - t.model.postComment() + t.field(PostCommentNotification.id) + t.field(PostCommentNotification.postComment) }, }) -const NewFollowerNotification = objectType({ - name: 'NewFollowerNotification', +const NewFollowerNotificationType = objectType({ + name: NewFollowerNotification.$name, + description: NewFollowerNotification.$description, definition(t) { - t.model.id() - t.model.followingUser() + t.field(NewFollowerNotification.id) + t.field(NewFollowerNotification.followingUser) }, }) -const PostClapNotification = objectType({ - name: 'PostClapNotification', +const PostClapNotificationType = objectType({ + name: PostClapNotification.$name, + description: PostClapNotification.$description, definition(t) { - t.model.id() - t.model.postClap() + t.field(PostClapNotification.id) + t.field(PostClapNotification.postClap) }, }) -const ThreadCommentThanksNotification = objectType({ - name: 'ThreadCommentThanksNotification', +const ThreadCommentThanksNotificationType = objectType({ + name: ThreadCommentThanksNotification.$name, + description: ThreadCommentThanksNotification.$description, definition(t) { - t.model.id() - t.model.thanks() + t.field(ThreadCommentThanksNotification.id) + t.field(ThreadCommentThanksNotification.thanks) }, }) -const NewPostNotification = objectType({ - name: 'NewPostNotification', +const NewPostNotificationType = objectType({ + name: NewPostNotification.$name, + description: NewPostNotification.$description, definition(t) { - t.model.id() - t.model.post() + t.field(NewPostNotification.id) + t.field(NewPostNotification.post) }, }) @@ -129,7 +145,7 @@ const NotificationMutations = extendType({ id: args.notificationId, }, }) - + if (!notification) { throw new Error('Notification not found') } @@ -147,12 +163,12 @@ const NotificationMutations = extendType({ }) export default [ - InAppNotification, - ThreadCommentNotification, - PostCommentNotification, - NewFollowerNotification, - PostClapNotification, - ThreadCommentThanksNotification, - NewPostNotification, + InAppNotificationType, + ThreadCommentNotificationType, + PostCommentNotificationType, + NewFollowerNotificationType, + PostClapNotificationType, + ThreadCommentThanksNotificationType, + NewPostNotificationType, NotificationMutations, ] diff --git a/packages/web/resolvers/post.ts b/packages/web/resolvers/post.ts index a9171d31c..81fb212c2 100644 --- a/packages/web/resolvers/post.ts +++ b/packages/web/resolvers/post.ts @@ -24,7 +24,6 @@ import { import { NotFoundError, NotAuthorizedError, ResolverError } from './errors' import { Prisma, - Post, PostStatus, BadgeType, PrismaClient, @@ -34,6 +33,7 @@ import { EmailVerificationStatus, InAppNotificationType, } from '@journaly/j-db-client' +import { Post, PostTopic } from 'nexus-prisma' import { EditorNode, HeadlineImageInput } from './inputTypes' import { POST_BUMP_LIMIT } from '../constants' @@ -88,45 +88,47 @@ const assignPostCountBadges = async (db: PrismaClient, userId: number): Promise< } } -const PostTopic = objectType({ - name: 'PostTopic', +const PostTopicType = objectType({ + name: PostTopic.$name, definition(t) { - t.model.id() - t.model.post() - t.model.topic() + t.field(PostTopic.id) + t.field(PostTopic.post) + t.field(PostTopic.topic) }, }) -const PostObjectType = objectType({ - name: 'Post', +const PostType = objectType({ + name: Post.$name, definition(t) { - t.model.id() - t.model.title() - t.model.body() - t.model.excerpt() - t.model.readTime() - t.model.author() - t.model.authorId() - t.model.status() - t.model.claps({ pagination: false }) - t.model.threads({ pagination: false }) - t.model.postTopics({ type: 'PostTopic', pagination: false }) - t.model.postComments({ - pagination: false, - ordering: { - createdAt: true, - }, - }) - t.model.language() - t.model.publishedLanguageLevel() - t.model.privateShareId() - t.model.createdAt() - t.model.updatedAt() - t.model.bodySrc() - t.model.headlineImage() - t.model.publishedAt() - t.model.bumpedAt() - t.model.bumpCount() + t.field(Post.id) + t.field(Post.title) + t.field(Post.body) + t.field(Post.excerpt) + t.field(Post.readTime) + t.field(Post.author) + t.field(Post.authorId) + t.field(Post.status) + t.field(Post.claps({ pagination: false })) + t.field(Post.threads({ pagination: false })) + t.field(Post.postTopics({ type: 'PostTopic', pagination: false })) + t.field( + Post.postComments({ + pagination: false, + ordering: { + createdAt: true, + }, + }), + ) + t.field(Post.language) + t.field(Post.publishedLanguageLevel) + t.field(Post.privateShareId) + t.field(Post.createdAt) + t.field(Post.updatedAt) + t.field(Post.bodySrc) + t.field(Post.headlineImage) + t.field(Post.publishedAt) + t.field(Post.bumpedAt) + t.field(Post.bumpCount) t.int('commentCount', { resolve: async (parent, _args, ctx, _info) => { const [threadCommentCount, postCommentCount] = await Promise.all([ @@ -931,7 +933,7 @@ const PostMutations = extendType({ export default [ PostTopic, - PostObjectType, + PostType, PostPage, InitiatePostImageUploadResponse, InitiateInlinePostImageUploadResponse, diff --git a/packages/web/resolvers/socialMedia.ts b/packages/web/resolvers/socialMedia.ts index ce837f1e2..e44c3b268 100644 --- a/packages/web/resolvers/socialMedia.ts +++ b/packages/web/resolvers/socialMedia.ts @@ -1,15 +1,16 @@ import { stringArg, objectType, extendType } from 'nexus' import { NotAuthorizedError, UserInputError } from './errors' import { validateSocialMediaInput } from './utils/socialMedia' +import { SocialMedia } from 'nexus-prisma' -const SocialMedia = objectType({ - name: 'SocialMedia', +const SocialMediaType = objectType({ + name: SocialMedia.$name, definition(t) { - t.model.id() - t.model.facebook() - t.model.youtube() - t.model.instagram() - t.model.website() + t.field(SocialMedia.id) + t.field(SocialMedia.facebook) + t.field(SocialMedia.youtube) + t.field(SocialMedia.instagram) + t.field(SocialMedia.website) }, }) @@ -68,4 +69,4 @@ const SocialMediaMutations = extendType({ }, }) -export default [SocialMedia, SocialMediaMutations] +export default [SocialMediaType, SocialMediaMutations] diff --git a/packages/web/resolvers/subscription.ts b/packages/web/resolvers/subscription.ts index 81179a1f8..0c7d241a2 100644 --- a/packages/web/resolvers/subscription.ts +++ b/packages/web/resolvers/subscription.ts @@ -15,23 +15,24 @@ import stripe, { paymentErrorWrapper } from '@/nexus/utils/stripe' import { sendPremiumWelcomeEmail } from './utils' +import { MembershipSubscription } from 'nexus-prisma' -const MembershipSubscription = objectType({ - name: 'MembershipSubscription', +const MembershipSubscriptionType = objectType({ + name: MembershipSubscription.$name, definition(t) { - t.model.id() - t.model.period() - t.model.userId() - t.model.expiresAt() - t.model.nextBillingDate() - t.model.cancelAtPeriodEnd() + t.field(MembershipSubscription.id) + t.field(MembershipSubscription.period) + t.field(MembershipSubscription.userId) + t.field(MembershipSubscription.expiresAt) + t.field(MembershipSubscription.nextBillingDate) + t.field(MembershipSubscription.cancelAtPeriodEnd) t.boolean('isActive', { resolve: async (parent, _args, _ctx, _info) => { if (parent.expiresAt && parent.expiresAt < new Date(Date.now())) return false return true - } + }, }) - } + }, }) const getSubscriptionPriceId = (subType: MembershipSubscriptionPeriod) => { @@ -52,14 +53,14 @@ const setPaymentMethod = async ( paymentMethodId: string, ) => { const customer = await stripe.customers.retrieve(customerId) - - if (!customer) throw new Error("User has stripeCustomerId but unable to find customer in Stripe") + + if (!customer) throw new Error('User has stripeCustomerId but unable to find customer in Stripe') const stripePaymentMethod = await stripe.paymentMethods.attach(paymentMethodId, { customer: customer.id, }) - if (!stripePaymentMethod.card) throw new Error("Unable to retrieve payment method") + if (!stripePaymentMethod.card) throw new Error('Unable to retrieve payment method') await stripe.customers.update(customer.id, { invoice_settings: { @@ -91,14 +92,16 @@ const setPlan = async ( const subscriptionUpdated = await stripe.subscriptions.update(stripeSubscription.id, { payment_behavior: 'pending_if_incomplete', proration_behavior: 'always_invoice', - items: [{ - id: stripeSubscription.items.data[0].id, - price: getSubscriptionPriceId(subscriptionPeriod), - }], + items: [ + { + id: stripeSubscription.items.data[0].id, + price: getSubscriptionPriceId(subscriptionPeriod), + }, + ], }) if (subscriptionUpdated.pending_update) { // Payment failed - throw new Error("Unable to update subscription, possible payment failure") + throw new Error('Unable to update subscription, possible payment failure') } if (subscriptionUpdated.cancel_at_period_end !== cancelAtPeriodEnd) { // For unknown reasons we are unable to set the `cancel_at_period_end` @@ -114,8 +117,10 @@ const setPlan = async ( }, data: { period: subscriptionPeriod, - expiresAt: new Date(subscriptionUpdated.current_period_end * 1000 + (24 * 60 * 60 * 1000 * 2)), - nextBillingDate: subscriptionUpdated.cancel_at_period_end ? null : new Date(subscriptionUpdated.current_period_end * 1000), + expiresAt: new Date(subscriptionUpdated.current_period_end * 1000 + 24 * 60 * 60 * 1000 * 2), + nextBillingDate: subscriptionUpdated.cancel_at_period_end + ? null + : new Date(subscriptionUpdated.current_period_end * 1000), stripeSubscription: subscriptionUpdated as unknown as Prisma.InputJsonValue, cancelAtPeriodEnd, }, @@ -131,150 +136,168 @@ const MembershipSubscriptionMutations = extendType({ period: arg({ type: 'MembershipSubscriptionPeriod', required: true }), paymentMethodId: stringArg({ required: true }), }, - resolve: (_parent, args, ctx) => paymentErrorWrapper(async () => { - const { userId } = ctx.request + resolve: (_parent, args, ctx) => + paymentErrorWrapper(async () => { + const { userId } = ctx.request - if (!userId) { - throw new Error("You must be logged in to create a subscription") - } - - const user = await ctx.db.user.findUnique({ - where: { - id: userId, - }, - include: { - membershipSubscription: true, + if (!userId) { + throw new Error('You must be logged in to create a subscription') } - }) - if (!user) throw new Error("User not found") - if (args.period === MembershipSubscriptionPeriod.STUDENT_ANNUALLY && !user.isStudent) { - throw new Error('You must have a student email address to get the student discount price') - } + const user = await ctx.db.user.findUnique({ + where: { + id: userId, + }, + include: { + membershipSubscription: true, + }, + }) - const customerId = await getOrCreateStripeCustomer(user, ctx.db) + if (!user) throw new Error('User not found') + if (args.period === MembershipSubscriptionPeriod.STUDENT_ANNUALLY && !user.isStudent) { + throw new Error( + 'You must have a student email address to get the student discount price', + ) + } - const stripePaymentMethod = await setPaymentMethod(userId, ctx.db, customerId, args.paymentMethodId) - if (!stripePaymentMethod.card) throw new Error("Received a non-card payment method") + const customerId = await getOrCreateStripeCustomer(user, ctx.db) - let subscriptionIsFullyExpired = false + const stripePaymentMethod = await setPaymentMethod( + userId, + ctx.db, + customerId, + args.paymentMethodId, + ) + if (!stripePaymentMethod.card) throw new Error('Received a non-card payment method') - // If we have a subscription record but the subscription has ended - // because the billing period dates need to change (also stripe just - // won't let us re-activate a supscription that's full canceled) - if (user.membershipSubscription) { - const stripeSubscription = await stripe.subscriptions.retrieve( - user.membershipSubscription.stripeSubscriptionId - ) + let subscriptionIsFullyExpired = false - if (stripeSubscription.ended_at) { - subscriptionIsFullyExpired = true - } - } - - if (!user.membershipSubscription || subscriptionIsFullyExpired) { - - // If we're in dev or stage, create subscription with a trial period - // that expires 5 minutes from the current time in order to test - // recurring payments - const trialEnd = ( - process.env.NODE_ENV === 'development' || - process.env.VERCEL_GIT_COMMIT_REF === 'staging' - ) ? ~~(Date.now() / 1000 + 300) : undefined - - const stripeSubscription = await stripe.subscriptions.create({ - items: [{ - price: getSubscriptionPriceId(args.period), - metadata: { - journalyUserId: userId, - }, - }], - customer: customerId, - trial_end: trialEnd - }) + // If we have a subscription record but the subscription has ended + // because the billing period dates need to change (also stripe just + // won't let us re-activate a supscription that's full canceled) + if (user.membershipSubscription) { + const stripeSubscription = await stripe.subscriptions.retrieve( + user.membershipSubscription.stripeSubscriptionId, + ) - const membershipSubscriptionData = { - period: args.period, - // Give 2 days grace period - expiresAt: new Date(stripeSubscription.current_period_end * 1000 + (24 * 60 * 60 * 1000 * 2)), - nextBillingDate: new Date(stripeSubscription.current_period_end * 1000), - // We weren't smart enough to make TS know that Stripe.Response & InputJsonValue are comparable :'( - stripeSubscription: stripeSubscription as unknown as Prisma.InputJsonValue, - stripeSubscriptionId: stripeSubscription.id, + if (stripeSubscription.ended_at) { + subscriptionIsFullyExpired = true + } } - - let membershipSubscription - if (user.membershipSubscription) { - membershipSubscription = await ctx.db.membershipSubscription.update({ - where: { userId }, - data: membershipSubscriptionData + if (!user.membershipSubscription || subscriptionIsFullyExpired) { + // If we're in dev or stage, create subscription with a trial period + // that expires 5 minutes from the current time in order to test + // recurring payments + const trialEnd = + process.env.NODE_ENV === 'development' || + process.env.VERCEL_GIT_COMMIT_REF === 'staging' + ? ~~(Date.now() / 1000 + 300) + : undefined + + const stripeSubscription = await stripe.subscriptions.create({ + items: [ + { + price: getSubscriptionPriceId(args.period), + metadata: { + journalyUserId: userId, + }, + }, + ], + customer: customerId, + trial_end: trialEnd, }) + + const membershipSubscriptionData = { + period: args.period, + // Give 2 days grace period + expiresAt: new Date( + stripeSubscription.current_period_end * 1000 + 24 * 60 * 60 * 1000 * 2, + ), + nextBillingDate: new Date(stripeSubscription.current_period_end * 1000), + // We weren't smart enough to make TS know that Stripe.Response & InputJsonValue are comparable :'( + stripeSubscription: stripeSubscription as unknown as Prisma.InputJsonValue, + stripeSubscriptionId: stripeSubscription.id, + } + + let membershipSubscription + + if (user.membershipSubscription) { + membershipSubscription = await ctx.db.membershipSubscription.update({ + where: { userId }, + data: membershipSubscriptionData, + }) + } else { + membershipSubscription = await ctx.db.membershipSubscription.create({ + data: { + ...membershipSubscriptionData, + user: { connect: { id: userId } }, + }, + }) + } + + await sendPremiumWelcomeEmail({ user }) + + return membershipSubscription } else { - membershipSubscription = await ctx.db.membershipSubscription.create({ - data: { - ...membershipSubscriptionData, - user: { connect: { id: userId, }, } - }, - }) + const membershipSubscription = await setPlan( + userId, + ctx.db, + user.membershipSubscription.stripeSubscriptionId, + args.period, + false, + ) + return membershipSubscription } - - await sendPremiumWelcomeEmail({ user }) - - return membershipSubscription - } else { - const membershipSubscription = await setPlan( - userId, - ctx.db, - user.membershipSubscription.stripeSubscriptionId, - args.period, - false, - ) - return membershipSubscription - } - }), + }), }) t.field('updateSubscriptionRenewal', { type: 'MembershipSubscription', args: { cancelAtPeriodEnd: booleanArg({ required: true }), }, - resolve: async (_parent, args, ctx) => paymentErrorWrapper(async () => { - const { userId } = ctx.request - - if (!userId) { - throw new Error("You must be logged in to create a subscription") - } + resolve: async (_parent, args, ctx) => + paymentErrorWrapper(async () => { + const { userId } = ctx.request - const user = await ctx.db.user.findUnique({ - where: { - id: userId, - }, - include: { - membershipSubscription: true, + if (!userId) { + throw new Error('You must be logged in to create a subscription') } - }) - if (!user) throw new Error("User not found") - if (!user?.membershipSubscription?.stripeSubscriptionId) { - throw new Error("User has no subscription to cancel") - } - - const updatedSubscription = await stripe.subscriptions.update(user.membershipSubscription.stripeSubscriptionId, { - cancel_at_period_end: args.cancelAtPeriodEnd, - }) + const user = await ctx.db.user.findUnique({ + where: { + id: userId, + }, + include: { + membershipSubscription: true, + }, + }) - // simply update our equivalent of cancel_at_period_end and let expire at end of current period - return await ctx.db.membershipSubscription.update({ - where: { - userId, - }, - data: { - cancelAtPeriodEnd: args.cancelAtPeriodEnd, - nextBillingDate: args.cancelAtPeriodEnd ? null : new Date(updatedSubscription.current_period_end * 1000), + if (!user) throw new Error('User not found') + if (!user?.membershipSubscription?.stripeSubscriptionId) { + throw new Error('User has no subscription to cancel') } - }) - }), + + const updatedSubscription = await stripe.subscriptions.update( + user.membershipSubscription.stripeSubscriptionId, + { + cancel_at_period_end: args.cancelAtPeriodEnd, + }, + ) + + // simply update our equivalent of cancel_at_period_end and let expire at end of current period + return await ctx.db.membershipSubscription.update({ + where: { + userId, + }, + data: { + cancelAtPeriodEnd: args.cancelAtPeriodEnd, + nextBillingDate: args.cancelAtPeriodEnd + ? null + : new Date(updatedSubscription.current_period_end * 1000), + }, + }) + }), }) t.field('updateSubscriptionPlan', { type: 'MembershipSubscription', @@ -285,7 +308,7 @@ const MembershipSubscriptionMutations = extendType({ const { userId } = ctx.request if (!userId) { - throw new Error("You must be logged in to update a subscription") + throw new Error('You must be logged in to update a subscription') } const user = await ctx.db.user.findUnique({ @@ -294,12 +317,12 @@ const MembershipSubscriptionMutations = extendType({ }, include: { membershipSubscription: true, - } + }, }) - if (!user) throw new Error("User not found") + if (!user) throw new Error('User not found') if (!user?.membershipSubscription?.stripeSubscriptionId) { - throw new Error("User has no subscription to update") + throw new Error('User has no subscription to update') } return setPlan( @@ -309,50 +332,43 @@ const MembershipSubscriptionMutations = extendType({ args.period, false, ) - } + }, }) t.field('updateSubscriptionPaymentMethod', { type: 'MembershipSubscription', args: { paymentMethodId: stringArg({ required: true }), }, - resolve: async (_parent, args, ctx) => paymentErrorWrapper(async () => { - const { userId } = ctx.request + resolve: async (_parent, args, ctx) => + paymentErrorWrapper(async () => { + const { userId } = ctx.request - if (!userId) { - throw new Error("You must be logged in to update a payment method") - } - - const user = await ctx.db.user.findUnique({ - where: { - id: userId, - }, - include: { - membershipSubscription: true, + if (!userId) { + throw new Error('You must be logged in to update a payment method') } - }) - if (!user) throw new Error("User not found") - if (!user?.membershipSubscription?.stripeSubscriptionId) { - throw new Error("User has no subscription to update") - } - if (!user?.stripeCustomerId) { - throw new Error('User has no stripeCustomerId') - } + const user = await ctx.db.user.findUnique({ + where: { + id: userId, + }, + include: { + membershipSubscription: true, + }, + }) - await setPaymentMethod( - userId, - ctx.db, - user.stripeCustomerId, - args.paymentMethodId, - ) - return user.membershipSubscription - }), + if (!user) throw new Error('User not found') + if (!user?.membershipSubscription?.stripeSubscriptionId) { + throw new Error('User has no subscription to update') + } + if (!user?.stripeCustomerId) { + throw new Error('User has no stripeCustomerId') + } + + await setPaymentMethod(userId, ctx.db, user.stripeCustomerId, args.paymentMethodId) + return user.membershipSubscription + }), }) - } + }, }) -export default [ - MembershipSubscription, - MembershipSubscriptionMutations, -] +export default [MembershipSubscriptionType, MembershipSubscriptionMutations] diff --git a/packages/web/resolvers/thanks.ts b/packages/web/resolvers/thanks.ts index ee89f6b6d..6653fad19 100644 --- a/packages/web/resolvers/thanks.ts +++ b/packages/web/resolvers/thanks.ts @@ -8,14 +8,15 @@ import { createEmailNotification, hasAuthorPermissions } from './utils' +import { CommentThanks } from 'nexus-prisma' -const CommentThanks = objectType({ - name: 'CommentThanks', +const CommentThanksType = objectType({ + name: CommentThanks.$name, definition(t) { - t.model.id() - t.model.commentId() - t.model.author() - t.model.comment() + t.field(CommentThanks.id) + t.field(CommentThanks.commentId) + t.field(CommentThanks.author) + t.field(CommentThanks.comment) }, }) @@ -82,7 +83,7 @@ const ThanksMutations = extendType({ }, subNotification: { thanksId: commentThanks.id, - } + }, }) return commentThanks @@ -142,4 +143,4 @@ const ThanksMutations = extendType({ }, }) -export default [CommentThanks, ThanksMutations] +export default [CommentThanksType, ThanksMutations] diff --git a/packages/web/resolvers/topic.ts b/packages/web/resolvers/topic.ts index 0058085af..d76dafa8e 100644 --- a/packages/web/resolvers/topic.ts +++ b/packages/web/resolvers/topic.ts @@ -1,29 +1,30 @@ import { PostStatus } from '@journaly/j-db-client' import { arg, booleanArg, objectType, extendType, intArg } from 'nexus' +import { Topic, TopicTranslation, UserInterest } from 'nexus-prisma' -const TopicTranslation = objectType({ - name: 'TopicTranslation', +const TopicTranslationType = objectType({ + name: TopicTranslation.$name, definition(t) { - t.model.id() - t.model.name() - t.model.uiLanguage() + t.field(TopicTranslation.id) + t.field(TopicTranslation.name) + t.field(TopicTranslation.uiLanguage) }, }) -const UserInterest = objectType({ - name: 'UserInterest', +const UserInterestType = objectType({ + name: UserInterest.$name, definition(t) { - t.model.id() - t.model.user() - t.model.topic() - } + t.field(UserInterest.id) + t.field(UserInterest.user) + t.field(UserInterest.topic) + }, }) -const Topic = objectType({ - name: 'Topic', +const TopicType = objectType({ + name: Topic.$name, sourceType: 'prisma.Topic', definition(t) { - t.model.id() + t.field(Topic.id) t.string('name', { nullable: true, args: { @@ -183,7 +184,7 @@ const TopicMutations = extendType({ return ctx.db.userInterest.delete(interestFilter) }, }) - } + }, }) -export default [TopicTranslation, UserInterest, Topic, TopicQueries, TopicMutations] +export default [TopicTranslationType, UserInterestType, TopicType, TopicQueries, TopicMutations] From 9a30bead22af91cb5ed3b2bc1f1059c7a02e5a65 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sun, 16 Jan 2022 14:20:24 +0000 Subject: [PATCH 08/18] Add descriptions --- packages/web/resolvers/comment.ts | 3 +++ packages/web/resolvers/headlineImage.ts | 1 + packages/web/resolvers/language.ts | 2 ++ packages/web/resolvers/post.ts | 2 ++ packages/web/resolvers/socialMedia.ts | 1 + packages/web/resolvers/subscription.ts | 1 + packages/web/resolvers/thanks.ts | 1 + packages/web/resolvers/topic.ts | 2 ++ packages/web/resolvers/user.ts | 2 ++ 9 files changed, 15 insertions(+) diff --git a/packages/web/resolvers/comment.ts b/packages/web/resolvers/comment.ts index e36866228..19d488270 100644 --- a/packages/web/resolvers/comment.ts +++ b/packages/web/resolvers/comment.ts @@ -28,6 +28,7 @@ import { NotFoundError } from './errors' const ThreadType = objectType({ name: Thread.$name, + description: Thread.$description, definition(t) { t.field(Thread.id) t.field(Thread.archived) @@ -46,6 +47,7 @@ const ThreadType = objectType({ const CommentType = objectType({ name: Comment.$name, + description: Comment.$description, definition(t) { t.field(Comment.id) t.field(Comment.author) @@ -59,6 +61,7 @@ const CommentType = objectType({ const PostCommentType = objectType({ name: PostComment.$name, + description: PostComment.$description, definition(t) { t.field(PostComment.id) t.field(PostComment.author) diff --git a/packages/web/resolvers/headlineImage.ts b/packages/web/resolvers/headlineImage.ts index 3c11e9495..9793a488e 100644 --- a/packages/web/resolvers/headlineImage.ts +++ b/packages/web/resolvers/headlineImage.ts @@ -3,6 +3,7 @@ import { HeadlineImage } from 'nexus-prisma' const HeadlineImageType = objectType({ name: HeadlineImage.$name, + description: HeadlineImage.$description, definition(t) { t.field(HeadlineImage.id) t.field(HeadlineImage.smallSize) diff --git a/packages/web/resolvers/language.ts b/packages/web/resolvers/language.ts index 2ff68dd1c..be57ac277 100644 --- a/packages/web/resolvers/language.ts +++ b/packages/web/resolvers/language.ts @@ -4,6 +4,7 @@ import { LanguageRelation, Language } from 'nexus-prisma' const LanguageRelationType = objectType({ name: LanguageRelation.$name, + description: LanguageRelation.$description, definition(t) { t.field(LanguageRelation.id) t.field(LanguageRelation.language) @@ -13,6 +14,7 @@ const LanguageRelationType = objectType({ const LanguageType = objectType({ name: Language.$name, + description: Language.$description, definition(t) { t.field(Language.id) t.field(Language.name) diff --git a/packages/web/resolvers/post.ts b/packages/web/resolvers/post.ts index 81fb212c2..22896d783 100644 --- a/packages/web/resolvers/post.ts +++ b/packages/web/resolvers/post.ts @@ -90,6 +90,7 @@ const assignPostCountBadges = async (db: PrismaClient, userId: number): Promise< const PostTopicType = objectType({ name: PostTopic.$name, + description: PostTopic.$description, definition(t) { t.field(PostTopic.id) t.field(PostTopic.post) @@ -99,6 +100,7 @@ const PostTopicType = objectType({ const PostType = objectType({ name: Post.$name, + description: Post.$description, definition(t) { t.field(Post.id) t.field(Post.title) diff --git a/packages/web/resolvers/socialMedia.ts b/packages/web/resolvers/socialMedia.ts index e44c3b268..40ce6ba2d 100644 --- a/packages/web/resolvers/socialMedia.ts +++ b/packages/web/resolvers/socialMedia.ts @@ -5,6 +5,7 @@ import { SocialMedia } from 'nexus-prisma' const SocialMediaType = objectType({ name: SocialMedia.$name, + description: SocialMedia.$description, definition(t) { t.field(SocialMedia.id) t.field(SocialMedia.facebook) diff --git a/packages/web/resolvers/subscription.ts b/packages/web/resolvers/subscription.ts index 0c7d241a2..eeb7b1227 100644 --- a/packages/web/resolvers/subscription.ts +++ b/packages/web/resolvers/subscription.ts @@ -19,6 +19,7 @@ import { MembershipSubscription } from 'nexus-prisma' const MembershipSubscriptionType = objectType({ name: MembershipSubscription.$name, + description: MembershipSubscription.$description, definition(t) { t.field(MembershipSubscription.id) t.field(MembershipSubscription.period) diff --git a/packages/web/resolvers/thanks.ts b/packages/web/resolvers/thanks.ts index 6653fad19..1e9c8c30a 100644 --- a/packages/web/resolvers/thanks.ts +++ b/packages/web/resolvers/thanks.ts @@ -12,6 +12,7 @@ import { CommentThanks } from 'nexus-prisma' const CommentThanksType = objectType({ name: CommentThanks.$name, + description: CommentThanks.$description, definition(t) { t.field(CommentThanks.id) t.field(CommentThanks.commentId) diff --git a/packages/web/resolvers/topic.ts b/packages/web/resolvers/topic.ts index d76dafa8e..2b715615a 100644 --- a/packages/web/resolvers/topic.ts +++ b/packages/web/resolvers/topic.ts @@ -13,6 +13,7 @@ const TopicTranslationType = objectType({ const UserInterestType = objectType({ name: UserInterest.$name, + description: UserInterest.$description, definition(t) { t.field(UserInterest.id) t.field(UserInterest.user) @@ -22,6 +23,7 @@ const UserInterestType = objectType({ const TopicType = objectType({ name: Topic.$name, + description: Topic.$description, sourceType: 'prisma.Topic', definition(t) { t.field(Topic.id) diff --git a/packages/web/resolvers/user.ts b/packages/web/resolvers/user.ts index cfc279d98..5a9193f7f 100644 --- a/packages/web/resolvers/user.ts +++ b/packages/web/resolvers/user.ts @@ -37,6 +37,7 @@ const DatedActivityCount = objectType({ const UserType = objectType({ name: User.$name, + description: User.$description, definition(t) { t.field(User.id) t.field(User.name) @@ -225,6 +226,7 @@ const InitiateAvatarImageUploadResponse = objectType({ const UserBadgeType = objectType({ name: UserBadge.$name, + description: UserBadge.$description, definition(t) { t.field(UserBadge.id) t.field(UserBadge.type) From 08226e59b2a25767bdcbd9ae6dc81679b4a514f1 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Thu, 20 Jan 2022 06:33:33 +0000 Subject: [PATCH 09/18] Finish first draft of fixing up user.ts refactor --- packages/web/resolvers/user.ts | 77 +++++++++++++--------------------- 1 file changed, 28 insertions(+), 49 deletions(-) diff --git a/packages/web/resolvers/user.ts b/packages/web/resolvers/user.ts index 5a9193f7f..438798ae2 100644 --- a/packages/web/resolvers/user.ts +++ b/packages/web/resolvers/user.ts @@ -1,18 +1,9 @@ -import { - intArg, - stringArg, - objectType, - extendType, -} from 'nexus' +import { intArg, stringArg, objectType, extendType, nonNull } from 'nexus' import bcrypt from 'bcryptjs' import jwt from 'jsonwebtoken' import { serialize } from 'cookie' import { isAcademic } from 'swot-node' -import { - PostStatus, - EmailVerificationStatus, - InAppNotificationType, -} from '@journaly/j-db-client' +import { PostStatus, EmailVerificationStatus, InAppNotificationType } from '@journaly/j-db-client' import { User, UserBadge } from 'nexus-prisma' @@ -64,24 +55,13 @@ const UserType = objectType({ t.field(User.createdAt) t.field(User.membershipSubscription) t.field(User.isStudent) - t.field(User.socialMedia, { - type: 'SocialMedia', - resolve: async (parent, _args, ctx) => { - return ctx.db.socialMedia.findFirst({ - where: { - userId: parent.id, - }, - }) - }, - }) + t.field(User.socialMedia) t.field(User.languages) t.field(User.following) t.field(User.followedBy) t.field(User.lastFourCardNumbers) t.field(User.cardBrand) - t.field(User.userInterests, { - type: 'UserInterests', - }) + t.field(User.userInterests) t.boolean('emailAddressVerified', { async resolve(parent, _args, ctx, _info) { const auth = await ctx.db.auth.findUnique({ @@ -246,7 +226,6 @@ const UserQueries = extendType({ t.field('currentUser', { type: 'User', - nullable: true, resolve: async (_parent, _args, ctx) => { const userId = ctx.request.userId // check for current userId @@ -264,8 +243,8 @@ const UserQueries = extendType({ t.field('userByIdentifier', { type: 'User', args: { - id: intArg({ required: false }), - handle: stringArg({ required: false }), + id: intArg(), + handle: stringArg(), }, resolve: async (_parent, args, ctx) => { if (!args.id && !args.handle) throw new Error('You must provide an ID or handle') @@ -303,9 +282,9 @@ const UserMutations = extendType({ t.field('createUser', { type: 'User', args: { - handle: stringArg({ required: true }), - email: stringArg({ required: true }), - password: stringArg({ required: true }), + handle: nonNull(stringArg()), + email: nonNull(stringArg()), + password: nonNull(stringArg()), }, resolve: async (_parent, args, ctx) => { if (!args.handle.match(/^[a-zA-Z0-9_-]+$/)) { @@ -364,13 +343,13 @@ const UserMutations = extendType({ t.field('updateUser', { type: 'User', args: { - email: stringArg({ required: false }), - name: stringArg({ required: false }), - profileImage: stringArg({ required: false }), - bio: stringArg({ required: false }), - handle: stringArg({ required: false }), - country: stringArg({ required: false }), - city: stringArg({ required: false }), + email: stringArg(), + name: stringArg(), + profileImage: stringArg(), + bio: stringArg(), + handle: stringArg(), + country: stringArg(), + city: stringArg(), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -456,8 +435,8 @@ const UserMutations = extendType({ t.field('updatePassword', { type: 'User', args: { - oldPassword: stringArg({ required: true }), - newPassword: stringArg({ required: true }), + oldPassword: nonNull(stringArg()), + newPassword: nonNull(stringArg()), }, resolve: async (_parent, args, ctx: any) => { const { userId } = ctx.request @@ -499,8 +478,8 @@ const UserMutations = extendType({ t.field('loginUser', { type: 'User', args: { - identifier: stringArg({ required: true }), - password: stringArg({ required: true }), + identifier: nonNull(stringArg()), + password: nonNull(stringArg()), }, resolve: async (_parent, args, ctx: any) => { const user = await ctx.db.user.findUnique({ @@ -536,7 +515,7 @@ const UserMutations = extendType({ t.field('requestResetPassword', { type: 'User', args: { - identifier: stringArg({ required: true }), + identifier: nonNull(stringArg()), }, resolve: async (_parent, args, ctx, _info) => { const user = await ctx.db.user.findUnique({ @@ -576,9 +555,9 @@ const UserMutations = extendType({ t.field('resetPassword', { type: 'User', args: { - resetToken: stringArg({ required: true }), - password: stringArg({ required: true }), - confirmPassword: stringArg({ required: true }), + resetToken: nonNull(stringArg()), + password: nonNull(stringArg()), + confirmPassword: nonNull(stringArg()), }, resolve: async (_parent, args, ctx, _info) => { const { password, confirmPassword, resetToken } = args @@ -659,7 +638,7 @@ const UserMutations = extendType({ t.field('followUser', { type: 'User', args: { - followedUserId: intArg({ required: true }), + followedUserId: nonNull(intArg()), }, resolve: async (_parent, args, ctx, _info) => { const { userId: followerId } = ctx.request @@ -691,7 +670,7 @@ const UserMutations = extendType({ t.field('unfollowUser', { type: 'User', args: { - followedUserId: intArg({ required: true }), + followedUserId: nonNull(intArg()), }, resolve: async (_parent, args, ctx, _info) => { const { userId: followerId } = ctx.request @@ -740,7 +719,7 @@ const UserMutations = extendType({ t.field('savePost', { type: 'User', args: { - postId: intArg({ required: true }), + postId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -763,7 +742,7 @@ const UserMutations = extendType({ t.field('unsavePost', { type: 'User', args: { - postId: intArg({ required: true }), + postId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request From 82f251348519d7056c0e199ec5c556944b9b0da6 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Thu, 20 Jan 2022 07:23:30 +0000 Subject: [PATCH 10/18] Another big push with nullable/nonNullable fields --- packages/web/resolvers/clap.ts | 6 +- packages/web/resolvers/comment.ts | 42 ++++++------- packages/web/resolvers/inputTypes.ts | 26 ++++---- packages/web/resolvers/language.ts | 10 ++-- packages/web/resolvers/notification.ts | 9 ++- packages/web/resolvers/post.ts | 82 +++++++++++--------------- packages/web/resolvers/socialMedia.ts | 8 +-- packages/web/resolvers/subscription.ts | 23 +++----- packages/web/resolvers/thanks.ts | 12 ++-- packages/web/resolvers/topic.ts | 12 ++-- 10 files changed, 94 insertions(+), 136 deletions(-) diff --git a/packages/web/resolvers/clap.ts b/packages/web/resolvers/clap.ts index 93bf3f8fa..896f7f3e5 100644 --- a/packages/web/resolvers/clap.ts +++ b/packages/web/resolvers/clap.ts @@ -1,4 +1,4 @@ -import { extendType, intArg, objectType } from 'nexus' +import { extendType, intArg, objectType, nonNull } from 'nexus' import { EmailNotificationType, InAppNotificationType } from '@journaly/j-db-client' import { createInAppNotification, createEmailNotification, hasAuthorPermissions } from './utils' import { PostClap } from 'nexus-prisma' @@ -19,7 +19,7 @@ const PostClapMutations = extendType({ t.field('createPostClap', { type: 'PostClap', args: { - postId: intArg({ required: true }), + postId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -77,7 +77,7 @@ const PostClapMutations = extendType({ t.field('deletePostClap', { type: 'PostClap', args: { - postClapId: intArg({ required: true }), + postClapId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request diff --git a/packages/web/resolvers/comment.ts b/packages/web/resolvers/comment.ts index 19d488270..14802a79b 100644 --- a/packages/web/resolvers/comment.ts +++ b/packages/web/resolvers/comment.ts @@ -1,9 +1,4 @@ -import { - intArg, - stringArg, - objectType, - extendType, -} from 'nexus' +import { intArg, stringArg, objectType, extendType, nonNull } from 'nexus' import { add, isPast } from 'date-fns' import { @@ -36,7 +31,8 @@ const ThreadType = objectType({ t.field(Thread.endIndex) t.field(Thread.highlightedContent) t.field(Thread.postId) - t.field(Thread.comments, { + t.list.field({ + ...Thread.comments, pagination: false, ordering: { createdAt: true, @@ -162,11 +158,11 @@ const CommentMutations = extendType({ t.field('createThread', { type: 'Thread', args: { - postId: intArg({ required: true }), - startIndex: intArg({ required: true }), - endIndex: intArg({ required: true }), - highlightedContent: stringArg({ required: true }), - body: stringArg({ required: true }), + postId: nonNull(intArg()), + startIndex: nonNull(intArg()), + endIndex: nonNull(intArg()), + highlightedContent: nonNull(stringArg()), + body: nonNull(stringArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -244,7 +240,7 @@ const CommentMutations = extendType({ t.field('deleteThread', { type: 'Thread', args: { - threadId: intArg({ required: true }), + threadId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const thread = await ctx.db.thread.findUnique({ @@ -278,8 +274,8 @@ const CommentMutations = extendType({ t.field('createComment', { type: 'Comment', args: { - threadId: intArg({ required: true }), - body: stringArg({ required: true }), + threadId: nonNull(intArg()), + body: nonNull(stringArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -329,8 +325,8 @@ const CommentMutations = extendType({ t.field('updateComment', { type: 'Comment', args: { - commentId: intArg({ required: true }), - body: stringArg({ required: true }), + commentId: nonNull(intArg()), + body: nonNull(stringArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -369,7 +365,7 @@ const CommentMutations = extendType({ t.field('deleteComment', { type: 'Comment', args: { - commentId: intArg({ required: true }), + commentId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -419,8 +415,8 @@ const CommentMutations = extendType({ t.field('createPostComment', { type: 'PostComment', args: { - postId: intArg({ required: true }), - body: stringArg({ required: true }), + postId: nonNull(intArg()), + body: nonNull(stringArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -522,8 +518,8 @@ const CommentMutations = extendType({ t.field('updatePostComment', { type: 'PostComment', args: { - postCommentId: intArg({ required: true }), - body: stringArg({ required: true }), + postCommentId: nonNull(intArg()), + body: nonNull(stringArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -562,7 +558,7 @@ const CommentMutations = extendType({ t.field('deletePostComment', { type: 'PostComment', args: { - postCommentId: intArg({ required: true }), + postCommentId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request diff --git a/packages/web/resolvers/inputTypes.ts b/packages/web/resolvers/inputTypes.ts index b81cb15dd..51252401a 100644 --- a/packages/web/resolvers/inputTypes.ts +++ b/packages/web/resolvers/inputTypes.ts @@ -7,19 +7,17 @@ import { inputObjectType } from 'nexus' export const EditorNode = inputObjectType({ name: 'EditorNode', definition(t) { - t.string('type', { nullable: true }) - t.string('text', { nullable: true }) - t.boolean('italic', { nullable: true }) - t.boolean('bold', { nullable: true }) - t.boolean('underline', { nullable: true }) - t.boolean('uploaded', { nullable: true }) - t.string('link', { nullable: true }) - t.string('url', { nullable: true }) - t.boolean('hyperlink', { nullable: true }) - t.field('children', { + t.string('type') + t.string('text') + t.boolean('italic') + t.boolean('bold') + t.boolean('underline') + t.boolean('uploaded') + t.string('link') + t.string('url') + t.boolean('hyperlink') + t.list.field('children', { type: EditorNode, - list: true, - nullable: true, }) }, }) @@ -27,8 +25,8 @@ export const EditorNode = inputObjectType({ export const HeadlineImageInput = inputObjectType({ name: 'HeadlineImageInput', definition(t) { - t.string('smallSize', { nullable: false }) - t.string('largeSize', { nullable: false }) + t.nonNull.string('smallSize') + t.nonNull.string('largeSize') }, }) diff --git a/packages/web/resolvers/language.ts b/packages/web/resolvers/language.ts index be57ac277..564179cc9 100644 --- a/packages/web/resolvers/language.ts +++ b/packages/web/resolvers/language.ts @@ -1,4 +1,4 @@ -import { arg, booleanArg, intArg, objectType, extendType } from 'nexus' +import { arg, booleanArg, intArg, objectType, extendType, nonNull } from 'nexus' import { PostStatus } from '@journaly/j-db-client' import { LanguageRelation, Language } from 'nexus-prisma' @@ -44,11 +44,9 @@ const LanguageQueries = extendType({ args: { hasPosts: booleanArg({ description: 'If true, only return languages that have at least one post', - required: false, }), authoredOnly: booleanArg({ description: 'If true, return only languages with posts authored by currentUser.', - required: false, }), }, resolve: async (_parent, args, ctx) => { @@ -92,8 +90,8 @@ const LanguageMutations = extendType({ t.field('addLanguageRelation', { type: 'LanguageRelation', args: { - languageId: intArg({ required: true }), - level: arg({ type: 'LanguageLevel', required: true }), + languageId: nonNull(intArg()), + level: nonNull(arg({ type: 'LanguageLevel' })), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -122,7 +120,7 @@ const LanguageMutations = extendType({ t.field('removeLanguageRelation', { type: 'LanguageRelation', args: { - languageId: intArg({ required: true }), + languageId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request diff --git a/packages/web/resolvers/notification.ts b/packages/web/resolvers/notification.ts index bd6de7b51..b2d25c4b4 100644 --- a/packages/web/resolvers/notification.ts +++ b/packages/web/resolvers/notification.ts @@ -1,4 +1,4 @@ -import { arg, extendType, intArg, objectType } from 'nexus' +import { arg, extendType, intArg, nonNull, objectType } from 'nexus' import { InAppNotification, ThreadCommentNotification, @@ -90,11 +90,10 @@ const NotificationMutations = extendType({ t.field('updateInAppNotification', { type: 'InAppNotification', args: { - notificationId: intArg({ required: true }), + notificationId: nonNull(intArg()), readStatus: arg({ type: 'NotificationReadStatus', description: 'Has the notification been read or not', - required: false, }), }, resolve: async (_parent, args, ctx) => { @@ -130,9 +129,9 @@ const NotificationMutations = extendType({ }) t.field('deleteInAppNotification', { - type: InAppNotification, + type: 'InAppNotification', args: { - notificationId: intArg({ required: true }), + notificationId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request diff --git a/packages/web/resolvers/post.ts b/packages/web/resolvers/post.ts index 22896d783..912e7b926 100644 --- a/packages/web/resolvers/post.ts +++ b/packages/web/resolvers/post.ts @@ -1,11 +1,4 @@ -import { - arg, - intArg, - stringArg, - booleanArg, - objectType, - extendType, -} from 'nexus' +import { arg, intArg, stringArg, booleanArg, objectType, extendType, nonNull } from 'nexus' import { processEditorDocument, @@ -20,7 +13,6 @@ import { createInAppNotification, } from './utils' - import { NotFoundError, NotAuthorizedError, ResolverError } from './errors' import { Prisma, @@ -194,11 +186,9 @@ const PostQueries = extendType({ args: { id: intArg({ description: 'ID of the post to be retreived', - required: false, }), privateShareId: stringArg({ description: 'Private share ID of the post to be retrived', - required: false, }), }, resolve: async (_parent, args, ctx) => { @@ -247,55 +237,49 @@ const PostQueries = extendType({ args: { search: stringArg({ description: 'Search phrase to filter posts by.', - required: false, }), languages: intArg({ description: 'Language IDs to filter posts by. No value means all languages.', - required: false, list: true, }), topics: intArg({ description: 'topics IDs to filter posts by. No value means all topics.', - required: false, list: true, }), - skip: intArg({ - description: 'Offset into the feed post list to return', - required: true, - }), - first: intArg({ - description: 'Number of posts to return', - required: true, - }), + skip: nonNull( + intArg({ + description: 'Offset into the feed post list to return', + }), + ), + first: nonNull( + intArg({ + description: 'Number of posts to return', + }), + ), followedAuthors: booleanArg({ description: 'Author IDs to filter posts by. No value means all authors.', - required: false, }), needsFeedback: booleanArg({ description: 'If true, return only posts with 0 comments.', - required: false, }), hasInteracted: booleanArg({ description: 'If true, return only posts that the user has commented on in any way.', - required: false, - }), - status: arg({ - type: 'PostStatus', - description: - 'The post status, indicating Published or Draft. Param is ignored unless the current user is specified in `authorId`', - required: true, }), + status: nonNull( + arg({ + type: 'PostStatus', + description: + 'The post status, indicating Published or Draft. Param is ignored unless the current user is specified in `authorId`', + }), + ), authorId: intArg({ description: 'Return posts by a given author.', - required: false, }), authorHandle: stringArg({ description: 'Return posts by a given author.', - required: false, }), savedPosts: booleanArg({ description: 'If true, return only posts that the user has saved.', - required: false, }), }, resolve: async (_parent, args, ctx) => { @@ -437,12 +421,12 @@ const PostMutations = extendType({ t.field('createPost', { type: 'Post', args: { - title: stringArg({ required: true }), - body: EditorNode.asArg({ list: true, required: true }), - languageId: intArg({ required: true }), - topicIds: intArg({ list: true, required: false }), - status: arg({ type: 'PostStatus', required: true }), - headlineImage: HeadlineImageInput.asArg({ required: true }), + title: nonNull(stringArg()), + body: nonNull(EditorNode.asArg({ list: true })), + languageId: nonNull(intArg()), + topicIds: intArg({ list: true }), + status: nonNull(arg({ type: 'PostStatus' })), + headlineImage: nonNull(HeadlineImageInput.asArg()), }, resolve: async (_parent, args, ctx) => { const { title, body, languageId, status, headlineImage } = args @@ -542,13 +526,13 @@ const PostMutations = extendType({ t.field('updatePost', { type: 'Post', args: { - postId: intArg({ required: true }), - title: stringArg({ required: false }), - languageId: intArg({ required: false }), - topicIds: intArg({ list: true, required: false }), - body: EditorNode.asArg({ list: true, required: false }), - status: arg({ type: 'PostStatus', required: false }), - headlineImage: HeadlineImageInput.asArg({ required: true }), + postId: nonNull(intArg()), + title: stringArg(), + languageId: intArg(), + topicIds: intArg({ list: true }), + body: EditorNode.asArg({ list: true }), + status: arg({ type: 'PostStatus' }), + headlineImage: nonNull(HeadlineImageInput.asArg()), }, resolve: async (_parent, args, ctx) => { // Check user can actually do this @@ -698,7 +682,7 @@ const PostMutations = extendType({ t.field('deletePost', { type: 'Post', args: { - postId: intArg({ required: true }), + postId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { postId } = args @@ -878,7 +862,7 @@ const PostMutations = extendType({ t.field('bumpPost', { type: 'Post', args: { - postId: intArg({ required: true }), + postId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request diff --git a/packages/web/resolvers/socialMedia.ts b/packages/web/resolvers/socialMedia.ts index 40ce6ba2d..8055d717e 100644 --- a/packages/web/resolvers/socialMedia.ts +++ b/packages/web/resolvers/socialMedia.ts @@ -21,10 +21,10 @@ const SocialMediaMutations = extendType({ t.field('updateSocialMedia', { type: 'SocialMedia', args: { - facebook: stringArg({ required: false }), - instagram: stringArg({ required: false }), - youtube: stringArg({ required: false }), - website: stringArg({ required: false }), + facebook: stringArg(), + instagram: stringArg(), + youtube: stringArg(), + website: stringArg(), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request diff --git a/packages/web/resolvers/subscription.ts b/packages/web/resolvers/subscription.ts index eeb7b1227..8862aee6b 100644 --- a/packages/web/resolvers/subscription.ts +++ b/packages/web/resolvers/subscription.ts @@ -3,17 +3,8 @@ import { MembershipSubscriptionPeriod, PrismaClient, } from '@journaly/j-db-client' -import { - arg, - booleanArg, - extendType, - objectType, - stringArg, -} from 'nexus' -import stripe, { - getOrCreateStripeCustomer, - paymentErrorWrapper -} from '@/nexus/utils/stripe' +import { arg, booleanArg, extendType, nonNull, objectType, stringArg } from 'nexus' +import stripe, { getOrCreateStripeCustomer, paymentErrorWrapper } from '@/nexus/utils/stripe' import { sendPremiumWelcomeEmail } from './utils' import { MembershipSubscription } from 'nexus-prisma' @@ -134,8 +125,8 @@ const MembershipSubscriptionMutations = extendType({ t.field('purchaseMembershipSubscription', { type: 'MembershipSubscription', args: { - period: arg({ type: 'MembershipSubscriptionPeriod', required: true }), - paymentMethodId: stringArg({ required: true }), + period: nonNull(arg({ type: 'MembershipSubscriptionPeriod' })), + paymentMethodId: nonNull(stringArg()), }, resolve: (_parent, args, ctx) => paymentErrorWrapper(async () => { @@ -255,7 +246,7 @@ const MembershipSubscriptionMutations = extendType({ t.field('updateSubscriptionRenewal', { type: 'MembershipSubscription', args: { - cancelAtPeriodEnd: booleanArg({ required: true }), + cancelAtPeriodEnd: nonNull(booleanArg()), }, resolve: async (_parent, args, ctx) => paymentErrorWrapper(async () => { @@ -303,7 +294,7 @@ const MembershipSubscriptionMutations = extendType({ t.field('updateSubscriptionPlan', { type: 'MembershipSubscription', args: { - period: arg({ type: 'MembershipSubscriptionPeriod', required: true }), + period: nonNull(arg({ type: 'MembershipSubscriptionPeriod' })), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -338,7 +329,7 @@ const MembershipSubscriptionMutations = extendType({ t.field('updateSubscriptionPaymentMethod', { type: 'MembershipSubscription', args: { - paymentMethodId: stringArg({ required: true }), + paymentMethodId: nonNull(stringArg()), }, resolve: async (_parent, args, ctx) => paymentErrorWrapper(async () => { diff --git a/packages/web/resolvers/thanks.ts b/packages/web/resolvers/thanks.ts index 1e9c8c30a..ee10814b7 100644 --- a/packages/web/resolvers/thanks.ts +++ b/packages/web/resolvers/thanks.ts @@ -1,13 +1,9 @@ import { InAppNotificationType } from '.prisma/client' -import { intArg, objectType, extendType } from 'nexus' +import { intArg, objectType, extendType, nonNull } from 'nexus' import { EmailNotificationType } from '@journaly/j-db-client' -import { - createInAppNotification, - createEmailNotification, - hasAuthorPermissions -} from './utils' +import { createInAppNotification, createEmailNotification, hasAuthorPermissions } from './utils' import { CommentThanks } from 'nexus-prisma' const CommentThanksType = objectType({ @@ -27,7 +23,7 @@ const ThanksMutations = extendType({ t.field('createCommentThanks', { type: 'CommentThanks', args: { - commentId: intArg({ required: true }), + commentId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -93,7 +89,7 @@ const ThanksMutations = extendType({ t.field('deleteCommentThanks', { type: 'CommentThanks', args: { - commentThanksId: intArg({ required: true }), + commentThanksId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request diff --git a/packages/web/resolvers/topic.ts b/packages/web/resolvers/topic.ts index 2b715615a..e51f8be9b 100644 --- a/packages/web/resolvers/topic.ts +++ b/packages/web/resolvers/topic.ts @@ -1,5 +1,5 @@ import { PostStatus } from '@journaly/j-db-client' -import { arg, booleanArg, objectType, extendType, intArg } from 'nexus' +import { arg, booleanArg, objectType, extendType, intArg, nonNull } from 'nexus' import { Topic, TopicTranslation, UserInterest } from 'nexus-prisma' const TopicTranslationType = objectType({ @@ -28,9 +28,8 @@ const TopicType = objectType({ definition(t) { t.field(Topic.id) t.string('name', { - nullable: true, args: { - uiLanguage: arg({ type: 'UILanguage', required: true }), + uiLanguage: nonNull(arg({ type: 'UILanguage' })), }, async resolve(parent, args, ctx, _info) { const translation = await ctx.db.topicTranslation.findUnique({ @@ -49,7 +48,6 @@ const TopicType = objectType({ args: { languages: intArg({ description: 'Language IDs to filter topics. No value means all languages.', - required: false, list: true, }), }, @@ -82,11 +80,9 @@ const TopicQueries = extendType({ args: { hasPosts: booleanArg({ description: 'If true, only return topics that have at least one post', - required: false, }), authoredOnly: booleanArg({ description: 'If true, return only topics with posts authored by currentUser.', - required: false, }), }, resolve: async (_parent, args, ctx) => { @@ -137,7 +133,7 @@ const TopicMutations = extendType({ t.field('addUserInterest', { type: 'UserInterest', args: { - topicId: intArg({ required: true }), + topicId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request @@ -165,7 +161,7 @@ const TopicMutations = extendType({ t.field('removeUserInterest', { type: 'UserInterest', args: { - topicId: intArg({ required: true }), + topicId: nonNull(intArg()), }, resolve: async (_parent, args, ctx) => { const { userId } = ctx.request From 1ab796de45f7ddc6085f2d04618dc0fa7abf175c Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Thu, 20 Jan 2022 14:51:26 +0000 Subject: [PATCH 11/18] Fix Post model resolver --- packages/web/resolvers/post.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/web/resolvers/post.ts b/packages/web/resolvers/post.ts index 912e7b926..79f1f76ac 100644 --- a/packages/web/resolvers/post.ts +++ b/packages/web/resolvers/post.ts @@ -25,7 +25,7 @@ import { EmailVerificationStatus, InAppNotificationType, } from '@journaly/j-db-client' -import { Post, PostTopic } from 'nexus-prisma' +import { Post, PostTopic, Thread } from 'nexus-prisma' import { EditorNode, HeadlineImageInput } from './inputTypes' import { POST_BUMP_LIMIT } from '../constants' @@ -103,7 +103,16 @@ const PostType = objectType({ t.field(Post.authorId) t.field(Post.status) t.field(Post.claps({ pagination: false })) - t.field(Post.threads({ pagination: false })) + t.nonNull.list.nonNull.field('threads', { + type: 'Thread', + resolve: (parent, _, context) => { + return context.db.post + .findUnique({ + where: { id: parent.id }, + }) + .threads() + }, + }) t.field(Post.postTopics({ type: 'PostTopic', pagination: false })) t.field( Post.postComments({ From 2cf17f60efc674cb989a5fac65cd95af8dd9057f Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Thu, 20 Jan 2022 16:01:41 +0000 Subject: [PATCH 12/18] Another huge push resolving final issues so far --- packages/web/package.json | 2 +- packages/web/resolvers/comment.ts | 27 ++++++++--- packages/web/resolvers/language.ts | 11 ++++- packages/web/resolvers/notification.ts | 66 ++++++++++++++++++++++--- packages/web/resolvers/post.ts | 67 ++++++++++++++++++-------- packages/web/resolvers/user.ts | 2 +- 6 files changed, 139 insertions(+), 36 deletions(-) diff --git a/packages/web/package.json b/packages/web/package.json index 9ec9f0c74..149fad311 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -70,7 +70,7 @@ "lodash": "^4.17.20", "next": "^11.1.0", "next-i18next": "^7.0.1", - "nexus": "^1.0.0", + "nexus": "^1.1.0", "nexus-prisma": "^0.35.0", "node-fetch": "^2.6.1", "nprogress": "^0.2.0", diff --git a/packages/web/resolvers/comment.ts b/packages/web/resolvers/comment.ts index 14802a79b..5357d2578 100644 --- a/packages/web/resolvers/comment.ts +++ b/packages/web/resolvers/comment.ts @@ -31,11 +31,17 @@ const ThreadType = objectType({ t.field(Thread.endIndex) t.field(Thread.highlightedContent) t.field(Thread.postId) - t.list.field({ - ...Thread.comments, - pagination: false, - ordering: { - createdAt: true, + t.nonNull.list.nonNull.field('comments', { + type: 'Comment', + resolve: (parent, _, ctx) => { + return ctx.db.thread + .findUnique({ + where: { id: parent.id }, + orderBy: { + createdAt: true, + }, + }) + .comments() }, }) }, @@ -50,7 +56,16 @@ const CommentType = objectType({ t.field(Comment.body) t.field(Comment.createdAt) t.field(Comment.authorLanguageLevel) - t.field(Comment.thanks, { pagination: false }) + t.nonNull.list.nonNull.field('thanks', { + type: 'CommentThanks', + resolve: (parent, _, ctx) => { + return ctx.db.comment + .findUnique({ + where: { id: parent.id }, + }) + .thanks() + }, + }) t.field(Comment.thread) }, }) diff --git a/packages/web/resolvers/language.ts b/packages/web/resolvers/language.ts index 564179cc9..f6ced6181 100644 --- a/packages/web/resolvers/language.ts +++ b/packages/web/resolvers/language.ts @@ -19,7 +19,16 @@ const LanguageType = objectType({ t.field(Language.id) t.field(Language.name) t.field(Language.devName) - t.field(Language.posts, { pagination: false }) + t.nonNull.list.nonNull.field('posts', { + type: 'Post', + resolve: (parent, _, ctx) => { + return ctx.db.language + .findUnique({ + where: { id: parent.id }, + }) + .posts() + }, + }) t.field(Language.dialect) t.int('postCount', { resolve(parent, _, ctx) { diff --git a/packages/web/resolvers/notification.ts b/packages/web/resolvers/notification.ts index b2d25c4b4..314507aa2 100644 --- a/packages/web/resolvers/notification.ts +++ b/packages/web/resolvers/notification.ts @@ -21,12 +21,66 @@ const InAppNotificationType = objectType({ t.field(InAppNotification.post) t.field(InAppNotification.readStatus) t.field(InAppNotification.triggeringUser) - t.field(InAppNotification.threadCommentNotifications, { pagination: false }) - t.field(InAppNotification.postCommentNotifications, { pagination: false }) - t.field(InAppNotification.newFollowerNotifications, { pagination: false }) - t.field(InAppNotification.postClapNotifications, { pagination: false }) - t.field(InAppNotification.threadCommentThanksNotifications, { pagination: false }) - t.field(InAppNotification.newPostNotifications, { pagination: false }) + t.nonNull.list.nonNull.field('threadCommentNotifications', { + type: 'ThreadCommentNotification', + resolve: (parent, _, ctx) => { + return ctx.db.inAppNotification + .findUnique({ + where: { id: parent.id }, + }) + .threadCommentNotifications() + }, + }) + t.nonNull.list.nonNull.field('postCommentNotifications', { + type: 'PostCommentNotification', + resolve: (parent, _, ctx) => { + return ctx.db.inAppNotification + .findUnique({ + where: { id: parent.id }, + }) + .postCommentNotifications() + }, + }) + t.nonNull.list.nonNull.field('newFollowerNotifications', { + type: 'NewFollowerNotification', + resolve: (parent, _, ctx) => { + return ctx.db.inAppNotification + .findUnique({ + where: { id: parent.id }, + }) + .newFollowerNotifications() + }, + }) + t.nonNull.list.nonNull.field('postClapNotifications', { + type: 'PostClapNotification', + resolve: (parent, _, ctx) => { + return ctx.db.inAppNotification + .findUnique({ + where: { id: parent.id }, + }) + .postClapNotifications() + }, + }) + t.nonNull.list.nonNull.field('threadCommentThanksNotifications', { + type: 'ThreadCommentThanksNotification', + resolve: (parent, _, ctx) => { + return ctx.db.inAppNotification + .findUnique({ + where: { id: parent.id }, + }) + .threadCommentThanksNotifications() + }, + }) + t.nonNull.list.nonNull.field('newPostNotifications', { + type: 'NewPostNotification', + resolve: (parent, _, ctx) => { + return ctx.db.inAppNotification + .findUnique({ + where: { id: parent.id }, + }) + .newPostNotifications() + }, + }) }, }) diff --git a/packages/web/resolvers/post.ts b/packages/web/resolvers/post.ts index 79f1f76ac..e64e1072f 100644 --- a/packages/web/resolvers/post.ts +++ b/packages/web/resolvers/post.ts @@ -1,4 +1,4 @@ -import { arg, intArg, stringArg, booleanArg, objectType, extendType, nonNull } from 'nexus' +import { arg, intArg, stringArg, booleanArg, objectType, extendType, nonNull, list } from 'nexus' import { processEditorDocument, @@ -102,26 +102,49 @@ const PostType = objectType({ t.field(Post.author) t.field(Post.authorId) t.field(Post.status) - t.field(Post.claps({ pagination: false })) + t.nonNull.list.nonNull.field('claps', { + type: 'PostClap', + resolve: (parent, _, ctx) => { + return ctx.db.post + .findUnique({ + where: { id: parent.id }, + }) + .claps() + }, + }) t.nonNull.list.nonNull.field('threads', { type: 'Thread', - resolve: (parent, _, context) => { - return context.db.post + resolve: (parent, _, ctx) => { + return ctx.db.post .findUnique({ where: { id: parent.id }, }) .threads() }, }) - t.field(Post.postTopics({ type: 'PostTopic', pagination: false })) - t.field( - Post.postComments({ - pagination: false, - ordering: { - createdAt: true, - }, - }), - ) + t.nonNull.list.nonNull.field('postTopics', { + type: 'PostTopic', + resolve: (parent, _, ctx) => { + return ctx.db.post + .findUnique({ + where: { id: parent.id }, + }) + .postTopics() + }, + }) + t.nonNull.list.nonNull.field('postComments', { + type: 'PostComment', + resolve: (parent, _, ctx) => { + return ctx.db.post + .findUnique({ + where: { id: parent.id }, + orderBy: { + createdAt: true, + }, + }) + .postComments() + }, + }) t.field(Post.language) t.field(Post.publishedLanguageLevel) t.field(Post.privateShareId) @@ -247,14 +270,16 @@ const PostQueries = extendType({ search: stringArg({ description: 'Search phrase to filter posts by.', }), - languages: intArg({ - description: 'Language IDs to filter posts by. No value means all languages.', - list: true, - }), - topics: intArg({ - description: 'topics IDs to filter posts by. No value means all topics.', - list: true, - }), + languages: list( + intArg({ + description: 'Language IDs to filter posts by. No value means all languages.', + }), + ), + topics: list( + intArg({ + description: 'topics IDs to filter posts by. No value means all topics.', + }), + ), skip: nonNull( intArg({ description: 'Offset into the feed post list to return', diff --git a/packages/web/resolvers/user.ts b/packages/web/resolvers/user.ts index 438798ae2..a726dcc3d 100644 --- a/packages/web/resolvers/user.ts +++ b/packages/web/resolvers/user.ts @@ -32,7 +32,7 @@ const UserType = objectType({ definition(t) { t.field(User.id) t.field(User.name) - t.nullable.string('email', { + t.string('email', { resolve(parent, _args, ctx) { const { userId } = ctx.request From 6f394f5166ff3ebfa3125157905fa6c2ebfa8470 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Thu, 20 Jan 2022 16:42:34 +0000 Subject: [PATCH 13/18] Refactor direction of 'Type' alias suffix --- packages/web/resolvers/clap.ts | 16 ++-- packages/web/resolvers/comment.ts | 60 +++++++------- packages/web/resolvers/language.ts | 30 +++---- packages/web/resolvers/notification.ts | 110 ++++++++++++------------- packages/web/resolvers/post.ts | 66 +++++++-------- packages/web/resolvers/socialMedia.ts | 20 ++--- packages/web/resolvers/subscription.ts | 22 ++--- packages/web/resolvers/thanks.ts | 18 ++-- packages/web/resolvers/topic.ts | 52 ++++++------ packages/web/resolvers/user.ts | 66 +++++++-------- 10 files changed, 234 insertions(+), 226 deletions(-) diff --git a/packages/web/resolvers/clap.ts b/packages/web/resolvers/clap.ts index 896f7f3e5..fe3fdd4c8 100644 --- a/packages/web/resolvers/clap.ts +++ b/packages/web/resolvers/clap.ts @@ -1,15 +1,15 @@ import { extendType, intArg, objectType, nonNull } from 'nexus' import { EmailNotificationType, InAppNotificationType } from '@journaly/j-db-client' import { createInAppNotification, createEmailNotification, hasAuthorPermissions } from './utils' -import { PostClap } from 'nexus-prisma' +import { PostClap as PostClapType } from 'nexus-prisma' -const PostClapType = objectType({ - name: PostClap.$name, - description: PostClap.$description, +const PostClap = objectType({ + name: PostClapType.$name, + description: PostClapType.$description, definition(t) { - t.field(PostClap.id) - t.field(PostClap.author) - t.field(PostClap.post) + t.field(PostClapType.id) + t.field(PostClapType.author) + t.field(PostClapType.post) }, }) @@ -116,4 +116,4 @@ const PostClapMutations = extendType({ }, }) -export default [PostClapType, PostClapMutations] +export default [PostClap, PostClapMutations] diff --git a/packages/web/resolvers/comment.ts b/packages/web/resolvers/comment.ts index 5357d2578..947fcb780 100644 --- a/packages/web/resolvers/comment.ts +++ b/packages/web/resolvers/comment.ts @@ -9,7 +9,11 @@ import { LanguageLevel, PrismaClient, } from '@journaly/j-db-client' -import { Comment, PostComment, Thread } from 'nexus-prisma' +import { + Comment as CommentType, + PostComment as PostCommentType, + Thread as ThreadType, +} from 'nexus-prisma' import { hasAuthorPermissions, @@ -21,16 +25,16 @@ import { } from './utils' import { NotFoundError } from './errors' -const ThreadType = objectType({ - name: Thread.$name, - description: Thread.$description, +const Thread = objectType({ + name: ThreadType.$name, + description: ThreadType.$description, definition(t) { - t.field(Thread.id) - t.field(Thread.archived) - t.field(Thread.startIndex) - t.field(Thread.endIndex) - t.field(Thread.highlightedContent) - t.field(Thread.postId) + t.field(ThreadType.id) + t.field(ThreadType.archived) + t.field(ThreadType.startIndex) + t.field(ThreadType.endIndex) + t.field(ThreadType.highlightedContent) + t.field(ThreadType.postId) t.nonNull.list.nonNull.field('comments', { type: 'Comment', resolve: (parent, _, ctx) => { @@ -47,15 +51,15 @@ const ThreadType = objectType({ }, }) -const CommentType = objectType({ - name: Comment.$name, - description: Comment.$description, +const Comment = objectType({ + name: CommentType.$name, + description: CommentType.$description, definition(t) { - t.field(Comment.id) - t.field(Comment.author) - t.field(Comment.body) - t.field(Comment.createdAt) - t.field(Comment.authorLanguageLevel) + t.field(CommentType.id) + t.field(CommentType.author) + t.field(CommentType.body) + t.field(CommentType.createdAt) + t.field(CommentType.authorLanguageLevel) t.nonNull.list.nonNull.field('thanks', { type: 'CommentThanks', resolve: (parent, _, ctx) => { @@ -66,19 +70,19 @@ const CommentType = objectType({ .thanks() }, }) - t.field(Comment.thread) + t.field(CommentType.thread) }, }) -const PostCommentType = objectType({ - name: PostComment.$name, - description: PostComment.$description, +const PostComment = objectType({ + name: PostCommentType.$name, + description: PostCommentType.$description, definition(t) { - t.field(PostComment.id) - t.field(PostComment.author) - t.field(PostComment.body) - t.field(PostComment.createdAt) - t.field(PostComment.authorLanguageLevel) + t.field(PostCommentType.id) + t.field(PostCommentType.author) + t.field(PostCommentType.body) + t.field(PostCommentType.createdAt) + t.field(PostCommentType.authorLanguageLevel) }, }) @@ -609,4 +613,4 @@ const CommentMutations = extendType({ }, }) -export default [ThreadType, CommentType, PostCommentType, CommentMutations] +export default [Thread, Comment, PostComment, CommentMutations] diff --git a/packages/web/resolvers/language.ts b/packages/web/resolvers/language.ts index f6ced6181..b070545be 100644 --- a/packages/web/resolvers/language.ts +++ b/packages/web/resolvers/language.ts @@ -1,24 +1,24 @@ import { arg, booleanArg, intArg, objectType, extendType, nonNull } from 'nexus' import { PostStatus } from '@journaly/j-db-client' -import { LanguageRelation, Language } from 'nexus-prisma' +import { LanguageRelation as LanguageRelationType, Language as LanguageType } from 'nexus-prisma' -const LanguageRelationType = objectType({ - name: LanguageRelation.$name, - description: LanguageRelation.$description, +const LanguageRelation = objectType({ + name: LanguageRelationType.$name, + description: LanguageRelationType.$description, definition(t) { - t.field(LanguageRelation.id) - t.field(LanguageRelation.language) - t.field(LanguageRelation.level) + t.field(LanguageRelationType.id) + t.field(LanguageRelationType.language) + t.field(LanguageRelationType.level) }, }) -const LanguageType = objectType({ - name: Language.$name, - description: Language.$description, +const Language = objectType({ + name: LanguageType.$name, + description: LanguageType.$description, definition(t) { - t.field(Language.id) - t.field(Language.name) - t.field(Language.devName) + t.field(LanguageType.id) + t.field(LanguageType.name) + t.field(LanguageType.devName) t.nonNull.list.nonNull.field('posts', { type: 'Post', resolve: (parent, _, ctx) => { @@ -29,7 +29,7 @@ const LanguageType = objectType({ .posts() }, }) - t.field(Language.dialect) + t.field(LanguageType.dialect) t.int('postCount', { resolve(parent, _, ctx) { return ctx.db.post.count({ @@ -153,4 +153,4 @@ const LanguageMutations = extendType({ }, }) -export default [LanguageRelationType, LanguageType, LanguageQueries, LanguageMutations] +export default [LanguageRelation, Language, LanguageQueries, LanguageMutations] diff --git a/packages/web/resolvers/notification.ts b/packages/web/resolvers/notification.ts index 314507aa2..1b4d83bc2 100644 --- a/packages/web/resolvers/notification.ts +++ b/packages/web/resolvers/notification.ts @@ -1,26 +1,26 @@ import { arg, extendType, intArg, nonNull, objectType } from 'nexus' import { - InAppNotification, - ThreadCommentNotification, - PostCommentNotification, - NewPostNotification, - NewFollowerNotification, - PostClapNotification, - ThreadCommentThanksNotification, + InAppNotification as InAppNotificationType, + ThreadCommentNotification as ThreadCommentNotificationType, + PostCommentNotification as PostCommentNotificationType, + NewPostNotification as NewPostNotificationType, + NewFollowerNotification as NewFollowerNotificationType, + PostClapNotification as PostClapNotificationType, + ThreadCommentThanksNotification as ThreadCommentThanksNotificationType, } from 'nexus-prisma' -const InAppNotificationType = objectType({ - name: InAppNotification.$name, - description: InAppNotification.$description, +const InAppNotification = objectType({ + name: InAppNotificationType.$name, + description: InAppNotificationType.$description, definition(t) { - t.field(InAppNotification.id) - t.field(InAppNotification.userId) - t.field(InAppNotification.type) - t.field(InAppNotification.bumpedAt) - t.field(InAppNotification.readStatus) - t.field(InAppNotification.post) - t.field(InAppNotification.readStatus) - t.field(InAppNotification.triggeringUser) + t.field(InAppNotificationType.id) + t.field(InAppNotificationType.userId) + t.field(InAppNotificationType.type) + t.field(InAppNotificationType.bumpedAt) + t.field(InAppNotificationType.readStatus) + t.field(InAppNotificationType.post) + t.field(InAppNotificationType.readStatus) + t.field(InAppNotificationType.triggeringUser) t.nonNull.list.nonNull.field('threadCommentNotifications', { type: 'ThreadCommentNotification', resolve: (parent, _, ctx) => { @@ -84,57 +84,57 @@ const InAppNotificationType = objectType({ }, }) -const ThreadCommentNotificationType = objectType({ - name: ThreadCommentNotification.$name, - description: ThreadCommentNotification.$description, +const ThreadCommentNotification = objectType({ + name: ThreadCommentNotificationType.$name, + description: ThreadCommentNotificationType.$description, definition(t) { - t.field(ThreadCommentNotification.id) - t.field(ThreadCommentNotification.comment) + t.field(ThreadCommentNotificationType.id) + t.field(ThreadCommentNotificationType.comment) }, }) -const PostCommentNotificationType = objectType({ - name: PostCommentNotification.$name, - description: PostCommentNotification.$description, +const PostCommentNotification = objectType({ + name: PostCommentNotificationType.$name, + description: PostCommentNotificationType.$description, definition(t) { - t.field(PostCommentNotification.id) - t.field(PostCommentNotification.postComment) + t.field(PostCommentNotificationType.id) + t.field(PostCommentNotificationType.postComment) }, }) -const NewFollowerNotificationType = objectType({ - name: NewFollowerNotification.$name, - description: NewFollowerNotification.$description, +const NewFollowerNotification = objectType({ + name: NewFollowerNotificationType.$name, + description: NewFollowerNotificationType.$description, definition(t) { - t.field(NewFollowerNotification.id) - t.field(NewFollowerNotification.followingUser) + t.field(NewFollowerNotificationType.id) + t.field(NewFollowerNotificationType.followingUser) }, }) -const PostClapNotificationType = objectType({ - name: PostClapNotification.$name, - description: PostClapNotification.$description, +const PostClapNotification = objectType({ + name: PostClapNotificationType.$name, + description: PostClapNotificationType.$description, definition(t) { - t.field(PostClapNotification.id) - t.field(PostClapNotification.postClap) + t.field(PostClapNotificationType.id) + t.field(PostClapNotificationType.postClap) }, }) -const ThreadCommentThanksNotificationType = objectType({ - name: ThreadCommentThanksNotification.$name, - description: ThreadCommentThanksNotification.$description, +const ThreadCommentThanksNotification = objectType({ + name: ThreadCommentThanksNotificationType.$name, + description: ThreadCommentThanksNotificationType.$description, definition(t) { - t.field(ThreadCommentThanksNotification.id) - t.field(ThreadCommentThanksNotification.thanks) + t.field(ThreadCommentThanksNotificationType.id) + t.field(ThreadCommentThanksNotificationType.thanks) }, }) -const NewPostNotificationType = objectType({ - name: NewPostNotification.$name, - description: NewPostNotification.$description, +const NewPostNotification = objectType({ + name: NewPostNotificationType.$name, + description: NewPostNotificationType.$description, definition(t) { - t.field(NewPostNotification.id) - t.field(NewPostNotification.post) + t.field(NewPostNotificationType.id) + t.field(NewPostNotificationType.post) }, }) @@ -216,12 +216,12 @@ const NotificationMutations = extendType({ }) export default [ - InAppNotificationType, - ThreadCommentNotificationType, - PostCommentNotificationType, - NewFollowerNotificationType, - PostClapNotificationType, - ThreadCommentThanksNotificationType, - NewPostNotificationType, + InAppNotification, + ThreadCommentNotification, + PostCommentNotification, + NewFollowerNotification, + PostClapNotification, + ThreadCommentThanksNotification, + NewPostNotification, NotificationMutations, ] diff --git a/packages/web/resolvers/post.ts b/packages/web/resolvers/post.ts index e64e1072f..4d24bbf5b 100644 --- a/packages/web/resolvers/post.ts +++ b/packages/web/resolvers/post.ts @@ -25,7 +25,7 @@ import { EmailVerificationStatus, InAppNotificationType, } from '@journaly/j-db-client' -import { Post, PostTopic, Thread } from 'nexus-prisma' +import { Post as PostType, PostTopic as PostTopicType } from 'nexus-prisma' import { EditorNode, HeadlineImageInput } from './inputTypes' import { POST_BUMP_LIMIT } from '../constants' @@ -80,28 +80,28 @@ const assignPostCountBadges = async (db: PrismaClient, userId: number): Promise< } } -const PostTopicType = objectType({ - name: PostTopic.$name, - description: PostTopic.$description, +const PostTopic = objectType({ + name: PostTopicType.$name, + description: PostTopicType.$description, definition(t) { - t.field(PostTopic.id) - t.field(PostTopic.post) - t.field(PostTopic.topic) + t.field(PostTopicType.id) + t.field(PostTopicType.post) + t.field(PostTopicType.topic) }, }) -const PostType = objectType({ - name: Post.$name, - description: Post.$description, +const Post = objectType({ + name: PostType.$name, + description: PostType.$description, definition(t) { - t.field(Post.id) - t.field(Post.title) - t.field(Post.body) - t.field(Post.excerpt) - t.field(Post.readTime) - t.field(Post.author) - t.field(Post.authorId) - t.field(Post.status) + t.field(PostType.id) + t.field(PostType.title) + t.field(PostType.body) + t.field(PostType.excerpt) + t.field(PostType.readTime) + t.field(PostType.author) + t.field(PostType.authorId) + t.field(PostType.status) t.nonNull.list.nonNull.field('claps', { type: 'PostClap', resolve: (parent, _, ctx) => { @@ -145,16 +145,16 @@ const PostType = objectType({ .postComments() }, }) - t.field(Post.language) - t.field(Post.publishedLanguageLevel) - t.field(Post.privateShareId) - t.field(Post.createdAt) - t.field(Post.updatedAt) - t.field(Post.bodySrc) - t.field(Post.headlineImage) - t.field(Post.publishedAt) - t.field(Post.bumpedAt) - t.field(Post.bumpCount) + t.field(PostType.language) + t.field(PostType.publishedLanguageLevel) + t.field(PostType.privateShareId) + t.field(PostType.createdAt) + t.field(PostType.updatedAt) + t.field(PostType.bodySrc) + t.field(PostType.headlineImage) + t.field(PostType.publishedAt) + t.field(PostType.bumpedAt) + t.field(PostType.bumpCount) t.int('commentCount', { resolve: async (parent, _args, ctx, _info) => { const [threadCommentCount, postCommentCount] = await Promise.all([ @@ -456,9 +456,9 @@ const PostMutations = extendType({ type: 'Post', args: { title: nonNull(stringArg()), - body: nonNull(EditorNode.asArg({ list: true })), + body: nonNull(list(EditorNode.asArg())), languageId: nonNull(intArg()), - topicIds: intArg({ list: true }), + topicIds: list(intArg()), status: nonNull(arg({ type: 'PostStatus' })), headlineImage: nonNull(HeadlineImageInput.asArg()), }, @@ -563,8 +563,8 @@ const PostMutations = extendType({ postId: nonNull(intArg()), title: stringArg(), languageId: intArg(), - topicIds: intArg({ list: true }), - body: EditorNode.asArg({ list: true }), + topicIds: list(intArg()), + body: list(EditorNode.asArg()), status: arg({ type: 'PostStatus' }), headlineImage: nonNull(HeadlineImageInput.asArg()), }, @@ -953,7 +953,7 @@ const PostMutations = extendType({ export default [ PostTopic, - PostType, + Post, PostPage, InitiatePostImageUploadResponse, InitiateInlinePostImageUploadResponse, diff --git a/packages/web/resolvers/socialMedia.ts b/packages/web/resolvers/socialMedia.ts index 8055d717e..ff69718cb 100644 --- a/packages/web/resolvers/socialMedia.ts +++ b/packages/web/resolvers/socialMedia.ts @@ -1,17 +1,17 @@ import { stringArg, objectType, extendType } from 'nexus' import { NotAuthorizedError, UserInputError } from './errors' import { validateSocialMediaInput } from './utils/socialMedia' -import { SocialMedia } from 'nexus-prisma' +import { SocialMedia as SocialMediaType } from 'nexus-prisma' -const SocialMediaType = objectType({ - name: SocialMedia.$name, - description: SocialMedia.$description, +const SocialMedia = objectType({ + name: SocialMediaType.$name, + description: SocialMediaType.$description, definition(t) { - t.field(SocialMedia.id) - t.field(SocialMedia.facebook) - t.field(SocialMedia.youtube) - t.field(SocialMedia.instagram) - t.field(SocialMedia.website) + t.field(SocialMediaType.id) + t.field(SocialMediaType.facebook) + t.field(SocialMediaType.youtube) + t.field(SocialMediaType.instagram) + t.field(SocialMediaType.website) }, }) @@ -70,4 +70,4 @@ const SocialMediaMutations = extendType({ }, }) -export default [SocialMediaType, SocialMediaMutations] +export default [SocialMedia, SocialMediaMutations] diff --git a/packages/web/resolvers/subscription.ts b/packages/web/resolvers/subscription.ts index 8862aee6b..8a3e8dd9d 100644 --- a/packages/web/resolvers/subscription.ts +++ b/packages/web/resolvers/subscription.ts @@ -6,18 +6,18 @@ import { import { arg, booleanArg, extendType, nonNull, objectType, stringArg } from 'nexus' import stripe, { getOrCreateStripeCustomer, paymentErrorWrapper } from '@/nexus/utils/stripe' import { sendPremiumWelcomeEmail } from './utils' -import { MembershipSubscription } from 'nexus-prisma' +import { MembershipSubscription as MembershipSubscriptionType } from 'nexus-prisma' -const MembershipSubscriptionType = objectType({ - name: MembershipSubscription.$name, - description: MembershipSubscription.$description, +const MembershipSubscription = objectType({ + name: MembershipSubscriptionType.$name, + description: MembershipSubscriptionType.$description, definition(t) { - t.field(MembershipSubscription.id) - t.field(MembershipSubscription.period) - t.field(MembershipSubscription.userId) - t.field(MembershipSubscription.expiresAt) - t.field(MembershipSubscription.nextBillingDate) - t.field(MembershipSubscription.cancelAtPeriodEnd) + t.field(MembershipSubscriptionType.id) + t.field(MembershipSubscriptionType.period) + t.field(MembershipSubscriptionType.userId) + t.field(MembershipSubscriptionType.expiresAt) + t.field(MembershipSubscriptionType.nextBillingDate) + t.field(MembershipSubscriptionType.cancelAtPeriodEnd) t.boolean('isActive', { resolve: async (parent, _args, _ctx, _info) => { if (parent.expiresAt && parent.expiresAt < new Date(Date.now())) return false @@ -363,4 +363,4 @@ const MembershipSubscriptionMutations = extendType({ }, }) -export default [MembershipSubscriptionType, MembershipSubscriptionMutations] +export default [MembershipSubscription, MembershipSubscriptionMutations] diff --git a/packages/web/resolvers/thanks.ts b/packages/web/resolvers/thanks.ts index ee10814b7..a9e01b493 100644 --- a/packages/web/resolvers/thanks.ts +++ b/packages/web/resolvers/thanks.ts @@ -4,16 +4,16 @@ import { intArg, objectType, extendType, nonNull } from 'nexus' import { EmailNotificationType } from '@journaly/j-db-client' import { createInAppNotification, createEmailNotification, hasAuthorPermissions } from './utils' -import { CommentThanks } from 'nexus-prisma' +import { CommentThanks as CommentThanksType } from 'nexus-prisma' -const CommentThanksType = objectType({ - name: CommentThanks.$name, - description: CommentThanks.$description, +const CommentThanks = objectType({ + name: CommentThanksType.$name, + description: CommentThanksType.$description, definition(t) { - t.field(CommentThanks.id) - t.field(CommentThanks.commentId) - t.field(CommentThanks.author) - t.field(CommentThanks.comment) + t.field(CommentThanksType.id) + t.field(CommentThanksType.commentId) + t.field(CommentThanksType.author) + t.field(CommentThanksType.comment) }, }) @@ -140,4 +140,4 @@ const ThanksMutations = extendType({ }, }) -export default [CommentThanksType, ThanksMutations] +export default [CommentThanks, ThanksMutations] diff --git a/packages/web/resolvers/topic.ts b/packages/web/resolvers/topic.ts index e51f8be9b..ea5fcb591 100644 --- a/packages/web/resolvers/topic.ts +++ b/packages/web/resolvers/topic.ts @@ -1,32 +1,35 @@ import { PostStatus } from '@journaly/j-db-client' -import { arg, booleanArg, objectType, extendType, intArg, nonNull } from 'nexus' -import { Topic, TopicTranslation, UserInterest } from 'nexus-prisma' - -const TopicTranslationType = objectType({ - name: TopicTranslation.$name, +import { arg, booleanArg, objectType, extendType, intArg, nonNull, list } from 'nexus' +import { + Topic as TopicType, + TopicTranslation as TopicTranslationType, + UserInterest as UserInterestType, +} from 'nexus-prisma' + +const TopicTranslation = objectType({ + name: TopicTranslationType.$name, definition(t) { - t.field(TopicTranslation.id) - t.field(TopicTranslation.name) - t.field(TopicTranslation.uiLanguage) + t.field(TopicTranslationType.id) + t.field(TopicTranslationType.name) + t.field(TopicTranslationType.uiLanguage) }, }) -const UserInterestType = objectType({ - name: UserInterest.$name, - description: UserInterest.$description, +const UserInterest = objectType({ + name: UserInterestType.$name, + description: UserInterestType.$description, definition(t) { - t.field(UserInterest.id) - t.field(UserInterest.user) - t.field(UserInterest.topic) + t.field(UserInterestType.id) + t.field(UserInterestType.user) + t.field(UserInterestType.topic) }, }) -const TopicType = objectType({ - name: Topic.$name, - description: Topic.$description, - sourceType: 'prisma.Topic', +const Topic = objectType({ + name: TopicType.$name, + description: TopicType.$description, definition(t) { - t.field(Topic.id) + t.field(TopicType.id) t.string('name', { args: { uiLanguage: nonNull(arg({ type: 'UILanguage' })), @@ -46,10 +49,11 @@ const TopicType = objectType({ }) t.int('postCount', { args: { - languages: intArg({ - description: 'Language IDs to filter topics. No value means all languages.', - list: true, - }), + languages: list( + intArg({ + description: 'Language IDs to filter topics. No value means all languages.', + }), + ), }, resolve(parent, args, ctx) { let filter = {} @@ -185,4 +189,4 @@ const TopicMutations = extendType({ }, }) -export default [TopicTranslationType, UserInterestType, TopicType, TopicQueries, TopicMutations] +export default [TopicTranslation, UserInterest, Topic, TopicQueries, TopicMutations] diff --git a/packages/web/resolvers/user.ts b/packages/web/resolvers/user.ts index a726dcc3d..c119e4dc2 100644 --- a/packages/web/resolvers/user.ts +++ b/packages/web/resolvers/user.ts @@ -5,7 +5,7 @@ import { serialize } from 'cookie' import { isAcademic } from 'swot-node' import { PostStatus, EmailVerificationStatus, InAppNotificationType } from '@journaly/j-db-client' -import { User, UserBadge } from 'nexus-prisma' +import { User as UserType, UserBadge as UserBadgeType } from 'nexus-prisma' import { NotAuthorizedError, UserInputError } from './errors' import { @@ -26,12 +26,12 @@ const DatedActivityCount = objectType({ }, }) -const UserType = objectType({ - name: User.$name, - description: User.$description, +const User = objectType({ + name: UserType.$name, + description: UserType.$description, definition(t) { - t.field(User.id) - t.field(User.name) + t.field(UserType.id) + t.field(UserType.name) t.string('email', { resolve(parent, _args, ctx) { const { userId } = ctx.request @@ -43,25 +43,25 @@ const UserType = objectType({ return null }, }) - t.field(User.handle) - t.field(User.bio) - t.field(User.userRole) - t.field(User.city) - t.field(User.country) - t.field(User.badges) - t.field(User.posts) - t.field(User.savedPosts) - t.field(User.profileImage) - t.field(User.createdAt) - t.field(User.membershipSubscription) - t.field(User.isStudent) - t.field(User.socialMedia) - t.field(User.languages) - t.field(User.following) - t.field(User.followedBy) - t.field(User.lastFourCardNumbers) - t.field(User.cardBrand) - t.field(User.userInterests) + t.field(UserType.handle) + t.field(UserType.bio) + t.field(UserType.userRole) + t.field(UserType.city) + t.field(UserType.country) + t.field(UserType.badges) + t.field(UserType.posts) + t.field(UserType.savedPosts) + t.field(UserType.profileImage) + t.field(UserType.createdAt) + t.field(UserType.membershipSubscription) + t.field(UserType.isStudent) + t.field(UserType.socialMedia) + t.field(UserType.languages) + t.field(UserType.following) + t.field(UserType.followedBy) + t.field(UserType.lastFourCardNumbers) + t.field(UserType.cardBrand) + t.field(UserType.userInterests) t.boolean('emailAddressVerified', { async resolve(parent, _args, ctx, _info) { const auth = await ctx.db.auth.findUnique({ @@ -204,13 +204,13 @@ const InitiateAvatarImageUploadResponse = objectType({ }, }) -const UserBadgeType = objectType({ - name: UserBadge.$name, - description: UserBadge.$description, +const UserBadge = objectType({ + name: UserBadgeType.$name, + description: UserBadgeType.$description, definition(t) { - t.field(UserBadge.id) - t.field(UserBadge.type) - t.field(UserBadge.createdAt) + t.field(UserBadgeType.id) + t.field(UserBadgeType.type) + t.field(UserBadgeType.createdAt) }, }) @@ -765,8 +765,8 @@ const UserMutations = extendType({ }) export default [ - UserType, - UserBadgeType, + User, + UserBadge, UserQueries, UserMutations, InitiateAvatarImageUploadResponse, From ff7d952b8698c724b6b380950b1dee51deffd875 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Thu, 20 Jan 2022 17:23:15 +0000 Subject: [PATCH 14/18] Dear God, one last switch --- packages/web/resolvers/clap.ts | 16 ++-- packages/web/resolvers/comment.ts | 60 ++++++------- packages/web/resolvers/index.ts | 1 - packages/web/resolvers/inputTypes.ts | 6 +- packages/web/resolvers/language.ts | 51 +++++++---- packages/web/resolvers/notification.ts | 110 +++++++++++------------ packages/web/resolvers/post.ts | 117 ++++++++++++++----------- packages/web/resolvers/socialMedia.ts | 20 ++--- packages/web/resolvers/subscription.ts | 22 ++--- packages/web/resolvers/thanks.ts | 18 ++-- packages/web/resolvers/topic.ts | 40 ++++----- packages/web/resolvers/user.ts | 83 ++++++++++-------- 12 files changed, 289 insertions(+), 255 deletions(-) diff --git a/packages/web/resolvers/clap.ts b/packages/web/resolvers/clap.ts index fe3fdd4c8..896f7f3e5 100644 --- a/packages/web/resolvers/clap.ts +++ b/packages/web/resolvers/clap.ts @@ -1,15 +1,15 @@ import { extendType, intArg, objectType, nonNull } from 'nexus' import { EmailNotificationType, InAppNotificationType } from '@journaly/j-db-client' import { createInAppNotification, createEmailNotification, hasAuthorPermissions } from './utils' -import { PostClap as PostClapType } from 'nexus-prisma' +import { PostClap } from 'nexus-prisma' -const PostClap = objectType({ - name: PostClapType.$name, - description: PostClapType.$description, +const PostClapType = objectType({ + name: PostClap.$name, + description: PostClap.$description, definition(t) { - t.field(PostClapType.id) - t.field(PostClapType.author) - t.field(PostClapType.post) + t.field(PostClap.id) + t.field(PostClap.author) + t.field(PostClap.post) }, }) @@ -116,4 +116,4 @@ const PostClapMutations = extendType({ }, }) -export default [PostClap, PostClapMutations] +export default [PostClapType, PostClapMutations] diff --git a/packages/web/resolvers/comment.ts b/packages/web/resolvers/comment.ts index 947fcb780..5357d2578 100644 --- a/packages/web/resolvers/comment.ts +++ b/packages/web/resolvers/comment.ts @@ -9,11 +9,7 @@ import { LanguageLevel, PrismaClient, } from '@journaly/j-db-client' -import { - Comment as CommentType, - PostComment as PostCommentType, - Thread as ThreadType, -} from 'nexus-prisma' +import { Comment, PostComment, Thread } from 'nexus-prisma' import { hasAuthorPermissions, @@ -25,16 +21,16 @@ import { } from './utils' import { NotFoundError } from './errors' -const Thread = objectType({ - name: ThreadType.$name, - description: ThreadType.$description, +const ThreadType = objectType({ + name: Thread.$name, + description: Thread.$description, definition(t) { - t.field(ThreadType.id) - t.field(ThreadType.archived) - t.field(ThreadType.startIndex) - t.field(ThreadType.endIndex) - t.field(ThreadType.highlightedContent) - t.field(ThreadType.postId) + t.field(Thread.id) + t.field(Thread.archived) + t.field(Thread.startIndex) + t.field(Thread.endIndex) + t.field(Thread.highlightedContent) + t.field(Thread.postId) t.nonNull.list.nonNull.field('comments', { type: 'Comment', resolve: (parent, _, ctx) => { @@ -51,15 +47,15 @@ const Thread = objectType({ }, }) -const Comment = objectType({ - name: CommentType.$name, - description: CommentType.$description, +const CommentType = objectType({ + name: Comment.$name, + description: Comment.$description, definition(t) { - t.field(CommentType.id) - t.field(CommentType.author) - t.field(CommentType.body) - t.field(CommentType.createdAt) - t.field(CommentType.authorLanguageLevel) + t.field(Comment.id) + t.field(Comment.author) + t.field(Comment.body) + t.field(Comment.createdAt) + t.field(Comment.authorLanguageLevel) t.nonNull.list.nonNull.field('thanks', { type: 'CommentThanks', resolve: (parent, _, ctx) => { @@ -70,19 +66,19 @@ const Comment = objectType({ .thanks() }, }) - t.field(CommentType.thread) + t.field(Comment.thread) }, }) -const PostComment = objectType({ - name: PostCommentType.$name, - description: PostCommentType.$description, +const PostCommentType = objectType({ + name: PostComment.$name, + description: PostComment.$description, definition(t) { - t.field(PostCommentType.id) - t.field(PostCommentType.author) - t.field(PostCommentType.body) - t.field(PostCommentType.createdAt) - t.field(PostCommentType.authorLanguageLevel) + t.field(PostComment.id) + t.field(PostComment.author) + t.field(PostComment.body) + t.field(PostComment.createdAt) + t.field(PostComment.authorLanguageLevel) }, }) @@ -613,4 +609,4 @@ const CommentMutations = extendType({ }, }) -export default [Thread, Comment, PostComment, CommentMutations] +export default [ThreadType, CommentType, PostCommentType, CommentMutations] diff --git a/packages/web/resolvers/index.ts b/packages/web/resolvers/index.ts index 4b10c8a5d..a5febedf8 100644 --- a/packages/web/resolvers/index.ts +++ b/packages/web/resolvers/index.ts @@ -50,7 +50,6 @@ const schemaOpts: Parameters[0] = { ...NotificationTypes, ], shouldGenerateArtifacts: reflectionRun, - plugins: [declarativeWrappingPlugin()], } if (reflectionRun) { diff --git a/packages/web/resolvers/inputTypes.ts b/packages/web/resolvers/inputTypes.ts index 51252401a..741f6955e 100644 --- a/packages/web/resolvers/inputTypes.ts +++ b/packages/web/resolvers/inputTypes.ts @@ -4,7 +4,7 @@ import { inputObjectType } from 'nexus' // is concepturally the untion of two types, internal nodes and leaf nodes, but // AFAIK GQL does not have a native union type, so we simply unify all the fields // and make them all nullable. -export const EditorNode = inputObjectType({ +export const EditorNodeType = inputObjectType({ name: 'EditorNode', definition(t) { t.string('type') @@ -17,7 +17,7 @@ export const EditorNode = inputObjectType({ t.string('url') t.boolean('hyperlink') t.list.field('children', { - type: EditorNode, + type: EditorNodeType, }) }, }) @@ -30,4 +30,4 @@ export const HeadlineImageInput = inputObjectType({ }, }) -export default [EditorNode, HeadlineImageInput] +export default [EditorNodeType, HeadlineImageInput] diff --git a/packages/web/resolvers/language.ts b/packages/web/resolvers/language.ts index b070545be..eaa93bb8c 100644 --- a/packages/web/resolvers/language.ts +++ b/packages/web/resolvers/language.ts @@ -1,24 +1,24 @@ -import { arg, booleanArg, intArg, objectType, extendType, nonNull } from 'nexus' +import { arg, booleanArg, intArg, objectType, extendType, nonNull, enumType } from 'nexus' import { PostStatus } from '@journaly/j-db-client' -import { LanguageRelation as LanguageRelationType, Language as LanguageType } from 'nexus-prisma' +import { LanguageRelation, Language, LanguageLevel, UILanguage } from 'nexus-prisma' -const LanguageRelation = objectType({ - name: LanguageRelationType.$name, - description: LanguageRelationType.$description, +const LanguageRelationType = objectType({ + name: LanguageRelation.$name, + description: LanguageRelation.$description, definition(t) { - t.field(LanguageRelationType.id) - t.field(LanguageRelationType.language) - t.field(LanguageRelationType.level) + t.field(LanguageRelation.id) + t.field(LanguageRelation.language) + t.field(LanguageRelation.level) }, }) -const Language = objectType({ - name: LanguageType.$name, - description: LanguageType.$description, +const LanguageType = objectType({ + name: Language.$name, + description: Language.$description, definition(t) { - t.field(LanguageType.id) - t.field(LanguageType.name) - t.field(LanguageType.devName) + t.field(Language.id) + t.field(Language.name) + t.field(Language.devName) t.nonNull.list.nonNull.field('posts', { type: 'Post', resolve: (parent, _, ctx) => { @@ -29,7 +29,7 @@ const Language = objectType({ .posts() }, }) - t.field(LanguageType.dialect) + t.field(Language.dialect) t.int('postCount', { resolve(parent, _, ctx) { return ctx.db.post.count({ @@ -45,6 +45,18 @@ const Language = objectType({ }, }) +const UILanguageType = enumType({ + name: UILanguage.name, + description: UILanguage.description, + members: UILanguage.members, +}) + +const LanguageLevelType = enumType({ + name: LanguageLevel.name, + description: LanguageLevel.description, + members: LanguageLevel.members, +}) + const LanguageQueries = extendType({ type: 'Query', definition(t) { @@ -153,4 +165,11 @@ const LanguageMutations = extendType({ }, }) -export default [LanguageRelation, Language, LanguageQueries, LanguageMutations] +export default [ + LanguageRelationType, + LanguageType, + UILanguageType, + LanguageLevelType, + LanguageQueries, + LanguageMutations, +] diff --git a/packages/web/resolvers/notification.ts b/packages/web/resolvers/notification.ts index 1b4d83bc2..314507aa2 100644 --- a/packages/web/resolvers/notification.ts +++ b/packages/web/resolvers/notification.ts @@ -1,26 +1,26 @@ import { arg, extendType, intArg, nonNull, objectType } from 'nexus' import { - InAppNotification as InAppNotificationType, - ThreadCommentNotification as ThreadCommentNotificationType, - PostCommentNotification as PostCommentNotificationType, - NewPostNotification as NewPostNotificationType, - NewFollowerNotification as NewFollowerNotificationType, - PostClapNotification as PostClapNotificationType, - ThreadCommentThanksNotification as ThreadCommentThanksNotificationType, + InAppNotification, + ThreadCommentNotification, + PostCommentNotification, + NewPostNotification, + NewFollowerNotification, + PostClapNotification, + ThreadCommentThanksNotification, } from 'nexus-prisma' -const InAppNotification = objectType({ - name: InAppNotificationType.$name, - description: InAppNotificationType.$description, +const InAppNotificationType = objectType({ + name: InAppNotification.$name, + description: InAppNotification.$description, definition(t) { - t.field(InAppNotificationType.id) - t.field(InAppNotificationType.userId) - t.field(InAppNotificationType.type) - t.field(InAppNotificationType.bumpedAt) - t.field(InAppNotificationType.readStatus) - t.field(InAppNotificationType.post) - t.field(InAppNotificationType.readStatus) - t.field(InAppNotificationType.triggeringUser) + t.field(InAppNotification.id) + t.field(InAppNotification.userId) + t.field(InAppNotification.type) + t.field(InAppNotification.bumpedAt) + t.field(InAppNotification.readStatus) + t.field(InAppNotification.post) + t.field(InAppNotification.readStatus) + t.field(InAppNotification.triggeringUser) t.nonNull.list.nonNull.field('threadCommentNotifications', { type: 'ThreadCommentNotification', resolve: (parent, _, ctx) => { @@ -84,57 +84,57 @@ const InAppNotification = objectType({ }, }) -const ThreadCommentNotification = objectType({ - name: ThreadCommentNotificationType.$name, - description: ThreadCommentNotificationType.$description, +const ThreadCommentNotificationType = objectType({ + name: ThreadCommentNotification.$name, + description: ThreadCommentNotification.$description, definition(t) { - t.field(ThreadCommentNotificationType.id) - t.field(ThreadCommentNotificationType.comment) + t.field(ThreadCommentNotification.id) + t.field(ThreadCommentNotification.comment) }, }) -const PostCommentNotification = objectType({ - name: PostCommentNotificationType.$name, - description: PostCommentNotificationType.$description, +const PostCommentNotificationType = objectType({ + name: PostCommentNotification.$name, + description: PostCommentNotification.$description, definition(t) { - t.field(PostCommentNotificationType.id) - t.field(PostCommentNotificationType.postComment) + t.field(PostCommentNotification.id) + t.field(PostCommentNotification.postComment) }, }) -const NewFollowerNotification = objectType({ - name: NewFollowerNotificationType.$name, - description: NewFollowerNotificationType.$description, +const NewFollowerNotificationType = objectType({ + name: NewFollowerNotification.$name, + description: NewFollowerNotification.$description, definition(t) { - t.field(NewFollowerNotificationType.id) - t.field(NewFollowerNotificationType.followingUser) + t.field(NewFollowerNotification.id) + t.field(NewFollowerNotification.followingUser) }, }) -const PostClapNotification = objectType({ - name: PostClapNotificationType.$name, - description: PostClapNotificationType.$description, +const PostClapNotificationType = objectType({ + name: PostClapNotification.$name, + description: PostClapNotification.$description, definition(t) { - t.field(PostClapNotificationType.id) - t.field(PostClapNotificationType.postClap) + t.field(PostClapNotification.id) + t.field(PostClapNotification.postClap) }, }) -const ThreadCommentThanksNotification = objectType({ - name: ThreadCommentThanksNotificationType.$name, - description: ThreadCommentThanksNotificationType.$description, +const ThreadCommentThanksNotificationType = objectType({ + name: ThreadCommentThanksNotification.$name, + description: ThreadCommentThanksNotification.$description, definition(t) { - t.field(ThreadCommentThanksNotificationType.id) - t.field(ThreadCommentThanksNotificationType.thanks) + t.field(ThreadCommentThanksNotification.id) + t.field(ThreadCommentThanksNotification.thanks) }, }) -const NewPostNotification = objectType({ - name: NewPostNotificationType.$name, - description: NewPostNotificationType.$description, +const NewPostNotificationType = objectType({ + name: NewPostNotification.$name, + description: NewPostNotification.$description, definition(t) { - t.field(NewPostNotificationType.id) - t.field(NewPostNotificationType.post) + t.field(NewPostNotification.id) + t.field(NewPostNotification.post) }, }) @@ -216,12 +216,12 @@ const NotificationMutations = extendType({ }) export default [ - InAppNotification, - ThreadCommentNotification, - PostCommentNotification, - NewFollowerNotification, - PostClapNotification, - ThreadCommentThanksNotification, - NewPostNotification, + InAppNotificationType, + ThreadCommentNotificationType, + PostCommentNotificationType, + NewFollowerNotificationType, + PostClapNotificationType, + ThreadCommentThanksNotificationType, + NewPostNotificationType, NotificationMutations, ] diff --git a/packages/web/resolvers/post.ts b/packages/web/resolvers/post.ts index 4d24bbf5b..9fb57a548 100644 --- a/packages/web/resolvers/post.ts +++ b/packages/web/resolvers/post.ts @@ -1,4 +1,14 @@ -import { arg, intArg, stringArg, booleanArg, objectType, extendType, nonNull, list } from 'nexus' +import { + arg, + intArg, + stringArg, + booleanArg, + objectType, + extendType, + nonNull, + list, + enumType, +} from 'nexus' import { processEditorDocument, @@ -16,7 +26,6 @@ import { import { NotFoundError, NotAuthorizedError, ResolverError } from './errors' import { Prisma, - PostStatus, BadgeType, PrismaClient, LanguageRelation, @@ -24,9 +33,10 @@ import { UserRole, EmailVerificationStatus, InAppNotificationType, + PostStatus as PostStatusEnum, } from '@journaly/j-db-client' -import { Post as PostType, PostTopic as PostTopicType } from 'nexus-prisma' -import { EditorNode, HeadlineImageInput } from './inputTypes' +import { Post, PostTopic, PostStatus } from 'nexus-prisma' +import { EditorNodeType, HeadlineImageInput } from './inputTypes' import { POST_BUMP_LIMIT } from '../constants' const assignPostCountBadges = async (db: PrismaClient, userId: number): Promise => { @@ -39,7 +49,7 @@ const assignPostCountBadges = async (db: PrismaClient, userId: number): Promise< FROM "Post" WHERE "authorId" = ${userId} - AND "status" = ${PostStatus.PUBLISHED} + AND "status" = ${PostStatusEnum.PUBLISHED} ) INSERT INTO "UserBadge" ("type", "userId") ( ( @@ -80,28 +90,34 @@ const assignPostCountBadges = async (db: PrismaClient, userId: number): Promise< } } -const PostTopic = objectType({ - name: PostTopicType.$name, - description: PostTopicType.$description, +const PostTopicType = objectType({ + name: PostTopic.$name, + description: PostTopic.$description, definition(t) { - t.field(PostTopicType.id) - t.field(PostTopicType.post) - t.field(PostTopicType.topic) + t.field(PostTopic.id) + t.field(PostTopic.post) + t.field(PostTopic.topic) }, }) -const Post = objectType({ - name: PostType.$name, - description: PostType.$description, +const PostStatusType = enumType({ + name: PostStatus.name, + description: PostStatus.description, + members: PostStatus.members, +}) + +const PostType = objectType({ + name: Post.$name, + description: Post.$description, definition(t) { - t.field(PostType.id) - t.field(PostType.title) - t.field(PostType.body) - t.field(PostType.excerpt) - t.field(PostType.readTime) - t.field(PostType.author) - t.field(PostType.authorId) - t.field(PostType.status) + t.field(Post.id) + t.field(Post.title) + t.field(Post.body) + t.field(Post.excerpt) + t.field(Post.readTime) + t.field(Post.author) + t.field(Post.authorId) + t.field(Post.status) t.nonNull.list.nonNull.field('claps', { type: 'PostClap', resolve: (parent, _, ctx) => { @@ -145,16 +161,16 @@ const Post = objectType({ .postComments() }, }) - t.field(PostType.language) - t.field(PostType.publishedLanguageLevel) - t.field(PostType.privateShareId) - t.field(PostType.createdAt) - t.field(PostType.updatedAt) - t.field(PostType.bodySrc) - t.field(PostType.headlineImage) - t.field(PostType.publishedAt) - t.field(PostType.bumpedAt) - t.field(PostType.bumpCount) + t.field(Post.language) + t.field(Post.publishedLanguageLevel) + t.field(Post.privateShareId) + t.field(Post.createdAt) + t.field(Post.updatedAt) + t.field(Post.bodySrc) + t.field(Post.headlineImage) + t.field(Post.publishedAt) + t.field(Post.bumpedAt) + t.field(Post.bumpCount) t.int('commentCount', { resolve: async (parent, _args, ctx, _info) => { const [threadCommentCount, postCommentCount] = await Promise.all([ @@ -181,7 +197,7 @@ const Post = objectType({ // Includes 1 page and the total number of posts. // posts: the returned page after filtering. // count: the total posts matching the filter. -const PostPage = objectType({ +const PostPageType = objectType({ name: 'PostPage', definition(t) { t.list.field('posts', { @@ -191,7 +207,7 @@ const PostPage = objectType({ }, }) -const InitiatePostImageUploadResponse = objectType({ +const InitiatePostImageUploadResponseType = objectType({ name: 'InitiatePostImageUploadResponse', definition(t) { t.string('uploadUrl', { description: 'URL for the client to PUT an image to' }) @@ -201,7 +217,7 @@ const InitiatePostImageUploadResponse = objectType({ }, }) -const InitiateInlinePostImageUploadResponse = objectType({ +const InitiateInlinePostImageUploadResponseType = objectType({ name: 'InitiateInlinePostImageUploadResponse', definition(t) { t.string('uploadUrl', { description: 'URL for the client to PUT an image to' }) @@ -240,7 +256,7 @@ const PostQueries = extendType({ author: true, }, }) - if (post?.status === PostStatus.PRIVATE && post?.authorId !== userId) { + if (post?.status === PostStatusEnum.PRIVATE && post?.authorId !== userId) { throw new NotAuthorizedError() } } @@ -456,7 +472,7 @@ const PostMutations = extendType({ type: 'Post', args: { title: nonNull(stringArg()), - body: nonNull(list(EditorNode.asArg())), + body: nonNull(list(EditorNodeType.asArg())), languageId: nonNull(intArg()), topicIds: list(intArg()), status: nonNull(arg({ type: 'PostStatus' })), @@ -465,8 +481,8 @@ const PostMutations = extendType({ resolve: async (_parent, args, ctx) => { const { title, body, languageId, status, headlineImage } = args const { userId } = ctx.request - const isPublished = status === PostStatus.PUBLISHED - const isPrivate = status === PostStatus.PRIVATE + const isPublished = status === PostStatusEnum.PUBLISHED + const isPrivate = status === PostStatusEnum.PRIVATE if (!body) { throw new ResolverError('We need a body!', {}) @@ -526,7 +542,7 @@ const PostMutations = extendType({ }) if (args.topicIds) { - const insertPromises = args.topicIds.map((topicId) => { + const insertPromises = args.topicIds.map((topicId: number) => { return ctx.db.postTopic.create({ data: { post: { connect: { id: post.id } }, @@ -539,7 +555,7 @@ const PostMutations = extendType({ } if (isPublished) { - const promises: Promise[] = user.followedBy.map((follower) => { + const promises: Promise[] = user.followedBy.map((follower: User) => { return createInAppNotification(ctx.db, { userId: follower.id, type: InAppNotificationType.NEW_POST, @@ -564,7 +580,7 @@ const PostMutations = extendType({ title: stringArg(), languageId: intArg(), topicIds: list(intArg()), - body: list(EditorNode.asArg()), + body: list(EditorNodeType.asArg()), status: arg({ type: 'PostStatus' }), headlineImage: nonNull(HeadlineImageInput.asArg()), }, @@ -611,7 +627,7 @@ const PostMutations = extendType({ } if (args.status) { - if (args.status === PostStatus.PRIVATE) { + if (args.status === PostStatusEnum.PRIVATE) { data.privateShareId = generatePostPrivateShareId() } data.status = args.status @@ -677,7 +693,7 @@ const PostMutations = extendType({ where: { postId: args.postId }, }) - const insertPromises = args.topicIds.map((topicId) => { + const insertPromises = args.topicIds.map((topicId: number) => { return ctx.db.postTopic.create({ data: { post: { connect: { id: args.postId } }, @@ -695,7 +711,7 @@ const PostMutations = extendType({ }) if (args.status === 'PUBLISHED' && !originalPost.publishedAt) { - const promises: Promise[] = currentUser.followedBy.map((follower) => { + const promises: Promise[] = currentUser.followedBy.map((follower: User) => { return createInAppNotification(ctx.db, { userId: follower.id, type: InAppNotificationType.NEW_POST, @@ -952,11 +968,12 @@ const PostMutations = extendType({ }) export default [ - PostTopic, - Post, - PostPage, - InitiatePostImageUploadResponse, - InitiateInlinePostImageUploadResponse, + PostTopicType, + PostType, + PostPageType, + InitiatePostImageUploadResponseType, + InitiateInlinePostImageUploadResponseType, PostQueries, PostMutations, + PostStatusType, ] diff --git a/packages/web/resolvers/socialMedia.ts b/packages/web/resolvers/socialMedia.ts index ff69718cb..8055d717e 100644 --- a/packages/web/resolvers/socialMedia.ts +++ b/packages/web/resolvers/socialMedia.ts @@ -1,17 +1,17 @@ import { stringArg, objectType, extendType } from 'nexus' import { NotAuthorizedError, UserInputError } from './errors' import { validateSocialMediaInput } from './utils/socialMedia' -import { SocialMedia as SocialMediaType } from 'nexus-prisma' +import { SocialMedia } from 'nexus-prisma' -const SocialMedia = objectType({ - name: SocialMediaType.$name, - description: SocialMediaType.$description, +const SocialMediaType = objectType({ + name: SocialMedia.$name, + description: SocialMedia.$description, definition(t) { - t.field(SocialMediaType.id) - t.field(SocialMediaType.facebook) - t.field(SocialMediaType.youtube) - t.field(SocialMediaType.instagram) - t.field(SocialMediaType.website) + t.field(SocialMedia.id) + t.field(SocialMedia.facebook) + t.field(SocialMedia.youtube) + t.field(SocialMedia.instagram) + t.field(SocialMedia.website) }, }) @@ -70,4 +70,4 @@ const SocialMediaMutations = extendType({ }, }) -export default [SocialMedia, SocialMediaMutations] +export default [SocialMediaType, SocialMediaMutations] diff --git a/packages/web/resolvers/subscription.ts b/packages/web/resolvers/subscription.ts index 8a3e8dd9d..8862aee6b 100644 --- a/packages/web/resolvers/subscription.ts +++ b/packages/web/resolvers/subscription.ts @@ -6,18 +6,18 @@ import { import { arg, booleanArg, extendType, nonNull, objectType, stringArg } from 'nexus' import stripe, { getOrCreateStripeCustomer, paymentErrorWrapper } from '@/nexus/utils/stripe' import { sendPremiumWelcomeEmail } from './utils' -import { MembershipSubscription as MembershipSubscriptionType } from 'nexus-prisma' +import { MembershipSubscription } from 'nexus-prisma' -const MembershipSubscription = objectType({ - name: MembershipSubscriptionType.$name, - description: MembershipSubscriptionType.$description, +const MembershipSubscriptionType = objectType({ + name: MembershipSubscription.$name, + description: MembershipSubscription.$description, definition(t) { - t.field(MembershipSubscriptionType.id) - t.field(MembershipSubscriptionType.period) - t.field(MembershipSubscriptionType.userId) - t.field(MembershipSubscriptionType.expiresAt) - t.field(MembershipSubscriptionType.nextBillingDate) - t.field(MembershipSubscriptionType.cancelAtPeriodEnd) + t.field(MembershipSubscription.id) + t.field(MembershipSubscription.period) + t.field(MembershipSubscription.userId) + t.field(MembershipSubscription.expiresAt) + t.field(MembershipSubscription.nextBillingDate) + t.field(MembershipSubscription.cancelAtPeriodEnd) t.boolean('isActive', { resolve: async (parent, _args, _ctx, _info) => { if (parent.expiresAt && parent.expiresAt < new Date(Date.now())) return false @@ -363,4 +363,4 @@ const MembershipSubscriptionMutations = extendType({ }, }) -export default [MembershipSubscription, MembershipSubscriptionMutations] +export default [MembershipSubscriptionType, MembershipSubscriptionMutations] diff --git a/packages/web/resolvers/thanks.ts b/packages/web/resolvers/thanks.ts index a9e01b493..ee10814b7 100644 --- a/packages/web/resolvers/thanks.ts +++ b/packages/web/resolvers/thanks.ts @@ -4,16 +4,16 @@ import { intArg, objectType, extendType, nonNull } from 'nexus' import { EmailNotificationType } from '@journaly/j-db-client' import { createInAppNotification, createEmailNotification, hasAuthorPermissions } from './utils' -import { CommentThanks as CommentThanksType } from 'nexus-prisma' +import { CommentThanks } from 'nexus-prisma' -const CommentThanks = objectType({ - name: CommentThanksType.$name, - description: CommentThanksType.$description, +const CommentThanksType = objectType({ + name: CommentThanks.$name, + description: CommentThanks.$description, definition(t) { - t.field(CommentThanksType.id) - t.field(CommentThanksType.commentId) - t.field(CommentThanksType.author) - t.field(CommentThanksType.comment) + t.field(CommentThanks.id) + t.field(CommentThanks.commentId) + t.field(CommentThanks.author) + t.field(CommentThanks.comment) }, }) @@ -140,4 +140,4 @@ const ThanksMutations = extendType({ }, }) -export default [CommentThanks, ThanksMutations] +export default [CommentThanksType, ThanksMutations] diff --git a/packages/web/resolvers/topic.ts b/packages/web/resolvers/topic.ts index ea5fcb591..f90b52fec 100644 --- a/packages/web/resolvers/topic.ts +++ b/packages/web/resolvers/topic.ts @@ -1,35 +1,31 @@ import { PostStatus } from '@journaly/j-db-client' import { arg, booleanArg, objectType, extendType, intArg, nonNull, list } from 'nexus' -import { - Topic as TopicType, - TopicTranslation as TopicTranslationType, - UserInterest as UserInterestType, -} from 'nexus-prisma' - -const TopicTranslation = objectType({ - name: TopicTranslationType.$name, +import { Topic, TopicTranslation, UserInterest } from 'nexus-prisma' + +const TopicTranslationType = objectType({ + name: TopicTranslation.$name, definition(t) { - t.field(TopicTranslationType.id) - t.field(TopicTranslationType.name) - t.field(TopicTranslationType.uiLanguage) + t.field(TopicTranslation.id) + t.field(TopicTranslation.name) + t.field(TopicTranslation.uiLanguage) }, }) -const UserInterest = objectType({ - name: UserInterestType.$name, - description: UserInterestType.$description, +const UserInterestType = objectType({ + name: UserInterest.$name, + description: UserInterest.$description, definition(t) { - t.field(UserInterestType.id) - t.field(UserInterestType.user) - t.field(UserInterestType.topic) + t.field(UserInterest.id) + t.field(UserInterest.user) + t.field(UserInterest.topic) }, }) -const Topic = objectType({ - name: TopicType.$name, - description: TopicType.$description, +const TopicType = objectType({ + name: Topic.$name, + description: Topic.$description, definition(t) { - t.field(TopicType.id) + t.field(Topic.id) t.string('name', { args: { uiLanguage: nonNull(arg({ type: 'UILanguage' })), @@ -189,4 +185,4 @@ const TopicMutations = extendType({ }, }) -export default [TopicTranslation, UserInterest, Topic, TopicQueries, TopicMutations] +export default [TopicTranslationType, UserInterestType, TopicType, TopicQueries, TopicMutations] diff --git a/packages/web/resolvers/user.ts b/packages/web/resolvers/user.ts index c119e4dc2..ea6fc6f63 100644 --- a/packages/web/resolvers/user.ts +++ b/packages/web/resolvers/user.ts @@ -1,11 +1,11 @@ -import { intArg, stringArg, objectType, extendType, nonNull } from 'nexus' +import { intArg, stringArg, objectType, extendType, nonNull, enumType } from 'nexus' import bcrypt from 'bcryptjs' import jwt from 'jsonwebtoken' import { serialize } from 'cookie' import { isAcademic } from 'swot-node' import { PostStatus, EmailVerificationStatus, InAppNotificationType } from '@journaly/j-db-client' -import { User as UserType, UserBadge as UserBadgeType } from 'nexus-prisma' +import { User, UserBadge, UserRole } from 'nexus-prisma' import { NotAuthorizedError, UserInputError } from './errors' import { @@ -16,7 +16,7 @@ import { } from './utils' import { generateToken, validateUpdateUserMutationData } from './utils/userValidation' -const DatedActivityCount = objectType({ +const DatedActivityCountType = objectType({ name: 'DatedActivityCount', definition(t) { t.string('date') @@ -26,12 +26,12 @@ const DatedActivityCount = objectType({ }, }) -const User = objectType({ - name: UserType.$name, - description: UserType.$description, +const UserType = objectType({ + name: User.$name, + description: User.$description, definition(t) { - t.field(UserType.id) - t.field(UserType.name) + t.field(User.id) + t.field(User.name) t.string('email', { resolve(parent, _args, ctx) { const { userId } = ctx.request @@ -43,25 +43,25 @@ const User = objectType({ return null }, }) - t.field(UserType.handle) - t.field(UserType.bio) - t.field(UserType.userRole) - t.field(UserType.city) - t.field(UserType.country) - t.field(UserType.badges) - t.field(UserType.posts) - t.field(UserType.savedPosts) - t.field(UserType.profileImage) - t.field(UserType.createdAt) - t.field(UserType.membershipSubscription) - t.field(UserType.isStudent) - t.field(UserType.socialMedia) - t.field(UserType.languages) - t.field(UserType.following) - t.field(UserType.followedBy) - t.field(UserType.lastFourCardNumbers) - t.field(UserType.cardBrand) - t.field(UserType.userInterests) + t.field(User.handle) + t.field(User.bio) + t.field(User.userRole) + t.field(User.city) + t.field(User.country) + t.field(User.badges) + t.field(User.posts) + t.field(User.savedPosts) + t.field(User.profileImage) + t.field(User.createdAt) + t.field(User.membershipSubscription) + t.field(User.isStudent) + t.field(User.socialMedia) + t.field(User.languages) + t.field(User.following) + t.field(User.followedBy) + t.field(User.lastFourCardNumbers) + t.field(User.cardBrand) + t.field(User.userInterests) t.boolean('emailAddressVerified', { async resolve(parent, _args, ctx, _info) { const auth = await ctx.db.auth.findUnique({ @@ -195,7 +195,7 @@ const User = objectType({ }, }) -const InitiateAvatarImageUploadResponse = objectType({ +const InitiateAvatarImageUploadResponseType = objectType({ name: 'InitiateAvatarImageUploadResponse', definition(t) { t.string('uploadUrl', { description: 'URL for the client to PUT an image to' }) @@ -204,16 +204,22 @@ const InitiateAvatarImageUploadResponse = objectType({ }, }) -const UserBadge = objectType({ - name: UserBadgeType.$name, - description: UserBadgeType.$description, +const UserBadgeType = objectType({ + name: UserBadge.$name, + description: UserBadge.$description, definition(t) { - t.field(UserBadgeType.id) - t.field(UserBadgeType.type) - t.field(UserBadgeType.createdAt) + t.field(UserBadge.id) + t.field(UserBadge.type) + t.field(UserBadge.createdAt) }, }) +const UserRoleType = enumType({ + name: UserRole.name, + description: UserRole.description, + members: UserRole.members, +}) + const UserQueries = extendType({ type: 'Query', definition(t) { @@ -765,10 +771,11 @@ const UserMutations = extendType({ }) export default [ - User, - UserBadge, + UserType, + UserBadgeType, + UserRoleType, + InitiateAvatarImageUploadResponseType, + DatedActivityCountType, UserQueries, UserMutations, - InitiateAvatarImageUploadResponse, - DatedActivityCount, ] From 1fc64bdf8f6afb31f1604d747981d634e4db526c Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Thu, 20 Jan 2022 17:59:12 +0000 Subject: [PATCH 15/18] Many fixes, get things building to first proper blocker --- packages/web/package-lock.json | 14 ++++++++++++++ packages/web/package.json | 2 ++ packages/web/resolvers/badge.ts | 10 ++++++++++ packages/web/resolvers/comment.ts | 5 +++-- packages/web/resolvers/index.ts | 6 +++++- packages/web/resolvers/notification.ts | 18 +++++++++++++++++- packages/web/resolvers/post.ts | 5 +++-- packages/web/resolvers/subscription.ts | 19 ++++++++++++++++--- packages/web/resolvers/utils/dateTime.ts | 4 ++++ 9 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 packages/web/resolvers/badge.ts create mode 100644 packages/web/resolvers/utils/dateTime.ts diff --git a/packages/web/package-lock.json b/packages/web/package-lock.json index 3221a53df..1af860ffd 100644 --- a/packages/web/package-lock.json +++ b/packages/web/package-lock.json @@ -3462,6 +3462,15 @@ } } }, + "@types/graphql-iso-date": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/graphql-iso-date/-/graphql-iso-date-3.4.0.tgz", + "integrity": "sha512-V3jITHTsoI2E8TGt9+/HPDz6LWt3z9/HYnPJYWI6WwiLRexsngg7KzaQlCgQkA4jkEbGPROUD0hJFc9F02W9WA==", + "dev": true, + "requires": { + "graphql": "^15.1.0" + } + }, "@types/hast": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", @@ -8138,6 +8147,11 @@ "apollo-server-types": "^0.9.0" } }, + "graphql-iso-date": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/graphql-iso-date/-/graphql-iso-date-3.6.1.tgz", + "integrity": "sha512-AwFGIuYMJQXOEAgRlJlFL4H1ncFM8n8XmoVDTNypNOZyQ8LFDG2ppMFlsS862BSTCDcSUfHp8PD3/uJhv7t59Q==" + }, "graphql-request": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-3.7.0.tgz", diff --git a/packages/web/package.json b/packages/web/package.json index 149fad311..dd6e5453b 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -63,6 +63,7 @@ "dotenv": "^8.2.0", "escape-html": "^1.0.3", "graphql": "^15.4.0", + "graphql-iso-date": "^3.6.1", "is-hotkey": "^0.1.6", "is-url": "^1.2.4", "isomorphic-unfetch": "^3.0.0", @@ -107,6 +108,7 @@ "@types/classnames": "^2.2.10", "@types/cookie": "^0.4.0", "@types/express": "^4.17.11", + "@types/graphql-iso-date": "^3.4.0", "@types/is-url": "^1.2.28", "@types/node": "^14.14.31", "@types/nprogress": "^0.2.0", diff --git a/packages/web/resolvers/badge.ts b/packages/web/resolvers/badge.ts new file mode 100644 index 000000000..a26b3cc8a --- /dev/null +++ b/packages/web/resolvers/badge.ts @@ -0,0 +1,10 @@ +import { enumType } from 'nexus' +import { BadgeType } from 'nexus-prisma' + +const BadgeTypeEnum = enumType({ + name: BadgeType.name, + description: BadgeType.description, + members: BadgeType.members, +}) + +export default [BadgeTypeEnum] diff --git a/packages/web/resolvers/comment.ts b/packages/web/resolvers/comment.ts index 5357d2578..bcda70f15 100644 --- a/packages/web/resolvers/comment.ts +++ b/packages/web/resolvers/comment.ts @@ -37,11 +37,12 @@ const ThreadType = objectType({ return ctx.db.thread .findUnique({ where: { id: parent.id }, + }) + .comments({ orderBy: { - createdAt: true, + createdAt: 'desc', }, }) - .comments() }, }) }, diff --git a/packages/web/resolvers/index.ts b/packages/web/resolvers/index.ts index a5febedf8..74cacdcf0 100644 --- a/packages/web/resolvers/index.ts +++ b/packages/web/resolvers/index.ts @@ -1,6 +1,6 @@ import * as path from 'path' -import { makeSchema, declarativeWrappingPlugin } from 'nexus' +import { makeSchema } from 'nexus' import CommentTypes from './comment' import TopicTypes from './topic' @@ -14,6 +14,8 @@ import ClapTypes from './clap' import ThanksTypes from './thanks' import SubscriptionTypes from './subscription' import NotificationTypes from './notification' +import BadgeTypes from './badge' +import { DateTime } from './utils/dateTime' const reflectionRun = !!parseInt(process.env.NEXUS_REFLECTION || '0') @@ -48,6 +50,8 @@ const schemaOpts: Parameters[0] = { ...ThanksTypes, ...SubscriptionTypes, ...NotificationTypes, + ...BadgeTypes, + DateTime, ], shouldGenerateArtifacts: reflectionRun, } diff --git a/packages/web/resolvers/notification.ts b/packages/web/resolvers/notification.ts index 314507aa2..2f064a62e 100644 --- a/packages/web/resolvers/notification.ts +++ b/packages/web/resolvers/notification.ts @@ -1,12 +1,14 @@ -import { arg, extendType, intArg, nonNull, objectType } from 'nexus' +import { arg, enumType, extendType, intArg, nonNull, objectType } from 'nexus' import { InAppNotification, + InAppNotificationType as InAppNotificationEnum, ThreadCommentNotification, PostCommentNotification, NewPostNotification, NewFollowerNotification, PostClapNotification, ThreadCommentThanksNotification, + NotificationReadStatus, } from 'nexus-prisma' const InAppNotificationType = objectType({ @@ -84,6 +86,12 @@ const InAppNotificationType = objectType({ }, }) +const InAppNotificationTypeEnumType = enumType({ + name: InAppNotificationEnum.name, + description: InAppNotificationEnum.description, + members: InAppNotificationEnum.members, +}) + const ThreadCommentNotificationType = objectType({ name: ThreadCommentNotification.$name, description: ThreadCommentNotification.$description, @@ -138,6 +146,12 @@ const NewPostNotificationType = objectType({ }, }) +const NotificationReadStatusType = enumType({ + name: NotificationReadStatus.name, + description: NotificationReadStatus.description, + members: NotificationReadStatus.members, +}) + const NotificationMutations = extendType({ type: 'Mutation', definition(t) { @@ -217,6 +231,7 @@ const NotificationMutations = extendType({ export default [ InAppNotificationType, + InAppNotificationTypeEnumType, ThreadCommentNotificationType, PostCommentNotificationType, NewFollowerNotificationType, @@ -224,4 +239,5 @@ export default [ ThreadCommentThanksNotificationType, NewPostNotificationType, NotificationMutations, + NotificationReadStatusType, ] diff --git a/packages/web/resolvers/post.ts b/packages/web/resolvers/post.ts index 9fb57a548..68adfa2f4 100644 --- a/packages/web/resolvers/post.ts +++ b/packages/web/resolvers/post.ts @@ -154,11 +154,12 @@ const PostType = objectType({ return ctx.db.post .findUnique({ where: { id: parent.id }, + }) + .postComments({ orderBy: { - createdAt: true, + createdAt: 'desc', }, }) - .postComments() }, }) t.field(Post.language) diff --git a/packages/web/resolvers/subscription.ts b/packages/web/resolvers/subscription.ts index 8862aee6b..3c90f1f73 100644 --- a/packages/web/resolvers/subscription.ts +++ b/packages/web/resolvers/subscription.ts @@ -3,10 +3,13 @@ import { MembershipSubscriptionPeriod, PrismaClient, } from '@journaly/j-db-client' -import { arg, booleanArg, extendType, nonNull, objectType, stringArg } from 'nexus' +import { arg, booleanArg, enumType, extendType, nonNull, objectType, stringArg } from 'nexus' import stripe, { getOrCreateStripeCustomer, paymentErrorWrapper } from '@/nexus/utils/stripe' import { sendPremiumWelcomeEmail } from './utils' -import { MembershipSubscription } from 'nexus-prisma' +import { + MembershipSubscription, + MembershipSubscriptionPeriod as MembershipSubscriptionPeriodEnum, +} from 'nexus-prisma' const MembershipSubscriptionType = objectType({ name: MembershipSubscription.$name, @@ -27,6 +30,12 @@ const MembershipSubscriptionType = objectType({ }, }) +const MembershipSubscriptionPeriodEnumType = enumType({ + name: MembershipSubscriptionPeriodEnum.name, + description: MembershipSubscriptionPeriodEnum.description, + members: MembershipSubscriptionPeriodEnum.members, +}) + const getSubscriptionPriceId = (subType: MembershipSubscriptionPeriod) => { switch (subType) { case MembershipSubscriptionPeriod.MONTHLY: @@ -363,4 +372,8 @@ const MembershipSubscriptionMutations = extendType({ }, }) -export default [MembershipSubscriptionType, MembershipSubscriptionMutations] +export default [ + MembershipSubscriptionType, + MembershipSubscriptionPeriodEnumType, + MembershipSubscriptionMutations, +] diff --git a/packages/web/resolvers/utils/dateTime.ts b/packages/web/resolvers/utils/dateTime.ts new file mode 100644 index 000000000..34ed702a2 --- /dev/null +++ b/packages/web/resolvers/utils/dateTime.ts @@ -0,0 +1,4 @@ +import { GraphQLDateTime } from 'graphql-iso-date' +import { asNexusMethod } from 'nexus' + +export const DateTime = asNexusMethod(GraphQLDateTime, 'date') From f5b9772f3d4a489a894ca3a75af7909902e03f86 Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sun, 23 Jan 2022 08:56:43 +0000 Subject: [PATCH 16/18] Another big push --- packages/j-db-client/package-lock.json | 2 +- packages/j-db-client/package.json | 2 +- packages/web/package-lock.json | 5 +++-- packages/web/package.json | 5 +++-- packages/web/resolvers/index.ts | 2 +- packages/web/resolvers/post.ts | 3 ++- packages/web/resolvers/user.ts | 10 +++++----- 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/packages/j-db-client/package-lock.json b/packages/j-db-client/package-lock.json index f5aee79b6..ac6090766 100644 --- a/packages/j-db-client/package-lock.json +++ b/packages/j-db-client/package-lock.json @@ -1,6 +1,6 @@ { "name": "@journaly/j-db-client", - "version": "14.0.0-ALPHA3", + "version": "14.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/j-db-client/package.json b/packages/j-db-client/package.json index 4d43e5708..1c9fe6cde 100644 --- a/packages/j-db-client/package.json +++ b/packages/j-db-client/package.json @@ -1,6 +1,6 @@ { "name": "@journaly/j-db-client", - "version": "14.0.0-ALPHA5", + "version": "14.0.0", "description": "Journaly's internal database client.", "main": "dist/index", "scripts": { diff --git a/packages/web/package-lock.json b/packages/web/package-lock.json index 1af860ffd..df71bbcbb 100644 --- a/packages/web/package-lock.json +++ b/packages/web/package-lock.json @@ -2645,8 +2645,9 @@ "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" }, "@journaly/j-db-client": { - "version": "file:../j-db-client/journaly-j-db-client-14.0.0-ALPHA5.tgz", - "integrity": "sha512-LrT5tdAdJhYsTHl0R2MwWTHPNk7LpvRQzghHV8uEn5DerPPtWRro2l9h9GunWsp2WVJVgn9r4qQCxdeuzGw2cA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@journaly/j-db-client/-/j-db-client-14.0.0.tgz", + "integrity": "sha512-Pq7Y6XJaiYtPSzFTHHW1GZPRyYNrB841KscoMupvfYLeyXH6GwtDstTDX8YH8mhY0bHBBbCD9NPLQpFYGOxx/g==", "requires": { "@prisma/client": "^3.5.0" } diff --git a/packages/web/package.json b/packages/web/package.json index dd6e5453b..1babb7104 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -31,7 +31,8 @@ "migrate:apply": "npm explore '@journaly/j-db-client' -- npm run migrate:apply", "migrate:deploy": "npm explore '@journaly/j-db-client' -- npm run migrate:deploy", "translations:topics:pull": "ts-node -r tsconfig-paths/register -P tsconfig-base.json scripts/pull-topic-translations.mjs", - "translations:topics:push": "ts-node -r tsconfig-paths/register -P tsconfig-base.json scripts/push-topic-translations.mjs" + "translations:topics:push": "ts-node -r tsconfig-paths/register -P tsconfig-base.json scripts/push-topic-translations.mjs", + "generate:nexus": "cross-env NEXUS_REFLECTION=1 ts-node --transpile-only -r tsconfig-paths/register -P tsconfig-base.json -T resolvers/index.ts" }, "prisma": { "schema": "node_modules/@journaly/j-db-client/prisma/schema.prisma" @@ -39,7 +40,7 @@ "dependencies": { "@apollo/client": "^3.3.12", "@apollo/react-ssr": "^4.0.0", - "@journaly/j-db-client": "file://../j-db-client/journaly-j-db-client-14.0.0-ALPHA5.tgz", + "@journaly/j-db-client": "14.0.0", "@stripe/react-stripe-js": "^1.2.2", "@stripe/stripe-js": "^1.12.1", "@types/bcryptjs": "^2.4.2", diff --git a/packages/web/resolvers/index.ts b/packages/web/resolvers/index.ts index 74cacdcf0..55dc9d409 100644 --- a/packages/web/resolvers/index.ts +++ b/packages/web/resolvers/index.ts @@ -59,7 +59,7 @@ const schemaOpts: Parameters[0] = { if (reflectionRun) { schemaOpts.shouldExitAfterGenerateArtifacts = true schemaOpts.outputs = { - typegen: path.join(__dirname, '../node_modules/@types/typegen-nexus/index.d.ts'), + typegen: path.join(__dirname, './generated/nexus.ts'), schema: path.join(__dirname, './api.graphql'), } } diff --git a/packages/web/resolvers/post.ts b/packages/web/resolvers/post.ts index 68adfa2f4..306bb31e0 100644 --- a/packages/web/resolvers/post.ts +++ b/packages/web/resolvers/post.ts @@ -34,6 +34,7 @@ import { EmailVerificationStatus, InAppNotificationType, PostStatus as PostStatusEnum, + Post as PostDBType, } from '@journaly/j-db-client' import { Post, PostTopic, PostStatus } from 'nexus-prisma' import { EditorNodeType, HeadlineImageInput } from './inputTypes' @@ -451,7 +452,7 @@ const PostQueries = extendType({ ` const [posts, [{ count }]] = await Promise.all([ - ctx.db.$queryRaw` + ctx.db.$queryRaw` SELECT p.* ${queryPred} ORDER BY p."bumpedAt" DESC LIMIT ${args.first} diff --git a/packages/web/resolvers/user.ts b/packages/web/resolvers/user.ts index ea6fc6f63..0b58462ae 100644 --- a/packages/web/resolvers/user.ts +++ b/packages/web/resolvers/user.ts @@ -1,4 +1,4 @@ -import { intArg, stringArg, objectType, extendType, nonNull, enumType } from 'nexus' +import { intArg, stringArg, objectType, extendType, nonNull, enumType, nullable } from 'nexus' import bcrypt from 'bcryptjs' import jwt from 'jsonwebtoken' import { serialize } from 'cookie' @@ -230,7 +230,7 @@ const UserQueries = extendType({ }, }) - t.field('currentUser', { + t.nullable.field('currentUser', { type: 'User', resolve: async (_parent, _args, ctx) => { const userId = ctx.request.userId @@ -246,11 +246,11 @@ const UserQueries = extendType({ }, }) - t.field('userByIdentifier', { + t.nullable.field('userByIdentifier', { type: 'User', args: { - id: intArg(), - handle: stringArg(), + id: nullable(intArg()), + handle: nullable(stringArg()), }, resolve: async (_parent, args, ctx) => { if (!args.id && !args.handle) throw new Error('You must provide an ID or handle') From 9cfe696d4697315502beff2fe3ca6ea56d85c32d Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sun, 23 Jan 2022 09:55:00 +0000 Subject: [PATCH 17/18] Update .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 6a739d1d5..daa0979ea 100644 --- a/.gitignore +++ b/.gitignore @@ -122,3 +122,6 @@ api.graphql snapshot.sql packages/web/translation-site + +# Nexus Generated Files +**/generated/nexus.ts \ No newline at end of file From ba3edf2490da40aed1b5f5407b0405d14326a33e Mon Sep 17 00:00:00 2001 From: Robin MacPherson Date: Sun, 23 Jan 2022 10:26:16 +0000 Subject: [PATCH 18/18] Build passes for many confusing reasons --- packages/web/resolvers/index.ts | 3 ++- packages/web/resolvers/post.ts | 12 ++++++------ packages/web/resolvers/topic.ts | 5 +++-- packages/web/resolvers/user.ts | 34 ++++++++++++++++++++------------- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/packages/web/resolvers/index.ts b/packages/web/resolvers/index.ts index 55dc9d409..ff16b8a62 100644 --- a/packages/web/resolvers/index.ts +++ b/packages/web/resolvers/index.ts @@ -1,6 +1,6 @@ import * as path from 'path' -import { makeSchema } from 'nexus' +import { fieldAuthorizePlugin, makeSchema } from 'nexus' import CommentTypes from './comment' import TopicTypes from './topic' @@ -53,6 +53,7 @@ const schemaOpts: Parameters[0] = { ...BadgeTypes, DateTime, ], + plugins: [fieldAuthorizePlugin()], shouldGenerateArtifacts: reflectionRun, } diff --git a/packages/web/resolvers/post.ts b/packages/web/resolvers/post.ts index 306bb31e0..a3675347f 100644 --- a/packages/web/resolvers/post.ts +++ b/packages/web/resolvers/post.ts @@ -95,9 +95,9 @@ const PostTopicType = objectType({ name: PostTopic.$name, description: PostTopic.$description, definition(t) { - t.field(PostTopic.id) - t.field(PostTopic.post) - t.field(PostTopic.topic) + t.nonNull.field(PostTopic.id) + t.nonNull.field(PostTopic.post) + t.nonNull.field(PostTopic.topic) }, }) @@ -113,7 +113,7 @@ const PostType = objectType({ definition(t) { t.field(Post.id) t.field(Post.title) - t.field(Post.body) + t.nonNull.field(Post.body) t.field(Post.excerpt) t.field(Post.readTime) t.field(Post.author) @@ -544,7 +544,7 @@ const PostMutations = extendType({ }) if (args.topicIds) { - const insertPromises = args.topicIds.map((topicId: number) => { + const insertPromises = args.topicIds.map((topicId) => { return ctx.db.postTopic.create({ data: { post: { connect: { id: post.id } }, @@ -695,7 +695,7 @@ const PostMutations = extendType({ where: { postId: args.postId }, }) - const insertPromises = args.topicIds.map((topicId: number) => { + const insertPromises = args.topicIds.map((topicId) => { return ctx.db.postTopic.create({ data: { post: { connect: { id: args.postId } }, diff --git a/packages/web/resolvers/topic.ts b/packages/web/resolvers/topic.ts index f90b52fec..714802628 100644 --- a/packages/web/resolvers/topic.ts +++ b/packages/web/resolvers/topic.ts @@ -5,7 +5,7 @@ import { Topic, TopicTranslation, UserInterest } from 'nexus-prisma' const TopicTranslationType = objectType({ name: TopicTranslation.$name, definition(t) { - t.field(TopicTranslation.id) + t.nonNull.field(TopicTranslation.id) t.field(TopicTranslation.name) t.field(TopicTranslation.uiLanguage) }, @@ -15,7 +15,7 @@ const UserInterestType = objectType({ name: UserInterest.$name, description: UserInterest.$description, definition(t) { - t.field(UserInterest.id) + t.nonNull.field(UserInterest.id) t.field(UserInterest.user) t.field(UserInterest.topic) }, @@ -26,6 +26,7 @@ const TopicType = objectType({ description: Topic.$description, definition(t) { t.field(Topic.id) + t.nonNull.field(Topic.devName) t.string('name', { args: { uiLanguage: nonNull(arg({ type: 'UILanguage' })), diff --git a/packages/web/resolvers/user.ts b/packages/web/resolvers/user.ts index 0b58462ae..f89aa5a29 100644 --- a/packages/web/resolvers/user.ts +++ b/packages/web/resolvers/user.ts @@ -30,20 +30,28 @@ const UserType = objectType({ name: User.$name, description: User.$description, definition(t) { - t.field(User.id) + t.nonNull.field(User.id) t.field(User.name) - t.string('email', { - resolve(parent, _args, ctx) { - const { userId } = ctx.request - - if (userId && userId === parent.id) { - return parent.email - } - - return null - }, - }) - t.field(User.handle) + t.field(User.email) + // t.field('email', { + // type: 'String', + // authorize: (parent, _, ctx) => ctx.request.userId === parent.id, + // resolve: (parent, _, ctx) => { + // return parent.email + // }, + // }) + // t.string('email', { + // resolve(parent, _args, ctx) { + // const { userId } = ctx.request + + // if (userId && userId === parent.id) { + // return parent.email + // } + + // return null + // }, + // }) + t.nonNull.field(User.handle) t.field(User.bio) t.field(User.userRole) t.field(User.city)