From 6d1f5a9509a1a0ec1cbe745a30bc60520131a797 Mon Sep 17 00:00:00 2001 From: Matheus Andrade Date: Tue, 13 Oct 2026 19:03:43 -0300 Subject: [PATCH 1/6] :boom: feat!: require express 5 in the express peer dependency BREAKING CHANGE: express and @types/express peers are now ^5.0.0. Services using controllers, middlewares or auth-permission/express on express 4 must migrate to express 5 before upgrading. The express permission middleware is now async and relies on express 5 forwarding rejected promises to the error handler. Co-Authored-By: Claude Opus 5.5 --- package.json | 10 +- pnpm-lock.yaml | 412 +++++++++--------- .../express-register-permission-auth.ts | 21 +- tests/controllers/http-controller.spec.ts | 137 ++++++ .../controllers/subscriber-controller.spec.ts | 75 ++++ tests/middlewares/express-context.spec.ts | 114 +++++ tests/middlewares/gcp-authentication.spec.ts | 82 ++++ tests/support/express-server.ts | 22 + 8 files changed, 653 insertions(+), 220 deletions(-) create mode 100644 tests/controllers/http-controller.spec.ts create mode 100644 tests/controllers/subscriber-controller.spec.ts create mode 100644 tests/middlewares/express-context.spec.ts create mode 100644 tests/middlewares/gcp-authentication.spec.ts create mode 100644 tests/support/express-server.ts diff --git a/package.json b/package.json index b359f93..4bd3540 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wave-tech/framework", - "version": "0.17.1", + "version": "0.18.0", "description": "wave tech team shared utils framework", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -25,8 +25,8 @@ "peerDependencies": { "@dbos-inc/dbos-sdk": "^4.27.6", "@prisma/client": ">=6.3.1", - "@types/express": "^4.17.21", - "express": "^4.21.2", + "@types/express": "^5.0.0", + "express": "^5.0.0", "fastify": "^5.0.0" }, "peerDependenciesMeta": { @@ -59,7 +59,7 @@ "@dbos-inc/dbos-sdk": "^4.27.6", "@eslint/js": "^9.20.0", "@prisma/client": "^6.3.1", - "@types/express": "^4.17.21", + "@types/express": "^5.0.0", "@types/node": "^24.0.0", "@typescript-eslint/parser": "^8.24.0", "cross-env": "^7.0.3", @@ -68,7 +68,7 @@ "eslint-plugin-import": "^2.31.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^7.2.1", - "express": "^4.21.2", + "express": "^5.0.0", "fastify": "^5.11.2", "globals": "^15.14.0", "husky": "^9.1.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0f43ad..3da680f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,8 +49,8 @@ importers: specifier: ^6.3.1 version: 6.3.1(typescript@5.7.3) '@types/express': - specifier: ^4.17.21 - version: 4.17.25 + specifier: ^5.0.0 + version: 5.0.6 '@types/node': specifier: ^24.0.0 version: 24.12.2 @@ -76,8 +76,8 @@ importers: specifier: ^7.2.1 version: 7.2.1(eslint@9.20.1) express: - specifier: ^4.21.2 - version: 4.21.2 + specifier: ^5.0.0 + version: 5.3.0 fastify: specifier: ^5.11.2 version: 5.12.4 @@ -536,11 +536,11 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/express-serve-static-core@4.19.9': - resolution: {integrity: sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==} + '@types/express-serve-static-core@5.1.3': + resolution: {integrity: sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==} - '@types/express@4.17.25': - resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} @@ -566,8 +566,8 @@ packages: '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} @@ -651,8 +651,8 @@ packages: abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} - 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'} acorn-jsx@5.3.2: @@ -701,9 +701,6 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} @@ -755,9 +752,9 @@ packages: bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - 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.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -840,16 +837,17 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} - 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==} @@ -890,24 +888,25 @@ packages: date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -941,10 +940,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -966,10 +961,6 @@ packages: enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - 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'} @@ -1172,9 +1163,9 @@ packages: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} + express@5.3.0: + resolution: {integrity: sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==} + engines: {node: '>= 18'} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -1227,9 +1218,9 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} find-my-way@9.9.0: resolution: {integrity: sha512-sJsgZ1sQH2UDuowPuMKg8az7Qc8F0jnj+SKkFWU/+T0xcFlgV5skgXOGUqmQzOdmW6ALA7AhJINWx3qFBkbLHA==} @@ -1261,9 +1252,9 @@ packages: resolution: {integrity: sha512-Ah6t/7YCYjrPUFUFsOsRLMXAdnYM+aQwmojD2Ayb/Ezr82SwES0vuyQ8qZ3QO8n9j7W14VJuVZZet8U3bhSdQQ==} engines: {node: '>= 12'} - 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==} @@ -1380,6 +1371,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -1389,8 +1384,8 @@ packages: engines: {node: '>=18'} hasBin: true - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} ignore@5.3.2: @@ -1487,6 +1482,9 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -1617,37 +1615,29 @@ packages: engines: {node: '>= 18'} hasBin: true - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + 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'} merge2@1.4.1: 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'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + 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.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1659,9 +1649,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1673,9 +1660,9 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -1718,6 +1705,9 @@ packages: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + one-time@1.0.0: resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} @@ -1756,9 +1746,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} @@ -1854,16 +1841,16 @@ packages: process-warning@5.1.0: resolution: {integrity: sha512-jQSaVHsPgtyw60e1rQ/A+/ArPEj/S8pS/vFnyGa/gYFXrKk/6RuDkoqVDQ5NI5MmS01698ltlAk0NoDBNLujRw==} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + proxy-addr@2.0.8: + resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} engines: {node: '>= 0.10'} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + qs@6.16.0: + resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -1876,9 +1863,9 @@ 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==} - engines: {node: '>= 0.8'} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -1938,6 +1925,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'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1982,17 +1973,17 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} serialize-error@8.1.0: resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} engines: {node: '>=10'} - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -2024,6 +2015,10 @@ packages: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + side-channel-map@1.0.1: resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} engines: {node: '>= 0.4'} @@ -2036,6 +2031,10 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2063,6 +2062,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.8.0: resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} @@ -2191,9 +2194,9 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} @@ -2244,10 +2247,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - uuid@11.0.5: resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==} hasBin: true @@ -2387,6 +2386,9 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.21.3: resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} @@ -2726,19 +2728,18 @@ snapshots: '@types/estree@1.0.7': {} - '@types/express-serve-static-core@4.19.9': + '@types/express-serve-static-core@5.1.3': dependencies: '@types/node': 24.12.2 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - '@types/express@4.17.25': + '@types/express@5.0.6': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.9 - '@types/qs': 6.9.18 - '@types/serve-static': 1.15.7 + '@types/express-serve-static-core': 5.1.3 + '@types/serve-static': 2.2.0 '@types/http-errors@2.0.4': {} @@ -2761,11 +2762,10 @@ snapshots: '@types/mime': 1.3.5 '@types/node': 24.12.2 - '@types/serve-static@1.15.7': + '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.4 '@types/node': 24.12.2 - '@types/send': 0.17.4 '@types/triple-beam@1.3.5': {} @@ -2888,10 +2888,10 @@ snapshots: abstract-logging@2.0.1: {} - accepts@1.3.8: + accepts@2.0.0: dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 + mime-types: 3.0.2 + negotiator: 1.1.0 acorn-jsx@5.3.2(acorn@8.14.0): dependencies: @@ -2936,8 +2936,6 @@ snapshots: call-bound: 1.0.3 is-array-buffer: 3.0.5 - array-flatten@1.1.1: {} - array-includes@3.1.8: dependencies: call-bind: 1.0.8 @@ -3003,20 +3001,17 @@ snapshots: bignumber.js@9.1.2: {} - body-parser@1.20.3: + body-parser@2.3.0: dependencies: bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 + content-type: 2.1.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.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.16.0 + raw-body: 3.0.2 + type-is: 2.1.0 transitivePeerDependencies: - supports-color @@ -3106,13 +3101,11 @@ snapshots: concat-map@0.0.1: {} - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 + content-disposition@2.0.1: {} - content-type@1.0.5: {} + content-type@2.1.0: {} - cookie-signature@1.0.6: {} + cookie-signature@1.2.2: {} cookie@0.7.1: {} @@ -3154,10 +3147,6 @@ snapshots: date-fns@4.1.0: {} - debug@2.6.9: - dependencies: - ms: 2.0.0 - debug@3.2.7: dependencies: ms: 2.1.3 @@ -3166,6 +3155,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decimal.js@10.5.0: {} deep-eql@5.0.2: {} @@ -3188,8 +3181,6 @@ snapshots: dequal@2.0.3: {} - destroy@1.2.0: {} - diff@4.0.2: {} doctrine@2.1.0: @@ -3210,8 +3201,6 @@ snapshots: enabled@2.0.0: {} - encodeurl@1.0.2: {} - encodeurl@2.0.0: {} enhanced-resolve@5.18.1: @@ -3530,38 +3519,35 @@ snapshots: expect-type@1.1.0: {} - express@4.21.2: + express@5.3.0: dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 2.0.1 + content-type: 2.1.0 cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 + cookie-signature: 1.2.2 + debug: 4.4.0 depd: 2.0.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.1 + 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.2 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 + proxy-addr: 2.0.8 + qs: 6.16.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.1 + serve-static: 2.2.1 statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 + type-is: 2.1.0 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -3635,15 +3621,14 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.1: + finalhandler@2.1.1: 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 @@ -3675,7 +3660,7 @@ snapshots: fraction.js@5.2.1: {} - fresh@0.5.2: {} + fresh@2.0.0: {} fsevents@2.3.3: optional: true @@ -3818,6 +3803,14 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 @@ -3827,7 +3820,7 @@ snapshots: husky@9.1.7: {} - iconv-lite@0.4.24: + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 @@ -3922,6 +3915,8 @@ snapshots: is-number@7.0.0: {} + is-promise@4.0.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.3 @@ -4062,26 +4057,22 @@ snapshots: tiny-emitter: 2.1.0 typed-function: 4.2.1 - media-typer@0.3.0: {} + media-typer@1.1.1: {} - merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} merge2@1.4.1: {} - methods@1.1.2: {} - micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} + mime-db@1.54.0: {} - mime-types@2.1.35: + mime-types@3.0.2: dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} + mime-db: 1.54.0 minimatch@3.1.2: dependencies: @@ -4093,15 +4084,15 @@ snapshots: minimist@1.2.8: {} - ms@2.0.0: {} - ms@2.1.3: {} nanoid@3.3.11: {} natural-compare@1.4.0: {} - negotiator@0.6.3: {} + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 node-fetch@2.7.0: dependencies: @@ -4146,6 +4137,10 @@ snapshots: dependencies: ee-first: 1.1.1 + once@1.4.0: + dependencies: + wrappy: 1.0.2 + one-time@1.0.0: dependencies: fn.name: 1.1.0 @@ -4185,8 +4180,6 @@ snapshots: path-parse@1.0.7: {} - path-to-regexp@0.1.12: {} - path-to-regexp@8.4.2: {} pathe@2.0.3: {} @@ -4276,16 +4269,17 @@ snapshots: process-warning@5.1.0: {} - proxy-addr@2.0.7: + proxy-addr@2.0.8: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 punycode@2.3.1: {} - qs@6.13.0: + qs@6.16.0: dependencies: - side-channel: 1.1.0 + es-define-property: 1.0.1 + side-channel: 1.1.1 queue-microtask@1.2.3: {} @@ -4293,11 +4287,11 @@ snapshots: range-parser@1.2.1: {} - raw-body@2.5.2: + raw-body@3.0.2: dependencies: bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 + http-errors: 2.0.1 + iconv-lite: 0.7.3 unpipe: 1.0.0 readable-stream@3.6.2: @@ -4378,6 +4372,16 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.40.1 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.4.2 + transitivePeerDependencies: + - supports-color + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -4419,21 +4423,19 @@ snapshots: semver@7.7.1: {} - send@0.19.0: + send@1.2.1: dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 + debug: 4.4.3 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -4441,12 +4443,12 @@ snapshots: dependencies: type-fest: 0.20.2 - serve-static@1.16.2: + serve-static@2.2.1: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.19.0 + send: 1.2.1 transitivePeerDependencies: - supports-color @@ -4487,6 +4489,11 @@ snapshots: es-errors: 1.3.0 object-inspect: 1.13.4 + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 @@ -4510,6 +4517,14 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} simple-swizzle@0.2.2: @@ -4530,6 +4545,8 @@ snapshots: statuses@2.0.1: {} + statuses@2.0.2: {} + std-env@3.8.0: {} string.prototype.trim@1.2.10: @@ -4644,10 +4661,11 @@ snapshots: type-fest@0.20.2: {} - type-is@1.6.18: + type-is@2.1.0: dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 typed-array-buffer@1.0.3: dependencies: @@ -4713,8 +4731,6 @@ snapshots: util-deprecate@1.0.2: {} - utils-merge@1.0.1: {} - uuid@11.0.5: {} uuid@9.0.1: {} @@ -4876,6 +4892,8 @@ snapshots: word-wrap@1.2.5: {} + wrappy@1.0.2: {} + ws@8.21.3: {} xtend@4.0.2: {} diff --git a/src/auth-permission/express/express-register-permission-auth.ts b/src/auth-permission/express/express-register-permission-auth.ts index 5a59f56..51af692 100644 --- a/src/auth-permission/express/express-register-permission-auth.ts +++ b/src/auth-permission/express/express-register-permission-auth.ts @@ -155,7 +155,7 @@ export function expressRegisterPermissionAuth( } }; - const middleware: RequestHandler = (request, response, next) => { + const middleware: RequestHandler = async (request, response, next) => { if (isPublicPath(request.path, publicPaths)) { next(); return; @@ -175,24 +175,9 @@ export function expressRegisterPermissionAuth( return; } - // Express 4 does not catch a rejected promise thrown inside a - // middleware on its own — failures must be funneled through `next` - // explicitly. - void runAssertion(request, route, next); + await assertHasPermission(request, route); + next(); }; - async function runAssertion( - request: Request, - route: RouteProperties, - next: Parameters[2], - ): Promise { - try { - await assertHasPermission(request, route); - next(); - } catch (error) { - next(error); - } - } - return { middleware, assertHasPermission }; } diff --git a/tests/controllers/http-controller.spec.ts b/tests/controllers/http-controller.spec.ts new file mode 100644 index 0000000..b750bb6 --- /dev/null +++ b/tests/controllers/http-controller.spec.ts @@ -0,0 +1,137 @@ +import express, { type Express } from 'express'; +import { afterEach, describe, expect, it } from 'vitest'; +import { z } from 'zod'; +import { HttpController } from '../../src/controllers/http-controller'; +import type { ControllerErrors } from '../../src/controllers/controller-errors'; +import type { UseCase } from '../../src/core/use-case'; +import { listen, type RunningServer } from '../support/express-server'; + +type LineError = 'line-not-found'; + +const lineSchema = z.object({ + id: z.string(), + status: z.enum(['active', 'suspended']).optional(), + name: z.string().optional(), +}); + +type LineInput = z.infer; + +const echoUseCase: UseCase = { + execute: (input) => { + if (input.id === 'missing') return { ok: false, error: 'line-not-found', message: 'Line missing not found' }; + if (input.id === 'empty') return undefined; + if (input.id === 'paged') return { ok: true, value: { total: 2, data: [{ id: 'a' }, { id: 'b' }] } }; + if (input.id === 'broken') throw new Error('database is down'); + return { ok: true, value: input }; + }, +}; + +const treatErrors: ControllerErrors = ({ error, message }, res) => + res.status(404).json({ error, message }); + +function buildApp(options: { parseJson: boolean; isAsyncResponse?: boolean }): Express { + const app = express(); + if (options.parseJson) app.use(express.json()); + const controller = new HttpController( + lineSchema, + echoUseCase, + treatErrors, + options.isAsyncResponse, + ); + app.all('/lines/:id', (req, res) => controller.execute(req, res)); + return app; +} + +describe('HttpController on Express 5', () => { + let server: RunningServer | undefined; + + afterEach(async () => { + await server?.close(); + server = undefined; + }); + + async function start(options: Parameters[0]): Promise { + server = await listen(buildApp(options)); + return server.baseUrl; + } + + it('validates body, route params and query string together', async () => { + const baseUrl = await start({ parseJson: true }); + + const res = await fetch(`${baseUrl}/lines/5511999990000?status=active`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ name: 'main line' }), + }); + + expect(res.status).toBe(200); + expect(res.headers.get('content-type')).toContain('application/json'); + expect(await res.json()).toEqual({ id: '5511999990000', status: 'active', name: 'main line' }); + }); + + it('handles a request without a body parser, where Express 5 leaves req.body undefined', async () => { + const baseUrl = await start({ parseJson: false }); + + const res = await fetch(`${baseUrl}/lines/5511999990000?status=suspended`); + + expect(res.status).toBe(200); + expect(await res.json()).toEqual({ id: '5511999990000', status: 'suspended' }); + }); + + it('answers 400 with the validation errors', async () => { + const baseUrl = await start({ parseJson: false }); + + const res = await fetch(`${baseUrl}/lines/5511999990000?status=cancelled`); + + expect(res.status).toBe(400); + expect(await res.json()).toEqual({ + message: 'Bad Request', + errors: [{ field: 'status', message: expect.any(String) }], + }); + }); + + it('delegates a failed result to the error handler', async () => { + const baseUrl = await start({ parseJson: false }); + + const res = await fetch(`${baseUrl}/lines/missing`); + + expect(res.status).toBe(404); + expect(await res.json()).toEqual({ error: 'line-not-found', message: 'Line missing not found' }); + }); + + it('answers 204 when the use case returns nothing', async () => { + const baseUrl = await start({ parseJson: false }); + + const res = await fetch(`${baseUrl}/lines/empty`); + + expect(res.status).toBe(204); + expect(await res.text()).toBe(''); + }); + + it('exposes the total in x-total-count and answers only the page data', async () => { + const baseUrl = await start({ parseJson: false }); + + const res = await fetch(`${baseUrl}/lines/paged`); + + expect(res.status).toBe(200); + expect(res.headers.get('x-total-count')).toBe('2'); + expect(await res.json()).toEqual([{ id: 'a' }, { id: 'b' }]); + }); + + it('answers 202 for asynchronous controllers', async () => { + const baseUrl = await start({ parseJson: false, isAsyncResponse: true }); + + const res = await fetch(`${baseUrl}/lines/5511999990000`); + + expect(res.status).toBe(202); + }); + + it('answers 500 when the use case throws', async () => { + const baseUrl = await start({ parseJson: false }); + + const res = await fetch(`${baseUrl}/lines/broken`); + + expect(res.status).toBe(500); + expect(await res.json()).toEqual({ message: 'An unexpected error occurred', error: 'database is down' }); + }); +}); diff --git a/tests/controllers/subscriber-controller.spec.ts b/tests/controllers/subscriber-controller.spec.ts new file mode 100644 index 0000000..c2d4c1e --- /dev/null +++ b/tests/controllers/subscriber-controller.spec.ts @@ -0,0 +1,75 @@ +import express from 'express'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { z } from 'zod'; +import { SubscriberController } from '../../src/controllers/subscriber-controller'; +import type { ControllerErrors } from '../../src/controllers/controller-errors'; +import type { UseCase } from '../../src/core/use-case'; +import { listen, type RunningServer } from '../support/express-server'; + +type ActivationError = 'unknown-line'; + +const activationSchema = z.object({ msisdn: z.string().regex(/^55\d{10,11}$/) }); + +const activateLine: UseCase, unknown> = { + execute: ({ msisdn }) => + msisdn === '5511999990000' + ? { ok: true, value: undefined } + : { ok: false, error: 'unknown-line', message: `Line ${msisdn} is unknown` }, +}; + +const treatErrors: ControllerErrors = ({ error, message }, res) => + res.status(422).json({ error, message }); + +function pubSubPush(payload: unknown): RequestInit { + return { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ + message: { data: Buffer.from(JSON.stringify(payload)).toString('base64'), attributes: {} }, + subscription: 'projects/wave/subscriptions/line-activation', + }), + }; +} + +describe('SubscriberController on Express 5', () => { + let server: RunningServer; + + beforeEach(async () => { + const app = express(); + app.use(express.json()); + const controller = new SubscriberController( + activationSchema, + activateLine, + treatErrors, + ); + app.post('/subscriptions/line-activation', (req, res) => controller.execute(req, res)); + server = await listen(app); + }); + + afterEach(async () => { + await server.close(); + }); + + it('decodes the Pub/Sub message and acknowledges it with 200', async () => { + const res = await fetch(`${server.baseUrl}/subscriptions/line-activation`, pubSubPush({ msisdn: '5511999990000' })); + + expect(res.status).toBe(200); + }); + + it('answers 400 when the decoded message is invalid', async () => { + const res = await fetch(`${server.baseUrl}/subscriptions/line-activation`, pubSubPush({ msisdn: '11999990000' })); + + expect(res.status).toBe(400); + expect(await res.json()).toEqual({ + message: 'Bad Request', + errors: [{ field: 'msisdn', message: expect.any(String) }], + }); + }); + + it('delegates a failed result to the error handler', async () => { + const res = await fetch(`${server.baseUrl}/subscriptions/line-activation`, pubSubPush({ msisdn: '5521988880000' })); + + expect(res.status).toBe(422); + expect(await res.json()).toEqual({ error: 'unknown-line', message: 'Line 5521988880000 is unknown' }); + }); +}); diff --git a/tests/middlewares/express-context.spec.ts b/tests/middlewares/express-context.spec.ts new file mode 100644 index 0000000..edd0f50 --- /dev/null +++ b/tests/middlewares/express-context.spec.ts @@ -0,0 +1,114 @@ +import express, { type ErrorRequestHandler } from 'express'; +import { setTimeout as delay } from 'node:timers/promises'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { + getHookCorrelationId, + getHookRequestChannel, + getHookTenantId, + getHookUserId, +} from '../../src/core/hooks'; +import { setContext, setCorrelationId, setRequestChannel, setTenantId, setUserId } from '../../src/middlewares/context'; +import { listen, type RunningServer } from '../support/express-server'; + +const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; + +const exposeError: ErrorRequestHandler = (error: Error, req, res, next) => { + res.status(500).json({ error: error.message }); +}; + +describe('Express 5 context middlewares', () => { + let server: RunningServer; + + beforeEach(async () => { + const app = express(); + app.use(express.json()); + app.use(setContext); + app.use(setCorrelationId); + app.use(setUserId); + app.use(setRequestChannel); + + app.get('/context', async (req, res) => { + await delay(Number(req.query.delayMs ?? 0)); + res.json({ + correlationId: getHookCorrelationId(), + userId: getHookUserId() ?? null, + requestChannel: getHookRequestChannel() ?? null, + }); + }); + app.post('/pubsub', (req, res) => { + res.json({ correlationId: getHookCorrelationId() }); + }); + app.get('/tenant', setTenantId(), (req, res) => { + res.json({ tenantId: getHookTenantId() }); + }); + app.get('/default-tenant', setTenantId('wave'), (req, res) => { + res.json({ tenantId: getHookTenantId() }); + }); + + app.use(exposeError); + server = await listen(app); + }); + + afterEach(async () => { + await server.close(); + }); + + it('exposes the request headers to the code running inside the request', async () => { + const res = await fetch(`${server.baseUrl}/context`, { + headers: { 'x-correlation-id': 'corr-123', 'x-user-id': 'user-9', 'x-request-channel': 'app' }, + }); + + expect(await res.json()).toEqual({ correlationId: 'corr-123', userId: 'user-9', requestChannel: 'app' }); + }); + + it('generates a correlation id when the header is absent and the request has no body', async () => { + const res = await fetch(`${server.baseUrl}/context`); + + const body = await res.json(); + expect(res.status).toBe(200); + expect(body.correlationId).toMatch(UUID_PATTERN); + expect(body.userId).toBeNull(); + expect(body.requestChannel).toBeNull(); + }); + + it('prefers the Pub/Sub message attribute over the header', async () => { + const res = await fetch(`${server.baseUrl}/pubsub`, { + method: 'POST', + headers: { 'content-type': 'application/json', 'x-correlation-id': 'from-header' }, + body: JSON.stringify({ message: { data: '', attributes: { correlationId: 'from-attribute' } } }), + }); + + expect(await res.json()).toEqual({ correlationId: 'from-attribute' }); + }); + + it('keeps each concurrent request in its own context', async () => { + const [slow, fast] = await Promise.all([ + fetch(`${server.baseUrl}/context?delayMs=50`, { headers: { 'x-correlation-id': 'slow', 'x-user-id': 'a' } }), + fetch(`${server.baseUrl}/context?delayMs=0`, { headers: { 'x-correlation-id': 'fast', 'x-user-id': 'b' } }), + ]); + + expect(await slow.json()).toEqual({ correlationId: 'slow', userId: 'a', requestChannel: null }); + expect(await fast.json()).toEqual({ correlationId: 'fast', userId: 'b', requestChannel: null }); + }); + + it('uses the x-tenant-id header', async () => { + const res = await fetch(`${server.baseUrl}/tenant`, { headers: { 'x-tenant-id': 'tim' } }); + + expect(await res.json()).toEqual({ tenantId: 'tim' }); + }); + + it('falls back to the default tenant', async () => { + const res = await fetch(`${server.baseUrl}/default-tenant`); + + expect(await res.json()).toEqual({ tenantId: 'wave' }); + }); + + it('forwards a missing tenant to the error handler', async () => { + const res = await fetch(`${server.baseUrl}/tenant`); + + expect(res.status).toBe(500); + expect(await res.json()).toEqual({ + error: 'Tenant ID is required, but it is not present in the request headers', + }); + }); +}); diff --git a/tests/middlewares/gcp-authentication.spec.ts b/tests/middlewares/gcp-authentication.spec.ts new file mode 100644 index 0000000..33c9db3 --- /dev/null +++ b/tests/middlewares/gcp-authentication.spec.ts @@ -0,0 +1,82 @@ +import express from 'express'; +import type { OAuth2Client, TokenPayload } from 'google-auth-library'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { gcpAuthenticationMiddleware } from '../../src/middlewares/gcp-authentication'; +import { listen, type RunningServer } from '../support/express-server'; + +const AUDIENCE = 'https://wave-lines-api.run.app'; +const SERVICE_ACCOUNT = 'pubsub-push@wave.iam.gserviceaccount.com'; + +const validPayload: TokenPayload = { + iss: 'https://accounts.google.com', + aud: AUDIENCE, + email: SERVICE_ACCOUNT, + email_verified: true, + sub: '1', + iat: 0, + exp: 0, +}; + +const payloadsByToken: Partial> = { + 'valid-token': validPayload, + 'other-issuer': { ...validPayload, iss: 'https://evil.example.com' }, + 'other-audience': { ...validPayload, aud: 'https://other.run.app' }, + 'other-account': { ...validPayload, email: 'someone@wave.iam.gserviceaccount.com' }, + 'unverified-email': { ...validPayload, email_verified: false }, +}; + +const fakeOAuth2Client = { + verifyIdToken: ({ idToken, audience }: { idToken: string; audience: string }) => { + const payload = payloadsByToken[idToken]; + if (payload === undefined || audience !== AUDIENCE) { + return Promise.reject(new Error('Invalid token signature')); + } + return Promise.resolve({ getPayload: () => payload }); + }, +} as unknown as OAuth2Client; + +describe('gcpAuthenticationMiddleware on Express 5', () => { + let server: RunningServer; + + beforeEach(async () => { + const app = express(); + app.use(gcpAuthenticationMiddleware(fakeOAuth2Client, { + audience: AUDIENCE, + gcpServiceAccountEmail: SERVICE_ACCOUNT, + })); + app.post('/push', (req, res) => res.json({ accepted: true })); + server = await listen(app); + }); + + afterEach(async () => { + await server.close(); + }); + + const push = async (authorization?: string): Promise => + fetch(`${server.baseUrl}/push`, { + method: 'POST', + headers: authorization === undefined ? {} : { authorization }, + }); + + it('lets a valid Google-signed token through', async () => { + const res = await push('Bearer valid-token'); + + expect(res.status).toBe(200); + expect(await res.json()).toEqual({ accepted: true }); + }); + + it.each([ + [undefined, 'Unauthorized: No authorization header'], + ['Bearer', 'Unauthorized: No token provided'], + ['Bearer forged-token', 'Unauthorized: Token verification failed'], + ['Bearer other-issuer', 'Unauthorized: Invalid token issuer'], + ['Bearer other-audience', 'Unauthorized: Invalid token audience'], + ['Bearer other-account', 'Unauthorized: Invalid token service account email'], + ['Bearer unverified-email', 'Unauthorized: Email not verified'], + ])('rejects authorization %j with 401', async (authorization, message) => { + const res = await push(authorization); + + expect(res.status).toBe(401); + expect(await res.text()).toBe(message); + }); +}); diff --git a/tests/support/express-server.ts b/tests/support/express-server.ts new file mode 100644 index 0000000..1912b18 --- /dev/null +++ b/tests/support/express-server.ts @@ -0,0 +1,22 @@ +import type { Express } from 'express'; +import type { Server } from 'node:http'; + +export interface RunningServer { + baseUrl: string; + close: () => Promise; +} + +export async function listen(app: Express): Promise { + const server: Server = app.listen(0, '127.0.0.1'); + await new Promise((resolve) => server.once('listening', resolve)); + const address = server.address(); + if (address === null || typeof address === 'string') { + throw new Error('Expected the Express server to bind to a TCP port.'); + } + return { + baseUrl: `http://127.0.0.1:${address.port}`, + close: async () => { + await new Promise((resolve) => server.close(() => { resolve(); })); + }, + }; +} From 126e19e075df75c3d9ba3d73c5558c72ebfe1ba5 Mon Sep 17 00:00:00 2001 From: Matheus Andrade Date: Tue, 13 Oct 2026 19:15:43 -0300 Subject: [PATCH 2/6] :boom: chore!: bump @wave-tech/framework to 1.0.0 Co-Authored-By: Claude Opus 5.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4bd3540..159e1da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wave-tech/framework", - "version": "0.18.0", + "version": "1.0.0", "description": "wave tech team shared utils framework", "main": "dist/index.js", "types": "dist/index.d.ts", From 7d4feecf1eec24830aa666ccb607cc7c72f78968 Mon Sep 17 00:00:00 2001 From: Matheus Andrade Date: Wed, 14 Oct 2026 11:11:33 -0300 Subject: [PATCH 3/6] :white_check_mark: test: drop the new express 5 specs Co-Authored-By: Claude Opus 5.5 --- tests/controllers/http-controller.spec.ts | 137 ------------------ .../controllers/subscriber-controller.spec.ts | 75 ---------- tests/middlewares/express-context.spec.ts | 114 --------------- tests/middlewares/gcp-authentication.spec.ts | 82 ----------- tests/support/express-server.ts | 22 --- 5 files changed, 430 deletions(-) delete mode 100644 tests/controllers/http-controller.spec.ts delete mode 100644 tests/controllers/subscriber-controller.spec.ts delete mode 100644 tests/middlewares/express-context.spec.ts delete mode 100644 tests/middlewares/gcp-authentication.spec.ts delete mode 100644 tests/support/express-server.ts diff --git a/tests/controllers/http-controller.spec.ts b/tests/controllers/http-controller.spec.ts deleted file mode 100644 index b750bb6..0000000 --- a/tests/controllers/http-controller.spec.ts +++ /dev/null @@ -1,137 +0,0 @@ -import express, { type Express } from 'express'; -import { afterEach, describe, expect, it } from 'vitest'; -import { z } from 'zod'; -import { HttpController } from '../../src/controllers/http-controller'; -import type { ControllerErrors } from '../../src/controllers/controller-errors'; -import type { UseCase } from '../../src/core/use-case'; -import { listen, type RunningServer } from '../support/express-server'; - -type LineError = 'line-not-found'; - -const lineSchema = z.object({ - id: z.string(), - status: z.enum(['active', 'suspended']).optional(), - name: z.string().optional(), -}); - -type LineInput = z.infer; - -const echoUseCase: UseCase = { - execute: (input) => { - if (input.id === 'missing') return { ok: false, error: 'line-not-found', message: 'Line missing not found' }; - if (input.id === 'empty') return undefined; - if (input.id === 'paged') return { ok: true, value: { total: 2, data: [{ id: 'a' }, { id: 'b' }] } }; - if (input.id === 'broken') throw new Error('database is down'); - return { ok: true, value: input }; - }, -}; - -const treatErrors: ControllerErrors = ({ error, message }, res) => - res.status(404).json({ error, message }); - -function buildApp(options: { parseJson: boolean; isAsyncResponse?: boolean }): Express { - const app = express(); - if (options.parseJson) app.use(express.json()); - const controller = new HttpController( - lineSchema, - echoUseCase, - treatErrors, - options.isAsyncResponse, - ); - app.all('/lines/:id', (req, res) => controller.execute(req, res)); - return app; -} - -describe('HttpController on Express 5', () => { - let server: RunningServer | undefined; - - afterEach(async () => { - await server?.close(); - server = undefined; - }); - - async function start(options: Parameters[0]): Promise { - server = await listen(buildApp(options)); - return server.baseUrl; - } - - it('validates body, route params and query string together', async () => { - const baseUrl = await start({ parseJson: true }); - - const res = await fetch(`${baseUrl}/lines/5511999990000?status=active`, { - method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify({ name: 'main line' }), - }); - - expect(res.status).toBe(200); - expect(res.headers.get('content-type')).toContain('application/json'); - expect(await res.json()).toEqual({ id: '5511999990000', status: 'active', name: 'main line' }); - }); - - it('handles a request without a body parser, where Express 5 leaves req.body undefined', async () => { - const baseUrl = await start({ parseJson: false }); - - const res = await fetch(`${baseUrl}/lines/5511999990000?status=suspended`); - - expect(res.status).toBe(200); - expect(await res.json()).toEqual({ id: '5511999990000', status: 'suspended' }); - }); - - it('answers 400 with the validation errors', async () => { - const baseUrl = await start({ parseJson: false }); - - const res = await fetch(`${baseUrl}/lines/5511999990000?status=cancelled`); - - expect(res.status).toBe(400); - expect(await res.json()).toEqual({ - message: 'Bad Request', - errors: [{ field: 'status', message: expect.any(String) }], - }); - }); - - it('delegates a failed result to the error handler', async () => { - const baseUrl = await start({ parseJson: false }); - - const res = await fetch(`${baseUrl}/lines/missing`); - - expect(res.status).toBe(404); - expect(await res.json()).toEqual({ error: 'line-not-found', message: 'Line missing not found' }); - }); - - it('answers 204 when the use case returns nothing', async () => { - const baseUrl = await start({ parseJson: false }); - - const res = await fetch(`${baseUrl}/lines/empty`); - - expect(res.status).toBe(204); - expect(await res.text()).toBe(''); - }); - - it('exposes the total in x-total-count and answers only the page data', async () => { - const baseUrl = await start({ parseJson: false }); - - const res = await fetch(`${baseUrl}/lines/paged`); - - expect(res.status).toBe(200); - expect(res.headers.get('x-total-count')).toBe('2'); - expect(await res.json()).toEqual([{ id: 'a' }, { id: 'b' }]); - }); - - it('answers 202 for asynchronous controllers', async () => { - const baseUrl = await start({ parseJson: false, isAsyncResponse: true }); - - const res = await fetch(`${baseUrl}/lines/5511999990000`); - - expect(res.status).toBe(202); - }); - - it('answers 500 when the use case throws', async () => { - const baseUrl = await start({ parseJson: false }); - - const res = await fetch(`${baseUrl}/lines/broken`); - - expect(res.status).toBe(500); - expect(await res.json()).toEqual({ message: 'An unexpected error occurred', error: 'database is down' }); - }); -}); diff --git a/tests/controllers/subscriber-controller.spec.ts b/tests/controllers/subscriber-controller.spec.ts deleted file mode 100644 index c2d4c1e..0000000 --- a/tests/controllers/subscriber-controller.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import express from 'express'; -import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { z } from 'zod'; -import { SubscriberController } from '../../src/controllers/subscriber-controller'; -import type { ControllerErrors } from '../../src/controllers/controller-errors'; -import type { UseCase } from '../../src/core/use-case'; -import { listen, type RunningServer } from '../support/express-server'; - -type ActivationError = 'unknown-line'; - -const activationSchema = z.object({ msisdn: z.string().regex(/^55\d{10,11}$/) }); - -const activateLine: UseCase, unknown> = { - execute: ({ msisdn }) => - msisdn === '5511999990000' - ? { ok: true, value: undefined } - : { ok: false, error: 'unknown-line', message: `Line ${msisdn} is unknown` }, -}; - -const treatErrors: ControllerErrors = ({ error, message }, res) => - res.status(422).json({ error, message }); - -function pubSubPush(payload: unknown): RequestInit { - return { - method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify({ - message: { data: Buffer.from(JSON.stringify(payload)).toString('base64'), attributes: {} }, - subscription: 'projects/wave/subscriptions/line-activation', - }), - }; -} - -describe('SubscriberController on Express 5', () => { - let server: RunningServer; - - beforeEach(async () => { - const app = express(); - app.use(express.json()); - const controller = new SubscriberController( - activationSchema, - activateLine, - treatErrors, - ); - app.post('/subscriptions/line-activation', (req, res) => controller.execute(req, res)); - server = await listen(app); - }); - - afterEach(async () => { - await server.close(); - }); - - it('decodes the Pub/Sub message and acknowledges it with 200', async () => { - const res = await fetch(`${server.baseUrl}/subscriptions/line-activation`, pubSubPush({ msisdn: '5511999990000' })); - - expect(res.status).toBe(200); - }); - - it('answers 400 when the decoded message is invalid', async () => { - const res = await fetch(`${server.baseUrl}/subscriptions/line-activation`, pubSubPush({ msisdn: '11999990000' })); - - expect(res.status).toBe(400); - expect(await res.json()).toEqual({ - message: 'Bad Request', - errors: [{ field: 'msisdn', message: expect.any(String) }], - }); - }); - - it('delegates a failed result to the error handler', async () => { - const res = await fetch(`${server.baseUrl}/subscriptions/line-activation`, pubSubPush({ msisdn: '5521988880000' })); - - expect(res.status).toBe(422); - expect(await res.json()).toEqual({ error: 'unknown-line', message: 'Line 5521988880000 is unknown' }); - }); -}); diff --git a/tests/middlewares/express-context.spec.ts b/tests/middlewares/express-context.spec.ts deleted file mode 100644 index edd0f50..0000000 --- a/tests/middlewares/express-context.spec.ts +++ /dev/null @@ -1,114 +0,0 @@ -import express, { type ErrorRequestHandler } from 'express'; -import { setTimeout as delay } from 'node:timers/promises'; -import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { - getHookCorrelationId, - getHookRequestChannel, - getHookTenantId, - getHookUserId, -} from '../../src/core/hooks'; -import { setContext, setCorrelationId, setRequestChannel, setTenantId, setUserId } from '../../src/middlewares/context'; -import { listen, type RunningServer } from '../support/express-server'; - -const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; - -const exposeError: ErrorRequestHandler = (error: Error, req, res, next) => { - res.status(500).json({ error: error.message }); -}; - -describe('Express 5 context middlewares', () => { - let server: RunningServer; - - beforeEach(async () => { - const app = express(); - app.use(express.json()); - app.use(setContext); - app.use(setCorrelationId); - app.use(setUserId); - app.use(setRequestChannel); - - app.get('/context', async (req, res) => { - await delay(Number(req.query.delayMs ?? 0)); - res.json({ - correlationId: getHookCorrelationId(), - userId: getHookUserId() ?? null, - requestChannel: getHookRequestChannel() ?? null, - }); - }); - app.post('/pubsub', (req, res) => { - res.json({ correlationId: getHookCorrelationId() }); - }); - app.get('/tenant', setTenantId(), (req, res) => { - res.json({ tenantId: getHookTenantId() }); - }); - app.get('/default-tenant', setTenantId('wave'), (req, res) => { - res.json({ tenantId: getHookTenantId() }); - }); - - app.use(exposeError); - server = await listen(app); - }); - - afterEach(async () => { - await server.close(); - }); - - it('exposes the request headers to the code running inside the request', async () => { - const res = await fetch(`${server.baseUrl}/context`, { - headers: { 'x-correlation-id': 'corr-123', 'x-user-id': 'user-9', 'x-request-channel': 'app' }, - }); - - expect(await res.json()).toEqual({ correlationId: 'corr-123', userId: 'user-9', requestChannel: 'app' }); - }); - - it('generates a correlation id when the header is absent and the request has no body', async () => { - const res = await fetch(`${server.baseUrl}/context`); - - const body = await res.json(); - expect(res.status).toBe(200); - expect(body.correlationId).toMatch(UUID_PATTERN); - expect(body.userId).toBeNull(); - expect(body.requestChannel).toBeNull(); - }); - - it('prefers the Pub/Sub message attribute over the header', async () => { - const res = await fetch(`${server.baseUrl}/pubsub`, { - method: 'POST', - headers: { 'content-type': 'application/json', 'x-correlation-id': 'from-header' }, - body: JSON.stringify({ message: { data: '', attributes: { correlationId: 'from-attribute' } } }), - }); - - expect(await res.json()).toEqual({ correlationId: 'from-attribute' }); - }); - - it('keeps each concurrent request in its own context', async () => { - const [slow, fast] = await Promise.all([ - fetch(`${server.baseUrl}/context?delayMs=50`, { headers: { 'x-correlation-id': 'slow', 'x-user-id': 'a' } }), - fetch(`${server.baseUrl}/context?delayMs=0`, { headers: { 'x-correlation-id': 'fast', 'x-user-id': 'b' } }), - ]); - - expect(await slow.json()).toEqual({ correlationId: 'slow', userId: 'a', requestChannel: null }); - expect(await fast.json()).toEqual({ correlationId: 'fast', userId: 'b', requestChannel: null }); - }); - - it('uses the x-tenant-id header', async () => { - const res = await fetch(`${server.baseUrl}/tenant`, { headers: { 'x-tenant-id': 'tim' } }); - - expect(await res.json()).toEqual({ tenantId: 'tim' }); - }); - - it('falls back to the default tenant', async () => { - const res = await fetch(`${server.baseUrl}/default-tenant`); - - expect(await res.json()).toEqual({ tenantId: 'wave' }); - }); - - it('forwards a missing tenant to the error handler', async () => { - const res = await fetch(`${server.baseUrl}/tenant`); - - expect(res.status).toBe(500); - expect(await res.json()).toEqual({ - error: 'Tenant ID is required, but it is not present in the request headers', - }); - }); -}); diff --git a/tests/middlewares/gcp-authentication.spec.ts b/tests/middlewares/gcp-authentication.spec.ts deleted file mode 100644 index 33c9db3..0000000 --- a/tests/middlewares/gcp-authentication.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -import express from 'express'; -import type { OAuth2Client, TokenPayload } from 'google-auth-library'; -import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { gcpAuthenticationMiddleware } from '../../src/middlewares/gcp-authentication'; -import { listen, type RunningServer } from '../support/express-server'; - -const AUDIENCE = 'https://wave-lines-api.run.app'; -const SERVICE_ACCOUNT = 'pubsub-push@wave.iam.gserviceaccount.com'; - -const validPayload: TokenPayload = { - iss: 'https://accounts.google.com', - aud: AUDIENCE, - email: SERVICE_ACCOUNT, - email_verified: true, - sub: '1', - iat: 0, - exp: 0, -}; - -const payloadsByToken: Partial> = { - 'valid-token': validPayload, - 'other-issuer': { ...validPayload, iss: 'https://evil.example.com' }, - 'other-audience': { ...validPayload, aud: 'https://other.run.app' }, - 'other-account': { ...validPayload, email: 'someone@wave.iam.gserviceaccount.com' }, - 'unverified-email': { ...validPayload, email_verified: false }, -}; - -const fakeOAuth2Client = { - verifyIdToken: ({ idToken, audience }: { idToken: string; audience: string }) => { - const payload = payloadsByToken[idToken]; - if (payload === undefined || audience !== AUDIENCE) { - return Promise.reject(new Error('Invalid token signature')); - } - return Promise.resolve({ getPayload: () => payload }); - }, -} as unknown as OAuth2Client; - -describe('gcpAuthenticationMiddleware on Express 5', () => { - let server: RunningServer; - - beforeEach(async () => { - const app = express(); - app.use(gcpAuthenticationMiddleware(fakeOAuth2Client, { - audience: AUDIENCE, - gcpServiceAccountEmail: SERVICE_ACCOUNT, - })); - app.post('/push', (req, res) => res.json({ accepted: true })); - server = await listen(app); - }); - - afterEach(async () => { - await server.close(); - }); - - const push = async (authorization?: string): Promise => - fetch(`${server.baseUrl}/push`, { - method: 'POST', - headers: authorization === undefined ? {} : { authorization }, - }); - - it('lets a valid Google-signed token through', async () => { - const res = await push('Bearer valid-token'); - - expect(res.status).toBe(200); - expect(await res.json()).toEqual({ accepted: true }); - }); - - it.each([ - [undefined, 'Unauthorized: No authorization header'], - ['Bearer', 'Unauthorized: No token provided'], - ['Bearer forged-token', 'Unauthorized: Token verification failed'], - ['Bearer other-issuer', 'Unauthorized: Invalid token issuer'], - ['Bearer other-audience', 'Unauthorized: Invalid token audience'], - ['Bearer other-account', 'Unauthorized: Invalid token service account email'], - ['Bearer unverified-email', 'Unauthorized: Email not verified'], - ])('rejects authorization %j with 401', async (authorization, message) => { - const res = await push(authorization); - - expect(res.status).toBe(401); - expect(await res.text()).toBe(message); - }); -}); diff --git a/tests/support/express-server.ts b/tests/support/express-server.ts deleted file mode 100644 index 1912b18..0000000 --- a/tests/support/express-server.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { Express } from 'express'; -import type { Server } from 'node:http'; - -export interface RunningServer { - baseUrl: string; - close: () => Promise; -} - -export async function listen(app: Express): Promise { - const server: Server = app.listen(0, '127.0.0.1'); - await new Promise((resolve) => server.once('listening', resolve)); - const address = server.address(); - if (address === null || typeof address === 'string') { - throw new Error('Expected the Express server to bind to a TCP port.'); - } - return { - baseUrl: `http://127.0.0.1:${address.port}`, - close: async () => { - await new Promise((resolve) => server.close(() => { resolve(); })); - }, - }; -} From 359371fdaadae8df2e78e9ef98dc6de818dd153e Mon Sep 17 00:00:00 2001 From: Matheus Andrade Date: Wed, 14 Oct 2026 11:20:41 -0300 Subject: [PATCH 4/6] :arrow_up: chore!: upgrade runtime dependencies and require node 22.12 BREAKING CHANGE: engines.node is now >=22.12.0. google-auth-library 11 requires node 22, and uuid 14 is ESM-only, loaded from the CJS build through require(esm). Upgrades google-auth-library 11, mathjs 15, uuid 14, hono 4.13, zod 4.6, date-fns 4.4, winston 3.19 and @fastify/rate-limit 11.2.1. CI drops node 20. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ci-node.yaml | 2 +- package.json | 19 ++- pnpm-lock.yaml | 303 +++++++++++++++------------------ 3 files changed, 151 insertions(+), 173 deletions(-) diff --git a/.github/workflows/ci-node.yaml b/.github/workflows/ci-node.yaml index 46711ef..99b6e7f 100644 --- a/.github/workflows/ci-node.yaml +++ b/.github/workflows/ci-node.yaml @@ -25,7 +25,7 @@ jobs: strategy: matrix: - node-version: [20.x, 22.x, 24.x] + node-version: [22.x, 24.x] steps: - name: Checkout to Repository diff --git a/package.json b/package.json index 159e1da..499f3eb 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,9 @@ }, "author": "", "license": "Apache-2.0", + "engines": { + "node": ">=22.12.0" + }, "peerDependencies": { "@dbos-inc/dbos-sdk": "^4.27.6", "@prisma/client": ">=6.3.1", @@ -44,16 +47,16 @@ } }, "dependencies": { - "@fastify/rate-limit": "^11.2.0", - "date-fns": "^4.1.0", - "google-auth-library": "^9.15.1", - "hono": "^4.8.5", + "@fastify/rate-limit": "^11.2.1", + "date-fns": "^4.4.0", + "google-auth-library": "^11.3.0", + "hono": "^4.13.13", "jose": "^6.2.12", - "mathjs": "^14.2.1", + "mathjs": "^15.2.0", "path-to-regexp": "8.4.2", - "uuid": "^11.0.5", - "winston": "^3.17.0", - "zod": "^4.4.3" + "uuid": "^14.0.3", + "winston": "^3.19.0", + "zod": "^4.6.7" }, "devDependencies": { "@dbos-inc/dbos-sdk": "^4.27.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3da680f..cdea9f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,35 +9,35 @@ importers: .: dependencies: '@fastify/rate-limit': - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^11.2.1 + version: 11.2.1 date-fns: - specifier: ^4.1.0 - version: 4.1.0 + specifier: ^4.4.0 + version: 4.4.0 google-auth-library: - specifier: ^9.15.1 - version: 9.15.1 + specifier: ^11.3.0 + version: 11.3.0 hono: - specifier: ^4.8.5 - version: 4.8.5 + specifier: ^4.13.13 + version: 4.13.13 jose: specifier: ^6.2.12 version: 6.2.12 mathjs: - specifier: ^14.2.1 - version: 14.2.1 + specifier: ^15.2.0 + version: 15.2.0 path-to-regexp: specifier: 8.4.2 version: 8.4.2 uuid: - specifier: ^11.0.5 - version: 11.0.5 + specifier: ^14.0.3 + version: 14.0.3 winston: - specifier: ^3.17.0 - version: 3.17.0 + specifier: ^3.19.0 + version: 3.19.0 zod: - specifier: ^4.4.3 - version: 4.5.4 + specifier: ^4.6.7 + version: 4.6.7 devDependencies: '@dbos-inc/dbos-sdk': specifier: ^4.27.6 @@ -108,8 +108,8 @@ importers: packages: - '@babel/runtime@7.26.7': - resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} engines: {node: '>=6.9.0'} '@colors/colors@1.6.0': @@ -120,8 +120,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@dabh/diagnostics@2.0.9': + resolution: {integrity: sha512-R6siwR65Hm+3yfgP7o8DKhNvputQAwfoz9zTc3kyDudnomj2/BcLmD+uGQQPICjuFUp8ounPBU+jmKsocwVVAg==} '@dbos-inc/dbos-sdk@4.27.6': resolution: {integrity: sha512-mr5CEllYovAHPh/TpQcvxTYM+4t4tgV7CjkZGe7hzNxw9Nzf6l7ggxJKDbewLFwgwx8NaWcWw21ESHXNE1UwrA==} @@ -334,8 +334,8 @@ packages: '@fastify/proxy-addr@5.1.0': resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} - '@fastify/rate-limit@11.2.0': - resolution: {integrity: sha512-X7osJd4XSvMoejYrnJkSZYYjY1eNYoBqhjlzf1RakC2204qExFqZFTKj5+T7VuzA/iUI9Z3UoSqQRkB2HpG0oQ==} + '@fastify/rate-limit@11.2.1': + resolution: {integrity: sha512-uTQjii3tJUnb6ZyEMcunuvKE3FDKNZEaPpxdyWADDgthHnUV1swdvwuiZfi3DDDgxm1iBrhOkQ/w0yDBQ8qJtA==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -512,6 +512,9 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -805,27 +808,28 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-name@2.1.1: + resolution: {integrity: sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==} + engines: {node: '>=12.20'} - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} @@ -873,6 +877,10 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -885,8 +893,8 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns@4.1.0: - resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -1210,6 +1218,10 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1244,6 +1256,10 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -1271,13 +1287,13 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gaxios@6.7.1: - resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} - engines: {node: '>=14'} + gaxios@7.3.1: + resolution: {integrity: sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==} + engines: {node: '>=18'} - gcp-metadata@6.1.1: - resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} - engines: {node: '>=14'} + gcp-metadata@9.2.0: + resolution: {integrity: sha512-eV9lxydJ1sLtP0Kpkd/7RNHuD8ZXL16nqaa4MI4tUargdSBzlkCnZ33ykSQddJFe/hdc4Tmo5tUP31szLDct3Q==} + engines: {node: '>=22'} get-intrinsic@1.2.7: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} @@ -1314,13 +1330,13 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - google-auth-library@9.15.1: - resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} - engines: {node: '>=14'} + google-auth-library@11.3.0: + resolution: {integrity: sha512-gZCyszARHj47WNcKrAcQtimDwtTZpydRZ3HSeb66hObfQU9uaG50ejsZ8LzGISIVAjpsZEouGVs65Q/XRau0Qg==} + engines: {node: '>=22'} - google-logging-utils@0.0.2: - resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} - engines: {node: '>=14'} + google-logging-utils@2.1.0: + resolution: {integrity: sha512-1R6uiq6XhXW2ZrcGtZpGgVDsYGzSmveVOn8Pp37qe1fbThHZ34e3t3eXj5mVu6PFSVx9fvB1KNVnYgVtq/BRcA==} + engines: {node: '>=22'} gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} @@ -1332,10 +1348,6 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gtoken@7.1.0: - resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} - engines: {node: '>=14.0.0'} - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -1363,8 +1375,8 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hono@4.8.5: - resolution: {integrity: sha512-Up2cQbtNz1s111qpnnECdTGqSIUIhZJMLikdKkshebQSEBcoUKq6XJayLGqSZWidiH0zfHRCJqFu062Mz5UuRA==} + hono@4.13.13: + resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} engines: {node: '>=16.9.0'} http-errors@2.0.0: @@ -1423,9 +1435,6 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -1610,8 +1619,8 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mathjs@14.2.1: - resolution: {integrity: sha512-vARWETUx75+kR2K9qBV20n6NYtGXCuQKX8Zo4+AhJI5LX+ukSM1NYebv+wLnJG8KMvEe9H01sJUyC5bMciA4Tg==} + mathjs@15.2.0: + resolution: {integrity: sha512-UAQzSVob9rNLdGpqcFMYmSu9dkuLYy7Lr2hBEQS5SHQdknA9VppJz3cy2KkpMzTODunad6V6cNv+5kOLsePLow==} engines: {node: '>= 18'} hasBin: true @@ -1664,14 +1673,14 @@ packages: resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} engines: {node: '>=18'} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} @@ -1882,9 +1891,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -2038,9 +2044,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} @@ -2148,9 +2151,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - triple-beam@1.4.1: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} @@ -2247,13 +2247,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@11.0.5: - resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==} - hasBin: true - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + uuid@14.0.3: + resolution: {integrity: sha512-Sc5u1VVln93y1Xnz4R+CunOZc7R9LUcTmhj7Rc7Eg3HVcf7rVn2FOoa812fe0W8p3jD7xeoGSYbfqCGGH2B6xw==} hasBin: true v8-compile-cache-lib@3.0.1: @@ -2342,11 +2337,9 @@ packages: jsdom: optional: true - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} @@ -2378,8 +2371,8 @@ packages: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} - winston@3.17.0: - resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} engines: {node: '>= 12.0.0'} word-wrap@1.2.5: @@ -2418,14 +2411,12 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.5.4: - resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} snapshots: - '@babel/runtime@7.26.7': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.29.10': {} '@colors/colors@1.6.0': {} @@ -2433,9 +2424,9 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dabh/diagnostics@2.0.3': + '@dabh/diagnostics@2.0.9': dependencies: - colorspace: 1.1.4 + '@so-ric/colorspace': 1.1.6 enabled: 2.0.0 kuler: 2.0.0 @@ -2596,7 +2587,7 @@ snapshots: '@fastify/forwarded': 3.0.2 ipaddr.js: 2.5.0 - '@fastify/rate-limit@11.2.0': + '@fastify/rate-limit@11.2.1': dependencies: '@lukeed/ms': 2.0.2 fastify-plugin: 6.0.0 @@ -2707,6 +2698,11 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -3068,32 +3064,26 @@ snapshots: check-error@2.1.1: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} + color-convert@3.1.3: + dependencies: + color-name: 2.1.1 color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 + color-name@2.1.1: {} - color@3.2.1: + color-string@2.1.4: dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 + color-name: 2.1.1 - colorspace@1.1.4: + color@5.0.3: dependencies: - color: 3.2.1 - text-hex: 1.0.0 + color-convert: 3.1.3 + color-string: 2.1.4 commander@12.1.0: {} @@ -3127,6 +3117,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + data-uri-to-buffer@4.0.1: {} + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.3 @@ -3145,7 +3137,7 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns@4.1.0: {} + date-fns@4.4.0: {} debug@3.2.7: dependencies: @@ -3613,6 +3605,11 @@ snapshots: fecha@4.2.3: {} + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -3656,6 +3653,10 @@ snapshots: dependencies: is-callable: 1.2.7 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded@0.2.0: {} fraction.js@5.2.1: {} @@ -3678,24 +3679,20 @@ snapshots: functions-have-names@1.2.3: {} - gaxios@6.7.1: + gaxios@7.3.1: dependencies: extend: 3.0.2 https-proxy-agent: 7.0.6 - is-stream: 2.0.1 - node-fetch: 2.7.0 - uuid: 9.0.1 + node-fetch: 3.3.2 transitivePeerDependencies: - - encoding - supports-color - gcp-metadata@6.1.1: + gcp-metadata@9.2.0: dependencies: - gaxios: 6.7.1 - google-logging-utils: 0.0.2 + gaxios: 7.3.1 + google-logging-utils: 2.1.0 json-bigint: 1.0.0 transitivePeerDependencies: - - encoding - supports-color get-intrinsic@1.2.7: @@ -3743,19 +3740,18 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - google-auth-library@9.15.1: + google-auth-library@11.3.0: dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.7.1 - gcp-metadata: 6.1.1 - gtoken: 7.1.0 + gaxios: 7.3.1 + gcp-metadata: 9.2.0 + google-logging-utils: 2.1.0 jws: 4.0.0 transitivePeerDependencies: - - encoding - supports-color - google-logging-utils@0.0.2: {} + google-logging-utils@2.1.0: {} gopd@1.2.0: {} @@ -3763,14 +3759,6 @@ snapshots: graphemer@1.4.0: {} - gtoken@7.1.0: - dependencies: - gaxios: 6.7.1 - jws: 4.0.0 - transitivePeerDependencies: - - encoding - - supports-color - has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -3793,7 +3781,7 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.8.5: {} + hono@4.13.13: {} http-errors@2.0.0: dependencies: @@ -3814,7 +3802,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -3853,8 +3841,6 @@ snapshots: call-bound: 1.0.3 get-intrinsic: 1.2.7 - is-arrayish@0.3.2: {} - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -4045,9 +4031,9 @@ snapshots: math-intrinsics@1.1.0: {} - mathjs@14.2.1: + mathjs@15.2.0: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.29.10 complex.js: 2.4.2 decimal.js: 10.5.0 escape-latex: 1.2.0 @@ -4094,9 +4080,13 @@ snapshots: dependencies: content-type: 2.1.0 - node-fetch@2.7.0: + node-domexception@1.0.0: {} + + node-fetch@3.3.2: dependencies: - whatwg-url: 5.0.0 + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 object-inspect@1.13.4: {} @@ -4315,8 +4305,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -4527,10 +4515,6 @@ snapshots: siginfo@2.0.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 @@ -4618,8 +4602,6 @@ snapshots: toidentifier@1.0.1: {} - tr46@0.0.3: {} - triple-beam@1.4.1: {} ts-api-utils@2.0.1(typescript@5.7.3): @@ -4731,9 +4713,7 @@ snapshots: util-deprecate@1.0.2: {} - uuid@11.0.5: {} - - uuid@9.0.1: {} + uuid@14.0.3: {} v8-compile-cache-lib@3.0.1: {} @@ -4814,12 +4794,7 @@ snapshots: - tsx - yaml - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 + web-streams-polyfill@3.3.3: {} which-boxed-primitive@1.1.1: dependencies: @@ -4876,10 +4851,10 @@ snapshots: readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.17.0: + winston@3.19.0: dependencies: '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 + '@dabh/diagnostics': 2.0.9 async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 @@ -4904,4 +4879,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@4.5.4: {} + zod@4.6.7: {} From a5f5766745509b9f8ea8227ca83c00dabf58ddca Mon Sep 17 00:00:00 2001 From: Matheus Andrade Date: Wed, 14 Oct 2026 11:26:45 -0300 Subject: [PATCH 5/6] Revert ":arrow_up: chore!: upgrade runtime dependencies and require node 22.12" This reverts commit 359371fdaadae8df2e78e9ef98dc6de818dd153e. --- .github/workflows/ci-node.yaml | 2 +- package.json | 19 +-- pnpm-lock.yaml | 303 ++++++++++++++++++--------------- 3 files changed, 173 insertions(+), 151 deletions(-) diff --git a/.github/workflows/ci-node.yaml b/.github/workflows/ci-node.yaml index 99b6e7f..46711ef 100644 --- a/.github/workflows/ci-node.yaml +++ b/.github/workflows/ci-node.yaml @@ -25,7 +25,7 @@ jobs: strategy: matrix: - node-version: [22.x, 24.x] + node-version: [20.x, 22.x, 24.x] steps: - name: Checkout to Repository diff --git a/package.json b/package.json index 499f3eb..159e1da 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,6 @@ }, "author": "", "license": "Apache-2.0", - "engines": { - "node": ">=22.12.0" - }, "peerDependencies": { "@dbos-inc/dbos-sdk": "^4.27.6", "@prisma/client": ">=6.3.1", @@ -47,16 +44,16 @@ } }, "dependencies": { - "@fastify/rate-limit": "^11.2.1", - "date-fns": "^4.4.0", - "google-auth-library": "^11.3.0", - "hono": "^4.13.13", + "@fastify/rate-limit": "^11.2.0", + "date-fns": "^4.1.0", + "google-auth-library": "^9.15.1", + "hono": "^4.8.5", "jose": "^6.2.12", - "mathjs": "^15.2.0", + "mathjs": "^14.2.1", "path-to-regexp": "8.4.2", - "uuid": "^14.0.3", - "winston": "^3.19.0", - "zod": "^4.6.7" + "uuid": "^11.0.5", + "winston": "^3.17.0", + "zod": "^4.4.3" }, "devDependencies": { "@dbos-inc/dbos-sdk": "^4.27.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cdea9f5..3da680f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,35 +9,35 @@ importers: .: dependencies: '@fastify/rate-limit': - specifier: ^11.2.1 - version: 11.2.1 + specifier: ^11.2.0 + version: 11.2.0 date-fns: - specifier: ^4.4.0 - version: 4.4.0 + specifier: ^4.1.0 + version: 4.1.0 google-auth-library: - specifier: ^11.3.0 - version: 11.3.0 + specifier: ^9.15.1 + version: 9.15.1 hono: - specifier: ^4.13.13 - version: 4.13.13 + specifier: ^4.8.5 + version: 4.8.5 jose: specifier: ^6.2.12 version: 6.2.12 mathjs: - specifier: ^15.2.0 - version: 15.2.0 + specifier: ^14.2.1 + version: 14.2.1 path-to-regexp: specifier: 8.4.2 version: 8.4.2 uuid: - specifier: ^14.0.3 - version: 14.0.3 + specifier: ^11.0.5 + version: 11.0.5 winston: - specifier: ^3.19.0 - version: 3.19.0 + specifier: ^3.17.0 + version: 3.17.0 zod: - specifier: ^4.6.7 - version: 4.6.7 + specifier: ^4.4.3 + version: 4.5.4 devDependencies: '@dbos-inc/dbos-sdk': specifier: ^4.27.6 @@ -108,8 +108,8 @@ importers: packages: - '@babel/runtime@7.29.10': - resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} + '@babel/runtime@7.26.7': + resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} engines: {node: '>=6.9.0'} '@colors/colors@1.6.0': @@ -120,8 +120,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dabh/diagnostics@2.0.9': - resolution: {integrity: sha512-R6siwR65Hm+3yfgP7o8DKhNvputQAwfoz9zTc3kyDudnomj2/BcLmD+uGQQPICjuFUp8ounPBU+jmKsocwVVAg==} + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} '@dbos-inc/dbos-sdk@4.27.6': resolution: {integrity: sha512-mr5CEllYovAHPh/TpQcvxTYM+4t4tgV7CjkZGe7hzNxw9Nzf6l7ggxJKDbewLFwgwx8NaWcWw21ESHXNE1UwrA==} @@ -334,8 +334,8 @@ packages: '@fastify/proxy-addr@5.1.0': resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} - '@fastify/rate-limit@11.2.1': - resolution: {integrity: sha512-uTQjii3tJUnb6ZyEMcunuvKE3FDKNZEaPpxdyWADDgthHnUV1swdvwuiZfi3DDDgxm1iBrhOkQ/w0yDBQ8qJtA==} + '@fastify/rate-limit@11.2.0': + resolution: {integrity: sha512-X7osJd4XSvMoejYrnJkSZYYjY1eNYoBqhjlzf1RakC2204qExFqZFTKj5+T7VuzA/iUI9Z3UoSqQRkB2HpG0oQ==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -512,9 +512,6 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@so-ric/colorspace@1.1.6': - resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} - '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -808,28 +805,27 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-convert@3.1.3: - resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} - engines: {node: '>=14.6'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-name@2.1.1: - resolution: {integrity: sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==} - engines: {node: '>=12.20'} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - color-string@2.1.4: - resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} - engines: {node: '>=18'} + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - color@5.0.3: - resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} - engines: {node: '>=18'} + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} @@ -877,10 +873,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -893,8 +885,8 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns@4.4.0: - resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -1218,10 +1210,6 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1256,10 +1244,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -1287,13 +1271,13 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gaxios@7.3.1: - resolution: {integrity: sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==} - engines: {node: '>=18'} + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} - gcp-metadata@9.2.0: - resolution: {integrity: sha512-eV9lxydJ1sLtP0Kpkd/7RNHuD8ZXL16nqaa4MI4tUargdSBzlkCnZ33ykSQddJFe/hdc4Tmo5tUP31szLDct3Q==} - engines: {node: '>=22'} + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} + engines: {node: '>=14'} get-intrinsic@1.2.7: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} @@ -1330,13 +1314,13 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - google-auth-library@11.3.0: - resolution: {integrity: sha512-gZCyszARHj47WNcKrAcQtimDwtTZpydRZ3HSeb66hObfQU9uaG50ejsZ8LzGISIVAjpsZEouGVs65Q/XRau0Qg==} - engines: {node: '>=22'} + google-auth-library@9.15.1: + resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} + engines: {node: '>=14'} - google-logging-utils@2.1.0: - resolution: {integrity: sha512-1R6uiq6XhXW2ZrcGtZpGgVDsYGzSmveVOn8Pp37qe1fbThHZ34e3t3eXj5mVu6PFSVx9fvB1KNVnYgVtq/BRcA==} - engines: {node: '>=22'} + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} @@ -1348,6 +1332,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -1375,8 +1363,8 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hono@4.13.13: - resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} + hono@4.8.5: + resolution: {integrity: sha512-Up2cQbtNz1s111qpnnECdTGqSIUIhZJMLikdKkshebQSEBcoUKq6XJayLGqSZWidiH0zfHRCJqFu062Mz5UuRA==} engines: {node: '>=16.9.0'} http-errors@2.0.0: @@ -1435,6 +1423,9 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -1619,8 +1610,8 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mathjs@15.2.0: - resolution: {integrity: sha512-UAQzSVob9rNLdGpqcFMYmSu9dkuLYy7Lr2hBEQS5SHQdknA9VppJz3cy2KkpMzTODunad6V6cNv+5kOLsePLow==} + mathjs@14.2.1: + resolution: {integrity: sha512-vARWETUx75+kR2K9qBV20n6NYtGXCuQKX8Zo4+AhJI5LX+ukSM1NYebv+wLnJG8KMvEe9H01sJUyC5bMciA4Tg==} engines: {node: '>= 18'} hasBin: true @@ -1673,14 +1664,14 @@ packages: resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} engines: {node: '>=18'} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} @@ -1891,6 +1882,9 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -2044,6 +2038,9 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} @@ -2151,6 +2148,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + triple-beam@1.4.1: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} @@ -2247,8 +2247,13 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@14.0.3: - resolution: {integrity: sha512-Sc5u1VVln93y1Xnz4R+CunOZc7R9LUcTmhj7Rc7Eg3HVcf7rVn2FOoa812fe0W8p3jD7xeoGSYbfqCGGH2B6xw==} + uuid@11.0.5: + resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true v8-compile-cache-lib@3.0.1: @@ -2337,9 +2342,11 @@ packages: jsdom: optional: true - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} @@ -2371,8 +2378,8 @@ packages: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} - winston@3.19.0: - resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} engines: {node: '>= 12.0.0'} word-wrap@1.2.5: @@ -2411,12 +2418,14 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.6.7: - resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} + zod@4.5.4: + resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} snapshots: - '@babel/runtime@7.29.10': {} + '@babel/runtime@7.26.7': + dependencies: + regenerator-runtime: 0.14.1 '@colors/colors@1.6.0': {} @@ -2424,9 +2433,9 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dabh/diagnostics@2.0.9': + '@dabh/diagnostics@2.0.3': dependencies: - '@so-ric/colorspace': 1.1.6 + colorspace: 1.1.4 enabled: 2.0.0 kuler: 2.0.0 @@ -2587,7 +2596,7 @@ snapshots: '@fastify/forwarded': 3.0.2 ipaddr.js: 2.5.0 - '@fastify/rate-limit@11.2.1': + '@fastify/rate-limit@11.2.0': dependencies: '@lukeed/ms': 2.0.2 fastify-plugin: 6.0.0 @@ -2698,11 +2707,6 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@so-ric/colorspace@1.1.6': - dependencies: - color: 5.0.3 - text-hex: 1.0.0 - '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -3064,26 +3068,32 @@ snapshots: check-error@2.1.1: {} + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-convert@3.1.3: - dependencies: - color-name: 2.1.1 + color-name@1.1.3: {} color-name@1.1.4: {} - color-name@2.1.1: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 - color-string@2.1.4: + color@3.2.1: dependencies: - color-name: 2.1.1 + color-convert: 1.9.3 + color-string: 1.9.1 - color@5.0.3: + colorspace@1.1.4: dependencies: - color-convert: 3.1.3 - color-string: 2.1.4 + color: 3.2.1 + text-hex: 1.0.0 commander@12.1.0: {} @@ -3117,8 +3127,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - data-uri-to-buffer@4.0.1: {} - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.3 @@ -3137,7 +3145,7 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns@4.4.0: {} + date-fns@4.1.0: {} debug@3.2.7: dependencies: @@ -3605,11 +3613,6 @@ snapshots: fecha@4.2.3: {} - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -3653,10 +3656,6 @@ snapshots: dependencies: is-callable: 1.2.7 - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - forwarded@0.2.0: {} fraction.js@5.2.1: {} @@ -3679,20 +3678,24 @@ snapshots: functions-have-names@1.2.3: {} - gaxios@7.3.1: + gaxios@6.7.1: dependencies: extend: 3.0.2 https-proxy-agent: 7.0.6 - node-fetch: 3.3.2 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 9.0.1 transitivePeerDependencies: + - encoding - supports-color - gcp-metadata@9.2.0: + gcp-metadata@6.1.1: dependencies: - gaxios: 7.3.1 - google-logging-utils: 2.1.0 + gaxios: 6.7.1 + google-logging-utils: 0.0.2 json-bigint: 1.0.0 transitivePeerDependencies: + - encoding - supports-color get-intrinsic@1.2.7: @@ -3740,18 +3743,19 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - google-auth-library@11.3.0: + google-auth-library@9.15.1: dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 7.3.1 - gcp-metadata: 9.2.0 - google-logging-utils: 2.1.0 + gaxios: 6.7.1 + gcp-metadata: 6.1.1 + gtoken: 7.1.0 jws: 4.0.0 transitivePeerDependencies: + - encoding - supports-color - google-logging-utils@2.1.0: {} + google-logging-utils@0.0.2: {} gopd@1.2.0: {} @@ -3759,6 +3763,14 @@ snapshots: graphemer@1.4.0: {} + gtoken@7.1.0: + dependencies: + gaxios: 6.7.1 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -3781,7 +3793,7 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.13.13: {} + hono@4.8.5: {} http-errors@2.0.0: dependencies: @@ -3802,7 +3814,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -3841,6 +3853,8 @@ snapshots: call-bound: 1.0.3 get-intrinsic: 1.2.7 + is-arrayish@0.3.2: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -4031,9 +4045,9 @@ snapshots: math-intrinsics@1.1.0: {} - mathjs@15.2.0: + mathjs@14.2.1: dependencies: - '@babel/runtime': 7.29.10 + '@babel/runtime': 7.26.7 complex.js: 2.4.2 decimal.js: 10.5.0 escape-latex: 1.2.0 @@ -4080,13 +4094,9 @@ snapshots: dependencies: content-type: 2.1.0 - node-domexception@1.0.0: {} - - node-fetch@3.3.2: + node-fetch@2.7.0: dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 + whatwg-url: 5.0.0 object-inspect@1.13.4: {} @@ -4305,6 +4315,8 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regenerator-runtime@0.14.1: {} + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -4515,6 +4527,10 @@ snapshots: siginfo@2.0.0: {} + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 @@ -4602,6 +4618,8 @@ snapshots: toidentifier@1.0.1: {} + tr46@0.0.3: {} + triple-beam@1.4.1: {} ts-api-utils@2.0.1(typescript@5.7.3): @@ -4713,7 +4731,9 @@ snapshots: util-deprecate@1.0.2: {} - uuid@14.0.3: {} + uuid@11.0.5: {} + + uuid@9.0.1: {} v8-compile-cache-lib@3.0.1: {} @@ -4794,7 +4814,12 @@ snapshots: - tsx - yaml - web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 which-boxed-primitive@1.1.1: dependencies: @@ -4851,10 +4876,10 @@ snapshots: readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.19.0: + winston@3.17.0: dependencies: '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.9 + '@dabh/diagnostics': 2.0.3 async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 @@ -4879,4 +4904,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@4.6.7: {} + zod@4.5.4: {} From 608d7e5a58fc673e07018e5cd6b695b257697e72 Mon Sep 17 00:00:00 2001 From: Matheus Andrade Date: Wed, 14 Oct 2026 11:28:24 -0300 Subject: [PATCH 6/6] :arrow_up: chore: upgrade mathjs to 15 and runtime dependency minors Upgrades mathjs 15, uuid 11.1, hono 4.13, zod 4.6, date-fns 4.4, winston 3.19 and @fastify/rate-limit 11.2.1. All keep a CommonJS build and support node 20. Co-Authored-By: Claude Opus 5.5 --- package.json | 14 ++--- pnpm-lock.yaml | 162 ++++++++++++++++++++++--------------------------- 2 files changed, 80 insertions(+), 96 deletions(-) diff --git a/package.json b/package.json index 159e1da..95aade8 100644 --- a/package.json +++ b/package.json @@ -44,16 +44,16 @@ } }, "dependencies": { - "@fastify/rate-limit": "^11.2.0", - "date-fns": "^4.1.0", + "@fastify/rate-limit": "^11.2.1", + "date-fns": "^4.4.0", "google-auth-library": "^9.15.1", - "hono": "^4.8.5", + "hono": "^4.13.13", "jose": "^6.2.12", - "mathjs": "^14.2.1", + "mathjs": "^15.2.0", "path-to-regexp": "8.4.2", - "uuid": "^11.0.5", - "winston": "^3.17.0", - "zod": "^4.4.3" + "uuid": "^11.1.1", + "winston": "^3.19.0", + "zod": "^4.6.7" }, "devDependencies": { "@dbos-inc/dbos-sdk": "^4.27.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3da680f..a28e152 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,35 +9,35 @@ importers: .: dependencies: '@fastify/rate-limit': - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^11.2.1 + version: 11.2.1 date-fns: - specifier: ^4.1.0 - version: 4.1.0 + specifier: ^4.4.0 + version: 4.4.0 google-auth-library: specifier: ^9.15.1 version: 9.15.1 hono: - specifier: ^4.8.5 - version: 4.8.5 + specifier: ^4.13.13 + version: 4.13.13 jose: specifier: ^6.2.12 version: 6.2.12 mathjs: - specifier: ^14.2.1 - version: 14.2.1 + specifier: ^15.2.0 + version: 15.2.0 path-to-regexp: specifier: 8.4.2 version: 8.4.2 uuid: - specifier: ^11.0.5 - version: 11.0.5 + specifier: ^11.1.1 + version: 11.1.1 winston: - specifier: ^3.17.0 - version: 3.17.0 + specifier: ^3.19.0 + version: 3.19.0 zod: - specifier: ^4.4.3 - version: 4.5.4 + specifier: ^4.6.7 + version: 4.6.7 devDependencies: '@dbos-inc/dbos-sdk': specifier: ^4.27.6 @@ -108,8 +108,8 @@ importers: packages: - '@babel/runtime@7.26.7': - resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} engines: {node: '>=6.9.0'} '@colors/colors@1.6.0': @@ -120,8 +120,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@dabh/diagnostics@2.0.9': + resolution: {integrity: sha512-R6siwR65Hm+3yfgP7o8DKhNvputQAwfoz9zTc3kyDudnomj2/BcLmD+uGQQPICjuFUp8ounPBU+jmKsocwVVAg==} '@dbos-inc/dbos-sdk@4.27.6': resolution: {integrity: sha512-mr5CEllYovAHPh/TpQcvxTYM+4t4tgV7CjkZGe7hzNxw9Nzf6l7ggxJKDbewLFwgwx8NaWcWw21ESHXNE1UwrA==} @@ -334,8 +334,8 @@ packages: '@fastify/proxy-addr@5.1.0': resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} - '@fastify/rate-limit@11.2.0': - resolution: {integrity: sha512-X7osJd4XSvMoejYrnJkSZYYjY1eNYoBqhjlzf1RakC2204qExFqZFTKj5+T7VuzA/iUI9Z3UoSqQRkB2HpG0oQ==} + '@fastify/rate-limit@11.2.1': + resolution: {integrity: sha512-uTQjii3tJUnb6ZyEMcunuvKE3FDKNZEaPpxdyWADDgthHnUV1swdvwuiZfi3DDDgxm1iBrhOkQ/w0yDBQ8qJtA==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -512,6 +512,9 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -805,27 +808,28 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-name@2.1.1: + resolution: {integrity: sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==} + engines: {node: '>=12.20'} - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} @@ -885,8 +889,8 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns@4.1.0: - resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -1363,8 +1367,8 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hono@4.8.5: - resolution: {integrity: sha512-Up2cQbtNz1s111qpnnECdTGqSIUIhZJMLikdKkshebQSEBcoUKq6XJayLGqSZWidiH0zfHRCJqFu062Mz5UuRA==} + hono@4.13.13: + resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} engines: {node: '>=16.9.0'} http-errors@2.0.0: @@ -1423,9 +1427,6 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -1610,8 +1611,8 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mathjs@14.2.1: - resolution: {integrity: sha512-vARWETUx75+kR2K9qBV20n6NYtGXCuQKX8Zo4+AhJI5LX+ukSM1NYebv+wLnJG8KMvEe9H01sJUyC5bMciA4Tg==} + mathjs@15.2.0: + resolution: {integrity: sha512-UAQzSVob9rNLdGpqcFMYmSu9dkuLYy7Lr2hBEQS5SHQdknA9VppJz3cy2KkpMzTODunad6V6cNv+5kOLsePLow==} engines: {node: '>= 18'} hasBin: true @@ -1882,9 +1883,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -2038,9 +2036,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} @@ -2247,8 +2242,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@11.0.5: - resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==} + uuid@11.1.1: + resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} hasBin: true uuid@9.0.1: @@ -2378,8 +2373,8 @@ packages: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} - winston@3.17.0: - resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} engines: {node: '>= 12.0.0'} word-wrap@1.2.5: @@ -2418,14 +2413,12 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.5.4: - resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} snapshots: - '@babel/runtime@7.26.7': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.29.10': {} '@colors/colors@1.6.0': {} @@ -2433,9 +2426,9 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dabh/diagnostics@2.0.3': + '@dabh/diagnostics@2.0.9': dependencies: - colorspace: 1.1.4 + '@so-ric/colorspace': 1.1.6 enabled: 2.0.0 kuler: 2.0.0 @@ -2596,7 +2589,7 @@ snapshots: '@fastify/forwarded': 3.0.2 ipaddr.js: 2.5.0 - '@fastify/rate-limit@11.2.0': + '@fastify/rate-limit@11.2.1': dependencies: '@lukeed/ms': 2.0.2 fastify-plugin: 6.0.0 @@ -2707,6 +2700,11 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -3068,32 +3066,26 @@ snapshots: check-error@2.1.1: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} + color-convert@3.1.3: + dependencies: + color-name: 2.1.1 color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 + color-name@2.1.1: {} - color@3.2.1: + color-string@2.1.4: dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 + color-name: 2.1.1 - colorspace@1.1.4: + color@5.0.3: dependencies: - color: 3.2.1 - text-hex: 1.0.0 + color-convert: 3.1.3 + color-string: 2.1.4 commander@12.1.0: {} @@ -3145,7 +3137,7 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns@4.1.0: {} + date-fns@4.4.0: {} debug@3.2.7: dependencies: @@ -3793,7 +3785,7 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.8.5: {} + hono@4.13.13: {} http-errors@2.0.0: dependencies: @@ -3853,8 +3845,6 @@ snapshots: call-bound: 1.0.3 get-intrinsic: 1.2.7 - is-arrayish@0.3.2: {} - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -4045,9 +4035,9 @@ snapshots: math-intrinsics@1.1.0: {} - mathjs@14.2.1: + mathjs@15.2.0: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.29.10 complex.js: 2.4.2 decimal.js: 10.5.0 escape-latex: 1.2.0 @@ -4315,8 +4305,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -4527,10 +4515,6 @@ snapshots: siginfo@2.0.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 @@ -4731,7 +4715,7 @@ snapshots: util-deprecate@1.0.2: {} - uuid@11.0.5: {} + uuid@11.1.1: {} uuid@9.0.1: {} @@ -4876,10 +4860,10 @@ snapshots: readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.17.0: + winston@3.19.0: dependencies: '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 + '@dabh/diagnostics': 2.0.9 async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 @@ -4904,4 +4888,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@4.5.4: {} + zod@4.6.7: {}