diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index abb9bde232..0b30928314 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -1,3 +1,4 @@
+const vitestPlugin = require("@vitest/eslint-plugin");
 const restrictedSyntax = ['WithStatement', 'ForInStatement', 'LabeledStatement', 'SequenceExpression'];
 
 module.exports = {
@@ -37,8 +38,6 @@ module.exports = {
     'eslint-plugin-regexp',
     'eslint-plugin-sonarjs',
     'eslint-plugin-unicorn',
-    'eslint-plugin-vitest',
-    'eslint-plugin-vitest-globals',
     'eslint-plugin-wc',
   ],
   env: {
@@ -82,59 +81,58 @@ module.exports = {
     },
     {
       files: ['**/*.test.*', 'web_src/js/test/setup.ts'],
-      env: {
-        'vitest-globals/env': true,
-      },
+      plugins: ["@vitest/eslint-plugin"],
+      globals: vitestPlugin.environments.env.globals,
       rules: {
-        'vitest/consistent-test-filename': [0],
-        'vitest/consistent-test-it': [0],
-        'vitest/expect-expect': [0],
-        'vitest/max-expects': [0],
-        'vitest/max-nested-describe': [0],
-        'vitest/no-alias-methods': [0],
-        'vitest/no-commented-out-tests': [0],
-        'vitest/no-conditional-expect': [0],
-        'vitest/no-conditional-in-test': [0],
-        'vitest/no-conditional-tests': [0],
-        'vitest/no-disabled-tests': [0],
-        'vitest/no-done-callback': [0],
-        'vitest/no-duplicate-hooks': [0],
-        'vitest/no-focused-tests': [0],
-        'vitest/no-hooks': [0],
-        'vitest/no-identical-title': [2],
-        'vitest/no-interpolation-in-snapshots': [0],
-        'vitest/no-large-snapshots': [0],
-        'vitest/no-mocks-import': [0],
-        'vitest/no-restricted-matchers': [0],
-        'vitest/no-restricted-vi-methods': [0],
-        'vitest/no-standalone-expect': [0],
-        'vitest/no-test-prefixes': [0],
-        'vitest/no-test-return-statement': [0],
-        'vitest/prefer-called-with': [0],
-        'vitest/prefer-comparison-matcher': [0],
-        'vitest/prefer-each': [0],
-        'vitest/prefer-equality-matcher': [0],
-        'vitest/prefer-expect-resolves': [0],
-        'vitest/prefer-hooks-in-order': [0],
-        'vitest/prefer-hooks-on-top': [2],
-        'vitest/prefer-lowercase-title': [0],
-        'vitest/prefer-mock-promise-shorthand': [0],
-        'vitest/prefer-snapshot-hint': [0],
-        'vitest/prefer-spy-on': [0],
-        'vitest/prefer-strict-equal': [0],
-        'vitest/prefer-to-be': [0],
-        'vitest/prefer-to-be-falsy': [0],
-        'vitest/prefer-to-be-object': [0],
-        'vitest/prefer-to-be-truthy': [0],
-        'vitest/prefer-to-contain': [0],
-        'vitest/prefer-to-have-length': [0],
-        'vitest/prefer-todo': [0],
-        'vitest/require-hook': [0],
-        'vitest/require-to-throw-message': [0],
-        'vitest/require-top-level-describe': [0],
-        'vitest/valid-describe-callback': [2],
-        'vitest/valid-expect': [2],
-        'vitest/valid-title': [2],
+        '@vitest/consistent-test-filename': [0],
+        '@vitest/consistent-test-it': [0],
+        '@vitest/expect-expect': [0],
+        '@vitest/max-expects': [0],
+        '@vitest/max-nested-describe': [0],
+        '@vitest/no-alias-methods': [0],
+        '@vitest/no-commented-out-tests': [0],
+        '@vitest/no-conditional-expect': [0],
+        '@vitest/no-conditional-in-test': [0],
+        '@vitest/no-conditional-tests': [0],
+        '@vitest/no-disabled-tests': [0],
+        '@vitest/no-done-callback': [0],
+        '@vitest/no-duplicate-hooks': [0],
+        '@vitest/no-focused-tests': [0],
+        '@vitest/no-hooks': [0],
+        '@vitest/no-identical-title': [2],
+        '@vitest/no-interpolation-in-snapshots': [0],
+        '@vitest/no-large-snapshots': [0],
+        '@vitest/no-mocks-import': [0],
+        '@vitest/no-restricted-matchers': [0],
+        '@vitest/no-restricted-vi-methods': [0],
+        '@vitest/no-standalone-expect': [0],
+        '@vitest/no-test-prefixes': [0],
+        '@vitest/no-test-return-statement': [0],
+        '@vitest/prefer-called-with': [0],
+        '@vitest/prefer-comparison-matcher': [0],
+        '@vitest/prefer-each': [0],
+        '@vitest/prefer-equality-matcher': [0],
+        '@vitest/prefer-expect-resolves': [0],
+        '@vitest/prefer-hooks-in-order': [0],
+        '@vitest/prefer-hooks-on-top': [2],
+        '@vitest/prefer-lowercase-title': [0],
+        '@vitest/prefer-mock-promise-shorthand': [0],
+        '@vitest/prefer-snapshot-hint': [0],
+        '@vitest/prefer-spy-on': [0],
+        '@vitest/prefer-strict-equal': [0],
+        '@vitest/prefer-to-be': [0],
+        '@vitest/prefer-to-be-falsy': [0],
+        '@vitest/prefer-to-be-object': [0],
+        '@vitest/prefer-to-be-truthy': [0],
+        '@vitest/prefer-to-contain': [0],
+        '@vitest/prefer-to-have-length': [0],
+        '@vitest/prefer-todo': [0],
+        '@vitest/require-hook': [0],
+        '@vitest/require-to-throw-message': [0],
+        '@vitest/require-top-level-describe': [0],
+        '@vitest/valid-describe-callback': [2],
+        '@vitest/valid-expect': [2],
+        '@vitest/valid-title': [2],
       },
     },
     {
diff --git a/package-lock.json b/package-lock.json
index ac25c50dde..beef83c765 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -83,6 +83,7 @@
         "@typescript-eslint/eslint-plugin": "8.21.0",
         "@typescript-eslint/parser": "8.21.0",
         "@vitejs/plugin-vue": "5.2.1",
+        "@vitest/eslint-plugin": "1.1.30",
         "eslint": "8.57.0",
         "eslint-import-resolver-typescript": "3.7.0",
         "eslint-plugin-array-func": "4.0.0",
@@ -94,8 +95,6 @@
         "eslint-plugin-regexp": "2.7.0",
         "eslint-plugin-sonarjs": "3.0.1",
         "eslint-plugin-unicorn": "56.0.1",
-        "eslint-plugin-vitest": "0.4.1",
-        "eslint-plugin-vitest-globals": "1.5.0",
         "eslint-plugin-vue": "9.32.0",
         "eslint-plugin-vue-scoped-css": "2.9.0",
         "eslint-plugin-wc": "2.2.0",
@@ -5054,6 +5053,27 @@
         "vue": "^3.2.25"
       }
     },
+    "node_modules/@vitest/eslint-plugin": {
+      "version": "1.1.30",
+      "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.30.tgz",
+      "integrity": "sha512-gka7VmgfDXmVagcs/SV5Ft23LLrqSzvjX8ATZMLTXIswVRx+i1XfIgy+w2WDrLvhio/eyR6EEb1qM0+hmlF00w==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "@typescript-eslint/utils": ">= 8.0",
+        "eslint": ">= 8.57.0",
+        "typescript": ">= 5.0.0",
+        "vitest": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        },
+        "vitest": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@vitest/expect": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.3.tgz",
@@ -8455,182 +8475,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/eslint-plugin-vitest": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.4.1.tgz",
-      "integrity": "sha512-+PnZ2u/BS+f5FiuHXz4zKsHPcMKHie+K+1Uvu/x91ovkCMEOJqEI8E9Tw1Wzx2QRz4MHOBHYf1ypO8N1K0aNAA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/utils": "^7.4.0"
-      },
-      "engines": {
-        "node": "^18.0.0 || >= 20.0.0"
-      },
-      "peerDependencies": {
-        "eslint": ">=8.0.0",
-        "vitest": "*"
-      },
-      "peerDependenciesMeta": {
-        "@typescript-eslint/eslint-plugin": {
-          "optional": true
-        },
-        "vitest": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/eslint-plugin-vitest-globals": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-vitest-globals/-/eslint-plugin-vitest-globals-1.5.0.tgz",
-      "integrity": "sha512-ZSsVOaOIig0oVLzRTyk8lUfBfqzWxr/J3/NFMfGGRIkGQPejJYmDH3gXmSJxAojts77uzAGB/UmVrwi2DC4LYA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/scope-manager": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
-      "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "7.18.0",
-        "@typescript-eslint/visitor-keys": "7.18.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/types": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-      "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/typescript-estree": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
-      "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "@typescript-eslint/types": "7.18.0",
-        "@typescript-eslint/visitor-keys": "7.18.0",
-        "debug": "^4.3.4",
-        "globby": "^11.1.0",
-        "is-glob": "^4.0.3",
-        "minimatch": "^9.0.4",
-        "semver": "^7.6.0",
-        "ts-api-utils": "^1.3.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/utils": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
-      "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "7.18.0",
-        "@typescript-eslint/types": "7.18.0",
-        "@typescript-eslint/typescript-estree": "7.18.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^8.56.0"
-      }
-    },
-    "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/visitor-keys": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
-      "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "7.18.0",
-        "eslint-visitor-keys": "^3.4.3"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/eslint-plugin-vitest/node_modules/eslint-visitor-keys": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
-      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/eslint-plugin-vitest/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/eslint-plugin-vitest/node_modules/ts-api-utils": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
-      "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=16"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.2.0"
-      }
-    },
     "node_modules/eslint-plugin-vue": {
       "version": "9.32.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.32.0.tgz",
diff --git a/package.json b/package.json
index 7eb9000bb5..1c69377eeb 100644
--- a/package.json
+++ b/package.json
@@ -82,6 +82,7 @@
     "@typescript-eslint/eslint-plugin": "8.21.0",
     "@typescript-eslint/parser": "8.21.0",
     "@vitejs/plugin-vue": "5.2.1",
+    "@vitest/eslint-plugin": "1.1.30",
     "eslint": "8.57.0",
     "eslint-import-resolver-typescript": "3.7.0",
     "eslint-plugin-array-func": "4.0.0",
@@ -93,8 +94,6 @@
     "eslint-plugin-regexp": "2.7.0",
     "eslint-plugin-sonarjs": "3.0.1",
     "eslint-plugin-unicorn": "56.0.1",
-    "eslint-plugin-vitest": "0.4.1",
-    "eslint-plugin-vitest-globals": "1.5.0",
     "eslint-plugin-vue": "9.32.0",
     "eslint-plugin-vue-scoped-css": "2.9.0",
     "eslint-plugin-wc": "2.2.0",