From 091505b900608b45c338efd3e7b6f6e627e6a506 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Tue, 1 Aug 2023 00:31:48 -0600 Subject: [PATCH 1/7] tRPC overhaul! --- package.json | 2 + pnpm-lock.yaml | 273 +++++++++++++++++- src/pages/api/[...trpc].ts | 19 ++ src/pages/api/openapi.json.ts | 10 + .../api/trpc/{[trpc].ts => [...trpc].ts} | 1 - src/server/api/routers/room.ts | 19 +- src/server/api/routers/session.ts | 10 +- src/server/api/routers/user.ts | 21 +- src/server/api/routers/vote.ts | 34 ++- src/server/api/trpc.ts | 52 +++- src/server/openapi.ts | 12 + 11 files changed, 404 insertions(+), 49 deletions(-) create mode 100644 src/pages/api/[...trpc].ts create mode 100644 src/pages/api/openapi.json.ts rename src/pages/api/trpc/{[trpc].ts => [...trpc].ts} (99%) create mode 100644 src/server/openapi.ts diff --git a/package.json b/package.json index 9e51ea6..75d4380 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "json2csv": "6.0.0-alpha.2", "next": "^13.4.12", "next-auth": "^4.22.3", + "nextjs-cors": "^2.1.2", "postcss": "^8.4.27", "react": "18.2.0", "react-dom": "18.2.0", @@ -36,6 +37,7 @@ "resend": "^0.17.2", "sharp": "^0.32.4", "superjson": "1.13.1", + "trpc-openapi": "^1.2.0", "zod": "^3.21.4" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e518d24..b2815ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ dependencies: next-auth: specifier: ^4.22.3 version: 4.22.3(next@13.4.12)(react-dom@18.2.0)(react@18.2.0) + nextjs-cors: + specifier: ^2.1.2 + version: 2.1.2(next@13.4.12) postcss: specifier: ^8.4.27 version: 8.4.27 @@ -77,6 +80,9 @@ dependencies: superjson: specifier: 1.13.1 version: 1.13.1 + trpc-openapi: + specifier: ^1.2.0 + version: 1.2.0(@trpc/server@10.36.0)(zod@3.21.4) zod: specifier: ^3.21.4 version: 3.21.4 @@ -1394,6 +1400,14 @@ packages: - utf-8-validate dev: false + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1733,6 +1747,11 @@ packages: streamsearch: 1.1.0 dev: false + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + /cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -1756,7 +1775,6 @@ packages: dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.1 - dev: true /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -1838,6 +1856,15 @@ packages: engines: {node: '>=0.8'} dev: false + /co-body@6.1.0: + resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} + dependencies: + inflation: 2.0.0 + qs: 6.11.2 + raw-body: 2.5.2 + type-is: 1.6.18 + dev: false + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1927,6 +1954,17 @@ packages: proto-list: 1.2.4 dev: false + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /cookie-es@1.0.0: + resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} + dev: false + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} @@ -1943,6 +1981,14 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2074,11 +2120,25 @@ packages: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} dev: false + /defu@6.1.2: + resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} + dev: false + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: false + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + /deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} dev: false @@ -2088,6 +2148,10 @@ packages: engines: {node: '>=6'} dev: true + /destr@2.0.0: + resolution: {integrity: sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg==} + dev: false + /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} @@ -2795,6 +2859,11 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: false + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false @@ -2861,7 +2930,6 @@ packages: has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 - dev: true /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} @@ -3028,6 +3096,18 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /h3@1.7.1: + resolution: {integrity: sha512-A9V2NEDNHet7v1gCg7CMwerSigLi0SRbhTy7C3lGb0N4YKIpPmLDjedTUopqp4dnn7COHfqUjjaz3zbtz4QduA==} + dependencies: + cookie-es: 1.0.0 + defu: 6.1.2 + destr: 2.0.0 + iron-webcrypto: 0.7.1 + radix3: 1.0.1 + ufo: 1.2.0 + uncrypto: 0.1.3 + dev: false + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true @@ -3050,12 +3130,10 @@ packages: /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} - dev: true /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - dev: true /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} @@ -3126,6 +3204,17 @@ packages: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + /http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} @@ -3143,6 +3232,13 @@ packages: engines: {node: '>=14.18.0'} dev: true + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false @@ -3164,6 +3260,11 @@ packages: engines: {node: '>=0.8.19'} dev: true + /inflation@2.0.0: + resolution: {integrity: sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==} + engines: {node: '>= 0.8.0'} + dev: false + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -3195,6 +3296,10 @@ packages: engines: {node: '>= 0.10'} dev: false + /iron-webcrypto@0.7.1: + resolution: {integrity: sha512-K/UmlEhPCPXEHV5hAtH5C0tI5JnFuOrv4yO/j7ODPl3HaiiHBLbOLTde+ieUaAyfCATe4LoAnclyF+hmSCOVmQ==} + dev: false + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -3569,6 +3674,10 @@ packages: p-locate: 5.0.0 dev: true + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false + /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: false @@ -3602,6 +3711,15 @@ packages: dependencies: yallist: 4.0.0 + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3609,6 +3727,11 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -3628,6 +3751,12 @@ packages: mime-db: 1.52.0 dev: false + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -3713,6 +3842,11 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + /next-auth@4.22.3(next@13.4.12)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-XAgy9xV3J2eJOXrQhmxdjV6MLM29ibm6WtMXc3KY6IPZeApf+SuBuPvlqCUfbu5YsAzlg9WSw6u01dChTfeZOA==} peerDependencies: @@ -3781,6 +3915,15 @@ packages: - babel-plugin-macros dev: false + /nextjs-cors@2.1.2(next@13.4.12): + resolution: {integrity: sha512-2yOVivaaf2ILe4f/qY32hnj3oC77VCOsUQJQfhVMGsXE/YMEWUY2zy78sH9FKUCM7eG42/l3pDofIzMD781XGA==} + peerDependencies: + next: ^8.1.1-canary.54 || ^9.0.0 || ^10.0.0-0 || ^11.0.0 || ^12.0.0 || ^13.0.0 + dependencies: + cors: 2.8.5 + next: 13.4.12(react-dom@18.2.0)(react@18.2.0) + dev: false + /node-abi@3.45.0: resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} engines: {node: '>=10'} @@ -3804,6 +3947,22 @@ packages: whatwg-url: 5.0.0 dev: false + /node-mocks-http@1.12.2: + resolution: {integrity: sha512-xhWwC0dh35R9rf0j3bRZXuISXdHxxtMx0ywZQBwjrg3yl7KpRETzogfeCamUIjltpn0Fxvs/ZhGJul1vPLrdJQ==} + engines: {node: '>=0.6'} + dependencies: + accepts: 1.3.8 + content-disposition: 0.5.4 + depd: 1.1.2 + fresh: 0.5.2 + merge-descriptors: 1.0.1 + methods: 1.1.2 + mime: 1.6.0 + parseurl: 1.3.3 + range-parser: 1.2.1 + type-is: 1.6.18 + dev: false + /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: false @@ -3863,7 +4022,6 @@ packages: /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - dev: true /object-hash@2.2.0: resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} @@ -3876,7 +4034,6 @@ packages: /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -3969,6 +4126,10 @@ packages: is-wsl: 2.2.0 dev: true + /openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: false + /openid-client@5.4.3: resolution: {integrity: sha512-sVQOvjsT/sbSfYsQI/9liWQGVZH/Pp3rrtlGEwgk/bbHfrUDZ24DN57lAagIwFtuEu+FM9Ev7r85s8S/yPjimQ==} dependencies: @@ -4067,6 +4228,11 @@ packages: peberminta: 0.8.0 dev: false + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -4369,6 +4535,13 @@ packages: engines: {node: '>=6'} dev: true + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4381,6 +4554,25 @@ packages: engines: {node: '>=10'} dev: false + /radix3@1.0.1: + resolution: {integrity: sha512-y+AcwZ3HcUIGc9zGsNVf5+BY/LxL+z+4h4J3/pp8jxSmy1STaCocPS3qrj4tA5ehUSzqtqK+0Aygvz/r/8vy4g==} + dev: false + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4647,6 +4839,10 @@ packages: is-regex: 1.1.4 dev: true + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: @@ -4680,6 +4876,10 @@ packages: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: false + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + /sharp@0.32.4: resolution: {integrity: sha512-exUnZewqVZC6UXqXuQ8fyJJv0M968feBi04jb9GcUHrWtkRoAKnbJt8IfwT4NJs7FskArbJ14JAFGVuooszoGg==} engines: {node: '>=14.15.0'} @@ -4721,7 +4921,6 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.1 object-inspect: 1.12.3 - dev: true /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4783,6 +4982,11 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: false + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -5087,6 +5291,11 @@ packages: resolution: {integrity: sha512-zks18/TWT1iHO3v0vFp5qLKOG27m67ycq/Y7a7cTiRuUNlc4gf3HGnkRgMv0NyhnfTamtkYBJl+YeD1/j07gBQ==} dev: false + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false @@ -5104,6 +5313,22 @@ packages: pretty-bytes: 5.6.0 dev: false + /trpc-openapi@1.2.0(@trpc/server@10.36.0)(zod@3.21.4): + resolution: {integrity: sha512-pfYoCd/3KYXWXvUPZBKJw455OOwngKN/6SIcj7Yit19OMLJ+8yVZkEvGEeg5wUSwfsiTdRsKuvqkRPXVSwV7ew==} + peerDependencies: + '@trpc/server': ^10.0.0 + zod: ^3.14.4 + dependencies: + '@trpc/server': 10.36.0 + co-body: 6.1.0 + h3: 1.7.1 + lodash.clonedeep: 4.5.0 + node-mocks-http: 1.12.2 + openapi-types: 12.1.3 + zod: 3.21.4 + zod-to-json-schema: 3.21.4(zod@3.21.4) + dev: false + /ts-api-utils@1.0.1(typescript@5.1.6): resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} engines: {node: '>=16.13.0'} @@ -5182,6 +5407,14 @@ packages: engines: {node: '>=14.16'} dev: false + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} @@ -5226,6 +5459,10 @@ packages: hasBin: true dev: true + /ufo@1.2.0: + resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + dev: false + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -5235,6 +5472,10 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + dev: false + /universal-user-agent@6.0.0: resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} dev: false @@ -5249,6 +5490,11 @@ packages: engines: {node: '>= 10.0.0'} dev: false + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} @@ -5309,6 +5555,11 @@ packages: spdx-expression-parse: 3.0.1 dev: false + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -5406,6 +5657,14 @@ packages: engines: {node: '>=10'} dev: true + /zod-to-json-schema@3.21.4(zod@3.21.4): + resolution: {integrity: sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw==} + peerDependencies: + zod: ^3.21.4 + dependencies: + zod: 3.21.4 + dev: false + /zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false diff --git a/src/pages/api/[...trpc].ts b/src/pages/api/[...trpc].ts new file mode 100644 index 0000000..edb5b1a --- /dev/null +++ b/src/pages/api/[...trpc].ts @@ -0,0 +1,19 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { createOpenApiNextHandler } from "trpc-openapi"; +import cors from "nextjs-cors"; + +import { appRouter } from "~/server/api/root"; +import { createTRPCContext } from "~/server/api/trpc"; + +const handler = async (req: NextApiRequest, res: NextApiResponse) => { + // Setup CORS + cors(req, res); + + // Handle incoming OpenAPI requests + return createOpenApiNextHandler({ + router: appRouter, + createContext: createTRPCContext, + })(req, res); +}; + +export default handler; diff --git a/src/pages/api/openapi.json.ts b/src/pages/api/openapi.json.ts new file mode 100644 index 0000000..0e19e7e --- /dev/null +++ b/src/pages/api/openapi.json.ts @@ -0,0 +1,10 @@ +import { NextApiRequest, NextApiResponse } from 'next'; + +import { openApiDocument } from '../../server/openapi'; + +// Respond with our OpenAPI schema +const handler = (req: NextApiRequest, res: NextApiResponse) => { + res.status(200).send(openApiDocument); +}; + +export default handler; \ No newline at end of file diff --git a/src/pages/api/trpc/[trpc].ts b/src/pages/api/trpc/[...trpc].ts similarity index 99% rename from src/pages/api/trpc/[trpc].ts rename to src/pages/api/trpc/[...trpc].ts index 43deb52..630df52 100644 --- a/src/pages/api/trpc/[trpc].ts +++ b/src/pages/api/trpc/[...trpc].ts @@ -1,5 +1,4 @@ import { createNextApiHandler } from "@trpc/server/adapters/next"; - import { env } from "~/env.mjs"; import { appRouter } from "~/server/api/root"; import { createTRPCContext } from "~/server/api/trpc"; diff --git a/src/server/api/routers/room.ts b/src/server/api/routers/room.ts index abbfa9a..db79023 100644 --- a/src/server/api/routers/room.ts +++ b/src/server/api/routers/room.ts @@ -1,12 +1,17 @@ import { z } from "zod"; import { publishToChannel } from "~/server/ably"; -import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; +import { + adminRateLimitedProcedure, + createTRPCRouter, + protectedProcedure, + protectedRateLimitedProcedure, +} from "~/server/api/trpc"; import { fetchCache, invalidateCache, setCache } from "~/server/redis"; export const roomRouter = createTRPCRouter({ // Create - create: protectedProcedure + create: protectedRateLimitedProcedure .input( z.object({ name: z.string(), @@ -42,7 +47,7 @@ export const roomRouter = createTRPCRouter({ }), // Get One - get: protectedProcedure + get: protectedRateLimitedProcedure .input(z.object({ id: z.string() })) .query(({ ctx, input }) => { return ctx.prisma.room.findUnique({ @@ -63,7 +68,7 @@ export const roomRouter = createTRPCRouter({ }), // Get All - getAll: protectedProcedure.query(async ({ ctx }) => { + getAll: protectedRateLimitedProcedure.query(async ({ ctx }) => { const cachedResult = await fetchCache< { id: string; @@ -92,7 +97,7 @@ export const roomRouter = createTRPCRouter({ } }), - countAll: protectedProcedure.query(async ({ ctx }) => { + countAll: adminRateLimitedProcedure.query(async ({ ctx }) => { const cachedResult = await fetchCache(`kv_roomcount_admin`); if (cachedResult) { @@ -107,7 +112,7 @@ export const roomRouter = createTRPCRouter({ }), // Update One - set: protectedProcedure + set: protectedRateLimitedProcedure .input( z.object({ name: z.string(), @@ -208,7 +213,7 @@ export const roomRouter = createTRPCRouter({ }), // Delete One - delete: protectedProcedure + delete: protectedRateLimitedProcedure .input(z.object({ id: z.string() })) .mutation(async ({ ctx, input }) => { const deletedRoom = await ctx.prisma.room.delete({ diff --git a/src/server/api/routers/session.ts b/src/server/api/routers/session.ts index 4b302a3..87354fb 100644 --- a/src/server/api/routers/session.ts +++ b/src/server/api/routers/session.ts @@ -1,9 +1,13 @@ import { z } from "zod"; -import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; +import { + adminRateLimitedProcedure, + createTRPCRouter, + protectedProcedure, +} from "~/server/api/trpc"; import { invalidateCache } from "~/server/redis"; export const sessionRouter = createTRPCRouter({ - deleteAllByUserId: protectedProcedure + deleteAllByUserId: adminRateLimitedProcedure .input( z.object({ userId: z.string(), @@ -22,7 +26,7 @@ export const sessionRouter = createTRPCRouter({ return !!sessions; }), - deleteAll: protectedProcedure.mutation(async ({ ctx }) => { + deleteAll: adminRateLimitedProcedure.mutation(async ({ ctx }) => { const sessions = await ctx.prisma.session.deleteMany(); if (!!sessions) { diff --git a/src/server/api/routers/user.ts b/src/server/api/routers/user.ts index 0d92fe9..a5bfb7a 100644 --- a/src/server/api/routers/user.ts +++ b/src/server/api/routers/user.ts @@ -3,14 +3,19 @@ import { Resend } from "resend"; import { z } from "zod"; import { Goodbye } from "~/components/templates/Goodbye"; import { env } from "~/env.mjs"; -import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; +import { + adminRateLimitedProcedure, + createTRPCRouter, + protectedProcedure, + protectedRateLimitedProcedure, +} from "~/server/api/trpc"; import { fetchCache, invalidateCache, setCache } from "~/server/redis"; const resend = new Resend(process.env.RESEND_API_KEY); export const userRouter = createTRPCRouter({ - countAll: protectedProcedure.query(async ({ ctx }) => { + countAll: adminRateLimitedProcedure.query(async ({ ctx }) => { const cachedResult = await fetchCache(`kv_usercount_admin`); if (cachedResult) { @@ -24,7 +29,7 @@ export const userRouter = createTRPCRouter({ } }), - getProviders: protectedProcedure.query(async ({ ctx }) => { + getProviders: protectedRateLimitedProcedure.query(async ({ ctx }) => { const providers = await ctx.prisma.user.findUnique({ where: { id: ctx.session.user.id, @@ -42,7 +47,7 @@ export const userRouter = createTRPCRouter({ return account.provider; }); }), - getAll: protectedProcedure.query(async ({ ctx }) => { + getAll: protectedRateLimitedProcedure.query(async ({ ctx }) => { const cachedResult = await fetchCache< { accounts: { @@ -94,7 +99,7 @@ export const userRouter = createTRPCRouter({ return users; } }), - delete: protectedProcedure + delete: protectedRateLimitedProcedure .input( z .object({ @@ -132,7 +137,7 @@ export const userRouter = createTRPCRouter({ return !!user; }), - save: protectedProcedure + save: protectedRateLimitedProcedure .input( z.object({ name: z.string(), @@ -150,7 +155,7 @@ export const userRouter = createTRPCRouter({ return !!user; }), - setAdmin: protectedProcedure + setAdmin: adminRateLimitedProcedure .input( z.object({ userId: z.string(), @@ -172,7 +177,7 @@ export const userRouter = createTRPCRouter({ return !!user; }), - setVIP: protectedProcedure + setVIP: adminRateLimitedProcedure .input( z.object({ userId: z.string(), diff --git a/src/server/api/routers/vote.ts b/src/server/api/routers/vote.ts index 388d1f9..3a577df 100644 --- a/src/server/api/routers/vote.ts +++ b/src/server/api/routers/vote.ts @@ -2,24 +2,32 @@ import { z } from "zod"; import { publishToChannel } from "~/server/ably"; import type { Room } from "@prisma/client"; -import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; +import { + adminRateLimitedProcedure, + createTRPCRouter, + protectedRateLimitedProcedure, +} from "~/server/api/trpc"; import { fetchCache, invalidateCache, setCache } from "~/server/redis"; export const voteRouter = createTRPCRouter({ - countAll: protectedProcedure.query(async ({ ctx }) => { - const cachedResult = await fetchCache(`kv_votecount_admin`); + countAll: adminRateLimitedProcedure + .input(z.void()) + .output(z.number()) + .meta({ openapi: { method: "GET", path: "/votes/count" } }) + .query(async ({ ctx }) => { + const cachedResult = await fetchCache(`kv_votecount_admin`); - if (cachedResult) { - return cachedResult; - } else { - const votesCount = await ctx.prisma.vote.count(); + if (cachedResult) { + return cachedResult; + } else { + const votesCount = await ctx.prisma.vote.count(); - await setCache(`kv_votecount_admin`, votesCount); + await setCache(`kv_votecount_admin`, votesCount); - return votesCount; - } - }), - getAllByRoomId: protectedProcedure + return votesCount; + } + }), + getAllByRoomId: protectedRateLimitedProcedure .input(z.object({ roomId: z.string() })) .query(async ({ ctx, input }) => { const cachedResult = await fetchCache< @@ -63,7 +71,7 @@ export const voteRouter = createTRPCRouter({ return votesByRoomId; } }), - set: protectedProcedure + set: protectedRateLimitedProcedure .input(z.object({ value: z.string(), roomId: z.string() })) .mutation(async ({ ctx, input }) => { const vote = await ctx.prisma.vote.upsert({ diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index 79a7f16..d5be428 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -22,6 +22,7 @@ import { prisma } from "~/server/db"; type CreateContextOptions = { session: Session | null; + ip: string | undefined; }; /** @@ -37,6 +38,7 @@ type CreateContextOptions = { const createInnerTRPCContext = (opts: CreateContextOptions) => { return { session: opts.session, + ip: opts.ip, prisma, }; }; @@ -54,6 +56,7 @@ export const createTRPCContext = async (opts: CreateNextContextOptions) => { const session = await getServerAuthSession({ req, res }); return createInnerTRPCContext({ + ip: req.socket.remoteAddress, session, }); }; @@ -64,17 +67,21 @@ export const createTRPCContext = async (opts: CreateNextContextOptions) => { * This is where the tRPC API is initialized, connecting the context and transformer. */ import { initTRPC, TRPCError } from "@trpc/server"; +import { OpenApiMeta } from "trpc-openapi"; import { Ratelimit } from "@upstash/ratelimit"; import superjson from "superjson"; import { env } from "~/env.mjs"; import { Redis } from "@upstash/redis"; -const t = initTRPC.context().create({ - transformer: superjson, - errorFormatter({ shape }) { - return shape; - }, -}); +const t = initTRPC + .meta() + .context() + .create({ + transformer: superjson, + errorFormatter({ shape }) { + return shape; + }, + }); /** * 3. ROUTER & PROCEDURE (THE IMPORTANT BIT) @@ -100,12 +107,20 @@ export const createTRPCRouter = t.router; export const publicProcedure = t.procedure; /** Reusable middleware that enforces users are logged in before running the procedure. */ -const enforceRouteProtection = t.middleware(async ({ ctx, next }) => { +const enforceUserIsAuthed = t.middleware(async ({ ctx, next }) => { // Auth if (!ctx.session || !ctx.session.user) { throw new TRPCError({ code: "UNAUTHORIZED" }); } + return next({ + ctx: { + session: { ...ctx.session, user: ctx.session.user }, + }, + }); +}); + +const enforceRateLimit = t.middleware(async ({ ctx, next }) => { const rateLimit = new Ratelimit({ redis: Redis.fromEnv(), limiter: Ratelimit.slidingWindow( @@ -114,13 +129,21 @@ const enforceRouteProtection = t.middleware(async ({ ctx, next }) => { ), analytics: true, }); - + console.log(`${env.APP_ENV}_${ctx.session?.user.id || ctx.ip}`); + console.log(ctx.ip); const { success } = await rateLimit.limit( - `${env.APP_ENV}_${ctx.session.user.id}` + `${env.APP_ENV}_${ctx.session?.user.id || ctx.ip}` ); if (!success) throw new TRPCError({ code: "TOO_MANY_REQUESTS" }); + return next(); +}); + +const enforceAdminRole = t.middleware(async ({ ctx, next }) => { + if (!ctx.session || !ctx.session.user || !ctx.session?.user.isAdmin) + throw new TRPCError({ code: "UNAUTHORIZED" }); + return next({ ctx: { session: { ...ctx.session, user: ctx.session.user }, @@ -136,4 +159,13 @@ const enforceRouteProtection = t.middleware(async ({ ctx, next }) => { * * @see https://trpc.io/docs/procedures */ -export const protectedProcedure = t.procedure.use(enforceRouteProtection); +export const protectedProcedure = t.procedure.use(enforceUserIsAuthed); + +export const protectedRateLimitedProcedure = + protectedProcedure.use(enforceRateLimit); + +export const publicRateLimitedProcedure = publicProcedure.use(enforceRateLimit); + +export const adminProcedure = t.procedure.use(enforceAdminRole); + +export const adminRateLimitedProcedure = adminProcedure.use(enforceAdminRole); diff --git a/src/server/openapi.ts b/src/server/openapi.ts new file mode 100644 index 0000000..f0ee72f --- /dev/null +++ b/src/server/openapi.ts @@ -0,0 +1,12 @@ +import { generateOpenApiDocument } from 'trpc-openapi'; + +import { appRouter } from './api/root'; + +// Generate OpenAPI schema document +export const openApiDocument = generateOpenApiDocument(appRouter, { + title: 'Example CRUD API', + description: 'OpenAPI compliant REST API built using tRPC with Next.js', + version: '1.0.0', + baseUrl: 'http://localhost:3000/api', + docsUrl: 'https://github.com/jlalmes/trpc-openapi', +}); \ No newline at end of file From a220d59bf95a3954a27d3a2749619f018db97667 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Tue, 1 Aug 2023 00:38:09 -0600 Subject: [PATCH 2/7] oop --- src/server/api/routers/room.ts | 1 - src/server/api/routers/session.ts | 6 +----- src/server/api/routers/user.ts | 1 - 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/server/api/routers/room.ts b/src/server/api/routers/room.ts index db79023..b38a698 100644 --- a/src/server/api/routers/room.ts +++ b/src/server/api/routers/room.ts @@ -3,7 +3,6 @@ import { publishToChannel } from "~/server/ably"; import { adminRateLimitedProcedure, createTRPCRouter, - protectedProcedure, protectedRateLimitedProcedure, } from "~/server/api/trpc"; diff --git a/src/server/api/routers/session.ts b/src/server/api/routers/session.ts index 87354fb..08727a6 100644 --- a/src/server/api/routers/session.ts +++ b/src/server/api/routers/session.ts @@ -1,9 +1,5 @@ import { z } from "zod"; -import { - adminRateLimitedProcedure, - createTRPCRouter, - protectedProcedure, -} from "~/server/api/trpc"; +import { adminRateLimitedProcedure, createTRPCRouter } from "~/server/api/trpc"; import { invalidateCache } from "~/server/redis"; export const sessionRouter = createTRPCRouter({ diff --git a/src/server/api/routers/user.ts b/src/server/api/routers/user.ts index a5bfb7a..197d9f1 100644 --- a/src/server/api/routers/user.ts +++ b/src/server/api/routers/user.ts @@ -6,7 +6,6 @@ import { env } from "~/env.mjs"; import { adminRateLimitedProcedure, createTRPCRouter, - protectedProcedure, protectedRateLimitedProcedure, } from "~/server/api/trpc"; From 78aa16cded8394face628786d317f84d7e61fdf6 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Tue, 1 Aug 2023 00:41:26 -0600 Subject: [PATCH 3/7] lint :( --- src/pages/api/[...trpc].ts | 4 ++-- src/pages/api/openapi.json.ts | 6 +++--- src/server/api/trpc.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pages/api/[...trpc].ts b/src/pages/api/[...trpc].ts index edb5b1a..18ec82f 100644 --- a/src/pages/api/[...trpc].ts +++ b/src/pages/api/[...trpc].ts @@ -1,4 +1,4 @@ -import { NextApiRequest, NextApiResponse } from "next"; +import type { NextApiRequest, NextApiResponse } from "next"; import { createOpenApiNextHandler } from "trpc-openapi"; import cors from "nextjs-cors"; @@ -7,7 +7,7 @@ import { createTRPCContext } from "~/server/api/trpc"; const handler = async (req: NextApiRequest, res: NextApiResponse) => { // Setup CORS - cors(req, res); + await cors(req, res); // Handle incoming OpenAPI requests return createOpenApiNextHandler({ diff --git a/src/pages/api/openapi.json.ts b/src/pages/api/openapi.json.ts index 0e19e7e..1a0eab7 100644 --- a/src/pages/api/openapi.json.ts +++ b/src/pages/api/openapi.json.ts @@ -1,10 +1,10 @@ -import { NextApiRequest, NextApiResponse } from 'next'; +import type { NextApiRequest, NextApiResponse } from "next"; -import { openApiDocument } from '../../server/openapi'; +import { openApiDocument } from "../../server/openapi"; // Respond with our OpenAPI schema const handler = (req: NextApiRequest, res: NextApiResponse) => { res.status(200).send(openApiDocument); }; -export default handler; \ No newline at end of file +export default handler; diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index d5be428..7bc5546 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -67,7 +67,7 @@ export const createTRPCContext = async (opts: CreateNextContextOptions) => { * This is where the tRPC API is initialized, connecting the context and transformer. */ import { initTRPC, TRPCError } from "@trpc/server"; -import { OpenApiMeta } from "trpc-openapi"; +import type { OpenApiMeta } from "trpc-openapi"; import { Ratelimit } from "@upstash/ratelimit"; import superjson from "superjson"; import { env } from "~/env.mjs"; From 96565d573bd5c7813002496fbc71cf0b08d2241d Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Tue, 1 Aug 2023 12:58:14 -0600 Subject: [PATCH 4/7] Lets simplify tRPC --- src/server/api/routers/room.ts | 16 ++++++++-------- src/server/api/routers/session.ts | 6 +++--- src/server/api/routers/user.ts | 18 +++++++++--------- src/server/api/routers/vote.ts | 10 +++++----- src/server/api/trpc.ts | 26 +++++++------------------- 5 files changed, 32 insertions(+), 44 deletions(-) diff --git a/src/server/api/routers/room.ts b/src/server/api/routers/room.ts index b38a698..05c477e 100644 --- a/src/server/api/routers/room.ts +++ b/src/server/api/routers/room.ts @@ -1,16 +1,16 @@ import { z } from "zod"; import { publishToChannel } from "~/server/ably"; import { - adminRateLimitedProcedure, createTRPCRouter, - protectedRateLimitedProcedure, + protectedProcedure, + adminProcedure, } from "~/server/api/trpc"; import { fetchCache, invalidateCache, setCache } from "~/server/redis"; export const roomRouter = createTRPCRouter({ // Create - create: protectedRateLimitedProcedure + create: protectedProcedure .input( z.object({ name: z.string(), @@ -46,7 +46,7 @@ export const roomRouter = createTRPCRouter({ }), // Get One - get: protectedRateLimitedProcedure + get: protectedProcedure .input(z.object({ id: z.string() })) .query(({ ctx, input }) => { return ctx.prisma.room.findUnique({ @@ -67,7 +67,7 @@ export const roomRouter = createTRPCRouter({ }), // Get All - getAll: protectedRateLimitedProcedure.query(async ({ ctx }) => { + getAll: protectedProcedure.query(async ({ ctx }) => { const cachedResult = await fetchCache< { id: string; @@ -96,7 +96,7 @@ export const roomRouter = createTRPCRouter({ } }), - countAll: adminRateLimitedProcedure.query(async ({ ctx }) => { + countAll: adminProcedure.query(async ({ ctx }) => { const cachedResult = await fetchCache(`kv_roomcount_admin`); if (cachedResult) { @@ -111,7 +111,7 @@ export const roomRouter = createTRPCRouter({ }), // Update One - set: protectedRateLimitedProcedure + set: protectedProcedure .input( z.object({ name: z.string(), @@ -212,7 +212,7 @@ export const roomRouter = createTRPCRouter({ }), // Delete One - delete: protectedRateLimitedProcedure + delete: protectedProcedure .input(z.object({ id: z.string() })) .mutation(async ({ ctx, input }) => { const deletedRoom = await ctx.prisma.room.delete({ diff --git a/src/server/api/routers/session.ts b/src/server/api/routers/session.ts index 08727a6..7db9918 100644 --- a/src/server/api/routers/session.ts +++ b/src/server/api/routers/session.ts @@ -1,9 +1,9 @@ import { z } from "zod"; -import { adminRateLimitedProcedure, createTRPCRouter } from "~/server/api/trpc"; +import { adminProcedure, createTRPCRouter } from "~/server/api/trpc"; import { invalidateCache } from "~/server/redis"; export const sessionRouter = createTRPCRouter({ - deleteAllByUserId: adminRateLimitedProcedure + deleteAllByUserId: adminProcedure .input( z.object({ userId: z.string(), @@ -22,7 +22,7 @@ export const sessionRouter = createTRPCRouter({ return !!sessions; }), - deleteAll: adminRateLimitedProcedure.mutation(async ({ ctx }) => { + deleteAll: adminProcedure.mutation(async ({ ctx }) => { const sessions = await ctx.prisma.session.deleteMany(); if (!!sessions) { diff --git a/src/server/api/routers/user.ts b/src/server/api/routers/user.ts index 197d9f1..ff355b0 100644 --- a/src/server/api/routers/user.ts +++ b/src/server/api/routers/user.ts @@ -4,9 +4,9 @@ import { z } from "zod"; import { Goodbye } from "~/components/templates/Goodbye"; import { env } from "~/env.mjs"; import { - adminRateLimitedProcedure, + adminProcedure, createTRPCRouter, - protectedRateLimitedProcedure, + protectedProcedure, } from "~/server/api/trpc"; import { fetchCache, invalidateCache, setCache } from "~/server/redis"; @@ -14,7 +14,7 @@ import { fetchCache, invalidateCache, setCache } from "~/server/redis"; const resend = new Resend(process.env.RESEND_API_KEY); export const userRouter = createTRPCRouter({ - countAll: adminRateLimitedProcedure.query(async ({ ctx }) => { + countAll: adminProcedure.query(async ({ ctx }) => { const cachedResult = await fetchCache(`kv_usercount_admin`); if (cachedResult) { @@ -28,7 +28,7 @@ export const userRouter = createTRPCRouter({ } }), - getProviders: protectedRateLimitedProcedure.query(async ({ ctx }) => { + getProviders: protectedProcedure.query(async ({ ctx }) => { const providers = await ctx.prisma.user.findUnique({ where: { id: ctx.session.user.id, @@ -46,7 +46,7 @@ export const userRouter = createTRPCRouter({ return account.provider; }); }), - getAll: protectedRateLimitedProcedure.query(async ({ ctx }) => { + getAll: protectedProcedure.query(async ({ ctx }) => { const cachedResult = await fetchCache< { accounts: { @@ -98,7 +98,7 @@ export const userRouter = createTRPCRouter({ return users; } }), - delete: protectedRateLimitedProcedure + delete: protectedProcedure .input( z .object({ @@ -136,7 +136,7 @@ export const userRouter = createTRPCRouter({ return !!user; }), - save: protectedRateLimitedProcedure + save: protectedProcedure .input( z.object({ name: z.string(), @@ -154,7 +154,7 @@ export const userRouter = createTRPCRouter({ return !!user; }), - setAdmin: adminRateLimitedProcedure + setAdmin: adminProcedure .input( z.object({ userId: z.string(), @@ -176,7 +176,7 @@ export const userRouter = createTRPCRouter({ return !!user; }), - setVIP: adminRateLimitedProcedure + setVIP: adminProcedure .input( z.object({ userId: z.string(), diff --git a/src/server/api/routers/vote.ts b/src/server/api/routers/vote.ts index 3a577df..2c609a2 100644 --- a/src/server/api/routers/vote.ts +++ b/src/server/api/routers/vote.ts @@ -3,14 +3,14 @@ import { publishToChannel } from "~/server/ably"; import type { Room } from "@prisma/client"; import { - adminRateLimitedProcedure, + adminProcedure, createTRPCRouter, - protectedRateLimitedProcedure, + protectedProcedure, } from "~/server/api/trpc"; import { fetchCache, invalidateCache, setCache } from "~/server/redis"; export const voteRouter = createTRPCRouter({ - countAll: adminRateLimitedProcedure + countAll: adminProcedure .input(z.void()) .output(z.number()) .meta({ openapi: { method: "GET", path: "/votes/count" } }) @@ -27,7 +27,7 @@ export const voteRouter = createTRPCRouter({ return votesCount; } }), - getAllByRoomId: protectedRateLimitedProcedure + getAllByRoomId: protectedProcedure .input(z.object({ roomId: z.string() })) .query(async ({ ctx, input }) => { const cachedResult = await fetchCache< @@ -71,7 +71,7 @@ export const voteRouter = createTRPCRouter({ return votesByRoomId; } }), - set: protectedRateLimitedProcedure + set: protectedProcedure .input(z.object({ value: z.string(), roomId: z.string() })) .mutation(async ({ ctx, input }) => { const vote = await ctx.prisma.vote.upsert({ diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index 7bc5546..b4e956c 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -113,14 +113,6 @@ const enforceUserIsAuthed = t.middleware(async ({ ctx, next }) => { throw new TRPCError({ code: "UNAUTHORIZED" }); } - return next({ - ctx: { - session: { ...ctx.session, user: ctx.session.user }, - }, - }); -}); - -const enforceRateLimit = t.middleware(async ({ ctx, next }) => { const rateLimit = new Ratelimit({ redis: Redis.fromEnv(), limiter: Ratelimit.slidingWindow( @@ -129,15 +121,18 @@ const enforceRateLimit = t.middleware(async ({ ctx, next }) => { ), analytics: true, }); - console.log(`${env.APP_ENV}_${ctx.session?.user.id || ctx.ip}`); - console.log(ctx.ip); + const { success } = await rateLimit.limit( - `${env.APP_ENV}_${ctx.session?.user.id || ctx.ip}` + `${env.APP_ENV}_${ctx.session?.user.id}` ); if (!success) throw new TRPCError({ code: "TOO_MANY_REQUESTS" }); - return next(); + return next({ + ctx: { + session: { ...ctx.session, user: ctx.session.user }, + }, + }); }); const enforceAdminRole = t.middleware(async ({ ctx, next }) => { @@ -161,11 +156,4 @@ const enforceAdminRole = t.middleware(async ({ ctx, next }) => { */ export const protectedProcedure = t.procedure.use(enforceUserIsAuthed); -export const protectedRateLimitedProcedure = - protectedProcedure.use(enforceRateLimit); - -export const publicRateLimitedProcedure = publicProcedure.use(enforceRateLimit); - export const adminProcedure = t.procedure.use(enforceAdminRole); - -export const adminRateLimitedProcedure = adminProcedure.use(enforceAdminRole); From 64a4cff1fe801a3dc8951f22c9b3f7e47bbed705 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Tue, 1 Aug 2023 13:03:45 -0600 Subject: [PATCH 5/7] Final change before going off of lunch break! --- src/pages/index.tsx | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/pages/index.tsx b/src/pages/index.tsx index d63125e..abfcbf9 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -20,35 +20,35 @@ export default Home; const HomePageBody: React.FC = () => { return ( <> -

- Sprint{ " " } +

+ Sprint{" "} Padawan

-

- A{ " " } +

+ A{" "} - scrum poker{ " " } - { " " } - tool that helps{ " " } + scrum poker{" "} + {" "} + tool that helps{" "} - agile teams{ " " } - { " " } - plan their sprints in{ " " } + agile teams{" "} + {" "} + plan their sprints in{" "} real-time .

-
+

Features:

  • 🚀 Real-time votes!
  • -
  • 🚀 Granular control of room name and vote scale!
  • +
  • 🚀 Customizable room name and vote scale!
  • 🚀 CSV Reports for every room!
  • 🚀 100% free and open-source... forever!
From 9cf58d143c9fad110ab0d0d0a5908f29f5ef4269 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Wed, 2 Aug 2023 17:08:45 -0600 Subject: [PATCH 6/7] Package updates --- package.json | 14 ++-- pnpm-lock.yaml | 222 ++++++++++++++++++++++++------------------------- 2 files changed, 118 insertions(+), 118 deletions(-) diff --git a/package.json b/package.json index 75d4380..44cfe28 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,9 @@ "dependencies": { "@ably-labs/react-hooks": "^2.1.1", "@auth/prisma-adapter": "^1.0.1", - "@prisma/client": "5.0.0", + "@prisma/client": "5.1.0", "@react-email/components": "^0.0.7", - "@tanstack/react-query": "^4.32.0", + "@tanstack/react-query": "^4.32.1", "@trpc/client": "10.36.0", "@trpc/next": "10.36.0", "@trpc/react-query": "10.36.0", @@ -43,14 +43,14 @@ "devDependencies": { "@types/eslint": "^8.44.1", "@types/json2csv": "^5.0.3", - "@types/node": "^20.4.5", - "@types/react": "^18.2.17", - "@typescript-eslint/eslint-plugin": "^6.2.0", - "@typescript-eslint/parser": "^6.2.0", + "@types/node": "^20.4.6", + "@types/react": "^18.2.18", + "@typescript-eslint/eslint-plugin": "^6.2.1", + "@typescript-eslint/parser": "^6.2.1", "daisyui": "^3.5.0", "eslint": "^8.46.0", "eslint-config-next": "^13.4.12", - "prisma": "5.0.0", + "prisma": "5.1.0", "tailwindcss": "^3.3.3", "typescript": "^5.1.6" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b2815ea..d98474a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,25 +10,25 @@ dependencies: version: 2.1.1(react-dom@18.2.0)(react@18.2.0) '@auth/prisma-adapter': specifier: ^1.0.1 - version: 1.0.1(@prisma/client@5.0.0) + version: 1.0.1(@prisma/client@5.1.0) '@prisma/client': - specifier: 5.0.0 - version: 5.0.0(prisma@5.0.0) + specifier: 5.1.0 + version: 5.1.0(prisma@5.1.0) '@react-email/components': specifier: ^0.0.7 version: 0.0.7 '@tanstack/react-query': - specifier: ^4.32.0 - version: 4.32.0(react-dom@18.2.0)(react@18.2.0) + specifier: ^4.32.1 + version: 4.32.1(react-dom@18.2.0)(react@18.2.0) '@trpc/client': specifier: 10.36.0 version: 10.36.0(@trpc/server@10.36.0) '@trpc/next': specifier: 10.36.0 - version: 10.36.0(@tanstack/react-query@4.32.0)(@trpc/client@10.36.0)(@trpc/react-query@10.36.0)(@trpc/server@10.36.0)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0) + version: 10.36.0(@tanstack/react-query@4.32.1)(@trpc/client@10.36.0)(@trpc/react-query@10.36.0)(@trpc/server@10.36.0)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0) '@trpc/react-query': specifier: 10.36.0 - version: 10.36.0(@tanstack/react-query@4.32.0)(@trpc/client@10.36.0)(@trpc/server@10.36.0)(react-dom@18.2.0)(react@18.2.0) + version: 10.36.0(@tanstack/react-query@4.32.1)(@trpc/client@10.36.0)(@trpc/server@10.36.0)(react-dom@18.2.0)(react@18.2.0) '@trpc/server': specifier: 10.36.0 version: 10.36.0 @@ -95,17 +95,17 @@ devDependencies: specifier: ^5.0.3 version: 5.0.3 '@types/node': - specifier: ^20.4.5 - version: 20.4.5 + specifier: ^20.4.6 + version: 20.4.6 '@types/react': - specifier: ^18.2.17 - version: 18.2.17 + specifier: ^18.2.18 + version: 18.2.18 '@typescript-eslint/eslint-plugin': - specifier: ^6.2.0 - version: 6.2.0(@typescript-eslint/parser@6.2.0)(eslint@8.46.0)(typescript@5.1.6) + specifier: ^6.2.1 + version: 6.2.1(@typescript-eslint/parser@6.2.1)(eslint@8.46.0)(typescript@5.1.6) '@typescript-eslint/parser': - specifier: ^6.2.0 - version: 6.2.0(eslint@8.46.0)(typescript@5.1.6) + specifier: ^6.2.1 + version: 6.2.1(eslint@8.46.0)(typescript@5.1.6) daisyui: specifier: ^3.5.0 version: 3.5.0 @@ -116,8 +116,8 @@ devDependencies: specifier: ^13.4.12 version: 13.4.12(eslint@8.46.0)(typescript@5.1.6) prisma: - specifier: 5.0.0 - version: 5.0.0 + specifier: 5.1.0 + version: 5.1.0 tailwindcss: specifier: ^3.3.3 version: 3.3.3 @@ -173,13 +173,13 @@ packages: preact-render-to-string: 5.2.3(preact@10.11.3) dev: false - /@auth/prisma-adapter@1.0.1(@prisma/client@5.0.0): + /@auth/prisma-adapter@1.0.1(@prisma/client@5.1.0): resolution: {integrity: sha512-sBp9l/jVr7l9y7rp2Pv6eoP7i8X2CgRNE3jDWJ0B/u+HnKRofXflD1cldPqRSAkJhqH3UxhVtMTEijT9FoofmQ==} peerDependencies: '@prisma/client': '>=2.26.0 || >=3 || >=4' dependencies: '@auth/core': 0.9.0 - '@prisma/client': 5.0.0(prisma@5.0.0) + '@prisma/client': 5.1.0(prisma@5.1.0) transitivePeerDependencies: - nodemailer dev: false @@ -781,8 +781,8 @@ packages: tslib: 2.6.1 dev: true - /@prisma/client@5.0.0(prisma@5.0.0): - resolution: {integrity: sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==} + /@prisma/client@5.1.0(prisma@5.1.0): + resolution: {integrity: sha512-aIxuXlH3p3Vy91buodQhYgAD9m0yuxJzpXMhc1ejQ/WN3pNNWzBA0iDcBObLq8DMdszcXmoLAk3hiRq/ZwBsOw==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -791,16 +791,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584 - prisma: 5.0.0 + '@prisma/engines-version': 5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b + prisma: 5.1.0 dev: false - /@prisma/engines-version@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584: - resolution: {integrity: sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==} + /@prisma/engines-version@5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b: + resolution: {integrity: sha512-jTwE2oy1yjICmTfnCR0ASIpuMZXZ18sUzQXB7V0RMbrM9OlcmbUwXPuYhnxXuWN8XwRmujeIhsXs/Zeh+fjPOQ==} dev: false - /@prisma/engines@5.0.0: - resolution: {integrity: sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg==} + /@prisma/engines@5.1.0: + resolution: {integrity: sha512-HqaFsnPmZOdMWkPq6tT2eTVTQyaAXEDdKszcZ4yc7DGMBIYRP6j/zAJTtZUG9SsMV8FaucdL5vRyxY/p5Ni28g==} requiresBuild: true /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): @@ -1013,12 +1013,12 @@ packages: defer-to-connect: 2.0.1 dev: false - /@tanstack/query-core@4.32.0: - resolution: {integrity: sha512-ei4IYwL2kmlKSlCw9WgvV7PpXi0MiswVwfQRxawhJA690zWO3dU49igaQ/UMTl+Jy9jj9dK5IKAYvbX7kUvviQ==} + /@tanstack/query-core@4.32.1: + resolution: {integrity: sha512-VEAGHboOFWN/bvf/7cCoeLQfld0AA8n0V/kfc77W+FvxnnSwJufEh6gfjqpX5bRE/DEYfYDYdNtuL3KM+lIs8Q==} dev: false - /@tanstack/react-query@4.32.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-B8WUMcByYAH9500ENejDCATOmEZhqjtS9wsfiQ3BNa+s+yAynY8SESI8WWHhSqUmjd0pmCSFRP6BOUGSda3QXA==} + /@tanstack/react-query@4.32.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-lPTfOq6bR6DorPaS018gTMd3zs8r06tlERiVY6BRP9SnDkkl4ckqeANava/jPLWrSZP+EA15loQUTmvZs6k2GA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -1029,7 +1029,7 @@ packages: react-native: optional: true dependencies: - '@tanstack/query-core': 4.32.0 + '@tanstack/query-core': 4.32.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) use-sync-external-store: 1.2.0(react@18.2.0) @@ -1043,7 +1043,7 @@ packages: '@trpc/server': 10.36.0 dev: false - /@trpc/next@10.36.0(@tanstack/react-query@4.32.0)(@trpc/client@10.36.0)(@trpc/react-query@10.36.0)(@trpc/server@10.36.0)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0): + /@trpc/next@10.36.0(@tanstack/react-query@4.32.1)(@trpc/client@10.36.0)(@trpc/react-query@10.36.0)(@trpc/server@10.36.0)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-R0DYUMXkzKGQy49vvVou1fqOu459D47OsejwhMUktTNadTpUAuaE8SM0mo9a/faK59NhdlihDvRGq74PHupIkQ==} peerDependencies: '@tanstack/react-query': ^4.18.0 @@ -1054,9 +1054,9 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@tanstack/react-query': 4.32.0(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': 4.32.1(react-dom@18.2.0)(react@18.2.0) '@trpc/client': 10.36.0(@trpc/server@10.36.0) - '@trpc/react-query': 10.36.0(@tanstack/react-query@4.32.0)(@trpc/client@10.36.0)(@trpc/server@10.36.0)(react-dom@18.2.0)(react@18.2.0) + '@trpc/react-query': 10.36.0(@tanstack/react-query@4.32.1)(@trpc/client@10.36.0)(@trpc/server@10.36.0)(react-dom@18.2.0)(react@18.2.0) '@trpc/server': 10.36.0 next: 13.4.12(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -1064,7 +1064,7 @@ packages: react-ssr-prepass: 1.5.0(react@18.2.0) dev: false - /@trpc/react-query@10.36.0(@tanstack/react-query@4.32.0)(@trpc/client@10.36.0)(@trpc/server@10.36.0)(react-dom@18.2.0)(react@18.2.0): + /@trpc/react-query@10.36.0(@tanstack/react-query@4.32.1)(@trpc/client@10.36.0)(@trpc/server@10.36.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-ueIdfP/Xl4DIeBLMh6hEb0QdvcUjDZ+V+4lzIuztmkpRIvL4ZpwyBS7TGbKs+1EUwWu42AJB0t8n/LrtO6MxgQ==} peerDependencies: '@tanstack/react-query': ^4.18.0 @@ -1073,7 +1073,7 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@tanstack/react-query': 4.32.0(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': 4.32.1(react-dom@18.2.0)(react@18.2.0) '@trpc/client': 10.36.0(@trpc/server@10.36.0) '@trpc/server': 10.36.0 react: 18.2.0 @@ -1089,7 +1089,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.4.5 + '@types/node': 20.4.6 '@types/responselike': 1.0.0 dev: false @@ -1115,7 +1115,7 @@ packages: /@types/json2csv@5.0.3: resolution: {integrity: sha512-ZJEv6SzhPhgpBpxZU4n/TZekbZqI4EcyXXRwms1lAITG2kIAtj85PfNYafUOY1zy8bWs5ujaub0GU4copaA0sw==} dependencies: - '@types/node': 20.4.5 + '@types/node': 20.4.6 dev: true /@types/json5@0.0.29: @@ -1125,15 +1125,15 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.4.5 + '@types/node': 20.4.6 dev: false /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: false - /@types/node@20.4.5: - resolution: {integrity: sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==} + /@types/node@20.4.6: + resolution: {integrity: sha512-q0RkvNgMweWWIvSMDiXhflGUKMdIxBo2M2tYM/0kEGDueQByFzK4KZAgu5YHGFNxziTlppNpTIBcqHQAxlfHdA==} /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -1143,8 +1143,8 @@ packages: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true - /@types/react@18.2.17: - resolution: {integrity: sha512-u+e7OlgPPh+aryjOm5UJMX32OvB2E3QASOAqVMY6Ahs90djagxwv2ya0IctglNbNTexC12qCSMZG47KPfy1hAA==} + /@types/react@18.2.18: + resolution: {integrity: sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 @@ -1154,7 +1154,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.4.5 + '@types/node': 20.4.6 dev: false /@types/scheduler@0.16.3: @@ -1165,8 +1165,8 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true - /@typescript-eslint/eslint-plugin@6.2.0(@typescript-eslint/parser@6.2.0)(eslint@8.46.0)(typescript@5.1.6): - resolution: {integrity: sha512-rClGrMuyS/3j0ETa1Ui7s6GkLhfZGKZL3ZrChLeAiACBE/tRc1wq8SNZESUuluxhLj9FkUefRs2l6bCIArWBiQ==} + /@typescript-eslint/eslint-plugin@6.2.1(@typescript-eslint/parser@6.2.1)(eslint@8.46.0)(typescript@5.1.6): + resolution: {integrity: sha512-iZVM/ALid9kO0+I81pnp1xmYiFyqibAHzrqX4q5YvvVEyJqY+e6rfTXSCsc2jUxGNqJqTfFSSij/NFkZBiBzLw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -1177,11 +1177,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.2.0(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 6.2.0 - '@typescript-eslint/type-utils': 6.2.0(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/utils': 6.2.0(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.2.0 + '@typescript-eslint/parser': 6.2.1(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.2.1 + '@typescript-eslint/type-utils': 6.2.1(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/utils': 6.2.1(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.2.1 debug: 4.3.4 eslint: 8.46.0 graphemer: 1.4.0 @@ -1215,8 +1215,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.2.0(eslint@8.46.0)(typescript@5.1.6): - resolution: {integrity: sha512-igVYOqtiK/UsvKAmmloQAruAdUHihsOCvplJpplPZ+3h4aDkC/UKZZNKgB6h93ayuYLuEymU3h8nF1xMRbh37g==} + /@typescript-eslint/parser@6.2.1(eslint@8.46.0)(typescript@5.1.6): + resolution: {integrity: sha512-Ld+uL1kYFU8e6btqBFpsHkwQ35rw30IWpdQxgOqOh4NfxSDH6uCkah1ks8R/RgQqI5hHPXMaLy9fbFseIe+dIg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1225,10 +1225,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.2.0 - '@typescript-eslint/types': 6.2.0 - '@typescript-eslint/typescript-estree': 6.2.0(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.2.0 + '@typescript-eslint/scope-manager': 6.2.1 + '@typescript-eslint/types': 6.2.1 + '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.2.1 debug: 4.3.4 eslint: 8.46.0 typescript: 5.1.6 @@ -1244,16 +1244,16 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/scope-manager@6.2.0: - resolution: {integrity: sha512-1ZMNVgm5nnHURU8ZSJ3snsHzpFeNK84rdZjluEVBGNu7jDymfqceB3kdIZ6A4xCfEFFhRIB6rF8q/JIqJd2R0Q==} + /@typescript-eslint/scope-manager@6.2.1: + resolution: {integrity: sha512-UCqBF9WFqv64xNsIEPfBtenbfodPXsJ3nPAr55mGPkQIkiQvgoWNo+astj9ZUfJfVKiYgAZDMnM6dIpsxUMp3Q==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.2.0 - '@typescript-eslint/visitor-keys': 6.2.0 + '@typescript-eslint/types': 6.2.1 + '@typescript-eslint/visitor-keys': 6.2.1 dev: true - /@typescript-eslint/type-utils@6.2.0(eslint@8.46.0)(typescript@5.1.6): - resolution: {integrity: sha512-DnGZuNU2JN3AYwddYIqrVkYW0uUQdv0AY+kz2M25euVNlujcN2u+rJgfJsBFlUEzBB6OQkUqSZPyuTLf2bP5mw==} + /@typescript-eslint/type-utils@6.2.1(eslint@8.46.0)(typescript@5.1.6): + resolution: {integrity: sha512-fTfCgomBMIgu2Dh2Or3gMYgoNAnQm3RLtRp+jP7A8fY+LJ2+9PNpi5p6QB5C4RSP+U3cjI0vDlI3mspAkpPVbQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1262,8 +1262,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.2.0(typescript@5.1.6) - '@typescript-eslint/utils': 6.2.0(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) + '@typescript-eslint/utils': 6.2.1(eslint@8.46.0)(typescript@5.1.6) debug: 4.3.4 eslint: 8.46.0 ts-api-utils: 1.0.1(typescript@5.1.6) @@ -1277,8 +1277,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types@6.2.0: - resolution: {integrity: sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==} + /@typescript-eslint/types@6.2.1: + resolution: {integrity: sha512-528bGcoelrpw+sETlyM91k51Arl2ajbNT9L4JwoXE2dvRe1yd8Q64E4OL7vHYw31mlnVsf+BeeLyAZUEQtqahQ==} engines: {node: ^16.0.0 || >=18.0.0} dev: true @@ -1303,8 +1303,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.2.0(typescript@5.1.6): - resolution: {integrity: sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==} + /@typescript-eslint/typescript-estree@6.2.1(typescript@5.1.6): + resolution: {integrity: sha512-G+UJeQx9AKBHRQBpmvr8T/3K5bJa485eu+4tQBxFq0KoT22+jJyzo1B50JDT9QdC1DEmWQfdKsa8ybiNWYsi0Q==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -1312,8 +1312,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.2.0 - '@typescript-eslint/visitor-keys': 6.2.0 + '@typescript-eslint/types': 6.2.1 + '@typescript-eslint/visitor-keys': 6.2.1 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1324,8 +1324,8 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.2.0(eslint@8.46.0)(typescript@5.1.6): - resolution: {integrity: sha512-RCFrC1lXiX1qEZN8LmLrxYRhOkElEsPKTVSNout8DMzf8PeWoQG7Rxz2SadpJa3VSh5oYKGwt7j7X/VRg+Y3OQ==} + /@typescript-eslint/utils@6.2.1(eslint@8.46.0)(typescript@5.1.6): + resolution: {integrity: sha512-eBIXQeupYmxVB6S7x+B9SdBeB6qIdXKjgQBge2J+Ouv8h9Cxm5dHf/gfAZA6dkMaag+03HdbVInuXMmqFB/lKQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1333,9 +1333,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.2.0 - '@typescript-eslint/types': 6.2.0 - '@typescript-eslint/typescript-estree': 6.2.0(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.2.1 + '@typescript-eslint/types': 6.2.1 + '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) eslint: 8.46.0 semver: 7.5.4 transitivePeerDependencies: @@ -1351,11 +1351,11 @@ packages: eslint-visitor-keys: 3.4.2 dev: true - /@typescript-eslint/visitor-keys@6.2.0: - resolution: {integrity: sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ==} + /@typescript-eslint/visitor-keys@6.2.1: + resolution: {integrity: sha512-iTN6w3k2JEZ7cyVdZJTVJx2Lv7t6zFA8DCrJEHD2mwfc16AEvvBWVhbFh34XyG2NORCd0viIgQY1+u7kPI0WpA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.2.0 + '@typescript-eslint/types': 6.2.1 eslint-visitor-keys: 3.4.2 dev: true @@ -1591,8 +1591,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.9 - caniuse-lite: 1.0.30001517 + browserslist: 4.21.10 + caniuse-lite: 1.0.30001518 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -1705,15 +1705,15 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist@4.21.9: - resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001517 - electron-to-chromium: 1.4.476 + caniuse-lite: 1.0.30001518 + electron-to-chromium: 1.4.481 node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.9) + update-browserslist-db: 1.0.11(browserslist@4.21.10) dev: false /buffer-indexof-polyfill@1.0.2: @@ -1785,8 +1785,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - /caniuse-lite@1.0.30001517: - resolution: {integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==} + /caniuse-lite@1.0.30001518: + resolution: {integrity: sha512-rup09/e3I0BKjncL+FesTayKtPrdwKhUufQFd3riFw1hHg8JmIFoInYfB102cFcY/pPgGmdyl/iy+jgiDi2vdA==} dev: false /chainsaw@0.1.0: @@ -2244,8 +2244,8 @@ packages: semver: 7.5.4 dev: false - /electron-to-chromium@1.4.476: - resolution: {integrity: sha512-gzWl1m8pNy+5Kj17XcziNcbOhripjTqR2wAQmtdlFUngPYuFy7zUpJScVQAvCvQSFHNk3mS5fetNKW6BSpytFg==} + /electron-to-chromium@1.4.481: + resolution: {integrity: sha512-25DitMKGaWUPjv3kCt2H3UqgMhmdN+ufG+PoSjnQtheR64Dvo75RbojLPzUmnwrEuLEzR5YrbTzOUq9DtnTUUw==} dev: false /emoji-regex@9.2.2: @@ -2406,9 +2406,9 @@ packages: eslint: 8.46.0 eslint-import-resolver-node: 0.3.7 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.0)(eslint@8.46.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.2.0)(eslint@8.46.0) + eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.2.1)(eslint@8.46.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.46.0) - eslint-plugin-react: 7.33.0(eslint@8.46.0) + eslint-plugin-react: 7.33.1(eslint@8.46.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.46.0) typescript: 5.1.6 transitivePeerDependencies: @@ -2437,7 +2437,7 @@ packages: enhanced-resolve: 5.15.0 eslint: 8.46.0 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.46.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.2.0)(eslint@8.46.0) + eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.2.1)(eslint@8.46.0) get-tsconfig: 4.6.2 globby: 13.2.2 is-core-module: 2.12.1 @@ -2480,7 +2480,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.2.0)(eslint-import-resolver-node@0.3.7)(eslint@8.46.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.2.1)(eslint-import-resolver-node@0.3.7)(eslint@8.46.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -2501,7 +2501,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.2.0(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.2.1(eslint@8.46.0)(typescript@5.1.6) debug: 3.2.7 eslint: 8.46.0 eslint-import-resolver-node: 0.3.7 @@ -2509,7 +2509,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.2.0)(eslint@8.46.0): + /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.2.1)(eslint@8.46.0): resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} engines: {node: '>=4'} peerDependencies: @@ -2519,7 +2519,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.2.0(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.2.1(eslint@8.46.0)(typescript@5.1.6) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 @@ -2528,7 +2528,7 @@ packages: doctrine: 2.1.0 eslint: 8.46.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.2.0)(eslint-import-resolver-node@0.3.7)(eslint@8.46.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.2.1)(eslint-import-resolver-node@0.3.7)(eslint@8.46.0) has: 1.0.3 is-core-module: 2.12.1 is-glob: 4.0.3 @@ -2562,7 +2562,7 @@ packages: emoji-regex: 9.2.2 eslint: 8.46.0 has: 1.0.3 - jsx-ast-utils: 3.3.4 + jsx-ast-utils: 3.3.5 language-tags: 1.0.5 minimatch: 3.1.2 object.entries: 1.1.6 @@ -2579,8 +2579,8 @@ packages: eslint: 8.46.0 dev: true - /eslint-plugin-react@7.33.0(eslint@8.46.0): - resolution: {integrity: sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw==} + /eslint-plugin-react@7.33.1(eslint@8.46.0): + resolution: {integrity: sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 @@ -2591,7 +2591,7 @@ packages: doctrine: 2.1.0 eslint: 8.46.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.4 + jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.6 object.fromentries: 2.0.6 @@ -3604,8 +3604,8 @@ packages: graceful-fs: 4.2.11 dev: false - /jsx-ast-utils@3.3.4: - resolution: {integrity: sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==} + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: array-includes: 3.1.6 @@ -3893,7 +3893,7 @@ packages: '@next/env': 13.4.12 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001517 + caniuse-lite: 1.0.30001518 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4495,13 +4495,13 @@ packages: js-beautify: 1.14.9 dev: false - /prisma@5.0.0: - resolution: {integrity: sha512-KYWk83Fhi1FH59jSpavAYTt2eoMVW9YKgu8ci0kuUnt6Dup5Qy47pcB4/TLmiPAbhGrxxSz7gsSnJcCmkyPANA==} + /prisma@5.1.0: + resolution: {integrity: sha512-wkXvh+6wxk03G8qwpZMOed4Y3j+EQ+bMTlvbDZHeal6k1E8QuGKzRO7DRXlE1NV0WNgOAas8kwZqcLETQ2+BiQ==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.0.0 + '@prisma/engines': 5.1.0 /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -5515,13 +5515,13 @@ packages: setimmediate: 1.0.5 dev: false - /update-browserslist-db@1.0.11(browserslist@4.21.9): + /update-browserslist-db@1.0.11(browserslist@4.21.10): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.9 + browserslist: 4.21.10 escalade: 3.1.1 picocolors: 1.0.0 dev: false From e430763d90cbb9fe9fe5b3bbe895dd360d4bdc3b Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Thu, 3 Aug 2023 12:26:17 -0600 Subject: [PATCH 7/7] Package updates --- package.json | 14 +++--- pnpm-lock.yaml | 128 ++++++++++++++++++++++++------------------------- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index 44cfe28..4fef619 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,13 @@ "dependencies": { "@ably-labs/react-hooks": "^2.1.1", "@auth/prisma-adapter": "^1.0.1", - "@prisma/client": "5.1.0", + "@prisma/client": "5.1.1", "@react-email/components": "^0.0.7", "@tanstack/react-query": "^4.32.1", - "@trpc/client": "10.36.0", - "@trpc/next": "10.36.0", - "@trpc/react-query": "10.36.0", - "@trpc/server": "10.36.0", + "@trpc/client": "10.37.1", + "@trpc/next": "10.37.1", + "@trpc/react-query": "10.37.1", + "@trpc/server": "10.37.1", "@upstash/ratelimit": "^0.4.3", "@upstash/redis": "^1.22.0", "ably": "^1.2.42", @@ -47,10 +47,10 @@ "@types/react": "^18.2.18", "@typescript-eslint/eslint-plugin": "^6.2.1", "@typescript-eslint/parser": "^6.2.1", - "daisyui": "^3.5.0", + "daisyui": "^3.5.1", "eslint": "^8.46.0", "eslint-config-next": "^13.4.12", - "prisma": "5.1.0", + "prisma": "5.1.1", "tailwindcss": "^3.3.3", "typescript": "^5.1.6" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d98474a..e039d6f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ dependencies: version: 2.1.1(react-dom@18.2.0)(react@18.2.0) '@auth/prisma-adapter': specifier: ^1.0.1 - version: 1.0.1(@prisma/client@5.1.0) + version: 1.0.1(@prisma/client@5.1.1) '@prisma/client': - specifier: 5.1.0 - version: 5.1.0(prisma@5.1.0) + specifier: 5.1.1 + version: 5.1.1(prisma@5.1.1) '@react-email/components': specifier: ^0.0.7 version: 0.0.7 @@ -21,17 +21,17 @@ dependencies: specifier: ^4.32.1 version: 4.32.1(react-dom@18.2.0)(react@18.2.0) '@trpc/client': - specifier: 10.36.0 - version: 10.36.0(@trpc/server@10.36.0) + specifier: 10.37.1 + version: 10.37.1(@trpc/server@10.37.1) '@trpc/next': - specifier: 10.36.0 - version: 10.36.0(@tanstack/react-query@4.32.1)(@trpc/client@10.36.0)(@trpc/react-query@10.36.0)(@trpc/server@10.36.0)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0) + specifier: 10.37.1 + version: 10.37.1(@tanstack/react-query@4.32.1)(@trpc/client@10.37.1)(@trpc/react-query@10.37.1)(@trpc/server@10.37.1)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0) '@trpc/react-query': - specifier: 10.36.0 - version: 10.36.0(@tanstack/react-query@4.32.1)(@trpc/client@10.36.0)(@trpc/server@10.36.0)(react-dom@18.2.0)(react@18.2.0) + specifier: 10.37.1 + version: 10.37.1(@tanstack/react-query@4.32.1)(@trpc/client@10.37.1)(@trpc/server@10.37.1)(react-dom@18.2.0)(react@18.2.0) '@trpc/server': - specifier: 10.36.0 - version: 10.36.0 + specifier: 10.37.1 + version: 10.37.1 '@upstash/ratelimit': specifier: ^0.4.3 version: 0.4.3 @@ -82,7 +82,7 @@ dependencies: version: 1.13.1 trpc-openapi: specifier: ^1.2.0 - version: 1.2.0(@trpc/server@10.36.0)(zod@3.21.4) + version: 1.2.0(@trpc/server@10.37.1)(zod@3.21.4) zod: specifier: ^3.21.4 version: 3.21.4 @@ -107,8 +107,8 @@ devDependencies: specifier: ^6.2.1 version: 6.2.1(eslint@8.46.0)(typescript@5.1.6) daisyui: - specifier: ^3.5.0 - version: 3.5.0 + specifier: ^3.5.1 + version: 3.5.1 eslint: specifier: ^8.46.0 version: 8.46.0 @@ -116,8 +116,8 @@ devDependencies: specifier: ^13.4.12 version: 13.4.12(eslint@8.46.0)(typescript@5.1.6) prisma: - specifier: 5.1.0 - version: 5.1.0 + specifier: 5.1.1 + version: 5.1.1 tailwindcss: specifier: ^3.3.3 version: 3.3.3 @@ -173,13 +173,13 @@ packages: preact-render-to-string: 5.2.3(preact@10.11.3) dev: false - /@auth/prisma-adapter@1.0.1(@prisma/client@5.1.0): + /@auth/prisma-adapter@1.0.1(@prisma/client@5.1.1): resolution: {integrity: sha512-sBp9l/jVr7l9y7rp2Pv6eoP7i8X2CgRNE3jDWJ0B/u+HnKRofXflD1cldPqRSAkJhqH3UxhVtMTEijT9FoofmQ==} peerDependencies: '@prisma/client': '>=2.26.0 || >=3 || >=4' dependencies: '@auth/core': 0.9.0 - '@prisma/client': 5.1.0(prisma@5.1.0) + '@prisma/client': 5.1.1(prisma@5.1.1) transitivePeerDependencies: - nodemailer dev: false @@ -781,8 +781,8 @@ packages: tslib: 2.6.1 dev: true - /@prisma/client@5.1.0(prisma@5.1.0): - resolution: {integrity: sha512-aIxuXlH3p3Vy91buodQhYgAD9m0yuxJzpXMhc1ejQ/WN3pNNWzBA0iDcBObLq8DMdszcXmoLAk3hiRq/ZwBsOw==} + /@prisma/client@5.1.1(prisma@5.1.1): + resolution: {integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -791,16 +791,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b - prisma: 5.1.0 + '@prisma/engines-version': 5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e + prisma: 5.1.1 dev: false - /@prisma/engines-version@5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b: - resolution: {integrity: sha512-jTwE2oy1yjICmTfnCR0ASIpuMZXZ18sUzQXB7V0RMbrM9OlcmbUwXPuYhnxXuWN8XwRmujeIhsXs/Zeh+fjPOQ==} + /@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e: + resolution: {integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==} dev: false - /@prisma/engines@5.1.0: - resolution: {integrity: sha512-HqaFsnPmZOdMWkPq6tT2eTVTQyaAXEDdKszcZ4yc7DGMBIYRP6j/zAJTtZUG9SsMV8FaucdL5vRyxY/p5Ni28g==} + /@prisma/engines@5.1.1: + resolution: {integrity: sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==} requiresBuild: true /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): @@ -1035,53 +1035,53 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /@trpc/client@10.36.0(@trpc/server@10.36.0): - resolution: {integrity: sha512-Qj1T4vwhEEeLgXCUHFT7S5fqytkNYAudHwZtooEZ+NN+yN/a5oDZy1wd5D/gkY9y+nO8JCSgc7P5KhLjwzdeVw==} + /@trpc/client@10.37.1(@trpc/server@10.37.1): + resolution: {integrity: sha512-OSblNfeI0Z9ERn3usgLV2x63CwwPoNOHf1FQK85cOT7F8MNaWyEHoEv7tHUwNGJwyzKXmpU+ockZ0movzX3D0g==} peerDependencies: - '@trpc/server': 10.36.0 + '@trpc/server': 10.37.1 dependencies: - '@trpc/server': 10.36.0 + '@trpc/server': 10.37.1 dev: false - /@trpc/next@10.36.0(@tanstack/react-query@4.32.1)(@trpc/client@10.36.0)(@trpc/react-query@10.36.0)(@trpc/server@10.36.0)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-R0DYUMXkzKGQy49vvVou1fqOu459D47OsejwhMUktTNadTpUAuaE8SM0mo9a/faK59NhdlihDvRGq74PHupIkQ==} + /@trpc/next@10.37.1(@tanstack/react-query@4.32.1)(@trpc/client@10.37.1)(@trpc/react-query@10.37.1)(@trpc/server@10.37.1)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-0KEgr09mBfao56lkj7ZBfVOY86d3+bDH1o0zJkDHSH60Dp/hIJ7wLCnZJIhePlZxEwknCQjVeLsTy4Pqlu8NyQ==} peerDependencies: '@tanstack/react-query': ^4.18.0 - '@trpc/client': 10.36.0 - '@trpc/react-query': 10.36.0 - '@trpc/server': 10.36.0 + '@trpc/client': 10.37.1 + '@trpc/react-query': 10.37.1 + '@trpc/server': 10.37.1 next: '*' react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: '@tanstack/react-query': 4.32.1(react-dom@18.2.0)(react@18.2.0) - '@trpc/client': 10.36.0(@trpc/server@10.36.0) - '@trpc/react-query': 10.36.0(@tanstack/react-query@4.32.1)(@trpc/client@10.36.0)(@trpc/server@10.36.0)(react-dom@18.2.0)(react@18.2.0) - '@trpc/server': 10.36.0 + '@trpc/client': 10.37.1(@trpc/server@10.37.1) + '@trpc/react-query': 10.37.1(@tanstack/react-query@4.32.1)(@trpc/client@10.37.1)(@trpc/server@10.37.1)(react-dom@18.2.0)(react@18.2.0) + '@trpc/server': 10.37.1 next: 13.4.12(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-ssr-prepass: 1.5.0(react@18.2.0) dev: false - /@trpc/react-query@10.36.0(@tanstack/react-query@4.32.1)(@trpc/client@10.36.0)(@trpc/server@10.36.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-ueIdfP/Xl4DIeBLMh6hEb0QdvcUjDZ+V+4lzIuztmkpRIvL4ZpwyBS7TGbKs+1EUwWu42AJB0t8n/LrtO6MxgQ==} + /@trpc/react-query@10.37.1(@tanstack/react-query@4.32.1)(@trpc/client@10.37.1)(@trpc/server@10.37.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TbOOPp0fZVaKfaeEyDoV8QeTHW1vgPTbfOs0uSQ4AzBXqXPu+9v1B44z8GGRJSdUxuOX9pG/6Ap5Kx8PQ3eF+Q==} peerDependencies: '@tanstack/react-query': ^4.18.0 - '@trpc/client': 10.36.0 - '@trpc/server': 10.36.0 + '@trpc/client': 10.37.1 + '@trpc/server': 10.37.1 react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: '@tanstack/react-query': 4.32.1(react-dom@18.2.0)(react@18.2.0) - '@trpc/client': 10.36.0(@trpc/server@10.36.0) - '@trpc/server': 10.36.0 + '@trpc/client': 10.37.1(@trpc/server@10.37.1) + '@trpc/server': 10.37.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@trpc/server@10.36.0: - resolution: {integrity: sha512-9kwFeGBuihUPZT2wRv2cmTpSoI+sSGj0/lBwvtgIq1P0+ONpj5NJOcWlvYbpnr5nRxc/+44lM/mg4TnSuTd5Kg==} + /@trpc/server@10.37.1: + resolution: {integrity: sha512-r3VeA319/braYMBIzj+XLgLKQ9lJSVglvPvP9HUv4kr5w6Y5grQMxMcExhTiZWltE9bnSJHKtBBzHafOo7KC8A==} dev: false /@types/cacheable-request@6.0.3: @@ -1592,7 +1592,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.21.10 - caniuse-lite: 1.0.30001518 + caniuse-lite: 1.0.30001519 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -1710,8 +1710,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001518 - electron-to-chromium: 1.4.481 + caniuse-lite: 1.0.30001519 + electron-to-chromium: 1.4.483 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) dev: false @@ -1785,8 +1785,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - /caniuse-lite@1.0.30001518: - resolution: {integrity: sha512-rup09/e3I0BKjncL+FesTayKtPrdwKhUufQFd3riFw1hHg8JmIFoInYfB102cFcY/pPgGmdyl/iy+jgiDi2vdA==} + /caniuse-lite@1.0.30001519: + resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} dev: false /chainsaw@0.1.0: @@ -2013,8 +2013,8 @@ packages: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: true - /daisyui@3.5.0: - resolution: {integrity: sha512-wSaeXwaYdMv4yURv9wj7kKQQN9Jyumfh/skIpZfCNkCb2jLf/so+iNKSM8l4rDN0TRvB5OccMlAvsf2UAtk2gg==} + /daisyui@3.5.1: + resolution: {integrity: sha512-7GG+9QXnr2qQMCqnyFU8TxpaOYJigXiEtmzoivmiiZZHvxqIwYdaMAkgivqTVxEgy3Hot3m1suzZjmt1zUrvmA==} engines: {node: '>=16.9.0'} dependencies: colord: 2.9.3 @@ -2148,8 +2148,8 @@ packages: engines: {node: '>=6'} dev: true - /destr@2.0.0: - resolution: {integrity: sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg==} + /destr@2.0.1: + resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} dev: false /detect-libc@2.0.2: @@ -2244,8 +2244,8 @@ packages: semver: 7.5.4 dev: false - /electron-to-chromium@1.4.481: - resolution: {integrity: sha512-25DitMKGaWUPjv3kCt2H3UqgMhmdN+ufG+PoSjnQtheR64Dvo75RbojLPzUmnwrEuLEzR5YrbTzOUq9DtnTUUw==} + /electron-to-chromium@1.4.483: + resolution: {integrity: sha512-YLwU0iF//9R3cCEfq0wgL+pf9vglE4kwAg4S5tkVVZljUDKv7Wcz67mTY4OOj+T7YUbTGuqlbqgdl/s+7Q8KTw==} dev: false /emoji-regex@9.2.2: @@ -3101,7 +3101,7 @@ packages: dependencies: cookie-es: 1.0.0 defu: 6.1.2 - destr: 2.0.0 + destr: 2.0.1 iron-webcrypto: 0.7.1 radix3: 1.0.1 ufo: 1.2.0 @@ -3893,7 +3893,7 @@ packages: '@next/env': 13.4.12 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001518 + caniuse-lite: 1.0.30001519 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4495,13 +4495,13 @@ packages: js-beautify: 1.14.9 dev: false - /prisma@5.1.0: - resolution: {integrity: sha512-wkXvh+6wxk03G8qwpZMOed4Y3j+EQ+bMTlvbDZHeal6k1E8QuGKzRO7DRXlE1NV0WNgOAas8kwZqcLETQ2+BiQ==} + /prisma@5.1.1: + resolution: {integrity: sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.1.0 + '@prisma/engines': 5.1.1 /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -5313,13 +5313,13 @@ packages: pretty-bytes: 5.6.0 dev: false - /trpc-openapi@1.2.0(@trpc/server@10.36.0)(zod@3.21.4): + /trpc-openapi@1.2.0(@trpc/server@10.37.1)(zod@3.21.4): resolution: {integrity: sha512-pfYoCd/3KYXWXvUPZBKJw455OOwngKN/6SIcj7Yit19OMLJ+8yVZkEvGEeg5wUSwfsiTdRsKuvqkRPXVSwV7ew==} peerDependencies: '@trpc/server': ^10.0.0 zod: ^3.14.4 dependencies: - '@trpc/server': 10.36.0 + '@trpc/server': 10.37.1 co-body: 6.1.0 h3: 1.7.1 lodash.clonedeep: 4.5.0