Repository: unjs/h3
Pull request #762 (2024-05-27 09:32:06)

docs(error-handling): add string vs object errors and update `createError` jsdoc
### 🔗 Linked issue

#761

### ❓ Type of change

- [x] 📖 Documentation (updates to the documentation, readme, or JSdoc annotations)
- [ ] 🐞 Bug fix (a non-breaking change that fixes an issue)
- [ ] 👌 Enhancement (improving an existing functionality like performance)
- [ ] ✨ New feature (a non-breaking change that adds functionality)
- [ ] 🧹 Chore (updates to the build process or auxiliary tools and libraries)
- [ ] ⚠️ Breaking change (fix or feature that would cause existing functionality to change)

### 📚 Description

I have always been somewhat confused on how to initialize `createError`, either with a string or an object. Similarly, it was unclear at first which one to use to pass data to the client in an error thrown from the server. 
<!-- Describe your changes in detail -->
<!-- Why is this change required? What problem does it solve? -->
<!-- If it resolves an open issue, please link to the issue here. For example "Resolves #1337" -->

### 📝 Checklist

- [x] I have linked an issue or discussion.
- [x] I have updated the documentation accordingly.

### 🗒️ Note

This is my first-ever open source contribution so I may not have configured the issue/pr or the contribution itself as needed. I'd love to hear if that is the case and I'll fix whatever is missing.

And just for context: @pi0 this is the pr I am opening per your suggestion over Twitter. Thanks for the nudge!


Patch:
diff --git a/docs/1.guide/2.event-handler.md b/docs/1.guide/2.event-handler.md
index b189f8b..f37b98c 100644
--- a/docs/1.guide/2.event-handler.md
+++ b/docs/1.guide/2.event-handler.md
@@ -52,7 +52,7 @@ defineEventHandler({
 Values returned from event handlers are automatically converted to responses. It can be:
 
 - JSON serializable value. If returning a JSON object or serializable value, it will be stringified and sent with default `application/json` content-type.
-- `string`: Sent as-is using default `application/html` content-type.
+- `string`: Sent as-is using default `text/html` content-type.
 - `null`: h3 with end response with `204 - No Content` status code.
 - [Web `ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) or [node `Readable`](https://nodejs.org/api/stream.html#readable-streams)
 - [Web `ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) or [node `Buffer`](https://nodejs.org/api/buffer.html#buffer)
@@ -80,7 +80,7 @@ app.use(
 
 ```js
 app.use(
-  defineEventHandlers(async (event) => {
+  defineEventHandler(async (event) => {
     return new Promise((resolve) => {
       setTimeout(() => {
         resolve({ url: event.node.req.url });
@@ -98,11 +98,13 @@ You can easily control the error returned by using the `createError` utility.
 import { createError, defineEventHandler } from "h3";
 
 app.use(
-  "/hello",
+  "/validate",
   defineEventHandler((event) => {
     throw createError({
       status: 400,
-      message: "An error occurred",
+      statusMessage: "Bad Request",
+      message: "Invalid user input",
+      data: { field: "email" }
     });
   }),
 );
@@ -117,6 +119,25 @@ This will end the request with `400 - Bad Request` status code and the following
 }
 ```
 
+### String vs. Object Errors
+
+When creating an error using `createError`, you also have the option to pass a string instead of an object. Doing so will set the `message` property of the error. In this case, the `statusCode` will default to `500`.
+
+```js
+import { createError, defineEventHandler } from "h3";
+
+app.use(
+  "/hello",
+  defineEventHandler((event) => {
+    throw createError("An error occurred");
+  }),
+);
+```
+
+> [!TIP]
+> Typically, `message` contains a brief, human-readable description of the error, while `statusMessage` is specific to HTTP responses and describes the status text related to the response status code.
+> In a client-server context, using a short `statusMessage` is recommended because it can be accessed on the client side. Otherwise, a `message` passed to `createError` on the server will not propagate to the client (you can use `data` instead). Consider avoiding to put dynamic user input to the message to avoid potential security issues.
+
 ### Internal errors
 
 If during calling an event handler an error with `new Error()` will be thrown (without `createError`), h3 will automatically catch as a [`500 - Internal Server Error`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) status response considering it an unhandled error.
diff --git a/docs/1.guide/4.event.md b/docs/1.guide/4.event.md
index 04642e0..9b2968f 100644
--- a/docs/1.guide/4.event.md
+++ b/docs/1.guide/4.event.md
@@ -15,11 +15,11 @@ An event is passed through all the lifecycle hooks and composable utils to use i
 ```js
 import { defineEventHandler, getQuery, readBody } from "h3";
 
-app.use(defineEventHandler((event) => {
+app.use(defineEventHandler(async (event) => {
   // Log event. `.toString()` stringifies to a simple string like `[GET] /<path>`
   console.log(`Request: ${event.toString()}`);
 
-  // Parse query parms
+  // Parse query params
   const query = getQuery(event)
 
   // Try to read request body
@@ -101,18 +101,18 @@ You must craft a response using the [`Response`](https://developer.mozilla.org/e
 > Prefer explicit `return` over `respondWith` as best practice.
 
 > [!IMPORTANT]
-> A `responseWith` call will **always** take precedence over the returned value, from current and next event handlers. If there is no returned value, the request will continue until the end of the stack runner.
+> A `respondWith` call will **always** take precedence over the returned value, from current and next event handlers. If there is no returned value, the request will continue until the end of the stack runner.
 
 **Example:**
 
 ```js
-defineEventHandler((event) => {
+defineEventHandler(async (event) => {
   await event.respondWith(new Response("Hello World"));
   return "..."; // DOES NOT WORKS
 });
 
 app.use(
-  defineEventHandler((event) => {
+  defineEventHandler(async (event) => {
     await event.respondWith(new Response("Hello World"));
     return "..."; // DOES NOT WORK
   }),
diff --git a/docs/2.utils/2.response.md b/docs/2.utils/2.response.md
index 70cc375..6f971a2 100644
--- a/docs/2.utils/2.response.md
+++ b/docs/2.utils/2.response.md
@@ -254,7 +254,7 @@ export default defineEventHandler((event) => {
 });
 ```
 
-### `setHeaders(event)`
+### `setHeaders(event, headers)`
 
 Set the response headers.
 
@@ -281,7 +281,7 @@ export default defineEventHandler((event) => {
 });
 ```
 
-### `setResponseHeaders(event)`
+### `setResponseHeaders(event, headers)`
 
 Set the response headers.
 
diff --git a/docs/2.utils/98.advanced.md b/docs/2.utils/98.advanced.md
index 7ea3253..7db3d84 100644
--- a/docs/2.utils/98.advanced.md
+++ b/docs/2.utils/98.advanced.md
@@ -151,6 +151,28 @@ If the incoming request is a CORS preflight request, it will append the CORS pre
 
 If return value is `true`, the request is handled and no further action is needed.
 
+**Example:**
+
+```ts
+const app = createApp();
+const router = createRouter();
+router.use('/',
+  defineEventHandler(async (event) => {
+      const didHandleCors = handleCors(event, {
+        origin: '*',
+        preflight: {
+         statusCode: 204,
+        },
+     methods: '*',
+   });
+   if (didHandleCors) {
+     return;
+   }
+   // Your code here
+ })
+);
+```
+
 ### `isCorsOriginAllowed(origin, options)`
 
 Check if the incoming request is a CORS request.
diff --git a/docs/3.adapters/3.plain.md b/docs/3.adapters/3.plain.md
index bbc30af..965014e 100644
--- a/docs/3.adapters/3.plain.md
+++ b/docs/3.adapters/3.plain.md
@@ -39,7 +39,7 @@ You can test adapter using any JavaScript runtime.
 ```js [plain.test.mjs]
 import { handler } from "./plain.mjs";
 
-const response = await handlerRequest({
+const response = await handler({
   method: "GET",
   path: "/",
   headers: {
diff --git a/docs/4.examples/from-expressjs-to-h3.md b/docs/4.examples/from-expressjs-to-h3.md
index 5de7abb..6d7bebb 100644
--- a/docs/4.examples/from-expressjs-to-h3.md
+++ b/docs/4.examples/from-expressjs-to-h3.md
@@ -423,7 +423,7 @@ import { defineEventHandler, createApp, fromNodeMiddleware } from "h3";
 
 export const app = createApp();
 
-app.use(fromNodeMiddleware(morgan()));
+app.use(fromNodeMiddleware(morgan("combined")));
 
 app.use(
   "/",
diff --git a/examples/cors.ts b/examples/cors.ts
new file mode 100644
index 0000000..e64b3ba
--- /dev/null
+++ b/examples/cors.ts
@@ -0,0 +1,24 @@
+import { createApp, createRouter, defineEventHandler, handleCors } from "h3";
+
+export const app = createApp();
+
+const corsHandler = defineEventHandler((event) => {
+  if (
+    handleCors(event, {
+      origin: "*",
+    })
+  ) {
+    return;
+  }
+});
+
+app.use(corsHandler);
+
+const router = createRouter().get(
+  "/hello",
+  defineEventHandler(() => {
+    return "world";
+  }),
+);
+
+app.use(router);
diff --git a/package.json b/package.json
index a32d487..6ccb9c5 100644
--- a/package.json
+++ b/package.json
@@ -62,11 +62,12 @@
     "prettier": "^3.2.5",
     "react": "^18.3.1",
     "react-dom": "^18.3.1",
-    "supertest": "^6.3.4",
+    "supertest": "^7.0.0",
     "typescript": "^5.4.5",
     "unbuild": "^2.0.0",
+    "undici": "^6.19.2",
     "vitest": "^1.5.2",
     "zod": "^3.23.4"
   },
-  "packageManager": "pnpm@9.0.6"
+  "packageManager": "pnpm@9.3.0"
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b5072cf..7d55a34 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -22,7 +22,7 @@ importers:
         version: 2.0.3
       iron-webcrypto:
         specifier: ^1.1.1
-        version: 1.1.1
+        version: 1.2.1
       ohash:
         specifier: ^1.1.3
         version: 1.1.3
@@ -47,31 +47,31 @@ importers:
         version: 4.17.21
       '@types/node':
         specifier: ^20.12.7
-        version: 20.12.7
+        version: 20.14.2
       '@types/supertest':
         specifier: ^6.0.2
         version: 6.0.2
       '@vitest/coverage-v8':
         specifier: ^1.5.2
-        version: 1.5.2(vitest@1.5.2(@types/node@20.12.7))
+        version: 1.6.0(vitest@1.6.0(@types/node@20.14.2))
       autocannon:
         specifier: ^7.15.0
         version: 7.15.0
       automd:
         specifier: ^0.3.7
-        version: 0.3.7
+        version: 0.3.7(magicast@0.3.4)
       changelogen:
         specifier: ^0.5.5
-        version: 0.5.5
+        version: 0.5.5(magicast@0.3.4)
       connect:
         specifier: ^3.7.0
         version: 3.7.0
       eslint:
         specifier: ^9.1.1
-        version: 9.1.1
+        version: 9.5.0
       eslint-config-unjs:
         specifier: ^0.3.0-rc.6
-        version: 0.3.0-rc.6(eslint@9.1.1)(typescript@5.4.5)
+        version: 0.3.2(eslint@9.5.0)(typescript@5.4.5)
       express:
         specifier: ^4.19.2
         version: 4.19.2
@@ -80,7 +80,7 @@ importers:
         version: 7.1.0
       jiti:
         specifier: ^1.21.0
-        version: 1.21.0
+        version: 1.21.6
       listhen:
         specifier: ^1.7.2
         version: 1.7.2
@@ -89,7 +89,7 @@ importers:
         version: 1.6.4
       prettier:
         specifier: ^3.2.5
-        version: 3.2.5
+        version: 3.3.2
       react:
         specifier: ^18.3.1
         version: 18.3.1
@@ -97,20 +97,23 @@ importers:
         specifier: ^18.3.1
         version: 18.3.1(react@18.3.1)
       supertest:
-        specifier: ^6.3.4
-        version: 6.3.4
+        specifier: ^7.0.0
+        version: 7.0.0
       typescript:
         specifier: ^5.4.5
         version: 5.4.5
       unbuild:
         specifier: ^2.0.0
         version: 2.0.0(typescript@5.4.5)
+      undici:
+        specifier: ^6.19.2
+        version: 6.19.2
       vitest:
         specifier: ^1.5.2
-        version: 1.5.2(@types/node@20.12.7)
+        version: 1.6.0(@types/node@20.14.2)
       zod:
         specifier: ^3.23.4
-        version: 3.23.4
+        version: 3.23.8
 
   examples:
     dependencies:
@@ -140,10 +143,6 @@ packages:
     engines: {node: '>=8.5.0'}
     hasBin: true
 
-  '@aashutoshrathi/word-wrap@1.2.6':
-    resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
-    engines: {node: '>=0.10.0'}
-
   '@ampproject/remapping@2.3.0':
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
@@ -151,99 +150,99 @@ packages:
   '@assemblyscript/loader@0.19.23':
     resolution: {integrity: sha512-ulkCYfFbYj01ie1MDOyxv2F6SpRN1TOj7fQxbP07D6HmeR+gr2JLSmINKjga2emB+b1L2KGrFKBTc+e00p54nw==}
 
-  '@babel/code-frame@7.24.2':
-    resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==}
+  '@babel/code-frame@7.24.7':
+    resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/compat-data@7.24.4':
-    resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==}
+  '@babel/compat-data@7.24.7':
+    resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/core@7.24.4':
-    resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==}
+  '@babel/core@7.24.7':
+    resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/generator@7.24.4':
-    resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==}
+  '@babel/generator@7.24.7':
+    resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-compilation-targets@7.23.6':
-    resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==}
+  '@babel/helper-compilation-targets@7.24.7':
+    resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-environment-visitor@7.22.20':
-    resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
+  '@babel/helper-environment-visitor@7.24.7':
+    resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-function-name@7.23.0':
-    resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
+  '@babel/helper-function-name@7.24.7':
+    resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-hoist-variables@7.22.5':
-    resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
+  '@babel/helper-hoist-variables@7.24.7':
+    resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-module-imports@7.24.3':
-    resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==}
+  '@babel/helper-module-imports@7.24.7':
+    resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-module-transforms@7.23.3':
-    resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
+  '@babel/helper-module-transforms@7.24.7':
+    resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
 
-  '@babel/helper-simple-access@7.22.5':
-    resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
+  '@babel/helper-simple-access@7.24.7':
+    resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-split-export-declaration@7.22.6':
-    resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
+  '@babel/helper-split-export-declaration@7.24.7':
+    resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-string-parser@7.24.1':
-    resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==}
+  '@babel/helper-string-parser@7.24.7':
+    resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-validator-identifier@7.22.20':
-    resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+  '@babel/helper-validator-identifier@7.24.7':
+    resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-validator-option@7.23.5':
-    resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==}
+  '@babel/helper-validator-option@7.24.7':
+    resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helpers@7.24.4':
-    resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==}
+  '@babel/helpers@7.24.7':
+    resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/highlight@7.24.2':
-    resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==}
+  '@babel/highlight@7.24.7':
+    resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/parser@7.24.4':
-    resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==}
+  '@babel/parser@7.24.7':
+    resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==}
     engines: {node: '>=6.0.0'}
     hasBin: true
 
-  '@babel/runtime@7.24.4':
-    resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==}
+  '@babel/runtime@7.24.7':
+    resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/standalone@7.24.4':
-    resolution: {integrity: sha512-V4uqWeedadiuiCx5P5OHYJZ1PehdMpcBccNCEptKFGPiZIY3FI5f2ClxUl4r5wZ5U+ohcQ+4KW6jX2K6xXzq4Q==}
+  '@babel/standalone@7.24.7':
+    resolution: {integrity: sha512-QRIRMJ2KTeN+vt4l9OjYlxDVXEpcor1Z6V7OeYzeBOw6Q8ew9oMTHjzTx8s6ClsZO7wVf6JgTRutihatN6K0yA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/template@7.24.0':
-    resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==}
+  '@babel/template@7.24.7':
+    resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/traverse@7.24.1':
-    resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==}
+  '@babel/traverse@7.24.7':
+    resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/types@7.24.0':
-    resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
+  '@babel/types@7.24.7':
+    resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==}
     engines: {node: '>=6.9.0'}
 
   '@bcoe/v8-coverage@0.2.3':
@@ -265,6 +264,12 @@ packages:
     cpu: [ppc64]
     os: [aix]
 
+  '@esbuild/aix-ppc64@0.21.5':
+    resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [aix]
+
   '@esbuild/android-arm64@0.19.12':
     resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
     engines: {node: '>=12'}
@@ -277,6 +282,12 @@ packages:
     cpu: [arm64]
     os: [android]
 
+  '@esbuild/android-arm64@0.21.5':
+    resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+
   '@esbuild/android-arm@0.19.12':
     resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
     engines: {node: '>=12'}
@@ -289,6 +300,12 @@ packages:
     cpu: [arm]
     os: [android]
 
+  '@esbuild/android-arm@0.21.5':
+    resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+
   '@esbuild/android-x64@0.19.12':
     resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
     engines: {node: '>=12'}
@@ -301,6 +318,12 @@ packages:
     cpu: [x64]
     os: [android]
 
+  '@esbuild/android-x64@0.21.5':
+    resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+
   '@esbuild/darwin-arm64@0.19.12':
     resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
     engines: {node: '>=12'}
@@ -313,6 +336,12 @@ packages:
     cpu: [arm64]
     os: [darwin]
 
+  '@esbuild/darwin-arm64@0.21.5':
+    resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+
   '@esbuild/darwin-x64@0.19.12':
     resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
     engines: {node: '>=12'}
@@ -325,6 +354,12 @@ packages:
     cpu: [x64]
     os: [darwin]
 
+  '@esbuild/darwin-x64@0.21.5':
+    resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+
   '@esbuild/freebsd-arm64@0.19.12':
     resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
     engines: {node: '>=12'}
@@ -337,6 +372,12 @@ packages:
     cpu: [arm64]
     os: [freebsd]
 
+  '@esbuild/freebsd-arm64@0.21.5':
+    resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+
   '@esbuild/freebsd-x64@0.19.12':
     resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
     engines: {node: '>=12'}
@@ -349,6 +390,12 @@ packages:
     cpu: [x64]
     os: [freebsd]
 
+  '@esbuild/freebsd-x64@0.21.5':
+    resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+
   '@esbuild/linux-arm64@0.19.12':
     resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
     engines: {node: '>=12'}
@@ -361,6 +408,12 @@ packages:
     cpu: [arm64]
     os: [linux]
 
+  '@esbuild/linux-arm64@0.21.5':
+    resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+
   '@esbuild/linux-arm@0.19.12':
     resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
     engines: {node: '>=12'}
@@ -373,6 +426,12 @@ packages:
     cpu: [arm]
     os: [linux]
 
+  '@esbuild/linux-arm@0.21.5':
+    resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+
   '@esbuild/linux-ia32@0.19.12':
     resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
     engines: {node: '>=12'}
@@ -385,6 +444,12 @@ packages:
     cpu: [ia32]
     os: [linux]
 
+  '@esbuild/linux-ia32@0.21.5':
+    resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+
   '@esbuild/linux-loong64@0.19.12':
     resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
     engines: {node: '>=12'}
@@ -397,6 +462,12 @@ packages:
     cpu: [loong64]
     os: [linux]
 
+  '@esbuild/linux-loong64@0.21.5':
+    resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+
   '@esbuild/linux-mips64el@0.19.12':
     resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
     engines: {node: '>=12'}
@@ -409,6 +480,12 @@ packages:
     cpu: [mips64el]
     os: [linux]
 
+  '@esbuild/linux-mips64el@0.21.5':
+    resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+
   '@esbuild/linux-ppc64@0.19.12':
     resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
     engines: {node: '>=12'}
@@ -421,6 +498,12 @@ packages:
     cpu: [ppc64]
     os: [linux]
 
+  '@esbuild/linux-ppc64@0.21.5':
+    resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+
   '@esbuild/linux-riscv64@0.19.12':
     resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
     engines: {node: '>=12'}
@@ -433,6 +516,12 @@ packages:
     cpu: [riscv64]
     os: [linux]
 
+  '@esbuild/linux-riscv64@0.21.5':
+    resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+
   '@esbuild/linux-s390x@0.19.12':
     resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
     engines: {node: '>=12'}
@@ -445,6 +534,12 @@ packages:
     cpu: [s390x]
     os: [linux]
 
+  '@esbuild/linux-s390x@0.21.5':
+    resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+
   '@esbuild/linux-x64@0.19.12':
     resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
     engines: {node: '>=12'}
@@ -457,6 +552,12 @@ packages:
     cpu: [x64]
     os: [linux]
 
+  '@esbuild/linux-x64@0.21.5':
+    resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+
   '@esbuild/netbsd-x64@0.19.12':
     resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
     engines: {node: '>=12'}
@@ -469,6 +570,12 @@ packages:
     cpu: [x64]
     os: [netbsd]
 
+  '@esbuild/netbsd-x64@0.21.5':
+    resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+
   '@esbuild/openbsd-x64@0.19.12':
     resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
     engines: {node: '>=12'}
@@ -481,6 +588,12 @@ packages:
     cpu: [x64]
     os: [openbsd]
 
+  '@esbuild/openbsd-x64@0.21.5':
+    resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+
   '@esbuild/sunos-x64@0.19.12':
     resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
     engines: {node: '>=12'}
@@ -493,6 +606,12 @@ packages:
     cpu: [x64]
     os: [sunos]
 
+  '@esbuild/sunos-x64@0.21.5':
+    resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+
   '@esbuild/win32-arm64@0.19.12':
     resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
     engines: {node: '>=12'}
@@ -505,6 +624,12 @@ packages:
     cpu: [arm64]
     os: [win32]
 
+  '@esbuild/win32-arm64@0.21.5':
+    resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+
   '@esbuild/win32-ia32@0.19.12':
     resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
     engines: {node: '>=12'}
@@ -517,6 +642,12 @@ packages:
     cpu: [ia32]
     os: [win32]
 
+  '@esbuild/win32-ia32@0.21.5':
+    resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+
   '@esbuild/win32-x64@0.19.12':
     resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
     engines: {node: '>=12'}
@@ -529,45 +660,44 @@ packages:
     cpu: [x64]
     os: [win32]
 
+  '@esbuild/win32-x64@0.21.5':
+    resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+
   '@eslint-community/eslint-utils@4.4.0':
     resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
 
-  '@eslint-community/regexpp@4.10.0':
-    resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
+  '@eslint-community/regexpp@4.10.1':
+    resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==}
     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
 
-  '@eslint/eslintrc@2.1.4':
-    resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
-  '@eslint/eslintrc@3.0.2':
-    resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==}
+  '@eslint/config-array@0.16.0':
+    resolution: {integrity: sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@eslint/js@9.0.0':
-    resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==}
+  '@eslint/eslintrc@3.1.0':
+    resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@eslint/js@9.1.1':
-    resolution: {integrity: sha512-5WoDz3Y19Bg2BnErkZTp0en+c/i9PvgFS7MBe1+m60HjFr0hrphlAGp4yzI7pxpt4xShln4ZyYp4neJm8hmOkQ==}
+  '@eslint/js@9.5.0':
+    resolution: {integrity: sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@humanwhocodes/config-array@0.13.0':
-    resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
-    engines: {node: '>=10.10.0'}
+  '@eslint/object-schema@2.1.4':
+    resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@humanwhocodes/module-importer@1.0.1':
     resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
     engines: {node: '>=12.22'}
 
-  '@humanwhocodes/object-schema@2.0.3':
-    resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
-
-  '@humanwhocodes/retry@0.2.3':
-    resolution: {integrity: sha512-X38nUbachlb01YMlvPFojKoiXq+LzZvuSce70KPMPdeM1Rj03k4dR7lDslhbqXn3Ang4EU3+EAmwEAsbrjHW3g==}
+  '@humanwhocodes/retry@0.3.0':
+    resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==}
     engines: {node: '>=18.18'}
 
   '@istanbuljs/schema@0.1.3':
@@ -699,8 +829,8 @@ packages:
       rollup:
         optional: true
 
-  '@rollup/plugin-commonjs@25.0.7':
-    resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==}
+  '@rollup/plugin-commonjs@25.0.8':
+    resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
       rollup: ^2.68.0||^3.0.0||^4.0.0
@@ -726,8 +856,8 @@ packages:
       rollup:
         optional: true
 
-  '@rollup/plugin-replace@5.0.5':
-    resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==}
+  '@rollup/plugin-replace@5.0.7':
+    resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
       rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
@@ -744,83 +874,83 @@ packages:
       rollup:
         optional: true
 
-  '@rollup/rollup-android-arm-eabi@4.14.3':
-    resolution: {integrity: sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==}
+  '@rollup/rollup-android-arm-eabi@4.18.0':
+    resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==}
     cpu: [arm]
     os: [android]
 
-  '@rollup/rollup-android-arm64@4.14.3':
-    resolution: {integrity: sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==}
+  '@rollup/rollup-android-arm64@4.18.0':
+    resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==}
     cpu: [arm64]
     os: [android]
 
-  '@rollup/rollup-darwin-arm64@4.14.3':
-    resolution: {integrity: sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==}
+  '@rollup/rollup-darwin-arm64@4.18.0':
+    resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==}
     cpu: [arm64]
     os: [darwin]
 
-  '@rollup/rollup-darwin-x64@4.14.3':
-    resolution: {integrity: sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==}
+  '@rollup/rollup-darwin-x64@4.18.0':
+    resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==}
     cpu: [x64]
     os: [darwin]
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.14.3':
-    resolution: {integrity: sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==}
+  '@rollup/rollup-linux-arm-gnueabihf@4.18.0':
+    resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm-musleabihf@4.14.3':
-    resolution: {integrity: sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==}
+  '@rollup/rollup-linux-arm-musleabihf@4.18.0':
+    resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-gnu@4.14.3':
-    resolution: {integrity: sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==}
+  '@rollup/rollup-linux-arm64-gnu@4.18.0':
+    resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-musl@4.14.3':
-    resolution: {integrity: sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==}
+  '@rollup/rollup-linux-arm64-musl@4.18.0':
+    resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.14.3':
-    resolution: {integrity: sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==}
+  '@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
+    resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==}
     cpu: [ppc64]
     os: [linux]
 
-  '@rollup/rollup-linux-riscv64-gnu@4.14.3':
-    resolution: {integrity: sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==}
+  '@rollup/rollup-linux-riscv64-gnu@4.18.0':
+    resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==}
     cpu: [riscv64]
     os: [linux]
 
-  '@rollup/rollup-linux-s390x-gnu@4.14.3':
-    resolution: {integrity: sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==}
+  '@rollup/rollup-linux-s390x-gnu@4.18.0':
+    resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==}
     cpu: [s390x]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-gnu@4.14.3':
-    resolution: {integrity: sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==}
+  '@rollup/rollup-linux-x64-gnu@4.18.0':
+    resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-musl@4.14.3':
-    resolution: {integrity: sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==}
+  '@rollup/rollup-linux-x64-musl@4.18.0':
+    resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-win32-arm64-msvc@4.14.3':
-    resolution: {integrity: sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==}
+  '@rollup/rollup-win32-arm64-msvc@4.18.0':
+    resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==}
     cpu: [arm64]
     os: [win32]
 
-  '@rollup/rollup-win32-ia32-msvc@4.14.3':
-    resolution: {integrity: sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==}
+  '@rollup/rollup-win32-ia32-msvc@4.18.0':
+    resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==}
     cpu: [ia32]
     os: [win32]
 
-  '@rollup/rollup-win32-x64-msvc@4.14.3':
-    resolution: {integrity: sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==}
+  '@rollup/rollup-win32-x64-msvc@4.18.0':
+    resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==}
     cpu: [x64]
     os: [win32]
 
@@ -847,8 +977,8 @@ packages:
   '@types/estree@1.0.5':
     resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
 
-  '@types/express-serve-static-core@4.19.0':
-    resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==}
+  '@types/express-serve-static-core@4.19.3':
+    resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==}
 
   '@types/express@4.17.21':
     resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
@@ -856,9 +986,6 @@ packages:
   '@types/http-errors@2.0.4':
     resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
 
-  '@types/json-schema@7.0.15':
-    resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
-
   '@types/mdast@3.0.15':
     resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
 
@@ -868,8 +995,8 @@ packages:
   '@types/mime@1.3.5':
     resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
 
-  '@types/node@20.12.7':
-    resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==}
+  '@types/node@20.14.2':
+    resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==}
 
   '@types/normalize-package-data@2.4.4':
     resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -883,17 +1010,14 @@ packages:
   '@types/resolve@1.20.2':
     resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
 
-  '@types/semver@7.5.8':
-    resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
-
   '@types/send@0.17.4':
     resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
 
   '@types/serve-static@1.15.7':
     resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
 
-  '@types/superagent@8.1.6':
-    resolution: {integrity: sha512-yzBOv+6meEHSzV2NThYYOA6RtqvPr3Hbob9ZLp3i07SH27CrYVfm8CrF7ydTmidtelsFiKx2I4gZAiAOamGgvQ==}
+  '@types/superagent@8.1.7':
+    resolution: {integrity: sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==}
 
   '@types/supertest@6.0.2':
     resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==}
@@ -901,8 +1025,8 @@ packages:
   '@types/unist@2.0.10':
     resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
 
-  '@typescript-eslint/eslint-plugin@7.7.0':
-    resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==}
+  '@typescript-eslint/eslint-plugin@7.13.0':
+    resolution: {integrity: sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       '@typescript-eslint/parser': ^7.0.0
@@ -912,8 +1036,8 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/parser@7.7.0':
-    resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==}
+  '@typescript-eslint/parser@7.13.0':
+    resolution: {integrity: sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       eslint: ^8.56.0
@@ -922,12 +1046,12 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/scope-manager@7.7.0':
-    resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==}
+  '@typescript-eslint/scope-manager@7.13.0':
+    resolution: {integrity: sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==}
     engines: {node: ^18.18.0 || >=20.0.0}
 
-  '@typescript-eslint/type-utils@7.7.0':
-    resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==}
+  '@typescript-eslint/type-utils@7.13.0':
+    resolution: {integrity: sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       eslint: ^8.56.0
@@ -936,12 +1060,12 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/types@7.7.0':
-    resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==}
+  '@typescript-eslint/types@7.13.0':
+    resolution: {integrity: sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==}
     engines: {node: ^18.18.0 || >=20.0.0}
 
-  '@typescript-eslint/typescript-estree@7.7.0':
-    resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==}
+  '@typescript-eslint/typescript-estree@7.13.0':
+    resolution: {integrity: sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       typescript: '*'
@@ -949,35 +1073,35 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/utils@7.7.0':
-    resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==}
+  '@typescript-eslint/utils@7.13.0':
+    resolution: {integrity: sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       eslint: ^8.56.0
 
-  '@typescript-eslint/visitor-keys@7.7.0':
-    resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==}
+  '@typescript-eslint/visitor-keys@7.13.0':
+    resolution: {integrity: sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==}
     engines: {node: ^18.18.0 || >=20.0.0}
 
-  '@vitest/coverage-v8@1.5.2':
-    resolution: {integrity: sha512-QJqxRnbCwNtbbegK9E93rBmhN3dbfG1bC/o52Bqr0zGCYhQzwgwvrJBG7Q8vw3zilX6Ryy6oa/mkZku2lLJx1Q==}
+  '@vitest/coverage-v8@1.6.0':
+    resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==}
     peerDependencies:
-      vitest: 1.5.2
+      vitest: 1.6.0
 
-  '@vitest/expect@1.5.2':
-    resolution: {integrity: sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==}
+  '@vitest/expect@1.6.0':
+    resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==}
 
-  '@vitest/runner@1.5.2':
-    resolution: {integrity: sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==}
+  '@vitest/runner@1.6.0':
+    resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==}
 
-  '@vitest/snapshot@1.5.2':
-    resolution: {integrity: sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==}
+  '@vitest/snapshot@1.6.0':
+    resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==}
 
-  '@vitest/spy@1.5.2':
-    resolution: {integrity: sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==}
+  '@vitest/spy@1.6.0':
+    resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==}
 
-  '@vitest/utils@1.5.2':
-    resolution: {integrity: sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==}
+  '@vitest/utils@1.6.0':
+    resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==}
 
   JSONStream@1.3.5:
     resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
@@ -999,8 +1123,8 @@ packages:
     resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
     engines: {node: '>=0.4.0'}
 
-  acorn-walk@8.3.2:
-    resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==}
+  acorn-walk@8.3.3:
+    resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==}
     engines: {node: '>=0.4.0'}
 
   acorn@7.4.1:
@@ -1008,16 +1132,16 @@ packages:
     engines: {node: '>=0.4.0'}
     hasBin: true
 
-  acorn@8.11.3:
-    resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
+  acorn@8.12.0:
+    resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==}
     engines: {node: '>=0.4.0'}
     hasBin: true
 
   ajv@6.12.6:
     resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
 
-  ajv@8.12.0:
-    resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+  ajv@8.16.0:
+    resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==}
 
   ansi-regex@2.1.1:
     resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
@@ -1128,8 +1252,8 @@ packages:
   brace-expansion@2.0.1:
     resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
 
-  braces@3.0.2:
-    resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+  braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
     engines: {node: '>=8'}
 
   brorand@1.1.0:
@@ -1169,8 +1293,8 @@ packages:
     engines: {node: '>= 0.8'}
     hasBin: true
 
-  browserslist@4.23.0:
-    resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
+  browserslist@4.23.1:
+    resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==}
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
     hasBin: true
 
@@ -1201,8 +1325,13 @@ packages:
     resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
     engines: {node: '>= 0.8'}
 
-  c12@1.10.0:
-    resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==}
+  c12@1.11.1:
+    resolution: {integrity: sha512-KDU0TvSvVdaYcQKQ6iPHATGz/7p/KiVjPg4vQrB6Jg/wX9R0yl5RZxWm9IoZqaIHD2+6PZd81+KMGwRr/lRIUg==}
+    peerDependencies:
+      magicast: ^0.3.4
+    peerDependenciesMeta:
+      magicast:
+        optional: true
 
   cac@6.7.14:
     resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
@@ -1225,8 +1354,8 @@ packages:
   caniuse-api@3.0.0:
     resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
 
-  caniuse-lite@1.0.30001610:
-    resolution: {integrity: sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==}
+  caniuse-lite@1.0.30001636:
+    resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==}
 
   chai@4.4.1:
     resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==}
@@ -1289,8 +1418,8 @@ packages:
     resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
     engines: {node: '>=4'}
 
-  cli-table3@0.6.4:
-    resolution: {integrity: sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==}
+  cli-table3@0.6.5:
+    resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
     engines: {node: 10.* || >= 12.*}
 
   clipboardy@4.0.0:
@@ -1352,8 +1481,8 @@ packages:
     resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==}
     engines: {'0': node >= 6.0}
 
-  confbox@0.1.6:
-    resolution: {integrity: sha512-ONc4FUXne/1UBN1EuxvQ5rAjjAbo+N4IxrxWI8bzGHbd1PyrFlI/E3G23/yoJZDFBaFFxPGfI0EOq0fa4dgX7A==}
+  confbox@0.1.7:
+    resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==}
 
   connect@3.7.0:
     resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==}
@@ -1402,8 +1531,8 @@ packages:
   cookiejar@2.1.4:
     resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==}
 
-  core-js-compat@3.37.0:
-    resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==}
+  core-js-compat@3.37.1:
+    resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==}
 
   core-util-is@1.0.3:
     resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
@@ -1461,21 +1590,21 @@ packages:
     engines: {node: '>=4'}
     hasBin: true
 
-  cssnano-preset-default@6.1.2:
-    resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  cssnano-preset-default@7.0.2:
+    resolution: {integrity: sha512-z95kGKZx8VWHfERj7LFzuiTxylbvEp07ZEYaFu+t6bFyNOXLd/+3oPyNaY7ISwcrfHFCkt8OfRo4IZxVRJZ7dg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  cssnano-utils@4.0.2:
-    resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  cssnano-utils@5.0.0:
+    resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  cssnano@6.1.2:
-    resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  cssnano@7.0.2:
+    resolution: {integrity: sha512-LXm/Xx6TNLzfHM2lBaIQHfvtdW5QfdbyLzfJAWZrclCAb47yVa0/yJG69+amcw3Lq0YZ+kyU40rbsMPLcMt9aw==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
@@ -1551,8 +1680,8 @@ packages:
       supports-color:
         optional: true
 
-  debug@4.3.4:
-    resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+  debug@4.3.5:
+    resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
     engines: {node: '>=6.0'}
     peerDependencies:
       supports-color: '*'
@@ -1560,8 +1689,8 @@ packages:
       supports-color:
         optional: true
 
-  deep-eql@4.1.3:
-    resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
+  deep-eql@4.1.4:
+    resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==}
     engines: {node: '>=6'}
 
   deep-is@0.1.4:
@@ -1677,8 +1806,8 @@ packages:
   ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
 
-  electron-to-chromium@1.4.738:
-    resolution: {integrity: sha512-lwKft2CLFztD+vEIpesrOtCrko/TFnEJlHFdRhazU7Y/jx5qc4cqsocfVrBg4So4gGe9lvxnbLIoev47WMpg+A==}
+  electron-to-chromium@1.4.803:
+    resolution: {integrity: sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g==}
 
   elliptic@6.5.5:
     resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==}
@@ -1721,6 +1850,11 @@ packages:
     engines: {node: '>=12'}
     hasBin: true
 
+  esbuild@0.21.5:
+    resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
+    engines: {node: '>=12'}
+    hasBin: true
+
   escalade@3.1.2:
     resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
     engines: {node: '>=6'}
@@ -1736,21 +1870,21 @@ packages:
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     engines: {node: '>=10'}
 
-  eslint-config-unjs@0.3.0-rc.6:
-    resolution: {integrity: sha512-LFrtvLaVQk2iTyIo4U2dm8JeZRE9AYROmd0gL6kSVWc8ZMTIbYTnuvvt8GKANJYRizQhGwO5PlrbckvU2h4b9Q==}
+  eslint-config-unjs@0.3.2:
+    resolution: {integrity: sha512-Cr8oSPyPIDdupAj3eZcBYMLXNcpYQKnqnli/rfEzw/q9YtdsFVQbr7sYXsfNh8AsR2TvI6prtlcvNrgVR12/Nw==}
     peerDependencies:
       eslint: '*'
       typescript: '*'
 
-  eslint-plugin-markdown@4.0.1:
-    resolution: {integrity: sha512-5/MnGvYU0i8MbHH5cg8S+Vl3DL+bqRNYshk1xUO86DilNBaxtTkhH+5FD0/yO03AmlI6+lfNFdk2yOw72EPzpA==}
+  eslint-plugin-markdown@5.0.0:
+    resolution: {integrity: sha512-kY2u9yDhzvfZ0kmRTsvgm3mTnvZgTSGIIPeHg3yesSx4R5CTCnITUjCPhzCD1MUhNcqHU5Tr6lzx+02EclVPbw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: '>=8'
 
-  eslint-plugin-unicorn@52.0.0:
-    resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==}
-    engines: {node: '>=16'}
+  eslint-plugin-unicorn@53.0.0:
+    resolution: {integrity: sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==}
+    engines: {node: '>=18.18'}
     peerDependencies:
       eslint: '>=8.56.0'
 
@@ -1766,8 +1900,8 @@ packages:
     resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  eslint@9.1.1:
-    resolution: {integrity: sha512-b4cRQ0BeZcSEzPpY2PjFY70VbO32K7BStTGtBsnIGdTSEEQzBi8hPBcGQmTG2zUvFr9uLe0TK42bw8YszuHEqg==}
+  eslint@9.5.0:
+    resolution: {integrity: sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     hasBin: true
 
@@ -1775,10 +1909,6 @@ packages:
     resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  espree@9.6.1:
-    resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
   esquery@1.5.0:
     resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
     engines: {node: '>=0.10'}
@@ -1861,8 +1991,8 @@ packages:
     resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
     engines: {node: '>=16.0.0'}
 
-  fill-range@7.0.1:
-    resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
     engines: {node: '>=8'}
 
   finalhandler@1.1.2:
@@ -1895,8 +2025,8 @@ packages:
     resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
     engines: {node: '>= 6'}
 
-  formidable@2.1.2:
-    resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==}
+  formidable@3.5.1:
+    resolution: {integrity: sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==}
 
   forwarded@0.2.0:
     resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
@@ -1975,25 +2105,23 @@ packages:
 
   glob@7.2.3:
     resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+    deprecated: Glob versions prior to v9 are no longer supported
 
   glob@8.1.0:
     resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
     engines: {node: '>=12'}
+    deprecated: Glob versions prior to v9 are no longer supported
 
   globals@11.12.0:
     resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
     engines: {node: '>=4'}
 
-  globals@13.24.0:
-    resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
-    engines: {node: '>=8'}
-
   globals@14.0.0:
     resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
     engines: {node: '>=18'}
 
-  globals@15.0.0:
-    resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==}
+  globals@15.6.0:
+    resolution: {integrity: sha512-UzcJi88Hw//CurUIRa9Jxb0vgOCcuD/MNjwmXp633cyaRKkCWACkoqHCtfZv43b1kqXGg/fpOa8bwgacCeXsVg==}
     engines: {node: '>=18'}
 
   globby@11.1.0:
@@ -2162,6 +2290,7 @@ packages:
 
   inflight@1.0.6:
     resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+    deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
 
   inherits@2.0.3:
     resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
@@ -2183,11 +2312,8 @@ packages:
     resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
     engines: {node: '>= 0.10'}
 
-  iron-webcrypto@1.1.0:
-    resolution: {integrity: sha512-5vgYsCakNlaQub1orZK5QmNYhwYtcllTkZBp5sfIaCqY93Cf6l+v2rtE+E4TMbcfjxDMCdrO8wmp7+ZvhDECLA==}
-
-  iron-webcrypto@1.1.1:
-    resolution: {integrity: sha512-5xGwQUWHQSy039rFr+5q/zOmj7GP0Ypzvo34Ep+61bPIhaLduEDp/PvLGlU3awD2mzWUR0weN2vJ1mILydFPEg==}
+  iron-webcrypto@1.2.1:
+    resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
 
   is-alphabetical@1.0.4:
     resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
@@ -2332,8 +2458,8 @@ packages:
     resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
     engines: {node: '>=8'}
 
-  jiti@1.21.0:
-    resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
+  jiti@1.21.6:
+    resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
     hasBin: true
 
   js-tokens@4.0.0:
@@ -2380,9 +2506,6 @@ packages:
     engines: {node: '>=6'}
     hasBin: true
 
-  jsonc-parser@3.2.1:
-    resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
-
   jsonfile@6.1.0:
     resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
 
@@ -2405,8 +2528,8 @@ packages:
     resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
     engines: {node: '>= 0.8.0'}
 
-  lilconfig@3.1.1:
-    resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==}
+  lilconfig@3.1.2:
+    resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
     engines: {node: '>=14'}
 
   lines-and-columns@1.2.4:
@@ -2465,10 +2588,6 @@ packages:
   lru-cache@5.1.1:
     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
 
-  lru-cache@6.0.0:
-    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
-    engines: {node: '>=10'}
-
   magic-string@0.23.2:
     resolution: {integrity: sha512-oIUZaAxbcxYIp4AyLafV6OVKoB3YouZs0UTCJ8mOKBHNyJgGDaMJ4TgA+VylJh6fx7EQCC52XkbURxxG9IoJXA==}
 
@@ -2534,8 +2653,8 @@ packages:
   micromark@2.11.4:
     resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==}
 
-  micromatch@4.0.5:
-    resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+  micromatch@4.0.7:
+    resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
     engines: {node: '>=8.6'}
 
   miller-rabin@4.0.1:
@@ -2617,20 +2736,23 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
-  mkdist@1.4.0:
-    resolution: {integrity: sha512-LzzdzWDx6cWWPd8saIoO+kT5jnbijfeDaE6jZfmCYEi3YL2aJSyF23/tCFee/mDuh/ek1UQeSYdLeSa6oesdiw==}
+  mkdist@1.5.1:
+    resolution: {integrity: sha512-lCu1spNiA52o7IaKgZnOjg28nNHwYqUDjBfXePXyUtzD7Xhe6rRTkGTalQ/ALfrZC/SrPw2+A/0qkeJ+fPDZtQ==}
     hasBin: true
     peerDependencies:
-      sass: ^1.69.5
-      typescript: '>=5.3.2'
+      sass: ^1.75.0
+      typescript: '>=5.4.5'
+      vue-tsc: ^1.8.27 || ^2.0.14
     peerDependenciesMeta:
       sass:
         optional: true
       typescript:
         optional: true
+      vue-tsc:
+        optional: true
 
-  mlly@1.6.1:
-    resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==}
+  mlly@1.7.1:
+    resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==}
 
   module-deps@6.2.3:
     resolution: {integrity: sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==}
@@ -2778,8 +2900,8 @@ packages:
     resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==}
     engines: {node: '>=4'}
 
-  optionator@0.9.3:
-    resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
+  optionator@0.9.4:
+    resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
     engines: {node: '>= 0.8.0'}
 
   os-browserify@0.3.0:
@@ -2884,15 +3006,15 @@ packages:
   perfect-debounce@1.0.0:
     resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
 
-  picocolors@1.0.0:
-    resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+  picocolors@1.0.1:
+    resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
 
   picomatch@2.3.1:
     resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
     engines: {node: '>=8.6'}
 
-  pkg-types@1.0.3:
-    resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+  pkg-types@1.1.1:
+    resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==}
 
   pluralize@8.0.0:
     resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
@@ -2902,81 +3024,81 @@ packages:
     resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
     engines: {node: '>= 0.4'}
 
-  postcss-calc@9.0.1:
-    resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-calc@10.0.0:
+    resolution: {integrity: sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==}
+    engines: {node: ^18.12 || ^20.9 || >=22.0}
     peerDependencies:
-      postcss: ^8.2.2
+      postcss: ^8.4.38
 
-  postcss-colormin@6.1.0:
-    resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-colormin@7.0.0:
+    resolution: {integrity: sha512-5CN6fqtsEtEtwf3mFV3B4UaZnlYljPpzmGeDB4yCK067PnAtfLe9uX2aFZaEwxHE7HopG5rUkW8gyHrNAesHEg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-convert-values@6.1.0:
-    resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-convert-values@7.0.0:
+    resolution: {integrity: sha512-bMuzDgXBbFbByPgj+/r6va8zNuIDUaIIbvAFgdO1t3zdgJZ77BZvu6dfWyd6gHEJnYzmeVr9ayUsAQL3/qLJ0w==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-discard-comments@6.0.2:
-    resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-discard-comments@7.0.0:
+    resolution: {integrity: sha512-xpSdzRqYmy4YIVmjfGyYXKaI1SRnK6CTr+4Zmvyof8ANwvgfZgGdVtmgAvzh59gJm808mJCWQC9tFN0KF5dEXA==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-discard-duplicates@6.0.3:
-    resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-discard-duplicates@7.0.0:
+    resolution: {integrity: sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-discard-empty@6.0.3:
-    resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-discard-empty@7.0.0:
+    resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-discard-overridden@6.0.2:
-    resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-discard-overridden@7.0.0:
+    resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-merge-longhand@6.0.5:
-    resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-merge-longhand@7.0.1:
+    resolution: {integrity: sha512-qZlD26hnqSTMxSSOMS8+QCeRWtqOdMKeQHvHcBhjL3mJxKUs47cvO1Y1x3iTdYIk3ioMcRHTiy229TT0mEMH/A==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-merge-rules@6.1.1:
-    resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-merge-rules@7.0.1:
+    resolution: {integrity: sha512-bb8McYQbo2etgs0uVt6AfngajACK3FHSVP3sGLhprrjbtHJWgG03JZ4KKBlJ8/5Fb8/Rr+mMKaybMYeoYrAg0A==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-minify-font-values@6.1.0:
-    resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-minify-font-values@7.0.0:
+    resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-minify-gradients@6.0.3:
-    resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-minify-gradients@7.0.0:
+    resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-minify-params@6.1.0:
-    resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-minify-params@7.0.0:
+    resolution: {integrity: sha512-XOJAuX8Q/9GT1sGxlUvaFEe2H9n50bniLZblXXsAT/BwSfFYvzSZeFG7uupwc0KbKpTnflnQ7aMwGzX6JUWliQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-minify-selectors@6.0.4:
-    resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-minify-selectors@7.0.1:
+    resolution: {integrity: sha512-YfIbGtcgMFquPxV2L/ASs36ZS4DsgfcDX9tQ8cTEIvBTv+0GXFKtcvvpi9tCKto/+DWGWYKMCESFG3Pnan0Feg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
@@ -2986,91 +3108,91 @@ packages:
     peerDependencies:
       postcss: ^8.2.14
 
-  postcss-normalize-charset@6.0.2:
-    resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-normalize-charset@7.0.0:
+    resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-normalize-display-values@6.0.2:
-    resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-normalize-display-values@7.0.0:
+    resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-normalize-positions@6.0.2:
-    resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-normalize-positions@7.0.0:
+    resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-normalize-repeat-style@6.0.2:
-    resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-normalize-repeat-style@7.0.0:
+    resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-normalize-string@6.0.2:
-    resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-normalize-string@7.0.0:
+    resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-normalize-timing-functions@6.0.2:
-    resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-normalize-timing-functions@7.0.0:
+    resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-normalize-unicode@6.1.0:
-    resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-normalize-unicode@7.0.0:
+    resolution: {integrity: sha512-OnKV52/VFFDAim4n0pdI+JAhsolLBdnCKxE6VV5lW5Q/JeVGFN8UM8ur6/A3EAMLsT1ZRm3fDHh/rBoBQpqi2w==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-normalize-url@6.0.2:
-    resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-normalize-url@7.0.0:
+    resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-normalize-whitespace@6.0.2:
-    resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-normalize-whitespace@7.0.0:
+    resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-ordered-values@6.0.2:
-    resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-ordered-values@7.0.0:
+    resolution: {integrity: sha512-KROvC63A8UQW1eYDljQe1dtwc1E/M+mMwDT6z7khV/weHYLWTghaLRLunU7x1xw85lWFwVZOAGakxekYvKV+0w==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-reduce-initial@6.1.0:
-    resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-reduce-initial@7.0.0:
+    resolution: {integrity: sha512-iqGgmBxY9LrblZ0BKLjmrA1mC/cf9A/wYCCqSmD6tMi+xAyVl0+DfixZIHSVDMbCPRPjNmVF0DFGth/IDGelFQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-reduce-transforms@6.0.2:
-    resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-reduce-transforms@7.0.0:
+    resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-selector-parser@6.0.16:
-    resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==}
+  postcss-selector-parser@6.1.0:
+    resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==}
     engines: {node: '>=4'}
 
-  postcss-svgo@6.0.3:
-    resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==}
-    engines: {node: ^14 || ^16 || >= 18}
+  postcss-svgo@7.0.1:
+    resolution: {integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >= 18}
     peerDependencies:
       postcss: ^8.4.31
 
-  postcss-unique-selectors@6.0.4:
-    resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  postcss-unique-selectors@7.0.1:
+    resolution: {integrity: sha512-MH7QE/eKUftTB5ta40xcHLl7hkZjgDFydpfTK+QWXeHxghVt3VoPqYL5/G+zYZPPIs+8GuqFXSTgxBSoB1RZtQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
@@ -3085,8 +3207,8 @@ packages:
     resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
     engines: {node: '>= 0.8.0'}
 
-  prettier@3.2.5:
-    resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
+  prettier@3.3.2:
+    resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==}
     engines: {node: '>=14'}
     hasBin: true
 
@@ -3180,8 +3302,8 @@ packages:
     peerDependencies:
       react: ^18.3.1
 
-  react-is@18.2.0:
-    resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+  react-is@18.3.1:
+    resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
 
   react@18.3.1:
     resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
@@ -3245,8 +3367,8 @@ packages:
   ripemd160@2.0.2:
     resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
 
-  rollup-plugin-dts@6.1.0:
-    resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==}
+  rollup-plugin-dts@6.1.1:
+    resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==}
     engines: {node: '>=16'}
     peerDependencies:
       rollup: ^3.29.4 || ^4
@@ -3257,8 +3379,8 @@ packages:
     engines: {node: '>=14.18.0', npm: '>=8.0.0'}
     hasBin: true
 
-  rollup@4.14.3:
-    resolution: {integrity: sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==}
+  rollup@4.18.0:
+    resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
 
@@ -3292,8 +3414,8 @@ packages:
     resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
     hasBin: true
 
-  semver@7.6.0:
-    resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
+  semver@7.6.2:
+    resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
     engines: {node: '>=10'}
     hasBin: true
 
@@ -3383,8 +3505,8 @@ packages:
   spdx-expression-parse@3.0.1:
     resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
 
-  spdx-license-ids@3.0.17:
-    resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==}
+  spdx-license-ids@3.0.18:
+    resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==}
 
   split2@4.2.0:
     resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
@@ -3460,23 +3582,22 @@ packages:
   strip-literal@2.1.0:
     resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==}
 
-  stylehacks@6.1.1:
-    resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==}
-    engines: {node: ^14 || ^16 || >=18.0}
+  stylehacks@7.0.1:
+    resolution: {integrity: sha512-PnrT4HzajnxbjfChpeBKLSpSykilnGBlD+pIffCoT5KbLur9fcL8uKRQJJap85byR2wCYZl/4Otk5eq76qeZxQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
     peerDependencies:
       postcss: ^8.4.31
 
   subarg@1.0.0:
     resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==}
 
-  superagent@8.1.2:
-    resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==}
-    engines: {node: '>=6.4.0 <13 || >=14'}
-    deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net
+  superagent@9.0.2:
+    resolution: {integrity: sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==}
+    engines: {node: '>=14.18.0'}
 
-  supertest@6.3.4:
-    resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==}
-    engines: {node: '>=6.4.0'}
+  supertest@7.0.0:
+    resolution: {integrity: sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==}
+    engines: {node: '>=14.18.0'}
 
   supports-color@2.0.0:
     resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
@@ -3494,8 +3615,8 @@ packages:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
     engines: {node: '>= 0.4'}
 
-  svgo@3.2.0:
-    resolution: {integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==}
+  svgo@3.3.2:
+    resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==}
     engines: {node: '>=14.0.0'}
     hasBin: true
 
@@ -3540,8 +3661,8 @@ packages:
     resolution: {integrity: sha512-wMctrWD2HZZLuIlchlkE2dfXJh7J2KDI9Dwl+2abPYg0mswQHfOAyQW3jJg1pY5VfttSINZuKcXoB3FGypVklA==}
     engines: {node: '>=8'}
 
-  tinybench@2.7.0:
-    resolution: {integrity: sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==}
+  tinybench@2.8.0:
+    resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==}
 
   tinypool@0.8.4:
     resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==}
@@ -3590,10 +3711,6 @@ packages:
     resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
     engines: {node: '>=4'}
 
-  type-fest@0.20.2:
-    resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
-    engines: {node: '>=10'}
-
   type-fest@0.6.0:
     resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
     engines: {node: '>=8'}
@@ -3609,8 +3726,8 @@ packages:
   typedarray@0.0.6:
     resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
 
-  typescript-eslint@7.7.0:
-    resolution: {integrity: sha512-wZZ+7mTQJCn4mGAvzdERtL4vwKGM/mF9cMSMeKUllz3Hgbd1Mdd5L60Q+nJmCio9RB4OyMMr0EX4Ry2Q7jiAyw==}
+  typescript-eslint@7.13.0:
+    resolution: {integrity: sha512-upO0AXxyBwJ4BbiC6CRgAJKtGYha2zw4m1g7TIVPSonwYEuf7vCicw3syjS1OxdDMTz96sZIXl3Jx3vWJLLKFw==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       eslint: ^8.56.0
@@ -3650,6 +3767,10 @@ packages:
   undici-types@5.26.5:
     resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
 
+  undici@6.19.2:
+    resolution: {integrity: sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==}
+    engines: {node: '>=18.17'}
+
   unenv@1.9.0:
     resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==}
 
@@ -3680,8 +3801,8 @@ packages:
     resolution: {integrity: sha512-nC5q0DnPEPVURPhfPQLahhSTnemVtPzdx7ofiRxXpOB2SYnb3MfdU3DVGyJdS8Lx+tBWeAePO8BfU/3EgksM7Q==}
     hasBin: true
 
-  update-browserslist-db@1.0.13:
-    resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+  update-browserslist-db@1.0.16:
+    resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==}
     hasBin: true
     peerDependencies:
       browserslist: '>= 4.21.0'
@@ -3728,13 +3849,13 @@ packages:
     resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
     engines: {node: '>= 0.8'}
 
-  vite-node@1.5.2:
-    resolution: {integrity: sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==}
+  vite-node@1.6.0:
+    resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==}
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
 
-  vite@5.2.9:
-    resolution: {integrity: sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==}
+  vite@5.3.1:
+    resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==}
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
     peerDependencies:
@@ -3761,15 +3882,15 @@ packages:
       terser:
         optional: true
 
-  vitest@1.5.2:
-    resolution: {integrity: sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==}
+  vitest@1.6.0:
+    resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==}
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
     peerDependencies:
       '@edge-runtime/vm': '*'
       '@types/node': ^18.0.0 || >=20.0.0
-      '@vitest/browser': 1.5.2
-      '@vitest/ui': 1.5.2
+      '@vitest/browser': 1.6.0
+      '@vitest/ui': 1.6.0
       happy-dom: '*'
       jsdom: '*'
     peerDependenciesMeta:
@@ -3803,6 +3924,10 @@ packages:
     engines: {node: '>=8'}
     hasBin: true
 
+  word-wrap@1.2.5:
+    resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+    engines: {node: '>=0.10.0'}
+
   wrappy@1.0.2:
     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
 
@@ -3816,8 +3941,8 @@ packages:
   yallist@4.0.0:
     resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
 
-  yaml@2.4.1:
-    resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==}
+  yaml@2.4.5:
+    resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==}
     engines: {node: '>= 14'}
     hasBin: true
 
@@ -3829,19 +3954,19 @@ packages:
     resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
     engines: {node: '>=12.20'}
 
-  zod@3.23.4:
-    resolution: {integrity: sha512-/AtWOKbBgjzEYYQRNfoGKHObgfAZag6qUJX1VbHo2PRBgS+wfWagEY2mizjfyAPcGesrJOcx/wcl0L9WnVrHFw==}
+  zod@3.23.8:
+    resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
 
 snapshots:
 
   0x@5.7.0:
     dependencies:
-      ajv: 8.12.0
+      ajv: 8.16.0
       browserify: 17.0.0
       concat-stream: 2.0.0
       d3-fg: 6.14.0
       debounce: 1.2.1
-      debug: 4.3.4
+      debug: 4.3.5
       end-of-stream: 1.4.4
       env-string: 1.0.1
       escape-string-regexp: 4.0.0
@@ -3858,7 +3983,7 @@ snapshots:
       opn: 5.5.0
       pump: 3.0.0
       pumpify: 2.0.1
-      semver: 7.6.0
+      semver: 7.6.2
       single-line-log: 1.1.2
       split2: 4.2.0
       tachyons: 4.12.0
@@ -3867,8 +3992,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@aashutoshrathi/word-wrap@1.2.6': {}
-
   '@ampproject/remapping@2.3.0':
     dependencies:
       '@jridgewell/gen-mapping': 0.3.5
@@ -3876,136 +3999,143 @@ snapshots:
 
   '@assemblyscript/loader@0.19.23': {}
 
-  '@babel/code-frame@7.24.2':
+  '@babel/code-frame@7.24.7':
     dependencies:
-      '@babel/highlight': 7.24.2
-      picocolors: 1.0.0
+      '@babel/highlight': 7.24.7
+      picocolors: 1.0.1
 
-  '@babel/compat-data@7.24.4': {}
+  '@babel/compat-data@7.24.7': {}
 
-  '@babel/core@7.24.4':
+  '@babel/core@7.24.7':
     dependencies:
       '@ampproject/remapping': 2.3.0
-      '@babel/code-frame': 7.24.2
-      '@babel/generator': 7.24.4
-      '@babel/helper-compilation-targets': 7.23.6
-      '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4)
-      '@babel/helpers': 7.24.4
-      '@babel/parser': 7.24.4
-      '@babel/template': 7.24.0
-      '@babel/traverse': 7.24.1
-      '@babel/types': 7.24.0
+      '@babel/code-frame': 7.24.7
+      '@babel/generator': 7.24.7
+      '@babel/helper-compilation-targets': 7.24.7
+      '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
+      '@babel/helpers': 7.24.7
+      '@babel/parser': 7.24.7
+      '@babel/template': 7.24.7
+      '@babel/traverse': 7.24.7
+      '@babel/types': 7.24.7
       convert-source-map: 2.0.0
-      debug: 4.3.4
+      debug: 4.3.5
       gensync: 1.0.0-beta.2
       json5: 2.2.3
       semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/generator@7.24.4':
+  '@babel/generator@7.24.7':
     dependencies:
-      '@babel/types': 7.24.0
+      '@babel/types': 7.24.7
       '@jridgewell/gen-mapping': 0.3.5
       '@jridgewell/trace-mapping': 0.3.25
       jsesc: 2.5.2
 
-  '@babel/helper-compilation-targets@7.23.6':
+  '@babel/helper-compilation-targets@7.24.7':
     dependencies:
-      '@babel/compat-data': 7.24.4
-      '@babel/helper-validator-option': 7.23.5
-      browserslist: 4.23.0
+      '@babel/compat-data': 7.24.7
+      '@babel/helper-validator-option': 7.24.7
+      browserslist: 4.23.1
       lru-cache: 5.1.1
       semver: 6.3.1
 
-  '@babel/helper-environment-visitor@7.22.20': {}
+  '@babel/helper-environment-visitor@7.24.7':
+    dependencies:
+      '@babel/types': 7.24.7
 
-  '@babel/helper-function-name@7.23.0':
+  '@babel/helper-function-name@7.24.7':
     dependencies:
-      '@babel/template': 7.24.0
-      '@babel/types': 7.24.0
+      '@babel/template': 7.24.7
+      '@babel/types': 7.24.7
 
-  '@babel/helper-hoist-variables@7.22.5':
+  '@babel/helper-hoist-variables@7.24.7':
     dependencies:
-      '@babel/types': 7.24.0
+      '@babel/types': 7.24.7
 
-  '@babel/helper-module-imports@7.24.3':
+  '@babel/helper-module-imports@7.24.7':
     dependencies:
-      '@babel/types': 7.24.0
+      '@babel/traverse': 7.24.7
+      '@babel/types': 7.24.7
+    transitivePeerDependencies:
+      - supports-color
 
-  '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4)':
+  '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)':
     dependencies:
-      '@babel/core': 7.24.4
-      '@babel/helper-environment-visitor': 7.22.20
-      '@babel/helper-module-imports': 7.24.3
-      '@babel/helper-simple-access': 7.22.5
-      '@babel/helper-split-export-declaration': 7.22.6
-      '@babel/helper-validator-identifier': 7.22.20
+      '@babel/core': 7.24.7
+      '@babel/helper-environment-visitor': 7.24.7
+      '@babel/helper-module-imports': 7.24.7
+      '@babel/helper-simple-access': 7.24.7
+      '@babel/helper-split-export-declaration': 7.24.7
+      '@babel/helper-validator-identifier': 7.24.7
+    transitivePeerDependencies:
+      - supports-color
 
-  '@babel/helper-simple-access@7.22.5':
+  '@babel/helper-simple-access@7.24.7':
     dependencies:
-      '@babel/types': 7.24.0
+      '@babel/traverse': 7.24.7
+      '@babel/types': 7.24.7
+    transitivePeerDependencies:
+      - supports-color
 
-  '@babel/helper-split-export-declaration@7.22.6':
+  '@babel/helper-split-export-declaration@7.24.7':
     dependencies:
-      '@babel/types': 7.24.0
+      '@babel/types': 7.24.7
 
-  '@babel/helper-string-parser@7.24.1': {}
+  '@babel/helper-string-parser@7.24.7': {}
 
-  '@babel/helper-validator-identifier@7.22.20': {}
+  '@babel/helper-validator-identifier@7.24.7': {}
 
-  '@babel/helper-validator-option@7.23.5': {}
+  '@babel/helper-validator-option@7.24.7': {}
 
-  '@babel/helpers@7.24.4':
+  '@babel/helpers@7.24.7':
     dependencies:
-      '@babel/template': 7.24.0
-      '@babel/traverse': 7.24.1
-      '@babel/types': 7.24.0
-    transitivePeerDependencies:
-      - supports-color
+      '@babel/template': 7.24.7
+      '@babel/types': 7.24.7
 
-  '@babel/highlight@7.24.2':
+  '@babel/highlight@7.24.7':
     dependencies:
-      '@babel/helper-validator-identifier': 7.22.20
+      '@babel/helper-validator-identifier': 7.24.7
       chalk: 2.4.2
       js-tokens: 4.0.0
-      picocolors: 1.0.0
+      picocolors: 1.0.1
 
-  '@babel/parser@7.24.4':
+  '@babel/parser@7.24.7':
     dependencies:
-      '@babel/types': 7.24.0
+      '@babel/types': 7.24.7
 
-  '@babel/runtime@7.24.4':
+  '@babel/runtime@7.24.7':
     dependencies:
       regenerator-runtime: 0.14.1
 
-  '@babel/standalone@7.24.4': {}
+  '@babel/standalone@7.24.7': {}
 
-  '@babel/template@7.24.0':
+  '@babel/template@7.24.7':
     dependencies:
-      '@babel/code-frame': 7.24.2
-      '@babel/parser': 7.24.4
-      '@babel/types': 7.24.0
+      '@babel/code-frame': 7.24.7
+      '@babel/parser': 7.24.7
+      '@babel/types': 7.24.7
 
-  '@babel/traverse@7.24.1':
+  '@babel/traverse@7.24.7':
     dependencies:
-      '@babel/code-frame': 7.24.2
-      '@babel/generator': 7.24.4
-      '@babel/helper-environment-visitor': 7.22.20
-      '@babel/helper-function-name': 7.23.0
-      '@babel/helper-hoist-variables': 7.22.5
-      '@babel/helper-split-export-declaration': 7.22.6
-      '@babel/parser': 7.24.4
-      '@babel/types': 7.24.0
-      debug: 4.3.4
+      '@babel/code-frame': 7.24.7
+      '@babel/generator': 7.24.7
+      '@babel/helper-environment-visitor': 7.24.7
+      '@babel/helper-function-name': 7.24.7
+      '@babel/helper-hoist-variables': 7.24.7
+      '@babel/helper-split-export-declaration': 7.24.7
+      '@babel/parser': 7.24.7
+      '@babel/types': 7.24.7
+      debug: 4.3.5
       globals: 11.12.0
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/types@7.24.0':
+  '@babel/types@7.24.7':
     dependencies:
-      '@babel/helper-string-parser': 7.24.1
-      '@babel/helper-validator-identifier': 7.22.20
+      '@babel/helper-string-parser': 7.24.7
+      '@babel/helper-validator-identifier': 7.24.7
       to-fast-properties: 2.0.0
 
   '@bcoe/v8-coverage@0.2.3': {}
@@ -4019,163 +4149,226 @@ snapshots:
   '@esbuild/aix-ppc64@0.20.2':
     optional: true
 
+  '@esbuild/aix-ppc64@0.21.5':
+    optional: true
+
   '@esbuild/android-arm64@0.19.12':
     optional: true
 
   '@esbuild/android-arm64@0.20.2':
     optional: true
 
+  '@esbuild/android-arm64@0.21.5':
+    optional: true
+
   '@esbuild/android-arm@0.19.12':
     optional: true
 
   '@esbuild/android-arm@0.20.2':
     optional: true
 
+  '@esbuild/android-arm@0.21.5':
+    optional: true
+
   '@esbuild/android-x64@0.19.12':
     optional: true
 
   '@esbuild/android-x64@0.20.2':
     optional: true
 
+  '@esbuild/android-x64@0.21.5':
+    optional: true
+
   '@esbuild/darwin-arm64@0.19.12':
     optional: true
 
   '@esbuild/darwin-arm64@0.20.2':
     optional: true
 
+  '@esbuild/darwin-arm64@0.21.5':
+    optional: true
+
   '@esbuild/darwin-x64@0.19.12':
     optional: true
 
   '@esbuild/darwin-x64@0.20.2':
     optional: true
 
+  '@esbuild/darwin-x64@0.21.5':
+    optional: true
+
   '@esbuild/freebsd-arm64@0.19.12':
     optional: true
 
   '@esbuild/freebsd-arm64@0.20.2':
     optional: true
 
+  '@esbuild/freebsd-arm64@0.21.5':
+    optional: true
+
   '@esbuild/freebsd-x64@0.19.12':
     optional: true
 
   '@esbuild/freebsd-x64@0.20.2':
     optional: true
 
+  '@esbuild/freebsd-x64@0.21.5':
+    optional: true
+
   '@esbuild/linux-arm64@0.19.12':
     optional: true
 
   '@esbuild/linux-arm64@0.20.2':
     optional: true
 
+  '@esbuild/linux-arm64@0.21.5':
+    optional: true
+
   '@esbuild/linux-arm@0.19.12':
     optional: true
 
   '@esbuild/linux-arm@0.20.2':
     optional: true
 
+  '@esbuild/linux-arm@0.21.5':
+    optional: true
+
   '@esbuild/linux-ia32@0.19.12':
     optional: true
 
   '@esbuild/linux-ia32@0.20.2':
     optional: true
 
+  '@esbuild/linux-ia32@0.21.5':
+    optional: true
+
   '@esbuild/linux-loong64@0.19.12':
     optional: true
 
   '@esbuild/linux-loong64@0.20.2':
     optional: true
 
+  '@esbuild/linux-loong64@0.21.5':
+    optional: true
+
   '@esbuild/linux-mips64el@0.19.12':
     optional: true
 
   '@esbuild/linux-mips64el@0.20.2':
     optional: true
 
+  '@esbuild/linux-mips64el@0.21.5':
+    optional: true
+
   '@esbuild/linux-ppc64@0.19.12':
     optional: true
 
   '@esbuild/linux-ppc64@0.20.2':
     optional: true
 
+  '@esbuild/linux-ppc64@0.21.5':
+    optional: true
+
   '@esbuild/linux-riscv64@0.19.12':
     optional: true
 
   '@esbuild/linux-riscv64@0.20.2':
     optional: true
 
+  '@esbuild/linux-riscv64@0.21.5':
+    optional: true
+
   '@esbuild/linux-s390x@0.19.12':
     optional: true
 
   '@esbuild/linux-s390x@0.20.2':
     optional: true
 
+  '@esbuild/linux-s390x@0.21.5':
+    optional: true
+
   '@esbuild/linux-x64@0.19.12':
     optional: true
 
   '@esbuild/linux-x64@0.20.2':
     optional: true
 
+  '@esbuild/linux-x64@0.21.5':
+    optional: true
+
   '@esbuild/netbsd-x64@0.19.12':
     optional: true
 
   '@esbuild/netbsd-x64@0.20.2':
     optional: true
 
+  '@esbuild/netbsd-x64@0.21.5':
+    optional: true
+
   '@esbuild/openbsd-x64@0.19.12':
     optional: true
 
   '@esbuild/openbsd-x64@0.20.2':
     optional: true
 
+  '@esbuild/openbsd-x64@0.21.5':
+    optional: true
+
   '@esbuild/sunos-x64@0.19.12':
     optional: true
 
   '@esbuild/sunos-x64@0.20.2':
     optional: true
 
+  '@esbuild/sunos-x64@0.21.5':
+    optional: true
+
   '@esbuild/win32-arm64@0.19.12':
     optional: true
 
   '@esbuild/win32-arm64@0.20.2':
     optional: true
 
+  '@esbuild/win32-arm64@0.21.5':
+    optional: true
+
   '@esbuild/win32-ia32@0.19.12':
     optional: true
 
   '@esbuild/win32-ia32@0.20.2':
     optional: true
 
+  '@esbuild/win32-ia32@0.21.5':
+    optional: true
+
   '@esbuild/win32-x64@0.19.12':
     optional: true
 
   '@esbuild/win32-x64@0.20.2':
     optional: true
 
-  '@eslint-community/eslint-utils@4.4.0(eslint@9.1.1)':
+  '@esbuild/win32-x64@0.21.5':
+    optional: true
+
+  '@eslint-community/eslint-utils@4.4.0(eslint@9.5.0)':
     dependencies:
-      eslint: 9.1.1
+      eslint: 9.5.0
       eslint-visitor-keys: 3.4.3
 
-  '@eslint-community/regexpp@4.10.0': {}
+  '@eslint-community/regexpp@4.10.1': {}
 
-  '@eslint/eslintrc@2.1.4':
+  '@eslint/config-array@0.16.0':
     dependencies:
-      ajv: 6.12.6
-      debug: 4.3.4
-      espree: 9.6.1
-      globals: 13.24.0
-      ignore: 5.3.1
-      import-fresh: 3.3.0
-      js-yaml: 4.1.0
+      '@eslint/object-schema': 2.1.4
+      debug: 4.3.5
       minimatch: 3.1.2
-      strip-json-comments: 3.1.1
     transitivePeerDependencies:
       - supports-color
 
-  '@eslint/eslintrc@3.0.2':
+  '@eslint/eslintrc@3.1.0':
     dependencies:
       ajv: 6.12.6
-      debug: 4.3.4
+      debug: 4.3.5
       espree: 10.0.1
       globals: 14.0.0
       ignore: 5.3.1
@@ -4186,23 +4379,13 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@eslint/js@9.0.0': {}
-
-  '@eslint/js@9.1.1': {}
+  '@eslint/js@9.5.0': {}
 
-  '@humanwhocodes/config-array@0.13.0':
-    dependencies:
-      '@humanwhocodes/object-schema': 2.0.3
-      debug: 4.3.4
-      minimatch: 3.1.2
-    transitivePeerDependencies:
-      - supports-color
+  '@eslint/object-schema@2.1.4': {}
 
   '@humanwhocodes/module-importer@1.0.1': {}
 
-  '@humanwhocodes/object-schema@2.0.3': {}
-
-  '@humanwhocodes/retry@0.2.3': {}
+  '@humanwhocodes/retry@0.3.0': {}
 
   '@istanbuljs/schema@0.1.3': {}
 
@@ -4269,7 +4452,7 @@ snapshots:
   '@parcel/watcher-wasm@2.4.1':
     dependencies:
       is-glob: 4.0.3
-      micromatch: 4.0.5
+      micromatch: 4.0.7
 
   '@parcel/watcher-win32-arm64@2.4.1':
     optional: true
@@ -4284,7 +4467,7 @@ snapshots:
     dependencies:
       detect-libc: 1.0.3
       is-glob: 4.0.3
-      micromatch: 4.0.5
+      micromatch: 4.0.7
       node-addon-api: 7.1.0
     optionalDependencies:
       '@parcel/watcher-android-arm64': 2.4.1
@@ -4306,7 +4489,7 @@ snapshots:
     optionalDependencies:
       rollup: 3.29.4
 
-  '@rollup/plugin-commonjs@25.0.7(rollup@3.29.4)':
+  '@rollup/plugin-commonjs@25.0.8(rollup@3.29.4)':
     dependencies:
       '@rollup/pluginutils': 5.1.0(rollup@3.29.4)
       commondir: 1.0.1
@@ -4334,7 +4517,7 @@ snapshots:
     optionalDependencies:
       rollup: 3.29.4
 
-  '@rollup/plugin-replace@5.0.5(rollup@3.29.4)':
+  '@rollup/plugin-replace@5.0.7(rollup@3.29.4)':
     dependencies:
       '@rollup/pluginutils': 5.1.0(rollup@3.29.4)
       magic-string: 0.30.10
@@ -4349,52 +4532,52 @@ snapshots:
     optionalDependencies:
       rollup: 3.29.4
 
-  '@rollup/rollup-android-arm-eabi@4.14.3':
+  '@rollup/rollup-android-arm-eabi@4.18.0':
     optional: true
 
-  '@rollup/rollup-android-arm64@4.14.3':
+  '@rollup/rollup-android-arm64@4.18.0':
     optional: true
 
-  '@rollup/rollup-darwin-arm64@4.14.3':
+  '@rollup/rollup-darwin-arm64@4.18.0':
     optional: true
 
-  '@rollup/rollup-darwin-x64@4.14.3':
+  '@rollup/rollup-darwin-x64@4.18.0':
     optional: true
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.14.3':
+  '@rollup/rollup-linux-arm-gnueabihf@4.18.0':
     optional: true
 
-  '@rollup/rollup-linux-arm-musleabihf@4.14.3':
+  '@rollup/rollup-linux-arm-musleabihf@4.18.0':
     optional: true
 
-  '@rollup/rollup-linux-arm64-gnu@4.14.3':
+  '@rollup/rollup-linux-arm64-gnu@4.18.0':
     optional: true
 
-  '@rollup/rollup-linux-arm64-musl@4.14.3':
+  '@rollup/rollup-linux-arm64-musl@4.18.0':
     optional: true
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.14.3':
+  '@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
     optional: true
 
-  '@rollup/rollup-linux-riscv64-gnu@4.14.3':
+  '@rollup/rollup-linux-riscv64-gnu@4.18.0':
     optional: true
 
-  '@rollup/rollup-linux-s390x-gnu@4.14.3':
+  '@rollup/rollup-linux-s390x-gnu@4.18.0':
     optional: true
 
-  '@rollup/rollup-linux-x64-gnu@4.14.3':
+  '@rollup/rollup-linux-x64-gnu@4.18.0':
     optional: true
 
-  '@rollup/rollup-linux-x64-musl@4.14.3':
+  '@rollup/rollup-linux-x64-musl@4.18.0':
     optional: true
 
-  '@rollup/rollup-win32-arm64-msvc@4.14.3':
+  '@rollup/rollup-win32-arm64-msvc@4.18.0':
     optional: true
 
-  '@rollup/rollup-win32-ia32-msvc@4.14.3':
+  '@rollup/rollup-win32-ia32-msvc@4.18.0':
     optional: true
 
-  '@rollup/rollup-win32-x64-msvc@4.14.3':
+  '@rollup/rollup-win32-x64-msvc@4.18.0':
     optional: true
 
   '@sinclair/typebox@0.27.8': {}
@@ -4406,19 +4589,19 @@ snapshots:
   '@types/body-parser@1.19.5':
     dependencies:
       '@types/connect': 3.4.38
-      '@types/node': 20.12.7
+      '@types/node': 20.14.2
 
   '@types/connect@3.4.38':
     dependencies:
-      '@types/node': 20.12.7
+      '@types/node': 20.14.2
 
   '@types/cookiejar@2.1.5': {}
 
   '@types/estree@1.0.5': {}
 
-  '@types/express-serve-static-core@4.19.0':
+  '@types/express-serve-static-core@4.19.3':
     dependencies:
-      '@types/node': 20.12.7
+      '@types/node': 20.14.2
       '@types/qs': 6.9.15
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
@@ -4426,14 +4609,12 @@ snapshots:
   '@types/express@4.17.21':
     dependencies:
       '@types/body-parser': 1.19.5
-      '@types/express-serve-static-core': 4.19.0
+      '@types/express-serve-static-core': 4.19.3
       '@types/qs': 6.9.15
       '@types/serve-static': 1.15.7
 
   '@types/http-errors@2.0.4': {}
 
-  '@types/json-schema@7.0.15': {}
-
   '@types/mdast@3.0.15':
     dependencies:
       '@types/unist': 2.0.10
@@ -4442,7 +4623,7 @@ snapshots:
 
   '@types/mime@1.3.5': {}
 
-  '@types/node@20.12.7':
+  '@types/node@20.14.2':
     dependencies:
       undici-types: 5.26.5
 
@@ -4454,160 +4635,153 @@ snapshots:
 
   '@types/resolve@1.20.2': {}
 
-  '@types/semver@7.5.8': {}
-
   '@types/send@0.17.4':
     dependencies:
       '@types/mime': 1.3.5
-      '@types/node': 20.12.7
+      '@types/node': 20.14.2
 
   '@types/serve-static@1.15.7':
     dependencies:
       '@types/http-errors': 2.0.4
-      '@types/node': 20.12.7
+      '@types/node': 20.14.2
       '@types/send': 0.17.4
 
-  '@types/superagent@8.1.6':
+  '@types/superagent@8.1.7':
     dependencies:
       '@types/cookiejar': 2.1.5
       '@types/methods': 1.1.4
-      '@types/node': 20.12.7
+      '@types/node': 20.14.2
 
   '@types/supertest@6.0.2':
     dependencies:
       '@types/methods': 1.1.4
-      '@types/superagent': 8.1.6
+      '@types/superagent': 8.1.7
 
   '@types/unist@2.0.10': {}
 
-  '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.1.1)(typescript@5.4.5))(eslint@9.1.1)(typescript@5.4.5)':
+  '@typescript-eslint/eslint-plugin@7.13.0(@typescript-eslint/parser@7.13.0(eslint@9.5.0)(typescript@5.4.5))(eslint@9.5.0)(typescript@5.4.5)':
     dependencies:
-      '@eslint-community/regexpp': 4.10.0
-      '@typescript-eslint/parser': 7.7.0(eslint@9.1.1)(typescript@5.4.5)
-      '@typescript-eslint/scope-manager': 7.7.0
-      '@typescript-eslint/type-utils': 7.7.0(eslint@9.1.1)(typescript@5.4.5)
-      '@typescript-eslint/utils': 7.7.0(eslint@9.1.1)(typescript@5.4.5)
-      '@typescript-eslint/visitor-keys': 7.7.0
-      debug: 4.3.4
-      eslint: 9.1.1
+      '@eslint-community/regexpp': 4.10.1
+      '@typescript-eslint/parser': 7.13.0(eslint@9.5.0)(typescript@5.4.5)
+      '@typescript-eslint/scope-manager': 7.13.0
+      '@typescript-eslint/type-utils': 7.13.0(eslint@9.5.0)(typescript@5.4.5)
+      '@typescript-eslint/utils': 7.13.0(eslint@9.5.0)(typescript@5.4.5)
+      '@typescript-eslint/visitor-keys': 7.13.0
+      eslint: 9.5.0
       graphemer: 1.4.0
       ignore: 5.3.1
       natural-compare: 1.4.0
-      semver: 7.6.0
       ts-api-utils: 1.3.0(typescript@5.4.5)
     optionalDependencies:
       typescript: 5.4.5
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@7.7.0(eslint@9.1.1)(typescript@5.4.5)':
+  '@typescript-eslint/parser@7.13.0(eslint@9.5.0)(typescript@5.4.5)':
     dependencies:
-      '@typescript-eslint/scope-manager': 7.7.0
-      '@typescript-eslint/types': 7.7.0
-      '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5)
-      '@typescript-eslint/visitor-keys': 7.7.0
-      debug: 4.3.4
-      eslint: 9.1.1
+      '@typescript-eslint/scope-manager': 7.13.0
+      '@typescript-eslint/types': 7.13.0
+      '@typescript-eslint/typescript-estree': 7.13.0(typescript@5.4.5)
+      '@typescript-eslint/visitor-keys': 7.13.0
+      debug: 4.3.5
+      eslint: 9.5.0
     optionalDependencies:
       typescript: 5.4.5
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/scope-manager@7.7.0':
+  '@typescript-eslint/scope-manager@7.13.0':
     dependencies:
-      '@typescript-eslint/types': 7.7.0
-      '@typescript-eslint/visitor-keys': 7.7.0
+      '@typescript-eslint/types': 7.13.0
+      '@typescript-eslint/visitor-keys': 7.13.0
 
-  '@typescript-eslint/type-utils@7.7.0(eslint@9.1.1)(typescript@5.4.5)':
+  '@typescript-eslint/type-utils@7.13.0(eslint@9.5.0)(typescript@5.4.5)':
     dependencies:
-      '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5)
-      '@typescript-eslint/utils': 7.7.0(eslint@9.1.1)(typescript@5.4.5)
-      debug: 4.3.4
-      eslint: 9.1.1
+      '@typescript-eslint/typescript-estree': 7.13.0(typescript@5.4.5)
+      '@typescript-eslint/utils': 7.13.0(eslint@9.5.0)(typescript@5.4.5)
+      debug: 4.3.5
+      eslint: 9.5.0
       ts-api-utils: 1.3.0(typescript@5.4.5)
     optionalDependencies:
       typescript: 5.4.5
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/types@7.7.0': {}
+  '@typescript-eslint/types@7.13.0': {}
 
-  '@typescript-eslint/typescript-estree@7.7.0(typescript@5.4.5)':
+  '@typescript-eslint/typescript-estree@7.13.0(typescript@5.4.5)':
     dependencies:
-      '@typescript-eslint/types': 7.7.0
-      '@typescript-eslint/visitor-keys': 7.7.0
-      debug: 4.3.4
+      '@typescript-eslint/types': 7.13.0
+      '@typescript-eslint/visitor-keys': 7.13.0
+      debug: 4.3.5
       globby: 11.1.0
       is-glob: 4.0.3
       minimatch: 9.0.4
-      semver: 7.6.0
+      semver: 7.6.2
       ts-api-utils: 1.3.0(typescript@5.4.5)
     optionalDependencies:
       typescript: 5.4.5
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@7.7.0(eslint@9.1.1)(typescript@5.4.5)':
+  '@typescript-eslint/utils@7.13.0(eslint@9.5.0)(typescript@5.4.5)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@9.1.1)
-      '@types/json-schema': 7.0.15
-      '@types/semver': 7.5.8
-      '@typescript-eslint/scope-manager': 7.7.0
-      '@typescript-eslint/types': 7.7.0
-      '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5)
-      eslint: 9.1.1
-      semver: 7.6.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0)
+      '@typescript-eslint/scope-manager': 7.13.0
+      '@typescript-eslint/types': 7.13.0
+      '@typescript-eslint/typescript-estree': 7.13.0(typescript@5.4.5)
+      eslint: 9.5.0
     transitivePeerDependencies:
       - supports-color
       - typescript
 
-  '@typescript-eslint/visitor-keys@7.7.0':
+  '@typescript-eslint/visitor-keys@7.13.0':
     dependencies:
-      '@typescript-eslint/types': 7.7.0
+      '@typescript-eslint/types': 7.13.0
       eslint-visitor-keys: 3.4.3
 
-  '@vitest/coverage-v8@1.5.2(vitest@1.5.2(@types/node@20.12.7))':
+  '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.14.2))':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@bcoe/v8-coverage': 0.2.3
-      debug: 4.3.4
+      debug: 4.3.5
       istanbul-lib-coverage: 3.2.2
       istanbul-lib-report: 3.0.1
       istanbul-lib-source-maps: 5.0.4
       istanbul-reports: 3.1.7
       magic-string: 0.30.10
       magicast: 0.3.4
-      picocolors: 1.0.0
+      picocolors: 1.0.1
       std-env: 3.7.0
       strip-literal: 2.1.0
       test-exclude: 6.0.0
-      vitest: 1.5.2(@types/node@20.12.7)
+      vitest: 1.6.0(@types/node@20.14.2)
     transitivePeerDependencies:
       - supports-color
 
-  '@vitest/expect@1.5.2':
+  '@vitest/expect@1.6.0':
     dependencies:
-      '@vitest/spy': 1.5.2
-      '@vitest/utils': 1.5.2
+      '@vitest/spy': 1.6.0
+      '@vitest/utils': 1.6.0
       chai: 4.4.1
 
-  '@vitest/runner@1.5.2':
+  '@vitest/runner@1.6.0':
     dependencies:
-      '@vitest/utils': 1.5.2
+      '@vitest/utils': 1.6.0
       p-limit: 5.0.0
       pathe: 1.1.2
 
-  '@vitest/snapshot@1.5.2':
+  '@vitest/snapshot@1.6.0':
     dependencies:
       magic-string: 0.30.10
       pathe: 1.1.2
       pretty-format: 29.7.0
 
-  '@vitest/spy@1.5.2':
+  '@vitest/spy@1.6.0':
     dependencies:
       tinyspy: 2.2.1
 
-  '@vitest/utils@1.5.2':
+  '@vitest/utils@1.6.0':
     dependencies:
       diff-sequences: 29.6.3
       estree-walker: 3.0.3
@@ -4624,9 +4798,9 @@ snapshots:
       mime-types: 2.1.35
       negotiator: 0.6.3
 
-  acorn-jsx@5.3.2(acorn@8.11.3):
+  acorn-jsx@5.3.2(acorn@8.12.0):
     dependencies:
-      acorn: 8.11.3
+      acorn: 8.12.0
 
   acorn-node@1.8.2:
     dependencies:
@@ -4636,11 +4810,13 @@ snapshots:
 
   acorn-walk@7.2.0: {}
 
-  acorn-walk@8.3.2: {}
+  acorn-walk@8.3.3:
+    dependencies:
+      acorn: 8.12.0
 
   acorn@7.4.1: {}
 
-  acorn@8.11.3: {}
+  acorn@8.12.0: {}
 
   ajv@6.12.6:
     dependencies:
@@ -4649,7 +4825,7 @@ snapshots:
       json-schema-traverse: 0.4.1
       uri-js: 4.4.1
 
-  ajv@8.12.0:
+  ajv@8.16.0:
     dependencies:
       fast-deep-equal: 3.1.3
       json-schema-traverse: 1.0.0
@@ -4704,7 +4880,7 @@ snapshots:
     dependencies:
       chalk: 4.1.2
       char-spinner: 1.0.1
-      cli-table3: 0.6.4
+      cli-table3: 0.6.5
       color-support: 1.1.3
       cross-argv: 2.0.0
       form-data: 4.0.0
@@ -4722,14 +4898,14 @@ snapshots:
       progress: 2.0.3
       reinterval: 1.1.0
       retimer: 3.0.0
-      semver: 7.6.0
+      semver: 7.6.2
       subarg: 1.0.0
       timestring: 6.0.0
 
-  automd@0.3.7:
+  automd@0.3.7(magicast@0.3.4):
     dependencies:
       '@parcel/watcher': 2.4.1
-      c12: 1.10.0
+      c12: 1.11.1(magicast@0.3.4)
       citty: 0.1.6
       consola: 3.2.3
       defu: 6.1.4
@@ -4738,23 +4914,24 @@ snapshots:
       globby: 14.0.1
       magic-string: 0.30.10
       mdbox: 0.1.0
-      mlly: 1.6.1
+      mlly: 1.7.1
       ofetch: 1.3.4
       pathe: 1.1.2
       perfect-debounce: 1.0.0
-      pkg-types: 1.0.3
+      pkg-types: 1.1.1
       scule: 1.3.0
       untyped: 1.4.2
     transitivePeerDependencies:
+      - magicast
       - supports-color
 
   autoprefixer@10.4.19(postcss@8.4.38):
     dependencies:
-      browserslist: 4.23.0
-      caniuse-lite: 1.0.30001610
+      browserslist: 4.23.1
+      caniuse-lite: 1.0.30001636
       fraction.js: 4.3.7
       normalize-range: 0.1.2
-      picocolors: 1.0.0
+      picocolors: 1.0.1
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
@@ -4806,9 +4983,9 @@ snapshots:
     dependencies:
       balanced-match: 1.0.2
 
-  braces@3.0.2:
+  braces@3.0.3:
     dependencies:
-      fill-range: 7.0.1
+      fill-range: 7.1.1
 
   brorand@1.1.0: {}
 
@@ -4922,12 +5099,12 @@ snapshots:
       vm-browserify: 1.1.2
       xtend: 4.0.2
 
-  browserslist@4.23.0:
+  browserslist@4.23.1:
     dependencies:
-      caniuse-lite: 1.0.30001610
-      electron-to-chromium: 1.4.738
+      caniuse-lite: 1.0.30001636
+      electron-to-chromium: 1.4.803
       node-releases: 2.0.14
-      update-browserslist-db: 1.0.13(browserslist@4.23.0)
+      update-browserslist-db: 1.0.16(browserslist@4.23.1)
 
   buffer-from@1.1.2: {}
 
@@ -4953,20 +5130,22 @@ snapshots:
 
   bytes@3.1.2: {}
 
-  c12@1.10.0:
+  c12@1.11.1(magicast@0.3.4):
     dependencies:
       chokidar: 3.6.0
-      confbox: 0.1.6
+      confbox: 0.1.7
       defu: 6.1.4
       dotenv: 16.4.5
       giget: 1.2.3
-      jiti: 1.21.0
-      mlly: 1.6.1
+      jiti: 1.21.6
+      mlly: 1.7.1
       ohash: 1.1.3
       pathe: 1.1.2
       perfect-debounce: 1.0.0
-      pkg-types: 1.0.3
+      pkg-types: 1.1.1
       rc9: 2.1.2
+    optionalDependencies:
+      magicast: 0.3.4
 
   cac@6.7.14: {}
 
@@ -4989,18 +5168,18 @@ snapshots:
 
   caniuse-api@3.0.0:
     dependencies:
-      browserslist: 4.23.0
-      caniuse-lite: 1.0.30001610
+      browserslist: 4.23.1
+      caniuse-lite: 1.0.30001636
       lodash.memoize: 4.1.2
       lodash.uniq: 4.5.0
 
-  caniuse-lite@1.0.30001610: {}
+  caniuse-lite@1.0.30001636: {}
 
   chai@4.4.1:
     dependencies:
       assertion-error: 1.1.0
       check-error: 1.0.3
-      deep-eql: 4.1.3
+      deep-eql: 4.1.4
       get-func-name: 2.0.2
       loupe: 2.3.7
       pathval: 1.1.1
@@ -5027,9 +5206,9 @@ snapshots:
 
   chalk@5.3.0: {}
 
-  changelogen@0.5.5:
+  changelogen@0.5.5(magicast@0.3.4):
     dependencies:
-      c12: 1.10.0
+      c12: 1.11.1(magicast@0.3.4)
       colorette: 2.0.20
       consola: 3.2.3
       convert-gitmoji: 0.1.5
@@ -5039,11 +5218,13 @@ snapshots:
       ofetch: 1.3.4
       open: 9.1.0
       pathe: 1.1.2
-      pkg-types: 1.0.3
+      pkg-types: 1.1.1
       scule: 1.3.0
-      semver: 7.6.0
+      semver: 7.6.2
       std-env: 3.7.0
-      yaml: 2.4.1
+      yaml: 2.4.5
+    transitivePeerDependencies:
+      - magicast
 
   char-spinner@1.0.1: {}
 
@@ -5060,7 +5241,7 @@ snapshots:
   chokidar@3.6.0:
     dependencies:
       anymatch: 3.1.3
-      braces: 3.0.2
+      braces: 3.0.3
       glob-parent: 5.1.2
       is-binary-path: 2.1.0
       is-glob: 4.0.3
@@ -5086,7 +5267,7 @@ snapshots:
     dependencies:
       escape-string-regexp: 1.0.5
 
-  cli-table3@0.6.4:
+  cli-table3@0.6.5:
     dependencies:
       string-width: 4.2.3
     optionalDependencies:
@@ -5151,7 +5332,7 @@ snapshots:
       readable-stream: 3.6.2
       typedarray: 0.0.6
 
-  confbox@0.1.6: {}
+  confbox@0.1.7: {}
 
   connect@3.7.0:
     dependencies:
@@ -5190,9 +5371,9 @@ snapshots:
 
   cookiejar@2.1.4: {}
 
-  core-js-compat@3.37.0:
+  core-js-compat@3.37.1:
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.1
 
   core-util-is@1.0.3: {}
 
@@ -5268,48 +5449,48 @@ snapshots:
 
   cssesc@3.0.0: {}
 
-  cssnano-preset-default@6.1.2(postcss@8.4.38):
+  cssnano-preset-default@7.0.2(postcss@8.4.38):
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.1
       css-declaration-sorter: 7.2.0(postcss@8.4.38)
-      cssnano-utils: 4.0.2(postcss@8.4.38)
+      cssnano-utils: 5.0.0(postcss@8.4.38)
       postcss: 8.4.38
-      postcss-calc: 9.0.1(postcss@8.4.38)
-      postcss-colormin: 6.1.0(postcss@8.4.38)
-      postcss-convert-values: 6.1.0(postcss@8.4.38)
-      postcss-discard-comments: 6.0.2(postcss@8.4.38)
-      postcss-discard-duplicates: 6.0.3(postcss@8.4.38)
-      postcss-discard-empty: 6.0.3(postcss@8.4.38)
-      postcss-discard-overridden: 6.0.2(postcss@8.4.38)
-      postcss-merge-longhand: 6.0.5(postcss@8.4.38)
-      postcss-merge-rules: 6.1.1(postcss@8.4.38)
-      postcss-minify-font-values: 6.1.0(postcss@8.4.38)
-      postcss-minify-gradients: 6.0.3(postcss@8.4.38)
-      postcss-minify-params: 6.1.0(postcss@8.4.38)
-      postcss-minify-selectors: 6.0.4(postcss@8.4.38)
-      postcss-normalize-charset: 6.0.2(postcss@8.4.38)
-      postcss-normalize-display-values: 6.0.2(postcss@8.4.38)
-      postcss-normalize-positions: 6.0.2(postcss@8.4.38)
-      postcss-normalize-repeat-style: 6.0.2(postcss@8.4.38)
-      postcss-normalize-string: 6.0.2(postcss@8.4.38)
-      postcss-normalize-timing-functions: 6.0.2(postcss@8.4.38)
-      postcss-normalize-unicode: 6.1.0(postcss@8.4.38)
-      postcss-normalize-url: 6.0.2(postcss@8.4.38)
-      postcss-normalize-whitespace: 6.0.2(postcss@8.4.38)
-      postcss-ordered-values: 6.0.2(postcss@8.4.38)
-      postcss-reduce-initial: 6.1.0(postcss@8.4.38)
-      postcss-reduce-transforms: 6.0.2(postcss@8.4.38)
-      postcss-svgo: 6.0.3(postcss@8.4.38)
-      postcss-unique-selectors: 6.0.4(postcss@8.4.38)
-
-  cssnano-utils@4.0.2(postcss@8.4.38):
+      postcss-calc: 10.0.0(postcss@8.4.38)
+      postcss-colormin: 7.0.0(postcss@8.4.38)
+      postcss-convert-values: 7.0.0(postcss@8.4.38)
+      postcss-discard-comments: 7.0.0(postcss@8.4.38)
+      postcss-discard-duplicates: 7.0.0(postcss@8.4.38)
+      postcss-discard-empty: 7.0.0(postcss@8.4.38)
+      postcss-discard-overridden: 7.0.0(postcss@8.4.38)
+      postcss-merge-longhand: 7.0.1(postcss@8.4.38)
+      postcss-merge-rules: 7.0.1(postcss@8.4.38)
+      postcss-minify-font-values: 7.0.0(postcss@8.4.38)
+      postcss-minify-gradients: 7.0.0(postcss@8.4.38)
+      postcss-minify-params: 7.0.0(postcss@8.4.38)
+      postcss-minify-selectors: 7.0.1(postcss@8.4.38)
+      postcss-normalize-charset: 7.0.0(postcss@8.4.38)
+      postcss-normalize-display-values: 7.0.0(postcss@8.4.38)
+      postcss-normalize-positions: 7.0.0(postcss@8.4.38)
+      postcss-normalize-repeat-style: 7.0.0(postcss@8.4.38)
+      postcss-normalize-string: 7.0.0(postcss@8.4.38)
+      postcss-normalize-timing-functions: 7.0.0(postcss@8.4.38)
+      postcss-normalize-unicode: 7.0.0(postcss@8.4.38)
+      postcss-normalize-url: 7.0.0(postcss@8.4.38)
+      postcss-normalize-whitespace: 7.0.0(postcss@8.4.38)
+      postcss-ordered-values: 7.0.0(postcss@8.4.38)
+      postcss-reduce-initial: 7.0.0(postcss@8.4.38)
+      postcss-reduce-transforms: 7.0.0(postcss@8.4.38)
+      postcss-svgo: 7.0.1(postcss@8.4.38)
+      postcss-unique-selectors: 7.0.1(postcss@8.4.38)
+
+  cssnano-utils@5.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
 
-  cssnano@6.1.2(postcss@8.4.38):
+  cssnano@7.0.2(postcss@8.4.38):
     dependencies:
-      cssnano-preset-default: 6.1.2(postcss@8.4.38)
-      lilconfig: 3.1.1
+      cssnano-preset-default: 7.0.2(postcss@8.4.38)
+      lilconfig: 3.1.2
       postcss: 8.4.38
 
   csso@5.0.5:
@@ -5402,11 +5583,11 @@ snapshots:
     dependencies:
       ms: 2.0.0
 
-  debug@4.3.4:
+  debug@4.3.5:
     dependencies:
       ms: 2.1.2
 
-  deep-eql@4.1.3:
+  deep-eql@4.1.4:
     dependencies:
       type-detect: 4.0.8
 
@@ -5479,7 +5660,7 @@ snapshots:
 
   didyoumean2@6.0.1:
     dependencies:
-      '@babel/runtime': 7.24.4
+      '@babel/runtime': 7.24.7
       fastest-levenshtein: 1.0.16
       lodash.deburr: 4.1.0
 
@@ -5530,7 +5711,7 @@ snapshots:
 
   ee-first@1.1.1: {}
 
-  electron-to-chromium@1.4.738: {}
+  electron-to-chromium@1.4.803: {}
 
   elliptic@6.5.5:
     dependencies:
@@ -5616,6 +5797,32 @@ snapshots:
       '@esbuild/win32-ia32': 0.20.2
       '@esbuild/win32-x64': 0.20.2
 
+  esbuild@0.21.5:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.21.5
+      '@esbuild/android-arm': 0.21.5
+      '@esbuild/android-arm64': 0.21.5
+      '@esbuild/android-x64': 0.21.5
+      '@esbuild/darwin-arm64': 0.21.5
+      '@esbuild/darwin-x64': 0.21.5
+      '@esbuild/freebsd-arm64': 0.21.5
+      '@esbuild/freebsd-x64': 0.21.5
+      '@esbuild/linux-arm': 0.21.5
+      '@esbuild/linux-arm64': 0.21.5
+      '@esbuild/linux-ia32': 0.21.5
+      '@esbuild/linux-loong64': 0.21.5
+      '@esbuild/linux-mips64el': 0.21.5
+      '@esbuild/linux-ppc64': 0.21.5
+      '@esbuild/linux-riscv64': 0.21.5
+      '@esbuild/linux-s390x': 0.21.5
+      '@esbuild/linux-x64': 0.21.5
+      '@esbuild/netbsd-x64': 0.21.5
+      '@esbuild/openbsd-x64': 0.21.5
+      '@esbuild/sunos-x64': 0.21.5
+      '@esbuild/win32-arm64': 0.21.5
+      '@esbuild/win32-ia32': 0.21.5
+      '@esbuild/win32-x64': 0.21.5
+
   escalade@3.1.2: {}
 
   escape-html@1.0.3: {}
@@ -5624,34 +5831,34 @@ snapshots:
 
   escape-string-regexp@4.0.0: {}
 
-  eslint-config-unjs@0.3.0-rc.6(eslint@9.1.1)(typescript@5.4.5):
+  eslint-config-unjs@0.3.2(eslint@9.5.0)(typescript@5.4.5):
     dependencies:
-      '@eslint/js': 9.0.0
-      eslint: 9.1.1
-      eslint-plugin-markdown: 4.0.1(eslint@9.1.1)
-      eslint-plugin-unicorn: 52.0.0(eslint@9.1.1)
-      globals: 15.0.0
+      '@eslint/js': 9.5.0
+      eslint: 9.5.0
+      eslint-plugin-markdown: 5.0.0(eslint@9.5.0)
+      eslint-plugin-unicorn: 53.0.0(eslint@9.5.0)
+      globals: 15.6.0
       typescript: 5.4.5
-      typescript-eslint: 7.7.0(eslint@9.1.1)(typescript@5.4.5)
+      typescript-eslint: 7.13.0(eslint@9.5.0)(typescript@5.4.5)
     transitivePeerDependencies:
       - supports-color
 
-  eslint-plugin-markdown@4.0.1(eslint@9.1.1):
+  eslint-plugin-markdown@5.0.0(eslint@9.5.0):
     dependencies:
-      eslint: 9.1.1
+      eslint: 9.5.0
       mdast-util-from-markdown: 0.8.5
     transitivePeerDependencies:
       - supports-color
 
-  eslint-plugin-unicorn@52.0.0(eslint@9.1.1):
+  eslint-plugin-unicorn@53.0.0(eslint@9.5.0):
     dependencies:
-      '@babel/helper-validator-identifier': 7.22.20
-      '@eslint-community/eslint-utils': 4.4.0(eslint@9.1.1)
-      '@eslint/eslintrc': 2.1.4
+      '@babel/helper-validator-identifier': 7.24.7
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0)
+      '@eslint/eslintrc': 3.1.0
       ci-info: 4.0.0
       clean-regexp: 1.0.0
-      core-js-compat: 3.37.0
-      eslint: 9.1.1
+      core-js-compat: 3.37.1
+      eslint: 9.5.0
       esquery: 1.5.0
       indent-string: 4.0.0
       is-builtin-module: 3.2.1
@@ -5660,7 +5867,7 @@ snapshots:
       read-pkg-up: 7.0.1
       regexp-tree: 0.1.27
       regjsparser: 0.10.0
-      semver: 7.6.0
+      semver: 7.6.2
       strip-indent: 3.0.0
     transitivePeerDependencies:
       - supports-color
@@ -5674,20 +5881,20 @@ snapshots:
 
   eslint-visitor-keys@4.0.0: {}
 
-  eslint@9.1.1:
+  eslint@9.5.0:
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@9.1.1)
-      '@eslint-community/regexpp': 4.10.0
-      '@eslint/eslintrc': 3.0.2
-      '@eslint/js': 9.1.1
-      '@humanwhocodes/config-array': 0.13.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0)
+      '@eslint-community/regexpp': 4.10.1
+      '@eslint/config-array': 0.16.0
+      '@eslint/eslintrc': 3.1.0
+      '@eslint/js': 9.5.0
       '@humanwhocodes/module-importer': 1.0.1
-      '@humanwhocodes/retry': 0.2.3
+      '@humanwhocodes/retry': 0.3.0
       '@nodelib/fs.walk': 1.2.8
       ajv: 6.12.6
       chalk: 4.1.2
       cross-spawn: 7.0.3
-      debug: 4.3.4
+      debug: 4.3.5
       escape-string-regexp: 4.0.0
       eslint-scope: 8.0.1
       eslint-visitor-keys: 4.0.0
@@ -5707,7 +5914,7 @@ snapshots:
       lodash.merge: 4.6.2
       minimatch: 3.1.2
       natural-compare: 1.4.0
-      optionator: 0.9.3
+      optionator: 0.9.4
       strip-ansi: 6.0.1
       text-table: 0.2.0
     transitivePeerDependencies:
@@ -5715,16 +5922,10 @@ snapshots:
 
   espree@10.0.1:
     dependencies:
-      acorn: 8.11.3
-      acorn-jsx: 5.3.2(acorn@8.11.3)
+      acorn: 8.12.0
+      acorn-jsx: 5.3.2(acorn@8.12.0)
       eslint-visitor-keys: 4.0.0
 
-  espree@9.6.1:
-    dependencies:
-      acorn: 8.11.3
-      acorn-jsx: 5.3.2(acorn@8.11.3)
-      eslint-visitor-keys: 3.4.3
-
   esquery@1.5.0:
     dependencies:
       estraverse: 5.3.0
@@ -5838,7 +6039,7 @@ snapshots:
       '@nodelib/fs.walk': 1.2.8
       glob-parent: 5.1.2
       merge2: 1.4.1
-      micromatch: 4.0.5
+      micromatch: 4.0.7
 
   fast-json-stable-stringify@2.1.0: {}
 
@@ -5856,7 +6057,7 @@ snapshots:
     dependencies:
       flat-cache: 4.0.1
 
-  fill-range@7.0.1:
+  fill-range@7.1.1:
     dependencies:
       to-regex-range: 5.0.1
 
@@ -5911,12 +6112,11 @@ snapshots:
       combined-stream: 1.0.8
       mime-types: 2.1.35
 
-  formidable@2.1.2:
+  formidable@3.5.1:
     dependencies:
       dezalgo: 1.0.4
       hexoid: 1.0.0
       once: 1.4.0
-      qs: 6.12.1
 
   forwarded@0.2.0: {}
 
@@ -6007,13 +6207,9 @@ snapshots:
 
   globals@11.12.0: {}
 
-  globals@13.24.0:
-    dependencies:
-      type-fest: 0.20.2
-
   globals@14.0.0: {}
 
-  globals@15.0.0: {}
+  globals@15.6.0: {}
 
   globby@11.1.0:
     dependencies:
@@ -6055,7 +6251,7 @@ snapshots:
       crossws: 0.2.4
       defu: 6.1.4
       destr: 2.0.3
-      iron-webcrypto: 1.1.0
+      iron-webcrypto: 1.2.1
       ohash: 1.1.3
       radix3: 1.1.2
       ufo: 1.5.3
@@ -6215,9 +6411,7 @@ snapshots:
 
   ipaddr.js@1.9.1: {}
 
-  iron-webcrypto@1.1.0: {}
-
-  iron-webcrypto@1.1.1: {}
+  iron-webcrypto@1.2.1: {}
 
   is-alphabetical@1.0.4: {}
 
@@ -6328,7 +6522,7 @@ snapshots:
   istanbul-lib-source-maps@5.0.4:
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
-      debug: 4.3.4
+      debug: 4.3.5
       istanbul-lib-coverage: 3.2.2
     transitivePeerDependencies:
       - supports-color
@@ -6338,7 +6532,7 @@ snapshots:
       html-escaper: 2.0.2
       istanbul-lib-report: 3.0.1
 
-  jiti@1.21.0: {}
+  jiti@1.21.6: {}
 
   js-tokens@4.0.0: {}
 
@@ -6366,8 +6560,6 @@ snapshots:
 
   json5@2.2.3: {}
 
-  jsonc-parser@3.2.1: {}
-
   jsonfile@6.1.0:
     dependencies:
       universalify: 2.0.1
@@ -6396,7 +6588,7 @@ snapshots:
       prelude-ls: 1.2.1
       type-check: 0.4.0
 
-  lilconfig@3.1.1: {}
+  lilconfig@3.1.2: {}
 
   lines-and-columns@1.2.4: {}
 
@@ -6412,8 +6604,8 @@ snapshots:
       get-port-please: 3.1.2
       h3: 1.11.1
       http-shutdown: 1.2.2
-      jiti: 1.21.0
-      mlly: 1.6.1
+      jiti: 1.21.6
+      mlly: 1.7.1
       node-forge: 1.3.1
       pathe: 1.1.2
       std-env: 3.7.0
@@ -6425,8 +6617,8 @@ snapshots:
 
   local-pkg@0.5.0:
     dependencies:
-      mlly: 1.6.1
-      pkg-types: 1.0.3
+      mlly: 1.7.1
+      pkg-types: 1.1.1
 
   locate-path@5.0.0:
     dependencies:
@@ -6466,10 +6658,6 @@ snapshots:
     dependencies:
       yallist: 3.1.1
 
-  lru-cache@6.0.0:
-    dependencies:
-      yallist: 4.0.0
-
   magic-string@0.23.2:
     dependencies:
       sourcemap-codec: 1.4.8
@@ -6480,8 +6668,8 @@ snapshots:
 
   magicast@0.3.4:
     dependencies:
-      '@babel/parser': 7.24.4
-      '@babel/types': 7.24.0
+      '@babel/parser': 7.24.7
+      '@babel/types': 7.24.7
       source-map-js: 1.2.0
 
   make-dir@3.1.0:
@@ -6490,7 +6678,7 @@ snapshots:
 
   make-dir@4.0.0:
     dependencies:
-      semver: 7.6.0
+      semver: 7.6.2
 
   manage-path@2.0.0: {}
 
@@ -6538,14 +6726,14 @@ snapshots:
 
   micromark@2.11.4:
     dependencies:
-      debug: 4.3.4
+      debug: 4.3.5
       parse-entities: 2.0.0
     transitivePeerDependencies:
       - supports-color
 
-  micromatch@4.0.5:
+  micromatch@4.0.7:
     dependencies:
-      braces: 3.0.2
+      braces: 3.0.3
       picomatch: 2.3.1
 
   miller-rabin@4.0.1:
@@ -6604,29 +6792,31 @@ snapshots:
 
   mkdirp@1.0.4: {}
 
-  mkdist@1.4.0(typescript@5.4.5):
+  mkdist@1.5.1(typescript@5.4.5):
     dependencies:
       autoprefixer: 10.4.19(postcss@8.4.38)
       citty: 0.1.6
-      cssnano: 6.1.2(postcss@8.4.38)
+      cssnano: 7.0.2(postcss@8.4.38)
       defu: 6.1.4
-      esbuild: 0.19.12
+      esbuild: 0.20.2
       fs-extra: 11.2.0
-      globby: 13.2.2
-      jiti: 1.21.0
-      mlly: 1.6.1
+      globby: 14.0.1
+      jiti: 1.21.6
+      mlly: 1.7.1
       mri: 1.2.0
       pathe: 1.1.2
+      pkg-types: 1.1.1
       postcss: 8.4.38
       postcss-nested: 6.0.1(postcss@8.4.38)
+      semver: 7.6.2
     optionalDependencies:
       typescript: 5.4.5
 
-  mlly@1.6.1:
+  mlly@1.7.1:
     dependencies:
-      acorn: 8.11.3
+      acorn: 8.12.0
       pathe: 1.1.2
-      pkg-types: 1.0.3
+      pkg-types: 1.1.1
       ufo: 1.5.3
 
   module-deps@6.2.3:
@@ -6789,14 +6979,14 @@ snapshots:
     dependencies:
       is-wsl: 1.1.0
 
-  optionator@0.9.3:
+  optionator@0.9.4:
     dependencies:
-      '@aashutoshrathi/word-wrap': 1.2.6
       deep-is: 0.1.4
       fast-levenshtein: 2.0.6
       levn: 0.4.1
       prelude-ls: 1.2.1
       type-check: 0.4.0
+      word-wrap: 1.2.5
 
   os-browserify@0.3.0: {}
 
@@ -6852,7 +7042,7 @@ snapshots:
 
   parse-json@5.2.0:
     dependencies:
-      '@babel/code-frame': 7.24.2
+      '@babel/code-frame': 7.24.7
       error-ex: 1.3.2
       json-parse-even-better-errors: 2.3.1
       lines-and-columns: 1.2.4
@@ -6893,188 +7083,188 @@ snapshots:
 
   perfect-debounce@1.0.0: {}
 
-  picocolors@1.0.0: {}
+  picocolors@1.0.1: {}
 
   picomatch@2.3.1: {}
 
-  pkg-types@1.0.3:
+  pkg-types@1.1.1:
     dependencies:
-      jsonc-parser: 3.2.1
-      mlly: 1.6.1
+      confbox: 0.1.7
+      mlly: 1.7.1
       pathe: 1.1.2
 
   pluralize@8.0.0: {}
 
   possible-typed-array-names@1.0.0: {}
 
-  postcss-calc@9.0.1(postcss@8.4.38):
+  postcss-calc@10.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
-      postcss-selector-parser: 6.0.16
+      postcss-selector-parser: 6.1.0
       postcss-value-parser: 4.2.0
 
-  postcss-colormin@6.1.0(postcss@8.4.38):
+  postcss-colormin@7.0.0(postcss@8.4.38):
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.1
       caniuse-api: 3.0.0
       colord: 2.9.3
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-convert-values@6.1.0(postcss@8.4.38):
+  postcss-convert-values@7.0.0(postcss@8.4.38):
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.1
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-discard-comments@6.0.2(postcss@8.4.38):
+  postcss-discard-comments@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
 
-  postcss-discard-duplicates@6.0.3(postcss@8.4.38):
+  postcss-discard-duplicates@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
 
-  postcss-discard-empty@6.0.3(postcss@8.4.38):
+  postcss-discard-empty@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
 
-  postcss-discard-overridden@6.0.2(postcss@8.4.38):
+  postcss-discard-overridden@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
 
-  postcss-merge-longhand@6.0.5(postcss@8.4.38):
+  postcss-merge-longhand@7.0.1(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
-      stylehacks: 6.1.1(postcss@8.4.38)
+      stylehacks: 7.0.1(postcss@8.4.38)
 
-  postcss-merge-rules@6.1.1(postcss@8.4.38):
+  postcss-merge-rules@7.0.1(postcss@8.4.38):
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.1
       caniuse-api: 3.0.0
-      cssnano-utils: 4.0.2(postcss@8.4.38)
+      cssnano-utils: 5.0.0(postcss@8.4.38)
       postcss: 8.4.38
-      postcss-selector-parser: 6.0.16
+      postcss-selector-parser: 6.1.0
 
-  postcss-minify-font-values@6.1.0(postcss@8.4.38):
+  postcss-minify-font-values@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-minify-gradients@6.0.3(postcss@8.4.38):
+  postcss-minify-gradients@7.0.0(postcss@8.4.38):
     dependencies:
       colord: 2.9.3
-      cssnano-utils: 4.0.2(postcss@8.4.38)
+      cssnano-utils: 5.0.0(postcss@8.4.38)
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-minify-params@6.1.0(postcss@8.4.38):
+  postcss-minify-params@7.0.0(postcss@8.4.38):
     dependencies:
-      browserslist: 4.23.0
-      cssnano-utils: 4.0.2(postcss@8.4.38)
+      browserslist: 4.23.1
+      cssnano-utils: 5.0.0(postcss@8.4.38)
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-minify-selectors@6.0.4(postcss@8.4.38):
+  postcss-minify-selectors@7.0.1(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
-      postcss-selector-parser: 6.0.16
+      postcss-selector-parser: 6.1.0
 
   postcss-nested@6.0.1(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
-      postcss-selector-parser: 6.0.16
+      postcss-selector-parser: 6.1.0
 
-  postcss-normalize-charset@6.0.2(postcss@8.4.38):
+  postcss-normalize-charset@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
 
-  postcss-normalize-display-values@6.0.2(postcss@8.4.38):
+  postcss-normalize-display-values@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-positions@6.0.2(postcss@8.4.38):
+  postcss-normalize-positions@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-repeat-style@6.0.2(postcss@8.4.38):
+  postcss-normalize-repeat-style@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-string@6.0.2(postcss@8.4.38):
+  postcss-normalize-string@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-timing-functions@6.0.2(postcss@8.4.38):
+  postcss-normalize-timing-functions@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-unicode@6.1.0(postcss@8.4.38):
+  postcss-normalize-unicode@7.0.0(postcss@8.4.38):
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.1
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-url@6.0.2(postcss@8.4.38):
+  postcss-normalize-url@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-normalize-whitespace@6.0.2(postcss@8.4.38):
+  postcss-normalize-whitespace@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-ordered-values@6.0.2(postcss@8.4.38):
+  postcss-ordered-values@7.0.0(postcss@8.4.38):
     dependencies:
-      cssnano-utils: 4.0.2(postcss@8.4.38)
+      cssnano-utils: 5.0.0(postcss@8.4.38)
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-reduce-initial@6.1.0(postcss@8.4.38):
+  postcss-reduce-initial@7.0.0(postcss@8.4.38):
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.1
       caniuse-api: 3.0.0
       postcss: 8.4.38
 
-  postcss-reduce-transforms@6.0.2(postcss@8.4.38):
+  postcss-reduce-transforms@7.0.0(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
 
-  postcss-selector-parser@6.0.16:
+  postcss-selector-parser@6.1.0:
     dependencies:
       cssesc: 3.0.0
       util-deprecate: 1.0.2
 
-  postcss-svgo@6.0.3(postcss@8.4.38):
+  postcss-svgo@7.0.1(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
       postcss-value-parser: 4.2.0
-      svgo: 3.2.0
+      svgo: 3.3.2
 
-  postcss-unique-selectors@6.0.4(postcss@8.4.38):
+  postcss-unique-selectors@7.0.1(postcss@8.4.38):
     dependencies:
       postcss: 8.4.38
-      postcss-selector-parser: 6.0.16
+      postcss-selector-parser: 6.1.0
 
   postcss-value-parser@4.2.0: {}
 
   postcss@8.4.38:
     dependencies:
       nanoid: 3.3.7
-      picocolors: 1.0.0
+      picocolors: 1.0.1
       source-map-js: 1.2.0
 
   prelude-ls@1.2.1: {}
 
-  prettier@3.2.5: {}
+  prettier@3.3.2: {}
 
   pretty-bytes@5.6.0: {}
 
@@ -7084,7 +7274,7 @@ snapshots:
     dependencies:
       '@jest/schemas': 29.6.3
       ansi-styles: 5.2.0
-      react-is: 18.2.0
+      react-is: 18.3.1
 
   pretty-hrtime@1.0.3: {}
 
@@ -7168,7 +7358,7 @@ snapshots:
       react: 18.3.1
       scheduler: 0.23.2
 
-  react-is@18.2.0: {}
+  react-is@18.3.1: {}
 
   react@18.3.1:
     dependencies:
@@ -7240,38 +7430,38 @@ snapshots:
       hash-base: 3.1.0
       inherits: 2.0.4
 
-  rollup-plugin-dts@6.1.0(rollup@3.29.4)(typescript@5.4.5):
+  rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.4.5):
     dependencies:
       magic-string: 0.30.10
       rollup: 3.29.4
       typescript: 5.4.5
     optionalDependencies:
-      '@babel/code-frame': 7.24.2
+      '@babel/code-frame': 7.24.7
 
   rollup@3.29.4:
     optionalDependencies:
       fsevents: 2.3.3
 
-  rollup@4.14.3:
+  rollup@4.18.0:
     dependencies:
       '@types/estree': 1.0.5
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.14.3
-      '@rollup/rollup-android-arm64': 4.14.3
-      '@rollup/rollup-darwin-arm64': 4.14.3
-      '@rollup/rollup-darwin-x64': 4.14.3
-      '@rollup/rollup-linux-arm-gnueabihf': 4.14.3
-      '@rollup/rollup-linux-arm-musleabihf': 4.14.3
-      '@rollup/rollup-linux-arm64-gnu': 4.14.3
-      '@rollup/rollup-linux-arm64-musl': 4.14.3
-      '@rollup/rollup-linux-powerpc64le-gnu': 4.14.3
-      '@rollup/rollup-linux-riscv64-gnu': 4.14.3
-      '@rollup/rollup-linux-s390x-gnu': 4.14.3
-      '@rollup/rollup-linux-x64-gnu': 4.14.3
-      '@rollup/rollup-linux-x64-musl': 4.14.3
-      '@rollup/rollup-win32-arm64-msvc': 4.14.3
-      '@rollup/rollup-win32-ia32-msvc': 4.14.3
-      '@rollup/rollup-win32-x64-msvc': 4.14.3
+      '@rollup/rollup-android-arm-eabi': 4.18.0
+      '@rollup/rollup-android-arm64': 4.18.0
+      '@rollup/rollup-darwin-arm64': 4.18.0
+      '@rollup/rollup-darwin-x64': 4.18.0
+      '@rollup/rollup-linux-arm-gnueabihf': 4.18.0
+      '@rollup/rollup-linux-arm-musleabihf': 4.18.0
+      '@rollup/rollup-linux-arm64-gnu': 4.18.0
+      '@rollup/rollup-linux-arm64-musl': 4.18.0
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0
+      '@rollup/rollup-linux-riscv64-gnu': 4.18.0
+      '@rollup/rollup-linux-s390x-gnu': 4.18.0
+      '@rollup/rollup-linux-x64-gnu': 4.18.0
+      '@rollup/rollup-linux-x64-musl': 4.18.0
+      '@rollup/rollup-win32-arm64-msvc': 4.18.0
+      '@rollup/rollup-win32-ia32-msvc': 4.18.0
+      '@rollup/rollup-win32-x64-msvc': 4.18.0
       fsevents: 2.3.3
 
   run-applescript@5.0.0:
@@ -7298,9 +7488,7 @@ snapshots:
 
   semver@6.3.1: {}
 
-  semver@7.6.0:
-    dependencies:
-      lru-cache: 6.0.0
+  semver@7.6.2: {}
 
   send@0.18.0:
     dependencies:
@@ -7391,16 +7579,16 @@ snapshots:
   spdx-correct@3.2.0:
     dependencies:
       spdx-expression-parse: 3.0.1
-      spdx-license-ids: 3.0.17
+      spdx-license-ids: 3.0.18
 
   spdx-exceptions@2.5.0: {}
 
   spdx-expression-parse@3.0.1:
     dependencies:
       spdx-exceptions: 2.5.0
-      spdx-license-ids: 3.0.17
+      spdx-license-ids: 3.0.18
 
-  spdx-license-ids@3.0.17: {}
+  spdx-license-ids@3.0.18: {}
 
   split2@4.2.0: {}
 
@@ -7478,35 +7666,34 @@ snapshots:
     dependencies:
       js-tokens: 9.0.0
 
-  stylehacks@6.1.1(postcss@8.4.38):
+  stylehacks@7.0.1(postcss@8.4.38):
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.1
       postcss: 8.4.38
-      postcss-selector-parser: 6.0.16
+      postcss-selector-parser: 6.1.0
 
   subarg@1.0.0:
     dependencies:
       minimist: 1.2.8
 
-  superagent@8.1.2:
+  superagent@9.0.2:
     dependencies:
       component-emitter: 1.3.1
       cookiejar: 2.1.4
-      debug: 4.3.4
+      debug: 4.3.5
       fast-safe-stringify: 2.1.1
       form-data: 4.0.0
-      formidable: 2.1.2
+      formidable: 3.5.1
       methods: 1.1.2
       mime: 2.6.0
       qs: 6.12.1
-      semver: 7.6.0
     transitivePeerDependencies:
       - supports-color
 
-  supertest@6.3.4:
+  supertest@7.0.0:
     dependencies:
       methods: 1.1.2
-      superagent: 8.1.2
+      superagent: 9.0.2
     transitivePeerDependencies:
       - supports-color
 
@@ -7522,7 +7709,7 @@ snapshots:
 
   supports-preserve-symlinks-flag@1.0.0: {}
 
-  svgo@3.2.0:
+  svgo@3.3.2:
     dependencies:
       '@trysound/sax': 0.2.0
       commander: 7.2.0
@@ -7530,7 +7717,7 @@ snapshots:
       css-tree: 2.3.1
       css-what: 6.1.0
       csso: 5.0.5
-      picocolors: 1.0.0
+      picocolors: 1.0.1
 
   syntax-error@1.4.0:
     dependencies:
@@ -7579,7 +7766,7 @@ snapshots:
 
   timestring@6.0.0: {}
 
-  tinybench@2.7.0: {}
+  tinybench@2.8.0: {}
 
   tinypool@0.8.4: {}
 
@@ -7619,8 +7806,6 @@ snapshots:
 
   type-detect@4.0.8: {}
 
-  type-fest@0.20.2: {}
-
   type-fest@0.6.0: {}
 
   type-fest@0.8.1: {}
@@ -7632,12 +7817,12 @@ snapshots:
 
   typedarray@0.0.6: {}
 
-  typescript-eslint@7.7.0(eslint@9.1.1)(typescript@5.4.5):
+  typescript-eslint@7.13.0(eslint@9.5.0)(typescript@5.4.5):
     dependencies:
-      '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.1.1)(typescript@5.4.5))(eslint@9.1.1)(typescript@5.4.5)
-      '@typescript-eslint/parser': 7.7.0(eslint@9.1.1)(typescript@5.4.5)
-      '@typescript-eslint/utils': 7.7.0(eslint@9.1.1)(typescript@5.4.5)
-      eslint: 9.1.1
+      '@typescript-eslint/eslint-plugin': 7.13.0(@typescript-eslint/parser@7.13.0(eslint@9.5.0)(typescript@5.4.5))(eslint@9.5.0)(typescript@5.4.5)
+      '@typescript-eslint/parser': 7.13.0(eslint@9.5.0)(typescript@5.4.5)
+      '@typescript-eslint/utils': 7.13.0(eslint@9.5.0)(typescript@5.4.5)
+      eslint: 9.5.0
     optionalDependencies:
       typescript: 5.4.5
     transitivePeerDependencies:
@@ -7652,10 +7837,10 @@ snapshots:
   unbuild@2.0.0(typescript@5.4.5):
     dependencies:
       '@rollup/plugin-alias': 5.1.0(rollup@3.29.4)
-      '@rollup/plugin-commonjs': 25.0.7(rollup@3.29.4)
+      '@rollup/plugin-commonjs': 25.0.8(rollup@3.29.4)
       '@rollup/plugin-json': 6.1.0(rollup@3.29.4)
       '@rollup/plugin-node-resolve': 15.2.3(rollup@3.29.4)
-      '@rollup/plugin-replace': 5.0.5(rollup@3.29.4)
+      '@rollup/plugin-replace': 5.0.7(rollup@3.29.4)
       '@rollup/pluginutils': 5.1.0(rollup@3.29.4)
       chalk: 5.3.0
       citty: 0.1.6
@@ -7664,15 +7849,15 @@ snapshots:
       esbuild: 0.19.12
       globby: 13.2.2
       hookable: 5.5.3
-      jiti: 1.21.0
+      jiti: 1.21.6
       magic-string: 0.30.10
-      mkdist: 1.4.0(typescript@5.4.5)
-      mlly: 1.6.1
+      mkdist: 1.5.1(typescript@5.4.5)
+      mlly: 1.7.1
       pathe: 1.1.2
-      pkg-types: 1.0.3
+      pkg-types: 1.1.1
       pretty-bytes: 6.1.1
       rollup: 3.29.4
-      rollup-plugin-dts: 6.1.0(rollup@3.29.4)(typescript@5.4.5)
+      rollup-plugin-dts: 6.1.1(rollup@3.29.4)(typescript@5.4.5)
       scule: 1.3.0
       untyped: 1.4.2
     optionalDependencies:
@@ -7680,6 +7865,7 @@ snapshots:
     transitivePeerDependencies:
       - sass
       - supports-color
+      - vue-tsc
 
   uncrypto@0.1.3: {}
 
@@ -7693,6 +7879,8 @@ snapshots:
 
   undici-types@5.26.5: {}
 
+  undici@6.19.2: {}
+
   unenv@1.9.0:
     dependencies:
       consola: 3.2.3
@@ -7721,21 +7909,21 @@ snapshots:
 
   untyped@1.4.2:
     dependencies:
-      '@babel/core': 7.24.4
-      '@babel/standalone': 7.24.4
-      '@babel/types': 7.24.0
+      '@babel/core': 7.24.7
+      '@babel/standalone': 7.24.7
+      '@babel/types': 7.24.7
       defu: 6.1.4
-      jiti: 1.21.0
+      jiti: 1.21.6
       mri: 1.2.0
       scule: 1.3.0
     transitivePeerDependencies:
       - supports-color
 
-  update-browserslist-db@1.0.13(browserslist@4.23.0):
+  update-browserslist-db@1.0.16(browserslist@4.23.1):
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.1
       escalade: 3.1.2
-      picocolors: 1.0.0
+      picocolors: 1.0.1
 
   upper-case@1.1.3: {}
 
@@ -7779,13 +7967,13 @@ snapshots:
 
   vary@1.1.2: {}
 
-  vite-node@1.5.2(@types/node@20.12.7):
+  vite-node@1.6.0(@types/node@20.14.2):
     dependencies:
       cac: 6.7.14
-      debug: 4.3.4
+      debug: 4.3.5
       pathe: 1.1.2
-      picocolors: 1.0.0
-      vite: 5.2.9(@types/node@20.12.7)
+      picocolors: 1.0.1
+      vite: 5.3.1(@types/node@20.14.2)
     transitivePeerDependencies:
       - '@types/node'
       - less
@@ -7796,39 +7984,39 @@ snapshots:
       - supports-color
       - terser
 
-  vite@5.2.9(@types/node@20.12.7):
+  vite@5.3.1(@types/node@20.14.2):
     dependencies:
-      esbuild: 0.20.2
+      esbuild: 0.21.5
       postcss: 8.4.38
-      rollup: 4.14.3
+      rollup: 4.18.0
     optionalDependencies:
-      '@types/node': 20.12.7
+      '@types/node': 20.14.2
       fsevents: 2.3.3
 
-  vitest@1.5.2(@types/node@20.12.7):
+  vitest@1.6.0(@types/node@20.14.2):
     dependencies:
-      '@vitest/expect': 1.5.2
-      '@vitest/runner': 1.5.2
-      '@vitest/snapshot': 1.5.2
-      '@vitest/spy': 1.5.2
-      '@vitest/utils': 1.5.2
-      acorn-walk: 8.3.2
+      '@vitest/expect': 1.6.0
+      '@vitest/runner': 1.6.0
+      '@vitest/snapshot': 1.6.0
+      '@vitest/spy': 1.6.0
+      '@vitest/utils': 1.6.0
+      acorn-walk: 8.3.3
       chai: 4.4.1
-      debug: 4.3.4
+      debug: 4.3.5
       execa: 8.0.1
       local-pkg: 0.5.0
       magic-string: 0.30.10
       pathe: 1.1.2
-      picocolors: 1.0.0
+      picocolors: 1.0.1
       std-env: 3.7.0
       strip-literal: 2.1.0
-      tinybench: 2.7.0
+      tinybench: 2.8.0
       tinypool: 0.8.4
-      vite: 5.2.9(@types/node@20.12.7)
-      vite-node: 1.5.2(@types/node@20.12.7)
+      vite: 5.3.1(@types/node@20.14.2)
+      vite-node: 1.6.0(@types/node@20.14.2)
       why-is-node-running: 2.2.2
     optionalDependencies:
-      '@types/node': 20.12.7
+      '@types/node': 20.14.2
     transitivePeerDependencies:
       - less
       - lightningcss
@@ -7857,6 +8045,8 @@ snapshots:
       siginfo: 2.0.0
       stackback: 0.0.2
 
+  word-wrap@1.2.5: {}
+
   wrappy@1.0.2: {}
 
   xtend@4.0.2: {}
@@ -7865,10 +8055,10 @@ snapshots:
 
   yallist@4.0.0: {}
 
-  yaml@2.4.1: {}
+  yaml@2.4.5: {}
 
   yocto-queue@0.1.0: {}
 
   yocto-queue@1.0.0: {}
 
-  zod@3.23.4: {}
+  zod@3.23.8: {}
diff --git a/src/adapters/node.ts b/src/adapters/node.ts
index 62680e4..1d91d73 100644
--- a/src/adapters/node.ts
+++ b/src/adapters/node.ts
@@ -6,6 +6,7 @@ import { App } from "../app";
 import { createError, isError, sendError } from "../error";
 import { createEvent, eventHandler, isEventHandler } from "../event";
 import { EventHandler, EventHandlerResponse } from "../types";
+import { setResponseStatus } from "../utils";
 
 // Node.js
 export type {
@@ -62,6 +63,9 @@ export function toNodeListener(app: App): NodeListener {
         error.unhandled = true;
       }
 
+      // #754 Make sure hooks see correct status code and message
+      setResponseStatus(event, error.statusCode, error.statusMessage);
+
       if (app.options.onError) {
         await app.options.onError(error, event);
       }
@@ -71,7 +75,14 @@ export function toNodeListener(app: App): NodeListener {
       if (error.unhandled || error.fatal) {
         console.error("[h3]", error.fatal ? "[fatal]" : "[unhandled]", error);
       }
+
+      if (app.options.onBeforeResponse && !event._onBeforeResponseCalled) {
+        await app.options.onBeforeResponse(event, { body: error });
+      }
       await sendError(event, error, !!app.options.debug);
+      if (app.options.onAfterResponse && !event._onAfterResponseCalled) {
+        await app.options.onAfterResponse(event, { body: error });
+      }
     }
   };
   return toNodeHandle;
diff --git a/src/app.ts b/src/app.ts
index 2a8d6fe..1ea5774 100644
--- a/src/app.ts
+++ b/src/app.ts
@@ -179,10 +179,12 @@ export function createAppEventHandler(stack: Stack, options: AppOptions) {
       if (_body !== undefined) {
         const _response = { body: _body };
         if (options.onBeforeResponse) {
+          event._onBeforeResponseCalled = true;
           await options.onBeforeResponse(event, _response);
         }
         await handleHandlerResponse(event, _response.body, spacing);
         if (options.onAfterResponse) {
+          event._onAfterResponseCalled = true;
           await options.onAfterResponse(event, _response);
         }
         return;
@@ -191,6 +193,7 @@ export function createAppEventHandler(stack: Stack, options: AppOptions) {
       // Already handled
       if (event.handled) {
         if (options.onAfterResponse) {
+          event._onAfterResponseCalled = true;
           await options.onAfterResponse(event, undefined);
         }
         return;
@@ -205,6 +208,7 @@ export function createAppEventHandler(stack: Stack, options: AppOptions) {
     }
 
     if (options.onAfterResponse) {
+      event._onAfterResponseCalled = true;
       await options.onAfterResponse(event, undefined);
     }
   });
diff --git a/src/error.ts b/src/error.ts
index de93ec1..640fa09 100644
--- a/src/error.ts
+++ b/src/error.ts
@@ -62,7 +62,28 @@ export class H3Error<DataT = unknown> extends Error {
  * Creates a new `Error` that can be used to handle both internal and runtime errors.
  *
  * @param input {string | (Partial<H3Error> & { status?: number; statusText?: string })} - The error message or an object containing error properties.
+ * If a string is provided, it will be used as the error `message`.
+ *
+ * @example
+ * // String error where `statusCode` defaults to `500`
+ * throw createError("An error occurred");
+ * // Object error
+ * throw createError({
+ *   statusCode: 400,
+ *   statusMessage: "Bad Request",
+ *   message: "Invalid input",
+ *   data: { field: "email" }
+ * });
+ *
+ *
  * @return {H3Error} - An instance of H3Error.
+ *
+ * @remarks
+ * - Typically, `message` contains a brief, human-readable description of the error, while `statusMessage` is specific to HTTP responses and describes
+ * the status text related to the response status code.
+ * - In a client-server context, using a short `statusMessage` is recommended because it can be accessed on the client side. Otherwise, a `message`
+ * passed to `createError` on the server will not propagate to the client.
+ * - Consider avoiding putting dynamic user input in the `message` to prevent potential security issues.
  */
 export function createError<DataT = unknown>(
   input:
diff --git a/src/event/event.ts b/src/event/event.ts
index 4c2108a..1852634 100644
--- a/src/event/event.ts
+++ b/src/event/event.ts
@@ -15,7 +15,6 @@ export interface WebEventContext {
 }
 
 export class H3Event<
-  // eslint-disable-next-line @typescript-eslint/no-unused-vars
   _RequestT extends EventHandlerRequest = EventHandlerRequest,
 > implements Pick<FetchEvent, "respondWith">
 {
@@ -35,6 +34,10 @@ export class H3Event<
   // Response
   _handled = false;
 
+  // Hooks
+  _onBeforeResponseCalled: boolean | undefined;
+  _onAfterResponseCalled: boolean | undefined;
+
   constructor(req: NodeIncomingMessage, res: NodeServerResponse) {
     this.node = { req, res };
   }
diff --git a/src/types.ts b/src/types.ts
deleted file mode 100644
index 7116c47..0000000
--- a/src/types.ts
+++ /dev/null
@@ -1,119 +0,0 @@
-import type { QueryObject } from "ufo";
-import type { Hooks as WSHooks } from "crossws";
-import type { H3Event } from "./event";
-import type { Session } from "./utils/session";
-import type { RouteNode } from "./router";
-
-export type {
-  ValidateFunction,
-  ValidateResult,
-} from "./utils/internal/validate";
-
-// https://www.rfc-editor.org/rfc/rfc7231#section-4.1
-export type HTTPMethod =
-  | "GET"
-  | "HEAD"
-  | "PATCH"
-  | "POST"
-  | "PUT"
-  | "DELETE"
-  | "CONNECT"
-  | "OPTIONS"
-  | "TRACE";
-
-export type Encoding =
-  | false
-  | "ascii"
-  | "utf8"
-  | "utf-8" // eslint-disable-line unicorn/text-encoding-identifier-case
-  | "utf16le"
-  | "ucs2"
-  | "ucs-2"
-  | "base64"
-  | "latin1"
-  | "binary"
-  | "hex";
-
-export interface H3EventContext extends Record<string, any> {
-  /* Matched router parameters */
-  params?: Record<string, string>;
-  /**
-   * Matched router Node
-   *
-   * @experimental The object structure may change in non-major version.
-   */
-  matchedRoute?: RouteNode;
-  /* Cached session data */
-  sessions?: Record<string, Session>;
-  /* Trusted IP Address of client */
-  clientAddress?: string;
-}
-
-export type EventHandlerResponse<T = any> = T | Promise<T>;
-
-export interface EventHandlerRequest {
-  body?: any; // TODO: Default to unknown in next major version
-  query?: QueryObject;
-  routerParams?: Record<string, string>;
-}
-
-export type InferEventInput<
-  Key extends keyof EventHandlerRequest,
-  Event extends H3Event,
-  T,
-> = void extends T ? (Event extends H3Event<infer E> ? E[Key] : never) : T;
-
-type MaybePromise<T> = T | Promise<T>;
-
-export type EventHandlerResolver = (
-  path: string,
-) => MaybePromise<undefined | { route?: string; handler: EventHandler }>;
-
-export interface EventHandler<
-  Request extends EventHandlerRequest = EventHandlerRequest,
-  Response extends EventHandlerResponse = EventHandlerResponse,
-> {
-  __is_handler__?: true;
-  __resolve__?: EventHandlerResolver;
-  __websocket__?: Partial<WSHooks>;
-  (event: H3Event<Request>): Response;
-}
-
-export type _RequestMiddleware<
-  Request extends EventHandlerRequest = EventHandlerRequest,
-> = (event: H3Event<Request>) => void | Promise<void>;
-
-export type _ResponseMiddleware<
-  Request extends EventHandlerRequest = EventHandlerRequest,
-  Response extends EventHandlerResponse = EventHandlerResponse,
-> = (
-  event: H3Event<Request>,
-  response: { body?: Awaited<Response> },
-) => void | Promise<void>;
-
-export type EventHandlerObject<
-  Request extends EventHandlerRequest = EventHandlerRequest,
-  Response extends EventHandlerResponse = EventHandlerResponse,
-> = {
-  onRequest?: _RequestMiddleware<Request> | _RequestMiddleware<Request>[];
-  onBeforeResponse?:
-    | _ResponseMiddleware<Request, Response>
-    | _ResponseMiddleware<Request, Response>[];
-  /** @experimental */
-  websocket?: Partial<WSHooks>;
-  handler: EventHandler<Request, Response>;
-};
-
-export type LazyEventHandler = () => EventHandler | Promise<EventHandler>;
-
-export type RequestHeaders = Partial<
-  Record<HTTPHeaderName, string | undefined>
->;
-
-// prettier-ignore
-type _HTTPHeaderName = "WWW-Authenticate" | "Authorization" | "Proxy-Authenticate" | "Proxy-Authorization" | "Age" | "Cache-Control" | "Clear-Site-Data" | "Expires" | "Pragma" | "Accept-CH" | "Critical-CH" | "Sec-CH-UA" | "Sec-CH-UA-Arch" | "Sec-CH-UA-Bitness" | "Sec-CH-UA-Full-Version-List" | "Sec-CH-UA-Mobile" | "Sec-CH-UA-Model" | "Sec-CH-UA-Platform" | "Sec-CH-UA-Platform-Version" | "Sec-CH-UA-Prefers-Color-Scheme" | "Sec-CH-UA-Prefers-Reduced-Motion" | "Downlink" | "ECT" | "RTT" | "Save-Data" | "Last-Modified" | "ETag" | "If-Match" | "If-None-Match" | "If-Modified-Since" | "If-Unmodified-Since" | "Vary" | "Connection" | "Keep-Alive" | "Accept" | "Accept-Encoding" | "Accept-Language" | "Expect" | "Max-Forwards" | "Cookie" | "Set-Cookie" | "Access-Control-Allow-Origin" | "Access-Control-Allow-Credentials" | "Access-Control-Allow-Headers" | "Access-Control-Allow-Methods" | "Access-Control-Expose-Headers" | "Access-Control-Max-Age" | "Access-Control-Request-Headers" | "Access-Control-Request-Method" | "Origin" | "Timing-Allow-Origin" | "Content-Disposition" | "Content-Length" | "Content-Type" | "Content-Encoding" | "Content-Language" | "Content-Location" | "Forwarded" | "X-Forwarded-For" | "X-Forwarded-Host" | "X-Forwarded-Proto" | "Via" | "Location" | "Refresh" | "From" | "Host" | "Referer" | "Referrer-Policy" | "User-Agent" | "Allow" | "Server" | "Accept-Ranges" | "Range" | "If-Range" | "Content-Range" | "Cross-Origin-Embedder-Policy" | "Cross-Origin-Opener-Policy" | "Cross-Origin-Resource-Policy" | "Content-Security-Policy" | "Content-Security-Policy-Report-Only" | "Expect-CT" | "Origin-Isolation" | "Permissions-Policy" | "Strict-Transport-Security" | "Upgrade-Insecure-Requests" | "X-Content-Type-Options" | "X-Frame-Options" | "X-Permitted-Cross-Domain-Policies" | "X-Powered-By" | "X-XSS-Protection" | "Sec-Fetch-Site" | "Sec-Fetch-Mode" | "Sec-Fetch-User" | "Sec-Fetch-Dest" | "Sec-Purpose" | "Service-Worker-Navigation-Preload" | "Last-Event-ID" | "NEL" | "Ping-From" | "Ping-To" | "Report-To" | "Transfer-Encoding" | "TE" | "Trailer" | "Sec-WebSocket-Key" | "Sec-WebSocket-Extensions" | "Sec-WebSocket-Accept" | "Sec-WebSocket-Protocol" | "Sec-WebSocket-Version" | "Accept-Push-Policy" | "Accept-Signature" | "Alt-Svc" | "Alt-Used" | "Date" | "Early-Data" | "Link" | "Push-Policy" | "Retry-After" | "Signature" | "Signed-Headers" | "Server-Timing" | "Service-Worker-Allowed" | "SourceMap" | "Upgrade" | "X-DNS-Prefetch-Control" | "X-Pingback" | "X-Requested-With" | "X-Robots-Tag";
-
-export type HTTPHeaderName =
-  | _HTTPHeaderName
-  | Lowercase<_HTTPHeaderName>
-  | (string & {}); // eslint-disable-line @typescript-eslint/ban-types
diff --git a/src/types/_headers.ts b/src/types/_headers.ts
new file mode 100644
index 0000000..e21e0b0
--- /dev/null
+++ b/src/types/_headers.ts
@@ -0,0 +1,154 @@
+import type { HTTPMethod } from ".";
+import type { MimeType } from "./_mimes";
+import type { AnyString, AnyNumber } from "./_utils";
+
+export type RequestHeaders = Partial<
+  Record<HTTPHeaderName, string | undefined>
+>;
+
+// prettier-ignore
+type _HTTPHeaderName = "WWW-Authenticate" | "Authorization" | "Proxy-Authenticate" | "Proxy-Authorization" | "Age" | "Cache-Control" | "Clear-Site-Data" | "Expires" | "Pragma" | "Accept-CH" | "Critical-CH" | "Sec-CH-UA" | "Sec-CH-UA-Arch" | "Sec-CH-UA-Bitness" | "Sec-CH-UA-Full-Version-List" | "Sec-CH-UA-Mobile" | "Sec-CH-UA-Model" | "Sec-CH-UA-Platform" | "Sec-CH-UA-Platform-Version" | "Sec-CH-UA-Prefers-Color-Scheme" | "Sec-CH-UA-Prefers-Reduced-Motion" | "Downlink" | "ECT" | "RTT" | "Save-Data" | "Last-Modified" | "ETag" | "If-Match" | "If-None-Match" | "If-Modified-Since" | "If-Unmodified-Since" | "Vary" | "Connection" | "Keep-Alive" | "Accept" | "Accept-Encoding" | "Accept-Language" | "Expect" | "Max-Forwards" | "Cookie" | "Set-Cookie" | "Access-Control-Allow-Origin" | "Access-Control-Allow-Credentials" | "Access-Control-Allow-Headers" | "Access-Control-Allow-Methods" | "Access-Control-Expose-Headers" | "Access-Control-Max-Age" | "Access-Control-Request-Headers" | "Access-Control-Request-Method" | "Origin" | "Timing-Allow-Origin" | "Content-Disposition" | "Content-Length" | "Content-Type" | "Content-Encoding" | "Content-Language" | "Content-Location" | "Forwarded" | "X-Forwarded-For" | "X-Forwarded-Host" | "X-Forwarded-Proto" | "Via" | "Location" | "Refresh" | "From" | "Host" | "Referer" | "Referrer-Policy" | "User-Agent" | "Allow" | "Server" | "Accept-Ranges" | "Range" | "If-Range" | "Content-Range" | "Cross-Origin-Embedder-Policy" | "Cross-Origin-Opener-Policy" | "Cross-Origin-Resource-Policy" | "Content-Security-Policy" | "Content-Security-Policy-Report-Only" | "Expect-CT" | "Origin-Isolation" | "Permissions-Policy" | "Strict-Transport-Security" | "Upgrade-Insecure-Requests" | "X-Content-Type-Options" | "X-Frame-Options" | "X-Permitted-Cross-Domain-Policies" | "X-Powered-By" | "X-XSS-Protection" | "Sec-Fetch-Site" | "Sec-Fetch-Mode" | "Sec-Fetch-User" | "Sec-Fetch-Dest" | "Sec-Purpose" | "Service-Worker-Navigation-Preload" | "Last-Event-ID" | "NEL" | "Ping-From" | "Ping-To" | "Report-To" | "Transfer-Encoding" | "TE" | "Trailer" | "Sec-WebSocket-Key" | "Sec-WebSocket-Extensions" | "Sec-WebSocket-Accept" | "Sec-WebSocket-Protocol" | "Sec-WebSocket-Version" | "Accept-Push-Policy" | "Accept-Signature" | "Alt-Svc" | "Alt-Used" | "Date" | "Early-Data" | "Link" | "Push-Policy" | "Retry-After" | "Signature" | "Signed-Headers" | "Server-Timing" | "Service-Worker-Allowed" | "SourceMap" | "Upgrade" | "X-DNS-Prefetch-Control" | "X-Pingback" | "X-Requested-With" | "X-Robots-Tag";
+
+export type HTTPHeaderName =
+  | _HTTPHeaderName
+  | Lowercase<_HTTPHeaderName>
+  | (string & {}); // eslint-disable-line @typescript-eslint/ban-types
+
+// prettier-ignore
+type ClientHint = "Sec-CH-UA" | "Sec-CH-UA-Arch" | "Sec-CH-UA-Bitness" | "Sec-CH-UA-Full-Version-List" | "Sec-CH-UA-Full-Version" | "Sec-CH-UA-Mobile" | "Sec-CH-UA-Model" | "Sec-CH-UA-Platform" | "Sec-CH-UA-Platform-Version" | "Sec-CH-Prefers-Reduced-Motion" | "Sec-CH-Prefers-Color-Scheme" | "Device-Memory" | "Width" | "Viewport-Width" | "Save-Data" | "Downlink" | "ECT" | "RTT" | AnyString;
+
+export type TypedHeaders = Partial<Record<HTTPHeaderName, unknown>> &
+  Partial<{
+    host: string;
+
+    location: string;
+
+    referrer: string;
+
+    origin: "null" | AnyString;
+
+    from: string;
+
+    "alt-used": string;
+
+    "content-location": string;
+
+    sourcemap: string;
+
+    "content-length": number;
+
+    "access-control-max-age": number;
+
+    "retry-after": number;
+
+    rtt: number;
+
+    age: number;
+
+    "max-forwards": number;
+
+    downlink: number;
+
+    "device-memory": 0.25 | 0.5 | 1 | 2 | 4 | 8 | AnyNumber;
+
+    accept: MimeType | MimeType[] | `${MimeType};q=${number}`[];
+
+    "content-type": MimeType;
+
+    "accept-ch": ClientHint | ClientHint[];
+
+    "keep-alive": `timeout=${number}, max=${number}` | AnyString;
+
+    "access-control-allow-credentials": "true" | AnyString;
+
+    "access-control-allow-headers": "*" | HTTPHeaderName[] | AnyString;
+
+    "access-control-allow-methods": "*" | HTTPMethod[] | AnyString;
+
+    "access-control-allow-origin": "*" | "null" | AnyString;
+
+    "access-control-expose-headers": "*" | HTTPHeaderName[] | AnyString;
+
+    "access-control-request-headers": HTTPHeaderName[] | AnyString;
+
+    "access-control-request-method": HTTPMethod | AnyString;
+
+    "early-data": 1;
+
+    "upgrade-insecure-requests": 1;
+
+    // prettier-ignore
+    "accept-ranges": "bytes" | "none" | AnyString;
+
+    // prettier-ignore
+    connection: "keep-alive" | "close" | "upgrade" | AnyString;
+
+    // prettier-ignore
+    ect: "slow-2g" | "2g" | "3g" | "4g" | AnyString;
+
+    // prettier-ignore
+    expect: "100-continue" | AnyString;
+
+    // prettier-ignore
+    "save-data": `on` | `off` | AnyString;
+
+    // prettier-ignore
+    "sec-ch-prefers-reduced-motion": "no-preference" | "reduce" | AnyString;
+
+    // prettier-ignore
+    "sec-ch-prefers-reduced-transparency": "no-preference" | "reduce" | AnyString;
+
+    // prettier-ignore
+    "sec-ch-ua-mobile": `?1` | `?0` | AnyString;
+
+    // prettier-ignore
+    "origin-agent-cluster": `?1` | `?0` | AnyString;
+
+    // prettier-ignore
+    "sec-fetch-user": "?1" | AnyString;
+
+    // prettier-ignore
+    "sec-purpose": "prefetch" | AnyString;
+
+    // prettier-ignore
+    "x-content-type-options": "nosniff" | AnyString;
+
+    // prettier-ignore
+    "x-dns-prefetch-control": "on" | "off" | AnyString;
+
+    // prettier-ignore
+    "x-frame-options": "DENY" | "SAMEORIGIN" | AnyString;
+
+    // prettier-ignore
+    "sec-ch-ua-arch": "x86" | "ARM" | "[arm64-v8a, armeabi-v7a, armeabi]" | AnyString;
+
+    // prettier-ignore
+    "sec-fetch-site": "cross-site" | "same-origin" | "same-site" | "none" | AnyString;
+
+    // prettier-ignore
+    "sec-ch-prefers-color-scheme": "dark" | "light" | AnyString;
+
+    // prettier-ignore
+    "sec-ch-ua-bitness": "64" | "32" | AnyString;
+
+    // prettier-ignore
+    "sec-fetch-mode": "cors" | "navigate" | "no-cors" | "same-origin" | "websocket" | AnyString;
+
+    // prettier-ignore
+    "cross-origin-embedder-policy": "unsafe-none" | "require-corp" | "credentialless" | AnyString;
+
+    // prettier-ignore
+    "cross-origin-opener-policy": "unsafe-none" | "same-origin-allow-popups" | "same-origin" | AnyString;
+
+    // prettier-ignore
+    "cross-origin-resource-policy": "same-site" | "same-origin" | "cross-origin" | AnyString;
+
+    // prettier-ignore
+    "sec-ch-ua-platform":  "Android" | "Chrome  OS" | "Chromium  OS" | "iOS" | "Linux" | "macOS" | "Windows" | "Unknown" | AnyString;
+
+    // prettier-ignore
+    "referrer-policy":  "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url" | AnyString;
+
+    // prettier-ignore
+    "sec-fetch-dest":  "audio" | "audioworklet" | "document" | "embed" | "empty" | "font" | "frame" | "iframe" | "image" | "manifest" | "object" | "paintworklet" | "report" | "script" | "serviceworker" | "sharedworker" | "style" | "track" | "video" | "worker" | "xslt" | AnyString;
+  }>;
diff --git a/src/types/_mimes.ts b/src/types/_mimes.ts
new file mode 100644
index 0000000..74f73b8
--- /dev/null
+++ b/src/types/_mimes.ts
@@ -0,0 +1,4 @@
+import type { AnyString } from "./_utils";
+
+// prettier-ignore
+export type MimeType = 'application/1d-interleaved-parityfec'|'application/3gpdash-qoe-report+xml'|'application/3gppHal+json'|'application/3gppHalForms+json'|'application/3gpp-ims+xml'|'application/A2L'|'application/ace+cbor'|'application/ace+json'|'application/activemessage'|'application/activity+json'|'application/aif+cbor'|'application/aif+json'|'application/alto-cdni+json'|'application/alto-cdnifilter+json'|'application/alto-costmap+json'|'application/alto-costmapfilter+json'|'application/alto-directory+json'|'application/alto-endpointprop+json'|'application/alto-endpointpropparams+json'|'application/alto-endpointcost+json'|'application/alto-endpointcostparams+json'|'application/alto-error+json'|'application/alto-networkmapfilter+json'|'application/alto-networkmap+json'|'application/alto-propmap+json'|'application/alto-propmapparams+json'|'application/alto-tips+json'|'application/alto-tipsparams+json'|'application/alto-updatestreamcontrol+json'|'application/alto-updatestreamparams+json'|'application/AML'|'application/andrew-inset'|'application/applefile'|'application/at+jwt'|'application/ATF'|'application/ATFX'|'application/atom+xml'|'application/atomcat+xml'|'application/atomdeleted+xml'|'application/atomicmail'|'application/atomsvc+xml'|'application/atsc-dwd+xml'|'application/atsc-dynamic-event-message'|'application/atsc-held+xml'|'application/atsc-rdt+json'|'application/atsc-rsat+xml'|'application/ATXML'|'application/auth-policy+xml'|'application/automationml-aml+xml'|'application/automationml-amlx+zip'|'application/bacnet-xdd+zip'|'application/batch-SMTP'|'application/beep+xml'|'application/c2pa'|'application/calendar+json'|'application/calendar+xml'|'application/call-completion'|'application/CALS-1840'|'application/captive+json'|'application/cbor'|'application/cbor-seq'|'application/cccex'|'application/ccmp+xml'|'application/ccxml+xml'|'application/cda+xml'|'application/CDFX+XML'|'application/cdmi-capability'|'application/cdmi-container'|'application/cdmi-domain'|'application/cdmi-object'|'application/cdmi-queue'|'application/cdni'|'application/CEA'|'application/cea-2018+xml'|'application/cellml+xml'|'application/cfw'|'application/cid-edhoc+cbor-seq'|'application/city+json'|'application/clr'|'application/clue_info+xml'|'application/clue+xml'|'application/cms'|'application/cnrp+xml'|'application/coap-group+json'|'application/coap-payload'|'application/commonground'|'application/concise-problem-details+cbor'|'application/conference-info+xml'|'application/cpl+xml'|'application/cose'|'application/cose-key'|'application/cose-key-set'|'application/cose-x509'|'application/csrattrs'|'application/csta+xml'|'application/CSTAdata+xml'|'application/csvm+json'|'application/cwl'|'application/cwl+json'|'application/cwt'|'application/cybercash'|'application/dash+xml'|'application/dash-patch+xml'|'application/dashdelta'|'application/davmount+xml'|'application/dca-rft'|'application/DCD'|'application/dec-dx'|'application/dialog-info+xml'|'application/dicom'|'application/dicom+json'|'application/dicom+xml'|'application/DII'|'application/DIT'|'application/dns'|'application/dns+json'|'application/dns-message'|'application/dots+cbor'|'application/dpop+jwt'|'application/dskpp+xml'|'application/dssc+der'|'application/dssc+xml'|'application/dvcs'|'application/ecmascript'|'application/edhoc+cbor-seq'|'application/EDI-consent'|'application/EDIFACT'|'application/EDI-X12'|'application/efi'|'application/elm+json'|'application/elm+xml'|'application/EmergencyCallData.cap+xml'|'application/EmergencyCallData.Comment+xml'|'application/EmergencyCallData.Control+xml'|'application/EmergencyCallData.DeviceInfo+xml'|'application/EmergencyCallData.eCall.MSD'|'application/EmergencyCallData.LegacyESN+json'|'application/EmergencyCallData.ProviderInfo+xml'|'application/EmergencyCallData.ServiceInfo+xml'|'application/EmergencyCallData.SubscriberInfo+xml'|'application/EmergencyCallData.VEDS+xml'|'application/emma+xml'|'application/emotionml+xml'|'application/encaprtp'|'application/epp+xml'|'application/epub+zip'|'application/eshop'|'application/example'|'application/exi'|'application/expect-ct-report+json'|'application/express'|'application/fastinfoset'|'application/fastsoap'|'application/fdf'|'application/fdt+xml'|'application/fhir+json'|'application/fhir+xml'|'application/fits'|'application/flexfec'|'application/font-sfnt'|'application/font-tdpfr'|'application/font-woff'|'application/framework-attributes+xml'|'application/geo+json'|'application/geo+json-seq'|'application/geopackage+sqlite3'|'application/geoxacml+json'|'application/geoxacml+xml'|'application/gltf-buffer'|'application/gml+xml'|'application/gzip'|'application/H224'|'application/held+xml'|'application/hl7v2+xml'|'application/http'|'application/hyperstudio'|'application/ibe-key-request+xml'|'application/ibe-pkg-reply+xml'|'application/ibe-pp-data'|'application/iges'|'application/im-iscomposing+xml'|'application/index'|'application/index.cmd'|'application/index.obj'|'application/index.response'|'application/index.vnd'|'application/inkml+xml'|'application/IOTP'|'application/ipfix'|'application/ipp'|'application/ISUP'|'application/its+xml'|'application/java-archive'|'application/javascript'|'application/jf2feed+json'|'application/jose'|'application/jose+json'|'application/jrd+json'|'application/jscalendar+json'|'application/jscontact+json'|'application/json'|'application/json-patch+json'|'application/json-seq'|'application/jsonpath'|'application/jwk+json'|'application/jwk-set+json'|'application/jwt'|'application/kpml-request+xml'|'application/kpml-response+xml'|'application/ld+json'|'application/lgr+xml'|'application/link-format'|'application/linkset'|'application/linkset+json'|'application/load-control+xml'|'application/logout+jwt'|'application/lost+xml'|'application/lostsync+xml'|'application/lpf+zip'|'application/LXF'|'application/mac-binhex40'|'application/macwriteii'|'application/mads+xml'|'application/manifest+json'|'application/marc'|'application/marcxml+xml'|'application/mathematica'|'application/mathml+xml'|'application/mathml-content+xml'|'application/mathml-presentation+xml'|'application/mbms-associated-procedure-description+xml'|'application/mbms-deregister+xml'|'application/mbms-envelope+xml'|'application/mbms-msk-response+xml'|'application/mbms-msk+xml'|'application/mbms-protection-description+xml'|'application/mbms-reception-report+xml'|'application/mbms-register-response+xml'|'application/mbms-register+xml'|'application/mbms-schedule+xml'|'application/mbms-user-service-description+xml'|'application/mbox'|'application/media_control+xml'|'application/media-policy-dataset+xml'|'application/mediaservercontrol+xml'|'application/merge-patch+json'|'application/metalink4+xml'|'application/mets+xml'|'application/MF4'|'application/mikey'|'application/mipc'|'application/missing-blocks+cbor-seq'|'application/mmt-aei+xml'|'application/mmt-usd+xml'|'application/mods+xml'|'application/moss-keys'|'application/moss-signature'|'application/mosskey-data'|'application/mosskey-request'|'application/mp21'|'application/mp4'|'application/mpeg4-generic'|'application/mpeg4-iod'|'application/mpeg4-iod-xmt'|'application/mrb-consumer+xml'|'application/mrb-publish+xml'|'application/msc-ivr+xml'|'application/msc-mixer+xml'|'application/msword'|'application/mud+json'|'application/multipart-core'|'application/mxf'|'application/n-quads'|'application/n-triples'|'application/nasdata'|'application/news-checkgroups'|'application/news-groupinfo'|'application/news-transmission'|'application/nlsml+xml'|'application/node'|'application/nss'|'application/oauth-authz-req+jwt'|'application/oblivious-dns-message'|'application/ocsp-request'|'application/ocsp-response'|'application/octet-stream'|'application/ODA'|'application/odm+xml'|'application/ODX'|'application/oebps-package+xml'|'application/ogg'|'application/ohttp-keys'|'application/opc-nodeset+xml'|'application/oscore'|'application/oxps'|'application/p21'|'application/p21+zip'|'application/p2p-overlay+xml'|'application/parityfec'|'application/passport'|'application/patch-ops-error+xml'|'application/pdf'|'application/PDX'|'application/pem-certificate-chain'|'application/pgp-encrypted'|'application/pgp-keys'|'application/pgp-signature'|'application/pidf-diff+xml'|'application/pidf+xml'|'application/pkcs10'|'application/pkcs7-mime'|'application/pkcs7-signature'|'application/pkcs8'|'application/pkcs8-encrypted'|'application/pkcs12'|'application/pkix-attr-cert'|'application/pkix-cert'|'application/pkix-crl'|'application/pkix-pkipath'|'application/pkixcmp'|'application/pls+xml'|'application/poc-settings+xml'|'application/postscript'|'application/ppsp-tracker+json'|'application/private-token-issuer-directory'|'application/private-token-request'|'application/private-token-response'|'application/problem+json'|'application/problem+xml'|'application/provenance+xml'|'application/prs.alvestrand.titrax-sheet'|'application/prs.cww'|'application/prs.cyn'|'application/prs.hpub+zip'|'application/prs.implied-document+xml'|'application/prs.implied-executable'|'application/prs.implied-object+json'|'application/prs.implied-object+json-seq'|'application/prs.implied-object+yaml'|'application/prs.implied-structure'|'application/prs.nprend'|'application/prs.plucker'|'application/prs.rdf-xml-crypt'|'application/prs.vcfbzip2'|'application/prs.xsf+xml'|'application/pskc+xml'|'application/pvd+json'|'application/rdf+xml'|'application/route-apd+xml'|'application/route-s-tsid+xml'|'application/route-usd+xml'|'application/QSIG'|'application/raptorfec'|'application/rdap+json'|'application/reginfo+xml'|'application/relax-ng-compact-syntax'|'application/remote-printing'|'application/reputon+json'|'application/resource-lists-diff+xml'|'application/resource-lists+xml'|'application/rfc+xml'|'application/riscos'|'application/rlmi+xml'|'application/rls-services+xml'|'application/rpki-checklist'|'application/rpki-ghostbusters'|'application/rpki-manifest'|'application/rpki-publication'|'application/rpki-roa'|'application/rpki-updown'|'application/rtf'|'application/rtploopback'|'application/rtx'|'application/samlassertion+xml'|'application/samlmetadata+xml'|'application/sarif-external-properties+json'|'application/sarif+json'|'application/sbe'|'application/sbml+xml'|'application/scaip+xml'|'application/scim+json'|'application/scvp-cv-request'|'application/scvp-cv-response'|'application/scvp-vp-request'|'application/scvp-vp-response'|'application/sdp'|'application/secevent+jwt'|'application/senml-etch+cbor'|'application/senml-etch+json'|'application/senml-exi'|'application/senml+cbor'|'application/senml+json'|'application/senml+xml'|'application/sensml-exi'|'application/sensml+cbor'|'application/sensml+json'|'application/sensml+xml'|'application/sep-exi'|'application/sep+xml'|'application/session-info'|'application/set-payment'|'application/set-payment-initiation'|'application/set-registration'|'application/set-registration-initiation'|'application/SGML'|'application/sgml-open-catalog'|'application/shf+xml'|'application/sieve'|'application/simple-filter+xml'|'application/simple-message-summary'|'application/simpleSymbolContainer'|'application/sipc'|'application/slate'|'application/smil'|'application/smil+xml'|'application/smpte336m'|'application/soap+fastinfoset'|'application/soap+xml'|'application/sparql-query'|'application/spdx+json'|'application/sparql-results+xml'|'application/spirits-event+xml'|'application/sql'|'application/srgs'|'application/srgs+xml'|'application/sru+xml'|'application/ssml+xml'|'application/stix+json'|'application/swid+cbor'|'application/swid+xml'|'application/tamp-apex-update'|'application/tamp-apex-update-confirm'|'application/tamp-community-update'|'application/tamp-community-update-confirm'|'application/tamp-error'|'application/tamp-sequence-adjust'|'application/tamp-sequence-adjust-confirm'|'application/tamp-status-query'|'application/tamp-status-response'|'application/tamp-update'|'application/tamp-update-confirm'|'application/taxii+json'|'application/td+json'|'application/tei+xml'|'application/TETRA_ISI'|'application/thraud+xml'|'application/timestamp-query'|'application/timestamp-reply'|'application/timestamped-data'|'application/tlsrpt+gzip'|'application/tlsrpt+json'|'application/tm+json'|'application/tnauthlist'|'application/token-introspection+jwt'|'application/trickle-ice-sdpfrag'|'application/trig'|'application/ttml+xml'|'application/tve-trigger'|'application/tzif'|'application/tzif-leap'|'application/ulpfec'|'application/urc-grpsheet+xml'|'application/urc-ressheet+xml'|'application/urc-targetdesc+xml'|'application/urc-uisocketdesc+xml'|'application/vcard+json'|'application/vcard+xml'|'application/vemmi'|'application/vnd.1000minds.decision-model+xml'|'application/vnd.1ob'|'application/vnd.3gpp.5gnas'|'application/vnd.3gpp.access-transfer-events+xml'|'application/vnd.3gpp.bsf+xml'|'application/vnd.3gpp.crs+xml'|'application/vnd.3gpp.current-location-discovery+xml'|'application/vnd.3gpp.GMOP+xml'|'application/vnd.3gpp.gtpc'|'application/vnd.3gpp.interworking-data'|'application/vnd.3gpp.lpp'|'application/vnd.3gpp.mc-signalling-ear'|'application/vnd.3gpp.mcdata-affiliation-command+xml'|'application/vnd.3gpp.mcdata-info+xml'|'application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml'|'application/vnd.3gpp.mcdata-payload'|'application/vnd.3gpp.mcdata-regroup+xml'|'application/vnd.3gpp.mcdata-service-config+xml'|'application/vnd.3gpp.mcdata-signalling'|'application/vnd.3gpp.mcdata-ue-config+xml'|'application/vnd.3gpp.mcdata-user-profile+xml'|'application/vnd.3gpp.mcptt-affiliation-command+xml'|'application/vnd.3gpp.mcptt-floor-request+xml'|'application/vnd.3gpp.mcptt-info+xml'|'application/vnd.3gpp.mcptt-location-info+xml'|'application/vnd.3gpp.mcptt-mbms-usage-info+xml'|'application/vnd.3gpp.mcptt-regroup+xml'|'application/vnd.3gpp.mcptt-service-config+xml'|'application/vnd.3gpp.mcptt-signed+xml'|'application/vnd.3gpp.mcptt-ue-config+xml'|'application/vnd.3gpp.mcptt-ue-init-config+xml'|'application/vnd.3gpp.mcptt-user-profile+xml'|'application/vnd.3gpp.mcvideo-affiliation-command+xml'|'application/vnd.3gpp.mcvideo-affiliation-info+xml'|'application/vnd.3gpp.mcvideo-info+xml'|'application/vnd.3gpp.mcvideo-location-info+xml'|'application/vnd.3gpp.mcvideo-mbms-usage-info+xml'|'application/vnd.3gpp.mcvideo-regroup+xml'|'application/vnd.3gpp.mcvideo-service-config+xml'|'application/vnd.3gpp.mcvideo-transmission-request+xml'|'application/vnd.3gpp.mcvideo-ue-config+xml'|'application/vnd.3gpp.mcvideo-user-profile+xml'|'application/vnd.3gpp.mid-call+xml'|'application/vnd.3gpp.ngap'|'application/vnd.3gpp.pfcp'|'application/vnd.3gpp.pic-bw-large'|'application/vnd.3gpp.pic-bw-small'|'application/vnd.3gpp.pic-bw-var'|'application/vnd.3gpp-prose-pc3a+xml'|'application/vnd.3gpp-prose-pc3ach+xml'|'application/vnd.3gpp-prose-pc3ch+xml'|'application/vnd.3gpp-prose-pc8+xml'|'application/vnd.3gpp-prose+xml'|'application/vnd.3gpp.s1ap'|'application/vnd.3gpp.seal-group-doc+xml'|'application/vnd.3gpp.seal-info+xml'|'application/vnd.3gpp.seal-location-info+xml'|'application/vnd.3gpp.seal-mbms-usage-info+xml'|'application/vnd.3gpp.seal-network-QoS-management-info+xml'|'application/vnd.3gpp.seal-ue-config-info+xml'|'application/vnd.3gpp.seal-unicast-info+xml'|'application/vnd.3gpp.seal-user-profile-info+xml'|'application/vnd.3gpp.sms'|'application/vnd.3gpp.sms+xml'|'application/vnd.3gpp.srvcc-ext+xml'|'application/vnd.3gpp.SRVCC-info+xml'|'application/vnd.3gpp.state-and-event-info+xml'|'application/vnd.3gpp.ussd+xml'|'application/vnd.3gpp.vae-info+xml'|'application/vnd.3gpp-v2x-local-service-information'|'application/vnd.3gpp2.bcmcsinfo+xml'|'application/vnd.3gpp2.sms'|'application/vnd.3gpp2.tcap'|'application/vnd.3gpp.v2x'|'application/vnd.3lightssoftware.imagescal'|'application/vnd.3M.Post-it-Notes'|'application/vnd.accpac.simply.aso'|'application/vnd.accpac.simply.imp'|'application/vnd.acm.addressxfer+json'|'application/vnd.acm.chatbot+json'|'application/vnd.acucobol'|'application/vnd.acucorp'|'application/vnd.adobe.flash.movie'|'application/vnd.adobe.formscentral.fcdt'|'application/vnd.adobe.fxp'|'application/vnd.adobe.partial-upload'|'application/vnd.adobe.xdp+xml'|'application/vnd.aether.imp'|'application/vnd.afpc.afplinedata'|'application/vnd.afpc.afplinedata-pagedef'|'application/vnd.afpc.cmoca-cmresource'|'application/vnd.afpc.foca-charset'|'application/vnd.afpc.foca-codedfont'|'application/vnd.afpc.foca-codepage'|'application/vnd.afpc.modca'|'application/vnd.afpc.modca-cmtable'|'application/vnd.afpc.modca-formdef'|'application/vnd.afpc.modca-mediummap'|'application/vnd.afpc.modca-objectcontainer'|'application/vnd.afpc.modca-overlay'|'application/vnd.afpc.modca-pagesegment'|'application/vnd.age'|'application/vnd.ah-barcode'|'application/vnd.ahead.space'|'application/vnd.airzip.filesecure.azf'|'application/vnd.airzip.filesecure.azs'|'application/vnd.amadeus+json'|'application/vnd.amazon.mobi8-ebook'|'application/vnd.americandynamics.acc'|'application/vnd.amiga.ami'|'application/vnd.amundsen.maze+xml'|'application/vnd.android.ota'|'application/vnd.anki'|'application/vnd.anser-web-certificate-issue-initiation'|'application/vnd.antix.game-component'|'application/vnd.apache.arrow.file'|'application/vnd.apache.arrow.stream'|'application/vnd.apache.thrift.binary'|'application/vnd.apache.thrift.compact'|'application/vnd.apache.thrift.json'|'application/vnd.apexlang'|'application/vnd.api+json'|'application/vnd.aplextor.warrp+json'|'application/vnd.apothekende.reservation+json'|'application/vnd.apple.installer+xml'|'application/vnd.apple.keynote'|'application/vnd.apple.mpegurl'|'application/vnd.apple.numbers'|'application/vnd.apple.pages'|'application/vnd.arastra.swi'|'application/vnd.aristanetworks.swi'|'application/vnd.artisan+json'|'application/vnd.artsquare'|'application/vnd.astraea-software.iota'|'application/vnd.audiograph'|'application/vnd.autopackage'|'application/vnd.avalon+json'|'application/vnd.avistar+xml'|'application/vnd.balsamiq.bmml+xml'|'application/vnd.banana-accounting'|'application/vnd.bbf.usp.error'|'application/vnd.bbf.usp.msg'|'application/vnd.bbf.usp.msg+json'|'application/vnd.balsamiq.bmpr'|'application/vnd.bekitzur-stech+json'|'application/vnd.belightsoft.lhzd+zip'|'application/vnd.belightsoft.lhzl+zip'|'application/vnd.bint.med-content'|'application/vnd.biopax.rdf+xml'|'application/vnd.blink-idb-value-wrapper'|'application/vnd.blueice.multipass'|'application/vnd.bluetooth.ep.oob'|'application/vnd.bluetooth.le.oob'|'application/vnd.bmi'|'application/vnd.bpf'|'application/vnd.bpf3'|'application/vnd.businessobjects'|'application/vnd.byu.uapi+json'|'application/vnd.bzip3'|'application/vnd.cab-jscript'|'application/vnd.canon-cpdl'|'application/vnd.canon-lips'|'application/vnd.capasystems-pg+json'|'application/vnd.cendio.thinlinc.clientconf'|'application/vnd.century-systems.tcp_stream'|'application/vnd.chemdraw+xml'|'application/vnd.chess-pgn'|'application/vnd.chipnuts.karaoke-mmd'|'application/vnd.ciedi'|'application/vnd.cinderella'|'application/vnd.cirpack.isdn-ext'|'application/vnd.citationstyles.style+xml'|'application/vnd.claymore'|'application/vnd.cloanto.rp9'|'application/vnd.clonk.c4group'|'application/vnd.cluetrust.cartomobile-config'|'application/vnd.cluetrust.cartomobile-config-pkg'|'application/vnd.cncf.helm.chart.content.v1.tar+gzip'|'application/vnd.cncf.helm.chart.provenance.v1.prov'|'application/vnd.cncf.helm.config.v1+json'|'application/vnd.coffeescript'|'application/vnd.collabio.xodocuments.document'|'application/vnd.collabio.xodocuments.document-template'|'application/vnd.collabio.xodocuments.presentation'|'application/vnd.collabio.xodocuments.presentation-template'|'application/vnd.collabio.xodocuments.spreadsheet'|'application/vnd.collabio.xodocuments.spreadsheet-template'|'application/vnd.collection.doc+json'|'application/vnd.collection+json'|'application/vnd.collection.next+json'|'application/vnd.comicbook-rar'|'application/vnd.comicbook+zip'|'application/vnd.commerce-battelle'|'application/vnd.commonspace'|'application/vnd.coreos.ignition+json'|'application/vnd.cosmocaller'|'application/vnd.contact.cmsg'|'application/vnd.crick.clicker'|'application/vnd.crick.clicker.keyboard'|'application/vnd.crick.clicker.palette'|'application/vnd.crick.clicker.template'|'application/vnd.crick.clicker.wordbank'|'application/vnd.criticaltools.wbs+xml'|'application/vnd.cryptii.pipe+json'|'application/vnd.crypto-shade-file'|'application/vnd.cryptomator.encrypted'|'application/vnd.cryptomator.vault'|'application/vnd.ctc-posml'|'application/vnd.ctct.ws+xml'|'application/vnd.cups-pdf'|'application/vnd.cups-postscript'|'application/vnd.cups-ppd'|'application/vnd.cups-raster'|'application/vnd.cups-raw'|'application/vnd.curl'|'application/vnd.cyan.dean.root+xml'|'application/vnd.cybank'|'application/vnd.cyclonedx+json'|'application/vnd.cyclonedx+xml'|'application/vnd.d2l.coursepackage1p0+zip'|'application/vnd.d3m-dataset'|'application/vnd.d3m-problem'|'application/vnd.dart'|'application/vnd.data-vision.rdz'|'application/vnd.datalog'|'application/vnd.datapackage+json'|'application/vnd.dataresource+json'|'application/vnd.dbf'|'application/vnd.debian.binary-package'|'application/vnd.dece.data'|'application/vnd.dece.ttml+xml'|'application/vnd.dece.unspecified'|'application/vnd.dece.zip'|'application/vnd.denovo.fcselayout-link'|'application/vnd.desmume.movie'|'application/vnd.dir-bi.plate-dl-nosuffix'|'application/vnd.dm.delegation+xml'|'application/vnd.dna'|'application/vnd.document+json'|'application/vnd.dolby.mobile.1'|'application/vnd.dolby.mobile.2'|'application/vnd.doremir.scorecloud-binary-document'|'application/vnd.dpgraph'|'application/vnd.dreamfactory'|'application/vnd.drive+json'|'application/vnd.dtg.local'|'application/vnd.dtg.local.flash'|'application/vnd.dtg.local.html'|'application/vnd.dvb.ait'|'application/vnd.dvb.dvbisl+xml'|'application/vnd.dvb.dvbj'|'application/vnd.dvb.esgcontainer'|'application/vnd.dvb.ipdcdftnotifaccess'|'application/vnd.dvb.ipdcesgaccess'|'application/vnd.dvb.ipdcesgaccess2'|'application/vnd.dvb.ipdcesgpdd'|'application/vnd.dvb.ipdcroaming'|'application/vnd.dvb.iptv.alfec-base'|'application/vnd.dvb.iptv.alfec-enhancement'|'application/vnd.dvb.notif-aggregate-root+xml'|'application/vnd.dvb.notif-container+xml'|'application/vnd.dvb.notif-generic+xml'|'application/vnd.dvb.notif-ia-msglist+xml'|'application/vnd.dvb.notif-ia-registration-request+xml'|'application/vnd.dvb.notif-ia-registration-response+xml'|'application/vnd.dvb.notif-init+xml'|'application/vnd.dvb.pfr'|'application/vnd.dvb.service'|'application/vnd.dxr'|'application/vnd.dynageo'|'application/vnd.dzr'|'application/vnd.easykaraoke.cdgdownload'|'application/vnd.ecip.rlp'|'application/vnd.ecdis-update'|'application/vnd.eclipse.ditto+json'|'application/vnd.ecowin.chart'|'application/vnd.ecowin.filerequest'|'application/vnd.ecowin.fileupdate'|'application/vnd.ecowin.series'|'application/vnd.ecowin.seriesrequest'|'application/vnd.ecowin.seriesupdate'|'application/vnd.efi.img'|'application/vnd.efi.iso'|'application/vnd.eln+zip'|'application/vnd.emclient.accessrequest+xml'|'application/vnd.enliven'|'application/vnd.enphase.envoy'|'application/vnd.eprints.data+xml'|'application/vnd.epson.esf'|'application/vnd.epson.msf'|'application/vnd.epson.quickanime'|'application/vnd.epson.salt'|'application/vnd.epson.ssf'|'application/vnd.ericsson.quickcall'|'application/vnd.erofs'|'application/vnd.espass-espass+zip'|'application/vnd.eszigno3+xml'|'application/vnd.etsi.aoc+xml'|'application/vnd.etsi.asic-s+zip'|'application/vnd.etsi.asic-e+zip'|'application/vnd.etsi.cug+xml'|'application/vnd.etsi.iptvcommand+xml'|'application/vnd.etsi.iptvdiscovery+xml'|'application/vnd.etsi.iptvprofile+xml'|'application/vnd.etsi.iptvsad-bc+xml'|'application/vnd.etsi.iptvsad-cod+xml'|'application/vnd.etsi.iptvsad-npvr+xml'|'application/vnd.etsi.iptvservice+xml'|'application/vnd.etsi.iptvsync+xml'|'application/vnd.etsi.iptvueprofile+xml'|'application/vnd.etsi.mcid+xml'|'application/vnd.etsi.mheg5'|'application/vnd.etsi.overload-control-policy-dataset+xml'|'application/vnd.etsi.pstn+xml'|'application/vnd.etsi.sci+xml'|'application/vnd.etsi.simservs+xml'|'application/vnd.etsi.timestamp-token'|'application/vnd.etsi.tsl+xml'|'application/vnd.etsi.tsl.der'|'application/vnd.eu.kasparian.car+json'|'application/vnd.eudora.data'|'application/vnd.evolv.ecig.profile'|'application/vnd.evolv.ecig.settings'|'application/vnd.evolv.ecig.theme'|'application/vnd.exstream-empower+zip'|'application/vnd.exstream-package'|'application/vnd.ezpix-album'|'application/vnd.ezpix-package'|'application/vnd.f-secure.mobile'|'application/vnd.fastcopy-disk-image'|'application/vnd.familysearch.gedcom+zip'|'application/vnd.fdsn.mseed'|'application/vnd.fdsn.seed'|'application/vnd.ffsns'|'application/vnd.ficlab.flb+zip'|'application/vnd.filmit.zfc'|'application/vnd.fints'|'application/vnd.firemonkeys.cloudcell'|'application/vnd.FloGraphIt'|'application/vnd.fluxtime.clip'|'application/vnd.font-fontforge-sfd'|'application/vnd.framemaker'|'application/vnd.freelog.comic'|'application/vnd.frogans.fnc'|'application/vnd.frogans.ltf'|'application/vnd.fsc.weblaunch'|'application/vnd.fujifilm.fb.docuworks'|'application/vnd.fujifilm.fb.docuworks.binder'|'application/vnd.fujifilm.fb.docuworks.container'|'application/vnd.fujifilm.fb.jfi+xml'|'application/vnd.fujitsu.oasys'|'application/vnd.fujitsu.oasys2'|'application/vnd.fujitsu.oasys3'|'application/vnd.fujitsu.oasysgp'|'application/vnd.fujitsu.oasysprs'|'application/vnd.fujixerox.ART4'|'application/vnd.fujixerox.ART-EX'|'application/vnd.fujixerox.ddd'|'application/vnd.fujixerox.docuworks'|'application/vnd.fujixerox.docuworks.binder'|'application/vnd.fujixerox.docuworks.container'|'application/vnd.fujixerox.HBPL'|'application/vnd.fut-misnet'|'application/vnd.futoin+cbor'|'application/vnd.futoin+json'|'application/vnd.fuzzysheet'|'application/vnd.genomatix.tuxedo'|'application/vnd.genozip'|'application/vnd.gentics.grd+json'|'application/vnd.gentoo.catmetadata+xml'|'application/vnd.gentoo.ebuild'|'application/vnd.gentoo.eclass'|'application/vnd.gentoo.gpkg'|'application/vnd.gentoo.manifest'|'application/vnd.gentoo.xpak'|'application/vnd.gentoo.pkgmetadata+xml'|'application/vnd.geo+json'|'application/vnd.geocube+xml'|'application/vnd.geogebra.file'|'application/vnd.geogebra.slides'|'application/vnd.geogebra.tool'|'application/vnd.geometry-explorer'|'application/vnd.geonext'|'application/vnd.geoplan'|'application/vnd.geospace'|'application/vnd.gerber'|'application/vnd.globalplatform.card-content-mgt'|'application/vnd.globalplatform.card-content-mgt-response'|'application/vnd.gmx'|'application/vnd.gnu.taler.exchange+json'|'application/vnd.gnu.taler.merchant+json'|'application/vnd.google-earth.kml+xml'|'application/vnd.google-earth.kmz'|'application/vnd.gov.sk.e-form+xml'|'application/vnd.gov.sk.e-form+zip'|'application/vnd.gov.sk.xmldatacontainer+xml'|'application/vnd.gpxsee.map+xml'|'application/vnd.grafeq'|'application/vnd.gridmp'|'application/vnd.groove-account'|'application/vnd.groove-help'|'application/vnd.groove-identity-message'|'application/vnd.groove-injector'|'application/vnd.groove-tool-message'|'application/vnd.groove-tool-template'|'application/vnd.groove-vcard'|'application/vnd.hal+json'|'application/vnd.hal+xml'|'application/vnd.HandHeld-Entertainment+xml'|'application/vnd.hbci'|'application/vnd.hc+json'|'application/vnd.hcl-bireports'|'application/vnd.hdt'|'application/vnd.heroku+json'|'application/vnd.hhe.lesson-player'|'application/vnd.hp-HPGL'|'application/vnd.hp-hpid'|'application/vnd.hp-hps'|'application/vnd.hp-jlyt'|'application/vnd.hp-PCL'|'application/vnd.hp-PCLXL'|'application/vnd.hsl'|'application/vnd.httphone'|'application/vnd.hydrostatix.sof-data'|'application/vnd.hyper-item+json'|'application/vnd.hyper+json'|'application/vnd.hyperdrive+json'|'application/vnd.hzn-3d-crossword'|'application/vnd.ibm.afplinedata'|'application/vnd.ibm.electronic-media'|'application/vnd.ibm.MiniPay'|'application/vnd.ibm.modcap'|'application/vnd.ibm.rights-management'|'application/vnd.ibm.secure-container'|'application/vnd.iccprofile'|'application/vnd.ieee.1905'|'application/vnd.igloader'|'application/vnd.imagemeter.folder+zip'|'application/vnd.imagemeter.image+zip'|'application/vnd.immervision-ivp'|'application/vnd.immervision-ivu'|'application/vnd.ims.imsccv1p1'|'application/vnd.ims.imsccv1p2'|'application/vnd.ims.imsccv1p3'|'application/vnd.ims.lis.v2.result+json'|'application/vnd.ims.lti.v2.toolconsumerprofile+json'|'application/vnd.ims.lti.v2.toolproxy.id+json'|'application/vnd.ims.lti.v2.toolproxy+json'|'application/vnd.ims.lti.v2.toolsettings+json'|'application/vnd.ims.lti.v2.toolsettings.simple+json'|'application/vnd.informedcontrol.rms+xml'|'application/vnd.infotech.project'|'application/vnd.infotech.project+xml'|'application/vnd.informix-visionary'|'application/vnd.innopath.wamp.notification'|'application/vnd.insors.igm'|'application/vnd.intercon.formnet'|'application/vnd.intergeo'|'application/vnd.intertrust.digibox'|'application/vnd.intertrust.nncp'|'application/vnd.intu.qbo'|'application/vnd.intu.qfx'|'application/vnd.ipfs.ipns-record'|'application/vnd.ipld.car'|'application/vnd.ipld.dag-cbor'|'application/vnd.ipld.dag-json'|'application/vnd.ipld.raw'|'application/vnd.iptc.g2.catalogitem+xml'|'application/vnd.iptc.g2.conceptitem+xml'|'application/vnd.iptc.g2.knowledgeitem+xml'|'application/vnd.iptc.g2.newsitem+xml'|'application/vnd.iptc.g2.newsmessage+xml'|'application/vnd.iptc.g2.packageitem+xml'|'application/vnd.iptc.g2.planningitem+xml'|'application/vnd.ipunplugged.rcprofile'|'application/vnd.irepository.package+xml'|'application/vnd.is-xpr'|'application/vnd.isac.fcs'|'application/vnd.jam'|'application/vnd.iso11783-10+zip'|'application/vnd.japannet-directory-service'|'application/vnd.japannet-jpnstore-wakeup'|'application/vnd.japannet-payment-wakeup'|'application/vnd.japannet-registration'|'application/vnd.japannet-registration-wakeup'|'application/vnd.japannet-setstore-wakeup'|'application/vnd.japannet-verification'|'application/vnd.japannet-verification-wakeup'|'application/vnd.jcp.javame.midlet-rms'|'application/vnd.jisp'|'application/vnd.joost.joda-archive'|'application/vnd.jsk.isdn-ngn'|'application/vnd.kahootz'|'application/vnd.kde.karbon'|'application/vnd.kde.kchart'|'application/vnd.kde.kformula'|'application/vnd.kde.kivio'|'application/vnd.kde.kontour'|'application/vnd.kde.kpresenter'|'application/vnd.kde.kspread'|'application/vnd.kde.kword'|'application/vnd.kenameaapp'|'application/vnd.kidspiration'|'application/vnd.Kinar'|'application/vnd.koan'|'application/vnd.kodak-descriptor'|'application/vnd.las'|'application/vnd.las.las+json'|'application/vnd.las.las+xml'|'application/vnd.laszip'|'application/vnd.ldev.productlicensing'|'application/vnd.leap+json'|'application/vnd.liberty-request+xml'|'application/vnd.llamagraphics.life-balance.desktop'|'application/vnd.llamagraphics.life-balance.exchange+xml'|'application/vnd.logipipe.circuit+zip'|'application/vnd.loom'|'application/vnd.lotus-1-2-3'|'application/vnd.lotus-approach'|'application/vnd.lotus-freelance'|'application/vnd.lotus-notes'|'application/vnd.lotus-organizer'|'application/vnd.lotus-screencam'|'application/vnd.lotus-wordpro'|'application/vnd.macports.portpkg'|'application/vnd.mapbox-vector-tile'|'application/vnd.marlin.drm.actiontoken+xml'|'application/vnd.marlin.drm.conftoken+xml'|'application/vnd.marlin.drm.license+xml'|'application/vnd.marlin.drm.mdcf'|'application/vnd.mason+json'|'application/vnd.maxar.archive.3tz+zip'|'application/vnd.maxmind.maxmind-db'|'application/vnd.mcd'|'application/vnd.mdl'|'application/vnd.mdl-mbsdf'|'application/vnd.medcalcdata'|'application/vnd.mediastation.cdkey'|'application/vnd.medicalholodeck.recordxr'|'application/vnd.meridian-slingshot'|'application/vnd.mermaid'|'application/vnd.MFER'|'application/vnd.mfmp'|'application/vnd.micro+json'|'application/vnd.micrografx.flo'|'application/vnd.micrografx.igx'|'application/vnd.microsoft.portable-executable'|'application/vnd.microsoft.windows.thumbnail-cache'|'application/vnd.miele+json'|'application/vnd.mif'|'application/vnd.minisoft-hp3000-save'|'application/vnd.mitsubishi.misty-guard.trustweb'|'application/vnd.Mobius.DAF'|'application/vnd.Mobius.DIS'|'application/vnd.Mobius.MBK'|'application/vnd.Mobius.MQY'|'application/vnd.Mobius.MSL'|'application/vnd.Mobius.PLC'|'application/vnd.Mobius.TXF'|'application/vnd.modl'|'application/vnd.mophun.application'|'application/vnd.mophun.certificate'|'application/vnd.motorola.flexsuite'|'application/vnd.motorola.flexsuite.adsi'|'application/vnd.motorola.flexsuite.fis'|'application/vnd.motorola.flexsuite.gotap'|'application/vnd.motorola.flexsuite.kmr'|'application/vnd.motorola.flexsuite.ttc'|'application/vnd.motorola.flexsuite.wem'|'application/vnd.motorola.iprm'|'application/vnd.mozilla.xul+xml'|'application/vnd.ms-artgalry'|'application/vnd.ms-asf'|'application/vnd.ms-cab-compressed'|'application/vnd.ms-3mfdocument'|'application/vnd.ms-excel'|'application/vnd.ms-excel.addin.macroEnabled.12'|'application/vnd.ms-excel.sheet.binary.macroEnabled.12'|'application/vnd.ms-excel.sheet.macroEnabled.12'|'application/vnd.ms-excel.template.macroEnabled.12'|'application/vnd.ms-fontobject'|'application/vnd.ms-htmlhelp'|'application/vnd.ms-ims'|'application/vnd.ms-lrm'|'application/vnd.ms-office.activeX+xml'|'application/vnd.ms-officetheme'|'application/vnd.ms-playready.initiator+xml'|'application/vnd.ms-powerpoint'|'application/vnd.ms-powerpoint.addin.macroEnabled.12'|'application/vnd.ms-powerpoint.presentation.macroEnabled.12'|'application/vnd.ms-powerpoint.slide.macroEnabled.12'|'application/vnd.ms-powerpoint.slideshow.macroEnabled.12'|'application/vnd.ms-powerpoint.template.macroEnabled.12'|'application/vnd.ms-PrintDeviceCapabilities+xml'|'application/vnd.ms-PrintSchemaTicket+xml'|'application/vnd.ms-project'|'application/vnd.ms-tnef'|'application/vnd.ms-windows.devicepairing'|'application/vnd.ms-windows.nwprinting.oob'|'application/vnd.ms-windows.printerpairing'|'application/vnd.ms-windows.wsd.oob'|'application/vnd.ms-wmdrm.lic-chlg-req'|'application/vnd.ms-wmdrm.lic-resp'|'application/vnd.ms-wmdrm.meter-chlg-req'|'application/vnd.ms-wmdrm.meter-resp'|'application/vnd.ms-word.document.macroEnabled.12'|'application/vnd.ms-word.template.macroEnabled.12'|'application/vnd.ms-works'|'application/vnd.ms-wpl'|'application/vnd.ms-xpsdocument'|'application/vnd.msa-disk-image'|'application/vnd.mseq'|'application/vnd.msign'|'application/vnd.multiad.creator'|'application/vnd.multiad.creator.cif'|'application/vnd.musician'|'application/vnd.music-niff'|'application/vnd.muvee.style'|'application/vnd.mynfc'|'application/vnd.nacamar.ybrid+json'|'application/vnd.nato.bindingdataobject+cbor'|'application/vnd.nato.bindingdataobject+json'|'application/vnd.nato.bindingdataobject+xml'|'application/vnd.nato.openxmlformats-package.iepd+zip'|'application/vnd.ncd.control'|'application/vnd.ncd.reference'|'application/vnd.nearst.inv+json'|'application/vnd.nebumind.line'|'application/vnd.nervana'|'application/vnd.netfpx'|'application/vnd.neurolanguage.nlu'|'application/vnd.nimn'|'application/vnd.nintendo.snes.rom'|'application/vnd.nintendo.nitro.rom'|'application/vnd.nitf'|'application/vnd.noblenet-directory'|'application/vnd.noblenet-sealer'|'application/vnd.noblenet-web'|'application/vnd.nokia.catalogs'|'application/vnd.nokia.conml+wbxml'|'application/vnd.nokia.conml+xml'|'application/vnd.nokia.iptv.config+xml'|'application/vnd.nokia.iSDS-radio-presets'|'application/vnd.nokia.landmark+wbxml'|'application/vnd.nokia.landmark+xml'|'application/vnd.nokia.landmarkcollection+xml'|'application/vnd.nokia.ncd'|'application/vnd.nokia.n-gage.ac+xml'|'application/vnd.nokia.n-gage.data'|'application/vnd.nokia.n-gage.symbian.install'|'application/vnd.nokia.pcd+wbxml'|'application/vnd.nokia.pcd+xml'|'application/vnd.nokia.radio-preset'|'application/vnd.nokia.radio-presets'|'application/vnd.novadigm.EDM'|'application/vnd.novadigm.EDX'|'application/vnd.novadigm.EXT'|'application/vnd.ntt-local.content-share'|'application/vnd.ntt-local.file-transfer'|'application/vnd.ntt-local.ogw_remote-access'|'application/vnd.ntt-local.sip-ta_remote'|'application/vnd.ntt-local.sip-ta_tcp_stream'|'application/vnd.oai.workflows'|'application/vnd.oai.workflows+json'|'application/vnd.oai.workflows+yaml'|'application/vnd.oasis.opendocument.base'|'application/vnd.oasis.opendocument.chart'|'application/vnd.oasis.opendocument.chart-template'|'application/vnd.oasis.opendocument.database'|'application/vnd.oasis.opendocument.formula'|'application/vnd.oasis.opendocument.formula-template'|'application/vnd.oasis.opendocument.graphics'|'application/vnd.oasis.opendocument.graphics-template'|'application/vnd.oasis.opendocument.image'|'application/vnd.oasis.opendocument.image-template'|'application/vnd.oasis.opendocument.presentation'|'application/vnd.oasis.opendocument.presentation-template'|'application/vnd.oasis.opendocument.spreadsheet'|'application/vnd.oasis.opendocument.spreadsheet-template'|'application/vnd.oasis.opendocument.text'|'application/vnd.oasis.opendocument.text-master'|'application/vnd.oasis.opendocument.text-master-template'|'application/vnd.oasis.opendocument.text-template'|'application/vnd.oasis.opendocument.text-web'|'application/vnd.obn'|'application/vnd.ocf+cbor'|'application/vnd.oci.image.manifest.v1+json'|'application/vnd.oftn.l10n+json'|'application/vnd.oipf.contentaccessdownload+xml'|'application/vnd.oipf.contentaccessstreaming+xml'|'application/vnd.oipf.cspg-hexbinary'|'application/vnd.oipf.dae.svg+xml'|'application/vnd.oipf.dae.xhtml+xml'|'application/vnd.oipf.mippvcontrolmessage+xml'|'application/vnd.oipf.pae.gem'|'application/vnd.oipf.spdiscovery+xml'|'application/vnd.oipf.spdlist+xml'|'application/vnd.oipf.ueprofile+xml'|'application/vnd.oipf.userprofile+xml'|'application/vnd.olpc-sugar'|'application/vnd.oma.bcast.associated-procedure-parameter+xml'|'application/vnd.oma.bcast.drm-trigger+xml'|'application/vnd.oma.bcast.imd+xml'|'application/vnd.oma.bcast.ltkm'|'application/vnd.oma.bcast.notification+xml'|'application/vnd.oma.bcast.provisioningtrigger'|'application/vnd.oma.bcast.sgboot'|'application/vnd.oma.bcast.sgdd+xml'|'application/vnd.oma.bcast.sgdu'|'application/vnd.oma.bcast.simple-symbol-container'|'application/vnd.oma.bcast.smartcard-trigger+xml'|'application/vnd.oma.bcast.sprov+xml'|'application/vnd.oma.bcast.stkm'|'application/vnd.oma.cab-address-book+xml'|'application/vnd.oma.cab-feature-handler+xml'|'application/vnd.oma.cab-pcc+xml'|'application/vnd.oma.cab-subs-invite+xml'|'application/vnd.oma.cab-user-prefs+xml'|'application/vnd.oma.dcd'|'application/vnd.oma.dcdc'|'application/vnd.oma.dd2+xml'|'application/vnd.oma.drm.risd+xml'|'application/vnd.oma.group-usage-list+xml'|'application/vnd.oma.lwm2m+cbor'|'application/vnd.oma.lwm2m+json'|'application/vnd.oma.lwm2m+tlv'|'application/vnd.oma.pal+xml'|'application/vnd.oma.poc.detailed-progress-report+xml'|'application/vnd.oma.poc.final-report+xml'|'application/vnd.oma.poc.groups+xml'|'application/vnd.oma.poc.invocation-descriptor+xml'|'application/vnd.oma.poc.optimized-progress-report+xml'|'application/vnd.oma.push'|'application/vnd.oma.scidm.messages+xml'|'application/vnd.oma.xcap-directory+xml'|'application/vnd.omads-email+xml'|'application/vnd.omads-file+xml'|'application/vnd.omads-folder+xml'|'application/vnd.omaloc-supl-init'|'application/vnd.oma-scws-config'|'application/vnd.oma-scws-http-request'|'application/vnd.oma-scws-http-response'|'application/vnd.onepager'|'application/vnd.onepagertamp'|'application/vnd.onepagertamx'|'application/vnd.onepagertat'|'application/vnd.onepagertatp'|'application/vnd.onepagertatx'|'application/vnd.onvif.metadata'|'application/vnd.openblox.game-binary'|'application/vnd.openblox.game+xml'|'application/vnd.openeye.oeb'|'application/vnd.openstreetmap.data+xml'|'application/vnd.opentimestamps.ots'|'application/vnd.openxmlformats-officedocument.custom-properties+xml'|'application/vnd.openxmlformats-officedocument.customXmlProperties+xml'|'application/vnd.openxmlformats-officedocument.drawing+xml'|'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'|'application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml'|'application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml'|'application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml'|'application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml'|'application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml'|'application/vnd.openxmlformats-officedocument.extended-properties+xml'|'application/vnd.openxmlformats-officedocument.presentationml.commentAuthors+xml'|'application/vnd.openxmlformats-officedocument.presentationml.comments+xml'|'application/vnd.openxmlformats-officedocument.presentationml.handoutMaster+xml'|'application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml'|'application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml'|'application/vnd.openxmlformats-officedocument.presentationml.presentation'|'application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml'|'application/vnd.openxmlformats-officedocument.presentationml.presProps+xml'|'application/vnd.openxmlformats-officedocument.presentationml.slide'|'application/vnd.openxmlformats-officedocument.presentationml.slide+xml'|'application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml'|'application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml'|'application/vnd.openxmlformats-officedocument.presentationml.slideshow'|'application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml'|'application/vnd.openxmlformats-officedocument.presentationml.slideUpdateInfo+xml'|'application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml'|'application/vnd.openxmlformats-officedocument.presentationml.tags+xml'|'application/vnd.openxmlformats-officedocument.presentationml.template'|'application/vnd.openxmlformats-officedocument.presentationml.template.main+xml'|'application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'|'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.template'|'application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml'|'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'|'application/vnd.openxmlformats-officedocument.theme+xml'|'application/vnd.openxmlformats-officedocument.themeOverride+xml'|'application/vnd.openxmlformats-officedocument.vmlDrawing'|'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.document'|'application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.template'|'application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml'|'application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml'|'application/vnd.openxmlformats-package.core-properties+xml'|'application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml'|'application/vnd.openxmlformats-package.relationships+xml'|'application/vnd.oracle.resource+json'|'application/vnd.orange.indata'|'application/vnd.osa.netdeploy'|'application/vnd.osgeo.mapguide.package'|'application/vnd.osgi.bundle'|'application/vnd.osgi.dp'|'application/vnd.osgi.subsystem'|'application/vnd.otps.ct-kip+xml'|'application/vnd.oxli.countgraph'|'application/vnd.pagerduty+json'|'application/vnd.palm'|'application/vnd.panoply'|'application/vnd.paos.xml'|'application/vnd.patentdive'|'application/vnd.patientecommsdoc'|'application/vnd.pawaafile'|'application/vnd.pcos'|'application/vnd.pg.format'|'application/vnd.pg.osasli'|'application/vnd.piaccess.application-licence'|'application/vnd.picsel'|'application/vnd.pmi.widget'|'application/vnd.poc.group-advertisement+xml'|'application/vnd.pocketlearn'|'application/vnd.powerbuilder6'|'application/vnd.powerbuilder6-s'|'application/vnd.powerbuilder7'|'application/vnd.powerbuilder75'|'application/vnd.powerbuilder75-s'|'application/vnd.powerbuilder7-s'|'application/vnd.preminet'|'application/vnd.previewsystems.box'|'application/vnd.proteus.magazine'|'application/vnd.psfs'|'application/vnd.pt.mundusmundi'|'application/vnd.publishare-delta-tree'|'application/vnd.pvi.ptid1'|'application/vnd.pwg-multiplexed'|'application/vnd.pwg-xhtml-print+xml'|'application/vnd.qualcomm.brew-app-res'|'application/vnd.quarantainenet'|'application/vnd.Quark.QuarkXPress'|'application/vnd.quobject-quoxdocument'|'application/vnd.radisys.moml+xml'|'application/vnd.radisys.msml-audit-conf+xml'|'application/vnd.radisys.msml-audit-conn+xml'|'application/vnd.radisys.msml-audit-dialog+xml'|'application/vnd.radisys.msml-audit-stream+xml'|'application/vnd.radisys.msml-audit+xml'|'application/vnd.radisys.msml-conf+xml'|'application/vnd.radisys.msml-dialog-base+xml'|'application/vnd.radisys.msml-dialog-fax-detect+xml'|'application/vnd.radisys.msml-dialog-fax-sendrecv+xml'|'application/vnd.radisys.msml-dialog-group+xml'|'application/vnd.radisys.msml-dialog-speech+xml'|'application/vnd.radisys.msml-dialog-transform+xml'|'application/vnd.radisys.msml-dialog+xml'|'application/vnd.radisys.msml+xml'|'application/vnd.rainstor.data'|'application/vnd.rapid'|'application/vnd.rar'|'application/vnd.realvnc.bed'|'application/vnd.recordare.musicxml'|'application/vnd.recordare.musicxml+xml'|'application/vnd.relpipe'|'application/vnd.RenLearn.rlprint'|'application/vnd.resilient.logic'|'application/vnd.restful+json'|'application/vnd.rig.cryptonote'|'application/vnd.route66.link66+xml'|'application/vnd.rs-274x'|'application/vnd.ruckus.download'|'application/vnd.s3sms'|'application/vnd.sailingtracker.track'|'application/vnd.sar'|'application/vnd.sbm.cid'|'application/vnd.sbm.mid2'|'application/vnd.scribus'|'application/vnd.sealed.3df'|'application/vnd.sealed.csf'|'application/vnd.sealed.doc'|'application/vnd.sealed.eml'|'application/vnd.sealed.mht'|'application/vnd.sealed.net'|'application/vnd.sealed.ppt'|'application/vnd.sealed.tiff'|'application/vnd.sealed.xls'|'application/vnd.sealedmedia.softseal.html'|'application/vnd.sealedmedia.softseal.pdf'|'application/vnd.seemail'|'application/vnd.seis+json'|'application/vnd.sema'|'application/vnd.semd'|'application/vnd.semf'|'application/vnd.shade-save-file'|'application/vnd.shana.informed.formdata'|'application/vnd.shana.informed.formtemplate'|'application/vnd.shana.informed.interchange'|'application/vnd.shana.informed.package'|'application/vnd.shootproof+json'|'application/vnd.shopkick+json'|'application/vnd.shp'|'application/vnd.shx'|'application/vnd.sigrok.session'|'application/vnd.SimTech-MindMapper'|'application/vnd.siren+json'|'application/vnd.smaf'|'application/vnd.smart.notebook'|'application/vnd.smart.teacher'|'application/vnd.smintio.portals.archive'|'application/vnd.snesdev-page-table'|'application/vnd.software602.filler.form+xml'|'application/vnd.software602.filler.form-xml-zip'|'application/vnd.solent.sdkm+xml'|'application/vnd.spotfire.dxp'|'application/vnd.spotfire.sfs'|'application/vnd.sqlite3'|'application/vnd.sss-cod'|'application/vnd.sss-dtf'|'application/vnd.sss-ntf'|'application/vnd.stepmania.package'|'application/vnd.stepmania.stepchart'|'application/vnd.street-stream'|'application/vnd.sun.wadl+xml'|'application/vnd.sus-calendar'|'application/vnd.svd'|'application/vnd.swiftview-ics'|'application/vnd.sybyl.mol2'|'application/vnd.sycle+xml'|'application/vnd.syft+json'|'application/vnd.syncml.dm.notification'|'application/vnd.syncml.dmddf+xml'|'application/vnd.syncml.dmtnds+wbxml'|'application/vnd.syncml.dmtnds+xml'|'application/vnd.syncml.dmddf+wbxml'|'application/vnd.syncml.dm+wbxml'|'application/vnd.syncml.dm+xml'|'application/vnd.syncml.ds.notification'|'application/vnd.syncml+xml'|'application/vnd.tableschema+json'|'application/vnd.tao.intent-module-archive'|'application/vnd.tcpdump.pcap'|'application/vnd.think-cell.ppttc+json'|'application/vnd.tml'|'application/vnd.tmd.mediaflex.api+xml'|'application/vnd.tmobile-livetv'|'application/vnd.tri.onesource'|'application/vnd.trid.tpt'|'application/vnd.triscape.mxs'|'application/vnd.trueapp'|'application/vnd.truedoc'|'application/vnd.ubisoft.webplayer'|'application/vnd.ufdl'|'application/vnd.uiq.theme'|'application/vnd.umajin'|'application/vnd.unity'|'application/vnd.uoml+xml'|'application/vnd.uplanet.alert'|'application/vnd.uplanet.alert-wbxml'|'application/vnd.uplanet.bearer-choice'|'application/vnd.uplanet.bearer-choice-wbxml'|'application/vnd.uplanet.cacheop'|'application/vnd.uplanet.cacheop-wbxml'|'application/vnd.uplanet.channel'|'application/vnd.uplanet.channel-wbxml'|'application/vnd.uplanet.list'|'application/vnd.uplanet.listcmd'|'application/vnd.uplanet.listcmd-wbxml'|'application/vnd.uplanet.list-wbxml'|'application/vnd.uri-map'|'application/vnd.uplanet.signal'|'application/vnd.valve.source.material'|'application/vnd.vcx'|'application/vnd.vd-study'|'application/vnd.vectorworks'|'application/vnd.vel+json'|'application/vnd.verimatrix.vcas'|'application/vnd.veritone.aion+json'|'application/vnd.veryant.thin'|'application/vnd.ves.encrypted'|'application/vnd.vidsoft.vidconference'|'application/vnd.visio'|'application/vnd.visionary'|'application/vnd.vividence.scriptfile'|'application/vnd.vsf'|'application/vnd.wap.sic'|'application/vnd.wap.slc'|'application/vnd.wap.wbxml'|'application/vnd.wap.wmlc'|'application/vnd.wap.wmlscriptc'|'application/vnd.wasmflow.wafl'|'application/vnd.webturbo'|'application/vnd.wfa.dpp'|'application/vnd.wfa.p2p'|'application/vnd.wfa.wsc'|'application/vnd.windows.devicepairing'|'application/vnd.wmc'|'application/vnd.wmf.bootstrap'|'application/vnd.wolfram.mathematica'|'application/vnd.wolfram.mathematica.package'|'application/vnd.wolfram.player'|'application/vnd.wordlift'|'application/vnd.wordperfect'|'application/vnd.wqd'|'application/vnd.wrq-hp3000-labelled'|'application/vnd.wt.stf'|'application/vnd.wv.csp+xml'|'application/vnd.wv.csp+wbxml'|'application/vnd.wv.ssp+xml'|'application/vnd.xacml+json'|'application/vnd.xara'|'application/vnd.xecrets-encrypted'|'application/vnd.xfdl'|'application/vnd.xfdl.webform'|'application/vnd.xmi+xml'|'application/vnd.xmpie.cpkg'|'application/vnd.xmpie.dpkg'|'application/vnd.xmpie.plan'|'application/vnd.xmpie.ppkg'|'application/vnd.xmpie.xlim'|'application/vnd.yamaha.hv-dic'|'application/vnd.yamaha.hv-script'|'application/vnd.yamaha.hv-voice'|'application/vnd.yamaha.openscoreformat.osfpvg+xml'|'application/vnd.yamaha.openscoreformat'|'application/vnd.yamaha.remote-setup'|'application/vnd.yamaha.smaf-audio'|'application/vnd.yamaha.smaf-phrase'|'application/vnd.yamaha.through-ngn'|'application/vnd.yamaha.tunnel-udpencap'|'application/vnd.yaoweme'|'application/vnd.yellowriver-custom-menu'|'application/vnd.youtube.yt'|'application/vnd.zul'|'application/vnd.zzazz.deck+xml'|'application/voicexml+xml'|'application/voucher-cms+json'|'application/vq-rtcpxr'|'application/wasm'|'application/watcherinfo+xml'|'application/webpush-options+json'|'application/whoispp-query'|'application/whoispp-response'|'application/widget'|'application/wita'|'application/wordperfect5.1'|'application/wsdl+xml'|'application/wspolicy+xml'|'application/x-pki-message'|'application/x-www-form-urlencoded'|'application/x-x509-ca-cert'|'application/x-x509-ca-ra-cert'|'application/x-x509-next-ca-cert'|'application/x400-bp'|'application/xacml+xml'|'application/xcap-att+xml'|'application/xcap-caps+xml'|'application/xcap-diff+xml'|'application/xcap-el+xml'|'application/xcap-error+xml'|'application/xcap-ns+xml'|'application/xcon-conference-info-diff+xml'|'application/xcon-conference-info+xml'|'application/xenc+xml'|'application/xfdf'|'application/xhtml+xml'|'application/xliff+xml'|'application/xml'|'application/xml-dtd'|'application/xml-external-parsed-entity'|'application/xml-patch+xml'|'application/xmpp+xml'|'application/xop+xml'|'application/xslt+xml'|'application/xv+xml'|'application/yaml'|'application/yang'|'application/yang-data+cbor'|'application/yang-data+json'|'application/yang-data+xml'|'application/yang-patch+json'|'application/yang-patch+xml'|'application/yin+xml'|'application/zip'|'application/zlib'|'application/zstd'|'audio/1d-interleaved-parityfec'|'audio/32kadpcm'|'audio/3gpp'|'audio/3gpp2'|'audio/aac'|'audio/ac3'|'audio/AMR'|'audio/AMR-WB'|'audio/amr-wb+'|'audio/aptx'|'audio/asc'|'audio/ATRAC-ADVANCED-LOSSLESS'|'audio/ATRAC-X'|'audio/ATRAC3'|'audio/basic'|'audio/BV16'|'audio/BV32'|'audio/clearmode'|'audio/CN'|'audio/DAT12'|'audio/dls'|'audio/dsr-es201108'|'audio/dsr-es202050'|'audio/dsr-es202211'|'audio/dsr-es202212'|'audio/DV'|'audio/DVI4'|'audio/eac3'|'audio/encaprtp'|'audio/EVRC'|'audio/EVRC-QCP'|'audio/EVRC0'|'audio/EVRC1'|'audio/EVRCB'|'audio/EVRCB0'|'audio/EVRCB1'|'audio/EVRCNW'|'audio/EVRCNW0'|'audio/EVRCNW1'|'audio/EVRCWB'|'audio/EVRCWB0'|'audio/EVRCWB1'|'audio/EVS'|'audio/example'|'audio/flexfec'|'audio/fwdred'|'audio/G711-0'|'audio/G719'|'audio/G7221'|'audio/G722'|'audio/G723'|'audio/G726-16'|'audio/G726-24'|'audio/G726-32'|'audio/G726-40'|'audio/G728'|'audio/G729'|'audio/G7291'|'audio/G729D'|'audio/G729E'|'audio/GSM'|'audio/GSM-EFR'|'audio/GSM-HR-08'|'audio/iLBC'|'audio/ip-mr_v2.5'|'audio/L8'|'audio/L16'|'audio/L20'|'audio/L24'|'audio/LPC'|'audio/matroska'|'audio/MELP'|'audio/MELP600'|'audio/MELP1200'|'audio/MELP2400'|'audio/mhas'|'audio/mobile-xmf'|'audio/MPA'|'audio/mp4'|'audio/MP4A-LATM'|'audio/mpa-robust'|'audio/mpeg'|'audio/mpeg4-generic'|'audio/ogg'|'audio/opus'|'audio/parityfec'|'audio/PCMA'|'audio/PCMA-WB'|'audio/PCMU'|'audio/PCMU-WB'|'audio/prs.sid'|'audio/QCELP'|'audio/raptorfec'|'audio/RED'|'audio/rtp-enc-aescm128'|'audio/rtploopback'|'audio/rtp-midi'|'audio/rtx'|'audio/scip'|'audio/SMV'|'audio/SMV0'|'audio/SMV-QCP'|'audio/sofa'|'audio/sp-midi'|'audio/speex'|'audio/t140c'|'audio/t38'|'audio/telephone-event'|'audio/TETRA_ACELP'|'audio/TETRA_ACELP_BB'|'audio/tone'|'audio/TSVCIS'|'audio/UEMCLIP'|'audio/ulpfec'|'audio/usac'|'audio/VDVI'|'audio/VMR-WB'|'audio/vnd.3gpp.iufp'|'audio/vnd.4SB'|'audio/vnd.audiokoz'|'audio/vnd.CELP'|'audio/vnd.cisco.nse'|'audio/vnd.cmles.radio-events'|'audio/vnd.cns.anp1'|'audio/vnd.cns.inf1'|'audio/vnd.dece.audio'|'audio/vnd.digital-winds'|'audio/vnd.dlna.adts'|'audio/vnd.dolby.heaac.1'|'audio/vnd.dolby.heaac.2'|'audio/vnd.dolby.mlp'|'audio/vnd.dolby.mps'|'audio/vnd.dolby.pl2'|'audio/vnd.dolby.pl2x'|'audio/vnd.dolby.pl2z'|'audio/vnd.dolby.pulse.1'|'audio/vnd.dra'|'audio/vnd.dts'|'audio/vnd.dts.hd'|'audio/vnd.dts.uhd'|'audio/vnd.dvb.file'|'audio/vnd.everad.plj'|'audio/vnd.hns.audio'|'audio/vnd.lucent.voice'|'audio/vnd.ms-playready.media.pya'|'audio/vnd.nokia.mobile-xmf'|'audio/vnd.nortel.vbk'|'audio/vnd.nuera.ecelp4800'|'audio/vnd.nuera.ecelp7470'|'audio/vnd.nuera.ecelp9600'|'audio/vnd.octel.sbc'|'audio/vnd.presonus.multitrack'|'audio/vnd.qcelp'|'audio/vnd.rhetorex.32kadpcm'|'audio/vnd.rip'|'audio/vnd.sealedmedia.softseal.mpeg'|'audio/vnd.vmx.cvsd'|'audio/vorbis'|'audio/vorbis-config'|'font/collection'|'font/otf'|'font/sfnt'|'font/ttf'|'font/woff'|'font/woff2'|'image/aces'|'image/apng'|'image/avci'|'image/avcs'|'image/avif'|'image/bmp'|'image/cgm'|'image/dicom-rle'|'image/dpx'|'image/emf'|'image/example'|'image/fits'|'image/g3fax'|'image/heic'|'image/heic-sequence'|'image/heif'|'image/heif-sequence'|'image/hej2k'|'image/hsj2'|'image/j2c'|'image/jls'|'image/jp2'|'image/jph'|'image/jphc'|'image/jpm'|'image/jpx'|'image/jxr'|'image/jxrA'|'image/jxrS'|'image/jxs'|'image/jxsc'|'image/jxsi'|'image/jxss'|'image/ktx'|'image/ktx2'|'image/naplps'|'image/png'|'image/prs.btif'|'image/prs.pti'|'image/pwg-raster'|'image/svg+xml'|'image/t38'|'image/tiff'|'image/tiff-fx'|'image/vnd.adobe.photoshop'|'image/vnd.airzip.accelerator.azv'|'image/vnd.cns.inf2'|'image/vnd.dece.graphic'|'image/vnd.djvu'|'image/vnd.dwg'|'image/vnd.dxf'|'image/vnd.dvb.subtitle'|'image/vnd.fastbidsheet'|'image/vnd.fpx'|'image/vnd.fst'|'image/vnd.fujixerox.edmics-mmr'|'image/vnd.fujixerox.edmics-rlc'|'image/vnd.globalgraphics.pgb'|'image/vnd.microsoft.icon'|'image/vnd.mix'|'image/vnd.ms-modi'|'image/vnd.mozilla.apng'|'image/vnd.net-fpx'|'image/vnd.pco.b16'|'image/vnd.radiance'|'image/vnd.sealed.png'|'image/vnd.sealedmedia.softseal.gif'|'image/vnd.sealedmedia.softseal.jpg'|'image/vnd.svf'|'image/vnd.tencent.tap'|'image/vnd.valve.source.texture'|'image/vnd.wap.wbmp'|'image/vnd.xiff'|'image/vnd.zbrush.pcx'|'image/webp'|'image/wmf'|'image/emf'|'image/wmf'|'message/bhttp'|'message/CPIM'|'message/delivery-status'|'message/disposition-notification'|'message/example'|'message/feedback-report'|'message/global'|'message/global-delivery-status'|'message/global-disposition-notification'|'message/global-headers'|'message/http'|'message/imdn+xml'|'message/mls'|'message/news'|'message/ohttp-req'|'message/ohttp-res'|'message/s-http'|'message/sip'|'message/sipfrag'|'message/tracking-status'|'message/vnd.si.simp'|'message/vnd.wfa.wsc'|'model/3mf'|'model/e57'|'model/example'|'model/gltf-binary'|'model/gltf+json'|'model/JT'|'model/iges'|'model/mtl'|'model/obj'|'model/prc'|'model/step'|'model/step+xml'|'model/step+zip'|'model/step-xml+zip'|'model/stl'|'model/u3d'|'model/vnd.bary'|'model/vnd.cld'|'model/vnd.collada+xml'|'model/vnd.dwf'|'model/vnd.flatland.3dml'|'model/vnd.gdl'|'model/vnd.gs-gdl'|'model/vnd.gtw'|'model/vnd.moml+xml'|'model/vnd.mts'|'model/vnd.opengex'|'model/vnd.parasolid.transmit.binary'|'model/vnd.parasolid.transmit.text'|'model/vnd.pytha.pyox'|'model/vnd.rosette.annotated-data-model'|'model/vnd.sap.vds'|'model/vnd.usda'|'model/vnd.usdz+zip'|'model/vnd.valve.source.compiled-map'|'model/vnd.vtu'|'model/x3d-vrml'|'model/x3d+fastinfoset'|'model/x3d+xml'|'multipart/appledouble'|'multipart/byteranges'|'multipart/encrypted'|'multipart/example'|'multipart/form-data'|'multipart/header-set'|'multipart/multilingual'|'multipart/related'|'multipart/report'|'multipart/signed'|'multipart/vnd.bint.med-plus'|'multipart/voice-message'|'multipart/x-mixed-replace'|'text/1d-interleaved-parityfec'|'text/cache-manifest'|'text/calendar'|'text/cql'|'text/cql-expression'|'text/cql-identifier'|'text/css'|'text/csv'|'text/csv-schema'|'text/directory'|'text/dns'|'text/ecmascript'|'text/encaprtp'|'text/example'|'text/fhirpath'|'text/flexfec'|'text/fwdred'|'text/gff3'|'text/grammar-ref-list'|'text/hl7v2'|'text/html'|'text/javascript'|'text/jcr-cnd'|'text/markdown'|'text/mizar'|'text/n3'|'text/parameters'|'text/parityfec'|'text/provenance-notation'|'text/prs.fallenstein.rst'|'text/prs.lines.tag'|'text/prs.prop.logic'|'text/prs.texi'|'text/raptorfec'|'text/RED'|'text/rfc822-headers'|'text/rtf'|'text/rtp-enc-aescm128'|'text/rtploopback'|'text/rtx'|'text/SGML'|'text/shaclc'|'text/shex'|'text/spdx'|'text/strings'|'text/t140'|'text/tab-separated-values'|'text/troff'|'text/turtle'|'text/ulpfec'|'text/uri-list'|'text/vcard'|'text/vnd.a'|'text/vnd.abc'|'text/vnd.ascii-art'|'text/vnd.curl'|'text/vnd.debian.copyright'|'text/vnd.DMClientScript'|'text/vnd.dvb.subtitle'|'text/vnd.esmertec.theme-descriptor'|'text/vnd.exchangeable'|'text/vnd.familysearch.gedcom'|'text/vnd.ficlab.flt'|'text/vnd.fly'|'text/vnd.fmi.flexstor'|'text/vnd.gml'|'text/vnd.graphviz'|'text/vnd.hans'|'text/vnd.hgl'|'text/vnd.in3d.3dml'|'text/vnd.in3d.spot'|'text/vnd.IPTC.NewsML'|'text/vnd.IPTC.NITF'|'text/vnd.latex-z'|'text/vnd.motorola.reflex'|'text/vnd.ms-mediapackage'|'text/vnd.net2phone.commcenter.command'|'text/vnd.radisys.msml-basic-layout'|'text/vnd.senx.warpscript'|'text/vnd.si.uricatalogue'|'text/vnd.sun.j2me.app-descriptor'|'text/vnd.sosi'|'text/vnd.trolltech.linguist'|'text/vnd.wap.si'|'text/vnd.wap.sl'|'text/vnd.wap.wml'|'text/vnd.wap.wmlscript'|'text/vtt'|'text/wgsl'|'text/xml'|'text/xml-external-parsed-entity'|'video/1d-interleaved-parityfec'|'video/3gpp'|'video/3gpp2'|'video/3gpp-tt'|'video/AV1'|'video/BMPEG'|'video/BT656'|'video/CelB'|'video/DV'|'video/encaprtp'|'video/example'|'video/FFV1'|'video/flexfec'|'video/H261'|'video/H263'|'video/H263-1998'|'video/H263-2000'|'video/H264'|'video/H264-RCDO'|'video/H264-SVC'|'video/H265'|'video/H266'|'video/iso.segment'|'video/JPEG'|'video/jpeg2000'|'video/jxsv'|'video/matroska'|'video/matroska-3d'|'video/mj2'|'video/MP1S'|'video/MP2P'|'video/MP2T'|'video/mp4'|'video/MP4V-ES'|'video/MPV'|'video/mpeg4-generic'|'video/nv'|'video/ogg'|'video/parityfec'|'video/pointer'|'video/quicktime'|'video/raptorfec'|'video/raw'|'video/rtp-enc-aescm128'|'video/rtploopback'|'video/rtx'|'video/scip'|'video/smpte291'|'video/SMPTE292M'|'video/ulpfec'|'video/vc1'|'video/vc2'|'video/vnd.CCTV'|'video/vnd.dece.hd'|'video/vnd.dece.mobile'|'video/vnd.dece.mp4'|'video/vnd.dece.pd'|'video/vnd.dece.sd'|'video/vnd.dece.video'|'video/vnd.directv.mpeg'|'video/vnd.directv.mpeg-tts'|'video/vnd.dlna.mpeg-tts'|'video/vnd.dvb.file'|'video/vnd.fvt'|'video/vnd.hns.video'|'video/vnd.iptvforum.1dparityfec-1010'|'video/vnd.iptvforum.1dparityfec-2005'|'video/vnd.iptvforum.2dparityfec-1010'|'video/vnd.iptvforum.2dparityfec-2005'|'video/vnd.iptvforum.ttsavc'|'video/vnd.iptvforum.ttsmpeg2'|'video/vnd.motorola.video'|'video/vnd.motorola.videop'|'video/vnd.mpegurl'|'video/vnd.ms-playready.media.pyv'|'video/vnd.nokia.interleaved-multimedia'|'video/vnd.nokia.mp4vr'|'video/vnd.nokia.videovoip'|'video/vnd.objectvideo'|'video/vnd.radgamettools.bink'|'video/vnd.radgamettools.smacker'|'video/vnd.sealed.mpeg1'|'video/vnd.sealed.mpeg4'|'video/vnd.sealed.swf'|'video/vnd.sealedmedia.softseal.mov'|'video/vnd.uvvu.mp4'|'video/vnd.youtube.yt'|'video/vnd.vivo'|'video/VP8'|'video/VP9'| AnyString;
diff --git a/src/types/_utils.ts b/src/types/_utils.ts
new file mode 100644
index 0000000..1046bc5
--- /dev/null
+++ b/src/types/_utils.ts
@@ -0,0 +1,2 @@
+export type AnyString = string & {}; // eslint-disable-line @typescript-eslint/ban-types
+export type AnyNumber = number & {}; // eslint-disable-line @typescript-eslint/ban-types
diff --git a/src/types/index.ts b/src/types/index.ts
new file mode 100644
index 0000000..cda2d2b
--- /dev/null
+++ b/src/types/index.ts
@@ -0,0 +1,97 @@
+import type { QueryObject } from "ufo";
+import type { Hooks as WSHooks } from "crossws";
+import type { H3Event } from "../event";
+import type { Session } from "../utils/session";
+import type { RouteNode } from "../router";
+import type { AnyNumber } from "./_utils";
+
+export type {
+  ValidateFunction,
+  ValidateResult,
+} from "../utils/internal/validate";
+
+// https://www.rfc-editor.org/rfc/rfc7231#section-4.1
+// prettier-ignore
+export type HTTPMethod =  "GET" | "HEAD" | "PATCH" | "POST" | "PUT" | "DELETE" | "CONNECT" | "OPTIONS" | "TRACE";
+
+// prettier-ignore
+// eslint-disable-next-line unicorn/text-encoding-identifier-case
+export type Encoding =  false | "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex";
+
+// prettier-ignore
+export type StatusCode = 100 | 101 | 102 | 103 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 226 | 300 | 301 | 302 | 303 | 304 | 305 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 444 | 450 | 451 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 506 | 507 | 508 | 509 | 510 | 511 | 521 | 522 | 523 | 525 | 530 | 599 | AnyNumber;
+
+export interface H3EventContext extends Record<string, any> {
+  /* Matched router parameters */
+  params?: Record<string, string>;
+  /**
+   * Matched router Node
+   *
+   * @experimental The object structure may change in non-major version.
+   */
+  matchedRoute?: RouteNode;
+  /* Cached session data */
+  sessions?: Record<string, Session>;
+  /* Trusted IP Address of client */
+  clientAddress?: string;
+}
+
+export type EventHandlerResponse<T = any> = T | Promise<T>;
+
+export interface EventHandlerRequest {
+  body?: any; // TODO: Default to unknown in next major version
+  query?: QueryObject;
+  routerParams?: Record<string, string>;
+}
+
+export type InferEventInput<
+  Key extends keyof EventHandlerRequest,
+  Event extends H3Event,
+  T,
+> = void extends T ? (Event extends H3Event<infer E> ? E[Key] : never) : T;
+
+type MaybePromise<T> = T | Promise<T>;
+
+export type EventHandlerResolver = (
+  path: string,
+) => MaybePromise<undefined | { route?: string; handler: EventHandler }>;
+
+export interface EventHandler<
+  Request extends EventHandlerRequest = EventHandlerRequest,
+  Response extends EventHandlerResponse = EventHandlerResponse,
+> {
+  __is_handler__?: true;
+  __resolve__?: EventHandlerResolver;
+  __websocket__?: Partial<WSHooks>;
+  (event: H3Event<Request>): Response;
+}
+
+export type _RequestMiddleware<
+  Request extends EventHandlerRequest = EventHandlerRequest,
+> = (event: H3Event<Request>) => void | Promise<void>;
+
+export type _ResponseMiddleware<
+  Request extends EventHandlerRequest = EventHandlerRequest,
+  Response extends EventHandlerResponse = EventHandlerResponse,
+> = (
+  event: H3Event<Request>,
+  response: { body?: Awaited<Response> },
+) => void | Promise<void>;
+
+export type EventHandlerObject<
+  Request extends EventHandlerRequest = EventHandlerRequest,
+  Response extends EventHandlerResponse = EventHandlerResponse,
+> = {
+  onRequest?: _RequestMiddleware<Request> | _RequestMiddleware<Request>[];
+  onBeforeResponse?:
+    | _ResponseMiddleware<Request, Response>
+    | _ResponseMiddleware<Request, Response>[];
+  /** @experimental */
+  websocket?: Partial<WSHooks>;
+  handler: EventHandler<Request, Response>;
+};
+
+export type LazyEventHandler = () => EventHandler | Promise<EventHandler>;
+
+export type { MimeType } from "./_mimes";
+export type { TypedHeaders, RequestHeaders, HTTPHeaderName } from "./_headers";
diff --git a/src/utils/body.ts b/src/utils/body.ts
index 3f71b16..c89aacb 100644
--- a/src/utils/body.ts
+++ b/src/utils/body.ts
@@ -97,7 +97,14 @@ export function readRawBody<E extends Encoding = "utf8">(
       : (promise as Promise<any>);
   }
 
-  if (!Number.parseInt(event.node.req.headers["content-length"] || "")) {
+  if (
+    !Number.parseInt(event.node.req.headers["content-length"] || "") &&
+    !String(event.node.req.headers["transfer-encoding"] ?? "")
+      .split(",")
+      .map((e) => e.trim())
+      .filter(Boolean)
+      .includes("chunked")
+  ) {
     return Promise.resolve(undefined);
   }
 
diff --git a/src/utils/consts.ts b/src/utils/consts.ts
index 16a0ec9..e4f30b5 100644
--- a/src/utils/consts.ts
+++ b/src/utils/consts.ts
@@ -1,4 +1,4 @@
 export const MIMES = {
   html: "text/html",
   json: "application/json",
-};
+} as const;
diff --git a/src/utils/cors/handler.ts b/src/utils/cors/handler.ts
index 10ce3fa..08e1151 100644
--- a/src/utils/cors/handler.ts
+++ b/src/utils/cors/handler.ts
@@ -14,6 +14,25 @@ import type { H3CorsOptions } from "./types";
  * If the incoming request is a CORS preflight request, it will append the CORS preflight headers and send a 204 response.
  *
  * If return value is `true`, the request is handled and no further action is needed.
+ *
+ * @example
+ * const app = createApp();
+ * const router = createRouter();
+ * router.use('/',
+ *   defineEventHandler(async (event) => {
+ *       const didHandleCors = handleCors(event, {
+ *         origin: '*',
+ *         preflight: {
+ *          statusCode: 204,
+ *         },
+ *      methods: '*',
+ *    });
+ *    if (didHandleCors) {
+ *      return;
+ *    }
+ *    // Your code here
+ *  })
+ * );
  */
 export function handleCors(event: H3Event, options: H3CorsOptions): boolean {
   const _options = resolveCorsOptions(options);
diff --git a/src/utils/proxy.ts b/src/utils/proxy.ts
index 9aded1e..0216e2d 100644
--- a/src/utils/proxy.ts
+++ b/src/utils/proxy.ts
@@ -4,6 +4,7 @@ import { getRequestHeaders } from "./request";
 import { splitCookiesString } from "./cookie";
 import { sanitizeStatusMessage, sanitizeStatusCode } from "./sanitize";
 import { getRequestWebStream, readRawBody } from "./body";
+import { createError } from "../error";
 
 export type Duplex = "half" | "full";
 
@@ -81,11 +82,20 @@ export async function sendProxy(
   target: string,
   opts: ProxyOptions = {},
 ) {
-  const response = await _getFetch(opts.fetch)(target, {
-    headers: opts.headers as HeadersInit,
-    ignoreResponseError: true, // make $ofetch.raw transparent
-    ...opts.fetchOptions,
-  });
+  let response: Response | undefined;
+  try {
+    response = await _getFetch(opts.fetch)(target, {
+      headers: opts.headers as HeadersInit,
+      ignoreResponseError: true, // make $ofetch.raw transparent
+      ...opts.fetchOptions,
+    });
+  } catch (error) {
+    throw createError({
+      status: 502,
+      statusMessage: "Bad Gateway",
+      cause: error,
+    });
+  }
   event.node.res.statusCode = sanitizeStatusCode(
     response.status,
     event.node.res.statusCode,
@@ -179,7 +189,6 @@ export function getProxyRequestHeaders(event: H3Event) {
  */
 export function fetchWithEvent<
   T = unknown,
-  // eslint-disable-next-line @typescript-eslint/no-unused-vars
   _R = any,
   F extends (req: RequestInfo | URL, opts?: any) => any = typeof fetch,
 >(
diff --git a/src/utils/request.ts b/src/utils/request.ts
index 955bb85..aa96aec 100644
--- a/src/utils/request.ts
+++ b/src/utils/request.ts
@@ -335,7 +335,7 @@ export function getRequestURL(
   opts: { xForwardedHost?: boolean; xForwardedProto?: boolean } = {},
 ) {
   const host = getRequestHost(event, opts);
-  const protocol = getRequestProtocol(event);
+  const protocol = getRequestProtocol(event, opts);
   const path = (event.node.req.originalUrl || event.path).replace(
     /^[/\\]+/g,
     "/",
diff --git a/src/utils/response.ts b/src/utils/response.ts
index 023820e..d0bf0b0 100644
--- a/src/utils/response.ts
+++ b/src/utils/response.ts
@@ -1,8 +1,12 @@
-import type { OutgoingMessage } from "node:http";
 import type { Readable } from "node:stream";
 import type { Socket } from "node:net";
 import type { H3Event } from "../event";
-import type { HTTPHeaderName } from "../types";
+import type {
+  HTTPHeaderName,
+  MimeType,
+  TypedHeaders,
+  StatusCode,
+} from "../types";
 import { MIMES } from "./consts";
 import { sanitizeStatusCode, sanitizeStatusMessage } from "./sanitize";
 import { splitCookiesString } from "./cookie";
@@ -23,7 +27,11 @@ const defer =
  * **Note:** This function should be used only when you want to send a response directly without using the `h3` event.
  * Normally you can directly `return` a value inside event handlers.
  */
-export function send(event: H3Event, data?: any, type?: string): Promise<void> {
+export function send(
+  event: H3Event,
+  data?: any,
+  type?: MimeType,
+): Promise<void> {
   if (type) {
     defaultContentType(event, type);
   }
@@ -55,7 +63,7 @@ export function send(event: H3Event, data?: any, type?: string): Promise<void> {
  * @param event H3 event
  * @param code status code to be send. By default, it is `204 No Content`.
  */
-export function sendNoContent(event: H3Event, code?: number) {
+export function sendNoContent(event: H3Event, code?: StatusCode) {
   if (event.handled) {
     return;
   }
@@ -85,7 +93,7 @@ export function sendNoContent(event: H3Event, code?: number) {
  */
 export function setResponseStatus(
   event: H3Event,
-  code?: number,
+  code?: StatusCode,
   text?: string,
 ): void {
   if (code) {
@@ -128,7 +136,7 @@ export function getResponseStatusText(event: H3Event): string {
 /**
  * Set the response status code and message.
  */
-export function defaultContentType(event: H3Event, type?: string) {
+export function defaultContentType(event: H3Event, type?: MimeType) {
   if (
     type &&
     event.node.res.statusCode !== 304 /* unjs/h3#603 */ &&
@@ -155,7 +163,11 @@ export function defaultContentType(event: H3Event, type?: string) {
  *   return sendRedirect(event, "https://example.com", 301); // Permanent redirect
  * });
  */
-export function sendRedirect(event: H3Event, location: string, code = 302) {
+export function sendRedirect(
+  event: H3Event,
+  location: string,
+  code: StatusCode = 302,
+) {
   event.node.res.statusCode = sanitizeStatusCode(
     code,
     event.node.res.statusCode,
@@ -208,12 +220,13 @@ export function getResponseHeader(
  */
 export function setResponseHeaders(
   event: H3Event,
-  headers: Partial<
-    Record<HTTPHeaderName, Parameters<OutgoingMessage["setHeader"]>[1]>
-  >,
+  headers: TypedHeaders,
 ): void {
   for (const [name, value] of Object.entries(headers)) {
-    event.node.res.setHeader(name, value!);
+    event.node.res.setHeader(
+      name,
+      value! as unknown as number | string | readonly string[],
+    );
   }
 }
 
@@ -230,12 +243,12 @@ export const setHeaders = setResponseHeaders;
  *   setResponseHeader(event, "content-type", "text/html");
  * });
  */
-export function setResponseHeader(
+export function setResponseHeader<T extends HTTPHeaderName>(
   event: H3Event,
-  name: HTTPHeaderName,
-  value: Parameters<OutgoingMessage["setHeader"]>[1],
+  name: T,
+  value: TypedHeaders[Lowercase<T>],
 ): void {
-  event.node.res.setHeader(name, value);
+  event.node.res.setHeader(name, value as string);
 }
 
 /**
@@ -256,7 +269,7 @@ export const setHeader = setResponseHeader;
  */
 export function appendResponseHeaders(
   event: H3Event,
-  headers: Record<string, string>,
+  headers: TypedHeaders,
 ): void {
   for (const [name, value] of Object.entries(headers)) {
     appendResponseHeader(event, name, value);
@@ -276,15 +289,15 @@ export const appendHeaders = appendResponseHeaders;
  *   appendResponseHeader(event, "content-type", "text/html");
  * });
  */
-export function appendResponseHeader(
+export function appendResponseHeader<T extends HTTPHeaderName>(
   event: H3Event,
-  name: HTTPHeaderName,
-  value: string,
+  name: T,
+  value: TypedHeaders[Lowercase<T>],
 ): void {
   let current = event.node.res.getHeader(name);
 
   if (!current) {
-    event.node.res.setHeader(name, value);
+    event.node.res.setHeader(name, value as string);
     return;
   }
 
@@ -292,7 +305,7 @@ export function appendResponseHeader(
     current = [current.toString()];
   }
 
-  event.node.res.setHeader(name, [...current, value]);
+  event.node.res.setHeader(name, [...current, value as string]);
 }
 
 /**
@@ -313,7 +326,7 @@ export const appendHeader = appendResponseHeader;
  */
 export function clearResponseHeaders(
   event: H3Event,
-  headerNames?: string[],
+  headerNames?: HTTPHeaderName[],
 ): void {
   if (headerNames && headerNames.length > 0) {
     for (const name of headerNames) {
diff --git a/src/utils/sse/utils.ts b/src/utils/sse/utils.ts
index 2a838eb..9e0019a 100644
--- a/src/utils/sse/utils.ts
+++ b/src/utils/sse/utils.ts
@@ -1,4 +1,4 @@
-import { HTTPHeaderName } from "../../types";
+import { TypedHeaders } from "../../types";
 import { H3Event } from "../../event";
 import { getHeader } from "../request";
 import { setResponseHeaders } from "../response";
@@ -30,9 +30,7 @@ export function formatEventStreamMessages(
 }
 
 export function setEventStreamHeaders(event: H3Event) {
-  const headers: Partial<
-    Record<HTTPHeaderName, string | number | readonly string[]>
-  > = {
+  const headers: TypedHeaders = {
     "Content-Type": "text/event-stream",
     "Cache-Control":
       "private, no-cache, no-store, no-transform, must-revalidate, max-age=0",


Test patch:
diff --git a/test/app.test.ts b/test/app.test.ts
index 67f6d37..a8d722c 100644
--- a/test/app.test.ts
+++ b/test/app.test.ts
@@ -395,10 +395,82 @@ describe("app", () => {
     expect(onRequest).toHaveBeenCalledTimes(1);
     expect(onRequest.mock.calls[0][0].path).toBe("/foo");
 
+    expect(onError).toHaveBeenCalledTimes(0);
+
     expect(onBeforeResponse).toHaveBeenCalledTimes(1);
     expect(onBeforeResponse.mock.calls[0][1].body).toBe("Hello World!");
 
     expect(onAfterResponse).toHaveBeenCalledTimes(1);
     expect(onAfterResponse.mock.calls[0][1].body).toBe("Hello World!");
   });
+
+  it("сalls onRequest and onResponse when an exception is thrown", async () => {
+    app.use(
+      eventHandler(() => {
+        throw createError({
+          statusCode: 503,
+        });
+      }),
+    );
+    await request.get("/foo");
+
+    expect(onRequest).toHaveBeenCalledTimes(1);
+    expect(onRequest.mock.calls[0][0].path).toBe("/foo");
+
+    expect(onError).toHaveBeenCalledTimes(1);
+    expect(onError.mock.calls[0][0].statusCode).toBe(503);
+    expect(onError.mock.calls[0][1].path).toBe("/foo");
+
+    expect(onBeforeResponse).toHaveBeenCalledTimes(1);
+    expect(onBeforeResponse.mock.calls[0][0].node.res.statusCode).toBe(503);
+
+    expect(onAfterResponse).toHaveBeenCalledTimes(1);
+    expect(onAfterResponse.mock.calls[0][0].node.res.statusCode).toBe(503);
+  });
+
+  it("calls onRequest and onResponse when an error is returned", async () => {
+    app.use(
+      eventHandler(() => {
+        return createError({
+          statusCode: 404,
+        });
+      }),
+    );
+    await request.get("/foo");
+
+    expect(onRequest).toHaveBeenCalledTimes(1);
+    expect(onRequest.mock.calls[0][0].path).toBe("/foo");
+
+    expect(onError).toHaveBeenCalledTimes(1);
+
+    expect(onBeforeResponse).toHaveBeenCalledTimes(1);
+    expect(onBeforeResponse.mock.calls[0][0].node.res.statusCode).toBe(404);
+
+    expect(onAfterResponse).toHaveBeenCalledTimes(1);
+    expect(onAfterResponse.mock.calls[0][0].node.res.statusCode).toBe(404);
+  });
+
+  it("calls onRequest and onResponse when an unhandled error occurs", async () => {
+    app.use(
+      eventHandler((event) => {
+        // @ts-expect-error
+        return event.unknown.property;
+      }),
+    );
+    await request.get("/foo");
+
+    expect(onRequest).toHaveBeenCalledTimes(1);
+    expect(onRequest.mock.calls[0][0].path).toBe("/foo");
+
+    expect(onError).toHaveBeenCalledTimes(1);
+    expect(onError.mock.calls[0][0].statusCode).toBe(500);
+    expect(onError.mock.calls[0][0].cause).toBeInstanceOf(TypeError);
+    expect(onError.mock.calls[0][1].path).toBe("/foo");
+
+    expect(onBeforeResponse).toHaveBeenCalledTimes(1);
+    expect(onBeforeResponse.mock.calls[0][0].node.res.statusCode).toBe(500);
+
+    expect(onAfterResponse).toHaveBeenCalledTimes(1);
+    expect(onAfterResponse.mock.calls[0][0].node.res.statusCode).toBe(500);
+  });
 });
diff --git a/test/assets/sample.json b/test/assets/sample.json
new file mode 100644
index 0000000..c226f58
--- /dev/null
+++ b/test/assets/sample.json
@@ -0,0 +1,1 @@
+{ "bool": true, "name": "string", "number": 1 }
diff --git a/test/body.test.ts b/test/body.test.ts
index 9c48901..66d1b54 100644
--- a/test/body.test.ts
+++ b/test/body.test.ts
@@ -1,5 +1,9 @@
-import supertest, { SuperTest, Test } from "supertest";
-import { describe, it, expect, beforeEach } from "vitest";
+import { Server } from "node:http";
+import { createReadStream } from "node:fs";
+import { readFile } from "node:fs/promises";
+import getPort from "get-port";
+import { Client } from "undici";
+import { describe, it, expect, beforeEach, afterEach } from "vitest";
 import {
   createApp,
   toNodeListener,
@@ -10,13 +14,22 @@ import {
   readMultipartFormData,
 } from "../src";
 
-describe("", () => {
+describe("body", () => {
   let app: App;
-  let request: SuperTest<Test>;
+  let server: Server;
+  let client: Client;
 
-  beforeEach(() => {
+  beforeEach(async () => {
     app = createApp({ debug: true });
-    request = supertest(toNodeListener(app));
+    server = new Server(toNodeListener(app));
+    const port = await getPort();
+    server.listen(port);
+    client = new Client(`http://localhost:${port}`);
+  });
+
+  afterEach(() => {
+    client.close();
+    server.close();
   });
 
   describe("readRawBody", () => {
@@ -29,60 +42,94 @@ describe("", () => {
           return "200";
         }),
       );
-      const result = await request.post("/api/test").send(
-        JSON.stringify({
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        body: JSON.stringify({
           bool: true,
           name: "string",
           number: 1,
         }),
+      });
+
+      expect(await result.body.text()).toBe("200");
+    });
+
+    it("can handle chunked string", async () => {
+      const requestJsonUrl = new URL("assets/sample.json", import.meta.url);
+      app.use(
+        "/",
+        eventHandler(async (request) => {
+          const body = await readRawBody(request);
+          const json = (await readFile(requestJsonUrl)).toString("utf8");
+
+          expect(body).toEqual(json);
+          return "200";
+        }),
       );
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        body: createReadStream(requestJsonUrl),
+      });
 
-      expect(result.text).toBe("200");
+      expect(await result.body.text()).toBe("200");
     });
 
     it("returns undefined if body is not present", async () => {
-      let body = "initial";
+      let _body: string | undefined = "initial";
       app.use(
         "/",
         eventHandler(async (request) => {
-          body = await readRawBody(request);
+          _body = await readRawBody(request);
           return "200";
         }),
       );
-      const result = await request.post("/api/test");
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+      });
 
-      expect(body).toBeUndefined();
-      expect(result.text).toBe("200");
+      expect(_body).toBeUndefined();
+      expect(await result.body.text()).toBe("200");
     });
 
     it("returns an empty string if body is empty", async () => {
-      let body = "initial";
+      let _body: string | undefined = "initial";
       app.use(
         "/",
         eventHandler(async (request) => {
-          body = await readRawBody(request);
+          _body = await readRawBody(request);
           return "200";
         }),
       );
-      const result = await request.post("/api/test").send('""');
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        body: '""',
+      });
 
-      expect(body).toBe('""');
-      expect(result.text).toBe("200");
+      expect(_body).toBe('""');
+      expect(await result.body.text()).toBe("200");
     });
 
     it("returns an empty object string if body is empty object", async () => {
-      let body = "initial";
+      let _body: string | undefined = "initial";
       app.use(
         "/",
         eventHandler(async (request) => {
-          body = await readRawBody(request);
+          _body = await readRawBody(request);
           return "200";
         }),
       );
-      const result = await request.post("/api/test").send({});
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        body: "{}",
+      });
 
-      expect(body).toBe("{}");
-      expect(result.text).toBe("200");
+      expect(_body).toBe("{}");
+      expect(await result.body.text()).toBe("200");
     });
   });
 
@@ -100,17 +147,21 @@ describe("", () => {
           return "200";
         }),
       );
-      const result = await request.post("/api/test").send({
-        bool: true,
-        name: "string",
-        number: 1,
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        body: JSON.stringify({
+          bool: true,
+          name: "string",
+          number: 1,
+        }),
       });
 
-      expect(result.text).toBe("200");
+      expect(await result.body.text()).toBe("200");
     });
 
     it("handles non-present body", async () => {
-      let _body;
+      let _body: string | undefined;
       app.use(
         "/",
         eventHandler(async (request) => {
@@ -118,13 +169,16 @@ describe("", () => {
           return "200";
         }),
       );
-      const result = await request.post("/api/test").send();
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+      });
       expect(_body).toBeUndefined();
-      expect(result.text).toBe("200");
+      expect(await result.body.text()).toBe("200");
     });
 
     it("handles empty body", async () => {
-      let _body = "initial";
+      let _body: string | undefined = "initial";
       app.use(
         "/",
         eventHandler(async (request) => {
@@ -132,16 +186,20 @@ describe("", () => {
           return "200";
         }),
       );
-      const result = await request
-        .post("/api/test")
-        .set("Content-Type", "text/plain")
-        .send('""');
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        headers: {
+          "Content-Type": "text/plain",
+        },
+        body: '""',
+      });
       expect(_body).toStrictEqual('""');
-      expect(result.text).toBe("200");
+      expect(await result.body.text()).toBe("200");
     });
 
     it("handles empty object as body", async () => {
-      let _body = "initial";
+      let _body: string | undefined = "initial";
       app.use(
         "/",
         eventHandler(async (request) => {
@@ -149,9 +207,13 @@ describe("", () => {
           return "200";
         }),
       );
-      const result = await request.post("/api/test").send({});
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        body: "{}",
+      });
       expect(_body).toStrictEqual({});
-      expect(result.text).toBe("200");
+      expect(await result.body.text()).toBe("200");
     });
 
     it("parse the form encoded into an object", async () => {
@@ -167,12 +229,16 @@ describe("", () => {
           return "200";
         }),
       );
-      const result = await request
-        .post("/api/test")
-        .set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
-        .send("field=value&another=true&number=20&number=30&number=40");
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        headers: {
+          "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
+        },
+        body: "field=value&another=true&number=20&number=30&number=40",
+      });
 
-      expect(result.text).toBe("200");
+      expect(await result.body.text()).toBe("200");
     });
 
     it("handle readBody with buffer type (unenv)", async () => {
@@ -189,10 +255,12 @@ describe("", () => {
           return "200";
         }),
       );
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+      });
 
-      const result = await request.post("/api/test").send();
-
-      expect(result.text).toBe("200");
+      expect(await result.body.text()).toBe("200");
     });
 
     it("handle readBody with Object type (unenv)", async () => {
@@ -209,10 +277,12 @@ describe("", () => {
           return "200";
         }),
       );
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+      });
 
-      const result = await request.post("/api/test").send();
-
-      expect(result.text).toBe("200");
+      expect(await result.body.text()).toBe("200");
     });
 
     it("handle readRawBody with array buffer type (unenv)", async () => {
@@ -228,8 +298,11 @@ describe("", () => {
           return "200";
         }),
       );
-      const result = await request.post("/api/test").send();
-      expect(result.text).toBe("200");
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+      });
+      expect(await result.body.text()).toBe("200");
     });
 
     it("parses multipart form data", async () => {
@@ -243,17 +316,17 @@ describe("", () => {
           }));
         }),
       );
-      const result = await request
-        .post("/api/test")
-        .set(
-          "content-type",
-          "multipart/form-data; boundary=---------------------------12537827810750053901680552518",
-        )
-        .send(
-          '-----------------------------12537827810750053901680552518\r\nContent-Disposition: form-data; name="baz"\r\n\r\nother\r\n-----------------------------12537827810750053901680552518\r\nContent-Disposition: form-data; name="号楼电表数据模版.xlsx"\r\n\r\nsomething\r\n-----------------------------12537827810750053901680552518--\r\n',
-        );
-
-      expect(result.body).toMatchInlineSnapshot(`
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        headers: {
+          "content-type":
+            "multipart/form-data; boundary=---------------------------12537827810750053901680552518",
+        },
+        body: '-----------------------------12537827810750053901680552518\r\nContent-Disposition: form-data; name="baz"\r\n\r\nother\r\n-----------------------------12537827810750053901680552518\r\nContent-Disposition: form-data; name="号楼电表数据模版.xlsx"\r\n\r\nsomething\r\n-----------------------------12537827810750053901680552518--\r\n',
+      });
+
+      expect(await result.body.json()).toMatchInlineSnapshot(`
         [
           {
             "data": "other",
@@ -268,55 +341,67 @@ describe("", () => {
     });
 
     it("returns undefined if body is not present with text/plain", async () => {
-      let body;
+      let _body: string | undefined;
       app.use(
         "/",
         eventHandler(async (request) => {
-          body = await readBody(request);
+          _body = await readBody(request);
           return "200";
         }),
       );
-      const result = await request
-        .post("/api/test")
-        .set("Content-Type", "text/plain");
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        headers: {
+          "Content-Type": "text/plain",
+        },
+      });
 
-      expect(body).toBeUndefined();
-      expect(result.text).toBe("200");
+      expect(_body).toBeUndefined();
+      expect(await result.body.text()).toBe("200");
     });
 
     it("returns undefined if body is not present with json", async () => {
-      let body;
+      let _body: string | undefined;
       app.use(
         "/",
         eventHandler(async (request) => {
-          body = await readBody(request);
+          _body = await readBody(request);
           return "200";
         }),
       );
-      const result = await request
-        .post("/api/test")
-        .set("Content-Type", "application/json");
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        headers: {
+          "Content-Type": "application/json",
+        },
+      });
 
-      expect(body).toBeUndefined();
-      expect(result.text).toBe("200");
+      expect(_body).toBeUndefined();
+      expect(await result.body.text()).toBe("200");
     });
 
     it("returns the string if content type is text/*", async () => {
-      let body;
+      let _body: string | undefined;
       app.use(
         "/",
         eventHandler(async (request) => {
-          body = await readBody(request);
+          _body = await readBody(request);
           return "200";
         }),
       );
-      const result = await request
-        .post("/api/test")
-        .set("Content-Type", "text/*")
-        .send('{ "hello": true }');
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        headers: {
+          "Content-Type": "text/*",
+        },
+        body: '{ "hello": true }',
+      });
 
-      expect(body).toBe('{ "hello": true }');
-      expect(result.text).toBe("200");
+      expect(_body).toBe('{ "hello": true }');
+      expect(await result.body.text()).toBe("200");
     });
 
     it("returns string as is if cannot parse with unknown content type", async () => {
@@ -327,13 +412,17 @@ describe("", () => {
           return _body;
         }),
       );
-      const result = await request
-        .post("/api/test")
-        .set("Content-Type", "application/foobar")
-        .send("{ test: 123 }");
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        headers: {
+          "Content-Type": "application/foobar",
+        },
+        body: "{ test: 123 }",
+      });
 
       expect(result.statusCode).toBe(200);
-      expect(result.text).toBe("{ test: 123 }");
+      expect(await result.body.text()).toBe("{ test: 123 }");
     });
 
     it("fails if json is invalid", async () => {
@@ -344,14 +433,19 @@ describe("", () => {
           return _body;
         }),
       );
-      const result = await request
-        .post("/api/test")
-        .set("Content-Type", "application/json")
-        .send('{ "hello": true');
+      const result = await client.request({
+        path: "/api/test",
+        method: "POST",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        body: '{ "hello": true',
+      });
+      const resultJson = (await result.body.json()) as any;
 
       expect(result.statusCode).toBe(400);
-      expect(result.body.statusMessage).toBe("Bad Request");
-      expect(result.body.stack[0]).toBe("Error: Invalid JSON body");
+      expect(resultJson.statusMessage).toBe("Bad Request");
+      expect(resultJson.stack[0]).toBe("Error: Invalid JSON body");
     });
   });
 });
diff --git a/test/proxy.test.ts b/test/proxy.test.ts
index 82c1c39..fa11e46 100644
--- a/test/proxy.test.ts
+++ b/test/proxy.test.ts
@@ -1,7 +1,7 @@
 import { Server } from "node:http";
 import { readFile } from "node:fs/promises";
 import supertest, { SuperTest, Test } from "supertest";
-import { describe, it, expect, beforeEach, afterEach } from "vitest";
+import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
 import { fetch } from "node-fetch-native";
 import {
   createApp,
@@ -16,7 +16,9 @@ import {
 } from "../src";
 import { sendProxy, proxyRequest } from "../src/utils/proxy";
 
-describe("", () => {
+const spy = vi.spyOn(console, "error");
+
+describe("proxy", () => {
   let app: App;
   let request: SuperTest<Test>;
 
@@ -33,6 +35,9 @@ describe("", () => {
       },
       toNodeListener(app),
     );
+    server.on("error", (error) => {
+      console.log("[server error]", error);
+    });
     await new Promise((resolve) => {
       server.listen(0, () => resolve(undefined));
     });
@@ -242,6 +247,29 @@ describe("", () => {
 
       expect(resText).toEqual(message);
     });
+
+    it(
+      "can handle failed proxy requests gracefully",
+      async () => {
+        spy.mockReset();
+        app.use(
+          "/",
+          eventHandler((event) => {
+            return proxyRequest(
+              event,
+              "https://this-url-does-not-exist.absudiasdjadioasjdoiasd.test",
+            );
+          }),
+        );
+
+        await fetch(`${url}/`, {
+          method: "GET",
+        });
+
+        expect(spy).not.toHaveBeenCalled();
+      },
+      60 * 1000,
+    );
   });
 
   describe("multipleCookies", () => {
diff --git a/test/status.test.ts b/test/status.test.ts
index ca29feb..ea1f02d 100644
--- a/test/status.test.ts
+++ b/test/status.test.ts
@@ -39,7 +39,7 @@ describe("setResponseStatus", () => {
         headers: [["content-type", "text/html"]],
       });
     });
-    it("override status and statusText with setResponeStatus method", async () => {
+    it("override status and statusText with setResponseStatus method", async () => {
       app.use(
         "/test",
         eventHandler((event) => {
@@ -86,7 +86,7 @@ describe("setResponseStatus", () => {
         headers: [],
       });
     });
-    it("override status and statusText with setResponeStatus method", async () => {
+    it("override status and statusText with setResponseStatus method", async () => {
       app.use(
         "/test",
         eventHandler((event) => {
diff --git a/test/utils.test.ts b/test/utils.test.ts
index c55e6a1..0c1b072 100644
--- a/test/utils.test.ts
+++ b/test/utils.test.ts
@@ -238,10 +238,10 @@ describe("", () => {
       { path: "//foo", url: "http://127.0.0.1/foo" },
       { path: "//foo.com//bar", url: "http://127.0.0.1/foo.com//bar" },
       { path: "///foo", url: "http://127.0.0.1/foo" },
-      { path: "\\foo", url: "http://127.0.0.1/foo" },
-      { path: "\\\\foo", url: "http://127.0.0.1/foo" },
-      { path: "\\/foo", url: "http://127.0.0.1/foo" },
-      { path: "/\\foo", url: "http://127.0.0.1/foo" },
+      { path: String.raw`\foo`, url: "http://127.0.0.1/foo" },
+      { path: String.raw`\\foo`, url: "http://127.0.0.1/foo" },
+      { path: String.raw`\/foo`, url: "http://127.0.0.1/foo" },
+      { path: String.raw`/\foo`, url: "http://127.0.0.1/foo" },
       { path: "/test", host: "example.com", url: "http://example.com/test" },
       {
         path: "/test",