@vitejs/plugin-react 4.3.0 → 4.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -62,22 +62,26 @@ if (import.meta.hot && !inWebWorker) {
62
62
  window.$RefreshReg$ = prevRefreshReg;
63
63
  window.$RefreshSig$ = prevRefreshSig;
64
64
  }`;
65
- const sharedFooter = `
65
+ const sharedFooter = (id) => `
66
66
  if (import.meta.hot && !inWebWorker) {
67
67
  RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
68
- RefreshRuntime.registerExportsForReactRefresh(__SOURCE__, currentExports);
68
+ RefreshRuntime.registerExportsForReactRefresh(${JSON.stringify(
69
+ id
70
+ )}, currentExports);
69
71
  import.meta.hot.accept((nextExports) => {
70
72
  if (!nextExports) return;
71
- const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate(currentExports, nextExports);
73
+ const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate(${JSON.stringify(
74
+ id
75
+ )}, currentExports, nextExports);
72
76
  if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
73
77
  });
74
78
  });
75
79
  }`;
76
80
  function addRefreshWrapper(code, id) {
77
- return sharedHeader + functionHeader.replace("__SOURCE__", JSON.stringify(id)) + code + functionFooter + sharedFooter.replace("__SOURCE__", JSON.stringify(id));
81
+ return sharedHeader + functionHeader.replace("__SOURCE__", JSON.stringify(id)) + code + functionFooter + sharedFooter(id);
78
82
  }
79
83
  function addClassComponentRefreshWrapper(code, id) {
80
- return sharedHeader + code + sharedFooter.replace("__SOURCE__", JSON.stringify(id));
84
+ return sharedHeader + code + sharedFooter(id);
81
85
  }
82
86
 
83
87
  let babel;
@@ -223,7 +227,7 @@ function viteReact(opts = {}) {
223
227
  };
224
228
  const dependencies = ["react", jsxImportDevRuntime, jsxImportRuntime];
225
229
  const staticBabelPlugins = typeof opts.babel === "object" ? opts.babel?.plugins ?? [] : [];
226
- if (hasCompiler(staticBabelPlugins)) {
230
+ if (hasCompilerWithDefaultRuntime(staticBabelPlugins)) {
227
231
  dependencies.push("react/compiler-runtime");
228
232
  }
229
233
  const viteReactRefresh = {
@@ -268,6 +272,9 @@ const silenceUseClientWarning = (userConfig) => ({
268
272
  if (warning.code === "MODULE_LEVEL_DIRECTIVE" && warning.message.includes("use client")) {
269
273
  return;
270
274
  }
275
+ if (warning.code === "SOURCEMAP_ERROR" && warning.message.includes("resolve original location") && warning.pos === 0) {
276
+ return;
277
+ }
271
278
  if (userConfig.build?.rollupOptions?.onwarn) {
272
279
  userConfig.build.rollupOptions.onwarn(warning, defaultHandler);
273
280
  } else {
@@ -311,6 +318,11 @@ function hasCompiler(plugins) {
311
318
  (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler"
312
319
  );
313
320
  }
321
+ function hasCompilerWithDefaultRuntime(plugins) {
322
+ return plugins.some(
323
+ (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler" && p[1]?.runtimeModule === void 0
324
+ );
325
+ }
314
326
 
315
327
  module.exports = viteReact;
316
328
  module.exports.default = viteReact;
package/dist/index.mjs CHANGED
@@ -54,22 +54,26 @@ if (import.meta.hot && !inWebWorker) {
54
54
  window.$RefreshReg$ = prevRefreshReg;
55
55
  window.$RefreshSig$ = prevRefreshSig;
56
56
  }`;
57
- const sharedFooter = `
57
+ const sharedFooter = (id) => `
58
58
  if (import.meta.hot && !inWebWorker) {
59
59
  RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
60
- RefreshRuntime.registerExportsForReactRefresh(__SOURCE__, currentExports);
60
+ RefreshRuntime.registerExportsForReactRefresh(${JSON.stringify(
61
+ id
62
+ )}, currentExports);
61
63
  import.meta.hot.accept((nextExports) => {
62
64
  if (!nextExports) return;
63
- const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate(currentExports, nextExports);
65
+ const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate(${JSON.stringify(
66
+ id
67
+ )}, currentExports, nextExports);
64
68
  if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
65
69
  });
66
70
  });
67
71
  }`;
68
72
  function addRefreshWrapper(code, id) {
69
- return sharedHeader + functionHeader.replace("__SOURCE__", JSON.stringify(id)) + code + functionFooter + sharedFooter.replace("__SOURCE__", JSON.stringify(id));
73
+ return sharedHeader + functionHeader.replace("__SOURCE__", JSON.stringify(id)) + code + functionFooter + sharedFooter(id);
70
74
  }
71
75
  function addClassComponentRefreshWrapper(code, id) {
72
- return sharedHeader + code + sharedFooter.replace("__SOURCE__", JSON.stringify(id));
76
+ return sharedHeader + code + sharedFooter(id);
73
77
  }
74
78
 
75
79
  let babel;
@@ -215,7 +219,7 @@ function viteReact(opts = {}) {
215
219
  };
216
220
  const dependencies = ["react", jsxImportDevRuntime, jsxImportRuntime];
217
221
  const staticBabelPlugins = typeof opts.babel === "object" ? opts.babel?.plugins ?? [] : [];
218
- if (hasCompiler(staticBabelPlugins)) {
222
+ if (hasCompilerWithDefaultRuntime(staticBabelPlugins)) {
219
223
  dependencies.push("react/compiler-runtime");
220
224
  }
221
225
  const viteReactRefresh = {
@@ -260,6 +264,9 @@ const silenceUseClientWarning = (userConfig) => ({
260
264
  if (warning.code === "MODULE_LEVEL_DIRECTIVE" && warning.message.includes("use client")) {
261
265
  return;
262
266
  }
267
+ if (warning.code === "SOURCEMAP_ERROR" && warning.message.includes("resolve original location") && warning.pos === 0) {
268
+ return;
269
+ }
263
270
  if (userConfig.build?.rollupOptions?.onwarn) {
264
271
  userConfig.build.rollupOptions.onwarn(warning, defaultHandler);
265
272
  } else {
@@ -303,5 +310,10 @@ function hasCompiler(plugins) {
303
310
  (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler"
304
311
  );
305
312
  }
313
+ function hasCompilerWithDefaultRuntime(plugins) {
314
+ return plugins.some(
315
+ (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler" && p[1]?.runtimeModule === void 0
316
+ );
317
+ }
306
318
 
307
319
  export { viteReact as default };
@@ -7,7 +7,14 @@ function debounce(fn, delay) {
7
7
  }
8
8
 
9
9
  /* eslint-disable no-undef */
10
- const enqueueUpdate = debounce(exports.performReactRefresh, 16)
10
+ const hooks = []
11
+ window.__registerBeforePerformReactRefresh = (cb) => {
12
+ hooks.push(cb)
13
+ }
14
+ const enqueueUpdate = debounce(async () => {
15
+ if (hooks.length) await Promise.all(hooks.map((cb) => cb()))
16
+ exports.performReactRefresh()
17
+ }, 16)
11
18
 
12
19
  // Taken from https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/lib/runtime/RefreshUtils.js#L141
13
20
  // This allows to resister components not detected by SWC like styled component
@@ -25,16 +32,30 @@ function registerExportsForReactRefresh(filename, moduleExports) {
25
32
  }
26
33
  }
27
34
 
28
- function validateRefreshBoundaryAndEnqueueUpdate(prevExports, nextExports) {
29
- if (!predicateOnExport(prevExports, (key) => key in nextExports)) {
35
+ function validateRefreshBoundaryAndEnqueueUpdate(id, prevExports, nextExports) {
36
+ const ignoredExports = window.__getReactRefreshIgnoredExports?.({ id }) ?? []
37
+ if (
38
+ predicateOnExport(
39
+ ignoredExports,
40
+ prevExports,
41
+ (key) => key in nextExports,
42
+ ) !== true
43
+ ) {
30
44
  return 'Could not Fast Refresh (export removed)'
31
45
  }
32
- if (!predicateOnExport(nextExports, (key) => key in prevExports)) {
46
+ if (
47
+ predicateOnExport(
48
+ ignoredExports,
49
+ nextExports,
50
+ (key) => key in prevExports,
51
+ ) !== true
52
+ ) {
33
53
  return 'Could not Fast Refresh (new export)'
34
54
  }
35
55
 
36
56
  let hasExports = false
37
57
  const allExportsAreComponentsOrUnchanged = predicateOnExport(
58
+ ignoredExports,
38
59
  nextExports,
39
60
  (key, value) => {
40
61
  hasExports = true
@@ -42,19 +63,20 @@ function validateRefreshBoundaryAndEnqueueUpdate(prevExports, nextExports) {
42
63
  return prevExports[key] === nextExports[key]
43
64
  },
44
65
  )
45
- if (hasExports && allExportsAreComponentsOrUnchanged) {
66
+ if (hasExports && allExportsAreComponentsOrUnchanged === true) {
46
67
  enqueueUpdate()
47
68
  } else {
48
- return 'Could not Fast Refresh. Learn more at https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#consistent-components-exports'
69
+ 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`
49
70
  }
50
71
  }
51
72
 
52
- function predicateOnExport(moduleExports, predicate) {
73
+ function predicateOnExport(ignoredExports, moduleExports, predicate) {
53
74
  for (const key in moduleExports) {
54
75
  if (key === '__esModule') continue
76
+ if (ignoredExports.includes(key)) continue
55
77
  const desc = Object.getOwnPropertyDescriptor(moduleExports, key)
56
- if (desc && desc.get) return false
57
- if (!predicate(key, moduleExports[key])) return false
78
+ if (desc && desc.get) return key
79
+ if (!predicate(key, moduleExports[key])) return key
58
80
  }
59
81
  return true
60
82
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitejs/plugin-react",
3
- "version": "4.3.0",
3
+ "version": "4.3.2",
4
4
  "license": "MIT",
5
5
  "author": "Evan You",
6
6
  "contributors": [
@@ -38,9 +38,9 @@
38
38
  },
39
39
  "homepage": "https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#readme",
40
40
  "dependencies": {
41
- "@babel/core": "^7.24.5",
42
- "@babel/plugin-transform-react-jsx-self": "^7.24.5",
43
- "@babel/plugin-transform-react-jsx-source": "^7.24.1",
41
+ "@babel/core": "^7.25.2",
42
+ "@babel/plugin-transform-react-jsx-self": "^7.24.7",
43
+ "@babel/plugin-transform-react-jsx-source": "^7.24.7",
44
44
  "@types/babel__core": "^7.20.5",
45
45
  "react-refresh": "^0.14.2"
46
46
  },