From 320ddc0e28abbb80f06144a307a3a78e9d3ffabf Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 30 Sep 2024 17:11:56 +0900
Subject: [PATCH] chore(deps): update dependency @antfu/eslint-config to v3
 (#2984)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
---
 components/command/CommandPanel.vue           |   2 +-
 components/common/CommonInputImage.vue        |   2 +-
 components/common/CommonPaginator.vue         |   2 +-
 components/modal/ModalContainer.vue           |   2 +-
 .../modal/ModalMediaPreviewCarousel.vue       |   2 +-
 components/nav/NavBottom.vue                  |   4 +-
 .../notification/NotificationPaginator.vue    |   2 +-
 .../publish/PublishEmojiPicker.client.vue     |   2 +-
 components/publish/PublishLanguagePicker.vue  |  13 +-
 components/publish/PublishWidget.vue          |   2 +-
 components/settings/SettingsFontSize.vue      |   2 +-
 components/settings/SettingsItem.vue          |  12 +-
 components/settings/SettingsLanguage.vue      |   2 +-
 components/status/StatusAttachment.vue        |   2 +-
 components/status/StatusSpoiler.vue           |   2 +-
 components/timeline/TimelinePaginator.vue     |   2 +-
 components/tiptap/TiptapCodeBlock.vue         |   2 +-
 components/tiptap/TiptapEmojiList.vue         |   4 +-
 composables/cache.ts                          |  33 +-
 composables/command.ts                        |   6 +-
 composables/content-parse.ts                  |   2 +-
 composables/content-render.ts                 |  16 +-
 composables/dialog.ts                         |   2 +-
 composables/masto/masto.ts                    |   2 +-
 composables/masto/publish.ts                  |  26 +-
 composables/masto/routes.ts                   |   2 +-
 composables/settings/metadata.ts              |   2 +-
 composables/settings/storage.ts               |   4 +-
 composables/tiptap.ts                         |  30 +-
 composables/tiptap/custom-emoji.ts            |   2 +-
 composables/tiptap/emoji.ts                   |   4 +-
 composables/tiptap/shiki-parser.ts            |   2 +-
 composables/tiptap/shiki.ts                   |   2 +-
 composables/tiptap/suggestion.ts              |  18 +-
 composables/users.ts                          |  10 +-
 composables/vue.ts                            |   4 +-
 config/emojis.ts                              |   4 +-
 config/pwa.ts                                 |   2 +-
 modules/build-env.ts                          |   2 +-
 modules/pwa/i18n.ts                           |   2 +-
 modules/pwa/index.ts                          |  12 +-
 modules/pwa/runtime/pwa-plugin.client.ts      |   2 +-
 modules/tauri/runtime/nitro.client.ts         |   2 +-
 modules/tauri/runtime/storage.ts              |   2 +-
 nuxt.config.ts                                |   4 +-
 package.json                                  |   2 +-
 pages/[[server]]/@[account]/[status].vue      |   2 +-
 plugins/0.setup-users.ts                      |   2 +-
 plugins/floating-vue.ts                       |   2 +-
 plugins/setup-global-effects.client.ts        |   2 +-
 pnpm-lock.yaml                                | 549 ++++++------------
 scripts/avatars.ts                            |   2 +-
 scripts/cleanup-translations.ts               |   2 +-
 scripts/generate-pwa-icons.ts                 |   8 +-
 scripts/prepare-translation-status.ts         |   6 +-
 server/cache-driver.ts                        |   2 +-
 server/utils/shared.ts                        |   8 +-
 service-worker/elk-sw.ts                      |   6 +-
 service-worker/notification.ts                |   2 +-
 service-worker/web-push-notifications.ts      |   2 +-
 tests/nuxt/content-rich.test.ts               |  13 +-
 tests/nuxt/html-parse.test.ts                 |   2 +-
 types/index.ts                                |   2 +-
 unocss.config.ts                              |   6 +-
 utils/elk-idb.ts                              |   2 +-
 65 files changed, 359 insertions(+), 523 deletions(-)

diff --git a/components/command/CommandPanel.vue b/components/command/CommandPanel.vue
index dd2115a7..eb1c3454 100644
--- a/components/command/CommandPanel.vue
+++ b/components/command/CommandPanel.vue
@@ -1,6 +1,6 @@
 <script setup lang="ts">
-import type { SearchResult as SearchResultType } from '~/composables/masto/search'
 import type { CommandScope, QueryResult, QueryResultItem } from '~/composables/command'
+import type { SearchResult as SearchResultType } from '~/composables/masto/search'
 
 const emit = defineEmits<{
   (event: 'close'): void
diff --git a/components/common/CommonInputImage.vue b/components/common/CommonInputImage.vue
index bcc55346..92c13825 100644
--- a/components/common/CommonInputImage.vue
+++ b/components/common/CommonInputImage.vue
@@ -1,6 +1,6 @@
 <script setup lang="ts">
-import { fileOpen } from 'browser-fs-access'
 import type { FileWithHandle } from 'browser-fs-access'
+import { fileOpen } from 'browser-fs-access'
 
 const props = withDefaults(defineProps<{
   /** The image src before change */
diff --git a/components/common/CommonPaginator.vue b/components/common/CommonPaginator.vue
index 2c190873..9b32ac32 100644
--- a/components/common/CommonPaginator.vue
+++ b/components/common/CommonPaginator.vue
@@ -1,8 +1,8 @@
 <script setup lang="ts" generic="T, O, U = T">
+import type { mastodon } from 'masto'
 // @ts-expect-error missing types
 import { DynamicScroller } from 'vue-virtual-scroller'
 import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
-import type { mastodon } from 'masto'
 
 const {
   paginator,
diff --git a/components/modal/ModalContainer.vue b/components/modal/ModalContainer.vue
index bb87ee5c..07fa1153 100644
--- a/components/modal/ModalContainer.vue
+++ b/components/modal/ModalContainer.vue
@@ -1,6 +1,5 @@
 <script setup lang="ts">
 import type { mastodon } from 'masto'
-import type { ConfirmDialogChoice } from '~/types'
 import {
   isCommandPanelOpen,
   isConfirmDialogOpen,
@@ -14,6 +13,7 @@ import {
   isReportDialogOpen,
   isSigninDialogOpen,
 } from '~/composables/dialog'
+import type { ConfirmDialogChoice } from '~/types'
 
 const isMac = useIsMac()
 
diff --git a/components/modal/ModalMediaPreviewCarousel.vue b/components/modal/ModalMediaPreviewCarousel.vue
index 12c201ec..43eb6f7d 100644
--- a/components/modal/ModalMediaPreviewCarousel.vue
+++ b/components/modal/ModalMediaPreviewCarousel.vue
@@ -1,8 +1,8 @@
 <script setup lang="ts">
 import type { Vector2 } from '@vueuse/gesture'
+import type { mastodon } from 'masto'
 import { useGesture } from '@vueuse/gesture'
 import { useReducedMotion } from '@vueuse/motion'
-import type { mastodon } from 'masto'
 
 const { media = [] } = defineProps<{
   media?: mastodon.v1.MediaAttachment[]
diff --git a/components/nav/NavBottom.vue b/components/nav/NavBottom.vue
index 145759cb..fdc10d52 100644
--- a/components/nav/NavBottom.vue
+++ b/components/nav/NavBottom.vue
@@ -2,10 +2,10 @@
 import type { Component } from 'vue'
 import type { NavButtonName } from '../../composables/settings'
 
-import { STORAGE_KEY_BOTTOM_NAV_BUTTONS } from '~/constants'
-
 import { NavButtonExplore, NavButtonFederated, NavButtonHome, NavButtonLocal, NavButtonMention, NavButtonMoreMenu, NavButtonNotification, NavButtonSearch } from '#components'
 
+import { STORAGE_KEY_BOTTOM_NAV_BUTTONS } from '~/constants'
+
 interface NavButton {
   name: string
   component: Component
diff --git a/components/notification/NotificationPaginator.vue b/components/notification/NotificationPaginator.vue
index 7f08049b..3e2a2ac8 100644
--- a/components/notification/NotificationPaginator.vue
+++ b/components/notification/NotificationPaginator.vue
@@ -1,7 +1,7 @@
 <script setup lang="ts">
+import type { mastodon } from 'masto'
 // @ts-expect-error missing types
 import { DynamicScrollerItem } from 'vue-virtual-scroller'
-import type { mastodon } from 'masto'
 import type { GroupedAccountLike, NotificationSlot } from '~/types'
 
 const { paginator, stream } = defineProps<{
diff --git a/components/publish/PublishEmojiPicker.client.vue b/components/publish/PublishEmojiPicker.client.vue
index 314aebbb..b8a55d1e 100644
--- a/components/publish/PublishEmojiPicker.client.vue
+++ b/components/publish/PublishEmojiPicker.client.vue
@@ -1,6 +1,6 @@
 <script setup lang="ts">
-import importEmojiLang from 'virtual:emoji-mart-lang-importer'
 import type { Picker } from 'emoji-mart'
+import importEmojiLang from 'virtual:emoji-mart-lang-importer'
 
 const emit = defineEmits<{
   (e: 'select', code: string): void
diff --git a/components/publish/PublishLanguagePicker.vue b/components/publish/PublishLanguagePicker.vue
index ba16fe28..7068c500 100644
--- a/components/publish/PublishLanguagePicker.vue
+++ b/components/publish/PublishLanguagePicker.vue
@@ -16,14 +16,13 @@ const fuse = new Fuse(languagesNameList, {
 const languages = computed(() =>
   languageKeyword.value.trim()
     ? fuse.search(languageKeyword.value).map(r => r.item)
-    : [...languagesNameList].filter(entry => !userSettings.value.disabledTranslationLanguages.includes(entry.code))
-        .sort(({ code: a }, { code: b }) => {
-          // Put English on the top
-          if (a === 'en')
-            return -1
+    : [...languagesNameList].filter(entry => !userSettings.value.disabledTranslationLanguages.includes(entry.code)).sort(({ code: a }, { code: b }) => {
+        // Put English on the top
+        if (a === 'en')
+          return -1
 
-          return a === modelValue.value ? -1 : b === modelValue.value ? 1 : a.localeCompare(b)
-        }),
+        return a === modelValue.value ? -1 : b === modelValue.value ? 1 : a.localeCompare(b)
+      }),
 )
 
 const preferredLanguages = computed(() => {
diff --git a/components/publish/PublishWidget.vue b/components/publish/PublishWidget.vue
index c9bc246d..0eacdf5a 100644
--- a/components/publish/PublishWidget.vue
+++ b/components/publish/PublishWidget.vue
@@ -1,7 +1,7 @@
 <script setup lang="ts">
+import type { mastodon } from 'masto'
 import { EditorContent } from '@tiptap/vue-3'
 import stringLength from 'string-length'
-import type { mastodon } from 'masto'
 import type { DraftItem } from '~/types'
 
 const {
diff --git a/components/settings/SettingsFontSize.vue b/components/settings/SettingsFontSize.vue
index 249c60df..d2518eaa 100644
--- a/components/settings/SettingsFontSize.vue
+++ b/components/settings/SettingsFontSize.vue
@@ -1,6 +1,6 @@
 <script setup lang="ts">
-import { DEFAULT_FONT_SIZE } from '~/constants'
 import type { FontSize } from '~/composables/settings'
+import { DEFAULT_FONT_SIZE } from '~/constants'
 
 const userSettings = useUserSettings()
 
diff --git a/components/settings/SettingsItem.vue b/components/settings/SettingsItem.vue
index b0992895..7fde7894 100644
--- a/components/settings/SettingsItem.vue
+++ b/components/settings/SettingsItem.vue
@@ -20,12 +20,12 @@ useCommand({
   scope: 'Settings',
 
   name: () => props.text
-  ?? (props.to
-    ? typeof props.to === 'string'
-      ? props.to
-      : props.to.name
-    : ''
-  ),
+    ?? (props.to
+      ? typeof props.to === 'string'
+        ? props.to
+        : props.to.name
+      : ''
+    ),
   description: () => props.description,
   icon: () => props.icon || '',
   visible: () => props.command && props.to,
diff --git a/components/settings/SettingsLanguage.vue b/components/settings/SettingsLanguage.vue
index 24c9d85e..6973868f 100644
--- a/components/settings/SettingsLanguage.vue
+++ b/components/settings/SettingsLanguage.vue
@@ -1,6 +1,6 @@
 <script setup lang="ts">
-import type { ComputedRef } from 'vue'
 import type { LocaleObject } from '@nuxtjs/i18n'
+import type { ComputedRef } from 'vue'
 
 const userSettings = useUserSettings()
 
diff --git a/components/status/StatusAttachment.vue b/components/status/StatusAttachment.vue
index 834ddfc1..836d4ae5 100644
--- a/components/status/StatusAttachment.vue
+++ b/components/status/StatusAttachment.vue
@@ -1,6 +1,6 @@
 <script setup lang="ts">
-import { clamp } from '@vueuse/core'
 import type { mastodon } from 'masto'
+import { clamp } from '@vueuse/core'
 import { decode } from 'blurhash'
 
 const {
diff --git a/components/status/StatusSpoiler.vue b/components/status/StatusSpoiler.vue
index ff6149b6..6d96a2f4 100644
--- a/components/status/StatusSpoiler.vue
+++ b/components/status/StatusSpoiler.vue
@@ -12,7 +12,7 @@ const expandSpoilers = computed(() => {
 
   return !props.filter // always prevent expansion if filtered
     && ((props.sensitiveNonSpoiler && expandMedia)
-    || (!props.sensitiveNonSpoiler && expandCW))
+      || (!props.sensitiveNonSpoiler && expandCW))
 })
 
 const hideContent = props.enabled || props.sensitiveNonSpoiler
diff --git a/components/timeline/TimelinePaginator.vue b/components/timeline/TimelinePaginator.vue
index b24830e0..0f03d444 100644
--- a/components/timeline/TimelinePaginator.vue
+++ b/components/timeline/TimelinePaginator.vue
@@ -1,8 +1,8 @@
 <script setup lang="ts">
+import type { mastodon } from 'masto'
 // @ts-expect-error missing types
 import { DynamicScrollerItem } from 'vue-virtual-scroller'
 import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
-import type { mastodon } from 'masto'
 
 const { paginator, stream, account, buffer = 10, endMessage = true } = defineProps<{
   paginator: mastodon.Paginator<mastodon.v1.Status[], mastodon.rest.v1.ListAccountStatusesParams>
diff --git a/components/tiptap/TiptapCodeBlock.vue b/components/tiptap/TiptapCodeBlock.vue
index b9aa0e79..df054407 100644
--- a/components/tiptap/TiptapCodeBlock.vue
+++ b/components/tiptap/TiptapCodeBlock.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { NodeViewContent, NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'
+import { NodeViewContent, nodeViewProps, NodeViewWrapper } from '@tiptap/vue-3'
 
 const props = defineProps(nodeViewProps)
 
diff --git a/components/tiptap/TiptapEmojiList.vue b/components/tiptap/TiptapEmojiList.vue
index d1b5726a..88234590 100644
--- a/components/tiptap/TiptapEmojiList.vue
+++ b/components/tiptap/TiptapEmojiList.vue
@@ -1,9 +1,9 @@
 <script setup lang="ts">
 import { getEmojiMatchesInText } from '@iconify/utils/lib/emoji/replace/find'
-import type { CustomEmoji, Emoji } from '~/composables/tiptap/suggestion'
-import { isCustomEmoji } from '~/composables/tiptap/suggestion'
 import { emojiFilename, emojiPrefix, emojiRegEx } from '~~/config/emojis'
 import type { CommandHandler } from '~/composables/command'
+import type { CustomEmoji, Emoji } from '~/composables/tiptap/suggestion'
+import { isCustomEmoji } from '~/composables/tiptap/suggestion'
 
 const { items, command } = defineProps<{
   items: (CustomEmoji | Emoji)[]
diff --git a/composables/cache.ts b/composables/cache.ts
index bf6627f9..83d25c05 100644
--- a/composables/cache.ts
+++ b/composables/cache.ts
@@ -1,5 +1,5 @@
-import { LRUCache } from 'lru-cache'
 import type { mastodon } from 'masto'
+import { LRUCache } from 'lru-cache'
 
 const cache = new LRUCache<string, any>({
   max: 1000,
@@ -25,11 +25,10 @@ export function fetchStatus(id: string, force = false): Promise<mastodon.v1.Stat
   if (cached && !force)
     return Promise.resolve(cached)
 
-  const promise = useMastoClient().v1.statuses.$select(id).fetch()
-    .then((status) => {
-      cacheStatus(status)
-      return status
-    })
+  const promise = useMastoClient().v1.statuses.$select(id).fetch().then((status) => {
+    cacheStatus(status)
+    return status
+  })
   cache.set(key, promise)
   return promise
 }
@@ -46,14 +45,13 @@ export function fetchAccountById(id?: string | null): Promise<mastodon.v1.Accoun
     return Promise.resolve(cached)
 
   const domain = getInstanceDomainFromServer(server)
-  const promise = useMastoClient().v1.accounts.$select(id).fetch()
-    .then((r) => {
-      if (r.acct && !r.acct.includes('@') && domain)
-        r.acct = `${r.acct}@${domain}`
+  const promise = useMastoClient().v1.accounts.$select(id).fetch().then((r) => {
+    if (r.acct && !r.acct.includes('@') && domain)
+      r.acct = `${r.acct}@${domain}`
 
-      cacheAccount(r, server, true)
-      return r
-    })
+    cacheAccount(r, server, true)
+    return r
+  })
   cache.set(key, promise)
   return promise
 }
@@ -101,11 +99,10 @@ export function fetchTag(tagName: string, force = false): Promise<mastodon.v1.Ta
   if (cached && !force)
     return Promise.resolve(cached)
 
-  const promise = useMastoClient().v1.tags.$select(tagName).fetch()
-    .then((tag) => {
-      cacheTag(tag)
-      return tag
-    })
+  const promise = useMastoClient().v1.tags.$select(tagName).fetch().then((tag) => {
+    cacheTag(tag)
+    return tag
+  })
   cache.set(key, promise)
   return promise
 }
diff --git a/composables/command.ts b/composables/command.ts
index 838e3d17..d1643832 100644
--- a/composables/command.ts
+++ b/composables/command.ts
@@ -1,7 +1,7 @@
-import type { ComputedRef } from 'vue'
-import { defineStore } from 'pinia'
-import Fuse from 'fuse.js'
 import type { LocaleObject } from '@nuxtjs/i18n'
+import type { ComputedRef } from 'vue'
+import Fuse from 'fuse.js'
+import { defineStore } from 'pinia'
 import type { SearchResult } from '~/composables/masto/search'
 
 // @unocss-include
diff --git a/composables/content-parse.ts b/composables/content-parse.ts
index fd220efa..f9b02b65 100644
--- a/composables/content-parse.ts
+++ b/composables/content-parse.ts
@@ -1,9 +1,9 @@
 // @unimport-disable
 import type { mastodon } from 'masto'
 import type { Node } from 'ultrahtml'
-import { DOCUMENT_NODE, ELEMENT_NODE, TEXT_NODE, h, parse, render } from 'ultrahtml'
 import { findAndReplaceEmojisInText } from '@iconify/utils'
 import { decode } from 'tiny-decode'
+import { DOCUMENT_NODE, ELEMENT_NODE, h, parse, render, TEXT_NODE } from 'ultrahtml'
 import { emojiRegEx, getEmojiAttributes } from '../config/emojis'
 
 export interface ContentParseOptions {
diff --git a/composables/content-render.ts b/composables/content-render.ts
index 69024c09..5e029d07 100644
--- a/composables/content-render.ts
+++ b/composables/content-render.ts
@@ -1,16 +1,16 @@
-import { ELEMENT_NODE, TEXT_NODE } from 'ultrahtml'
 import type { ElementNode, Node } from 'ultrahtml'
-import { Fragment, h, isVNode } from 'vue'
 import type { VNode } from 'vue'
-import { RouterLink } from 'vue-router'
-import { decode } from 'tiny-decode'
 import type { ContentParseOptions } from './content-parse'
-import { parseMastodonHTML } from './content-parse'
-import Emoji from '~/components/emoji/Emoji.vue'
-import ContentCode from '~/components/content/ContentCode.vue'
-import ContentMentionGroup from '~/components/content/ContentMentionGroup.vue'
+import { decode } from 'tiny-decode'
+import { ELEMENT_NODE, TEXT_NODE } from 'ultrahtml'
+import { Fragment, h, isVNode } from 'vue'
+import { RouterLink } from 'vue-router'
 import AccountHoverWrapper from '~/components/account/AccountHoverWrapper.vue'
 import TagHoverWrapper from '~/components/account/TagHoverWrapper.vue'
+import ContentCode from '~/components/content/ContentCode.vue'
+import ContentMentionGroup from '~/components/content/ContentMentionGroup.vue'
+import Emoji from '~/components/emoji/Emoji.vue'
+import { parseMastodonHTML } from './content-parse'
 
 function getTextualAstComponents(astChildren: Node[]): string {
   return astChildren
diff --git a/composables/dialog.ts b/composables/dialog.ts
index ba02eca1..c237e644 100644
--- a/composables/dialog.ts
+++ b/composables/dialog.ts
@@ -1,6 +1,6 @@
 import type { mastodon } from 'masto'
-import type { ConfirmDialogChoice, ConfirmDialogOptions, DraftItem, ErrorDialogData } from '~/types'
 import { STORAGE_KEY_FIRST_VISIT } from '~/constants'
+import type { ConfirmDialogChoice, ConfirmDialogOptions, DraftItem, ErrorDialogData } from '~/types'
 
 export const confirmDialogChoice = ref<ConfirmDialogChoice>()
 export const confirmDialogLabel = ref<ConfirmDialogOptions>()
diff --git a/composables/masto/masto.ts b/composables/masto/masto.ts
index 56f0918c..b2c5a862 100644
--- a/composables/masto/masto.ts
+++ b/composables/masto/masto.ts
@@ -1,8 +1,8 @@
 import type { Pausable } from '@vueuse/core'
 import type { mastodon } from 'masto'
-import { createRestAPIClient, createStreamingAPIClient } from 'masto'
 import type { Ref } from 'vue'
 import type { ElkInstance } from '../users'
+import { createRestAPIClient, createStreamingAPIClient } from 'masto'
 import type { UserLogin } from '~/types'
 
 export function createMasto() {
diff --git a/composables/masto/publish.ts b/composables/masto/publish.ts
index 9c5593aa..dba585c0 100644
--- a/composables/masto/publish.ts
+++ b/composables/masto/publish.ts
@@ -1,7 +1,7 @@
-import { fileOpen } from 'browser-fs-access'
-import type { Ref } from 'vue'
-import type { mastodon } from 'masto'
 import type { DraftItem } from '~~/types'
+import type { mastodon } from 'masto'
+import type { Ref } from 'vue'
+import { fileOpen } from 'browser-fs-access'
 
 export function usePublish(options: {
   draftItem: Ref<DraftItem>
@@ -45,16 +45,16 @@ export function usePublish(options: {
       || failedMessages.value.length > 0
       || (attachments.length > 0 && params.poll !== null && params.poll !== undefined)
       || ((params.poll !== null && params.poll !== undefined)
-      && (
-        (firstEmptyInputIndex !== -1
-        && firstEmptyInputIndex !== params.poll.options.length - 1
-        )
-        || params.poll.options.findLastIndex(option => option.trim().length > 0) + 1 < 2
-        || (new Set(params.poll.options).size !== params.poll.options.length)
-        || (currentInstance.value?.configuration?.polls.maxCharactersPerOption !== undefined
-        && params.poll.options.find(option => option.length > currentInstance.value!.configuration!.polls.maxCharactersPerOption) !== undefined
-        )
-      ))
+        && (
+          (firstEmptyInputIndex !== -1
+            && firstEmptyInputIndex !== params.poll.options.length - 1
+          )
+          || params.poll.options.findLastIndex(option => option.trim().length > 0) + 1 < 2
+          || (new Set(params.poll.options).size !== params.poll.options.length)
+          || (currentInstance.value?.configuration?.polls.maxCharactersPerOption !== undefined
+            && params.poll.options.find(option => option.length > currentInstance.value!.configuration!.polls.maxCharactersPerOption) !== undefined
+          )
+        ))
   })
 
   watch(draftItem, () => {
diff --git a/composables/masto/routes.ts b/composables/masto/routes.ts
index f2a4d8d0..31dfe4e8 100644
--- a/composables/masto/routes.ts
+++ b/composables/masto/routes.ts
@@ -1,5 +1,5 @@
-import { withoutProtocol } from 'ufo'
 import type { mastodon } from 'masto'
+import { withoutProtocol } from 'ufo'
 
 export function getAccountRoute(account: mastodon.v1.Account) {
   return useRouter().resolve({
diff --git a/composables/settings/metadata.ts b/composables/settings/metadata.ts
index 703056c2..8e8c0428 100644
--- a/composables/settings/metadata.ts
+++ b/composables/settings/metadata.ts
@@ -1,6 +1,6 @@
 import type { Node } from 'ultrahtml'
 import { decode } from 'tiny-decode'
-import { TEXT_NODE, parse } from 'ultrahtml'
+import { parse, TEXT_NODE } from 'ultrahtml'
 
 export const maxAccountFieldCount = computed(() => isGlitchEdition.value ? 16 : 4)
 
diff --git a/composables/settings/storage.ts b/composables/settings/storage.ts
index 329f56b2..0d2a92d9 100644
--- a/composables/settings/storage.ts
+++ b/composables/settings/storage.ts
@@ -1,8 +1,8 @@
-import type { Ref } from 'vue'
 import type { LocaleObject } from '@nuxtjs/i18n'
+import type { Ref } from 'vue'
 import type { FontSize, OldFontSize, PreferencesSettings, UserSettings } from './definition'
-import { STORAGE_KEY_SETTINGS } from '~/constants'
 import { oldFontSizeMap } from '~~/constants/options'
+import { STORAGE_KEY_SETTINGS } from '~/constants'
 
 export function useUserSettings() {
   const { locales } = useNuxtApp().$i18n
diff --git a/composables/tiptap.ts b/composables/tiptap.ts
index b50e3829..18555909 100644
--- a/composables/tiptap.ts
+++ b/composables/tiptap.ts
@@ -1,22 +1,22 @@
 import type { Editor } from '@tiptap/vue-3'
-import { Extension, useEditor } from '@tiptap/vue-3'
-import Placeholder from '@tiptap/extension-placeholder'
-import Document from '@tiptap/extension-document'
-import Paragraph from '@tiptap/extension-paragraph'
-import Text from '@tiptap/extension-text'
-import Mention from '@tiptap/extension-mention'
-import HardBreak from '@tiptap/extension-hard-break'
-import Bold from '@tiptap/extension-bold'
-import Italic from '@tiptap/extension-italic'
-import Code from '@tiptap/extension-code'
-import History from '@tiptap/extension-history'
-import { Plugin } from 'prosemirror-state'
-
 import type { Ref } from 'vue'
-import { TiptapEmojiSuggestion, TiptapHashtagSuggestion, TiptapMentionSuggestion } from './tiptap/suggestion'
-import { TiptapPluginCodeBlockShiki } from './tiptap/shiki'
+import Bold from '@tiptap/extension-bold'
+import Code from '@tiptap/extension-code'
+import Document from '@tiptap/extension-document'
+import HardBreak from '@tiptap/extension-hard-break'
+import History from '@tiptap/extension-history'
+import Italic from '@tiptap/extension-italic'
+import Mention from '@tiptap/extension-mention'
+import Paragraph from '@tiptap/extension-paragraph'
+import Placeholder from '@tiptap/extension-placeholder'
+import Text from '@tiptap/extension-text'
+import { Extension, useEditor } from '@tiptap/vue-3'
+
+import { Plugin } from 'prosemirror-state'
 import { TiptapPluginCustomEmoji } from './tiptap/custom-emoji'
 import { TiptapPluginEmoji } from './tiptap/emoji'
+import { TiptapPluginCodeBlockShiki } from './tiptap/shiki'
+import { TiptapEmojiSuggestion, TiptapHashtagSuggestion, TiptapMentionSuggestion } from './tiptap/suggestion'
 
 export interface UseTiptapOptions {
   content: Ref<string>
diff --git a/composables/tiptap/custom-emoji.ts b/composables/tiptap/custom-emoji.ts
index d25c3bb8..abb03a7c 100644
--- a/composables/tiptap/custom-emoji.ts
+++ b/composables/tiptap/custom-emoji.ts
@@ -1,6 +1,6 @@
 import {
-  Node,
   mergeAttributes,
+  Node,
   nodeInputRule,
 } from '@tiptap/core'
 
diff --git a/composables/tiptap/emoji.ts b/composables/tiptap/emoji.ts
index e1e95de4..e9fada03 100644
--- a/composables/tiptap/emoji.ts
+++ b/composables/tiptap/emoji.ts
@@ -1,10 +1,10 @@
 import type { ExtendedRegExpMatchArray, InputRuleFinder, nodeInputRule } from '@tiptap/core'
 import type { NodeType } from '@tiptap/pm/model'
 import {
-  InputRule,
-  Node,
   callOrReturn,
+  InputRule,
   mergeAttributes,
+  Node,
   nodePasteRule,
 } from '@tiptap/core'
 import { emojiRegEx, getEmojiAttributes } from '~/config/emojis'
diff --git a/composables/tiptap/shiki-parser.ts b/composables/tiptap/shiki-parser.ts
index b752e196..c3fd6f16 100644
--- a/composables/tiptap/shiki-parser.ts
+++ b/composables/tiptap/shiki-parser.ts
@@ -1,5 +1,5 @@
-import { type Parser, createParser } from 'prosemirror-highlight/shiki'
 import type { BuiltinLanguage } from 'shiki'
+import { createParser, type Parser } from 'prosemirror-highlight/shiki'
 
 let parser: Parser | undefined
 
diff --git a/composables/tiptap/shiki.ts b/composables/tiptap/shiki.ts
index ca59060d..fce804d3 100644
--- a/composables/tiptap/shiki.ts
+++ b/composables/tiptap/shiki.ts
@@ -2,8 +2,8 @@ import CodeBlock from '@tiptap/extension-code-block'
 import { VueNodeViewRenderer } from '@tiptap/vue-3'
 
 import { createHighlightPlugin } from 'prosemirror-highlight'
-import { shikiParser } from './shiki-parser'
 import TiptapCodeBlock from '~/components/tiptap/TiptapCodeBlock.vue'
+import { shikiParser } from './shiki-parser'
 
 export const TiptapPluginCodeBlockShiki = CodeBlock.extend({
   addOptions() {
diff --git a/composables/tiptap/suggestion.ts b/composables/tiptap/suggestion.ts
index a5c8d0b5..fdaa24cd 100644
--- a/composables/tiptap/suggestion.ts
+++ b/composables/tiptap/suggestion.ts
@@ -1,15 +1,15 @@
-import type { GetReferenceClientRect, Instance } from 'tippy.js'
-import tippy from 'tippy.js'
-import { VueRenderer } from '@tiptap/vue-3'
-import type { SuggestionOptions } from '@tiptap/suggestion'
-import { PluginKey } from 'prosemirror-state'
-import type { Component } from 'vue'
 import type { Emoji, EmojiMartData } from '@emoji-mart/data'
+import type { SuggestionOptions } from '@tiptap/suggestion'
 import type { mastodon } from 'masto'
-import { currentCustomEmojis, updateCustomEmojis } from '~/composables/emojis'
-import TiptapMentionList from '~/components/tiptap/TiptapMentionList.vue'
-import TiptapHashtagList from '~/components/tiptap/TiptapHashtagList.vue'
+import type { GetReferenceClientRect, Instance } from 'tippy.js'
+import type { Component } from 'vue'
+import { VueRenderer } from '@tiptap/vue-3'
+import { PluginKey } from 'prosemirror-state'
+import tippy from 'tippy.js'
 import TiptapEmojiList from '~/components/tiptap/TiptapEmojiList.vue'
+import TiptapHashtagList from '~/components/tiptap/TiptapHashtagList.vue'
+import TiptapMentionList from '~/components/tiptap/TiptapMentionList.vue'
+import { currentCustomEmojis, updateCustomEmojis } from '~/composables/emojis'
 
 export type { Emoji }
 
diff --git a/composables/users.ts b/composables/users.ts
index 8677c248..d229c398 100644
--- a/composables/users.ts
+++ b/composables/users.ts
@@ -1,10 +1,9 @@
-import { withoutProtocol } from 'ufo'
+import type { MaybeRefOrGetter, RemovableRef } from '@vueuse/core'
 import type { mastodon } from 'masto'
 import type { EffectScope, Ref } from 'vue'
-import type { MaybeRefOrGetter, RemovableRef } from '@vueuse/core'
 import type { ElkMasto } from './masto/masto'
-import type { UserLogin } from '~/types'
-import type { Overwrite } from '~/types/utils'
+import { withoutProtocol } from 'ufo'
+import type { PushNotificationPolicy, PushNotificationRequest } from '~/composables/push-notifications/types'
 import {
   DEFAULT_POST_CHARS_LIMIT,
   STORAGE_KEY_CURRENT_USER_HANDLE,
@@ -13,7 +12,8 @@ import {
   STORAGE_KEY_NOTIFICATION_POLICY,
   STORAGE_KEY_SERVERS,
 } from '~/constants'
-import type { PushNotificationPolicy, PushNotificationRequest } from '~/composables/push-notifications/types'
+import type { UserLogin } from '~/types'
+import type { Overwrite } from '~/types/utils'
 
 const mock = process.mock
 
diff --git a/composables/vue.ts b/composables/vue.ts
index 5b50549d..a988f74f 100644
--- a/composables/vue.ts
+++ b/composables/vue.ts
@@ -1,7 +1,7 @@
+import type { SchemaAugmentations } from '@unhead/schema'
+import type { ActiveHeadEntry, UseHeadInput, UseHeadOptions } from '@unhead/vue'
 import type { ComponentInternalInstance } from 'vue'
 import { onActivated, onDeactivated, ref } from 'vue'
-import type { ActiveHeadEntry, UseHeadInput, UseHeadOptions } from '@unhead/vue'
-import type { SchemaAugmentations } from '@unhead/schema'
 
 export const isHydrated = ref(false)
 
diff --git a/config/emojis.ts b/config/emojis.ts
index a1fa98dc..d1504f4c 100644
--- a/config/emojis.ts
+++ b/config/emojis.ts
@@ -1,7 +1,7 @@
-// @unimport-disabled
-import { emojiFilename, emojiPrefix, emojiRegEx } from '@iconify-emoji/twemoji'
 import type { EmojiRegexMatch } from '@iconify/utils/lib/emoji/replace/find'
 import { getEmojiMatchesInText } from '@iconify/utils/lib/emoji/replace/find'
+// @unimport-disabled
+import { emojiFilename, emojiPrefix, emojiRegEx } from '@iconify-emoji/twemoji'
 
 // Re-export everything from package
 export * from '@iconify-emoji/twemoji'
diff --git a/config/pwa.ts b/config/pwa.ts
index a77b4678..f4dbfeae 100644
--- a/config/pwa.ts
+++ b/config/pwa.ts
@@ -1,5 +1,5 @@
-import { isCI, isDevelopment } from 'std-env'
 import type { VitePWANuxtOptions } from '../modules/pwa/types'
+import { isCI, isDevelopment } from 'std-env'
 
 export const pwa: VitePWANuxtOptions = {
   mode: isCI ? 'production' : 'development',
diff --git a/modules/build-env.ts b/modules/build-env.ts
index 3f5656d0..a0175a64 100644
--- a/modules/build-env.ts
+++ b/modules/build-env.ts
@@ -1,7 +1,7 @@
 import { createResolver, defineNuxtModule } from '@nuxt/kit'
 import { isCI } from 'std-env'
-import { getEnv, version } from '../config/env'
 import type { BuildInfo } from '~/types'
+import { getEnv, version } from '../config/env'
 
 const { resolve } = createResolver(import.meta.url)
 
diff --git a/modules/pwa/i18n.ts b/modules/pwa/i18n.ts
index 09a12e43..2e1ce51a 100644
--- a/modules/pwa/i18n.ts
+++ b/modules/pwa/i18n.ts
@@ -1,7 +1,7 @@
+import type { ManifestOptions } from 'vite-plugin-pwa'
 import { Buffer } from 'node:buffer'
 import { readFile } from 'node:fs/promises'
 import { createResolver } from '@nuxt/kit'
-import type { ManifestOptions } from 'vite-plugin-pwa'
 import { getEnv } from '../../config/env'
 import { currentLocales } from '../../config/i18n'
 import { THEME_COLORS } from '../../constants/index'
diff --git a/modules/pwa/index.ts b/modules/pwa/index.ts
index 0cf91d59..83d39336 100644
--- a/modules/pwa/index.ts
+++ b/modules/pwa/index.ts
@@ -1,15 +1,15 @@
-import { mkdir, readFile, writeFile } from 'node:fs/promises'
 import type { Buffer } from 'node:buffer'
+import type { Plugin } from 'vite'
+import type { VitePluginPWAAPI } from 'vite-plugin-pwa'
+import type { VitePWANuxtOptions } from './types'
+import { mkdir, readFile, writeFile } from 'node:fs/promises'
 import { dirname } from 'node:path'
 import { fileURLToPath } from 'node:url'
 import { addPlugin, createResolver, defineNuxtModule } from '@nuxt/kit'
-import type { VitePluginPWAAPI } from 'vite-plugin-pwa'
-import { VitePWA } from 'vite-plugin-pwa'
-import type { Plugin } from 'vite'
 import { join, resolve } from 'pathe'
-import type { VitePWANuxtOptions } from './types'
+import { VitePWA } from 'vite-plugin-pwa'
 import { configurePWAOptions } from './config'
-import { type LocalizedWebManifest, createI18n, pwaLocales } from './i18n'
+import { createI18n, type LocalizedWebManifest, pwaLocales } from './i18n'
 
 export * from './types'
 
diff --git a/modules/pwa/runtime/pwa-plugin.client.ts b/modules/pwa/runtime/pwa-plugin.client.ts
index ed3d960d..42695d83 100644
--- a/modules/pwa/runtime/pwa-plugin.client.ts
+++ b/modules/pwa/runtime/pwa-plugin.client.ts
@@ -1,6 +1,6 @@
-import { useRegisterSW } from 'virtual:pwa-register/vue'
 import type { UnwrapNestedRefs } from 'vue'
 import type { PwaInjection } from './types'
+import { useRegisterSW } from 'virtual:pwa-register/vue'
 import { STORAGE_KEY_PWA_HIDE_INSTALL } from '~/constants'
 
 export default defineNuxtPlugin(() => {
diff --git a/modules/tauri/runtime/nitro.client.ts b/modules/tauri/runtime/nitro.client.ts
index affedc06..f85ce95b 100644
--- a/modules/tauri/runtime/nitro.client.ts
+++ b/modules/tauri/runtime/nitro.client.ts
@@ -1,10 +1,10 @@
+import type { FetchResponse } from 'ofetch'
 import {
   createApp,
   createRouter,
   defineLazyEventHandler,
   toNodeListener,
 } from 'h3'
-import type { FetchResponse } from 'ofetch'
 import { createFetch } from 'ofetch'
 import {
   createCall,
diff --git a/modules/tauri/runtime/storage.ts b/modules/tauri/runtime/storage.ts
index f76c0f68..8495d66a 100644
--- a/modules/tauri/runtime/storage.ts
+++ b/modules/tauri/runtime/storage.ts
@@ -1,5 +1,5 @@
-import { createStorage } from 'unstorage'
 import { Store } from 'tauri-plugin-store-api'
+import { createStorage } from 'unstorage'
 
 const store = new Store('.servers.dat')
 const storage = createStorage()
diff --git a/nuxt.config.ts b/nuxt.config.ts
index 4c37693b..02730b0d 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -1,9 +1,9 @@
+import type { BuildInfo } from './types'
 import { createResolver, useNuxt } from '@nuxt/kit'
 import { isCI, isDevelopment, isWindows } from 'std-env'
 import { isPreview } from './config/env'
-import { pwa } from './config/pwa'
-import type { BuildInfo } from './types'
 import { currentLocales } from './config/i18n'
+import { pwa } from './config/pwa'
 
 const { resolve } = createResolver(import.meta.url)
 
diff --git a/package.json b/package.json
index cd308485..02e442e8 100644
--- a/package.json
+++ b/package.json
@@ -113,7 +113,7 @@
     "ws": "^8.15.1"
   },
   "devDependencies": {
-    "@antfu/eslint-config": "^2.27.3",
+    "@antfu/eslint-config": "^3.7.3",
     "@antfu/ni": "^0.23.0",
     "@types/chroma-js": "^2.4.4",
     "@types/file-saver": "^2.0.7",
diff --git a/pages/[[server]]/@[account]/[status].vue b/pages/[[server]]/@[account]/[status].vue
index 8098412e..280b6f05 100644
--- a/pages/[[server]]/@[account]/[status].vue
+++ b/pages/[[server]]/@[account]/[status].vue
@@ -1,7 +1,7 @@
 <script setup lang="ts">
+import type { ComponentPublicInstance } from 'vue'
 // @ts-expect-error missing types
 import { DynamicScroller, DynamicScrollerItem } from 'vue-virtual-scroller'
-import type { ComponentPublicInstance } from 'vue'
 
 definePageMeta({
   name: 'status',
diff --git a/plugins/0.setup-users.ts b/plugins/0.setup-users.ts
index 8d445b69..24bc9e6a 100644
--- a/plugins/0.setup-users.ts
+++ b/plugins/0.setup-users.ts
@@ -1,6 +1,6 @@
 import { useAsyncIDBKeyval } from '~/composables/idb'
-import type { UserLogin } from '~/types'
 import { STORAGE_KEY_USERS } from '~/constants'
+import type { UserLogin } from '~/types'
 
 const mock = process.mock
 
diff --git a/plugins/floating-vue.ts b/plugins/floating-vue.ts
index 09329701..c46d9fe4 100644
--- a/plugins/floating-vue.ts
+++ b/plugins/floating-vue.ts
@@ -1,5 +1,5 @@
-import FloatingVue from 'floating-vue'
 import { defineNuxtPlugin } from '#imports'
+import FloatingVue from 'floating-vue'
 
 export default defineNuxtPlugin((nuxtApp) => {
   nuxtApp.vueApp.use(FloatingVue)
diff --git a/plugins/setup-global-effects.client.ts b/plugins/setup-global-effects.client.ts
index 832dc262..e5eae12d 100644
--- a/plugins/setup-global-effects.client.ts
+++ b/plugins/setup-global-effects.client.ts
@@ -1,6 +1,6 @@
 import type { OldFontSize } from '~/composables/settings'
-import { oldFontSizeMap } from '~/constants/options'
 import { DEFAULT_FONT_SIZE } from '~/constants'
+import { oldFontSizeMap } from '~/constants/options'
 
 export default defineNuxtPlugin(() => {
   const userSettings = useUserSettings()
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b37f9a5c..c4bafaf6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -270,8 +270,8 @@ importers:
         version: 8.18.0
     devDependencies:
       '@antfu/eslint-config':
-        specifier: ^2.27.3
-        version: 2.27.3(@typescript-eslint/utils@8.5.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(@unocss/eslint-plugin@0.62.4(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(@vue/compiler-sfc@3.5.4)(eslint-plugin-format@0.1.2(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vitest@2.1.1(@types/node@20.8.6)(happy-dom@15.0.0)(terser@5.22.0))
+        specifier: ^3.7.3
+        version: 3.7.3(@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(@unocss/eslint-plugin@0.62.4(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(@vue/compiler-sfc@3.5.4)(eslint-plugin-format@0.1.2(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vitest@2.1.1(@types/node@20.8.6)(happy-dom@15.0.0)(terser@5.22.0))
       '@antfu/ni':
         specifier: ^0.23.0
         version: 0.23.0
@@ -377,20 +377,20 @@ packages:
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
 
-  '@antfu/eslint-config@2.27.3':
-    resolution: {integrity: sha512-Y2Vh/LvPAaYoyLwCiZHJ7p76LEIGg6debeUA4Qs+KOrlGuXLQWRmdZlC6SB33UDNzXqkFeaXAlEcYUqvYoiMKA==}
+  '@antfu/eslint-config@3.7.3':
+    resolution: {integrity: sha512-vzhKtzQT+f/xBV8T5U8SFy3D7uAqL2CEcjsJVqtA7F8tdKvGuC/96uWeEKMHk5lRfijgj+xRvb+c4qQn60YlIA==}
     hasBin: true
     peerDependencies:
       '@eslint-react/eslint-plugin': ^1.5.8
       '@prettier/plugin-xml': ^3.4.1
       '@unocss/eslint-plugin': '>=0.50.0'
       astro-eslint-parser: ^1.0.2
-      eslint: '>=8.40.0'
+      eslint: ^9.10.0
       eslint-plugin-astro: ^1.2.0
       eslint-plugin-format: '>=0.1.0'
       eslint-plugin-react-hooks: ^4.6.0
       eslint-plugin-react-refresh: ^0.4.4
-      eslint-plugin-solid: ^0.13.2
+      eslint-plugin-solid: ^0.14.3
       eslint-plugin-svelte: '>=2.35.1'
       prettier-plugin-astro: ^0.13.0
       prettier-plugin-slidev: ^1.0.5
@@ -1101,10 +1101,6 @@ packages:
   '@emoji-mart/data@1.1.2':
     resolution: {integrity: sha512-1HP8BxD2azjqWJvxIaWAMyTySeZY0Osr83ukYjltPVkNXeJvTz7yDrPLBtnrD5uqJ3tg4CcLuuBW09wahqL/fg==}
 
-  '@es-joy/jsdoccomment@0.43.1':
-    resolution: {integrity: sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==}
-    engines: {node: '>=16'}
-
   '@es-joy/jsdoccomment@0.48.0':
     resolution: {integrity: sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==}
     engines: {node: '>=16'}
@@ -1677,6 +1673,10 @@ packages:
     resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
 
+  '@eslint/compat@1.1.1':
+    resolution: {integrity: sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@eslint/config-array@0.18.0':
     resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1693,6 +1693,10 @@ packages:
     resolution: {integrity: sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@eslint/markdown@6.1.1':
+    resolution: {integrity: sha512-Z+1js5AeqidwhNBbnIPM6Fn4eY9D5i1NleamS0UBW6BG0J4lpvhIVOKVIi22kmH5gvxDmHUp5MHkkkjda0TehA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@eslint/object-schema@2.1.4':
     resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2418,31 +2422,8 @@ packages:
   '@socket.io/component-emitter@3.1.0':
     resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==}
 
-  '@stylistic/eslint-plugin-js@2.6.4':
-    resolution: {integrity: sha512-kx1hS3xTvzxZLdr/DCU/dLBE++vcP97sHeEFX2QXhk1Ipa4K1rzPOLw1HCbf4mU3s+7kHP5eYpDe+QteEOFLug==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      eslint: '>=8.40.0'
-
-  '@stylistic/eslint-plugin-jsx@2.6.4':
-    resolution: {integrity: sha512-bIvVhdtjmyu3S10V7QRIuawtCZSq9gRmzAX23ucjCOdSFzEwlq+di0IM0riBAvvQerrJL4SM6G3xgyPs8BSXIA==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      eslint: '>=8.40.0'
-
-  '@stylistic/eslint-plugin-plus@2.6.4':
-    resolution: {integrity: sha512-EuRvtxhf7Hv8OoMIePulP/6rBJIgPTu1l5GAm1780WcF1Cl8bOZXIn84Pdac5pNv6lVlzCOFm8MD3VE+2YROuA==}
-    peerDependencies:
-      eslint: '*'
-
-  '@stylistic/eslint-plugin-ts@2.6.4':
-    resolution: {integrity: sha512-yxL8Hj6WkObw1jfiLpBzKy5yfxY6vwlwO4miq34ySErUjUecPV5jxfVbOe4q1QDPKemQGPq93v7sAQS5PzM8lA==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      eslint: '>=8.40.0'
-
-  '@stylistic/eslint-plugin@2.6.4':
-    resolution: {integrity: sha512-euUGnjzH8EOqEYTGk9dB2OBINp0FX1nuO7/k4fO82zNRBIKZgJoDwTLM4Ce+Om6W1Qmh1PrZjCr4jh4tMEXGPQ==}
+  '@stylistic/eslint-plugin@2.8.0':
+    resolution: {integrity: sha512-Ufvk7hP+bf+pD35R/QfunF793XlSRIC7USr3/EdgduK9j13i2JjmsM0LUz3/foS+jDYp2fzyWZA9N44CPur0Ow==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: '>=8.40.0'
@@ -2617,9 +2598,6 @@ packages:
   '@types/eslint-scope@3.7.6':
     resolution: {integrity: sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==}
 
-  '@types/eslint@8.56.5':
-    resolution: {integrity: sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==}
-
   '@types/eslint@9.6.0':
     resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==}
 
@@ -2650,18 +2628,12 @@ packages:
   '@types/js-yaml@4.0.9':
     resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
 
-  '@types/json-schema@7.0.14':
-    resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==}
-
   '@types/json-schema@7.0.15':
     resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
 
   '@types/jsonfile@6.1.1':
     resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==}
 
-  '@types/mdast@3.0.11':
-    resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==}
-
   '@types/mdast@4.0.3':
     resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==}
 
@@ -2707,8 +2679,8 @@ packages:
   '@types/ws@8.5.12':
     resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==}
 
-  '@typescript-eslint/eslint-plugin@8.3.0':
-    resolution: {integrity: sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==}
+  '@typescript-eslint/eslint-plugin@8.7.0':
+    resolution: {integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
@@ -2718,8 +2690,8 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/parser@8.3.0':
-    resolution: {integrity: sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==}
+  '@typescript-eslint/parser@8.7.0':
+    resolution: {integrity: sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
@@ -2728,16 +2700,16 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/scope-manager@8.3.0':
-    resolution: {integrity: sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@typescript-eslint/scope-manager@8.5.0':
     resolution: {integrity: sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/type-utils@8.3.0':
-    resolution: {integrity: sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==}
+  '@typescript-eslint/scope-manager@8.7.0':
+    resolution: {integrity: sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/type-utils@8.7.0':
+    resolution: {integrity: sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: '*'
@@ -2745,26 +2717,13 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/types@7.5.0':
-    resolution: {integrity: sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==}
-    engines: {node: ^18.18.0 || >=20.0.0}
-
-  '@typescript-eslint/types@8.3.0':
-    resolution: {integrity: sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@typescript-eslint/types@8.5.0':
     resolution: {integrity: sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/typescript-estree@8.3.0':
-    resolution: {integrity: sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==}
+  '@typescript-eslint/types@8.7.0':
+    resolution: {integrity: sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
 
   '@typescript-eslint/typescript-estree@8.5.0':
     resolution: {integrity: sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==}
@@ -2775,11 +2734,14 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/utils@8.3.0':
-    resolution: {integrity: sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==}
+  '@typescript-eslint/typescript-estree@8.7.0':
+    resolution: {integrity: sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
-      eslint: ^8.57.0 || ^9.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
 
   '@typescript-eslint/utils@8.5.0':
     resolution: {integrity: sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==}
@@ -2787,14 +2749,20 @@ packages:
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
 
-  '@typescript-eslint/visitor-keys@8.3.0':
-    resolution: {integrity: sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==}
+  '@typescript-eslint/utils@8.7.0':
+    resolution: {integrity: sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
 
   '@typescript-eslint/visitor-keys@8.5.0':
     resolution: {integrity: sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@typescript-eslint/visitor-keys@8.7.0':
+    resolution: {integrity: sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@ungap/structured-clone@1.2.0':
     resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
 
@@ -2983,8 +2951,8 @@ packages:
       vite: ^5.0.0
       vue: ^3.5.4
 
-  '@vitest/eslint-plugin@1.0.5':
-    resolution: {integrity: sha512-F4zlKv5S/aG3kiFyJHbkbInKfGuIs3muDnpNfr62g8tV0ALbP/MYjLKWN92olLCtWUb2cKl0pew0gKkkoHEUqw==}
+  '@vitest/eslint-plugin@1.1.4':
+    resolution: {integrity: sha512-kudjgefmJJ7xQ2WfbUU6pZbm7Ou4gLYRaao/8Ynide3G0QhVKHd978sDyWX4KOH0CCMH9cyrGAkFd55eGzJ48Q==}
     peerDependencies:
       '@typescript-eslint/utils': '>= 8.0'
       eslint: '>= 8.57.0'
@@ -3816,21 +3784,12 @@ packages:
   character-entities-html4@2.1.0:
     resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
 
-  character-entities-legacy@1.1.4:
-    resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
-
   character-entities-legacy@3.0.0:
     resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
 
-  character-entities@1.2.4:
-    resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
-
   character-entities@2.0.2:
     resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
 
-  character-reference-invalid@1.1.4:
-    resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
-
   character-reference-invalid@2.0.1:
     resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
 
@@ -4449,11 +4408,13 @@ packages:
     peerDependencies:
       eslint: '>=6.0.0'
 
-  eslint-config-flat-gitignore@0.1.8:
-    resolution: {integrity: sha512-OEUbS2wzzYtUfshjOqzFo4Bl4lHykXUdM08TCnYNl7ki+niW4Q1R0j0FDFDr0vjVsI5ZFOz5LvluxOP+Ew+dYw==}
+  eslint-config-flat-gitignore@0.3.0:
+    resolution: {integrity: sha512-0Ndxo4qGhcewjTzw52TK06Mc00aDtHNTdeeW2JfONgDcLkRO/n/BteMRzNVpLQYxdCC/dFEilfM9fjjpGIJ9Og==}
+    peerDependencies:
+      eslint: ^9.5.0
 
-  eslint-flat-config-utils@0.3.1:
-    resolution: {integrity: sha512-eFT3EaoJN1hlN97xw4FIEX//h0TiFUobgl2l5uLkIwhVN9ahGq95Pbs+i1/B5UACA78LO3rco3JzuvxLdTUOPA==}
+  eslint-flat-config-utils@0.4.0:
+    resolution: {integrity: sha512-kfd5kQZC+BMO0YwTol6zxjKX1zAsk8JfSAopbKjKqmENTJcew+yBejuvccAg37cvOrN0Mh+DVbeyznuNWEjt4A==}
 
   eslint-formatting-reporter@0.0.0:
     resolution: {integrity: sha512-k9RdyTqxqN/wNYVaTk/ds5B5rA8lgoAmvceYN7bcZMBwU7TuXx5ntewJv81eF3pIL/CiJE+pJZm36llG8yhyyw==}
@@ -4471,13 +4432,13 @@ packages:
   eslint-parser-plain@0.1.0:
     resolution: {integrity: sha512-oOeA6FWU0UJT/Rxc3XF5Cq0nbIZbylm7j8+plqq0CZoE6m4u32OXJrR+9iy4srGMmF6v6pmgvP1zPxSRIGh3sg==}
 
-  eslint-plugin-antfu@2.3.6:
-    resolution: {integrity: sha512-31VwbU1Yd4BFNUUPQEazKyP79f3c+ohJtq5iZIuw38JjkRQdQAcF/31Kjr0DOKZXVDkeeNPrttKidrr3xhnhOA==}
+  eslint-plugin-antfu@2.7.0:
+    resolution: {integrity: sha512-gZM3jq3ouqaoHmUNszb1Zo2Ux7RckSvkGksjLWz9ipBYGSv1EwwBETN6AdiUXn+RpVHXTbEMPAPlXJazcA6+iA==}
     peerDependencies:
       eslint: '*'
 
-  eslint-plugin-command@0.2.3:
-    resolution: {integrity: sha512-1bBYNfjZg60N2ZpLV5ATYSYyueIJ+zl5yKrTs0UFDdnyu07dNSZ7Xplnc+Wb6SXTdc1sIaoIrnuyhvztcltX6A==}
+  eslint-plugin-command@0.2.6:
+    resolution: {integrity: sha512-T0bHZ1oblW1xUHUVoBKZJR2osSNNGkfZuK4iqboNwuNS/M7tdp3pmURaJtTi/XDzitxaQ02lvOdFH0mUd5QLvQ==}
     peerDependencies:
       eslint: '*'
 
@@ -4492,14 +4453,14 @@ packages:
     peerDependencies:
       eslint: ^8.40.0 || ^9.0.0
 
-  eslint-plugin-import-x@4.0.0:
-    resolution: {integrity: sha512-5bWZ+2p3DKlpLSP830cAUmRUoYEnnvuBmSOSlURffEUuXL68uQUX0v2JpoXxyoDRIQWApzbqhnFeHA0XoQWosA==}
+  eslint-plugin-import-x@4.3.1:
+    resolution: {integrity: sha512-5TriWkXulDl486XnYYRgsL+VQoS/7mhN/2ci02iLCuL7gdhbiWxnsuL/NTcaKY9fpMgsMFjWZBtIGW7pb+RX0g==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
 
-  eslint-plugin-jsdoc@50.2.2:
-    resolution: {integrity: sha512-i0ZMWA199DG7sjxlzXn5AeYZxpRfMJjDPUl7lL9eJJX8TPRoIaxJU4ys/joP5faM5AXE1eqW/dslCj3uj4Nqpg==}
+  eslint-plugin-jsdoc@50.3.0:
+    resolution: {integrity: sha512-P7qDB/RckdKETpBM4CtjHRQ5qXByPmFhRi86sN3E+J+tySchq+RSOGGhI2hDIefmmKFuTi/1ACjqsnDJDDDfzg==}
     engines: {node: '>=18'}
     peerDependencies:
       eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
@@ -4510,14 +4471,8 @@ packages:
     peerDependencies:
       eslint: '>=6.0.0'
 
-  eslint-plugin-markdown@5.1.0:
-    resolution: {integrity: sha512-SJeyKko1K6GwI0AN6xeCDToXDkfKZfXcexA6B+O2Wr2btUS9GrC+YgwSyVli5DJnctUHjFXcQ2cqTaAmVoLi2A==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      eslint: '>=8'
-
-  eslint-plugin-n@17.10.2:
-    resolution: {integrity: sha512-e+s4eAf5NtJaxPhTNu3qMO0Iz40WANS93w9LQgYcvuljgvDmWi/a3rh+OrNyMHeng6aOWGJO0rCg5lH4zi8yTw==}
+  eslint-plugin-n@17.10.3:
+    resolution: {integrity: sha512-ySZBfKe49nQZWR1yFaA0v/GsH6Fgp8ah6XV0WDz6CN8WO0ek4McMzb7A2xnf4DCYV43frjCygvb9f/wx7UUxRw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: '>=8.23.0'
@@ -4526,14 +4481,14 @@ packages:
     resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==}
     engines: {node: '>=5.0.0'}
 
-  eslint-plugin-perfectionist@3.2.0:
-    resolution: {integrity: sha512-cX1aztMbSfRWPKJH8CD+gadrbkS+RNH1OGWuNGws8J6rHzYYhawxWTU/yzMYjq2IRJCpBCfhgfa7BHRXQYxLHA==}
+  eslint-plugin-perfectionist@3.7.0:
+    resolution: {integrity: sha512-pemhfcR3LDbYVWeveHok9u048yR7GpsnfyPvn6RsDkp/UV7iqBV0y5K0aGb9ZJMsemOyWok7akxGzPLsz+mHKQ==}
     engines: {node: ^18.0.0 || >=20.0.0}
     peerDependencies:
       astro-eslint-parser: ^1.0.2
       eslint: '>=8.0.0'
       svelte: '>=3.0.0'
-      svelte-eslint-parser: ^0.41.0
+      svelte-eslint-parser: ^0.41.1
       vue-eslint-parser: '>=9.0.0'
     peerDependenciesMeta:
       astro-eslint-parser:
@@ -4563,8 +4518,8 @@ packages:
     peerDependencies:
       eslint: '>=8.56.0'
 
-  eslint-plugin-unused-imports@4.1.3:
-    resolution: {integrity: sha512-lqrNZIZjFMUr7P06eoKtQLwyVRibvG7N+LtfKtObYGizAAGrcqLkc3tDx+iAik2z7q0j/XI3ihjupIqxhFabFA==}
+  eslint-plugin-unused-imports@4.1.4:
+    resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==}
     peerDependencies:
       '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0
       eslint: ^9.0.0 || ^8.0.0
@@ -4572,8 +4527,8 @@ packages:
       '@typescript-eslint/eslint-plugin':
         optional: true
 
-  eslint-plugin-vue@9.27.0:
-    resolution: {integrity: sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==}
+  eslint-plugin-vue@9.28.0:
+    resolution: {integrity: sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==}
     engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
@@ -5181,15 +5136,9 @@ packages:
     resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
 
-  is-alphabetical@1.0.4:
-    resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
-
   is-alphabetical@2.0.1:
     resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
 
-  is-alphanumerical@1.0.4:
-    resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
-
   is-alphanumerical@2.0.1:
     resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
 
@@ -5235,9 +5184,6 @@ packages:
     resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
     engines: {node: '>= 0.4'}
 
-  is-decimal@1.0.4:
-    resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
-
   is-decimal@2.0.1:
     resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
 
@@ -5279,9 +5225,6 @@ packages:
     resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
     engines: {node: '>=0.10.0'}
 
-  is-hexadecimal@1.0.4:
-    resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
-
   is-hexadecimal@2.0.1:
     resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
 
@@ -5447,10 +5390,6 @@ packages:
     resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
     hasBin: true
 
-  jsdoc-type-pratt-parser@4.0.0:
-    resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==}
-    engines: {node: '>=12.0.0'}
-
   jsdoc-type-pratt-parser@4.1.0:
     resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==}
     engines: {node: '>=12.0.0'}
@@ -5684,12 +5623,12 @@ packages:
   mdast-util-find-and-replace@3.0.1:
     resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
 
-  mdast-util-from-markdown@0.8.5:
-    resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==}
-
   mdast-util-from-markdown@2.0.0:
     resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==}
 
+  mdast-util-from-markdown@2.0.1:
+    resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==}
+
   mdast-util-gfm-autolink-literal@2.0.0:
     resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==}
 
@@ -5717,9 +5656,6 @@ packages:
   mdast-util-to-markdown@2.1.0:
     resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==}
 
-  mdast-util-to-string@2.0.0:
-    resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==}
-
   mdast-util-to-string@4.0.0:
     resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
 
@@ -5820,9 +5756,6 @@ packages:
   micromark-util-types@2.0.0:
     resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
 
-  micromark@2.11.4:
-    resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==}
-
   micromark@4.0.0:
     resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
 
@@ -5865,10 +5798,6 @@ packages:
     resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
     engines: {node: '>=4'}
 
-  minimatch@10.0.1:
-    resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
-    engines: {node: 20 || >=22}
-
   minimatch@3.1.2:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
 
@@ -6215,9 +6144,6 @@ packages:
     resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
     engines: {node: '>=6'}
 
-  parse-entities@2.0.0:
-    resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
-
   parse-entities@4.0.1:
     resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
 
@@ -7605,9 +7531,6 @@ packages:
   unist-util-position@5.0.0:
     resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
 
-  unist-util-stringify-position@2.0.3:
-    resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==}
-
   unist-util-stringify-position@4.0.0:
     resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
 
@@ -8269,40 +8192,40 @@ snapshots:
       '@jridgewell/gen-mapping': 0.3.5
       '@jridgewell/trace-mapping': 0.3.25
 
-  '@antfu/eslint-config@2.27.3(@typescript-eslint/utils@8.5.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(@unocss/eslint-plugin@0.62.4(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(@vue/compiler-sfc@3.5.4)(eslint-plugin-format@0.1.2(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vitest@2.1.1(@types/node@20.8.6)(happy-dom@15.0.0)(terser@5.22.0))':
+  '@antfu/eslint-config@3.7.3(@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(@unocss/eslint-plugin@0.62.4(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(@vue/compiler-sfc@3.5.4)(eslint-plugin-format@0.1.2(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vitest@2.1.1(@types/node@20.8.6)(happy-dom@15.0.0)(terser@5.22.0))':
     dependencies:
       '@antfu/install-pkg': 0.4.1
       '@clack/prompts': 0.7.0
       '@eslint-community/eslint-plugin-eslint-comments': 4.4.0(eslint@9.11.1(jiti@1.21.6))
-      '@stylistic/eslint-plugin': 2.6.4(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
-      '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
-      '@typescript-eslint/parser': 8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
-      '@vitest/eslint-plugin': 1.0.5(@typescript-eslint/utils@8.5.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vitest@2.1.1(@types/node@20.8.6)(happy-dom@15.0.0)(terser@5.22.0))
+      '@eslint/markdown': 6.1.1
+      '@stylistic/eslint-plugin': 2.8.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@vitest/eslint-plugin': 1.1.4(@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vitest@2.1.1(@types/node@20.8.6)(happy-dom@15.0.0)(terser@5.22.0))
       eslint: 9.11.1(jiti@1.21.6)
-      eslint-config-flat-gitignore: 0.1.8
-      eslint-flat-config-utils: 0.3.1
+      eslint-config-flat-gitignore: 0.3.0(eslint@9.11.1(jiti@1.21.6))
+      eslint-flat-config-utils: 0.4.0
       eslint-merge-processors: 0.1.0(eslint@9.11.1(jiti@1.21.6))
-      eslint-plugin-antfu: 2.3.6(eslint@9.11.1(jiti@1.21.6))
-      eslint-plugin-command: 0.2.3(eslint@9.11.1(jiti@1.21.6))
-      eslint-plugin-import-x: 4.0.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
-      eslint-plugin-jsdoc: 50.2.2(eslint@9.11.1(jiti@1.21.6))
+      eslint-plugin-antfu: 2.7.0(eslint@9.11.1(jiti@1.21.6))
+      eslint-plugin-command: 0.2.6(eslint@9.11.1(jiti@1.21.6))
+      eslint-plugin-import-x: 4.3.1(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      eslint-plugin-jsdoc: 50.3.0(eslint@9.11.1(jiti@1.21.6))
       eslint-plugin-jsonc: 2.16.0(eslint@9.11.1(jiti@1.21.6))
-      eslint-plugin-markdown: 5.1.0(eslint@9.11.1(jiti@1.21.6))
-      eslint-plugin-n: 17.10.2(eslint@9.11.1(jiti@1.21.6))
+      eslint-plugin-n: 17.10.3(eslint@9.11.1(jiti@1.21.6))
       eslint-plugin-no-only-tests: 3.3.0
-      eslint-plugin-perfectionist: 3.2.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vue-eslint-parser@9.4.3(eslint@9.11.1(jiti@1.21.6)))
+      eslint-plugin-perfectionist: 3.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vue-eslint-parser@9.4.3(eslint@9.11.1(jiti@1.21.6)))
       eslint-plugin-regexp: 2.6.0(eslint@9.11.1(jiti@1.21.6))
       eslint-plugin-toml: 0.11.1(eslint@9.11.1(jiti@1.21.6))
       eslint-plugin-unicorn: 55.0.0(eslint@9.11.1(jiti@1.21.6))
-      eslint-plugin-unused-imports: 4.1.3(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))
-      eslint-plugin-vue: 9.27.0(eslint@9.11.1(jiti@1.21.6))
+      eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))
+      eslint-plugin-vue: 9.28.0(eslint@9.11.1(jiti@1.21.6))
       eslint-plugin-yml: 1.14.0(eslint@9.11.1(jiti@1.21.6))
       eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.5.4)(eslint@9.11.1(jiti@1.21.6))
       globals: 15.9.0
       jsonc-eslint-parser: 2.4.0
       local-pkg: 0.5.0
       parse-gitignore: 2.0.0
-      picocolors: 1.0.1
+      picocolors: 1.1.0
       toml-eslint-parser: 0.10.0
       vue-eslint-parser: 9.4.3(eslint@9.11.1(jiti@1.21.6))
       yaml-eslint-parser: 1.2.3
@@ -9143,13 +9066,13 @@ snapshots:
 
   '@clack/core@0.3.4':
     dependencies:
-      picocolors: 1.0.1
+      picocolors: 1.1.0
       sisteransi: 1.0.5
 
   '@clack/prompts@0.7.0':
     dependencies:
       '@clack/core': 0.3.4
-      picocolors: 1.0.1
+      picocolors: 1.1.0
       sisteransi: 1.0.5
 
   '@cloudflare/kv-asset-handler@0.3.4':
@@ -9180,15 +9103,6 @@ snapshots:
 
   '@emoji-mart/data@1.1.2': {}
 
-  '@es-joy/jsdoccomment@0.43.1':
-    dependencies:
-      '@types/eslint': 8.56.5
-      '@types/estree': 1.0.5
-      '@typescript-eslint/types': 7.5.0
-      comment-parser: 1.4.1
-      esquery: 1.6.0
-      jsdoc-type-pratt-parser: 4.0.0
-
   '@es-joy/jsdoccomment@0.48.0':
     dependencies:
       comment-parser: 1.4.1
@@ -9484,6 +9398,8 @@ snapshots:
 
   '@eslint-community/regexpp@4.11.0': {}
 
+  '@eslint/compat@1.1.1': {}
+
   '@eslint/config-array@0.18.0':
     dependencies:
       '@eslint/object-schema': 2.1.4
@@ -9510,6 +9426,15 @@ snapshots:
 
   '@eslint/js@9.11.1': {}
 
+  '@eslint/markdown@6.1.1':
+    dependencies:
+      '@eslint/plugin-kit': 0.2.0
+      mdast-util-from-markdown: 2.0.1
+      mdast-util-gfm: 3.0.0
+      micromark-extension-gfm: 3.0.0
+    transitivePeerDependencies:
+      - supports-color
+
   '@eslint/object-schema@2.1.4': {}
 
   '@eslint/plugin-kit@0.2.0':
@@ -11006,47 +10931,14 @@ snapshots:
 
   '@socket.io/component-emitter@3.1.0': {}
 
-  '@stylistic/eslint-plugin-js@2.6.4(eslint@9.11.1(jiti@1.21.6))':
+  '@stylistic/eslint-plugin@2.8.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
     dependencies:
-      '@types/eslint': 9.6.0
-      acorn: 8.12.1
-      eslint: 9.11.1(jiti@1.21.6)
-      eslint-visitor-keys: 4.0.0
-      espree: 10.1.0
-
-  '@stylistic/eslint-plugin-jsx@2.6.4(eslint@9.11.1(jiti@1.21.6))':
-    dependencies:
-      '@stylistic/eslint-plugin-js': 2.6.4(eslint@9.11.1(jiti@1.21.6))
-      '@types/eslint': 9.6.0
+      '@typescript-eslint/utils': 8.5.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
       eslint: 9.11.1(jiti@1.21.6)
       eslint-visitor-keys: 4.0.0
       espree: 10.1.0
       estraverse: 5.3.0
       picomatch: 4.0.2
-
-  '@stylistic/eslint-plugin-plus@2.6.4(eslint@9.11.1(jiti@1.21.6))':
-    dependencies:
-      '@types/eslint': 9.6.0
-      eslint: 9.11.1(jiti@1.21.6)
-
-  '@stylistic/eslint-plugin-ts@2.6.4(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
-    dependencies:
-      '@stylistic/eslint-plugin-js': 2.6.4(eslint@9.11.1(jiti@1.21.6))
-      '@types/eslint': 9.6.0
-      '@typescript-eslint/utils': 8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
-      eslint: 9.11.1(jiti@1.21.6)
-    transitivePeerDependencies:
-      - supports-color
-      - typescript
-
-  '@stylistic/eslint-plugin@2.6.4(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
-    dependencies:
-      '@stylistic/eslint-plugin-js': 2.6.4(eslint@9.11.1(jiti@1.21.6))
-      '@stylistic/eslint-plugin-jsx': 2.6.4(eslint@9.11.1(jiti@1.21.6))
-      '@stylistic/eslint-plugin-plus': 2.6.4(eslint@9.11.1(jiti@1.21.6))
-      '@stylistic/eslint-plugin-ts': 2.6.4(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
-      '@types/eslint': 9.6.0
-      eslint: 9.11.1(jiti@1.21.6)
     transitivePeerDependencies:
       - supports-color
       - typescript
@@ -11238,17 +11130,12 @@ snapshots:
   '@types/eslint-scope@3.7.6':
     dependencies:
       '@types/eslint': 9.6.0
-      '@types/estree': 1.0.5
-
-  '@types/eslint@8.56.5':
-    dependencies:
-      '@types/estree': 1.0.5
-      '@types/json-schema': 7.0.14
+      '@types/estree': 1.0.6
 
   '@types/eslint@9.6.0':
     dependencies:
-      '@types/estree': 1.0.5
-      '@types/json-schema': 7.0.14
+      '@types/estree': 1.0.6
+      '@types/json-schema': 7.0.15
 
   '@types/estree@0.0.39': {}
 
@@ -11275,18 +11162,12 @@ snapshots:
 
   '@types/js-yaml@4.0.9': {}
 
-  '@types/json-schema@7.0.14': {}
-
   '@types/json-schema@7.0.15': {}
 
   '@types/jsonfile@6.1.1':
     dependencies:
       '@types/node': 20.8.6
 
-  '@types/mdast@3.0.11':
-    dependencies:
-      '@types/unist': 3.0.2
-
   '@types/mdast@4.0.3':
     dependencies:
       '@types/unist': 3.0.2
@@ -11323,14 +11204,14 @@ snapshots:
     dependencies:
       '@types/node': 20.8.6
 
-  '@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
+  '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
     dependencies:
       '@eslint-community/regexpp': 4.11.0
-      '@typescript-eslint/parser': 8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
-      '@typescript-eslint/scope-manager': 8.3.0
-      '@typescript-eslint/type-utils': 8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
-      '@typescript-eslint/utils': 8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
-      '@typescript-eslint/visitor-keys': 8.3.0
+      '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@typescript-eslint/scope-manager': 8.7.0
+      '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@typescript-eslint/visitor-keys': 8.7.0
       eslint: 9.11.1(jiti@1.21.6)
       graphemer: 1.4.0
       ignore: 5.3.2
@@ -11341,12 +11222,12 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
+  '@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
     dependencies:
-      '@typescript-eslint/scope-manager': 8.3.0
-      '@typescript-eslint/types': 8.3.0
-      '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.2)
-      '@typescript-eslint/visitor-keys': 8.3.0
+      '@typescript-eslint/scope-manager': 8.7.0
+      '@typescript-eslint/types': 8.7.0
+      '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2)
+      '@typescript-eslint/visitor-keys': 8.7.0
       debug: 4.3.6
       eslint: 9.11.1(jiti@1.21.6)
     optionalDependencies:
@@ -11354,20 +11235,20 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/scope-manager@8.3.0':
-    dependencies:
-      '@typescript-eslint/types': 8.3.0
-      '@typescript-eslint/visitor-keys': 8.3.0
-
   '@typescript-eslint/scope-manager@8.5.0':
     dependencies:
       '@typescript-eslint/types': 8.5.0
       '@typescript-eslint/visitor-keys': 8.5.0
 
-  '@typescript-eslint/type-utils@8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
+  '@typescript-eslint/scope-manager@8.7.0':
     dependencies:
-      '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.2)
-      '@typescript-eslint/utils': 8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@typescript-eslint/types': 8.7.0
+      '@typescript-eslint/visitor-keys': 8.7.0
+
+  '@typescript-eslint/type-utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
+    dependencies:
+      '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2)
+      '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
       debug: 4.3.6
       ts-api-utils: 1.3.0(typescript@5.6.2)
     optionalDependencies:
@@ -11376,26 +11257,9 @@ snapshots:
       - eslint
       - supports-color
 
-  '@typescript-eslint/types@7.5.0': {}
-
-  '@typescript-eslint/types@8.3.0': {}
-
   '@typescript-eslint/types@8.5.0': {}
 
-  '@typescript-eslint/typescript-estree@8.3.0(typescript@5.6.2)':
-    dependencies:
-      '@typescript-eslint/types': 8.3.0
-      '@typescript-eslint/visitor-keys': 8.3.0
-      debug: 4.3.6
-      fast-glob: 3.3.2
-      is-glob: 4.0.3
-      minimatch: 9.0.5
-      semver: 7.6.3
-      ts-api-utils: 1.3.0(typescript@5.6.2)
-    optionalDependencies:
-      typescript: 5.6.2
-    transitivePeerDependencies:
-      - supports-color
+  '@typescript-eslint/types@8.7.0': {}
 
   '@typescript-eslint/typescript-estree@8.5.0(typescript@5.6.2)':
     dependencies:
@@ -11412,16 +11276,20 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
+  '@typescript-eslint/typescript-estree@8.7.0(typescript@5.6.2)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6))
-      '@typescript-eslint/scope-manager': 8.3.0
-      '@typescript-eslint/types': 8.3.0
-      '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.2)
-      eslint: 9.11.1(jiti@1.21.6)
+      '@typescript-eslint/types': 8.7.0
+      '@typescript-eslint/visitor-keys': 8.7.0
+      debug: 4.3.6
+      fast-glob: 3.3.2
+      is-glob: 4.0.3
+      minimatch: 9.0.5
+      semver: 7.6.3
+      ts-api-utils: 1.3.0(typescript@5.6.2)
+    optionalDependencies:
+      typescript: 5.6.2
     transitivePeerDependencies:
       - supports-color
-      - typescript
 
   '@typescript-eslint/utils@8.5.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
     dependencies:
@@ -11434,16 +11302,27 @@ snapshots:
       - supports-color
       - typescript
 
-  '@typescript-eslint/visitor-keys@8.3.0':
+  '@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
     dependencies:
-      '@typescript-eslint/types': 8.3.0
-      eslint-visitor-keys: 3.4.3
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6))
+      '@typescript-eslint/scope-manager': 8.7.0
+      '@typescript-eslint/types': 8.7.0
+      '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2)
+      eslint: 9.11.1(jiti@1.21.6)
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
 
   '@typescript-eslint/visitor-keys@8.5.0':
     dependencies:
       '@typescript-eslint/types': 8.5.0
       eslint-visitor-keys: 3.4.3
 
+  '@typescript-eslint/visitor-keys@8.7.0':
+    dependencies:
+      '@typescript-eslint/types': 8.7.0
+      eslint-visitor-keys: 3.4.3
+
   '@ungap/structured-clone@1.2.0': {}
 
   '@unhead/dom@1.11.2':
@@ -11798,11 +11677,11 @@ snapshots:
       vite: 5.4.5(@types/node@20.8.6)(terser@5.22.0)
       vue: 3.5.4(typescript@5.6.2)
 
-  '@vitest/eslint-plugin@1.0.5(@typescript-eslint/utils@8.5.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vitest@2.1.1(@types/node@20.8.6)(happy-dom@15.0.0)(terser@5.22.0))':
+  '@vitest/eslint-plugin@1.1.4(@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vitest@2.1.1(@types/node@20.8.6)(happy-dom@15.0.0)(terser@5.22.0))':
     dependencies:
       eslint: 9.11.1(jiti@1.21.6)
     optionalDependencies:
-      '@typescript-eslint/utils': 8.5.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
       typescript: 5.6.2
       vitest: 2.1.1(@types/node@20.8.6)(happy-dom@15.0.0)(terser@5.22.0)
 
@@ -12964,16 +12843,10 @@ snapshots:
 
   character-entities-html4@2.1.0: {}
 
-  character-entities-legacy@1.1.4: {}
-
   character-entities-legacy@3.0.0: {}
 
-  character-entities@1.2.4: {}
-
   character-entities@2.0.2: {}
 
-  character-reference-invalid@1.1.4: {}
-
   character-reference-invalid@2.0.1: {}
 
   charenc@0.0.2: {}
@@ -13650,14 +13523,14 @@ snapshots:
       eslint: 9.11.1(jiti@1.21.6)
       semver: 7.6.3
 
-  eslint-config-flat-gitignore@0.1.8:
+  eslint-config-flat-gitignore@0.3.0(eslint@9.11.1(jiti@1.21.6)):
     dependencies:
+      '@eslint/compat': 1.1.1
+      eslint: 9.11.1(jiti@1.21.6)
       find-up-simple: 1.0.0
-      parse-gitignore: 2.0.0
 
-  eslint-flat-config-utils@0.3.1:
+  eslint-flat-config-utils@0.4.0:
     dependencies:
-      '@types/eslint': 9.6.0
       pathe: 1.1.2
 
   eslint-formatting-reporter@0.0.0(eslint@9.11.1(jiti@1.21.6)):
@@ -13679,14 +13552,14 @@ snapshots:
 
   eslint-parser-plain@0.1.0: {}
 
-  eslint-plugin-antfu@2.3.6(eslint@9.11.1(jiti@1.21.6)):
+  eslint-plugin-antfu@2.7.0(eslint@9.11.1(jiti@1.21.6)):
     dependencies:
       '@antfu/utils': 0.7.10
       eslint: 9.11.1(jiti@1.21.6)
 
-  eslint-plugin-command@0.2.3(eslint@9.11.1(jiti@1.21.6)):
+  eslint-plugin-command@0.2.6(eslint@9.11.1(jiti@1.21.6)):
     dependencies:
-      '@es-joy/jsdoccomment': 0.43.1
+      '@es-joy/jsdoccomment': 0.48.0
       eslint: 9.11.1(jiti@1.21.6)
 
   eslint-plugin-es-x@7.5.0(eslint@9.11.1(jiti@1.21.6)):
@@ -13707,10 +13580,9 @@ snapshots:
       prettier: 3.3.3
       synckit: 0.9.1
 
-  eslint-plugin-import-x@4.0.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
+  eslint-plugin-import-x@4.3.1(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
     dependencies:
-      '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.2)
-      '@typescript-eslint/utils': 8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@typescript-eslint/utils': 8.5.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
       debug: 4.3.6
       doctrine: 3.0.0
       eslint: 9.11.1(jiti@1.21.6)
@@ -13725,7 +13597,7 @@ snapshots:
       - supports-color
       - typescript
 
-  eslint-plugin-jsdoc@50.2.2(eslint@9.11.1(jiti@1.21.6)):
+  eslint-plugin-jsdoc@50.3.0(eslint@9.11.1(jiti@1.21.6)):
     dependencies:
       '@es-joy/jsdoccomment': 0.48.0
       are-docs-informative: 0.0.2
@@ -13753,14 +13625,7 @@ snapshots:
       natural-compare: 1.4.0
       synckit: 0.6.2
 
-  eslint-plugin-markdown@5.1.0(eslint@9.11.1(jiti@1.21.6)):
-    dependencies:
-      eslint: 9.11.1(jiti@1.21.6)
-      mdast-util-from-markdown: 0.8.5
-    transitivePeerDependencies:
-      - supports-color
-
-  eslint-plugin-n@17.10.2(eslint@9.11.1(jiti@1.21.6)):
+  eslint-plugin-n@17.10.3(eslint@9.11.1(jiti@1.21.6)):
     dependencies:
       '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6))
       enhanced-resolve: 5.17.1
@@ -13774,12 +13639,12 @@ snapshots:
 
   eslint-plugin-no-only-tests@3.3.0: {}
 
-  eslint-plugin-perfectionist@3.2.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vue-eslint-parser@9.4.3(eslint@9.11.1(jiti@1.21.6))):
+  eslint-plugin-perfectionist@3.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)(vue-eslint-parser@9.4.3(eslint@9.11.1(jiti@1.21.6))):
     dependencies:
-      '@typescript-eslint/types': 8.3.0
-      '@typescript-eslint/utils': 8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@typescript-eslint/types': 8.7.0
+      '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
       eslint: 9.11.1(jiti@1.21.6)
-      minimatch: 10.0.1
+      minimatch: 9.0.5
       natural-compare-lite: 1.4.0
     optionalDependencies:
       vue-eslint-parser: 9.4.3(eslint@9.11.1(jiti@1.21.6))
@@ -13828,13 +13693,13 @@ snapshots:
       semver: 7.6.3
       strip-indent: 3.0.0
 
-  eslint-plugin-unused-imports@4.1.3(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6)):
+  eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6)):
     dependencies:
       eslint: 9.11.1(jiti@1.21.6)
     optionalDependencies:
-      '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+      '@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
 
-  eslint-plugin-vue@9.27.0(eslint@9.11.1(jiti@1.21.6)):
+  eslint-plugin-vue@9.28.0(eslint@9.11.1(jiti@1.21.6)):
     dependencies:
       '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6))
       eslint: 9.11.1(jiti@1.21.6)
@@ -14562,15 +14427,8 @@ snapshots:
 
   is-absolute-url@4.0.1: {}
 
-  is-alphabetical@1.0.4: {}
-
   is-alphabetical@2.0.1: {}
 
-  is-alphanumerical@1.0.4:
-    dependencies:
-      is-alphabetical: 1.0.4
-      is-decimal: 1.0.4
-
   is-alphanumerical@2.0.1:
     dependencies:
       is-alphabetical: 2.0.1
@@ -14620,8 +14478,6 @@ snapshots:
     dependencies:
       has-tostringtag: 1.0.0
 
-  is-decimal@1.0.4: {}
-
   is-decimal@2.0.1: {}
 
   is-docker@2.2.1: {}
@@ -14650,8 +14506,6 @@ snapshots:
     dependencies:
       is-extglob: 2.1.1
 
-  is-hexadecimal@1.0.4: {}
-
   is-hexadecimal@2.0.1: {}
 
   is-https@4.0.0: {}
@@ -14799,8 +14653,6 @@ snapshots:
     dependencies:
       argparse: 2.0.1
 
-  jsdoc-type-pratt-parser@4.0.0: {}
-
   jsdoc-type-pratt-parser@4.1.0: {}
 
   jsesc@0.5.0: {}
@@ -15062,17 +14914,24 @@ snapshots:
       unist-util-is: 6.0.0
       unist-util-visit-parents: 6.0.1
 
-  mdast-util-from-markdown@0.8.5:
+  mdast-util-from-markdown@2.0.0:
     dependencies:
-      '@types/mdast': 3.0.11
-      mdast-util-to-string: 2.0.0
-      micromark: 2.11.4
-      parse-entities: 2.0.0
-      unist-util-stringify-position: 2.0.3
+      '@types/mdast': 4.0.3
+      '@types/unist': 3.0.2
+      decode-named-character-reference: 1.0.2
+      devlop: 1.1.0
+      mdast-util-to-string: 4.0.0
+      micromark: 4.0.0
+      micromark-util-decode-numeric-character-reference: 2.0.1
+      micromark-util-decode-string: 2.0.0
+      micromark-util-normalize-identifier: 2.0.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+      unist-util-stringify-position: 4.0.0
     transitivePeerDependencies:
       - supports-color
 
-  mdast-util-from-markdown@2.0.0:
+  mdast-util-from-markdown@2.0.1:
     dependencies:
       '@types/mdast': 4.0.3
       '@types/unist': 3.0.2
@@ -15101,7 +14960,7 @@ snapshots:
     dependencies:
       '@types/mdast': 4.0.3
       devlop: 1.1.0
-      mdast-util-from-markdown: 2.0.0
+      mdast-util-from-markdown: 2.0.1
       mdast-util-to-markdown: 2.1.0
       micromark-util-normalize-identifier: 2.0.0
     transitivePeerDependencies:
@@ -15110,7 +14969,7 @@ snapshots:
   mdast-util-gfm-strikethrough@2.0.0:
     dependencies:
       '@types/mdast': 4.0.3
-      mdast-util-from-markdown: 2.0.0
+      mdast-util-from-markdown: 2.0.1
       mdast-util-to-markdown: 2.1.0
     transitivePeerDependencies:
       - supports-color
@@ -15120,7 +14979,7 @@ snapshots:
       '@types/mdast': 4.0.3
       devlop: 1.1.0
       markdown-table: 3.0.3
-      mdast-util-from-markdown: 2.0.0
+      mdast-util-from-markdown: 2.0.1
       mdast-util-to-markdown: 2.1.0
     transitivePeerDependencies:
       - supports-color
@@ -15129,14 +14988,14 @@ snapshots:
     dependencies:
       '@types/mdast': 4.0.3
       devlop: 1.1.0
-      mdast-util-from-markdown: 2.0.0
+      mdast-util-from-markdown: 2.0.1
       mdast-util-to-markdown: 2.1.0
     transitivePeerDependencies:
       - supports-color
 
   mdast-util-gfm@3.0.0:
     dependencies:
-      mdast-util-from-markdown: 2.0.0
+      mdast-util-from-markdown: 2.0.1
       mdast-util-gfm-autolink-literal: 2.0.0
       mdast-util-gfm-footnote: 2.0.0
       mdast-util-gfm-strikethrough: 2.0.0
@@ -15174,8 +15033,6 @@ snapshots:
       unist-util-visit: 5.0.0
       zwitch: 2.0.4
 
-  mdast-util-to-string@2.0.0: {}
-
   mdast-util-to-string@4.0.0:
     dependencies:
       '@types/mdast': 4.0.3
@@ -15359,13 +15216,6 @@ snapshots:
 
   micromark-util-types@2.0.0: {}
 
-  micromark@2.11.4:
-    dependencies:
-      debug: 4.3.6
-      parse-entities: 2.0.0
-    transitivePeerDependencies:
-      - supports-color
-
   micromark@4.0.0:
     dependencies:
       '@types/debug': 4.1.8
@@ -15411,10 +15261,6 @@ snapshots:
 
   min-indent@1.0.1: {}
 
-  minimatch@10.0.1:
-    dependencies:
-      brace-expansion: 2.0.1
-
   minimatch@3.1.2:
     dependencies:
       brace-expansion: 1.1.11
@@ -16187,15 +16033,6 @@ snapshots:
     dependencies:
       callsites: 3.1.0
 
-  parse-entities@2.0.0:
-    dependencies:
-      character-entities: 1.2.4
-      character-entities-legacy: 1.1.4
-      character-reference-invalid: 1.1.4
-      is-alphanumerical: 1.0.4
-      is-decimal: 1.0.4
-      is-hexadecimal: 1.0.4
-
   parse-entities@4.0.1:
     dependencies:
       '@types/unist': 2.0.6
@@ -17023,7 +16860,7 @@ snapshots:
 
   schema-utils@3.3.0:
     dependencies:
-      '@types/json-schema': 7.0.14
+      '@types/json-schema': 7.0.15
       ajv: 6.12.6
       ajv-keywords: 3.5.2(ajv@6.12.6)
 
@@ -17847,10 +17684,6 @@ snapshots:
     dependencies:
       '@types/unist': 3.0.2
 
-  unist-util-stringify-position@2.0.3:
-    dependencies:
-      '@types/unist': 2.0.6
-
   unist-util-stringify-position@4.0.0:
     dependencies:
       '@types/unist': 3.0.2
@@ -18497,7 +18330,7 @@ snapshots:
   webpack@5.89.0(esbuild@0.23.1):
     dependencies:
       '@types/eslint-scope': 3.7.6
-      '@types/estree': 1.0.5
+      '@types/estree': 1.0.6
       '@webassemblyjs/ast': 1.11.6
       '@webassemblyjs/wasm-edit': 1.11.6
       '@webassemblyjs/wasm-parser': 1.11.6
diff --git a/scripts/avatars.ts b/scripts/avatars.ts
index a3dced26..883c609e 100644
--- a/scripts/avatars.ts
+++ b/scripts/avatars.ts
@@ -1,7 +1,7 @@
 import { writeFile } from 'node:fs/promises'
-import { join, resolve } from 'pathe'
 import fs from 'fs-extra'
 import { ofetch } from 'ofetch'
+import { join, resolve } from 'pathe'
 import { elkTeamMembers } from '../composables/about'
 
 const avatarsDir = resolve('./public/avatars/')
diff --git a/scripts/cleanup-translations.ts b/scripts/cleanup-translations.ts
index cd95caef..d3d518cf 100644
--- a/scripts/cleanup-translations.ts
+++ b/scripts/cleanup-translations.ts
@@ -1,7 +1,7 @@
 import { Buffer } from 'node:buffer'
 import { readFile, writeFile } from 'node:fs/promises'
-import { flatten, unflatten } from 'flat'
 import { createResolver } from '@nuxt/kit'
+import { flatten, unflatten } from 'flat'
 import { currentLocales } from '../config/i18n'
 
 const resolver = createResolver(import.meta.url)
diff --git a/scripts/generate-pwa-icons.ts b/scripts/generate-pwa-icons.ts
index e9e4cb40..697e4373 100644
--- a/scripts/generate-pwa-icons.ts
+++ b/scripts/generate-pwa-icons.ts
@@ -1,7 +1,7 @@
+import type { PngOptions, ResizeOptions } from 'sharp'
 import { rm, writeFile } from 'node:fs/promises'
 import process from 'node:process'
 import { resolve } from 'pathe'
-import type { PngOptions, ResizeOptions } from 'sharp'
 import sharp from 'sharp'
 import ico from 'sharp-ico'
 
@@ -103,7 +103,8 @@ async function generateTransparentIcons(icons: ResolvedIcons, svgLogo: string, f
           Math.round(size * (1 - padding)),
           Math.round(size * (1 - padding)),
           resizeOptions,
-        ).toBuffer(),
+        )
+        .toBuffer(),
     }]).toFile(filePath)
     await optimizePng(filePath, icons.png)
   }))
@@ -126,7 +127,8 @@ async function generateMaskableIcons(type: IconType, icons: ResolvedIcons, svgLo
           Math.round(size * (1 - padding)),
           Math.round(size * (1 - padding)),
           resizeOptions,
-        ).toBuffer(),
+        )
+        .toBuffer(),
     }]).toFile(filePath)
     await optimizePng(filePath, icons.png)
   }))
diff --git a/scripts/prepare-translation-status.ts b/scripts/prepare-translation-status.ts
index f5c614e6..2942dede 100644
--- a/scripts/prepare-translation-status.ts
+++ b/scripts/prepare-translation-status.ts
@@ -1,10 +1,10 @@
+import type { LocaleEntry } from '../docs/types'
 import { Buffer } from 'node:buffer'
 import { readFile, writeFile } from 'node:fs/promises'
-import { flatten } from 'flat'
 import { createResolver } from '@nuxt/kit'
-import { countryLocaleVariants, currentLocales } from '../config/i18n'
-import type { LocaleEntry } from '../docs/types'
+import { flatten } from 'flat'
 import type { ElkTranslationStatus } from '~/types/translation-status'
+import { countryLocaleVariants, currentLocales } from '../config/i18n'
 
 export const localeData: [code: string, file: string[], title: string][]
     = currentLocales.map((l: any) => [l.code, l.files ? l.files : [l.file!], l.name ?? l.code])
diff --git a/server/cache-driver.ts b/server/cache-driver.ts
index 4881ed9d..8bc14af2 100644
--- a/server/cache-driver.ts
+++ b/server/cache-driver.ts
@@ -1,6 +1,6 @@
 import type { Driver } from 'unstorage'
-import memory from 'unstorage/drivers/memory'
 import { defineDriver } from 'unstorage'
+import memory from 'unstorage/drivers/memory'
 
 export interface CacheDriverOptions {
   driver: Driver
diff --git a/server/utils/shared.ts b/server/utils/shared.ts
index d134f68f..7fa79c5e 100644
--- a/server/utils/shared.ts
+++ b/server/utils/shared.ts
@@ -1,9 +1,9 @@
+import { $fetch } from 'ofetch'
+import kv from 'unstorage/drivers/cloudflare-kv-http'
 import fs from 'unstorage/drivers/fs'
 import memory from 'unstorage/drivers/memory'
-import kv from 'unstorage/drivers/cloudflare-kv-http'
-import vercelKVDriver from 'unstorage/drivers/vercel-kv'
 
-import { $fetch } from 'ofetch'
+import vercelKVDriver from 'unstorage/drivers/vercel-kv'
 
 import cached from '../cache-driver'
 
@@ -13,8 +13,8 @@ import { env } from '#build-info'
 // @ts-expect-error virtual import
 import { driver } from '#storage-config'
 
-import type { AppInfo } from '~/types'
 import { APP_NAME } from '~/constants'
+import type { AppInfo } from '~/types'
 
 const storage = useStorage<AppInfo>()
 
diff --git a/service-worker/elk-sw.ts b/service-worker/elk-sw.ts
index d6a516b1..9026cb6f 100644
--- a/service-worker/elk-sw.ts
+++ b/service-worker/elk-sw.ts
@@ -1,13 +1,13 @@
 /// <reference lib="WebWorker" />
 /// <reference types="vite/client" />
+import { CacheableResponsePlugin } from 'workbox-cacheable-response'
+import { ExpirationPlugin } from 'workbox-expiration'
 import { cleanupOutdatedCaches, createHandlerBoundToURL, precacheAndRoute } from 'workbox-precaching'
 import { NavigationRoute, registerRoute } from 'workbox-routing'
-import { CacheableResponsePlugin } from 'workbox-cacheable-response'
 import { NetworkFirst, StaleWhileRevalidate } from 'workbox-strategies'
-import { ExpirationPlugin } from 'workbox-expiration'
 
-import { onNotificationClick, onPush } from './web-push-notifications'
 import { onShareTarget } from './share-target'
+import { onNotificationClick, onPush } from './web-push-notifications'
 
 declare const self: ServiceWorkerGlobalScope
 
diff --git a/service-worker/notification.ts b/service-worker/notification.ts
index 8d511006..fa89061c 100644
--- a/service-worker/notification.ts
+++ b/service-worker/notification.ts
@@ -1,5 +1,5 @@
-import { closeDatabases, get } from '../utils/elk-idb'
 import type { MastoNotification, NotificationInfo, PushPayload, UserLogin } from './types'
+import { closeDatabases, get } from '../utils/elk-idb'
 
 export async function findNotification({ access_token, notification_id/* , notification_type */ }: PushPayload): Promise<NotificationInfo | undefined> {
   const users = await get<UserLogin[]>('elk-users')
diff --git a/service-worker/web-push-notifications.ts b/service-worker/web-push-notifications.ts
index 7a5bc4ee..f963ea02 100644
--- a/service-worker/web-push-notifications.ts
+++ b/service-worker/web-push-notifications.ts
@@ -1,12 +1,12 @@
 /// <reference lib="WebWorker" />
 /// <reference types="vite/client" />
+import type { PushPayload } from '~/service-worker/types'
 import { ELK_PAGE_LIFECYCLE_FROZEN } from '../constants'
 import {
   closeDatabaseConnections,
   createNotificationOptions,
   findNotification,
 } from './notification'
-import type { PushPayload } from '~/service-worker/types'
 
 declare const self: ServiceWorkerGlobalScope
 
diff --git a/tests/nuxt/content-rich.test.ts b/tests/nuxt/content-rich.test.ts
index 22f20d1e..e1eb2d9b 100644
--- a/tests/nuxt/content-rich.test.ts
+++ b/tests/nuxt/content-rich.test.ts
@@ -1,10 +1,15 @@
-import { beforeEach, describe, expect, it, vi } from 'vitest'
-import { renderToString } from 'vue/server-renderer'
-import { format } from 'prettier'
+/* eslint perfectionist/sort-imports: "off" */
+// to prevent error when importing '@nuxt/test-utils/runtime' before 'vitest'
+// ref. #2984 chore(deps): update dependency @antfu/eslint-config to v3 by renovate[bot]
+// https://github.com/elk-zone/elk/pull/2984
+
 import type { mastodon } from 'masto'
+import { format } from 'prettier'
+import { beforeEach, describe, expect, it, vi } from 'vitest'
 import { mockComponent } from '@nuxt/test-utils/runtime'
-import { contentToVNode } from '~/composables/content-render'
+import { renderToString } from 'vue/server-renderer'
 import type { ContentParseOptions } from '~/composables/content-parse'
+import { contentToVNode } from '~/composables/content-render'
 
 beforeEach(() => {
   publicServer.value = useRuntimeConfig().public.defaultServer
diff --git a/tests/nuxt/html-parse.test.ts b/tests/nuxt/html-parse.test.ts
index 4ef691b4..9552c0e6 100644
--- a/tests/nuxt/html-parse.test.ts
+++ b/tests/nuxt/html-parse.test.ts
@@ -1,6 +1,6 @@
-import { describe, expect, it } from 'vitest'
 import { format } from 'prettier'
 import { render as renderTree } from 'ultrahtml'
+import { describe, expect, it } from 'vitest'
 import type { ContentParseOptions } from '~/composables/content-parse'
 
 describe('html-parse', () => {
diff --git a/types/index.ts b/types/index.ts
index e429a59d..4faa023f 100644
--- a/types/index.ts
+++ b/types/index.ts
@@ -1,6 +1,6 @@
+import type { RouteLocationRaw } from '#vue-router'
 import type { mastodon } from 'masto'
 import type { MarkNonNullable, Mutable } from './utils'
-import type { RouteLocationRaw } from '#vue-router'
 
 export interface AppInfo {
   id: string
diff --git a/unocss.config.ts b/unocss.config.ts
index e4085039..7e916649 100644
--- a/unocss.config.ts
+++ b/unocss.config.ts
@@ -1,5 +1,7 @@
-import process from 'node:process'
 import type { Variant } from 'unocss'
+import process from 'node:process'
+import { variantParentMatcher } from '@unocss/preset-mini/utils'
+
 import {
   defineConfig,
   presetAttributify,
@@ -11,8 +13,6 @@ import {
   transformerVariantGroup,
 } from 'unocss'
 
-import { variantParentMatcher } from '@unocss/preset-mini/utils'
-
 export default defineConfig({
   shortcuts: [
     {
diff --git a/utils/elk-idb.ts b/utils/elk-idb.ts
index d7363046..b0d0b956 100644
--- a/utils/elk-idb.ts
+++ b/utils/elk-idb.ts
@@ -1,10 +1,10 @@
 import {
-  type UseStore,
   del as delIdb,
   get as getIdb,
   promisifyRequest,
   set as setIdb,
   update as updateIdb,
+  type UseStore,
 } from 'idb-keyval'
 
 const databases: IDBOpenDBRequest[] = []