Index: imaps-frontend/node_modules/@vitejs/plugin-react/dist/index.cjs
===================================================================
--- imaps-frontend/node_modules/@vitejs/plugin-react/dist/index.cjs	(revision d56544918790c0c3bc50f2f0a98c99f3d2988ccf)
+++ imaps-frontend/node_modules/@vitejs/plugin-react/dist/index.cjs	(revision 0c6b92add4cfaedcb91bcd37b45849f142f7d152)
@@ -63,11 +63,15 @@
   window.$RefreshSig$ = prevRefreshSig;
 }`;
-const sharedFooter = `
+const sharedFooter = (id) => `
 if (import.meta.hot && !inWebWorker) {
   RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
-    RefreshRuntime.registerExportsForReactRefresh(__SOURCE__, currentExports);
+    RefreshRuntime.registerExportsForReactRefresh(${JSON.stringify(
+  id
+)}, currentExports);
     import.meta.hot.accept((nextExports) => {
       if (!nextExports) return;
-      const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate(currentExports, nextExports);
+      const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate(${JSON.stringify(
+  id
+)}, currentExports, nextExports);
       if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
     });
@@ -75,8 +79,8 @@
 }`;
 function addRefreshWrapper(code, id) {
-  return sharedHeader + functionHeader.replace("__SOURCE__", JSON.stringify(id)) + code + functionFooter + sharedFooter.replace("__SOURCE__", JSON.stringify(id));
+  return sharedHeader + functionHeader.replace("__SOURCE__", JSON.stringify(id)) + code + functionFooter + sharedFooter(id);
 }
 function addClassComponentRefreshWrapper(code, id) {
-  return sharedHeader + code + sharedFooter.replace("__SOURCE__", JSON.stringify(id));
+  return sharedHeader + code + sharedFooter(id);
 }
 
@@ -195,5 +199,5 @@
         // This crates issues the react compiler because the re-order is too important
         // People should use @babel/plugin-transform-react-jsx-development to get back good line numbers
-        retainLines: hasCompiler(plugins) ? false : !isProduction && isJSX && opts.jsxRuntime !== "classic",
+        retainLines: getReactCompilerPlugin(plugins) != null ? false : !isProduction && isJSX && opts.jsxRuntime !== "classic",
         parserOpts: {
           ...babelOptions.parserOpts,
@@ -204,4 +208,6 @@
         generatorOpts: {
           ...babelOptions.generatorOpts,
+          // import attributes parsing available without plugin since 7.26
+          importAttributesKeyword: "with",
           decoratorsBeforeExport: true
         },
@@ -222,8 +228,15 @@
     }
   };
-  const dependencies = ["react", jsxImportDevRuntime, jsxImportRuntime];
+  const dependencies = [
+    "react",
+    "react-dom",
+    jsxImportDevRuntime,
+    jsxImportRuntime
+  ];
   const staticBabelPlugins = typeof opts.babel === "object" ? opts.babel?.plugins ?? [] : [];
-  if (hasCompilerWithDefaultRuntime(staticBabelPlugins)) {
-    dependencies.push("react/compiler-runtime");
+  const reactCompilerPlugin = getReactCompilerPlugin(staticBabelPlugins);
+  if (reactCompilerPlugin != null) {
+    const reactCompilerRuntimeModule = getReactCompilerRuntimeModule(reactCompilerPlugin);
+    dependencies.push(reactCompilerRuntimeModule);
   }
   const viteReactRefresh = {
@@ -269,4 +282,7 @@
         return;
       }
+      if (warning.code === "SOURCEMAP_ERROR" && warning.message.includes("resolve original location") && warning.pos === 0) {
+        return;
+      }
       if (userConfig.build?.rollupOptions?.onwarn) {
         userConfig.build.rollupOptions.onwarn(warning, defaultHandler);
@@ -307,13 +323,19 @@
   return value !== void 0;
 }
-function hasCompiler(plugins) {
-  return plugins.some(
+function getReactCompilerPlugin(plugins) {
+  return plugins.find(
     (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler"
   );
 }
-function hasCompilerWithDefaultRuntime(plugins) {
-  return plugins.some(
-    (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler" && p[1]?.runtimeModule === void 0
-  );
+function getReactCompilerRuntimeModule(plugin) {
+  let moduleName = "react/compiler-runtime";
+  if (Array.isArray(plugin)) {
+    if (plugin[1]?.target === "17" || plugin[1]?.target === "18") {
+      moduleName = "react-compiler-runtime";
+    } else if (typeof plugin[1]?.runtimeModule === "string") {
+      moduleName = plugin[1]?.runtimeModule;
+    }
+  }
+  return moduleName;
 }
 
Index: imaps-frontend/node_modules/@vitejs/plugin-react/dist/index.mjs
===================================================================
--- imaps-frontend/node_modules/@vitejs/plugin-react/dist/index.mjs	(revision d56544918790c0c3bc50f2f0a98c99f3d2988ccf)
+++ imaps-frontend/node_modules/@vitejs/plugin-react/dist/index.mjs	(revision 0c6b92add4cfaedcb91bcd37b45849f142f7d152)
@@ -55,11 +55,15 @@
   window.$RefreshSig$ = prevRefreshSig;
 }`;
-const sharedFooter = `
+const sharedFooter = (id) => `
 if (import.meta.hot && !inWebWorker) {
   RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
-    RefreshRuntime.registerExportsForReactRefresh(__SOURCE__, currentExports);
+    RefreshRuntime.registerExportsForReactRefresh(${JSON.stringify(
+  id
+)}, currentExports);
     import.meta.hot.accept((nextExports) => {
       if (!nextExports) return;
-      const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate(currentExports, nextExports);
+      const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate(${JSON.stringify(
+  id
+)}, currentExports, nextExports);
       if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
     });
@@ -67,8 +71,8 @@
 }`;
 function addRefreshWrapper(code, id) {
-  return sharedHeader + functionHeader.replace("__SOURCE__", JSON.stringify(id)) + code + functionFooter + sharedFooter.replace("__SOURCE__", JSON.stringify(id));
+  return sharedHeader + functionHeader.replace("__SOURCE__", JSON.stringify(id)) + code + functionFooter + sharedFooter(id);
 }
 function addClassComponentRefreshWrapper(code, id) {
-  return sharedHeader + code + sharedFooter.replace("__SOURCE__", JSON.stringify(id));
+  return sharedHeader + code + sharedFooter(id);
 }
 
@@ -187,5 +191,5 @@
         // This crates issues the react compiler because the re-order is too important
         // People should use @babel/plugin-transform-react-jsx-development to get back good line numbers
-        retainLines: hasCompiler(plugins) ? false : !isProduction && isJSX && opts.jsxRuntime !== "classic",
+        retainLines: getReactCompilerPlugin(plugins) != null ? false : !isProduction && isJSX && opts.jsxRuntime !== "classic",
         parserOpts: {
           ...babelOptions.parserOpts,
@@ -196,4 +200,6 @@
         generatorOpts: {
           ...babelOptions.generatorOpts,
+          // import attributes parsing available without plugin since 7.26
+          importAttributesKeyword: "with",
           decoratorsBeforeExport: true
         },
@@ -214,8 +220,15 @@
     }
   };
-  const dependencies = ["react", jsxImportDevRuntime, jsxImportRuntime];
+  const dependencies = [
+    "react",
+    "react-dom",
+    jsxImportDevRuntime,
+    jsxImportRuntime
+  ];
   const staticBabelPlugins = typeof opts.babel === "object" ? opts.babel?.plugins ?? [] : [];
-  if (hasCompilerWithDefaultRuntime(staticBabelPlugins)) {
-    dependencies.push("react/compiler-runtime");
+  const reactCompilerPlugin = getReactCompilerPlugin(staticBabelPlugins);
+  if (reactCompilerPlugin != null) {
+    const reactCompilerRuntimeModule = getReactCompilerRuntimeModule(reactCompilerPlugin);
+    dependencies.push(reactCompilerRuntimeModule);
   }
   const viteReactRefresh = {
@@ -261,4 +274,7 @@
         return;
       }
+      if (warning.code === "SOURCEMAP_ERROR" && warning.message.includes("resolve original location") && warning.pos === 0) {
+        return;
+      }
       if (userConfig.build?.rollupOptions?.onwarn) {
         userConfig.build.rollupOptions.onwarn(warning, defaultHandler);
@@ -299,13 +315,19 @@
   return value !== void 0;
 }
-function hasCompiler(plugins) {
-  return plugins.some(
+function getReactCompilerPlugin(plugins) {
+  return plugins.find(
     (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler"
   );
 }
-function hasCompilerWithDefaultRuntime(plugins) {
-  return plugins.some(
-    (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler" && p[1]?.runtimeModule === void 0
-  );
+function getReactCompilerRuntimeModule(plugin) {
+  let moduleName = "react/compiler-runtime";
+  if (Array.isArray(plugin)) {
+    if (plugin[1]?.target === "17" || plugin[1]?.target === "18") {
+      moduleName = "react-compiler-runtime";
+    } else if (typeof plugin[1]?.runtimeModule === "string") {
+      moduleName = plugin[1]?.runtimeModule;
+    }
+  }
+  return moduleName;
 }
 
Index: imaps-frontend/node_modules/@vitejs/plugin-react/dist/refreshUtils.js
===================================================================
--- imaps-frontend/node_modules/@vitejs/plugin-react/dist/refreshUtils.js	(revision d56544918790c0c3bc50f2f0a98c99f3d2988ccf)
+++ imaps-frontend/node_modules/@vitejs/plugin-react/dist/refreshUtils.js	(revision 0c6b92add4cfaedcb91bcd37b45849f142f7d152)
@@ -8,5 +8,12 @@
 
 /* eslint-disable no-undef */
-const enqueueUpdate = debounce(exports.performReactRefresh, 16)
+const hooks = []
+window.__registerBeforePerformReactRefresh = (cb) => {
+  hooks.push(cb)
+}
+const enqueueUpdate = debounce(async () => {
+  if (hooks.length) await Promise.all(hooks.map((cb) => cb()))
+  exports.performReactRefresh()
+}, 16)
 
 // Taken from https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/lib/runtime/RefreshUtils.js#L141
@@ -26,9 +33,22 @@
 }
 
-function validateRefreshBoundaryAndEnqueueUpdate(prevExports, nextExports) {
-  if (!predicateOnExport(prevExports, (key) => key in nextExports)) {
+function validateRefreshBoundaryAndEnqueueUpdate(id, prevExports, nextExports) {
+  const ignoredExports = window.__getReactRefreshIgnoredExports?.({ id }) ?? []
+  if (
+    predicateOnExport(
+      ignoredExports,
+      prevExports,
+      (key) => key in nextExports,
+    ) !== true
+  ) {
     return 'Could not Fast Refresh (export removed)'
   }
-  if (!predicateOnExport(nextExports, (key) => key in prevExports)) {
+  if (
+    predicateOnExport(
+      ignoredExports,
+      nextExports,
+      (key) => key in prevExports,
+    ) !== true
+  ) {
     return 'Could not Fast Refresh (new export)'
   }
@@ -36,4 +56,5 @@
   let hasExports = false
   const allExportsAreComponentsOrUnchanged = predicateOnExport(
+    ignoredExports,
     nextExports,
     (key, value) => {
@@ -43,17 +64,18 @@
     },
   )
-  if (hasExports && allExportsAreComponentsOrUnchanged) {
+  if (hasExports && allExportsAreComponentsOrUnchanged === true) {
     enqueueUpdate()
   } else {
-    return 'Could not Fast Refresh. Learn more at https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#consistent-components-exports'
+    return `Could not Fast Refresh ("${allExportsAreComponentsOrUnchanged}" export is incompatible). Learn more at https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#consistent-components-exports`
   }
 }
 
-function predicateOnExport(moduleExports, predicate) {
+function predicateOnExport(ignoredExports, moduleExports, predicate) {
   for (const key in moduleExports) {
     if (key === '__esModule') continue
+    if (ignoredExports.includes(key)) continue
     const desc = Object.getOwnPropertyDescriptor(moduleExports, key)
-    if (desc && desc.get) return false
-    if (!predicate(key, moduleExports[key])) return false
+    if (desc && desc.get) return key
+    if (!predicate(key, moduleExports[key])) return key
   }
   return true
