From 2cf926763707fe926b8cd9dffbd621dd108754c2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 07:39:08 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20dependency=20?= =?UTF-8?q?express=20to=20v5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- pnpm-lock.yaml | 284 ++++++++++++++++++++++--------------------------- 2 files changed, 129 insertions(+), 157 deletions(-) diff --git a/package.json b/package.json index dc47976..fc30f3d 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "cors": "2.8.5", "dotenv": "16.5.0", "envalid": "8.0.0", - "express": "4.21.2", + "express": "5.1.0", "express-rate-limit": "7.5.0", "helmet": "8.1.0", "http-status-codes": "2.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea600cb..5332989 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,11 +21,11 @@ importers: specifier: 8.0.0 version: 8.0.0 express: - specifier: 4.21.2 - version: 4.21.2 + specifier: 5.1.0 + version: 5.1.0 express-rate-limit: specifier: 7.5.0 - version: 7.5.0(express@4.21.2) + version: 7.5.0(express@5.1.0) helmet: specifier: 8.1.0 version: 8.1.0 @@ -40,7 +40,7 @@ importers: version: 10.4.0 swagger-ui-express: specifier: 5.0.1 - version: 5.0.1(express@4.21.2) + version: 5.0.1(express@5.1.0) zod: specifier: 3.24.3 version: 3.24.3 @@ -552,8 +552,8 @@ packages: '@vitest/utils@3.1.2': resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} ansi-regex@5.0.1: @@ -575,9 +575,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -595,9 +592,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -661,16 +658,17 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} engines: {node: '>= 0.6'} content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} @@ -690,14 +688,6 @@ packages: dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -719,10 +709,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} @@ -746,10 +732,6 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -805,9 +787,9 @@ packages: peerDependencies: express: ^4.11 || 5 || ^5.0.0-beta.1 - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} @@ -827,8 +809,8 @@ packages: picomatch: optional: true - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} engines: {node: '>= 0.8'} foreground-child@3.3.1: @@ -847,9 +829,9 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -918,8 +900,8 @@ packages: http-status-codes@2.3.0: resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} inherits@2.0.4: @@ -933,6 +915,9 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -993,12 +978,13 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -1008,14 +994,17 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} @@ -1033,9 +1022,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1047,8 +1033,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} object-assign@4.1.1: @@ -1088,8 +1074,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1162,10 +1149,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} @@ -1177,8 +1160,8 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} readdirp@4.1.2: @@ -1201,6 +1184,10 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1219,13 +1206,13 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -1419,8 +1406,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} typescript@5.8.3: @@ -1435,10 +1422,6 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -1925,10 +1908,10 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - accepts@1.3.8: + accepts@2.0.0: dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 + mime-types: 3.0.1 + negotiator: 1.0.0 ansi-regex@5.0.1: {} @@ -1942,8 +1925,6 @@ snapshots: any-promise@1.3.0: {} - array-flatten@1.1.1: {} - asap@2.0.6: {} assertion-error@2.0.1: {} @@ -1954,20 +1935,17 @@ snapshots: balanced-match@1.0.2: {} - body-parser@1.20.3: + body-parser@2.2.0: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 + debug: 4.4.0 http-errors: 2.0.0 - iconv-lite: 0.4.24 + iconv-lite: 0.6.3 on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 transitivePeerDependencies: - supports-color @@ -2026,13 +2004,13 @@ snapshots: consola@3.4.2: {} - content-disposition@0.5.4: + content-disposition@1.0.0: dependencies: safe-buffer: 5.2.1 content-type@1.0.5: {} - cookie-signature@1.0.6: {} + cookie-signature@1.2.2: {} cookie@0.7.1: {} @@ -2051,10 +2029,6 @@ snapshots: dateformat@4.6.3: {} - debug@2.6.9: - dependencies: - ms: 2.0.0 - debug@4.4.0: dependencies: ms: 2.1.3 @@ -2065,8 +2039,6 @@ snapshots: depd@2.0.0: {} - destroy@1.2.0: {} - dezalgo@1.0.4: dependencies: asap: 2.0.6 @@ -2088,8 +2060,6 @@ snapshots: emoji-regex@9.2.2: {} - encodeurl@1.0.2: {} - encodeurl@2.0.0: {} end-of-stream@1.4.4: @@ -2155,42 +2125,38 @@ snapshots: expect-type@1.2.1: {} - express-rate-limit@7.5.0(express@4.21.2): + express-rate-limit@7.5.0(express@5.1.0): dependencies: - express: 4.21.2 + express: 5.1.0 - express@4.21.2: + express@5.1.0: dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 content-type: 1.0.5 cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 + cookie-signature: 1.2.2 + debug: 4.4.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 + finalhandler: 2.1.0 + fresh: 2.0.0 http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 on-finished: 2.4.1 + once: 1.4.0 parseurl: 1.3.3 - path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.13.0 + qs: 6.14.0 range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 + type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -2205,15 +2171,14 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - finalhandler@1.3.1: + finalhandler@2.1.0: dependencies: - debug: 2.6.9 + debug: 4.4.0 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 statuses: 2.0.1 - unpipe: 1.0.0 transitivePeerDependencies: - supports-color @@ -2237,7 +2202,7 @@ snapshots: forwarded@0.2.0: {} - fresh@0.5.2: {} + fresh@2.0.0: {} fsevents@2.3.3: optional: true @@ -2309,7 +2274,7 @@ snapshots: http-status-codes@2.3.0: {} - iconv-lite@0.4.24: + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -2319,6 +2284,8 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-promise@4.0.0: {} + isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} @@ -2378,19 +2345,23 @@ snapshots: math-intrinsics@1.1.0: {} - media-typer@0.3.0: {} + media-typer@1.1.0: {} - merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} methods@1.1.2: {} mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mime@1.6.0: {} + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 mime@2.6.0: {} @@ -2402,8 +2373,6 @@ snapshots: minipass@7.1.2: {} - ms@2.0.0: {} - ms@2.1.3: {} mz@2.7.0: @@ -2414,7 +2383,7 @@ snapshots: nanoid@3.3.11: {} - negotiator@0.6.3: {} + negotiator@1.0.0: {} object-assign@4.1.1: {} @@ -2445,7 +2414,7 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.12: {} + path-to-regexp@8.2.0: {} pathe@2.0.3: {} @@ -2528,10 +2497,6 @@ snapshots: punycode@2.3.1: {} - qs@6.13.0: - dependencies: - side-channel: 1.1.0 - qs@6.14.0: dependencies: side-channel: 1.1.0 @@ -2540,11 +2505,11 @@ snapshots: range-parser@1.2.1: {} - raw-body@2.5.2: + raw-body@3.0.0: dependencies: bytes: 3.1.2 http-errors: 2.0.0 - iconv-lite: 0.4.24 + iconv-lite: 0.6.3 unpipe: 1.0.0 readdirp@4.1.2: {} @@ -2581,6 +2546,16 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.40.0 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.0 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + safe-buffer@5.2.1: {} safe-stable-stringify@2.5.0: {} @@ -2591,17 +2566,15 @@ snapshots: semver@7.7.1: {} - send@0.19.0: + send@1.2.0: dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 + debug: 4.4.0 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - fresh: 0.5.2 + fresh: 2.0.0 http-errors: 2.0.0 - mime: 1.6.0 + mime-types: 3.0.1 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 @@ -2609,12 +2582,12 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@1.16.2: + serve-static@2.2.0: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.19.0 + send: 1.2.0 transitivePeerDependencies: - supports-color @@ -2737,9 +2710,9 @@ snapshots: dependencies: '@scarf/scarf': 1.4.0 - swagger-ui-express@5.0.1(express@4.21.2): + swagger-ui-express@5.0.1(express@5.1.0): dependencies: - express: 4.21.2 + express: 5.1.0 swagger-ui-dist: 5.21.0 test-exclude@7.0.1: @@ -2825,10 +2798,11 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - type-is@1.6.18: + type-is@2.0.1: dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 typescript@5.8.3: {} @@ -2836,8 +2810,6 @@ snapshots: unpipe@1.0.0: {} - utils-merge@1.0.1: {} - vary@1.1.2: {} vite-node@3.1.2(@types/node@22.15.2)(tsx@4.19.3)(yaml@2.7.1): From c0d83e954935c3138dcd405c3232b95a844f0e19 Mon Sep 17 00:00:00 2001 From: Edwin Hernandez Date: Fri, 25 Apr 2025 15:07:40 -0500 Subject: [PATCH 2/2] refactor: Simplify response handling in API controllers and middleware --- .env.template | 2 +- package.json | 2 +- src/api/healthCheck/healthCheckRouter.ts | 3 +-- src/api/user/userController.ts | 5 ++--- src/common/__tests__/errorHandler.test.ts | 25 ++++++++-------------- src/common/__tests__/requestLogger.test.ts | 4 +++- src/common/middleware/errorHandler.ts | 2 +- src/common/utils/httpHandlers.ts | 6 +----- 8 files changed, 19 insertions(+), 30 deletions(-) diff --git a/.env.template b/.env.template index ecb2996..6ca6fc1 100644 --- a/.env.template +++ b/.env.template @@ -7,5 +7,5 @@ HOST="localhost" # Hostname for the server CORS_ORIGIN="http://localhost:*" # Allowed CORS origin, adjust as necessary # Rate Limiting -COMMON_RATE_LIMIT_WINDOW_MS="1000" # Window size for rate limiting (ms) +COMMON_RATE_LIMIT_WINDOW_MS="1000" # Window size for rate limiting (ms) COMMON_RATE_LIMIT_MAX_REQUESTS="20" # Max number of requests per window per IP diff --git a/package.json b/package.json index fc30f3d..1df5025 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "main": "index.ts", "private": true, "scripts": { - "build": "tsup", + "build": "tsc && tsup", "start:dev": "tsx watch --clear-screen=false src/index.ts | pino-pretty", "start:prod": "node dist/index.js", "lint": "biome lint", diff --git a/src/api/healthCheck/healthCheckRouter.ts b/src/api/healthCheck/healthCheckRouter.ts index 16556a9..11765fa 100644 --- a/src/api/healthCheck/healthCheckRouter.ts +++ b/src/api/healthCheck/healthCheckRouter.ts @@ -4,7 +4,6 @@ import { z } from "zod"; import { createApiResponse } from "@/api-docs/openAPIResponseBuilders"; import { ServiceResponse } from "@/common/models/serviceResponse"; -import { handleServiceResponse } from "@/common/utils/httpHandlers"; export const healthCheckRegistry = new OpenAPIRegistry(); export const healthCheckRouter: Router = express.Router(); @@ -18,5 +17,5 @@ healthCheckRegistry.registerPath({ healthCheckRouter.get("/", (_req: Request, res: Response) => { const serviceResponse = ServiceResponse.success("Service is healthy", null); - return handleServiceResponse(serviceResponse, res); + res.status(serviceResponse.statusCode).send(serviceResponse); }); diff --git a/src/api/user/userController.ts b/src/api/user/userController.ts index 30d4b44..69407ea 100644 --- a/src/api/user/userController.ts +++ b/src/api/user/userController.ts @@ -1,18 +1,17 @@ import type { Request, RequestHandler, Response } from "express"; import { userService } from "@/api/user/userService"; -import { handleServiceResponse } from "@/common/utils/httpHandlers"; class UserController { public getUsers: RequestHandler = async (_req: Request, res: Response) => { const serviceResponse = await userService.findAll(); - return handleServiceResponse(serviceResponse, res); + res.status(serviceResponse.statusCode).send(serviceResponse); }; public getUser: RequestHandler = async (req: Request, res: Response) => { const id = Number.parseInt(req.params.id as string, 10); const serviceResponse = await userService.findById(id); - return handleServiceResponse(serviceResponse, res); + res.status(serviceResponse.statusCode).send(serviceResponse); }; } diff --git a/src/common/__tests__/errorHandler.test.ts b/src/common/__tests__/errorHandler.test.ts index a8508fc..1d19405 100644 --- a/src/common/__tests__/errorHandler.test.ts +++ b/src/common/__tests__/errorHandler.test.ts @@ -19,27 +19,20 @@ describe("Error Handler Middleware", () => { }); app.use(errorHandler()); - app.use("*", (req, res) => res.status(StatusCodes.NOT_FOUND).send("Not Found")); }); - describe("Handling unknown routes", () => { - it("returns 404 for unknown routes", async () => { - const response = await request(app).get("/this-route-does-not-exist"); - expect(response.status).toBe(StatusCodes.NOT_FOUND); - }); + it("returns 404 for unknown routes", async () => { + const response = await request(app).get("/this-route-does-not-exist"); + expect(response.status).toBe(StatusCodes.NOT_FOUND); }); - describe("Handling thrown errors", () => { - it("handles thrown errors with a 500 status code", async () => { - const response = await request(app).get("/error"); - expect(response.status).toBe(StatusCodes.INTERNAL_SERVER_ERROR); - }); + it("handles thrown errors with a 500 status code", async () => { + const response = await request(app).get("/error"); + expect(response.status).toBe(StatusCodes.INTERNAL_SERVER_ERROR); }); - describe("Handling errors passed to next()", () => { - it("handles errors passed to next() with a 500 status code", async () => { - const response = await request(app).get("/next-error"); - expect(response.status).toBe(StatusCodes.INTERNAL_SERVER_ERROR); - }); + it("handles errors passed to next() with a 500 status code", async () => { + const response = await request(app).get("/next-error"); + expect(response.status).toBe(StatusCodes.INTERNAL_SERVER_ERROR); }); }); diff --git a/src/common/__tests__/requestLogger.test.ts b/src/common/__tests__/requestLogger.test.ts index a156863..73ef6c0 100644 --- a/src/common/__tests__/requestLogger.test.ts +++ b/src/common/__tests__/requestLogger.test.ts @@ -10,7 +10,9 @@ describe("Request Logger Middleware", () => { beforeAll(() => { app.use(requestLogger); - app.get("/success", (req, res) => res.status(StatusCodes.OK).send("Success")); + app.get("/success", (_req, res) => { + res.status(StatusCodes.OK).send("Success"); + }); app.get("/redirect", (req, res) => res.redirect("/success")); app.get("/error", () => { throw new Error("Test error"); diff --git a/src/common/middleware/errorHandler.ts b/src/common/middleware/errorHandler.ts index 80621ea..32a7220 100644 --- a/src/common/middleware/errorHandler.ts +++ b/src/common/middleware/errorHandler.ts @@ -2,7 +2,7 @@ import type { ErrorRequestHandler, RequestHandler } from "express"; import { StatusCodes } from "http-status-codes"; const unexpectedRequest: RequestHandler = (_req, res) => { - res.sendStatus(StatusCodes.NOT_FOUND); + res.status(StatusCodes.NOT_FOUND).send("Not Found"); }; const addErrorToRequestLog: ErrorRequestHandler = (err, _req, res, next) => { diff --git a/src/common/utils/httpHandlers.ts b/src/common/utils/httpHandlers.ts index 67f1634..3aa603a 100644 --- a/src/common/utils/httpHandlers.ts +++ b/src/common/utils/httpHandlers.ts @@ -4,10 +4,6 @@ import type { ZodError, ZodSchema } from "zod"; import { ServiceResponse } from "@/common/models/serviceResponse"; -export const handleServiceResponse = (serviceResponse: ServiceResponse, response: Response) => { - return response.status(serviceResponse.statusCode).send(serviceResponse); -}; - export const validateRequest = (schema: ZodSchema) => (req: Request, res: Response, next: NextFunction) => { try { schema.parse({ body: req.body, query: req.query, params: req.params }); @@ -16,6 +12,6 @@ export const validateRequest = (schema: ZodSchema) => (req: Request, res: Respon const errorMessage = `Invalid input: ${(err as ZodError).errors.map((e) => e.message).join(", ")}`; const statusCode = StatusCodes.BAD_REQUEST; const serviceResponse = ServiceResponse.failure(errorMessage, null, statusCode); - return handleServiceResponse(serviceResponse, res); + res.status(serviceResponse.statusCode).send(serviceResponse); } };