diff --git a/package.json b/package.json index f3a37883..65db9f3b 100644 --- a/package.json +++ b/package.json @@ -47,10 +47,12 @@ "tsx": "^4.19.1", "typescript": "^5.6.2", "vite": "^8.0.16", - "vite-tsconfig-paths": "^5.0.1", "vitest": "^4.0.0", "vitest-mock-express": "^2.2.0", - "vitest-mock-extended": "^4.0.0" + "vitest-mock-extended": "^4.0.0", + "esbuild": "^0.28.1", + "form-data": "^4.0.6" }, + "//": "esbuild and form-data are not direct dependencies of forms-api; however, we had to add them to enforce the use of versions that are not flagged as vulnerable by our security scanning system (we should be able to remove them in the future)", "packageManager": "pnpm@11.8.0+sha512.c1f5e7c4cb241c8f174b743851d82f42b802324afc8b0f116b96adb15aa06664948dde36960a3ba1079ba5b4b29dd0140135b94b5b5f5263592249d68e555f26" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41e48837..40eef926 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,19 +10,19 @@ importers: dependencies: '@aws-sdk/client-dynamodb': specifier: ^3.823.0 - version: 3.1075.0 + version: 3.1063.0 '@aws-sdk/client-s3': specifier: ^3.823.0 - version: 3.1075.0 + version: 3.1063.0 '@aws-sdk/client-sqs': specifier: ^3.823.0 - version: 3.1075.0 + version: 3.1063.0 '@aws-sdk/lib-dynamodb': specifier: ^3.823.0 - version: 3.1075.0(@aws-sdk/client-dynamodb@3.1075.0) + version: 3.1063.0(@aws-sdk/client-dynamodb@3.1063.0) '@aws-sdk/s3-request-presigner': specifier: ^3.859.0 - version: 3.1075.0 + version: 3.1063.0 '@gcforms/database': specifier: 1.1.1 version: 1.1.1(typescript@5.9.3) @@ -56,7 +56,7 @@ importers: devDependencies: '@aws-sdk/types': specifier: ^3.662.0 - version: 3.973.13 + version: 3.973.11 '@biomejs/biome': specifier: ^1.9.0 version: 1.9.4 @@ -68,13 +68,19 @@ importers: version: 4.17.25 '@types/node': specifier: ^22.7.4 - version: 22.20.0 + version: 22.19.20 '@types/supertest': specifier: ^6.0.2 version: 6.0.3 aws-sdk-client-mock: specifier: ^4.0.2 version: 4.1.0 + esbuild: + specifier: ^0.28.1 + version: 0.28.1 + form-data: + specifier: ^4.0.6 + version: 4.0.6 pino-pretty: specifier: ^11.2.2 version: 11.3.0 @@ -92,19 +98,16 @@ importers: version: 5.9.3 vite: specifier: ^8.0.16 - version: 8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4) - vite-tsconfig-paths: - specifier: ^5.0.1 - version: 5.1.4(typescript@5.9.3)(vite@8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4)) + version: 8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4) vitest: specifier: ^4.0.0 - version: 4.1.9(@types/node@22.20.0)(vite@8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4)) + version: 4.1.8(@types/node@22.19.20)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4)) vitest-mock-express: specifier: ^2.2.0 version: 2.2.0 vitest-mock-extended: specifier: ^4.0.0 - version: 4.0.0(typescript@5.9.3)(vitest@4.1.9(@types/node@22.20.0)(vite@8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4))) + version: 4.0.0(typescript@5.9.3)(vitest@4.1.8(@types/node@22.19.20)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4))) packages: @@ -131,124 +134,124 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/checksums@3.1000.8': - resolution: {integrity: sha512-v0U9S7gBIme3OTgt1LdbAF4RpvavCc+4GK1+1xqAcqtbrHsEhjQo6R45LKcjhs/+WrRJij1Y0Gztw7QPAIeUfA==} + '@aws-sdk/checksums@3.1000.2': + resolution: {integrity: sha512-PIha+kauTbp6IRmOpYktPTrlfrrSqDVixvhO/EUOFOf62DPX81CaJoHJreuA1m9HYpSKyXf99BKjU1dvJPeUfw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-dynamodb@3.1075.0': - resolution: {integrity: sha512-3KlTXh6U2nDqL+epT1XdxnszLtCEAvoeO7phI4UGiQeKMiibcyBsJvSlyEj1tBoNOsbdcmp1QLM8za415sDzzQ==} + '@aws-sdk/client-dynamodb@3.1063.0': + resolution: {integrity: sha512-RH5PM9lJsGgTDYyIjhPIqwRTuIZdVzRfEdLWB9/p11VVoDjQ+itbzZ7Qi/KMaw6AucAo8uXxnlVp1fZ0cVQjuA==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-s3@3.1075.0': - resolution: {integrity: sha512-h1A6nIl1YX6Y45enGsTK7ef3ZrOnBiQJ1qF5R2K/nMWfsu6A9mc2Y5T66nxerABzyjjyyvign3MrzafnFoQKmA==} + '@aws-sdk/client-s3@3.1063.0': + resolution: {integrity: sha512-ETn+vvmZVK1MmOZwVBXmWANpmD5iTbzojIqyEIoZ86qo+8oWy35S8QyQNE/ZDI+WHgMU1dS+VSYbpRl1QkEySg==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-secrets-manager@3.1075.0': - resolution: {integrity: sha512-5cLjSmrgzohO2q4gMrb7oHq58W+gR/qul7yHSRZ1fZv7aYtONvq23dKr+E7i0KBid4zkjGpjw8VJ7fNdQi9YUQ==} + '@aws-sdk/client-secrets-manager@3.1063.0': + resolution: {integrity: sha512-oP3/vHpo93rb/0JWhNcLA7fVbV1I6fBV9DrprScf71t3EVzwMyqLnVuv+5q2/3o32sCZ58YouZmqL0CqczyQzA==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sqs@3.1075.0': - resolution: {integrity: sha512-ZHowzLHFTIz482Z98Y8GtszLN7Q1YvC74xxExwr2rbKJeNWTXHVoMVwlq/jv5Kyf0elVAGmoID12Gf6aSdWy0Q==} + '@aws-sdk/client-sqs@3.1063.0': + resolution: {integrity: sha512-2Oi4FpC1jJ10gpBDfXw0sMh6GvkYmnkaTo28AnjRUrCRe5JkvEWvDwKKksQM67UtwO5AoomKAqFKVzID1zW/fQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.974.23': - resolution: {integrity: sha512-MiWR/uWjxjFXGzrE0Ghc5lWxUxzHsUWFhV+OX7M4cR9SrmrnZs6TXavnCWnzzdwJeFri34xQo81rvGNzK3c4BQ==} + '@aws-sdk/core@3.974.18': + resolution: {integrity: sha512-JDYCPI0j7zGrzXTDFsLB346cxss7J/AxH7+O0MzWlqppJBEyB9Qe6TQXRL6iwLUo/xZkNv9KFmBL2hqElmwW0g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.49': - resolution: {integrity: sha512-liB3yQNHCM9k/gu/w36XHMKPluT7HTlnGUhRbBGSISDQkcr/Sy1zsZabiuvQj8WG5yW573u9RehrBvvnIQ9OEQ==} + '@aws-sdk/credential-provider-env@3.972.44': + resolution: {integrity: sha512-3hKJVrZ7bqXzDAXCQp+OaQ1ASN+vWstaNuEH418wQVl//cRZhqhfR9Bjk1qIWmgUGe8/D3gdO73PgidRj378EQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.51': - resolution: {integrity: sha512-XET0H2oofciJ5lMRWNIvRjAP7Q3wv2XT+JtJJEdhPWUMwe3TvQ9qcxonpu7vXmNngncvFpi4E2It+Tamas/naA==} + '@aws-sdk/credential-provider-http@3.972.46': + resolution: {integrity: sha512-VhwC9pGAZHhiQ2xSViyOPDFqvr9aRxGCAXZtADsUhU3R65nad7y//CwynE6mQnWNR+suRlqE79W36IVayL+m1g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.56': - resolution: {integrity: sha512-IAmc61hbgQiHht9U3x0tnRwz0lzdwOwD/i9voRgdJrKamF+JtmrBOsW9GwB7mfFonNWOWL4qARWYrF8veEMe3w==} + '@aws-sdk/credential-provider-ini@3.972.50': + resolution: {integrity: sha512-09Xi6ovxiK42+De/qBGF71sT5F2bWgYM+1fFyDwSOpy1xpsQ5R/naIu7MVDpH6Dic36QNc8dAv4KADtMGK2JYg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.55': - resolution: {integrity: sha512-hBBkANo3cDn+h2qxxzER4a+J8JCO9o9Z/YYmU7iky6AcaarX5RRdRcHNC6SLdwY0vAXQygn6soUbDqPn3GghaA==} + '@aws-sdk/credential-provider-login@3.972.49': + resolution: {integrity: sha512-EfJF/1Fh9mI4pZyoheU2RY9xUhTcugIZNkD63+orXMkYj/QXacJNbKVDUK90Yv5hE+aX+rt9J/EZ9Qr3vKOa7g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.58': - resolution: {integrity: sha512-OyCLVmSI7pZO8hxwNVX6pXhTVlJqRBTp+ijdEfJSUj0RyjHnF602OfAarOzGq6wkGodeFkYBt8MmJ6A6ycRgWw==} + '@aws-sdk/credential-provider-node@3.972.52': + resolution: {integrity: sha512-7QX+PbyiWBEOVipJq8Nke/TqXT6lAPLE7fvTaopa39/IVWuLfS+Fzdy71sZJONf/mLGgmtj6aU17+REw3+aRrw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.49': - resolution: {integrity: sha512-C8h36lBuC/RnBSsjlO+dn6xZm3KbAl5vpJaVPAfQnMmz2/OISmKOc8XZcqMQgO2ADwBYNRMM6Kf3vz9G/TulMQ==} + '@aws-sdk/credential-provider-process@3.972.44': + resolution: {integrity: sha512-V+UUhZpRP7QDRhi+qgBDisM9tUBnYmMje8Bk77A6MZsfeGeGdMsQXmaHP1CDYFcept0o/Rz5g2Y0TMeVlG9dzg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.55': - resolution: {integrity: sha512-1FkOz74Ea5QGS9jtIoXp55T/IkSS3spv+nLTT07fRY/+T5xmEOqaYBVIaEmX4zTNvbV6g2lrtlaVKWEoNyJt3w==} + '@aws-sdk/credential-provider-sso@3.972.49': + resolution: {integrity: sha512-9QqOYGuh5tZ76OzaT68kwI78AH+5lS/uZGGvkfxb3fc8FzRrIz2jOufNTliEBEeSAwmgK2rWLNsK+IB3zbtNPA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.55': - resolution: {integrity: sha512-g2BoECD1q01kTPByi56+VLVvdWDzMkKIcr77qixpqH0okw2t0U5CoPv+6S8v/D1Y2Wa6QKKtn6XAtDzP+Kfpvg==} + '@aws-sdk/credential-provider-web-identity@3.972.49': + resolution: {integrity: sha512-IYx1lN38MnnPXv+NBLpuATu0cZakbZ321TAfjW+aVkw7HIJF38YnEwdeEO55MSl3pl7hIX1IvvnD6EmnAzmAJw==} engines: {node: '>=20.0.0'} - '@aws-sdk/dynamodb-codec@3.973.23': - resolution: {integrity: sha512-GFfrjNXw+QteWbum8jD22G3T0FD/XiJEGp6r1CoqndMc6pxyQFoQ8nqTuNn1rbqYwqv4iCTl7GYoB9H17REKzw==} + '@aws-sdk/dynamodb-codec@3.973.18': + resolution: {integrity: sha512-XWn19CsVEv0cbWjGvK140RHn7GWguXZCEDshCcYAKCLn13Edjd/gQfOtUPgldLaqlDfy2/OnG6w7Ife/JYoK7A==} engines: {node: '>=20.0.0'} - '@aws-sdk/endpoint-cache@3.972.8': - resolution: {integrity: sha512-bBmkG0Dnhfq0/T4Z0PpUr7HkncBVaWvvCbvafeaUM+yC9wa8GGjLJmonq0QL17REB9WivgGeYgWQ5A80Uw5UnQ==} + '@aws-sdk/endpoint-cache@3.972.6': + resolution: {integrity: sha512-Lyn8Oint4e6w5e5a+gsyWvDmb2NkXykfTHl8u2WCUS+iGxV5beeBK47g+Fbu7YZ9A+n+ezFmZaF3SWrd9MT52g==} engines: {node: '>=20.0.0'} - '@aws-sdk/lib-dynamodb@3.1075.0': - resolution: {integrity: sha512-3OxmMDgk8wvK6QOaVrQuOq9t6xlgS5047aDPxAZxTSwGBcEMc6FtiamtoK3kfClfOt7k3t+NWIo0bIfhWQ4Pzg==} + '@aws-sdk/lib-dynamodb@3.1063.0': + resolution: {integrity: sha512-3vXZzmYUe1k0vswOByKuLNQuB4TBu4L6IajHGFbas4I+z6Kaw875FwJLvoc6oSogvowo84Z/5rmB+5u0DX+DKw==} engines: {node: '>=20.0.0'} peerDependencies: - '@aws-sdk/client-dynamodb': ^3.1075.0 + '@aws-sdk/client-dynamodb': ^3.1063.0 - '@aws-sdk/middleware-endpoint-discovery@3.972.19': - resolution: {integrity: sha512-FMgyzUq3Jh+ONRYxryBRNdBd+FUX8PwRl07ccQknNdoms6KCeAEusCkl6whqpDrPQ6OH0ddeSifKyqYSs2DLIw==} + '@aws-sdk/middleware-endpoint-discovery@3.972.17': + resolution: {integrity: sha512-F6LjerpVoMfqqGej7f3tWyKhznOWMB2O1T/L3L4h2LU0Soy2JEO/rQFmOT0OAyJD+/zBoqU7k7g9wd1QgseUSA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.974.33': - resolution: {integrity: sha512-qMgQSPemQq2/eW/e/0+SpY4kYR5L7dUgBiVdEc5bd+ztHNv07ZMYiI+sTiir3TgKndFfglSw/VFi7oZJ6bZ63g==} + '@aws-sdk/middleware-flexible-checksums@3.974.27': + resolution: {integrity: sha512-bZqezPLdllFC4VAeV/f+EIc/hz56ab3TD/+4zNCgOgmG5ZHAE5dMHrX1gtTwdcQXbPr3KR7x3zTC3zuCTE6+ng==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.54': - resolution: {integrity: sha512-GDfDQ0gwLFRKN9gWIKcmVrHJ3e7XagnY7N1LLzMVNgnOnuY7f/ALgmy3CuBjosWD95T/Z6e+gs1IeWmLPkyLKQ==} + '@aws-sdk/middleware-sdk-s3@3.972.48': + resolution: {integrity: sha512-MRTqx8wD/T3REt6LTT3/yN8rrp6+xIHrbUekkDYJTYWVch70mwtdJBovR4qKJz1jIPlbN+9R/Sn6R04BfsglzA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-sqs@3.972.31': - resolution: {integrity: sha512-56ifsBmK9bLn5EE/t6c0nmjOB1BO8cJDLkA1VOlsN1GR85ROqnaCwVDspqcwsLaBDgPlwyYNedoDIoT3t6Ho1A==} + '@aws-sdk/middleware-sdk-sqs@3.972.29': + resolution: {integrity: sha512-huMx6RhC/tF9K82GZpnox8vK26Pt+6QASMrJiyup99ffr+HBT3asD4soa9BuD3WeLd64XYdOeuUjIjqKgVu5gA==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.997.23': - resolution: {integrity: sha512-gO93ZPsI2bxeFZD42f1/qjDw6FAZkNZcKRO94LIiT03fzOmcJ9e/tunxjVjA1Rl69ClmVJzz8H3G9CdKef10PA==} + '@aws-sdk/nested-clients@3.997.17': + resolution: {integrity: sha512-lDRgraoTfKRawUyc176Ow93mrNrOho/x+EoK4C+lKU+vKkHWhNhzvSMVAx0WEJUJoeQxxDN5ZdKMfiGEyNejig==} engines: {node: '>=20.0.0'} - '@aws-sdk/s3-request-presigner@3.1075.0': - resolution: {integrity: sha512-++ftTvAGZSTuzFVHEPk8lLi7mybBD8PzJ9USWBvwnE4kSrXOyqYVJ5Ixd06xUEWS/xsrhpkI07mzCLGIxrRymA==} + '@aws-sdk/s3-request-presigner@3.1063.0': + resolution: {integrity: sha512-uYDuWEbBYz/DfS0sEbDA3BeBCNNaLiE+dmblIRrmU02bhoqsotJb3qWfx0+I3JlukC7Vk8wRuyRgjZzq1FyXGA==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.35': - resolution: {integrity: sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg==} + '@aws-sdk/signature-v4-multi-region@3.996.32': + resolution: {integrity: sha512-llvApLcsWtmRFhG2wT3WIp1CmDeRaIYutqty1ZZXoMzK7TiJ6MOLOimk9eXUS8PwgG4ew4pa4QAbt0lfhn++1w==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1074.0': - resolution: {integrity: sha512-pv80IzgGW4RnXWtft692chZOM9i6PhebVsLCcnaM4dBEPZva2fE6FXAHs76G7Rc7s3yGyX/68G0nZMrUy+Vmpg==} + '@aws-sdk/token-providers@3.1063.0': + resolution: {integrity: sha512-nYDaWWdzjKiDP5xj8k4oUgcYd4WPgzfAOgdU5vJsaqH/07Dfvm7ffisHCFJ+NEl7kUC9JEIUxh0kznvenbo3NQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.973.13': - resolution: {integrity: sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg==} + '@aws-sdk/types@3.973.11': + resolution: {integrity: sha512-YjS0qFuECClRh4qhEyW8XagW0fwEPBeZ1cfsW/gU73Kh/ExFILxbzxOfPCmzF/2DwEvhvsHYt0b0qnvStwKYrg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-dynamodb@3.996.5': - resolution: {integrity: sha512-m9bdmYq3WtbMHAKGALw9XWiMBfKu5T8ukgdJT7Mc/d2oOwDGNFmhsnnkQ18xomoXo/ZHxAuIDi3Y6slsblW1Mg==} + '@aws-sdk/util-dynamodb@3.996.3': + resolution: {integrity: sha512-vLTbeDu000/6OvdjSL3J549WmRU9R5a/HIR6xhFDK682D74c3cYCYmnvDjGOtHfQL3c8RChFulbK2n3pxNPXyA==} engines: {node: '>=20.0.0'} peerDependencies: - '@aws-sdk/client-dynamodb': ^3.1069.0 + '@aws-sdk/client-dynamodb': ^3.1063.0 - '@aws-sdk/util-locate-window@3.965.8': - resolution: {integrity: sha512-uUbMs1cBZPafD0ohUj6EwNf0fPZ534NvBxHox4hjX+0Rxq5paSYUem7+hi833pYrzrcnBATKIYpR02MDXT5M9g==} + '@aws-sdk/util-locate-window@3.965.6': + resolution: {integrity: sha512-ZfHjfwSzeXj+Lg9AK5ZNmeDkXev6V+w2tn1t4kgDdRtUaRCthepTQiFwbD06EF9oNGH4LaLg+Mb6U16Ypv5bSw==} engines: {node: '>=20.0.0'} - '@aws-sdk/xml-builder@3.972.31': - resolution: {integrity: sha512-SzE4Pgyl+hDF+BuyuzxUSpwnuUu9lJuO1YGgteG89/4Qv0+2IQiVQqdbPV32IozLvXWQChPQcdkk/sKvb1QHiQ==} + '@aws-sdk/xml-builder@3.972.28': + resolution: {integrity: sha512-lI/l3c/vPvsxmspzV63NfS3x9q4CkMmdhJy4QiM+NThAufVkDvi/PZZQ6xETnICL0UD7jI808pY83gllf86RFg==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.4': @@ -312,14 +315,14 @@ packages: cpu: [x64] os: [win32] - '@emnapi/core@1.11.1': - resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/runtime@1.11.1': - resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@emnapi/wasi-threads@1.2.2': - resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} '@esbuild/aix-ppc64@0.28.1': resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} @@ -486,8 +489,8 @@ packages: '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - '@napi-rs/wasm-runtime@1.1.6': - resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -496,6 +499,9 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@nodable/entities@2.1.1': + resolution: {integrity: sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -508,8 +514,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.137.0': - resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} + '@oxc-project/types@0.133.0': + resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} '@paralleldrive/cuid2@2.3.1': resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} @@ -570,97 +576,97 @@ packages: peerDependencies: '@redis/client': ^1.0.0 - '@rolldown/binding-android-arm64@1.1.3': - resolution: {integrity: sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==} + '@rolldown/binding-android-arm64@1.0.3': + resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.1.3': - resolution: {integrity: sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==} + '@rolldown/binding-darwin-arm64@1.0.3': + resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.1.3': - resolution: {integrity: sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==} + '@rolldown/binding-darwin-x64@1.0.3': + resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.1.3': - resolution: {integrity: sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==} + '@rolldown/binding-freebsd-x64@1.0.3': + resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.1.3': - resolution: {integrity: sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.1.3': - resolution: {integrity: sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==} + '@rolldown/binding-linux-arm64-gnu@1.0.3': + resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.1.3': - resolution: {integrity: sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==} + '@rolldown/binding-linux-arm64-musl@1.0.3': + resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.1.3': - resolution: {integrity: sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==} + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.1.3': - resolution: {integrity: sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==} + '@rolldown/binding-linux-s390x-gnu@1.0.3': + resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.1.3': - resolution: {integrity: sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==} + '@rolldown/binding-linux-x64-gnu@1.0.3': + resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.1.3': - resolution: {integrity: sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==} + '@rolldown/binding-linux-x64-musl@1.0.3': + resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.1.3': - resolution: {integrity: sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==} + '@rolldown/binding-openharmony-arm64@1.0.3': + resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.1.3': - resolution: {integrity: sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==} + '@rolldown/binding-wasm32-wasi@1.0.3': + resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.1.3': - resolution: {integrity: sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==} + '@rolldown/binding-win32-arm64-msvc@1.0.3': + resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.1.3': - resolution: {integrity: sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==} + '@rolldown/binding-win32-x64-msvc@1.0.3': + resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -687,32 +693,32 @@ packages: '@sinonjs/samsam@8.0.3': resolution: {integrity: sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==} - '@smithy/core@3.26.0': - resolution: {integrity: sha512-mLUktFAn+Pa2agl1J7VgtYNFWCX8/b4GMJSK1hCu4YCvtBfM6F8Os3EP4ry+DFFlXOf3wyvlgXhuUdFoy52D3g==} + '@smithy/core@3.24.6': + resolution: {integrity: sha512-wBXDRup6UU97VKyaiRo8AssnfStPtG0oAAfpq/bC0a1YYau8pM86YB4kM6ccoVi1mS8l/UHbn9oDM+7uozr/ug==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.4.2': - resolution: {integrity: sha512-18UMDMyrAbDcpmL1gLUA7ww0fRTcdCrSjSJOi2Sbld+tVjwD/pW+OAwjlScFLR7vvBnhZrIPQ7kVuTf1mnJLug==} + '@smithy/credential-provider-imds@4.3.8': + resolution: {integrity: sha512-5cAM+KZC02sTqDt6NaLXyu50M/GNMd1eTzDVR8Lb0BBsVtu7RWHo47VPPEEv1vt3Yub6uzr+M5FHC+GtoT0USg==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.5.2': - resolution: {integrity: sha512-Ei/UK/QMhq0rKaMqGPlOAkE2yS9DZeYmZdk1RAKc3vp3zxgleZHZyBLlZv8yLsxljX4svCRuMTD6u3LLIcU4Bg==} + '@smithy/fetch-http-handler@5.4.6': + resolution: {integrity: sha512-FEwEYJ1jlBKdhe9TPzfghEi1bP55ZeEImlDkEa62bBBYzUcnB6RUCyuiS2mqKt6ZVjUbBgcNhzfIctH+Hevx9g==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/node-http-handler@4.8.2': - resolution: {integrity: sha512-wfl1uwrAqMH9/pi4kqBo5LBcFwrJLxuDLqL7p7qNcJIFcyZDUc6pzhYk4CYv+DP7fIUpQCZumwNnkhPKS52osQ==} + '@smithy/node-http-handler@4.7.7': + resolution: {integrity: sha512-ZAFvHXrEk6K180EVhmZVg8GU5pUH5BSFqRs27JW3j1qEFx9YyYwWFx17x/MHcjALYimGAji7qEOlF1++be+G5A==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.5.2': - resolution: {integrity: sha512-7xHpmPY4rt0IOmeAA8EfjgEH8isT+587TCdy9H6a7d4OMi5CQ0oEHhWllunvPu4j4Cq0vTFwdxXN/kABWPjdyA==} + '@smithy/signature-v4@5.4.6': + resolution: {integrity: sha512-Ojg4B6oIDlIr1R86xCDJt1zJWnYa0VINmqdjfe9qxWjdRivHalZ3iSlQgVqYbW0MdpFOC5XfHEWsnbmdnpIILQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.15.0': - resolution: {integrity: sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg==} + '@smithy/types@4.14.3': + resolution: {integrity: sha512-YupL0ZWmFtJexUN2cHzkvvF/b9pKrtAIfT1o7/oY/Ppu8IYeZ+lDPM5vZdQJaSeA132dJCqojjGC9NhXeF71VQ==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': @@ -726,8 +732,8 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@tybys/wasm-util@0.10.3': - resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} @@ -768,8 +774,8 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/node@22.20.0': - resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} + '@types/node@22.19.20': + resolution: {integrity: sha512-6tELRwSDYWW9EdZhbeZmYGZ1/7Djkt+Ah3/ScEYT9cDord7UJzasR/4D3VONg9tQI5CDp+/CZC1AXj2pCFOvpw==} '@types/pg@8.20.0': resolution: {integrity: sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==} @@ -801,11 +807,11 @@ packages: '@types/supertest@6.0.3': resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} - '@vitest/expect@4.1.9': - resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} + '@vitest/expect@4.1.8': + resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} - '@vitest/mocker@4.1.9': - resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} + '@vitest/mocker@4.1.8': + resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -815,20 +821,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.9': - resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} + '@vitest/pretty-format@4.1.8': + resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} - '@vitest/runner@4.1.9': - resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} + '@vitest/runner@4.1.8': + resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} - '@vitest/snapshot@4.1.9': - resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} + '@vitest/snapshot@4.1.8': + resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} - '@vitest/spy@4.1.9': - resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} + '@vitest/spy@4.1.8': + resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} - '@vitest/utils@4.1.9': - resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + '@vitest/utils@4.1.8': + resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -1077,8 +1083,8 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - expect-type@1.4.0: - resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} express-validator@7.3.2: @@ -1099,6 +1105,13 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-xml-builder@1.2.0: + resolution: {integrity: sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==} + + fast-xml-parser@5.7.3: + resolution: {integrity: sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==} + hasBin: true + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -1174,9 +1187,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1411,8 +1421,8 @@ packages: resolution: {integrity: sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog==} engines: {node: '>=16.0.0'} - nanoid@3.3.15: - resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1442,8 +1452,8 @@ packages: obliterator@1.6.1: resolution: {integrity: sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==} - obug@2.1.3: - resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + obug@2.1.2: + resolution: {integrity: sha512-AWGB9WFcRXOQs48Z/udjI5ZcZMHXwX8XPByNpOydgcGsDLIzjGizhoMWJyKAWze7AVW/2W1i+/gPX4YtKe5cyg==} engines: {node: '>=12.20.0'} on-exit-leak-free@2.1.2: @@ -1465,6 +1475,10 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-expression-matcher@1.5.0: + resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} + engines: {node: '>=14.0.0'} + path-to-regexp@0.1.13: resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} @@ -1481,8 +1495,8 @@ packages: pg-cloudflare@1.4.0: resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} - pg-connection-string@2.14.0: - resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==} + pg-connection-string@2.13.0: + resolution: {integrity: sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} @@ -1493,8 +1507,8 @@ packages: peerDependencies: pg: '>=8.0' - pg-protocol@1.15.0: - resolution: {integrity: sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==} + pg-protocol@1.14.0: + resolution: {integrity: sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -1579,8 +1593,8 @@ packages: pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - qs@6.15.3: - resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} queue-lit@1.5.2: @@ -1637,8 +1651,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown@1.1.3: - resolution: {integrity: sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==} + rolldown@1.0.3: + resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -1681,8 +1695,8 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.1: - resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -1723,6 +1737,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strnum@2.3.0: + resolution: {integrity: sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==} + superagent@10.3.0: resolution: {integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==} engines: {node: '>=14.18.0'} @@ -1774,17 +1791,6 @@ packages: engines: {node: '>=16.20.2'} hasBin: true - tsconfck@3.1.6: - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} - engines: {node: ^18 || >=20} - deprecated: unmaintained - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -1833,21 +1839,13 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite-tsconfig-paths@5.1.4: - resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true - - vite@8.1.0: - resolution: {integrity: sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==} + vite@8.0.16: + resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.3.0 + '@vitejs/devtools': ^0.1.18 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -1893,20 +1891,20 @@ packages: typescript: 3.x || 4.x || 5.x || 6.x vitest: '>=4.0.0' - vitest@4.1.9: - resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} + vitest@4.1.8: + resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.9 - '@vitest/browser-preview': 4.1.9 - '@vitest/browser-webdriverio': 4.1.9 - '@vitest/coverage-istanbul': 4.1.9 - '@vitest/coverage-v8': 4.1.9 - '@vitest/ui': 4.1.9 + '@vitest/browser-playwright': 4.1.8 + '@vitest/browser-preview': 4.1.8 + '@vitest/browser-webdriverio': 4.1.8 + '@vitest/coverage-istanbul': 4.1.8 + '@vitest/coverage-v8': 4.1.8 + '@vitest/ui': 4.1.8 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1942,6 +1940,10 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + xml-naming@0.1.0: + resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==} + engines: {node: '>=16.0.0'} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -1954,21 +1956,21 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.13 + '@aws-sdk/types': 3.973.11 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.13 + '@aws-sdk/types': 3.973.11 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.13 - '@aws-sdk/util-locate-window': 3.965.8 + '@aws-sdk/types': 3.973.11 + '@aws-sdk/util-locate-window': 3.965.6 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -1977,15 +1979,15 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.13 - '@aws-sdk/util-locate-window': 3.965.8 + '@aws-sdk/types': 3.973.11 + '@aws-sdk/util-locate-window': 3.965.6 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.13 + '@aws-sdk/types': 3.973.11 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -1994,280 +1996,281 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.973.13 + '@aws-sdk/types': 3.973.11 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/checksums@3.1000.8': + '@aws-sdk/checksums@3.1000.2': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.974.23 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-dynamodb@3.1075.0': + '@aws-sdk/client-dynamodb@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.23 - '@aws-sdk/credential-provider-node': 3.972.58 - '@aws-sdk/dynamodb-codec': 3.973.23 - '@aws-sdk/middleware-endpoint-discovery': 3.972.19 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/fetch-http-handler': 5.5.2 - '@smithy/node-http-handler': 4.8.2 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/dynamodb-codec': 3.973.18 + '@aws-sdk/middleware-endpoint-discovery': 3.972.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-s3@3.1075.0': + '@aws-sdk/client-s3@3.1063.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.23 - '@aws-sdk/credential-provider-node': 3.972.58 - '@aws-sdk/middleware-flexible-checksums': 3.974.33 - '@aws-sdk/middleware-sdk-s3': 3.972.54 - '@aws-sdk/signature-v4-multi-region': 3.996.35 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/fetch-http-handler': 5.5.2 - '@smithy/node-http-handler': 4.8.2 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/middleware-flexible-checksums': 3.974.27 + '@aws-sdk/middleware-sdk-s3': 3.972.48 + '@aws-sdk/signature-v4-multi-region': 3.996.32 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-secrets-manager@3.1075.0': + '@aws-sdk/client-secrets-manager@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.23 - '@aws-sdk/credential-provider-node': 3.972.58 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/fetch-http-handler': 5.5.2 - '@smithy/node-http-handler': 4.8.2 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/client-sqs@3.1075.0': + '@aws-sdk/client-sqs@3.1063.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.23 - '@aws-sdk/credential-provider-node': 3.972.58 - '@aws-sdk/middleware-sdk-sqs': 3.972.31 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/fetch-http-handler': 5.5.2 - '@smithy/node-http-handler': 4.8.2 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-node': 3.972.52 + '@aws-sdk/middleware-sdk-sqs': 3.972.29 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/core@3.974.23': + '@aws-sdk/core@3.974.18': dependencies: - '@aws-sdk/types': 3.973.13 - '@aws-sdk/xml-builder': 3.972.31 + '@aws-sdk/types': 3.973.11 + '@aws-sdk/xml-builder': 3.972.28 '@aws/lambda-invoke-store': 0.2.4 - '@smithy/core': 3.26.0 - '@smithy/signature-v4': 5.5.2 - '@smithy/types': 4.15.0 + '@smithy/core': 3.24.6 + '@smithy/signature-v4': 5.4.6 + '@smithy/types': 4.14.3 bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.49': + '@aws-sdk/credential-provider-env@3.972.44': dependencies: - '@aws-sdk/core': 3.974.23 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.51': + '@aws-sdk/credential-provider-http@3.972.46': dependencies: - '@aws-sdk/core': 3.974.23 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/fetch-http-handler': 5.5.2 - '@smithy/node-http-handler': 4.8.2 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.56': - dependencies: - '@aws-sdk/core': 3.974.23 - '@aws-sdk/credential-provider-env': 3.972.49 - '@aws-sdk/credential-provider-http': 3.972.51 - '@aws-sdk/credential-provider-login': 3.972.55 - '@aws-sdk/credential-provider-process': 3.972.49 - '@aws-sdk/credential-provider-sso': 3.972.55 - '@aws-sdk/credential-provider-web-identity': 3.972.55 - '@aws-sdk/nested-clients': 3.997.23 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/credential-provider-imds': 4.4.2 - '@smithy/types': 4.15.0 + '@aws-sdk/credential-provider-ini@3.972.50': + dependencies: + '@aws-sdk/core': 3.974.18 + '@aws-sdk/credential-provider-env': 3.972.44 + '@aws-sdk/credential-provider-http': 3.972.46 + '@aws-sdk/credential-provider-login': 3.972.49 + '@aws-sdk/credential-provider-process': 3.972.44 + '@aws-sdk/credential-provider-sso': 3.972.49 + '@aws-sdk/credential-provider-web-identity': 3.972.49 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/credential-provider-imds': 4.3.8 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-login@3.972.55': + '@aws-sdk/credential-provider-login@3.972.49': dependencies: - '@aws-sdk/core': 3.974.23 - '@aws-sdk/nested-clients': 3.997.23 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-node@3.972.58': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.49 - '@aws-sdk/credential-provider-http': 3.972.51 - '@aws-sdk/credential-provider-ini': 3.972.56 - '@aws-sdk/credential-provider-process': 3.972.49 - '@aws-sdk/credential-provider-sso': 3.972.55 - '@aws-sdk/credential-provider-web-identity': 3.972.55 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/credential-provider-imds': 4.4.2 - '@smithy/types': 4.15.0 + '@aws-sdk/credential-provider-node@3.972.52': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.44 + '@aws-sdk/credential-provider-http': 3.972.46 + '@aws-sdk/credential-provider-ini': 3.972.50 + '@aws-sdk/credential-provider-process': 3.972.44 + '@aws-sdk/credential-provider-sso': 3.972.49 + '@aws-sdk/credential-provider-web-identity': 3.972.49 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/credential-provider-imds': 4.3.8 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.972.49': + '@aws-sdk/credential-provider-process@3.972.44': dependencies: - '@aws-sdk/core': 3.974.23 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.55': + '@aws-sdk/credential-provider-sso@3.972.49': dependencies: - '@aws-sdk/core': 3.974.23 - '@aws-sdk/nested-clients': 3.997.23 - '@aws-sdk/token-providers': 3.1074.0 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/token-providers': 3.1063.0 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.972.55': + '@aws-sdk/credential-provider-web-identity@3.972.49': dependencies: - '@aws-sdk/core': 3.974.23 - '@aws-sdk/nested-clients': 3.997.23 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/dynamodb-codec@3.973.23': + '@aws-sdk/dynamodb-codec@3.973.18': dependencies: - '@aws-sdk/core': 3.974.23 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/endpoint-cache@3.972.8': + '@aws-sdk/endpoint-cache@3.972.6': dependencies: mnemonist: 0.38.3 tslib: 2.8.1 - '@aws-sdk/lib-dynamodb@3.1075.0(@aws-sdk/client-dynamodb@3.1075.0)': + '@aws-sdk/lib-dynamodb@3.1063.0(@aws-sdk/client-dynamodb@3.1063.0)': dependencies: - '@aws-sdk/client-dynamodb': 3.1075.0 - '@aws-sdk/core': 3.974.23 - '@aws-sdk/util-dynamodb': 3.996.5(@aws-sdk/client-dynamodb@3.1075.0) - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/client-dynamodb': 3.1063.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/util-dynamodb': 3.996.3(@aws-sdk/client-dynamodb@3.1063.0) + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/middleware-endpoint-discovery@3.972.19': + '@aws-sdk/middleware-endpoint-discovery@3.972.17': dependencies: - '@aws-sdk/endpoint-cache': 3.972.8 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/endpoint-cache': 3.972.6 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.974.33': + '@aws-sdk/middleware-flexible-checksums@3.974.27': dependencies: - '@aws-sdk/checksums': 3.1000.8 + '@aws-sdk/checksums': 3.1000.2 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.54': + '@aws-sdk/middleware-sdk-s3@3.972.48': dependencies: - '@aws-sdk/core': 3.974.23 - '@aws-sdk/signature-v4-multi-region': 3.996.35 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/signature-v4-multi-region': 3.996.32 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-sqs@3.972.31': + '@aws-sdk/middleware-sdk-sqs@3.972.29': dependencies: - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.997.23': + '@aws-sdk/nested-clients@3.997.17': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.23 - '@aws-sdk/signature-v4-multi-region': 3.996.35 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/fetch-http-handler': 5.5.2 - '@smithy/node-http-handler': 4.8.2 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/signature-v4-multi-region': 3.996.32 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/fetch-http-handler': 5.4.6 + '@smithy/node-http-handler': 4.7.7 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/s3-request-presigner@3.1075.0': + '@aws-sdk/s3-request-presigner@3.1063.0': dependencies: - '@aws-sdk/core': 3.974.23 - '@aws-sdk/signature-v4-multi-region': 3.996.35 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/signature-v4-multi-region': 3.996.32 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.35': + '@aws-sdk/signature-v4-multi-region@3.996.32': dependencies: - '@aws-sdk/types': 3.973.13 - '@smithy/signature-v4': 5.5.2 - '@smithy/types': 4.15.0 + '@aws-sdk/types': 3.973.11 + '@smithy/signature-v4': 5.4.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1074.0': + '@aws-sdk/token-providers@3.1063.0': dependencies: - '@aws-sdk/core': 3.974.23 - '@aws-sdk/nested-clients': 3.997.23 - '@aws-sdk/types': 3.973.13 - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@aws-sdk/core': 3.974.18 + '@aws-sdk/nested-clients': 3.997.17 + '@aws-sdk/types': 3.973.11 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/types@3.973.13': + '@aws-sdk/types@3.973.11': dependencies: - '@smithy/types': 4.15.0 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@aws-sdk/util-dynamodb@3.996.5(@aws-sdk/client-dynamodb@3.1075.0)': + '@aws-sdk/util-dynamodb@3.996.3(@aws-sdk/client-dynamodb@3.1063.0)': dependencies: - '@aws-sdk/client-dynamodb': 3.1075.0 + '@aws-sdk/client-dynamodb': 3.1063.0 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.965.8': + '@aws-sdk/util-locate-window@3.965.6': dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.31': + '@aws-sdk/xml-builder@3.972.28': dependencies: - '@smithy/types': 4.15.0 + '@smithy/types': 4.14.3 + fast-xml-parser: 5.7.3 tslib: 2.8.1 '@aws/lambda-invoke-store@0.2.4': {} @@ -2307,18 +2310,18 @@ snapshots: '@biomejs/cli-win32-x64@1.9.4': optional: true - '@emnapi/core@1.11.1': + '@emnapi/core@1.10.0': dependencies: - '@emnapi/wasi-threads': 1.2.2 + '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.11.1': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.2': + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true @@ -2403,7 +2406,7 @@ snapshots: '@gcforms/database@1.1.1(typescript@5.9.3)': dependencies: - '@aws-sdk/client-secrets-manager': 3.1075.0 + '@aws-sdk/client-secrets-manager': 3.1063.0 '@prisma/adapter-pg': 7.8.0 '@prisma/client': 7.8.0(typescript@5.9.3) pg: 8.20.0 @@ -2416,15 +2419,17 @@ snapshots: '@keyv/serialize@1.1.1': {} - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@tybys/wasm-util': 0.10.3 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 optional: true '@noble/hashes@1.8.0': {} + '@nodable/entities@2.1.1': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2437,7 +2442,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-project/types@0.137.0': {} + '@oxc-project/types@0.133.0': {} '@paralleldrive/cuid2@2.3.1': dependencies: @@ -2494,53 +2499,53 @@ snapshots: dependencies: '@redis/client': 1.6.1 - '@rolldown/binding-android-arm64@1.1.3': + '@rolldown/binding-android-arm64@1.0.3': optional: true - '@rolldown/binding-darwin-arm64@1.1.3': + '@rolldown/binding-darwin-arm64@1.0.3': optional: true - '@rolldown/binding-darwin-x64@1.1.3': + '@rolldown/binding-darwin-x64@1.0.3': optional: true - '@rolldown/binding-freebsd-x64@1.1.3': + '@rolldown/binding-freebsd-x64@1.0.3': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.1.3': + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': optional: true - '@rolldown/binding-linux-arm64-gnu@1.1.3': + '@rolldown/binding-linux-arm64-gnu@1.0.3': optional: true - '@rolldown/binding-linux-arm64-musl@1.1.3': + '@rolldown/binding-linux-arm64-musl@1.0.3': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.1.3': + '@rolldown/binding-linux-ppc64-gnu@1.0.3': optional: true - '@rolldown/binding-linux-s390x-gnu@1.1.3': + '@rolldown/binding-linux-s390x-gnu@1.0.3': optional: true - '@rolldown/binding-linux-x64-gnu@1.1.3': + '@rolldown/binding-linux-x64-gnu@1.0.3': optional: true - '@rolldown/binding-linux-x64-musl@1.1.3': + '@rolldown/binding-linux-x64-musl@1.0.3': optional: true - '@rolldown/binding-openharmony-arm64@1.1.3': + '@rolldown/binding-openharmony-arm64@1.0.3': optional: true - '@rolldown/binding-wasm32-wasi@1.1.3': + '@rolldown/binding-wasm32-wasi@1.0.3': dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.1.3': + '@rolldown/binding-win32-arm64-msvc@1.0.3': optional: true - '@rolldown/binding-win32-x64-msvc@1.1.3': + '@rolldown/binding-win32-x64-msvc@1.0.3': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -2566,41 +2571,41 @@ snapshots: '@sinonjs/commons': 3.0.1 type-detect: 4.1.0 - '@smithy/core@3.26.0': + '@smithy/core@3.24.6': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.15.0 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.4.2': + '@smithy/credential-provider-imds@4.3.8': dependencies: - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.5.2': + '@smithy/fetch-http-handler@5.4.6': dependencies: - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/node-http-handler@4.8.2': + '@smithy/node-http-handler@4.7.7': dependencies: - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@smithy/signature-v4@5.5.2': + '@smithy/signature-v4@5.4.6': dependencies: - '@smithy/core': 3.26.0 - '@smithy/types': 4.15.0 + '@smithy/core': 3.24.6 + '@smithy/types': 4.14.3 tslib: 2.8.1 - '@smithy/types@4.15.0': + '@smithy/types@4.14.3': dependencies: tslib: 2.8.1 @@ -2616,7 +2621,7 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@tybys/wasm-util@0.10.3': + '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 optional: true @@ -2624,7 +2629,7 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.20.0 + '@types/node': 22.19.20 '@types/chai@5.2.3': dependencies: @@ -2633,13 +2638,13 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.20.0 + '@types/node': 22.19.20 '@types/cookiejar@2.1.5': {} '@types/cors@2.8.19': dependencies: - '@types/node': 22.20.0 + '@types/node': 22.19.20 '@types/deep-eql@4.0.2': {} @@ -2647,7 +2652,7 @@ snapshots: '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 22.20.0 + '@types/node': 22.19.20 '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -2667,14 +2672,14 @@ snapshots: '@types/mime@1.3.5': {} - '@types/node@22.20.0': + '@types/node@22.19.20': dependencies: undici-types: 6.21.0 '@types/pg@8.20.0': dependencies: - '@types/node': 22.20.0 - pg-protocol: 1.15.0 + '@types/node': 22.19.20 + pg-protocol: 1.14.0 pg-types: 2.2.0 '@types/qs@6.15.1': {} @@ -2684,16 +2689,16 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.20.0 + '@types/node': 22.19.20 '@types/send@1.2.1': dependencies: - '@types/node': 22.20.0 + '@types/node': 22.19.20 '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.20.0 + '@types/node': 22.19.20 '@types/send': 0.17.6 '@types/sinon@17.0.4': @@ -2706,7 +2711,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.20.0 + '@types/node': 22.19.20 form-data: 4.0.6 '@types/supertest@6.0.3': @@ -2714,44 +2719,44 @@ snapshots: '@types/methods': 1.1.4 '@types/superagent': 8.1.10 - '@vitest/expect@4.1.9': + '@vitest/expect@4.1.8': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.9(vite@8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4))': + '@vitest/mocker@4.1.8(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4))': dependencies: - '@vitest/spy': 4.1.9 + '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4) + vite: 8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4) - '@vitest/pretty-format@4.1.9': + '@vitest/pretty-format@4.1.8': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.9': + '@vitest/runner@4.1.8': dependencies: - '@vitest/utils': 4.1.9 + '@vitest/utils': 4.1.8 pathe: 2.0.3 - '@vitest/snapshot@4.1.9': + '@vitest/snapshot@4.1.8': dependencies: - '@vitest/pretty-format': 4.1.9 - '@vitest/utils': 4.1.9 + '@vitest/pretty-format': 4.1.8 + '@vitest/utils': 4.1.8 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.9': {} + '@vitest/spy@4.1.8': {} - '@vitest/utils@4.1.9': + '@vitest/utils@4.1.8': dependencies: - '@vitest/pretty-format': 4.1.9 + '@vitest/pretty-format': 4.1.8 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -2801,7 +2806,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.15.3 + qs: 6.15.2 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 @@ -2999,7 +3004,7 @@ snapshots: events@3.3.0: {} - expect-type@1.4.0: {} + expect-type@1.3.0: {} express-validator@7.3.2: dependencies: @@ -3029,7 +3034,7 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.13 proxy-addr: 2.0.7 - qs: 6.15.3 + qs: 6.15.2 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.2 @@ -3054,6 +3059,18 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-xml-builder@1.2.0: + dependencies: + path-expression-matcher: 1.5.0 + xml-naming: 0.1.0 + + fast-xml-parser@5.7.3: + dependencies: + '@nodable/entities': 2.1.1 + fast-xml-builder: 1.2.0 + path-expression-matcher: 1.5.0 + strnum: 2.3.0 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -3145,8 +3162,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globrex@0.1.2: {} - gopd@1.2.0: {} got@14.6.6: @@ -3325,7 +3340,7 @@ snapshots: mylas@2.1.14: {} - nanoid@3.3.15: {} + nanoid@3.3.12: {} negotiator@0.6.3: {} @@ -3346,7 +3361,7 @@ snapshots: obliterator@1.6.1: {} - obug@2.1.3: {} + obug@2.1.2: {} on-exit-leak-free@2.1.2: {} @@ -3362,6 +3377,8 @@ snapshots: parseurl@1.3.3: {} + path-expression-matcher@1.5.0: {} + path-to-regexp@0.1.13: {} path-to-regexp@8.4.2: {} @@ -3373,7 +3390,7 @@ snapshots: pg-cloudflare@1.4.0: optional: true - pg-connection-string@2.14.0: {} + pg-connection-string@2.13.0: {} pg-int8@1.0.1: {} @@ -3381,7 +3398,7 @@ snapshots: dependencies: pg: 8.20.0 - pg-protocol@1.15.0: {} + pg-protocol@1.14.0: {} pg-types@2.2.0: dependencies: @@ -3393,9 +3410,9 @@ snapshots: pg@8.20.0: dependencies: - pg-connection-string: 2.14.0 + pg-connection-string: 2.13.0 pg-pool: 3.14.0(pg@8.20.0) - pg-protocol: 1.15.0 + pg-protocol: 1.14.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -3454,7 +3471,7 @@ snapshots: postcss@8.5.15: dependencies: - nanoid: 3.3.15 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -3484,10 +3501,9 @@ snapshots: end-of-stream: 1.4.5 once: 1.4.0 - qs@6.15.3: + qs@6.15.2: dependencies: - es-define-property: 1.0.1 - side-channel: 1.1.1 + side-channel: 1.1.0 queue-lit@1.5.2: {} @@ -3541,26 +3557,26 @@ snapshots: reusify@1.1.0: {} - rolldown@1.1.3: + rolldown@1.0.3: dependencies: - '@oxc-project/types': 0.137.0 + '@oxc-project/types': 0.133.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.1.3 - '@rolldown/binding-darwin-arm64': 1.1.3 - '@rolldown/binding-darwin-x64': 1.1.3 - '@rolldown/binding-freebsd-x64': 1.1.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.1.3 - '@rolldown/binding-linux-arm64-gnu': 1.1.3 - '@rolldown/binding-linux-arm64-musl': 1.1.3 - '@rolldown/binding-linux-ppc64-gnu': 1.1.3 - '@rolldown/binding-linux-s390x-gnu': 1.1.3 - '@rolldown/binding-linux-x64-gnu': 1.1.3 - '@rolldown/binding-linux-x64-musl': 1.1.3 - '@rolldown/binding-openharmony-arm64': 1.1.3 - '@rolldown/binding-wasm32-wasi': 1.1.3 - '@rolldown/binding-win32-arm64-msvc': 1.1.3 - '@rolldown/binding-win32-x64-msvc': 1.1.3 + '@rolldown/binding-android-arm64': 1.0.3 + '@rolldown/binding-darwin-arm64': 1.0.3 + '@rolldown/binding-darwin-x64': 1.0.3 + '@rolldown/binding-freebsd-x64': 1.0.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.3 + '@rolldown/binding-linux-arm64-musl': 1.0.3 + '@rolldown/binding-linux-ppc64-gnu': 1.0.3 + '@rolldown/binding-linux-s390x-gnu': 1.0.3 + '@rolldown/binding-linux-x64-gnu': 1.0.3 + '@rolldown/binding-linux-x64-musl': 1.0.3 + '@rolldown/binding-openharmony-arm64': 1.0.3 + '@rolldown/binding-wasm32-wasi': 1.0.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.3 + '@rolldown/binding-win32-x64-msvc': 1.0.3 run-parallel@1.2.0: dependencies: @@ -3623,7 +3639,7 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.1: + side-channel@1.1.0: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -3664,6 +3680,8 @@ snapshots: strip-json-comments@3.1.1: {} + strnum@2.3.0: {} + superagent@10.3.0: dependencies: component-emitter: 1.3.1 @@ -3674,7 +3692,7 @@ snapshots: formidable: 3.5.4 methods: 1.1.2 mime: 2.6.0 - qs: 6.15.3 + qs: 6.15.2 transitivePeerDependencies: - supports-color @@ -3725,10 +3743,6 @@ snapshots: normalize-path: 3.0.0 plimit-lit: 1.6.1 - tsconfck@3.1.6(typescript@5.9.3): - optionalDependencies: - typescript: 5.9.3 - tslib@2.8.1: {} tsx@4.22.4: @@ -3760,26 +3774,15 @@ snapshots: vary@1.1.2: {} - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4)): - dependencies: - debug: 4.4.3 - globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.3) - optionalDependencies: - vite: 8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4) - transitivePeerDependencies: - - supports-color - - typescript - - vite@8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4): + vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.15 - rolldown: 1.1.3 + rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 22.20.0 + '@types/node': 22.19.20 esbuild: 0.28.1 fsevents: 2.3.3 tsx: 4.22.4 @@ -3788,25 +3791,25 @@ snapshots: dependencies: '@types/express': 4.17.25 - vitest-mock-extended@4.0.0(typescript@5.9.3)(vitest@4.1.9(@types/node@22.20.0)(vite@8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4))): + vitest-mock-extended@4.0.0(typescript@5.9.3)(vitest@4.1.8(@types/node@22.19.20)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4))): dependencies: ts-essentials: 10.2.1(typescript@5.9.3) typescript: 5.9.3 - vitest: 4.1.9(@types/node@22.20.0)(vite@8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4)) + vitest: 4.1.8(@types/node@22.19.20)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4)) - vitest@4.1.9(@types/node@22.20.0)(vite@8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4)): + vitest@4.1.8(@types/node@22.19.20)(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4)): dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 es-module-lexer: 2.1.0 - expect-type: 1.4.0 + expect-type: 1.3.0 magic-string: 0.30.21 - obug: 2.1.3 + obug: 2.1.2 pathe: 2.0.3 picomatch: 4.0.4 std-env: 4.1.0 @@ -3814,10 +3817,10 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.0(@types/node@22.20.0)(esbuild@0.28.1)(tsx@4.22.4) + vite: 8.0.16(@types/node@22.19.20)(esbuild@0.28.1)(tsx@4.22.4) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.20.0 + '@types/node': 22.19.20 transitivePeerDependencies: - msw @@ -3828,6 +3831,8 @@ snapshots: wrappy@1.0.2: {} + xml-naming@0.1.0: {} + xtend@4.0.2: {} yallist@4.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 97db6de7..4af66930 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,6 @@ +blockExoticSubdeps: true +minimumReleaseAge: 10080 # 7 days + allowBuilds: '@biomejs/biome': false esbuild: false diff --git a/src/lib/formsClient/getFormTemplate.ts b/src/lib/formsClient/getFormTemplate.ts index 5d738b87..5e1265b2 100644 --- a/src/lib/formsClient/getFormTemplate.ts +++ b/src/lib/formsClient/getFormTemplate.ts @@ -4,16 +4,36 @@ import { logMessage } from "@lib/logging/logger.js"; export async function getFormTemplate( formId: string, + version: number, ): Promise { try { - const template = await prisma.template.findUnique({ - where: { - id: formId, - }, - select: { - jsonConfig: true, - }, - }); + const template = await prisma.templateVersion + .findUnique({ + where: { + templateId_versionNumber: { + templateId: formId, + versionNumber: version, + }, + }, + select: { + jsonConfig: true, + }, + }) + // Fallback query to be deleted once form versioning is fully released in Production + .then((result) => { + if (result !== null) { + return result; + } + + return prisma.template.findUnique({ + where: { + id: formId, + }, + select: { + jsonConfig: true, + }, + }); + }); if (template === null) { return undefined; diff --git a/src/lib/vault/getFormSubmission.ts b/src/lib/vault/getFormSubmission.ts index c70e5361..8ae05ecb 100644 --- a/src/lib/vault/getFormSubmission.ts +++ b/src/lib/vault/getFormSubmission.ts @@ -16,7 +16,7 @@ export async function getFormSubmission( TableName: "Vault", Key: { FormID: formId, NAME_OR_CONF: `NAME#${submissionName}` }, ProjectionExpression: - "CreatedAt,#statusCreatedAtKey,ConfirmationCode,FormSubmission,FormSubmissionHash,SubmissionAttachments", + "CreatedAt,#statusCreatedAtKey,ConfirmationCode,FormSubmission,FormSubmissionHash,SubmissionAttachments,Version", ExpressionAttributeNames: { "#statusCreatedAtKey": "Status#CreatedAt", }, diff --git a/src/lib/vault/getNewFormSubmissions.ts b/src/lib/vault/getNewFormSubmissions.ts index 553f178d..3525e1f8 100644 --- a/src/lib/vault/getNewFormSubmissions.ts +++ b/src/lib/vault/getNewFormSubmissions.ts @@ -1,4 +1,5 @@ import { QueryCommand, type QueryCommandOutput } from "@aws-sdk/lib-dynamodb"; +import { ENVIRONMENT_MODE, EnvironmentMode } from "@config"; import { AwsServicesConnector } from "@lib/integration/awsServicesConnector.js"; import { logMessage } from "@lib/logging/logger.js"; import { mapNewFormSubmissionFromDynamoDbResponse } from "@lib/vault/mappers/formSubmission.mapper.js"; @@ -17,12 +18,15 @@ export async function getNewFormSubmissions( await AwsServicesConnector.getInstance().dynamodbClient.send( new QueryCommand({ TableName: "Vault", - IndexName: "StatusCreatedAt", + IndexName: + ENVIRONMENT_MODE !== EnvironmentMode.production // Condition to be deleted once StatusCreatedAt_v2 becomes available in Production + ? "StatusCreatedAt_v2" + : "StatusCreatedAt", ExclusiveStartKey: lastEvaluatedKey ?? undefined, Limit: limit - newFormSubmissions.length, KeyConditionExpression: "FormID = :formId AND begins_with(#statusCreatedAt, :status)", - ProjectionExpression: "#name,CreatedAt", + ProjectionExpression: `#name,CreatedAt${ENVIRONMENT_MODE !== EnvironmentMode.production ? ",Version" : ""}`, // Condition to be deleted once StatusCreatedAt_v2 becomes available in Production ExpressionAttributeNames: { "#statusCreatedAt": "Status#CreatedAt", "#name": "Name", diff --git a/src/lib/vault/mappers/formSubmission.mapper.ts b/src/lib/vault/mappers/formSubmission.mapper.ts index 3f66991c..d9044f0a 100644 --- a/src/lib/vault/mappers/formSubmission.mapper.ts +++ b/src/lib/vault/mappers/formSubmission.mapper.ts @@ -11,13 +11,16 @@ export function mapNewFormSubmissionFromDynamoDbResponse( response: Record, ): NewFormSubmission { try { + // response.Version could be undefined if API users are retrieving responses that have been created before we implemented the form versioning feature if (response.Name === undefined || response.CreatedAt === undefined) { throw new Error("Missing key properties in DynamoDB response"); } if ( typeof response.Name !== "string" || - typeof response.CreatedAt !== "number" + typeof response.CreatedAt !== "number" || + // response.Version could be undefined if API users are retrieving responses that have been created before we implemented the form versioning feature + (response.Version !== undefined && typeof response.Version !== "number") ) { throw new Error("Unexpected type in DynamoDB response"); } @@ -25,6 +28,7 @@ export function mapNewFormSubmissionFromDynamoDbResponse( return { name: response.Name, createdAt: response.CreatedAt, + version: response.Version ?? 1, }; } catch (error) { logMessage.info( @@ -47,6 +51,7 @@ export function mapFormSubmissionFromDynamoDbResponse( response.FormSubmission === undefined || response.FormSubmissionHash === undefined // response.SubmissionAttachments could be undefined if API users are retrieving responses that have been created before we implemented the submission attachments feature + // response.Version could be undefined if API users are retrieving responses that have been created before we implemented the form versioning feature ) { throw new Error("Missing key properties in DynamoDB response"); } @@ -57,8 +62,11 @@ export function mapFormSubmissionFromDynamoDbResponse( typeof response.ConfirmationCode !== "string" || typeof response.FormSubmission !== "string" || typeof response.FormSubmissionHash !== "string" || + // response.SubmissionAttachments could be undefined if API users are retrieving responses that have been created before we implemented the submission attachments feature (response.SubmissionAttachments !== undefined && - typeof response.SubmissionAttachments !== "string") + typeof response.SubmissionAttachments !== "string") || + // response.Version could be undefined if API users are retrieving responses that have been created before we implemented the form versioning feature + (response.Version !== undefined && typeof response.Version !== "number") ) { throw new Error("Unexpected type in DynamoDB response"); } @@ -74,6 +82,7 @@ export function mapFormSubmissionFromDynamoDbResponse( response.SubmissionAttachments, ) : [], + version: response.Version ?? 1, }; } catch (error) { logMessage.info( diff --git a/src/lib/vault/types/formSubmission.types.ts b/src/lib/vault/types/formSubmission.types.ts index a4e56a3a..731997ed 100644 --- a/src/lib/vault/types/formSubmission.types.ts +++ b/src/lib/vault/types/formSubmission.types.ts @@ -1,6 +1,7 @@ export type NewFormSubmission = { name: string; createdAt: number; + version: number; }; export const SubmissionStatus = { @@ -40,4 +41,5 @@ export type FormSubmission = { answers: string; checksum: string; attachments: PartialAttachment[]; + version: number; }; diff --git a/src/operations/retrieveNewSubmissions.v1.ts b/src/operations/retrieveNewSubmissions.v1.ts index d5a2d158..f5f3a5e2 100644 --- a/src/operations/retrieveNewSubmissions.v1.ts +++ b/src/operations/retrieveNewSubmissions.v1.ts @@ -48,9 +48,14 @@ async function v1( function buildResponse(newFormSubmissions: NewFormSubmission[]): { name: string; createdAt: number; + version: number; }[] { return newFormSubmissions.map((item) => { - return { name: item.name, createdAt: item.createdAt }; + return { + name: item.name, + createdAt: item.createdAt, + version: item.version, + }; }); } diff --git a/src/operations/retrieveSubmission.v1.ts b/src/operations/retrieveSubmission.v1.ts index a5117217..5375815c 100644 --- a/src/operations/retrieveSubmission.v1.ts +++ b/src/operations/retrieveSubmission.v1.ts @@ -111,6 +111,7 @@ function buildJsonResponse( md5: attachment.md5, })), }), + version: formSubmission.version, }); } diff --git a/src/operations/retrieveTemplate.v1.ts b/src/operations/retrieveTemplate.v1.ts index 45bc6ede..3034a06a 100644 --- a/src/operations/retrieveTemplate.v1.ts +++ b/src/operations/retrieveTemplate.v1.ts @@ -17,9 +17,17 @@ async function v1( const serviceUserId = retrieveRequestContextData( RequestContextualStoreKey.serviceUserId, ); + const version = Number(request.query.version ?? 1); try { - const formTemplate = await getFormTemplate(formId); + if (Number.isNaN(version)) { + response + .status(400) + .json({ error: "URL parameter 'version' should be a number" }); + return; + } + + const formTemplate = await getFormTemplate(formId, version); if (formTemplate === undefined) { response.status(404).json({ error: "Form template does not exist" }); @@ -38,7 +46,7 @@ async function v1( } catch (error) { next( new Error( - `[operation] Internal error while retrieving template. Params: formId = ${formId}`, + `[operation] Internal error while retrieving template. Params: formId = ${formId} ; version = ${request.query.version}`, { cause: error }, ), ); diff --git a/test/lib/encryption/encryptResponse.test.ts b/test/lib/encryption/encryptResponse.test.ts index 788356c9..e5abe58e 100644 --- a/test/lib/encryption/encryptResponse.test.ts +++ b/test/lib/encryption/encryptResponse.test.ts @@ -32,9 +32,9 @@ describe("encryptFormSubmission should", () => { }); const logMessageSpy = vi.spyOn(logMessage, "error"); - expect(() => - encryptResponse("serviceAccountPublicKey", "payload"), - ).toThrowError("custom error"); + expect(() => encryptResponse("serviceAccountPublicKey", "payload")).toThrow( + "custom error", + ); expect(logMessageSpy).toHaveBeenCalledWith( customError, diff --git a/test/lib/formsClient/getFormTemplate.test.ts b/test/lib/formsClient/getFormTemplate.test.ts index 8cda5179..8606b8cf 100644 --- a/test/lib/formsClient/getFormTemplate.test.ts +++ b/test/lib/formsClient/getFormTemplate.test.ts @@ -1,4 +1,9 @@ -import { type PrismaClient, type Template, prisma } from "@gcforms/database"; +import { + type PrismaClient, + type Template, + type TemplateVersion, + prisma, +} from "@gcforms/database"; import { getFormTemplate } from "@lib/formsClient/getFormTemplate.js"; import { logMessage } from "@lib/logging/logger.js"; import { beforeEach, describe, expect, it, vi } from "vitest"; @@ -13,14 +18,43 @@ describe("getFormTemplate should", () => { }); it("return an undefined form template if database was not able to find it", async () => { - prismaMock.template.findUnique.mockResolvedValueOnce(null); + prismaMock.templateVersion.findUnique.mockResolvedValueOnce(null); - const formTemplate = await getFormTemplate("clzamy5qv0000115huc4bh90m"); + const formTemplate = await getFormTemplate("clzamy5qv0000115huc4bh90m", 1); expect(formTemplate).toBeUndefined(); }); it("return a form template if database was able to find it", async () => { + prismaMock.templateVersion.findUnique.mockResolvedValue({ + jsonConfig: { + elements: [ + { + id: 1, + type: "textField", + }, + ], + }, + } as unknown as TemplateVersion); + + const formTemplate = await getFormTemplate("clzamy5qv0000115huc4bh90m", 1); + + expect(formTemplate).toEqual({ + jsonConfig: { + elements: [ + { + id: 1, + type: "textField", + }, + ], + }, + }); + }); + + // This test can be deleted once form versioning is implemented in Production and migrated old form template database entries to the new versioned schema + it("return a form template even if form versioning is not fully deployed (testing fallback Prisma query)", async () => { + prismaMock.templateVersion.findUnique.mockResolvedValue(null); + prismaMock.template.findUnique.mockResolvedValue({ jsonConfig: { elements: [ @@ -32,7 +66,7 @@ describe("getFormTemplate should", () => { }, } as unknown as Template); - const formTemplate = await getFormTemplate("clzamy5qv0000115huc4bh90m"); + const formTemplate = await getFormTemplate("clzamy5qv0000115huc4bh90m", 1); expect(formTemplate).toEqual({ jsonConfig: { @@ -48,12 +82,12 @@ describe("getFormTemplate should", () => { it("throw an error if database has an internal failure", async () => { const customError = new Error("custom error"); - prismaMock.template.findUnique.mockRejectedValueOnce(customError); + prismaMock.templateVersion.findUnique.mockRejectedValueOnce(customError); const logMessageSpy = vi.spyOn(logMessage, "error"); await expect(() => - getFormTemplate("clzamy5qv0000115huc4bh90m"), - ).rejects.toThrowError(customError); + getFormTemplate("clzamy5qv0000115huc4bh90m", 1), + ).rejects.toThrow(customError); expect(logMessageSpy).toHaveBeenCalledWith( customError, diff --git a/test/lib/formsClient/getPublicKey.test.ts b/test/lib/formsClient/getPublicKey.test.ts index c4e6a2da..f598ee92 100644 --- a/test/lib/formsClient/getPublicKey.test.ts +++ b/test/lib/formsClient/getPublicKey.test.ts @@ -56,7 +56,7 @@ describe("getPublicKey should", () => { prismaMock.apiServiceAccount.findUnique.mockRejectedValueOnce(customError); const logMessageSpy = vi.spyOn(logMessage, "info"); - await expect(() => getPublicKey("254354365464565461")).rejects.toThrowError( + await expect(() => getPublicKey("254354365464565461")).rejects.toThrow( customError, ); diff --git a/test/lib/idp/verifyAccessToken.test.ts b/test/lib/idp/verifyAccessToken.test.ts index 52939620..f473d79a 100644 --- a/test/lib/idp/verifyAccessToken.test.ts +++ b/test/lib/idp/verifyAccessToken.test.ts @@ -201,7 +201,7 @@ describe("verifyAccessToken should", () => { "RkS8hzu0MtwL+Qs2lK7KX9CLK7v6lxYpqs7ns5MwuOs=", "0000", ), - ).rejects.toThrowError(ZitadelConnectionError); + ).rejects.toThrow(ZitadelConnectionError); expect(logMessageSpy).toHaveBeenCalledWith( connectionError, diff --git a/test/lib/integration/zitadelConnector.test.ts b/test/lib/integration/zitadelConnector.test.ts index 510a722b..ac5ee2e8 100644 --- a/test/lib/integration/zitadelConnector.test.ts +++ b/test/lib/integration/zitadelConnector.test.ts @@ -43,9 +43,9 @@ describe("introspectAccessToken should", () => { const logMessageSpy = vi.spyOn(logMessage, "info"); - await expect(() => - introspectAccessToken("accessToken"), - ).rejects.toThrowError(ZitadelConnectionError); + await expect(() => introspectAccessToken("accessToken")).rejects.toThrow( + ZitadelConnectionError, + ); expect(logMessageSpy).toHaveBeenCalledWith( connectionError, diff --git a/test/lib/storage/requestContextualStore.test.ts b/test/lib/storage/requestContextualStore.test.ts index 528f51b6..ec1c8217 100644 --- a/test/lib/storage/requestContextualStore.test.ts +++ b/test/lib/storage/requestContextualStore.test.ts @@ -22,7 +22,7 @@ describe("requestContextualStore", () => { it("throw an error if the requestContextualStore is undefined", () => { expect(() => saveRequestContextData(RequestContextualStoreKey.serviceUserId, "test"), - ).toThrowError("requestContextualStore is undefined"); + ).toThrow("requestContextualStore is undefined"); }); }); @@ -40,7 +40,7 @@ describe("requestContextualStore", () => { it("throw an error if the requestContextualStore is undefined", () => { expect(() => retrieveOptionalRequestContextData(RequestContextualStoreKey.clientIp), - ).toThrowError("requestContextualStore is undefined"); + ).toThrow("requestContextualStore is undefined"); }); }); @@ -61,7 +61,7 @@ describe("requestContextualStore", () => { expect(() => retrieveRequestContextData(RequestContextualStoreKey.clientIp), - ).toThrowError( + ).toThrow( "requestContextualStore does not have any set value for key: clientIp", ); }); @@ -70,7 +70,7 @@ describe("requestContextualStore", () => { it("throw an error if the requestContextualStore is undefined", () => { expect(() => retrieveRequestContextData(RequestContextualStoreKey.clientIp), - ).toThrowError("requestContextualStore is undefined"); + ).toThrow("requestContextualStore is undefined"); }); }); }); diff --git a/test/lib/support/notifySupportAboutFormSubmissionProblem.test.ts b/test/lib/support/notifySupportAboutFormSubmissionProblem.test.ts index cc67b816..c9511378 100644 --- a/test/lib/support/notifySupportAboutFormSubmissionProblem.test.ts +++ b/test/lib/support/notifySupportAboutFormSubmissionProblem.test.ts @@ -67,7 +67,7 @@ Here is my problem
"en", EnvironmentMode.production, ), - ).rejects.toThrowError(customError); + ).rejects.toThrow(customError); expect(logMessageSpy).toHaveBeenCalledWith( customError, diff --git a/test/lib/vault/confirmFormSubmission.test.ts b/test/lib/vault/confirmFormSubmission.test.ts index 0084a81a..e51af1f3 100644 --- a/test/lib/vault/confirmFormSubmission.test.ts +++ b/test/lib/vault/confirmFormSubmission.test.ts @@ -118,7 +118,7 @@ describe("confirmFormSubmission should", () => { "01-08-a571", "620b203c-9836-4000-bf30-1c3bcc26b834", ), - ).rejects.toThrowError(customError); + ).rejects.toThrow(customError); expect(logMessageSpy).toHaveBeenCalledWith( customError, diff --git a/test/lib/vault/getFormSubmission.test.ts b/test/lib/vault/getFormSubmission.test.ts index e96fb3c3..14c4e067 100644 --- a/test/lib/vault/getFormSubmission.test.ts +++ b/test/lib/vault/getFormSubmission.test.ts @@ -48,7 +48,7 @@ describe("getFormSubmission should", () => { await expect(() => getFormSubmission("clzamy5qv0000115huc4bh90m", "01-08-a571"), - ).rejects.toThrowError(customError); + ).rejects.toThrow(customError); expect(logMessageSpy).toHaveBeenCalledWith( customError, diff --git a/test/lib/vault/getFormSubmissionAttachmentDownloadLink.test.ts b/test/lib/vault/getFormSubmissionAttachmentDownloadLink.test.ts index c4eba081..126fd6b8 100644 --- a/test/lib/vault/getFormSubmissionAttachmentDownloadLink.test.ts +++ b/test/lib/vault/getFormSubmissionAttachmentDownloadLink.test.ts @@ -33,7 +33,7 @@ describe("getFormSubmissionAttachmentDownloadLink should", () => { getFormSubmissionAttachmentDownloadLink( "form_attachments/2025-06-09/0c7c3414-05e2-4ae6-a825-683857e4c0c4/image.jpeg", ), - ).rejects.toThrowError(customError); + ).rejects.toThrow(customError); expect(logMessageSpy).toHaveBeenCalledWith( customError, diff --git a/test/lib/vault/getNewFormSubmissions.test.ts b/test/lib/vault/getNewFormSubmissions.test.ts index 518c601b..8b9cdb8e 100644 --- a/test/lib/vault/getNewFormSubmissions.test.ts +++ b/test/lib/vault/getNewFormSubmissions.test.ts @@ -30,10 +30,12 @@ describe("getNewFormSubmissions should", () => { { Name: "ABC", CreatedAt: 123, + Version: 8, }, { Name: "DEF", CreatedAt: 123, + Version: 8, }, ], }); @@ -54,11 +56,13 @@ describe("getNewFormSubmissions should", () => { { Name: "ABC", CreatedAt: 123, + Version: 8, }, ], LastEvaluatedKey: { Name: "ABC", CreatedAt: 123, + Version: 8, }, }) .resolvesOnce({ @@ -66,10 +70,12 @@ describe("getNewFormSubmissions should", () => { { Name: "DEF", CreatedAt: 123, + Version: 8, }, { Name: "GHI", CreatedAt: 123, + Version: 8, }, ], }); @@ -83,6 +89,7 @@ describe("getNewFormSubmissions should", () => { { createdAt: 123, name: "ABC", + version: 8, }, ]); }); @@ -95,15 +102,18 @@ describe("getNewFormSubmissions should", () => { { Name: "ABC", CreatedAt: 123, + Version: 8, }, { Name: "DEF", CreatedAt: 123, + Version: 8, }, ], LastEvaluatedKey: { Name: "DEF", CreatedAt: 123, + Version: 8, }, }) .resolvesOnce({ @@ -111,10 +121,12 @@ describe("getNewFormSubmissions should", () => { { Name: "GHI", CreatedAt: 123, + Version: 8, }, { Name: "JKL", CreatedAt: 123, + Version: 8, }, ], }); @@ -128,18 +140,22 @@ describe("getNewFormSubmissions should", () => { { createdAt: 123, name: "ABC", + version: 8, }, { createdAt: 123, name: "DEF", + version: 8, }, { createdAt: 123, name: "GHI", + version: 8, }, { createdAt: 123, name: "JKL", + version: 8, }, ]); }); @@ -151,7 +167,7 @@ describe("getNewFormSubmissions should", () => { await expect( getNewFormSubmissions("clzamy5qv0000115huc4bh90m", 100), - ).rejects.toThrowError(customError); + ).rejects.toThrow(customError); expect(logMessageSpy).toHaveBeenCalledWith( customError, diff --git a/test/lib/vault/mappers/formSubmission.mapper.test.ts b/test/lib/vault/mappers/formSubmission.mapper.test.ts index 6061eb94..65447827 100644 --- a/test/lib/vault/mappers/formSubmission.mapper.test.ts +++ b/test/lib/vault/mappers/formSubmission.mapper.test.ts @@ -11,20 +11,36 @@ describe("in formSubmission mapper", () => { const newFormSubmission = mapNewFormSubmissionFromDynamoDbResponse({ Name: "18-06-977e7", CreatedAt: 1750263415913, + Version: 8, }); expect(newFormSubmission).toEqual({ name: "18-06-977e7", createdAt: 1750263415913, + version: 8, }); }); + // This test can be deleted once form versioning is well established in Production + it("return proper NewFormSubmission when DynamoDB response does not include a Version attribute (testing backward compatibility with submissions that were produced when form versioning did not exist)", () => { + const newFormSubmission = mapNewFormSubmissionFromDynamoDbResponse({ + Name: "18-06-977e7", + CreatedAt: 1750263415913, + }); + + expect(newFormSubmission).toEqual( + expect.objectContaining({ + version: 1, + }), + ); + }); + it("throw an error when DynamoDB response is incomplete", () => { expect(() => mapNewFormSubmissionFromDynamoDbResponse({ Name: "18-06-977e7", }), - ).toThrowError("Missing key properties in DynamoDB response"); + ).toThrow("Missing key properties in DynamoDB response"); }); it("throw an error when DynamoDB response is invalid", () => { @@ -33,7 +49,7 @@ describe("in formSubmission mapper", () => { Name: "18-06-977e7", CreatedAt: "1750263415913", }), - ).toThrowError("Unexpected type in DynamoDB response"); + ).toThrow("Unexpected type in DynamoDB response"); }); }); @@ -53,6 +69,7 @@ describe("in formSubmission mapper", () => { scanStatus: "NO_THREATS_FOUND", }, ]), + Version: 8, }); expect(formSubmission).toEqual({ @@ -69,6 +86,7 @@ describe("in formSubmission mapper", () => { scanStatus: AttachmentScanStatus.noThreatsFound, }, ], + version: 8, }); }); @@ -88,6 +106,7 @@ describe("in formSubmission mapper", () => { scanStatus: "NO_THREATS_FOUND", }, ]), + Version: 8, }); expect(formSubmission).toEqual({ @@ -105,6 +124,7 @@ describe("in formSubmission mapper", () => { md5: undefined, }, ], + version: 8, }); }); @@ -115,6 +135,7 @@ describe("in formSubmission mapper", () => { ConfirmationCode: "99063d75-9804-4efa-8f4c-605b4ba6ad95", FormSubmission: '{"1":"Test response"}', FormSubmissionHash: "5981e9cd2a2f0032e9b8c99eb7bb8841", + Version: 8, }); expect(formSubmission).toEqual({ @@ -124,9 +145,27 @@ describe("in formSubmission mapper", () => { answers: '{"1":"Test response"}', checksum: "5981e9cd2a2f0032e9b8c99eb7bb8841", attachments: [], + version: 8, }); }); + // This test can be deleted once form versioning is well established in Production + it("return proper FormSubmission when DynamoDB response does not include a Version attribute (testing backward compatibility with submissions that were produced when form versioning did not exist)", () => { + const formSubmission = mapFormSubmissionFromDynamoDbResponse({ + CreatedAt: 1750263415913, + "Status#CreatedAt": "New#1750263415913", + ConfirmationCode: "99063d75-9804-4efa-8f4c-605b4ba6ad95", + FormSubmission: '{"1":"Test response"}', + FormSubmissionHash: "5981e9cd2a2f0032e9b8c99eb7bb8841", + }); + + expect(formSubmission).toEqual( + expect.objectContaining({ + version: 1, + }), + ); + }); + it("throw an error when SubmissionAttachments in DynamoDB response is present but invalid", () => { expect(() => mapFormSubmissionFromDynamoDbResponse({ @@ -137,7 +176,7 @@ describe("in formSubmission mapper", () => { FormSubmissionHash: "5981e9cd2a2f0032e9b8c99eb7bb8841", SubmissionAttachments: [], }), - ).toThrowError("Unexpected type in DynamoDB response"); + ).toThrow("Unexpected type in DynamoDB response"); }); it("throw an error when DynamoDB response is incomplete", () => { @@ -148,7 +187,7 @@ describe("in formSubmission mapper", () => { ConfirmationCode: "99063d75-9804-4efa-8f4c-605b4ba6ad95", FormSubmissionHash: "5981e9cd2a2f0032e9b8c99eb7bb8841", }), - ).toThrowError("Missing key properties in DynamoDB response"); + ).toThrow("Missing key properties in DynamoDB response"); }); it("throw an error when DynamoDB response is invalid", () => { @@ -160,7 +199,7 @@ describe("in formSubmission mapper", () => { FormSubmission: '{"1":"Test response"}', FormSubmissionHash: "5981e9cd2a2f0032e9b8c99eb7bb8841", }), - ).toThrowError("Unexpected type in DynamoDB response"); + ).toThrow("Unexpected type in DynamoDB response"); }); }); }); diff --git a/test/lib/vault/reportProblemWithFormSubmission.test.ts b/test/lib/vault/reportProblemWithFormSubmission.test.ts index 669f50fe..0f8a9156 100644 --- a/test/lib/vault/reportProblemWithFormSubmission.test.ts +++ b/test/lib/vault/reportProblemWithFormSubmission.test.ts @@ -95,7 +95,7 @@ describe("reportProblemWithFormSubmission should", () => { "clzamy5qv0000115huc4bh90m", "01-08-a571", ), - ).rejects.toThrowError(customError); + ).rejects.toThrow(customError); expect(logMessageSpy).toHaveBeenCalledWith( customError, diff --git a/test/mocks/dynamodb.ts b/test/mocks/dynamodb.ts index 8b51c463..238d522c 100644 --- a/test/mocks/dynamodb.ts +++ b/test/mocks/dynamodb.ts @@ -10,5 +10,6 @@ export function buildMockedVaultItem( ConfirmationCode: confirmationCode, FormSubmission: '{"1":"Test response"}', FormSubmissionHash: "5981e9cd2a2f0032e9b8c99eb7bb8841", + Version: 8, }; } diff --git a/test/operations/retrieveNewSubmissions.v1.test.ts b/test/operations/retrieveNewSubmissions.v1.test.ts index 39ca119d..5b979814 100644 --- a/test/operations/retrieveNewSubmissions.v1.test.ts +++ b/test/operations/retrieveNewSubmissions.v1.test.ts @@ -53,6 +53,7 @@ describe("retrieveNewSubmissionsOperation handler should", () => { { name: "ABC", createdAt: 123, + version: 8, }, ]); @@ -66,6 +67,7 @@ describe("retrieveNewSubmissionsOperation handler should", () => { { createdAt: 123, name: "ABC", + version: 8, }, ]); expect(auditLogSpy).toHaveBeenNthCalledWith(1, { diff --git a/test/operations/retrieveSubmission.v1.test.ts b/test/operations/retrieveSubmission.v1.test.ts index 08c0634a..b0558ba6 100644 --- a/test/operations/retrieveSubmission.v1.test.ts +++ b/test/operations/retrieveSubmission.v1.test.ts @@ -60,6 +60,7 @@ describe("retrieveSubmissionOperation handler should", () => { answers: "", checksum: "", attachments: [], + version: 8, }); getPublicKeyMock.mockResolvedValueOnce("publicKey"); encryptResponseMock.mockReturnValueOnce({ @@ -91,6 +92,7 @@ describe("retrieveSubmissionOperation handler should", () => { confirmationCode: "", answers: "", checksum: "", + version: 8, }), ); @@ -117,6 +119,7 @@ describe("retrieveSubmissionOperation handler should", () => { scanStatus: AttachmentScanStatus.noThreatsFound, }, ], + version: 8, }); getFormSubmissionAttachmentDownloadLinkMock.mockResolvedValueOnce( "https://download-link", @@ -160,6 +163,7 @@ describe("retrieveSubmissionOperation handler should", () => { isPotentiallyMalicious: false, }, ], + version: 8, }), ); @@ -224,6 +228,7 @@ describe("retrieveSubmissionOperation handler should", () => { scanStatus: attachmentScanStatus, }, ], + version: 8, }); getFormSubmissionAttachmentDownloadLinkMock.mockResolvedValueOnce( "https://download-link", @@ -253,6 +258,7 @@ describe("retrieveSubmissionOperation handler should", () => { isPotentiallyMalicious, }, ], + version: 8, }), ); }, @@ -274,6 +280,7 @@ describe("retrieveSubmissionOperation handler should", () => { scanStatus: AttachmentScanStatus.noThreatsFound, }, ], + version: 8, }); getFormSubmissionAttachmentDownloadLinkMock.mockRejectedValueOnce( new Error("custom error"), @@ -300,6 +307,7 @@ describe("retrieveSubmissionOperation handler should", () => { answers: "", checksum: "", attachments: [], + version: 8, }); getPublicKeyMock.mockImplementationOnce(() => { throw new Error("custom error"); diff --git a/test/operations/retrieveTemplate.v1.test.ts b/test/operations/retrieveTemplate.v1.test.ts index c1b13bcb..28c975cb 100644 --- a/test/operations/retrieveTemplate.v1.test.ts +++ b/test/operations/retrieveTemplate.v1.test.ts @@ -17,21 +17,56 @@ vi.mocked(retrieveRequestContextData).mockReturnValue( ); describe("retrieveTemplateOperation handler should", () => { - const requestMock = getMockReq({ - params: { - formId: "clzsn6tao000611j50dexeob0", - }, - serviceUserId: "clzsn6tao000611j50dexeob0", - }); + let requestMock = getMockReq(); const { res: responseMock, next: nextMock, clearMockRes } = getMockRes(); beforeEach(() => { vi.clearAllMocks(); clearMockRes(); + + requestMock = getMockReq({ + params: { + formId: "clzsn6tao000611j50dexeob0", + }, + serviceUserId: "clzsn6tao000611j50dexeob0", + }); + }); + + it("respond with success when form template does exist", async () => { + getFormTemplateMock.mockResolvedValueOnce({ + jsonConfig: { + elements: [ + { + id: 1, + type: "textField", + }, + ], + }, + }); + + await retrieveTemplateOperationV1.handler( + requestMock, + responseMock, + nextMock, + ); + + expect(responseMock.json).toHaveBeenCalledWith({ + elements: [ + { + id: 1, + type: "textField", + }, + ], + }); + expect(auditLogSpy).toHaveBeenNthCalledWith(1, { + userId: "clzsn6tao000611j50dexeob0", + subject: { type: "Form", id: "clzsn6tao000611j50dexeob0" }, + event: "RetrieveTemplate", + }); }); - it("respond with success when form submission does exist", async () => { + it("respond with success when specific version of a form template does exist", async () => { getFormTemplateMock.mockResolvedValueOnce({ jsonConfig: { elements: [ @@ -42,6 +77,9 @@ describe("retrieveTemplateOperation handler should", () => { ], }, }); + requestMock.query = { + version: "8", + }; await retrieveTemplateOperationV1.handler( requestMock, @@ -79,6 +117,24 @@ describe("retrieveTemplateOperation handler should", () => { }); }); + it("respond with error when 'version' query parameter is not a number", async () => { + getFormTemplateMock.mockRejectedValueOnce(new Error("custom error")); + requestMock.query = { + version: "hello", + }; + + await retrieveTemplateOperationV1.handler( + requestMock, + responseMock, + nextMock, + ); + + expect(responseMock.status).toHaveBeenCalledWith(400); + expect(responseMock.json).toHaveBeenCalledWith({ + error: "URL parameter 'version' should be a number", + }); + }); + it("pass error to next function when processing fails due to internal error", async () => { getFormTemplateMock.mockRejectedValueOnce(new Error("custom error")); @@ -90,7 +146,7 @@ describe("retrieveTemplateOperation handler should", () => { expect(nextMock).toHaveBeenCalledWith( new Error( - "[operation] Internal error while retrieving template. Params: formId = clzsn6tao000611j50dexeob0", + "[operation] Internal error while retrieving template. Params: formId = clzsn6tao000611j50dexeob0 ; version = undefined", ), ); }); diff --git a/vitest.config.mts b/vitest.config.ts similarity index 74% rename from vitest.config.mts rename to vitest.config.ts index a8986e00..f94ce412 100644 --- a/vitest.config.mts +++ b/vitest.config.ts @@ -1,10 +1,12 @@ -import tsconfigPaths from "vite-tsconfig-paths"; import { defineConfig } from "vitest/config"; // biome-ignore lint/style/noDefaultExport: export default defineConfig({ - plugins: [tsconfigPaths()], + resolve: { + tsconfigPaths: true, + }, test: { + silent: "passed-only", include: ["test/**/*.test.ts"], setupFiles: "vitest-setup.ts", },