Repository: nuxt/image
Pull request #787 (2023-03-29 16:29:13)

feat: add `directus` provider
Lately I started experimenting with [Directus Headless CMS](https://directus.io) and to my surprise it has a nice implementation and usage of [sharp](https://sharp.pixelplumbing.com/).

So I decided to add it as a provider for ease of use.

codesandbox[bot]: <img alt="CodeSandbox logo" src="https://raw.githubusercontent.com/codesandbox/open-in-codesandbox/main/assets/csb.light.svg#gh-dark-mode-only" /><img alt="CodeSandbox logo" src="https://raw.githubusercontent.com/codesandbox/open-in-codesandbox/main/assets/csb.svg#gh-light-mode-only" />&nbsp; Open in CodeSandbox <a href="https://codesandbox.io/p/github/Sandros94/image/main?workspace=%7B%22gitSidebarPanel%22:%22PR%22,%22sidebarPanel%22:%22GIT%22%7D">Web Editor</a> | <a href="https://codesandbox.io/p/vscode?owner=Sandros94&repo=image&branch=main">VS Code</a> | <a href="https://codesandbox.io/p/vscode?owner=Sandros94&repo=image&branch=main&insiders=true">VS Code Insiders</a>

<!-- open-in-codesandbox:complete -->

nuxt-studio[bot]: 
### <span aria-hidden="true">✅</span> Live Preview ready!

| Name | Edit | Preview | Latest Commit |
| :--- | :----- | :------ | :------ |
| **Image** | [Edit on Studio ↗︎](https://nuxt.studio/@nuxt/image/studio/content?refId=%23787) | [View Live Preview](https://v1.image.nuxtjs.org?preview=a4ea070f429839894d7f15b40772c869) | b5edae4cb4755e66c2ecdfd7d9fb9bb23aa6da16 |

<!-- This comment is generated by [Nuxt Studio](https://nuxt.studio) -->
<!-- Do not remove or edit this comment. -->

Sandros94: > ### ✅ Live Preview ready!
> Name	Edit	Preview	Latest Commit
> **Image**	[Edit on Studio ↗︎](https://nuxt.studio/@nuxt/image/studio/content?refId=%23787)	[View Live Preview](https://v1.image.nuxtjs.org?preview=a4ea070f429839894d7f15b40772c869)	[b5edae4](https://github.com/nuxt/image/commit/b5edae4cb4755e66c2ecdfd7d9fb9bb23aa6da16)

I really can't wait to test nuxt.studio 🥲
genu: LGTM
danielroe: Would you be able to merge the latest main and add snapshots/expected values for directus? 🙏
Sandros94: >Would you be able to merge the latest main and add snapshots/expected values for directus?

I've yet never used/created vitest, but there is always a first time right?
I've looked into the commit you did about the tests. Since fully testing directus provider should need a custom test like strapi (with a full directus+db deploy), I should go for the expected values right?

I should add the entry inside the `e2e/__snapshots__/*ssr.test.ts.snap`, add to `provider-coverage.test.ts`:
```ts
const missingProviderTests = [
  'directus', // covered in a unique test
  'strapi', // covered in a unique test
  'layer0' // backwards-compatible alias for edgio
]
```
and what else?
danielroe: You could add entries for directus in this file:

https://github.com/nuxt/image/blob/28f550d750261c08587d9557a8528661654fb2da/test/providers.ts#L2-L23

Only use the approach I adopted for `strapi` if these entries really don't make sense (strapi doesn't really support most of the options that we were testing there).

If you think it needs _more_ testing, then you can also add additional tests in the `providers.test.ts` file.
Sandros94: > Only use the approach I adopted for `strapi` if these entries really don't make sense (strapi doesn't really support most of the options that we were testing there).

Directus does support all the listed ones inside `providers.ts`.
But before I add it there, I would like to ask if the `test.png` is needed or not, because Directus uses the file-id from the db to reference to the asset storage, [the actual name of the file isn't needed and its mainly for download and SEO](https://docs.directus.io/reference/files.html#accessing-a-file).

> The location of your actual file originals is based on the project's configuration, but you can consistently access them via the API using the following URL.
> ```
> example.com/assets/<file-id>
> example.com/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4
> ```
> SEO - You can provide an optional filename after the UUID to optimize for SEO, for example:
> ```
> example.com/assets/<file-id>/<filename>
> example.com/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4/directus-logo.png
> ```
> This optional filename is also used in the Content-Disposition header when the ?download query parameter is used.

Any options and transformations are added as query parameters to the url.
danielroe: `test.png` is just meant to be an example file name. It doesn't need to show up in the generated URL if that's not how directus works 👍 
Sandros94: Ok, so the last commit should do it
Sandros94: I wanted to test things one last time in the playground, but I cannot make it to work anymore (last time was when I created the PR).

I do have corepack enabled and I'm following the readme, I see that a node process start to work but the nuxt server never actaully starts 🫤

It hangs here:
![image](https://github.com/nuxt/image/assets/13056429/bc42b726-e5fe-447d-a570-901c55123f19)

danielroe: Would you run pnpm i to ensure you're running the latest dependencies?
Sandros94: >Would you run pnpm i to ensure you're running the latest dependencies?

Pulled latest commits, `pnpm i` and now is working.

I started a Directus test via docker and the requests are perfectly fulfilled.
IMO we are ready to go

Patch:
diff --git a/docs/content/5.configuration.md b/docs/content/5.configuration.md
index ce5f3e6..da8d2bf 100644
--- a/docs/content/5.configuration.md
+++ b/docs/content/5.configuration.md
@@ -19,6 +19,18 @@ export default defineNuxtConfig({
 })
 ```
 
+## `inject`
+
+By default Nuxt Image v1 adopts a composable approach. If you do not use the components no additional code will be added to your bundle. But if you wish to globally initialize an `$img` helper that will be available throughout your application, you can do so.
+
+```ts [nuxt.config.ts]
+export default defineNuxtConfig({
+  image: {
+    inject: true
+  }
+})
+```
+
 ## `screens`
 
 List of predefined screen sizes.
@@ -164,11 +176,11 @@ export default defineNuxtConfig({
 
 ## `dir`
 
-Default: `static`
+Default: `public`
 
 This option allows you to specify the location of the source images when using the `static` or `ipx` provider.
 
-For example you might want the source images in `assets/images` directory rather than the default `static` directory so the source images don't get copied into `dist` and deployed:
+For example you might want the source images in `assets/images` directory rather than the default `public` directory so the source images don't get copied into `dist` and deployed:
 
 ```ts [nuxt.config.ts]
 export default defineNuxtConfig({
diff --git a/docs/content/5.providers/directus.md b/docs/content/5.providers/directus.md
new file mode 100644
index 0000000..0bca697
--- /dev/null
+++ b/docs/content/5.providers/directus.md
@@ -0,0 +1,62 @@
+# Directus
+
+Nuxt Image with Directus integration
+
+Integration between [Directus](https://directus.io/) and the image module.
+
+To use this provider you just need to specify the base URL of your project.
+
+```ts [nuxt.config.ts]
+export default defineNuxtConfig({
+  image: {
+    directus: {
+      // This URL needs to include the final `assets/` directory
+      baseURL: 'http://localhost:8055/assets/',
+    }
+  }
+})
+```
+
+You can easily override default options:
+
+```ts [nuxt.config.ts]
+export default defineNuxtConfig({
+  image: {
+    directus: {
+      baseURL: 'http://mydirectus-domain.com/assets/',
+      modifiers: {
+        withoutEnlargement: 'true',
+        transforms: [['blur', 4], ['negate']]
+      }
+    }
+  }
+})
+```
+
+## Modifiers
+All the default modifiers from [Directus documentation](https://docs.directus.io/reference/files.html#requesting-a-thumbnail) are available.
+
+```vue
+<nuxt-img
+  provider="directus"
+  src="ad514db1-eb90-4523-8183-46781437e7ee"
+  height="512"
+  fit="inside"
+  quality="20"
+  :modifiers="{ withoutEnlargement: 'true' }"
+/>
+```
+
+Since Directus exposes [the full sharp API](https://sharp.pixelplumbing.com/api-operation) through the `transforms` parameter, we can use it inside our `modifiers` prop:
+
+```vue
+<nuxt-img
+  provider="directus"
+  src="ad514db1-eb90-4523-8183-46781437e7ee"
+  :modifiers="{ height: '512', withoutEnlargement: 'true', transforms: [['blur', 4], ['negate']] }"
+/>
+```
+
+::alert{type="info"}
+Note that the `transforms` parameter, as stated in the [Directus documentation](https://docs.directus.io/reference/files.html#advanced-transformations), is basically a list of lists. This is to facilitate the use of those sharp functions, like [`normalise`](https://sharp.pixelplumbing.com/api-operation#normalise), that would need multiple values in input: `transforms: [['normalise', 1, 99], ['blur', 4], ['negate']]`.
+::
diff --git a/docs/package.json b/docs/package.json
index 81d9bb4..1143eeb 100755
--- a/docs/package.json
+++ b/docs/package.json
@@ -6,8 +6,8 @@
     "generate": "nuxi generate"
   },
   "devDependencies": {
-    "@nuxt-themes/docus": "^1.12.0",
+    "@nuxt-themes/docus": "^1.12.1",
     "@nuxtjs/plausible": "latest",
-    "nuxt": "^3.5.2"
+    "nuxt": "^3.5.3"
   }
 }
diff --git a/index.d.ts b/index.d.ts
deleted file mode 100644
index 2838a30..0000000
--- a/index.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { $Img } from './src/types'
-
-declare global {
-    // Convenience declaration to avoid importing types into runtime templates
-    const $Img: $Img
-}
diff --git a/package.json b/package.json
index e797f4c..c93d400 100755
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
   "repository": "nuxt/image",
   "license": "MIT",
   "sideEffects": false,
-  "main": "./dist/module.cjs",
+  "main": "./dist/module.mjs",
   "types": "./dist/module.d.ts",
   "files": [
     "dist"
@@ -25,40 +25,41 @@
     "test:types": "vue-tsc --noEmit && nuxi typecheck playground && nuxi typecheck example"
   },
   "dependencies": {
-    "@nuxt/kit": "^3.5.2",
+    "@nuxt/kit": "^3.5.3",
     "consola": "^3.1.0",
     "defu": "^6.1.2",
     "h3": "^1.6.6",
     "image-meta": "^0.1.1",
     "node-fetch-native": "^1.1.1",
     "ohash": "^1.1.2",
-    "pathe": "^1.1.0",
+    "pathe": "^1.1.1",
+    "std-env": "^3.3.3",
     "ufo": "^1.1.2"
   },
   "devDependencies": {
     "@nuxt/image-edge": "link:.",
     "@nuxt/module-builder": "0.4.0",
-    "@nuxt/test-utils": "^3.5.2",
+    "@nuxt/test-utils": "^3.5.3",
     "@nuxtjs/eslint-config-typescript": "^12.0.0",
     "@types/node": "^18.16.16",
-    "@vitest/coverage-c8": "^0.31.1",
+    "@vitest/coverage-c8": "^0.31.4",
     "@vue/test-utils": "^2.3.2",
-    "eslint": "8.41.0",
+    "eslint": "8.42.0",
     "globby": "^13.1.4",
     "ipx": "1.1.0",
     "jiti": "1.18.2",
-    "nuxt": "^3.5.2",
-    "nuxt-vitest": "^0.8.0",
+    "nuxt": "^3.5.3",
+    "nuxt-vitest": "^0.8.5",
     "playwright": "^1.34.3",
     "standard-version": "latest",
-    "typescript": "5.0.4",
-    "vitest": "^0.31.1",
+    "typescript": "5.1.3",
+    "vitest": "^0.31.4",
     "vue-tsc": "^1.6.5"
   },
   "optionalDependencies": {
     "ipx": "^1.1.0"
   },
-  "packageManager": "pnpm@8.6.0",
+  "packageManager": "pnpm@8.6.1",
   "resolutions": {
     "@nuxt/image-edge": "link:.",
     "@nuxt/image": "link:."
diff --git a/playground/layouts/default.vue b/playground/layouts/default.vue
index a96b439..0053bc9 100644
--- a/playground/layouts/default.vue
+++ b/playground/layouts/default.vue
@@ -11,6 +11,9 @@
         <NuxtLink to="/picture">
           NuxtPicture
         </NuxtLink>
+        <NuxtLink to="/events">
+          Events
+        </NuxtLink>
       </li>
       <li>
         <ProviderSelector />
diff --git a/playground/nuxt.config.ts b/playground/nuxt.config.ts
index 18f69a6..062009a 100644
--- a/playground/nuxt.config.ts
+++ b/playground/nuxt.config.ts
@@ -1,10 +1,9 @@
 import { defineNuxtConfig } from 'nuxt/config'
 
 export default defineNuxtConfig({
-  modules: [
-    '../src/module'
-  ],
+  modules: ['@nuxt/image-edge'],
   image: {
+    inject: true,
     domains: [
       'https://nuxtjs.org',
       'https://images.unsplash.com',
@@ -13,6 +12,7 @@ export default defineNuxtConfig({
     screens: {
       750: 750
     },
+    none: {},
     alias: {
       unsplash: 'https://images.unsplash.com', // ipx
       blog: '/remote/nuxt-org/blog' // cloudinary
@@ -34,6 +34,9 @@ export default defineNuxtConfig({
       token: 'demo',
       baseURL: 'sample.li'
     },
+    directus: {
+      baseURL: 'http://localhost:8055/assets/'
+    },
     fastly: {
       baseURL: 'https://www.fastly.io'
     },
diff --git a/playground/pages/events.vue b/playground/pages/events.vue
new file mode 100644
index 0000000..a0ff523
--- /dev/null
+++ b/playground/pages/events.vue
@@ -0,0 +1,45 @@
+<template>
+  <div>
+    <h1>Original</h1>
+    <nuxt-img
+      src="/images/colors.jpg"
+      width="500"
+      height="500"
+      @load="() => { console.log('Image was loaded') }"
+    />
+    <nuxt-picture
+      src="/images/colors.jpg"
+      width="500"
+      height="500"
+      @load="() => { console.log('Image was loaded') }"
+    />
+
+    <h1>Placeholder</h1>
+    <nuxt-img
+      :src="src"
+      placeholder
+      width="500"
+      height="500"
+      @load="() => { console.log('Image was loaded') }"
+    />
+    <nuxt-picture
+      :src="src"
+      placeholder
+      width="500"
+      height="500"
+      @load="() => { console.log('Image was loaded') }"
+    />
+
+    <h1>404</h1>
+    <nuxt-img
+      :src="'nonexistent' + src"
+      width="500"
+      height="500"
+      @error="() => { console.log('Error loading image') }"
+    />
+  </div>
+</template>
+
+<script setup lang="ts">
+const src = 'https://images.unsplash.com/photo-1497215728101-856f4ea42174?ixlib=rb-1.2.1&ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1740&q=80'
+</script>
diff --git a/playground/plugins/injection.ts b/playground/plugins/injection.ts
new file mode 100644
index 0000000..34f4c59
--- /dev/null
+++ b/playground/plugins/injection.ts
@@ -0,0 +1,9 @@
+export default defineNuxtPlugin(() => {
+  const nuxtApp = useNuxtApp()
+  // eslint-disable-next-line @typescript-eslint/no-unused-vars
+  function typeTesting () {
+    nuxtApp.$img.getImage('https://example.com/image.jpg')
+    // @ts-expect-error unknown property on nuxt app
+    nuxtApp.$imga.getImage('https://example.com/image.jpg')
+  }
+})
diff --git a/playground/providers.ts b/playground/providers.ts
index dbe5bd8..888bd2b 100644
--- a/playground/providers.ts
+++ b/playground/providers.ts
@@ -11,6 +11,40 @@ export interface Provider {
 }
 
 export const providers: Provider[] = [
+  // null provider (for non-node environments)
+  {
+    name: 'none',
+    samples: [
+      {
+        src: '/images/colors.jpg',
+        from: 'Jeremy Thomas',
+        width: 300,
+        height: 300,
+        link: 'https://unsplash.com/@jeremythomasphoto?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText'
+      },
+      {
+        src: '/images/everest.jpg',
+        from: 'Mount Everest Wikipedia page (alias)',
+        width: 300,
+        height: 300,
+        link: 'https://en.wikipedia.org/wiki/Mount_Everest'
+      },
+      {
+        src: '/images/tacos.svg',
+        from: 'Illustration from Icons8',
+        width: 300,
+        height: 300,
+        link: 'https://icons8.com/illustrations/illustration/abstract-1419'
+      },
+      {
+        src: '/unsplash/photo-1606112219348-204d7d8b94ee',
+        from: 'Photo by Omid Armin',
+        width: 300,
+        height: 300,
+        link: 'https://unsplash.com/@omidarmin?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText'
+      }
+    ]
+  },
   // IPX
   {
     name: 'ipx',
@@ -694,5 +728,36 @@ export const providers: Provider[] = [
         quality: 75
       }
     ]
+  },
+  // Directus
+  {
+    name: 'directus',
+    samples: [
+      {
+        src: 'ad514db1-eb90-4523-8183-46781437e7ee',
+        alt: 'Image 1'
+      },
+      {
+        src: 'ad514db1-eb90-4523-8183-46781437e7ee.jpg',
+        alt: '1024px width',
+        width: 1024,
+        height: 256,
+        fit: 'cover',
+        modifiers: { withoutEnlargement: 'true' }
+      },
+      {
+        src: 'ad514db1-eb90-4523-8183-46781437e7ee',
+        alt: '256px width, webp',
+        width: 256,
+        format: 'webp'
+      },
+      {
+        src: 'ad514db1-eb90-4523-8183-46781437e7ee',
+        alt: '256px width, webp',
+        width: 256,
+        format: 'webp',
+        modifiers: { withoutEnlargement: 'true', transforms: [['blur', 4], ['negate']] }
+      }
+    ]
   }
 ]
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 31e66a6..dc9608d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -13,8 +13,8 @@ importers:
   .:
     dependencies:
       '@nuxt/kit':
-        specifier: ^3.5.2
-        version: 3.5.2(rollup@3.23.0)
+        specifier: ^3.5.3
+        version: 3.5.3(rollup@3.23.0)
       consola:
         specifier: ^3.1.0
         version: 3.1.0
@@ -34,8 +34,11 @@ importers:
         specifier: ^1.1.2
         version: 1.1.2
       pathe:
-        specifier: ^1.1.0
-        version: 1.1.0
+        specifier: ^1.1.1
+        version: 1.1.1
+      std-env:
+        specifier: ^3.3.3
+        version: 3.3.3
       ufo:
         specifier: ^1.1.2
         version: 1.1.2
@@ -49,25 +52,25 @@ importers:
         version: 'link:'
       '@nuxt/module-builder':
         specifier: 0.4.0
-        version: 0.4.0(@nuxt/kit@3.5.2)(nuxi@3.5.2)
+        version: 0.4.0(@nuxt/kit@3.5.3)(nuxi@3.5.3)
       '@nuxt/test-utils':
-        specifier: ^3.5.2
-        version: 3.5.2(playwright@1.34.3)(rollup@3.23.0)(vitest@0.31.1)(vue@3.3.4)
+        specifier: ^3.5.3
+        version: 3.5.3(playwright@1.34.3)(rollup@3.23.0)(vitest@0.31.4)(vue@3.3.4)
       '@nuxtjs/eslint-config-typescript':
         specifier: ^12.0.0
-        version: 12.0.0(eslint@8.41.0)(typescript@5.0.4)
+        version: 12.0.0(eslint@8.42.0)(typescript@5.1.3)
       '@types/node':
         specifier: ^18.16.16
         version: 18.16.16
       '@vitest/coverage-c8':
-        specifier: ^0.31.1
-        version: 0.31.1(vitest@0.31.1)
+        specifier: ^0.31.4
+        version: 0.31.4(vitest@0.31.4)
       '@vue/test-utils':
         specifier: ^2.3.2
         version: 2.3.2(vue@3.3.4)
       eslint:
-        specifier: 8.41.0
-        version: 8.41.0
+        specifier: 8.42.0
+        version: 8.42.0
       globby:
         specifier: ^13.1.4
         version: 13.1.4
@@ -75,11 +78,11 @@ importers:
         specifier: 1.18.2
         version: 1.18.2
       nuxt:
-        specifier: ^3.5.2
-        version: 3.5.2(@types/node@18.16.16)(eslint@8.41.0)(rollup@3.23.0)(typescript@5.0.4)(vue-tsc@1.6.5)
+        specifier: ^3.5.3
+        version: 3.5.3(@types/node@18.16.16)(eslint@8.42.0)(rollup@3.23.0)(typescript@5.1.3)(vue-tsc@1.6.5)
       nuxt-vitest:
-        specifier: ^0.8.0
-        version: 0.8.0(@vitejs/plugin-vue-jsx@3.0.1)(@vitejs/plugin-vue@4.2.3)(rollup@3.23.0)(vite@4.3.9)(vitest@0.31.1)(vue-router@4.2.2)(vue@3.3.4)
+        specifier: ^0.8.5
+        version: 0.8.5(@vitejs/plugin-vue-jsx@3.0.1)(@vitejs/plugin-vue@4.2.3)(rollup@3.23.0)(vite@4.3.9)(vitest@0.31.4)(vue-router@4.2.2)(vue@3.3.4)
       playwright:
         specifier: ^1.34.3
         version: 1.34.3
@@ -87,26 +90,26 @@ importers:
         specifier: latest
         version: 9.5.0
       typescript:
-        specifier: 5.0.4
-        version: 5.0.4
+        specifier: 5.1.3
+        version: 5.1.3
       vitest:
-        specifier: ^0.31.1
-        version: 0.31.1(playwright@1.34.3)
+        specifier: ^0.31.4
+        version: 0.31.4(playwright@1.34.3)
       vue-tsc:
         specifier: ^1.6.5
-        version: 1.6.5(typescript@5.0.4)
+        version: 1.6.5(typescript@5.1.3)
 
   docs:
     devDependencies:
       '@nuxt-themes/docus':
-        specifier: ^1.12.0
-        version: 1.12.0(nuxt@3.5.2)(postcss@8.4.24)(rollup@3.23.0)(vue@3.3.4)
+        specifier: ^1.12.1
+        version: 1.12.1(nuxt@3.5.3)(postcss@8.4.24)(rollup@3.23.0)(vue@3.3.4)
       '@nuxtjs/plausible':
         specifier: latest
         version: 0.2.1(rollup@3.23.0)
       nuxt:
-        specifier: ^3.5.2
-        version: 3.5.2(@types/node@18.16.16)(eslint@8.41.0)(rollup@3.23.0)(typescript@5.0.4)(vue-tsc@1.6.5)
+        specifier: ^3.5.3
+        version: 3.5.3(@types/node@18.16.16)(eslint@8.42.0)(rollup@3.23.0)(typescript@5.1.3)(vue-tsc@1.6.5)
 
   example:
     devDependencies:
@@ -115,7 +118,7 @@ importers:
         version: link:..
       nuxt:
         specifier: latest
-        version: 3.5.2(@types/node@18.16.16)(eslint@8.41.0)(rollup@3.23.0)(typescript@5.0.4)(vue-tsc@1.6.5)
+        version: 3.5.3(@types/node@18.16.16)(eslint@8.42.0)(rollup@3.23.0)(typescript@5.1.3)(vue-tsc@1.6.5)
 
   playground:
     devDependencies:
@@ -124,7 +127,7 @@ importers:
         version: link:..
       nuxt:
         specifier: latest
-        version: 3.5.2(@types/node@18.16.16)(eslint@8.41.0)(rollup@3.23.0)(typescript@5.0.4)(vue-tsc@1.6.5)
+        version: 3.5.3(@types/node@18.16.16)(eslint@8.42.0)(rollup@3.23.0)(typescript@5.1.3)(vue-tsc@1.6.5)
 
 packages:
 
@@ -647,13 +650,13 @@ packages:
     dev: true
     optional: true
 
-  /@eslint-community/eslint-utils@4.3.0(eslint@8.41.0):
+  /@eslint-community/eslint-utils@4.3.0(eslint@8.42.0):
     resolution: {integrity: sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
     dependencies:
-      eslint: 8.41.0
+      eslint: 8.42.0
       eslint-visitor-keys: 3.4.1
     dev: true
 
@@ -679,13 +682,13 @@ packages:
       - supports-color
     dev: true
 
-  /@eslint/js@8.41.0:
-    resolution: {integrity: sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==}
+  /@eslint/js@8.42.0:
+    resolution: {integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
-  /@humanwhocodes/config-array@0.11.8:
-    resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
+  /@humanwhocodes/config-array@0.11.10:
+    resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==}
     engines: {node: '>=10.10.0'}
     dependencies:
       '@humanwhocodes/object-schema': 1.2.1
@@ -809,15 +812,15 @@ packages:
       '@nodelib/fs.scandir': 2.1.5
       fastq: 1.15.0
 
-  /@nuxt-themes/docus@1.12.0(nuxt@3.5.2)(postcss@8.4.24)(rollup@3.23.0)(vue@3.3.4):
-    resolution: {integrity: sha512-/YAlsKbyyjxIflFOIO3bKdM/QNsWLNRBXK11CTXod8zBlJe7lL/XqtNmbtqoNyQ+WumnkfVRA4UyKnu4W/Ya9w==}
+  /@nuxt-themes/docus@1.12.1(nuxt@3.5.3)(postcss@8.4.24)(rollup@3.23.0)(vue@3.3.4):
+    resolution: {integrity: sha512-exSHLVzhhIuT0FdJFLClXcPyKuvqHC6diAYS6OEtggu8TQzbj9Y9idewCtr/Rsv3UEYM4S6Xj5+dqi86WugHMg==}
     dependencies:
       '@nuxt-themes/elements': 0.9.4(postcss@8.4.24)(rollup@3.23.0)(vue@3.3.4)
       '@nuxt-themes/tokens': 1.9.1(postcss@8.4.24)(rollup@3.23.0)(vue@3.3.4)
       '@nuxt-themes/typography': 0.11.0(postcss@8.4.24)(rollup@3.23.0)(vue@3.3.4)
       '@nuxt/content': 2.6.0(rollup@3.23.0)
       '@nuxthq/studio': 0.12.1(rollup@3.23.0)
-      '@vueuse/nuxt': 10.1.2(nuxt@3.5.2)(rollup@3.23.0)(vue@3.3.4)
+      '@vueuse/nuxt': 10.1.2(nuxt@3.5.3)(rollup@3.23.0)(vue@3.3.4)
     transitivePeerDependencies:
       - '@azure/app-configuration'
       - '@azure/cosmos'
@@ -898,7 +901,7 @@ packages:
       mdast-util-to-hast: 12.3.0
       mdurl: 1.0.1
       ohash: 1.1.2
-      pathe: 1.1.0
+      pathe: 1.1.1
       property-information: 6.2.0
       rehype-external-links: 2.1.0
       rehype-raw: 6.1.1
@@ -957,7 +960,7 @@ packages:
       knitwork: 1.0.0
       lodash.template: 4.5.0
       mlly: 1.3.0
-      pathe: 1.1.0
+      pathe: 1.1.1
       pkg-types: 1.0.3
       scule: 1.0.0
       semver: 7.5.1
@@ -969,11 +972,11 @@ packages:
       - supports-color
     dev: true
 
-  /@nuxt/kit@3.5.2(rollup@3.23.0):
-    resolution: {integrity: sha512-DwmJFJbzbg5T/Qcf5ruiHBfWuLIasTakIeifKS+pqS+VhZDoUW0O7jHm6jESQ5reAbde+L+IH6bXN/y07ivkRA==}
+  /@nuxt/kit@3.5.3(rollup@3.23.0):
+    resolution: {integrity: sha512-QzoOGqa1zjKQfg7Y50TrrFAL9DhtIpYYs10gihcM1ISPrn9ROht+VEjqsaMvT+L8JuQbNf8wDYl8qzsdWGU29Q==}
     engines: {node: ^14.18.0 || >=16.10.0}
     dependencies:
-      '@nuxt/schema': 3.5.2(rollup@3.23.0)
+      '@nuxt/schema': 3.5.3(rollup@3.23.0)
       c12: 1.4.1
       consola: 3.1.0
       defu: 6.1.2
@@ -982,9 +985,8 @@ packages:
       ignore: 5.2.4
       jiti: 1.18.2
       knitwork: 1.0.0
-      lodash.template: 4.5.0
       mlly: 1.3.0
-      pathe: 1.1.0
+      pathe: 1.1.1
       pkg-types: 1.0.3
       scule: 1.0.0
       semver: 7.5.1
@@ -995,19 +997,19 @@ packages:
       - rollup
       - supports-color
 
-  /@nuxt/module-builder@0.4.0(@nuxt/kit@3.5.2)(nuxi@3.5.2):
+  /@nuxt/module-builder@0.4.0(@nuxt/kit@3.5.3)(nuxi@3.5.3):
     resolution: {integrity: sha512-B+UAYgFV1Hkc2ZcD7GaiKZ3SNHhyxFlXzZoBWTc9ulE0Z/+rq6RTa9fNm13BZyGhVhDCl5FN/wF/yYa1O/D2iw==}
     hasBin: true
     peerDependencies:
       '@nuxt/kit': ^3.5.0
       nuxi: ^3.5.0
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       consola: 3.1.0
       mlly: 1.3.0
       mri: 1.2.0
-      nuxi: 3.5.2
-      pathe: 1.1.0
+      nuxi: 3.5.3
+      pathe: 1.1.1
       unbuild: 1.2.1
     transitivePeerDependencies:
       - sass
@@ -1023,7 +1025,7 @@ packages:
       defu: 6.1.2
       hookable: 5.5.3
       jiti: 1.18.2
-      pathe: 1.1.0
+      pathe: 1.1.1
       pkg-types: 1.0.3
       postcss-import-resolver: 2.0.0
       scule: 1.0.0
@@ -1036,13 +1038,13 @@ packages:
       - supports-color
     dev: true
 
-  /@nuxt/schema@3.5.2(rollup@3.23.0):
-    resolution: {integrity: sha512-7u7NZ1TgSdjdOkLaFhv8iP+Lr9whqemMuLDALpnR+HJGC/Mm8ep+yECgCwIT/h1bM/nogZyGWO0xjOIdtzqlUA==}
+  /@nuxt/schema@3.5.3(rollup@3.23.0):
+    resolution: {integrity: sha512-Tnon4mYfJZmsCtx4NZ9A+qjwo4DcZ6tERpEhYBY81PX7AiJ+hFPBFR1qR32Tff66/qJjZg5UXj6H9AdzwEYr2w==}
     engines: {node: ^14.18.0 || >=16.10.0}
     dependencies:
       defu: 6.1.2
       hookable: 5.5.3
-      pathe: 1.1.0
+      pathe: 1.1.1
       pkg-types: 1.0.3
       postcss-import-resolver: 2.0.0
       std-env: 3.3.3
@@ -1057,7 +1059,7 @@ packages:
     resolution: {integrity: sha512-Z2UmPkBy5WjxvHKuUcl1X6vKWnIyWSP+9UGde1F+MzzZxYgAQybFud1uL2B3KCowxZdoqT1hd2WklV7EtyCwrQ==}
     hasBin: true
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       chalk: 5.2.0
       ci-info: 3.8.0
       consola: 3.1.0
@@ -1082,13 +1084,13 @@ packages:
       - supports-color
     dev: true
 
-  /@nuxt/test-utils@3.5.2(playwright@1.34.3)(rollup@3.23.0)(vitest@0.31.1)(vue@3.3.4):
-    resolution: {integrity: sha512-b/5ZkN4Rymjt+VbKbxT0fdt9LlkEVArzy5uL7uGOLQ8LAh3tY9d23YRFgSDJSvKUkyzR2pXnIVP42auNdRiV4g==}
+  /@nuxt/test-utils@3.5.3(playwright@1.34.3)(rollup@3.23.0)(vitest@0.31.4)(vue@3.3.4):
+    resolution: {integrity: sha512-ujkOrn3Qvd+6TREsg4h6Vm1YbPgwl70qh9s6jQiEIGhaH9wqXUUgbHEdWelUMeRO+jbV1X4rtd7Sdww/rfR5lA==}
     engines: {node: ^14.18.0 || >=16.10.0}
     peerDependencies:
       '@jest/globals': ^29.5.0
       playwright: ^1.34.3
-      vitest: ^0.31.1
+      vitest: ^0.30.0 || ^0.31.0
       vue: ^3.3.4
     peerDependenciesMeta:
       '@jest/globals':
@@ -1098,17 +1100,17 @@ packages:
       vitest:
         optional: true
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
-      '@nuxt/schema': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
+      '@nuxt/schema': 3.5.3(rollup@3.23.0)
       consola: 3.1.0
       defu: 6.1.2
       execa: 7.1.1
       get-port-please: 3.0.1
       ofetch: 1.0.1
-      pathe: 1.1.0
+      pathe: 1.1.1
       playwright: 1.34.3
       ufo: 1.1.2
-      vitest: 0.31.1(playwright@1.34.3)
+      vitest: 0.31.4(playwright@1.34.3)
       vue: 3.3.4
     transitivePeerDependencies:
       - rollup
@@ -1119,13 +1121,13 @@ packages:
     resolution: {integrity: sha512-PjVETP7+iZXAs5Q8O4ivl4t6qjWZMZqwiTVogUXHoHGZZcw7GZW3u3tzfYfE1HbzyYJfr236IXqQ02MeR8Fz2w==}
     dev: true
 
-  /@nuxt/vite-builder@3.5.2(@types/node@18.16.16)(eslint@8.41.0)(rollup@3.23.0)(typescript@5.0.4)(vue-tsc@1.6.5)(vue@3.3.4):
-    resolution: {integrity: sha512-w7ajMtMGKq/PE+dAcfuHio3qgE9ow51LZtNLJlmao3PXHzcpFBJLuuhlOumfwDX1ubpwDhoR8YcOsGwY9JWHqQ==}
+  /@nuxt/vite-builder@3.5.3(@types/node@18.16.16)(eslint@8.42.0)(rollup@3.23.0)(typescript@5.1.3)(vue-tsc@1.6.5)(vue@3.3.4):
+    resolution: {integrity: sha512-7zEKpGh3iWGRDwbWUa8eRxdLMxZtPzetelmdmXPjtYKGwUebZOcBhpeJ+VgJKOIf4OEj9E7BZS+it/Ji9UG9qw==}
     engines: {node: ^14.18.0 || >=16.10.0}
     peerDependencies:
       vue: ^3.3.4
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       '@rollup/plugin-replace': 5.0.2(rollup@3.23.0)
       '@vitejs/plugin-vue': 4.2.3(vite@4.3.9)(vue@3.3.4)
       '@vitejs/plugin-vue-jsx': 3.0.1(vite@4.3.9)(vue@3.3.4)
@@ -1145,7 +1147,7 @@ packages:
       magic-string: 0.30.0
       mlly: 1.3.0
       ohash: 1.1.2
-      pathe: 1.1.0
+      pathe: 1.1.1
       perfect-debounce: 1.0.0
       pkg-types: 1.0.3
       postcss: 8.4.24
@@ -1157,8 +1159,8 @@ packages:
       ufo: 1.1.2
       unplugin: 1.3.1
       vite: 4.3.9(@types/node@18.16.16)
-      vite-node: 0.31.1(@types/node@18.16.16)
-      vite-plugin-checker: 0.6.0(eslint@8.41.0)(typescript@5.0.4)(vite@4.3.9)(vue-tsc@1.6.5)
+      vite-node: 0.31.4(@types/node@18.16.16)
+      vite-plugin-checker: 0.6.0(eslint@8.42.0)(typescript@5.1.3)(vite@4.3.9)(vue-tsc@1.6.5)
       vue: 3.3.4
       vue-bundle-renderer: 1.0.3
     transitivePeerDependencies:
@@ -1183,7 +1185,7 @@ packages:
   /@nuxthq/studio@0.12.1(rollup@3.23.0):
     resolution: {integrity: sha512-g9GV8JkQqqYLtP+gsNtPr4fh49jc3eIdAB2ZfiudZKkFdW0BxtT/xPx8RjNYQwyInKssDDB26zzYrRYH9hhHCQ==}
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       defu: 6.1.2
       nuxt-component-meta: 0.5.2(rollup@3.23.0)
       nuxt-config-schema: 0.4.6(rollup@3.23.0)
@@ -1199,45 +1201,45 @@ packages:
   /@nuxtjs/color-mode@3.2.0(rollup@3.23.0):
     resolution: {integrity: sha512-isDR01yfadopiHQ/VEVUpyNSPrk5PCjUHS4t1qYRZwuRGefU4s9Iaxf6H9nmr1QFzoMgTm+3T0r/54jLwtpZbA==}
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       lodash.template: 4.5.0
-      pathe: 1.1.0
+      pathe: 1.1.1
     transitivePeerDependencies:
       - rollup
       - supports-color
     dev: true
 
-  /@nuxtjs/eslint-config-typescript@12.0.0(eslint@8.41.0)(typescript@5.0.4):
+  /@nuxtjs/eslint-config-typescript@12.0.0(eslint@8.42.0)(typescript@5.1.3):
     resolution: {integrity: sha512-HJR0ho5MYuOCFjkL+eMX/VXbUwy36J12DUMVy+dj3Qz1GYHwX92Saxap3urFzr8oPkzzFiuOknDivfCeRBWakg==}
     peerDependencies:
       eslint: ^8.23.0
     dependencies:
-      '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.41.0)
-      '@typescript-eslint/eslint-plugin': 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.41.0)(typescript@5.0.4)
-      '@typescript-eslint/parser': 5.44.0(eslint@8.41.0)(typescript@5.0.4)
-      eslint: 8.41.0
-      eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.26.0)(eslint@8.41.0)
-      eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.41.0)
-      eslint-plugin-vue: 9.7.0(eslint@8.41.0)
+      '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.42.0)
+      '@typescript-eslint/eslint-plugin': 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.42.0)(typescript@5.1.3)
+      '@typescript-eslint/parser': 5.44.0(eslint@8.42.0)(typescript@5.1.3)
+      eslint: 8.42.0
+      eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.26.0)(eslint@8.42.0)
+      eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.42.0)
+      eslint-plugin-vue: 9.7.0(eslint@8.42.0)
     transitivePeerDependencies:
       - eslint-import-resolver-webpack
       - supports-color
       - typescript
     dev: true
 
-  /@nuxtjs/eslint-config@12.0.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.41.0):
+  /@nuxtjs/eslint-config@12.0.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.42.0):
     resolution: {integrity: sha512-ewenelo75x0eYEUK+9EBXjc/OopQCvdkmYmlZuoHq5kub/vtiRpyZ/autppwokpHUq8tiVyl2ejMakoiHiDTrg==}
     peerDependencies:
       eslint: ^8.23.0
     dependencies:
-      eslint: 8.41.0
-      eslint-config-standard: 17.0.0(eslint-plugin-import@2.26.0)(eslint-plugin-n@15.5.1)(eslint-plugin-promise@6.1.1)(eslint@8.41.0)
-      eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.41.0)
-      eslint-plugin-n: 15.5.1(eslint@8.41.0)
-      eslint-plugin-node: 11.1.0(eslint@8.41.0)
-      eslint-plugin-promise: 6.1.1(eslint@8.41.0)
-      eslint-plugin-unicorn: 44.0.2(eslint@8.41.0)
-      eslint-plugin-vue: 9.7.0(eslint@8.41.0)
+      eslint: 8.42.0
+      eslint-config-standard: 17.0.0(eslint-plugin-import@2.26.0)(eslint-plugin-n@15.5.1)(eslint-plugin-promise@6.1.1)(eslint@8.42.0)
+      eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.42.0)
+      eslint-plugin-n: 15.5.1(eslint@8.42.0)
+      eslint-plugin-node: 11.1.0(eslint@8.42.0)
+      eslint-plugin-promise: 6.1.1(eslint@8.42.0)
+      eslint-plugin-unicorn: 44.0.2(eslint@8.42.0)
+      eslint-plugin-vue: 9.7.0(eslint@8.42.0)
       local-pkg: 0.4.3
     transitivePeerDependencies:
       - '@typescript-eslint/parser'
@@ -1249,9 +1251,9 @@ packages:
   /@nuxtjs/plausible@0.2.1(rollup@3.23.0):
     resolution: {integrity: sha512-1AyV9woFeZKBhwYy05S7NBk4jeAXzWcF/SIK/S/GZ8C86G8x7f2hR2eJi9FRRQYGwHutBx2guU4tZAW4J71Azg==}
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       defu: 6.1.2
-      pathe: 1.1.0
+      pathe: 1.1.1
       plausible-tracker: 0.3.8
     transitivePeerDependencies:
       - rollup
@@ -1512,7 +1514,7 @@ packages:
     resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==}
     dev: true
 
-  /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.41.0)(typescript@5.0.4):
+  /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.42.0)(typescript@5.1.3):
     resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -1523,23 +1525,23 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/parser': 5.44.0(eslint@8.41.0)(typescript@5.0.4)
+      '@typescript-eslint/parser': 5.44.0(eslint@8.42.0)(typescript@5.1.3)
       '@typescript-eslint/scope-manager': 5.44.0
-      '@typescript-eslint/type-utils': 5.44.0(eslint@8.41.0)(typescript@5.0.4)
-      '@typescript-eslint/utils': 5.44.0(eslint@8.41.0)(typescript@5.0.4)
+      '@typescript-eslint/type-utils': 5.44.0(eslint@8.42.0)(typescript@5.1.3)
+      '@typescript-eslint/utils': 5.44.0(eslint@8.42.0)(typescript@5.1.3)
       debug: 4.3.4
-      eslint: 8.41.0
+      eslint: 8.42.0
       ignore: 5.2.4
       natural-compare-lite: 1.4.0
       regexpp: 3.2.0
       semver: 7.5.1
-      tsutils: 3.21.0(typescript@5.0.4)
-      typescript: 5.0.4
+      tsutils: 3.21.0(typescript@5.1.3)
+      typescript: 5.1.3
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/parser@5.44.0(eslint@8.41.0)(typescript@5.0.4):
+  /@typescript-eslint/parser@5.44.0(eslint@8.42.0)(typescript@5.1.3):
     resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -1551,10 +1553,10 @@ packages:
     dependencies:
       '@typescript-eslint/scope-manager': 5.44.0
       '@typescript-eslint/types': 5.44.0
-      '@typescript-eslint/typescript-estree': 5.44.0(typescript@5.0.4)
+      '@typescript-eslint/typescript-estree': 5.44.0(typescript@5.1.3)
       debug: 4.3.4
-      eslint: 8.41.0
-      typescript: 5.0.4
+      eslint: 8.42.0
+      typescript: 5.1.3
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -1567,7 +1569,7 @@ packages:
       '@typescript-eslint/visitor-keys': 5.44.0
     dev: true
 
-  /@typescript-eslint/type-utils@5.44.0(eslint@8.41.0)(typescript@5.0.4):
+  /@typescript-eslint/type-utils@5.44.0(eslint@8.42.0)(typescript@5.1.3):
     resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -1577,12 +1579,12 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/typescript-estree': 5.44.0(typescript@5.0.4)
-      '@typescript-eslint/utils': 5.44.0(eslint@8.41.0)(typescript@5.0.4)
+      '@typescript-eslint/typescript-estree': 5.44.0(typescript@5.1.3)
+      '@typescript-eslint/utils': 5.44.0(eslint@8.42.0)(typescript@5.1.3)
       debug: 4.3.4
-      eslint: 8.41.0
-      tsutils: 3.21.0(typescript@5.0.4)
-      typescript: 5.0.4
+      eslint: 8.42.0
+      tsutils: 3.21.0(typescript@5.1.3)
+      typescript: 5.1.3
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -1592,7 +1594,7 @@ packages:
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
-  /@typescript-eslint/typescript-estree@5.44.0(typescript@5.0.4):
+  /@typescript-eslint/typescript-estree@5.44.0(typescript@5.1.3):
     resolution: {integrity: sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -1607,13 +1609,13 @@ packages:
       globby: 11.1.0
       is-glob: 4.0.3
       semver: 7.5.1
-      tsutils: 3.21.0(typescript@5.0.4)
-      typescript: 5.0.4
+      tsutils: 3.21.0(typescript@5.1.3)
+      typescript: 5.1.3
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/utils@5.44.0(eslint@8.41.0)(typescript@5.0.4):
+  /@typescript-eslint/utils@5.44.0(eslint@8.42.0)(typescript@5.1.3):
     resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -1623,10 +1625,10 @@ packages:
       '@types/semver': 7.3.13
       '@typescript-eslint/scope-manager': 5.44.0
       '@typescript-eslint/types': 5.44.0
-      '@typescript-eslint/typescript-estree': 5.44.0(typescript@5.0.4)
-      eslint: 8.41.0
+      '@typescript-eslint/typescript-estree': 5.44.0(typescript@5.1.3)
+      eslint: 8.42.0
       eslint-scope: 5.1.1
-      eslint-utils: 3.0.0(eslint@8.41.0)
+      eslint-utils: 3.0.0(eslint@8.42.0)
       semver: 7.5.1
     transitivePeerDependencies:
       - supports-color
@@ -1732,8 +1734,8 @@ packages:
       vue: 3.3.4
     dev: true
 
-  /@vitest/coverage-c8@0.31.1(vitest@0.31.1):
-    resolution: {integrity: sha512-6TkjQpmgYez7e3dbAUoYdRXxWN81BojCmUILJwgCy39uZFG33DsQ0rSRSZC9beAEdCZTpxR63nOvd9hxDQcJ0g==}
+  /@vitest/coverage-c8@0.31.4(vitest@0.31.4):
+    resolution: {integrity: sha512-VPx368m4DTcpA/P0v3YdVxl4QOSh1DbUcXURLRvDShrIB5KxOgfzw4Bn2R8AhAe/GyiWW/FIsJ/OJdYXCCiC1w==}
     peerDependencies:
       vitest: '>=0.30.0 <1'
     dependencies:
@@ -1742,36 +1744,36 @@ packages:
       magic-string: 0.30.0
       picocolors: 1.0.0
       std-env: 3.3.3
-      vitest: 0.31.1(playwright@1.34.3)
+      vitest: 0.31.4(playwright@1.34.3)
     dev: true
 
-  /@vitest/expect@0.31.1:
-    resolution: {integrity: sha512-BV1LyNvhnX+eNYzJxlHIGPWZpwJFZaCcOIzp2CNG0P+bbetenTupk6EO0LANm4QFt0TTit+yqx7Rxd1qxi/SQA==}
+  /@vitest/expect@0.31.4:
+    resolution: {integrity: sha512-tibyx8o7GUyGHZGyPgzwiaPaLDQ9MMuCOrc03BYT0nryUuhLbL7NV2r/q98iv5STlwMgaKuFJkgBW/8iPKwlSg==}
     dependencies:
-      '@vitest/spy': 0.31.1
-      '@vitest/utils': 0.31.1
+      '@vitest/spy': 0.31.4
+      '@vitest/utils': 0.31.4
       chai: 4.3.7
     dev: true
 
-  /@vitest/runner@0.31.1:
-    resolution: {integrity: sha512-imWuc82ngOtxdCUpXwtEzZIuc1KMr+VlQ3Ondph45VhWoQWit5yvG/fFcldbnCi8DUuFi+NmNx5ehMUw/cGLUw==}
+  /@vitest/runner@0.31.4:
+    resolution: {integrity: sha512-Wgm6UER+gwq6zkyrm5/wbpXGF+g+UBB78asJlFkIOwyse0pz8lZoiC6SW5i4gPnls/zUcPLWS7Zog0LVepXnpg==}
     dependencies:
-      '@vitest/utils': 0.31.1
+      '@vitest/utils': 0.31.4
       concordance: 5.0.4
       p-limit: 4.0.0
-      pathe: 1.1.0
+      pathe: 1.1.1
     dev: true
 
-  /@vitest/snapshot@0.31.1:
-    resolution: {integrity: sha512-L3w5uU9bMe6asrNzJ8WZzN+jUTX4KSgCinEJPXyny0o90fG4FPQMV0OWsq7vrCWfQlAilMjDnOF9nP8lidsJ+g==}
+  /@vitest/snapshot@0.31.4:
+    resolution: {integrity: sha512-LemvNumL3NdWSmfVAMpXILGyaXPkZbG5tyl6+RQSdcHnTj6hvA49UAI8jzez9oQyE/FWLKRSNqTGzsHuk89LRA==}
     dependencies:
       magic-string: 0.30.0
-      pathe: 1.1.0
+      pathe: 1.1.1
       pretty-format: 27.5.1
     dev: true
 
-  /@vitest/spy@0.31.1:
-    resolution: {integrity: sha512-1cTpt2m9mdo3hRLDyCG2hDQvRrePTDgEJBFQQNz1ydHHZy03EiA6EpFxY+7ODaY7vMRCie+WlFZBZ0/dQWyssQ==}
+  /@vitest/spy@0.31.4:
+    resolution: {integrity: sha512-3ei5ZH1s3aqbEyftPAzSuunGICRuhE+IXOmpURFdkm5ybUADk+viyQfejNk6q8M5QGX8/EVKw+QWMEP3DTJDag==}
     dependencies:
       tinyspy: 2.1.0
     dev: true
@@ -1783,7 +1785,7 @@ packages:
       fast-glob: 3.2.12
       fflate: 0.7.4
       flatted: 3.2.7
-      pathe: 1.1.0
+      pathe: 1.1.1
       picocolors: 1.0.0
       sirv: 2.0.3
     dev: true
@@ -1796,8 +1798,8 @@ packages:
       pretty-format: 27.5.1
     dev: true
 
-  /@vitest/utils@0.31.1:
-    resolution: {integrity: sha512-yFyRD5ilwojsZfo3E0BnH72pSVSuLg2356cN1tCEe/0RtDzxTPYwOomIC+eQbot7m6DRy4tPZw+09mB7NkbMmA==}
+  /@vitest/utils@0.31.4:
+    resolution: {integrity: sha512-DobZbHacWznoGUfYU8XDPY78UubJxXfMNY1+SUdOp1NsI34eopSA6aZMeaGu10waSOeYwE8lxrd/pLfT0RMxjQ==}
     dependencies:
       concordance: 5.0.4
       loupe: 2.3.6
@@ -1816,13 +1818,13 @@ packages:
       muggle-string: 0.2.2
     dev: true
 
-  /@volar/typescript@1.4.1-patch.2(typescript@5.0.4):
+  /@volar/typescript@1.4.1-patch.2(typescript@5.1.3):
     resolution: {integrity: sha512-lPFYaGt8OdMEzNGJJChF40uYqMO4Z/7Q9fHPQC/NRVtht43KotSXLrkPandVVMf9aPbiJ059eAT+fwHGX16k4w==}
     peerDependencies:
       typescript: '*'
     dependencies:
       '@volar/language-core': 1.4.1
-      typescript: 5.0.4
+      typescript: 5.1.3
     dev: true
 
   /@volar/vue-language-core@1.6.5:
@@ -1839,14 +1841,14 @@ packages:
       vue-template-compiler: 2.7.14
     dev: true
 
-  /@volar/vue-typescript@1.6.5(typescript@5.0.4):
+  /@volar/vue-typescript@1.6.5(typescript@5.1.3):
     resolution: {integrity: sha512-er9rVClS4PHztMUmtPMDTl+7c7JyrxweKSAEe/o/Noeq2bQx6v3/jZHVHBe8ZNUti5ubJL/+Tg8L3bzmlalV8A==}
     peerDependencies:
       typescript: '*'
     dependencies:
-      '@volar/typescript': 1.4.1-patch.2(typescript@5.0.4)
+      '@volar/typescript': 1.4.1-patch.2(typescript@5.1.3)
       '@volar/vue-language-core': 1.6.5
-      typescript: 5.0.4
+      typescript: 5.1.3
     dev: true
 
   /@vue-macros/common@1.3.1(rollup@3.23.0)(vue@3.3.4):
@@ -2020,16 +2022,16 @@ packages:
     resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
     dev: true
 
-  /@vueuse/nuxt@10.1.2(nuxt@3.5.2)(rollup@3.23.0)(vue@3.3.4):
+  /@vueuse/nuxt@10.1.2(nuxt@3.5.3)(rollup@3.23.0)(vue@3.3.4):
     resolution: {integrity: sha512-X9o5WCmNs1+6XztP1Uh9+H7/jGeIjwSRNQdwCWRKCDkxPlbgi9iLnDRYnKDY++JPY3nbB6jTDOVgZDrpaAU5kg==}
     peerDependencies:
       nuxt: ^3.0.0
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       '@vueuse/core': 10.1.2(vue@3.3.4)
       '@vueuse/metadata': 10.1.2
       local-pkg: 0.4.3
-      nuxt: 3.5.2(@types/node@18.16.16)(eslint@8.41.0)(rollup@3.23.0)(typescript@5.0.4)(vue-tsc@1.6.5)
+      nuxt: 3.5.3(@types/node@18.16.16)(eslint@8.42.0)(rollup@3.23.0)(typescript@5.1.3)(vue-tsc@1.6.5)
       vue-demi: 0.14.5(vue@3.3.4)
     transitivePeerDependencies:
       - '@vue/composition-api'
@@ -2428,7 +2430,7 @@ packages:
       jiti: 1.18.2
       mlly: 1.3.0
       ohash: 1.1.2
-      pathe: 1.1.0
+      pathe: 1.1.1
       perfect-debounce: 0.1.3
       pkg-types: 1.0.3
       rc9: 2.1.0
@@ -3628,7 +3630,7 @@ packages:
     resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
     engines: {node: '>=12'}
 
-  /eslint-config-standard@17.0.0(eslint-plugin-import@2.26.0)(eslint-plugin-n@15.5.1)(eslint-plugin-promise@6.1.1)(eslint@8.41.0):
+  /eslint-config-standard@17.0.0(eslint-plugin-import@2.26.0)(eslint-plugin-n@15.5.1)(eslint-plugin-promise@6.1.1)(eslint@8.42.0):
     resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==}
     peerDependencies:
       eslint: ^8.0.1
@@ -3636,10 +3638,10 @@ packages:
       eslint-plugin-n: ^15.0.0
       eslint-plugin-promise: ^6.0.0
     dependencies:
-      eslint: 8.41.0
-      eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.41.0)
-      eslint-plugin-n: 15.5.1(eslint@8.41.0)
-      eslint-plugin-promise: 6.1.1(eslint@8.41.0)
+      eslint: 8.42.0
+      eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.42.0)
+      eslint-plugin-n: 15.5.1(eslint@8.42.0)
+      eslint-plugin-promise: 6.1.1(eslint@8.42.0)
     dev: true
 
   /eslint-import-resolver-node@0.3.6:
@@ -3651,7 +3653,7 @@ packages:
       - supports-color
     dev: true
 
-  /eslint-import-resolver-typescript@3.5.2(eslint-plugin-import@2.26.0)(eslint@8.41.0):
+  /eslint-import-resolver-typescript@3.5.2(eslint-plugin-import@2.26.0)(eslint@8.42.0):
     resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
@@ -3660,8 +3662,8 @@ packages:
     dependencies:
       debug: 4.3.4
       enhanced-resolve: 5.14.1
-      eslint: 8.41.0
-      eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.41.0)
+      eslint: 8.42.0
+      eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.42.0)
       get-tsconfig: 4.2.0
       globby: 13.1.4
       is-core-module: 2.12.1
@@ -3671,7 +3673,7 @@ packages:
       - supports-color
     dev: true
 
-  /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@3.5.2)(eslint@8.41.0):
+  /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@3.5.2)(eslint@8.42.0):
     resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
     engines: {node: '>=4'}
     peerDependencies:
@@ -3692,38 +3694,38 @@ packages:
       eslint-import-resolver-webpack:
         optional: true
     dependencies:
-      '@typescript-eslint/parser': 5.44.0(eslint@8.41.0)(typescript@5.0.4)
+      '@typescript-eslint/parser': 5.44.0(eslint@8.42.0)(typescript@5.1.3)
       debug: 3.2.7
-      eslint: 8.41.0
+      eslint: 8.42.0
       eslint-import-resolver-node: 0.3.6
-      eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.26.0)(eslint@8.41.0)
+      eslint-import-resolver-typescript: 3.5.2(eslint-plugin-import@2.26.0)(eslint@8.42.0)
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /eslint-plugin-es@3.0.1(eslint@8.41.0):
+  /eslint-plugin-es@3.0.1(eslint@8.42.0):
     resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==}
     engines: {node: '>=8.10.0'}
     peerDependencies:
       eslint: '>=4.19.1'
     dependencies:
-      eslint: 8.41.0
+      eslint: 8.42.0
       eslint-utils: 2.1.0
       regexpp: 3.2.0
     dev: true
 
-  /eslint-plugin-es@4.1.0(eslint@8.41.0):
+  /eslint-plugin-es@4.1.0(eslint@8.42.0):
     resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==}
     engines: {node: '>=8.10.0'}
     peerDependencies:
       eslint: '>=4.19.1'
     dependencies:
-      eslint: 8.41.0
+      eslint: 8.42.0
       eslint-utils: 2.1.0
       regexpp: 3.2.0
     dev: true
 
-  /eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.41.0):
+  /eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.2)(eslint@8.42.0):
     resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==}
     engines: {node: '>=4'}
     peerDependencies:
@@ -3733,14 +3735,14 @@ packages:
       '@typescript-eslint/parser':
         optional: true
     dependencies:
-      '@typescript-eslint/parser': 5.44.0(eslint@8.41.0)(typescript@5.0.4)
+      '@typescript-eslint/parser': 5.44.0(eslint@8.42.0)(typescript@5.1.3)
       array-includes: 3.1.6
       array.prototype.flat: 1.3.1
       debug: 2.6.9
       doctrine: 2.1.0
-      eslint: 8.41.0
+      eslint: 8.42.0
       eslint-import-resolver-node: 0.3.6
-      eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@3.5.2)(eslint@8.41.0)
+      eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@3.5.2)(eslint@8.42.0)
       has: 1.0.3
       is-core-module: 2.12.1
       is-glob: 4.0.3
@@ -3754,16 +3756,16 @@ packages:
       - supports-color
     dev: true
 
-  /eslint-plugin-n@15.5.1(eslint@8.41.0):
+  /eslint-plugin-n@15.5.1(eslint@8.42.0):
     resolution: {integrity: sha512-kAd+xhZm7brHoFLzKLB7/FGRFJNg/srmv67mqb7tto22rpr4wv/LV6RuXzAfv3jbab7+k1wi42PsIhGviywaaw==}
     engines: {node: '>=12.22.0'}
     peerDependencies:
       eslint: '>=7.0.0'
     dependencies:
       builtins: 5.0.1
-      eslint: 8.41.0
-      eslint-plugin-es: 4.1.0(eslint@8.41.0)
-      eslint-utils: 3.0.0(eslint@8.41.0)
+      eslint: 8.42.0
+      eslint-plugin-es: 4.1.0(eslint@8.42.0)
+      eslint-utils: 3.0.0(eslint@8.42.0)
       ignore: 5.2.4
       is-core-module: 2.12.1
       minimatch: 3.1.2
@@ -3771,14 +3773,14 @@ packages:
       semver: 7.5.1
     dev: true
 
-  /eslint-plugin-node@11.1.0(eslint@8.41.0):
+  /eslint-plugin-node@11.1.0(eslint@8.42.0):
     resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==}
     engines: {node: '>=8.10.0'}
     peerDependencies:
       eslint: '>=5.16.0'
     dependencies:
-      eslint: 8.41.0
-      eslint-plugin-es: 3.0.1(eslint@8.41.0)
+      eslint: 8.42.0
+      eslint-plugin-es: 3.0.1(eslint@8.42.0)
       eslint-utils: 2.1.0
       ignore: 5.2.4
       minimatch: 3.1.2
@@ -3786,16 +3788,16 @@ packages:
       semver: 6.3.0
     dev: true
 
-  /eslint-plugin-promise@6.1.1(eslint@8.41.0):
+  /eslint-plugin-promise@6.1.1(eslint@8.42.0):
     resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^7.0.0 || ^8.0.0
     dependencies:
-      eslint: 8.41.0
+      eslint: 8.42.0
     dev: true
 
-  /eslint-plugin-unicorn@44.0.2(eslint@8.41.0):
+  /eslint-plugin-unicorn@44.0.2(eslint@8.42.0):
     resolution: {integrity: sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==}
     engines: {node: '>=14.18'}
     peerDependencies:
@@ -3804,8 +3806,8 @@ packages:
       '@babel/helper-validator-identifier': 7.19.1
       ci-info: 3.8.0
       clean-regexp: 1.0.0
-      eslint: 8.41.0
-      eslint-utils: 3.0.0(eslint@8.41.0)
+      eslint: 8.42.0
+      eslint-utils: 3.0.0(eslint@8.42.0)
       esquery: 1.5.0
       indent-string: 4.0.0
       is-builtin-module: 3.2.1
@@ -3818,19 +3820,19 @@ packages:
       strip-indent: 3.0.0
     dev: true
 
-  /eslint-plugin-vue@9.7.0(eslint@8.41.0):
+  /eslint-plugin-vue@9.7.0(eslint@8.42.0):
     resolution: {integrity: sha512-DrOO3WZCZEwcLsnd3ohFwqCoipGRSTKTBTnLwdhqAbYZtzWl0o7D+D8ZhlmiZvABKTEl8AFsqH1GHGdybyoQmw==}
     engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
     dependencies:
-      eslint: 8.41.0
-      eslint-utils: 3.0.0(eslint@8.41.0)
+      eslint: 8.42.0
+      eslint-utils: 3.0.0(eslint@8.42.0)
       natural-compare: 1.4.0
       nth-check: 2.1.1
       postcss-selector-parser: 6.0.13
       semver: 7.5.1
-      vue-eslint-parser: 9.1.0(eslint@8.41.0)
+      vue-eslint-parser: 9.1.0(eslint@8.42.0)
       xml-name-validator: 4.0.0
     transitivePeerDependencies:
       - supports-color
@@ -3859,13 +3861,13 @@ packages:
       eslint-visitor-keys: 1.3.0
     dev: true
 
-  /eslint-utils@3.0.0(eslint@8.41.0):
+  /eslint-utils@3.0.0(eslint@8.42.0):
     resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
     engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
     peerDependencies:
       eslint: '>=5'
     dependencies:
-      eslint: 8.41.0
+      eslint: 8.42.0
       eslint-visitor-keys: 2.1.0
     dev: true
 
@@ -3884,16 +3886,16 @@ packages:
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
-  /eslint@8.41.0:
-    resolution: {integrity: sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==}
+  /eslint@8.42.0:
+    resolution: {integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     hasBin: true
     dependencies:
-      '@eslint-community/eslint-utils': 4.3.0(eslint@8.41.0)
+      '@eslint-community/eslint-utils': 4.3.0(eslint@8.42.0)
       '@eslint-community/regexpp': 4.4.0
       '@eslint/eslintrc': 2.0.3
-      '@eslint/js': 8.41.0
-      '@humanwhocodes/config-array': 0.11.8
+      '@eslint/js': 8.42.0
+      '@humanwhocodes/config-array': 0.11.10
       '@humanwhocodes/module-importer': 1.0.1
       '@nodelib/fs.walk': 1.2.8
       ajv: 6.12.6
@@ -4045,7 +4047,7 @@ packages:
     dependencies:
       enhanced-resolve: 5.14.1
       mlly: 1.3.0
-      pathe: 1.1.0
+      pathe: 1.1.1
       ufo: 1.1.2
     dev: true
 
@@ -4342,7 +4344,7 @@ packages:
       https-proxy-agent: 5.0.1
       mri: 1.2.0
       node-fetch-native: 1.1.1
-      pathe: 1.1.0
+      pathe: 1.1.1
       tar: 6.1.15
     transitivePeerDependencies:
       - supports-color
@@ -4876,7 +4878,7 @@ packages:
       image-meta: 0.1.1
       listhen: 1.0.4
       node-fetch-native: 1.1.1
-      pathe: 1.1.0
+      pathe: 1.1.1
       sharp: 0.32.1
       ufo: 1.1.2
       xss: 1.0.14
@@ -5372,6 +5374,7 @@ packages:
 
   /lodash._reinterpolate@3.0.0:
     resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==}
+    dev: true
 
   /lodash.debounce@4.0.8:
     resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
@@ -5418,11 +5421,13 @@ packages:
     dependencies:
       lodash._reinterpolate: 3.0.0
       lodash.templatesettings: 4.2.0
+    dev: true
 
   /lodash.templatesettings@4.2.0:
     resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==}
     dependencies:
       lodash._reinterpolate: 3.0.0
+    dev: true
 
   /lodash.union@4.6.0:
     resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==}
@@ -6070,7 +6075,7 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
-  /mkdist@1.2.0(typescript@5.0.4):
+  /mkdist@1.2.0(typescript@5.1.3):
     resolution: {integrity: sha512-UTqu/bXmIk/+VKNVgufAeMyjUcNy1dn9Bl7wL1zZlCKVrpDgj/VllmZBeh3ZCC/2HWqUrt6frNFTKt9TRZbNvQ==}
     hasBin: true
     peerDependencies:
@@ -6089,15 +6094,15 @@ packages:
       jiti: 1.18.2
       mlly: 1.3.0
       mri: 1.2.0
-      pathe: 1.1.0
-      typescript: 5.0.4
+      pathe: 1.1.1
+      typescript: 5.1.3
     dev: true
 
   /mlly@1.3.0:
     resolution: {integrity: sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==}
     dependencies:
       acorn: 8.8.2
-      pathe: 1.1.0
+      pathe: 1.1.1
       pkg-types: 1.0.3
       ufo: 1.1.2
 
@@ -6213,7 +6218,7 @@ packages:
       ofetch: 1.0.1
       ohash: 1.1.2
       openapi-typescript: 6.2.5
-      pathe: 1.1.0
+      pathe: 1.1.1
       perfect-debounce: 1.0.0
       pkg-types: 1.0.3
       pretty-bytes: 6.1.0
@@ -6384,8 +6389,8 @@ packages:
       boolbase: 1.0.0
     dev: true
 
-  /nuxi@3.5.2:
-    resolution: {integrity: sha512-6zkgQpMbv74vITFiu9TGe8UXsBOCxEy3Nw1/wYjRBH0p1gGLl0/rxubAeSpXw3NHQzRHTt75fYgWEGOfzPWOXQ==}
+  /nuxi@3.5.3:
+    resolution: {integrity: sha512-H0/Nj0ulUN8PrSvr6H433Awt4hNT5uaN57041QfknYVXlUce7yEbl/NcpNtnneAHYn2hMUZL9/nJCVkZ1xTvHA==}
     engines: {node: ^14.18.0 || >=16.10.0}
     hasBin: true
     optionalDependencies:
@@ -6395,10 +6400,10 @@ packages:
   /nuxt-component-meta@0.5.2(rollup@3.23.0):
     resolution: {integrity: sha512-tjX2JaSRUm9tlxHCZ6cRauJnRm1zPMrPaoHj0dKtwHHXjrcp1+Ou2aL2SjD22mnaZ5ZulcEbyvsqp/oMwVldVQ==}
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       scule: 1.0.0
-      typescript: 5.0.4
-      vue-component-meta: 1.6.5(typescript@5.0.4)
+      typescript: 5.1.3
+      vue-component-meta: 1.6.5(typescript@5.1.3)
     transitivePeerDependencies:
       - rollup
       - supports-color
@@ -6407,10 +6412,10 @@ packages:
   /nuxt-config-schema@0.4.6(rollup@3.23.0):
     resolution: {integrity: sha512-kHLWJFynj5QrxVZ1MjY2xmDaTSN1BCMLGExA+hMMLoCb3wn9TJlDVqnE/nSdUJPMRkNn/NQ5WP9NLA9vlAXRUw==}
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       defu: 6.1.2
       jiti: 1.18.2
-      pathe: 1.1.0
+      pathe: 1.1.1
       untyped: 1.3.2
     transitivePeerDependencies:
       - rollup
@@ -6421,7 +6426,7 @@ packages:
     resolution: {integrity: sha512-KdhJAigBGTP8/YIFZ3orwetk40AgLq6VQ5HRYuDLmv5hiDptor9Ro+WIdZggHw7nciRxZvDdQkEwi9B5G/jrkQ==}
     dependencies:
       '@iconify/vue': 4.1.1(vue@3.3.4)
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       nuxt-config-schema: 0.4.6(rollup@3.23.0)
     transitivePeerDependencies:
       - rollup
@@ -6429,15 +6434,15 @@ packages:
       - vue
     dev: true
 
-  /nuxt-vitest@0.8.0(@vitejs/plugin-vue-jsx@3.0.1)(@vitejs/plugin-vue@4.2.3)(rollup@3.23.0)(vite@4.3.9)(vitest@0.31.1)(vue-router@4.2.2)(vue@3.3.4):
-    resolution: {integrity: sha512-5EcYXaxJoEIx7f7kNytMDOm5LrRHGkm9elJ9haVdTOKRuZqD9J2qm8A/t75yHbMqz3UYV6TImGdGiyJjR7KdiQ==}
+  /nuxt-vitest@0.8.5(@vitejs/plugin-vue-jsx@3.0.1)(@vitejs/plugin-vue@4.2.3)(rollup@3.23.0)(vite@4.3.9)(vitest@0.31.4)(vue-router@4.2.2)(vue@3.3.4):
+    resolution: {integrity: sha512-+KrPvQEIxZydjGyb/CNMPTcHuNssUehQK8Ng7lvFigD6GcAW6u/5wB2He8QiZ45NEfj1w4pTPbYkvOjdjhU8kw==}
     peerDependencies:
       '@vitejs/plugin-vue': '*'
       '@vitejs/plugin-vue-jsx': '*'
       vite: '*'
       vitest: ^0.30.0
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       '@vitejs/plugin-vue': 4.2.3(vite@4.3.9)(vue@3.3.4)
       '@vitejs/plugin-vue-jsx': 3.0.1(vite@4.3.9)(vue@3.3.4)
       '@vitest/ui': 0.30.1
@@ -6446,8 +6451,8 @@ packages:
       perfect-debounce: 1.0.0
       std-env: 3.3.3
       vite: 4.3.9(@types/node@18.16.16)
-      vitest: 0.31.1(playwright@1.34.3)
-      vitest-environment-nuxt: 0.8.0(rollup@3.23.0)(vitest@0.31.1)(vue-router@4.2.2)(vue@3.3.4)
+      vitest: 0.31.4(playwright@1.34.3)
+      vitest-environment-nuxt: 0.8.5(rollup@3.23.0)(vitest@0.31.4)(vue-router@4.2.2)(vue@3.3.4)
     transitivePeerDependencies:
       - rollup
       - supports-color
@@ -6455,8 +6460,8 @@ packages:
       - vue-router
     dev: true
 
-  /nuxt@3.5.2(@types/node@18.16.16)(eslint@8.41.0)(rollup@3.23.0)(typescript@5.0.4)(vue-tsc@1.6.5):
-    resolution: {integrity: sha512-PVA+1d0UBujODogxhnfbolYFOawAf2paOVlARxJdm1npVQBPz9Ns8tKpWglbZhwRdXpj1jDE9Dl+Ke3pl59dZw==}
+  /nuxt@3.5.3(@types/node@18.16.16)(eslint@8.42.0)(rollup@3.23.0)(typescript@5.1.3)(vue-tsc@1.6.5):
+    resolution: {integrity: sha512-fG39BZ5N5ATtmx2vuxN8APQPSlSsCDpfkJ0k581gMc7eFztqrBzPncZX5w3RQLW7AiGBE2yYEfqiwC6AVODBBg==}
     engines: {node: ^14.18.0 || >=16.10.0}
     hasBin: true
     peerDependencies:
@@ -6467,11 +6472,11 @@ packages:
         optional: true
     dependencies:
       '@nuxt/devalue': 2.0.2
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
-      '@nuxt/schema': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
+      '@nuxt/schema': 3.5.3(rollup@3.23.0)
       '@nuxt/telemetry': 2.2.0(rollup@3.23.0)
       '@nuxt/ui-templates': 1.1.1
-      '@nuxt/vite-builder': 3.5.2(@types/node@18.16.16)(eslint@8.41.0)(rollup@3.23.0)(typescript@5.0.4)(vue-tsc@1.6.5)(vue@3.3.4)
+      '@nuxt/vite-builder': 3.5.3(@types/node@18.16.16)(eslint@8.42.0)(rollup@3.23.0)(typescript@5.1.3)(vue-tsc@1.6.5)(vue@3.3.4)
       '@types/node': 18.16.16
       '@unhead/ssr': 1.1.27
       '@unhead/vue': 1.1.27(vue@3.3.4)
@@ -6495,11 +6500,11 @@ packages:
       magic-string: 0.30.0
       mlly: 1.3.0
       nitropack: 2.4.1
-      nuxi: 3.5.2
+      nuxi: 3.5.3
       nypm: 0.2.0
       ofetch: 1.0.1
       ohash: 1.1.2
-      pathe: 1.1.0
+      pathe: 1.1.1
       perfect-debounce: 1.0.0
       prompts: 2.4.2
       scule: 1.0.0
@@ -6885,8 +6890,8 @@ packages:
     resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
     engines: {node: '>=8'}
 
-  /pathe@1.1.0:
-    resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==}
+  /pathe@1.1.1:
+    resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==}
 
   /pathval@1.1.1:
     resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
@@ -6930,7 +6935,7 @@ packages:
       nanoid: 4.0.2
       ohash: 1.1.2
       paneer: 0.1.0
-      pathe: 1.1.0
+      pathe: 1.1.1
       postcss-custom-properties: 13.1.4(postcss@8.4.24)
       postcss-dark-theme-class: 0.7.3(postcss@8.4.24)
       postcss-nested: 6.0.1(postcss@8.4.24)
@@ -6950,7 +6955,7 @@ packages:
     dependencies:
       jsonc-parser: 3.2.0
       mlly: 1.3.0
-      pathe: 1.1.0
+      pathe: 1.1.1
 
   /plausible-tracker@0.3.8:
     resolution: {integrity: sha512-lmOWYQ7s9KOUJ1R+YTOR3HrjdbxIS2Z4de0P/Jx2dQPteznJl2eX3tXxKClpvbfyGP59B5bbhW8ftN59HbbFSg==}
@@ -7760,7 +7765,7 @@ packages:
       glob: 7.2.3
     dev: true
 
-  /rollup-plugin-dts@5.3.0(rollup@3.23.0)(typescript@5.0.4):
+  /rollup-plugin-dts@5.3.0(rollup@3.23.0)(typescript@5.1.3):
     resolution: {integrity: sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==}
     engines: {node: '>=v14'}
     peerDependencies:
@@ -7769,7 +7774,7 @@ packages:
     dependencies:
       magic-string: 0.30.0
       rollup: 3.23.0
-      typescript: 5.0.4
+      typescript: 5.1.3
     optionalDependencies:
       '@babel/code-frame': 7.21.4
     dev: true
@@ -8523,14 +8528,14 @@ packages:
     resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==}
     dev: true
 
-  /tsutils@3.21.0(typescript@5.0.4):
+  /tsutils@3.21.0(typescript@5.1.3):
     resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
     engines: {node: '>= 6'}
     peerDependencies:
       typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
     dependencies:
       tslib: 1.14.1
-      typescript: 5.0.4
+      typescript: 5.1.3
     dev: true
 
   /tunnel-agent@0.6.0:
@@ -8595,9 +8600,9 @@ packages:
     resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==}
     dev: true
 
-  /typescript@5.0.4:
-    resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==}
-    engines: {node: '>=12.20'}
+  /typescript@5.1.3:
+    resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==}
+    engines: {node: '>=14.17'}
     hasBin: true
     dev: true
 
@@ -8643,16 +8648,16 @@ packages:
       hookable: 5.5.3
       jiti: 1.18.2
       magic-string: 0.30.0
-      mkdist: 1.2.0(typescript@5.0.4)
+      mkdist: 1.2.0(typescript@5.1.3)
       mlly: 1.3.0
       mri: 1.2.0
-      pathe: 1.1.0
+      pathe: 1.1.1
       pkg-types: 1.0.3
       pretty-bytes: 6.1.0
       rollup: 3.23.0
-      rollup-plugin-dts: 5.3.0(rollup@3.23.0)(typescript@5.0.4)
+      rollup-plugin-dts: 5.3.0(rollup@3.23.0)(typescript@5.1.3)
       scule: 1.0.0
-      typescript: 5.0.4
+      typescript: 5.1.3
       untyped: 1.3.2
     transitivePeerDependencies:
       - sass
@@ -8684,7 +8689,7 @@ packages:
       defu: 6.1.2
       mime: 3.0.0
       node-fetch-native: 1.1.1
-      pathe: 1.1.0
+      pathe: 1.1.1
     dev: true
 
   /unhead@1.1.27:
@@ -8717,7 +8722,7 @@ packages:
       local-pkg: 0.4.3
       magic-string: 0.30.0
       mlly: 1.3.0
-      pathe: 1.1.0
+      pathe: 1.1.1
       pkg-types: 1.0.3
       scule: 1.0.0
       strip-literal: 1.0.1
@@ -8790,7 +8795,7 @@ packages:
       json5: 2.2.3
       local-pkg: 0.4.3
       mlly: 1.3.0
-      pathe: 1.1.0
+      pathe: 1.1.1
       scule: 1.0.0
       unplugin: 1.3.1
       vue-router: 4.2.2(vue@3.3.4)
@@ -8960,15 +8965,15 @@ packages:
       vfile-message: 3.1.4
     dev: true
 
-  /vite-node@0.31.1(@types/node@18.16.16):
-    resolution: {integrity: sha512-BajE/IsNQ6JyizPzu9zRgHrBwczkAs0erQf/JRpgTIESpKvNj9/Gd0vxX905klLkb0I0SJVCKbdrl5c6FnqYKA==}
+  /vite-node@0.31.4(@types/node@18.16.16):
+    resolution: {integrity: sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ==}
     engines: {node: '>=v14.18.0'}
     hasBin: true
     dependencies:
       cac: 6.7.14
       debug: 4.3.4
       mlly: 1.3.0
-      pathe: 1.1.0
+      pathe: 1.1.1
       picocolors: 1.0.0
       vite: 4.3.9(@types/node@18.16.16)
     transitivePeerDependencies:
@@ -8981,7 +8986,7 @@ packages:
       - terser
     dev: true
 
-  /vite-plugin-checker@0.6.0(eslint@8.41.0)(typescript@5.0.4)(vite@4.3.9)(vue-tsc@1.6.5):
+  /vite-plugin-checker@0.6.0(eslint@8.42.0)(typescript@5.1.3)(vite@4.3.9)(vue-tsc@1.6.5):
     resolution: {integrity: sha512-DWZ9Hv2TkpjviPxAelNUt4Q3IhSGrx7xrwdM64NI+Q4dt8PaMWJJh4qGNtSrfEuiuIzWWo00Ksvh5It4Y3L9xQ==}
     engines: {node: '>=14.16'}
     peerDependencies:
@@ -9017,7 +9022,7 @@ packages:
       chalk: 4.1.2
       chokidar: 3.5.3
       commander: 8.3.0
-      eslint: 8.41.0
+      eslint: 8.42.0
       fast-glob: 3.2.12
       fs-extra: 11.1.1
       lodash.debounce: 4.0.8
@@ -9026,13 +9031,13 @@ packages:
       semver: 7.5.1
       strip-ansi: 6.0.1
       tiny-invariant: 1.3.1
-      typescript: 5.0.4
+      typescript: 5.1.3
       vite: 4.3.9(@types/node@18.16.16)
       vscode-languageclient: 7.0.0
       vscode-languageserver: 7.0.0
       vscode-languageserver-textdocument: 1.0.7
       vscode-uri: 3.0.6
-      vue-tsc: 1.6.5(typescript@5.0.4)
+      vue-tsc: 1.6.5(typescript@5.1.3)
     dev: true
 
   /vite@4.3.9(@types/node@18.16.16):
@@ -9068,14 +9073,14 @@ packages:
       fsevents: 2.3.2
     dev: true
 
-  /vitest-environment-nuxt@0.8.0(rollup@3.23.0)(vitest@0.31.1)(vue-router@4.2.2)(vue@3.3.4):
-    resolution: {integrity: sha512-+fNO+K+iYiw7v9hsIr4ybusIvszQ379say6nFYEC8nkMjlYPP+471q0BTIEIMddD/BvyBFLip6uuA9OkZvzYPA==}
+  /vitest-environment-nuxt@0.8.5(rollup@3.23.0)(vitest@0.31.4)(vue-router@4.2.2)(vue@3.3.4):
+    resolution: {integrity: sha512-uOtgoqUmO4MBzWe51vPLAieMjH5Ua2QGCziwStFYZQJBAQwX8zn/F/cNvc6590CLxlD4SHWY9WKIz8ehOI+A1w==}
     peerDependencies:
       vitest: ^0.24.5 || ^0.26.0 || ^0.27.0 || ^0.28.0 || ^0.29.0 || ^0.30.0
       vue: ^3.2.45
       vue-router: ^4.0.0
     dependencies:
-      '@nuxt/kit': 3.5.2(rollup@3.23.0)
+      '@nuxt/kit': 3.5.3(rollup@3.23.0)
       '@vue/test-utils': 2.3.2(vue@3.3.4)
       defu: 6.1.2
       estree-walker: 3.0.3
@@ -9084,7 +9089,7 @@ packages:
       magic-string: 0.30.0
       ofetch: 1.0.1
       unenv: 1.5.1
-      vitest: 0.31.1(playwright@1.34.3)
+      vitest: 0.31.4(playwright@1.34.3)
       vue: 3.3.4
       vue-router: 4.2.2(vue@3.3.4)
     transitivePeerDependencies:
@@ -9092,8 +9097,8 @@ packages:
       - supports-color
     dev: true
 
-  /vitest@0.31.1(playwright@1.34.3):
-    resolution: {integrity: sha512-/dOoOgzoFk/5pTvg1E65WVaobknWREN15+HF+0ucudo3dDG/vCZoXTQrjIfEaWvQXmqScwkRodrTbM/ScMpRcQ==}
+  /vitest@0.31.4(playwright@1.34.3):
+    resolution: {integrity: sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ==}
     engines: {node: '>=v14.18.0'}
     hasBin: true
     peerDependencies:
@@ -9126,11 +9131,11 @@ packages:
       '@types/chai': 4.3.5
       '@types/chai-subset': 1.3.3
       '@types/node': 18.16.16
-      '@vitest/expect': 0.31.1
-      '@vitest/runner': 0.31.1
-      '@vitest/snapshot': 0.31.1
-      '@vitest/spy': 0.31.1
-      '@vitest/utils': 0.31.1
+      '@vitest/expect': 0.31.4
+      '@vitest/runner': 0.31.4
+      '@vitest/snapshot': 0.31.4
+      '@vitest/spy': 0.31.4
+      '@vitest/utils': 0.31.4
       acorn: 8.8.2
       acorn-walk: 8.2.0
       cac: 6.7.14
@@ -9139,7 +9144,7 @@ packages:
       debug: 4.3.4
       local-pkg: 0.4.3
       magic-string: 0.30.0
-      pathe: 1.1.0
+      pathe: 1.1.1
       picocolors: 1.0.0
       playwright: 1.34.3
       std-env: 3.3.3
@@ -9147,7 +9152,7 @@ packages:
       tinybench: 2.5.0
       tinypool: 0.5.0
       vite: 4.3.9(@types/node@18.16.16)
-      vite-node: 0.31.1(@types/node@18.16.16)
+      vite-node: 0.31.4(@types/node@18.16.16)
       why-is-node-running: 2.2.2
     transitivePeerDependencies:
       - less
@@ -9204,7 +9209,7 @@ packages:
       ufo: 1.1.2
     dev: true
 
-  /vue-component-meta@1.6.5(typescript@5.0.4):
+  /vue-component-meta@1.6.5(typescript@5.1.3):
     resolution: {integrity: sha512-pps5DTFz9JiqidXMrPCf/Qt8sngQYzkU73CB4zLh5dsPlAMSm742+/zOR4MgKxuaZSPAwDFazSRhRCkpkywmCw==}
     peerDependencies:
       typescript: '*'
@@ -9212,7 +9217,7 @@ packages:
       '@volar/language-core': 1.4.1
       '@volar/vue-language-core': 1.6.5
       typesafe-path: 0.2.2
-      typescript: 5.0.4
+      typescript: 5.1.3
       vue-component-type-helpers: 1.6.5
     dev: true
 
@@ -9239,14 +9244,14 @@ packages:
     resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==}
     dev: true
 
-  /vue-eslint-parser@9.1.0(eslint@8.41.0):
+  /vue-eslint-parser@9.1.0(eslint@8.42.0):
     resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==}
     engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: '>=6.0.0'
     dependencies:
       debug: 4.3.4
-      eslint: 8.41.0
+      eslint: 8.42.0
       eslint-scope: 7.2.0
       eslint-visitor-keys: 3.4.1
       espree: 9.5.2
@@ -9273,16 +9278,16 @@ packages:
       he: 1.2.0
     dev: true
 
-  /vue-tsc@1.6.5(typescript@5.0.4):
+  /vue-tsc@1.6.5(typescript@5.1.3):
     resolution: {integrity: sha512-Wtw3J7CC+JM2OR56huRd5iKlvFWpvDiU+fO1+rqyu4V2nMTotShz4zbOZpW5g9fUOcjnyZYfBo5q5q+D/q27JA==}
     hasBin: true
     peerDependencies:
       typescript: '*'
     dependencies:
       '@volar/vue-language-core': 1.6.5
-      '@volar/vue-typescript': 1.6.5(typescript@5.0.4)
+      '@volar/vue-typescript': 1.6.5(typescript@5.1.3)
       semver: 7.5.1
-      typescript: 5.0.4
+      typescript: 5.1.3
     dev: true
 
   /vue@3.3.4:
diff --git a/src/ipx.ts b/src/ipx.ts
index 0112698..4b774f9 100644
--- a/src/ipx.ts
+++ b/src/ipx.ts
@@ -1,10 +1,12 @@
 import { relative, resolve } from 'pathe'
 import { eventHandler } from 'h3'
-import { useNuxt, createResolver } from '@nuxt/kit'
+import { useNuxt, createResolver, useNitro } from '@nuxt/kit'
+import type { NitroEventHandler, NitroDevEventHandler } from 'nitropack'
 
 import type { ProviderSetup, ImageProviders } from './types'
 
 export const ipxSetup: ProviderSetup = async (providerOptions, moduleOptions) => {
+  const nitro = useNitro()
   const nuxt = useNuxt()
 
   // Add IPX middleware unless nuxtrc or user added a custom middleware
@@ -28,20 +30,22 @@ export const ipxSetup: ProviderSetup = async (providerOptions, moduleOptions) =>
   if (!nuxt.options.dev) {
     // TODO: Avoid adding for non-Node.js environments with a warning
     const resolver = createResolver(import.meta.url)
-    nuxt.hook('nitro:init', (nitro) => {
-      // Use absolute path for prerenderer
-      // TODO: Workaround for prerender support
-      // https://github.com/nuxt/image/pull/784
-      nitro.options._config.runtimeConfig = nitro.options._config.runtimeConfig || {}
-      nitro.options._config.runtimeConfig.ipx = { ...ipxOptions }
-      // Use relative path for built app
-      ipxOptions.dir = relative(nitro.options.output.serverDir, nitro.options.output.publicDir)
-      nitro.options.runtimeConfig.ipx = ipxOptions
-    })
-    nuxt.options.serverHandlers.push({
+    // Use absolute path for prerenderer
+    // TODO: Workaround for prerender support
+    // https://github.com/nuxt/image/pull/784
+    nitro.options._config.runtimeConfig = nitro.options._config.runtimeConfig || {}
+    nitro.options._config.runtimeConfig.ipx = { ...ipxOptions }
+    // Use relative path for built app
+    ipxOptions.dir = relative(nitro.options.output.serverDir, nitro.options.output.publicDir)
+    nitro.options.runtimeConfig.ipx = ipxOptions
+
+    const handler: NitroEventHandler = {
       route: '/_ipx/**',
       handler: resolver.resolve('./runtime/ipx')
-    })
+    }
+    nitro.options.handlers.push(handler)
+    // TODO: Workaround for prerender support
+    nitro.options._config.handlers!.push(handler)
     return
   }
 
@@ -54,10 +58,13 @@ export const ipxSetup: ProviderSetup = async (providerOptions, moduleOptions) =>
     })
   const ipx = createIPX(ipxOptions)
   const middleware = createIPXMiddleware(ipx)
-  nuxt.options.devServerHandlers.push({
+  const devHandler: NitroDevEventHandler = {
     route: '/_ipx',
     handler: eventHandler(async (event) => {
       await middleware(event.node.req, event.node.res)
     })
-  })
+  }
+  nitro.options.devHandlers.push(devHandler)
+  // TODO: Workaround for prerender support
+  nitro.options._config.devHandlers!.push(devHandler)
 }
diff --git a/src/module.ts b/src/module.ts
index 3fec814..ba2fd69 100644
--- a/src/module.ts
+++ b/src/module.ts
@@ -1,17 +1,19 @@
 import { parseURL, withLeadingSlash } from 'ufo'
 import { defineNuxtModule, addTemplate, addImports, createResolver, addComponent, addPlugin } from '@nuxt/kit'
-import { resolveProviders, detectProvider } from './provider'
+import { resolve } from 'pathe'
+import { resolveProviders, detectProvider, resolveProvider } from './provider'
 import type { ImageProviders, ImageOptions, InputProvider, CreateImageOptions } from './types'
 
 export interface ModuleOptions extends ImageProviders {
-  staticFilename: string,
+  inject: boolean
+  staticFilename: string
   provider: CreateImageOptions['provider']
   presets: { [name: string]: ImageOptions }
   dir: string
   domains: string[]
   sharp: any
   alias: Record<string, string>
-  screens: CreateImageOptions['screens'],
+  screens: CreateImageOptions['screens']
   internalUrl: string
   providers: { [name: string]: InputProvider | any } & ImageProviders
   [key: string]: any
@@ -20,10 +22,11 @@ export interface ModuleOptions extends ImageProviders {
 export * from './types'
 
 export default defineNuxtModule<ModuleOptions>({
-  defaults: {
+  defaults: nuxt => ({
+    inject: false,
     staticFilename: '[publicPath]/image/[hash][ext]',
     provider: 'auto',
-    dir: '',
+    dir: nuxt.options.dir.public,
     presets: {},
     domains: [] as string[],
     sharp: {},
@@ -40,7 +43,7 @@ export default defineNuxtModule<ModuleOptions>({
     internalUrl: '',
     providers: {},
     alias: {}
-  },
+  }),
   meta: {
     name: '@nuxt/image',
     configKey: 'image',
@@ -51,6 +54,9 @@ export default defineNuxtModule<ModuleOptions>({
   async setup (options, nuxt) {
     const resolver = createResolver(import.meta.url)
 
+    // fully resolve directory
+    options.dir = resolve(nuxt.options.srcDir, options.dir)
+
     // Normalize domains to hostname
     options.domains = options.domains.map((d) => {
       if (!d.startsWith('http')) { d = 'http://' + d }
@@ -60,8 +66,10 @@ export default defineNuxtModule<ModuleOptions>({
     // Normalize alias to start with leading slash
     options.alias = Object.fromEntries(Object.entries(options.alias).map(e => [withLeadingSlash(e[0]), e[1]]))
 
-    options.provider = detectProvider(options.provider)
-    options[options.provider] = options[options.provider] || {}
+    options.provider = detectProvider(options.provider)!
+    if (options.provider) {
+      options[options.provider] = options[options.provider] || {}
+    }
 
     const imageOptions: Omit<CreateImageOptions, 'providers' | 'nuxt'> = pick(options, [
       'screens',
@@ -75,7 +83,7 @@ export default defineNuxtModule<ModuleOptions>({
 
     // Run setup
     for (const p of providers) {
-      if (typeof p.setup === 'function') {
+      if (typeof p.setup === 'function' && p.name !== 'ipx') {
         await p.setup(p, options, nuxt)
       }
     }
@@ -116,8 +124,30 @@ ${providers.map(p => `  ['${p.name}']: { provider: ${p.importName}, defaults: ${
       }
     })
 
-    // Add runtime plugin
-    addPlugin({ src: resolver.resolve('./runtime/plugin') })
+    nuxt.hook('nitro:init', async (nitro) => {
+      if (!options.provider || options.provider === 'ipx') {
+        imageOptions.provider = options.provider = nitro.options.node ? 'ipx' : 'none'
+        options[options.provider] = options[options.provider] || {}
+
+        if (options.provider === 'none') { return }
+
+        const p = await resolveProvider(nuxt, 'ipx', options.ipx as {})
+        if (!providers.some(p => p.name === 'ipx')) {
+          providers.push(p)
+        }
+        if (typeof p.setup === 'function') {
+          await p.setup(p, options, nuxt)
+        }
+      }
+    })
+
+    if (options.inject) {
+      // Add runtime plugin
+      addPlugin({ src: resolver.resolve('./runtime/plugin') })
+    } else if (nuxt.options.dev) {
+      // Add placeholder runtime plugin
+      addPlugin({ src: resolver.resolve('./runtime/plugin.placeholder') })
+    }
 
     // TODO: Transform asset urls that pass to `src` attribute on image components
   }
diff --git a/src/provider.ts b/src/provider.ts
index cfa655e..f868f77 100644
--- a/src/provider.ts
+++ b/src/provider.ts
@@ -4,6 +4,7 @@ import type { Nuxt } from '@nuxt/schema'
 import type { NitroConfig } from 'nitropack'
 import { createResolver, resolvePath } from '@nuxt/kit'
 import { hash } from 'ohash'
+import { provider } from 'std-env'
 import type { InputProvider, ImageModuleProvider, ProviderSetup } from './types'
 import type { ModuleOptions } from './module'
 import { ipxSetup } from './ipx'
@@ -14,6 +15,7 @@ const BuiltInProviders = [
   'cloudimage',
   'cloudinary',
   'contentful',
+  'directus',
   'edgio',
   'fastly',
   'glide',
@@ -24,6 +26,7 @@ const BuiltInProviders = [
   'ipx',
   'layer0',
   'netlify',
+  'none',
   'prismic',
   'sanity',
   'storyblok',
@@ -108,9 +111,7 @@ export function detectProvider (userInput?: string) {
     return userInput
   }
 
-  if (process.env.VERCEL || process.env.VERCEL_ENV || process.env.NOW_BUILDER) {
+  if (provider === 'vercel') {
     return 'vercel'
   }
-
-  return 'ipx'
 }
diff --git a/src/runtime/components/nuxt-img.ts b/src/runtime/components/nuxt-img.ts
index 5e8ccb3..c752b06 100644
--- a/src/runtime/components/nuxt-img.ts
+++ b/src/runtime/components/nuxt-img.ts
@@ -100,12 +100,17 @@ export default defineComponent({
         const img = new Image()
         img.src = mainSrc.value
         img.onload = (event) => {
-          imgEl.value!.src = mainSrc.value
+          if (imgEl.value) {
+            imgEl.value.src = mainSrc.value
+          }
           placeholderLoaded.value = true
           ctx.emit('load', event)
         }
-      } else {
-        imgEl.value!.onload = (event) => {
+        return
+      }
+
+      if (imgEl.value) {
+        imgEl.value.onload = (event) => {
           ctx.emit('load', event)
         }
       }
diff --git a/src/runtime/components/nuxt-picture.ts b/src/runtime/components/nuxt-picture.ts
index 0c7a248..ee28e32 100644
--- a/src/runtime/components/nuxt-picture.ts
+++ b/src/runtime/components/nuxt-picture.ts
@@ -82,8 +82,10 @@ export default defineComponent({
     }
 
     onMounted(() => {
-      imgEl.value!.onload = (event) => {
-        ctx.emit('load', event)
+      if (imgEl.value) {
+        imgEl.value.onload = (event) => {
+          ctx.emit('load', event)
+        }
       }
     })
 
diff --git a/src/runtime/composables.ts b/src/runtime/composables.ts
index d7a6afc..1e01485 100644
--- a/src/runtime/composables.ts
+++ b/src/runtime/composables.ts
@@ -1,6 +1,18 @@
-import { $Img } from '../types'
-import { useNuxtApp } from '#imports'
+import type { $Img } from '../types'
 
-export const useImage = () => {
-  return useNuxtApp().$img as $Img
+import { createImage } from './image'
+// @ts-expect-error virtual file
+import { imageOptions } from '#build/image-options'
+import { useNuxtApp, useRuntimeConfig } from '#imports'
+
+export const useImage = (): $Img => {
+  const config = useRuntimeConfig()
+  const nuxtApp = useNuxtApp()
+
+  return nuxtApp.$img as $Img || nuxtApp._img || (nuxtApp._img = createImage({
+    ...imageOptions,
+    nuxt: {
+      baseURL: config.app.baseURL
+    }
+  }))
 }
diff --git a/src/runtime/plugin.placeholder.ts b/src/runtime/plugin.placeholder.ts
new file mode 100644
index 0000000..2730849
--- /dev/null
+++ b/src/runtime/plugin.placeholder.ts
@@ -0,0 +1,13 @@
+import { defineNuxtPlugin } from '#imports'
+
+export default defineNuxtPlugin((nuxtApp) => {
+  const $img = () => throwImgError()
+  $img.getImage = () => throwImgError()
+  $img.getSizes = () => throwImgError()
+  $img.getMeta = () => throwImgError()
+  nuxtApp.provide('img', $img)
+})
+
+function throwImgError () {
+  throw new Error('[nuxt] [image] `$img` global utility is not enabled. You can enable it by setting `image: { inject: true }` in `nuxt.config`.')
+}
diff --git a/src/runtime/plugin.ts b/src/runtime/plugin.ts
index 04bd6fb..c568735 100644
--- a/src/runtime/plugin.ts
+++ b/src/runtime/plugin.ts
@@ -1,19 +1,11 @@
-import { createImage } from '#image'
-// @ts-ignore
-import { imageOptions } from '#build/image-options'
-import { defineNuxtPlugin, useRuntimeConfig } from '#imports'
+import type { Plugin } from 'nuxt/app'
+import type { $Img } from '../types'
+import { defineNuxtPlugin, useImage } from '#imports'
 
 export default defineNuxtPlugin(() => {
-  const config = useRuntimeConfig()
-  const img = createImage({
-    ...imageOptions,
-    nuxt: {
-      baseURL: config.app.baseURL
-    }
-  })
   return {
     provide: {
-      img
+      img: useImage()
     }
   }
-})
+}) as Plugin<{ img: $Img }>
diff --git a/src/runtime/providers/directus.ts b/src/runtime/providers/directus.ts
new file mode 100644
index 0000000..96756fb
--- /dev/null
+++ b/src/runtime/providers/directus.ts
@@ -0,0 +1,20 @@
+import { joinURL } from 'ufo'
+import type { ProviderGetImage } from '../../types'
+import { createOperationsGenerator } from '#image'
+
+export const operationsGenerator = createOperationsGenerator({
+  joinWith: '&'
+})
+
+export const getImage: ProviderGetImage = (src, { modifiers = {}, baseURL } = {}) => {
+  // Separating the transforms from the rest of the modifiers
+  const transforms = modifiers.transforms
+  if (transforms && transforms.length > 0) {
+    // We stringify and encode in URL the list of lists, then apply it back to the modifiers
+    modifiers.transforms = new URLSearchParams(JSON.stringify(transforms)).toString().replace(/=+$/, '') as unknown as (string | number)[][]
+  }
+  const operations = operationsGenerator(modifiers)
+  return {
+    url: joinURL(baseURL, src + (operations ? ('?' + operations) : ''))
+  }
+}
diff --git a/src/runtime/providers/none.ts b/src/runtime/providers/none.ts
new file mode 100644
index 0000000..f0ed771
--- /dev/null
+++ b/src/runtime/providers/none.ts
@@ -0,0 +1,3 @@
+import type { ProviderGetImage } from '../../types'
+
+export const getImage: ProviderGetImage = url => ({ url })


Test patch:
diff --git a/test/e2e/__snapshots__/no-ssr.test.ts.snap b/test/e2e/__snapshots__/no-ssr.test.ts.snap
index 05ce120..fdc29f2 100644
--- a/test/e2e/__snapshots__/no-ssr.test.ts.snap
+++ b/test/e2e/__snapshots__/no-ssr.test.ts.snap
@@ -60,6 +60,24 @@ exports[`browser (ssr: false) > contentful should render images 2`] = `
 ]
 `;
 
+exports[`browser (ssr: false) > directus should render images 1`] = `
+[
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee.jpg?withoutEnlargement=true&width=1024&height=256&fit=cover",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee?width=256&format=webp",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee?withoutEnlargement=true&transforms=%5B%5B%22blur%22%2C4%5D%2C%5B%22negate%22%5D%5D&width=256&format=webp",
+]
+`;
+
+exports[`browser (ssr: false) > directus should render images 2`] = `
+[
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee.jpg?withoutEnlargement=true&width=1024&height=256&fit=cover",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee?width=256&format=webp",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee?withoutEnlargement=true&transforms=%5B%5B%22blur%22%2C4%5D%2C%5B%22negate%22%5D%5D&width=256&format=webp",
+]
+`;
+
 exports[`browser (ssr: false) > edgio should render images 1`] = `
 [
   "https://opt.moovweb.net/?img=https://i.imgur.com/LFtQeX2.jpeg&height=200",
@@ -206,6 +224,24 @@ exports[`browser (ssr: false) > netlify should render images 2`] = `
 ]
 `;
 
+exports[`browser (ssr: false) > none should render images 1`] = `
+[
+  "/images/colors.jpg",
+  "/images/everest.jpg",
+  "/images/tacos.svg",
+  "https://images.unsplash.com/photo-1606112219348-204d7d8b94ee",
+]
+`;
+
+exports[`browser (ssr: false) > none should render images 2`] = `
+[
+  "/images/colors.jpg",
+  "/images/everest.jpg",
+  "/images/tacos.svg",
+  "https://images.unsplash.com/photo-1606112219348-204d7d8b94ee",
+]
+`;
+
 exports[`browser (ssr: false) > prismic should render images 1`] = `
 [
   "https://images.prismic.io/200629-sms-hoy/f596a543-d593-4296-9abd-3d3ac15f1e39_ray-hennessy-mpw37yXc_WQ-unsplash.jpg?auto=compress,format&w=600&h=900",
diff --git a/test/e2e/__snapshots__/ssr.test.ts.snap b/test/e2e/__snapshots__/ssr.test.ts.snap
index 69c5d5f..0b607d8 100644
--- a/test/e2e/__snapshots__/ssr.test.ts.snap
+++ b/test/e2e/__snapshots__/ssr.test.ts.snap
@@ -60,6 +60,24 @@ exports[`browser (ssr: true) > contentful should render images 2`] = `
 ]
 `;
 
+exports[`browser (ssr: true) > directus should render images 1`] = `
+[
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee.jpg?withoutEnlargement=true&width=1024&height=256&fit=cover",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee?width=256&format=webp",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee?withoutEnlargement=true&transforms=%5B%5B%22blur%22%2C4%5D%2C%5B%22negate%22%5D%5D&width=256&format=webp",
+]
+`;
+
+exports[`browser (ssr: true) > directus should render images 2`] = `
+[
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee.jpg?withoutEnlargement=true&width=1024&height=256&fit=cover",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee?width=256&format=webp",
+  "http://localhost:8055/assets/ad514db1-eb90-4523-8183-46781437e7ee?withoutEnlargement=true&transforms=%5B%5B%22blur%22%2C4%5D%2C%5B%22negate%22%5D%5D&width=256&format=webp",
+]
+`;
+
 exports[`browser (ssr: true) > edgio should render images 1`] = `
 [
   "https://opt.moovweb.net/?img=https://i.imgur.com/LFtQeX2.jpeg&height=200",
@@ -206,6 +224,24 @@ exports[`browser (ssr: true) > netlify should render images 2`] = `
 ]
 `;
 
+exports[`browser (ssr: true) > none should render images 1`] = `
+[
+  "/images/colors.jpg",
+  "/images/everest.jpg",
+  "/images/tacos.svg",
+  "https://images.unsplash.com/photo-1606112219348-204d7d8b94ee",
+]
+`;
+
+exports[`browser (ssr: true) > none should render images 2`] = `
+[
+  "/images/colors.jpg",
+  "/images/everest.jpg",
+  "/images/tacos.svg",
+  "https://images.unsplash.com/photo-1606112219348-204d7d8b94ee",
+]
+`;
+
 exports[`browser (ssr: true) > prismic should render images 1`] = `
 [
   "https://images.prismic.io/200629-sms-hoy/f596a543-d593-4296-9abd-3d3ac15f1e39_ray-hennessy-mpw37yXc_WQ-unsplash.jpg?auto=compress,format&w=600&h=900",
diff --git a/test/e2e/generate.test.ts b/test/e2e/generate.test.ts
index 5c80d86..1805a32 100644
--- a/test/e2e/generate.test.ts
+++ b/test/e2e/generate.test.ts
@@ -10,6 +10,9 @@ await setup({
   rootDir: fileURLToPath(new URL('../../playground', import.meta.url)),
   build: true,
   nuxtConfig: {
+    image: {
+      inject: false
+    },
     hooks: {
       'modules:before' () {
         const nuxt = useNuxt()
diff --git a/test/e2e/no-ssr.test.ts b/test/e2e/no-ssr.test.ts
index c49b6a0..2f061bc 100644
--- a/test/e2e/no-ssr.test.ts
+++ b/test/e2e/no-ssr.test.ts
@@ -11,6 +11,7 @@ await setup({
   nuxtConfig: {
     ssr: false,
     image: {
+      inject: false,
       provider: 'ipx'
     }
   }
@@ -39,12 +40,18 @@ describe('browser (ssr: false)', () => {
 
     expect(requests.map(r => r.replace(url('/'), '/')).filter(r => r !== providerPath && !r.match(/\.(js|css)/))).toMatchSnapshot()
   })
+})
+
+describe('browser (ssr: false) common', () => {
+  it('should emit load and error events', async () => {
+    const page = await createPage(url('/events'))
+    const logs: string[] = []
+
+    page.on('console', (msg) => { logs.push(msg.text()) })
 
-  it.todo('should emit load event', async () => {
-    // await page.waitForEvent('console', (msg) => {
-    //   expect(msg.text()).toBe('Image was loaded.')
+    await page.waitForLoadState('networkidle')
 
-    //   return true
-    // })
+    expect(logs.filter(log => log === 'Image was loaded').length).toBe(4)
+    expect(logs.filter(log => log === 'Error loading image').length).toBe(1)
   })
 })
diff --git a/test/e2e/ssr.test.ts b/test/e2e/ssr.test.ts
index 0cebde4..3e05c3c 100644
--- a/test/e2e/ssr.test.ts
+++ b/test/e2e/ssr.test.ts
@@ -1,7 +1,7 @@
 import { fileURLToPath } from 'node:url'
 
 import { describe, it, expect } from 'vitest'
-import { setup, createPage, url } from '@nuxt/test-utils'
+import { setup, createPage, url, fetch } from '@nuxt/test-utils'
 
 import { providers } from '../../playground/providers'
 
@@ -10,6 +10,7 @@ await setup({
   browser: true,
   nuxtConfig: {
     image: {
+      inject: false,
       provider: 'ipx'
     }
   }
@@ -40,4 +41,9 @@ describe('browser (ssr: true)', () => {
 
     expect(requests.map(r => r.replace(url('/'), '/')).filter(r => r !== providerPath && !r.match(/\.(js|css)/))).toMatchSnapshot()
   })
+
+  it('works with runtime ipx', async () => {
+    const res = await fetch(url('/_ipx/s_300x300/images/colors.jpg'))
+    expect(res.headers.get('content-type')).toBe('image/jpeg')
+  })
 })
diff --git a/test/providers.ts b/test/providers.ts
index 1eb819a..69946ea 100644
--- a/test/providers.ts
+++ b/test/providers.ts
@@ -1,6 +1,7 @@
 export const images = [
   {
     args: ['/test.png', {}],
+    none: { url: '/test.png' },
     ipx: { url: '/_ipx/_/test.png' },
     cloudflare: { url: '/test.png' },
     cloudinary: { url: '/f_auto,q_auto/test' },
@@ -19,10 +20,12 @@ export const images = [
     cloudimage: { url: 'https://demo.cloudimg.io/v7/test.png' },
     edgio: { url: 'https://opt.moovweb.net/?img=/test.png' },
     storyblok: { url: 'https://a.storyblok.com/test.png' },
-    vercel: { url: '/_vercel/image?url=/test.png&w=1536&q=100' }
+    vercel: { url: '/_vercel/image?url=/test.png&w=1536&q=100' },
+    directus: { url: '/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4' }
   },
   {
     args: ['/test.png', { width: 200 }],
+    none: { url: '/test.png' },
     ipx: { url: '/_ipx/w_200/test.png' },
     cloudflare: { url: '/cdn-cgi/image/w=200/test.png' },
     cloudinary: { url: '/f_auto,q_auto,w_200/test' },
@@ -41,10 +44,12 @@ export const images = [
     cloudimage: { url: 'https://demo.cloudimg.io/v7/test.png?width=200' },
     edgio: { url: 'https://opt.moovweb.net/?img=/test.png&width=200' },
     storyblok: { url: 'https://a.storyblok.com/test.png/m/200x0' },
-    vercel: { url: '/_vercel/image?url=/test.png&w=320&q=100' }
+    vercel: { url: '/_vercel/image?url=/test.png&w=320&q=100' },
+    directus: { url: '/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4?width=200' }
   },
   {
     args: ['/test.png', { height: 200 }],
+    none: { url: '/test.png' },
     ipx: { url: '/_ipx/h_200/test.png' },
     cloudflare: { url: '/cdn-cgi/image/h=200/test.png' },
     cloudinary: { url: '/f_auto,q_auto,h_200/test' },
@@ -63,10 +68,12 @@ export const images = [
     cloudimage: { url: 'https://demo.cloudimg.io/v7/test.png?height=200' },
     edgio: { url: 'https://opt.moovweb.net/?img=/test.png&height=200' },
     storyblok: { url: 'https://a.storyblok.com/test.png/m/0x200' },
-    vercel: { url: '/_vercel/image?url=/test.png&w=1536&q=100' }
+    vercel: { url: '/_vercel/image?url=/test.png&w=1536&q=100' },
+    directus: { url: '/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4?height=200' }
   },
   {
     args: ['/test.png', { width: 200, height: 200 }],
+    none: { url: '/test.png' },
     ipx: { url: '/_ipx/s_200x200/test.png' },
     cloudflare: { url: '/cdn-cgi/image/w=200,h=200/test.png' },
     cloudinary: { url: '/f_auto,q_auto,w_200,h_200/test' },
@@ -85,10 +92,12 @@ export const images = [
     cloudimage: { url: 'https://demo.cloudimg.io/v7/test.png?width=200&height=200' },
     edgio: { url: 'https://opt.moovweb.net/?img=/test.png&width=200&height=200' },
     storyblok: { url: 'https://a.storyblok.com/test.png/m/200x200' },
-    vercel: { url: '/_vercel/image?url=/test.png&w=320&q=100' }
+    vercel: { url: '/_vercel/image?url=/test.png&w=320&q=100' },
+    directus: { url: '/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4?width=200&height=200' }
   },
   {
     args: ['/test.png', { width: 200, height: 200, fit: 'contain' }],
+    none: { url: '/test.png' },
     ipx: { url: '/_ipx/fit_contain&s_200x200/test.png' },
     cloudflare: { url: '/cdn-cgi/image/w=200,h=200,fit=contain/test.png' },
     cloudinary: { url: '/f_auto,q_auto,w_200,h_200,c_scale/test' },
@@ -107,10 +116,12 @@ export const images = [
     cloudimage: { url: 'https://demo.cloudimg.io/v7/test.png?width=200&height=200&func=fit' },
     edgio: { url: 'https://opt.moovweb.net/?img=/test.png&width=200&height=200&fit=contain' },
     storyblok: { url: 'https://a.storyblok.com/test.png/m/fit-contain/200x200' },
-    vercel: { url: '/_vercel/image?url=/test.png&w=320&q=100' }
+    vercel: { url: '/_vercel/image?url=/test.png&w=320&q=100' },
+    directus: { url: '/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4?width=200&height=200&fit=contain' }
   },
   {
     args: ['/test.png', { width: 200, height: 200, fit: 'contain', format: 'jpeg' }],
+    none: { url: '/test.png' },
     ipx: { url: '/_ipx/fit_contain&f_jpeg&s_200x200/test.png' },
     cloudflare: { url: '/cdn-cgi/image/w=200,h=200,fit=contain,f=jpeg/test.png' },
     cloudinary: { url: '/f_jpg,q_auto,w_200,h_200,c_scale/test' },
@@ -129,7 +140,8 @@ export const images = [
     cloudimage: { url: 'https://demo.cloudimg.io/v7/test.png?width=200&height=200&func=fit&force_format=jpeg' },
     edgio: { url: 'https://opt.moovweb.net/?img=/test.png&width=200&height=200&fit=contain&format=jpeg' },
     storyblok: { url: 'https://a.storyblok.com/test.png/m/fit-contain/200x200/filters:format(jpeg)' },
-    vercel: { url: '/_vercel/image?url=/test.png&w=320&q=100' }
+    vercel: { url: '/_vercel/image?url=/test.png&w=320&q=100' },
+    directus: { url: '/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4?width=200&height=200&fit=contain&format=jpg' }
   }
 ] as const
 
diff --git a/test/unit/image.test.ts b/test/unit/image.test.ts
index c8b0700..297f483 100644
--- a/test/unit/image.test.ts
+++ b/test/unit/image.test.ts
@@ -1,7 +1,7 @@
 // @vitest-environment nuxt
 
 import { beforeEach, describe, it, expect } from 'vitest'
-import { VueWrapper, mount } from '@vue/test-utils'
+import { ComponentMountingOptions, VueWrapper, mount } from '@vue/test-utils'
 
 import { NuxtImg } from '#components'
 
@@ -10,13 +10,11 @@ describe('Renders simple image', () => {
   const src = '/image.png'
 
   beforeEach(() => {
-    wrapper = mount(NuxtImg, {
-      propsData: {
-        width: 200,
-        height: 200,
-        sizes: '200,500:500,900:900',
-        src
-      }
+    wrapper = mountImage({
+      width: 200,
+      height: 200,
+      sizes: '200,500:500,900:900',
+      src
     })
   })
 
@@ -42,4 +40,26 @@ describe('Renders simple image', () => {
     const sizes = wrapper.find('img').element.getAttribute('sizes')
     expect(sizes).toBe('(max-width: 500px) 500px, 900px')
   })
+
+  it('encodes characters', () => {
+    const img = mountImage({
+      width: 200,
+      height: 200,
+      sizes: '200,500:500,900:900',
+      src: '/汉字.png'
+    })
+    expect(img.html()).toMatchInlineSnapshot('"<img src=\\"/_ipx/s_900x900/%E6%B1%89%E5%AD%97.png\\" width=\\"200\\" height=\\"200\\" data-nuxt-img=\\"\\" sizes=\\"(max-width: 500px) 500px, 900px\\" srcset=\\"/_ipx/s_500x500/%E6%B1%89%E5%AD%97.png 500w, /_ipx/s_900x900/%E6%B1%89%E5%AD%97.png 900w\\">"')
+  })
+
+  it('correctly sets crop', () => {
+    const img = mountImage({
+      src: '/image.png',
+      width: 1000,
+      height: 2000,
+      sizes: 'xs:100vw sm:100vw md:300px lg:350px xl:350px 2xl:350px'
+    })
+    expect(img.html()).toMatchInlineSnapshot('"<img src=\\"/_ipx/s_350x700/image.png\\" width=\\"1000\\" height=\\"2000\\" data-nuxt-img=\\"\\" sizes=\\"(max-width: 320px) 100vw, (max-width: 640px) 100vw, (max-width: 768px) 300px, (max-width: 1024px) 350px, (max-width: 1280px) 350px, 350px\\" srcset=\\"/_ipx/s_320x640/image.png 320w, /_ipx/s_640x1280/image.png 640w, /_ipx/s_300x600/image.png 300w, /_ipx/s_350x700/image.png 350w, /_ipx/s_350x700/image.png 350w, /_ipx/s_350x700/image.png 350w\\">"')
+  })
 })
+
+const mountImage = (props: ComponentMountingOptions<typeof NuxtImg>['props']) => mount(NuxtImg, { props })
diff --git a/test/unit/picture.test.ts b/test/unit/picture.test.ts
index 3f45a4a..77693f3 100644
--- a/test/unit/picture.test.ts
+++ b/test/unit/picture.test.ts
@@ -89,4 +89,21 @@ describe('Renders simple image', () => {
     })
     expect(wrapper.html()).toMatchInlineSnapshot('"<picture><img data-nuxt-pic=\\"\\" src=\\"/image.svg\\"></picture>"')
   })
+
+  it('encodes characters', () => {
+    const img = mount(NuxtPicture, {
+      propsData: {
+        loading: 'lazy',
+        width: 200,
+        height: 200,
+        sizes: '200,500:500,900:900',
+        src: '/汉字.png'
+      }
+    })
+    expect(img.html()).toMatchInlineSnapshot(`
+      "<picture>
+        <source type=\\"image/webp\\" sizes=\\"(max-width: 500px) 500px, 900px\\" srcset=\\"/_ipx/f_webp&s_500x500/%E6%B1%89%E5%AD%97.png 500w, /_ipx/f_webp&s_900x900/%E6%B1%89%E5%AD%97.png 900w\\"><img width=\\"200\\" height=\\"200\\" data-nuxt-pic=\\"\\" src=\\"/_ipx/f_png&s_900x900/%E6%B1%89%E5%AD%97.png\\" sizes=\\"(max-width: 500px) 500px, 900px\\" srcset=\\"/_ipx/f_png&s_500x500/%E6%B1%89%E5%AD%97.png 500w, /_ipx/f_png&s_900x900/%E6%B1%89%E5%AD%97.png 900w\\">
+      </picture>"
+    `)
+  })
 })
diff --git a/test/unit/providers.test.ts b/test/unit/providers.test.ts
index 18197aa..9a751bc 100644
--- a/test/unit/providers.test.ts
+++ b/test/unit/providers.test.ts
@@ -6,6 +6,7 @@ import { images } from '../providers'
 
 import { cleanDoubleSlashes } from '#image/utils'
 import * as ipx from '#image/providers/ipx'
+import * as none from '~/src/runtime/providers/none'
 import * as cloudflare from '#image/providers/cloudflare'
 import * as cloudinary from '#image/providers/cloudinary'
 import * as twicpics from '#image/providers/twicpics'
@@ -351,4 +352,15 @@ describe('Providers', () => {
       expect(generated).toMatchObject(image.vercel)
     }
   })
+
+  it('none', () => {
+    const providerOptions = {
+    }
+
+    for (const image of images) {
+      const [src, modifiers] = image.args
+      const generated = none.getImage(src, { modifiers, ...providerOptions }, emptyContext)
+      expect(generated).toMatchObject(image.none)
+    }
+  })
 })