From 2e78d526830e7016328e33afc1d7daca8e303511 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Barr=C3=A9?= Date: Thu, 31 Aug 2023 03:47:14 +0200 Subject: [PATCH] fix: better invalidation message when an export is added & fix HMR for export of nullish values --- CHANGELOG.md | 1 + playground/hmr/__tests__/hmr.spec.ts | 2 +- src/refresh-runtime.js | 6 ++++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 490167dc..0a75e4f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Disable Fast Refresh based on `config.server.hmr === false` instead of `process.env.TEST` - Warn when plugin is in WebContainers (see [#118](https://github.com/vitejs/vite-plugin-react-swc/issues/118)) +- Better invalidation message when an export is added & fix HMR for export of nullish values ([#143](https://github.com/vitejs/vite-plugin-react-swc/issues/143)) ## 3.3.2 diff --git a/playground/hmr/__tests__/hmr.spec.ts b/playground/hmr/__tests__/hmr.spec.ts index deb963c2..90fe06e7 100644 --- a/playground/hmr/__tests__/hmr.spec.ts +++ b/playground/hmr/__tests__/hmr.spec.ts @@ -46,7 +46,7 @@ test("HMR invalidate", async ({ page }) => { 'React!";\nexport const useless = 3;', ]); await waitForLogs( - "[vite] invalidate /src/TitleWithExport.tsx: Could not Fast Refresh. Learn more at https://github.com/vitejs/vite-plugin-react-swc#consistent-components-exports", + "[vite] invalidate /src/TitleWithExport.tsx: Could not Fast Refresh (new export)", "[vite] hot updated: /src/App.tsx", ); diff --git a/src/refresh-runtime.js b/src/refresh-runtime.js index cbe001b3..fff3f491 100644 --- a/src/refresh-runtime.js +++ b/src/refresh-runtime.js @@ -587,9 +587,12 @@ export function validateRefreshBoundaryAndEnqueueUpdate( prevExports, nextExports, ) { - if (!predicateOnExport(prevExports, (key) => !!nextExports[key])) { + if (!predicateOnExport(prevExports, (key) => key in nextExports)) { return "Could not Fast Refresh (export removed)"; } + if (!predicateOnExport(nextExports, (key) => key in prevExports)) { + return "Could not Fast Refresh (new export)"; + } let hasExports = false; const allExportsAreComponentsOrUnchanged = predicateOnExport( @@ -597,7 +600,6 @@ export function validateRefreshBoundaryAndEnqueueUpdate( (key, value) => { hasExports = true; if (isLikelyComponentType(value)) return true; - if (!prevExports[key]) return false; return prevExports[key] === nextExports[key]; }, );