@vitejs/plugin-react 4.3.1 → 4.3.3

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;
@@ -194,7 +198,7 @@ function viteReact(opts = {}) {
194
198
  // Required for esbuild.jsxDev to provide correct line numbers
195
199
  // This crates issues the react compiler because the re-order is too important
196
200
  // People should use @babel/plugin-transform-react-jsx-development to get back good line numbers
197
- retainLines: hasCompiler(plugins) ? false : !isProduction && isJSX && opts.jsxRuntime !== "classic",
201
+ retainLines: getReactCompilerPlugin(plugins) != null ? false : !isProduction && isJSX && opts.jsxRuntime !== "classic",
198
202
  parserOpts: {
199
203
  ...babelOptions.parserOpts,
200
204
  sourceType: "module",
@@ -221,10 +225,17 @@ function viteReact(opts = {}) {
221
225
  }
222
226
  }
223
227
  };
224
- const dependencies = ["react", jsxImportDevRuntime, jsxImportRuntime];
228
+ const dependencies = [
229
+ "react",
230
+ "react-dom",
231
+ jsxImportDevRuntime,
232
+ jsxImportRuntime
233
+ ];
225
234
  const staticBabelPlugins = typeof opts.babel === "object" ? opts.babel?.plugins ?? [] : [];
226
- if (hasCompilerWithDefaultRuntime(staticBabelPlugins)) {
227
- dependencies.push("react/compiler-runtime");
235
+ const reactCompilerPlugin = getReactCompilerPlugin(staticBabelPlugins);
236
+ if (reactCompilerPlugin != null) {
237
+ const reactCompilerRuntimeModule = getReactCompilerRuntimeModule(reactCompilerPlugin);
238
+ dependencies.push(reactCompilerRuntimeModule);
228
239
  }
229
240
  const viteReactRefresh = {
230
241
  name: "vite:react-refresh",
@@ -268,6 +279,9 @@ const silenceUseClientWarning = (userConfig) => ({
268
279
  if (warning.code === "MODULE_LEVEL_DIRECTIVE" && warning.message.includes("use client")) {
269
280
  return;
270
281
  }
282
+ if (warning.code === "SOURCEMAP_ERROR" && warning.message.includes("resolve original location") && warning.pos === 0) {
283
+ return;
284
+ }
271
285
  if (userConfig.build?.rollupOptions?.onwarn) {
272
286
  userConfig.build.rollupOptions.onwarn(warning, defaultHandler);
273
287
  } else {
@@ -306,15 +320,21 @@ function createBabelOptions(rawOptions) {
306
320
  function defined(value) {
307
321
  return value !== void 0;
308
322
  }
309
- function hasCompiler(plugins) {
310
- return plugins.some(
323
+ function getReactCompilerPlugin(plugins) {
324
+ return plugins.find(
311
325
  (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler"
312
326
  );
313
327
  }
314
- function hasCompilerWithDefaultRuntime(plugins) {
315
- return plugins.some(
316
- (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler" && p[1]?.runtimeModule === void 0
317
- );
328
+ function getReactCompilerRuntimeModule(plugin) {
329
+ let moduleName = "react/compiler-runtime";
330
+ if (Array.isArray(plugin)) {
331
+ if (plugin[1]?.target === "17" || plugin[1]?.target === "18") {
332
+ moduleName = "react-compiler-runtime";
333
+ } else if (typeof plugin[1]?.runtimeModule === "string") {
334
+ moduleName = plugin[1]?.runtimeModule;
335
+ }
336
+ }
337
+ return moduleName;
318
338
  }
319
339
 
320
340
  module.exports = 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;
@@ -186,7 +190,7 @@ function viteReact(opts = {}) {
186
190
  // Required for esbuild.jsxDev to provide correct line numbers
187
191
  // This crates issues the react compiler because the re-order is too important
188
192
  // People should use @babel/plugin-transform-react-jsx-development to get back good line numbers
189
- retainLines: hasCompiler(plugins) ? false : !isProduction && isJSX && opts.jsxRuntime !== "classic",
193
+ retainLines: getReactCompilerPlugin(plugins) != null ? false : !isProduction && isJSX && opts.jsxRuntime !== "classic",
190
194
  parserOpts: {
191
195
  ...babelOptions.parserOpts,
192
196
  sourceType: "module",
@@ -213,10 +217,17 @@ function viteReact(opts = {}) {
213
217
  }
214
218
  }
215
219
  };
216
- const dependencies = ["react", jsxImportDevRuntime, jsxImportRuntime];
220
+ const dependencies = [
221
+ "react",
222
+ "react-dom",
223
+ jsxImportDevRuntime,
224
+ jsxImportRuntime
225
+ ];
217
226
  const staticBabelPlugins = typeof opts.babel === "object" ? opts.babel?.plugins ?? [] : [];
218
- if (hasCompilerWithDefaultRuntime(staticBabelPlugins)) {
219
- dependencies.push("react/compiler-runtime");
227
+ const reactCompilerPlugin = getReactCompilerPlugin(staticBabelPlugins);
228
+ if (reactCompilerPlugin != null) {
229
+ const reactCompilerRuntimeModule = getReactCompilerRuntimeModule(reactCompilerPlugin);
230
+ dependencies.push(reactCompilerRuntimeModule);
220
231
  }
221
232
  const viteReactRefresh = {
222
233
  name: "vite:react-refresh",
@@ -260,6 +271,9 @@ const silenceUseClientWarning = (userConfig) => ({
260
271
  if (warning.code === "MODULE_LEVEL_DIRECTIVE" && warning.message.includes("use client")) {
261
272
  return;
262
273
  }
274
+ if (warning.code === "SOURCEMAP_ERROR" && warning.message.includes("resolve original location") && warning.pos === 0) {
275
+ return;
276
+ }
263
277
  if (userConfig.build?.rollupOptions?.onwarn) {
264
278
  userConfig.build.rollupOptions.onwarn(warning, defaultHandler);
265
279
  } else {
@@ -298,15 +312,21 @@ function createBabelOptions(rawOptions) {
298
312
  function defined(value) {
299
313
  return value !== void 0;
300
314
  }
301
- function hasCompiler(plugins) {
302
- return plugins.some(
315
+ function getReactCompilerPlugin(plugins) {
316
+ return plugins.find(
303
317
  (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler"
304
318
  );
305
319
  }
306
- function hasCompilerWithDefaultRuntime(plugins) {
307
- return plugins.some(
308
- (p) => p === "babel-plugin-react-compiler" || Array.isArray(p) && p[0] === "babel-plugin-react-compiler" && p[1]?.runtimeModule === void 0
309
- );
320
+ function getReactCompilerRuntimeModule(plugin) {
321
+ let moduleName = "react/compiler-runtime";
322
+ if (Array.isArray(plugin)) {
323
+ if (plugin[1]?.target === "17" || plugin[1]?.target === "18") {
324
+ moduleName = "react-compiler-runtime";
325
+ } else if (typeof plugin[1]?.runtimeModule === "string") {
326
+ moduleName = plugin[1]?.runtimeModule;
327
+ }
328
+ }
329
+ return moduleName;
310
330
  }
311
331
 
312
332
  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.1",
3
+ "version": "4.3.3",
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
  },