33 * @module environments/development
44 */
55
6+ import type { RuleSetUseItem } from "webpack"
67import type {
78 WebpackConfigWithDevServer ,
89 RspackConfigWithDevServer
@@ -16,6 +17,21 @@ const webpackDevServerConfig = require("../webpackDevServerConfig")
1617const { runningWebpackDevServer } = require ( "../env" )
1718const { moduleExists } = require ( "../utils/helpers" )
1819
20+ let rspackReactRefreshTransformEnabled = false
21+
22+ type SwcLoaderUse = {
23+ loader ?: string
24+ options ?: {
25+ jsc ?: {
26+ transform ?: {
27+ react ?: {
28+ refresh ?: boolean
29+ }
30+ }
31+ }
32+ }
33+ }
34+
1935/**
2036 * Base development configuration shared between webpack and rspack
2137 */
@@ -85,6 +101,7 @@ const rspackDevConfig = (): RspackConfigWithDevServer => {
85101 "[SHAKAPACKER WARNING] Could not resolve a constructor from @rspack/plugin-react-refresh; React Refresh will be skipped in development."
86102 )
87103 } else {
104+ rspackReactRefreshTransformEnabled = true
88105 rspackConfig . plugins = [
89106 ...( rspackConfig . plugins || [ ] ) ,
90107 new ReactRefreshRspackPlugin ( )
@@ -95,7 +112,39 @@ const rspackDevConfig = (): RspackConfigWithDevServer => {
95112 return rspackConfig
96113}
97114
115+ const enableRspackReactRefreshTransform = (
116+ environmentConfig : RspackConfigWithDevServer
117+ ) => {
118+ const rules = environmentConfig . module ?. rules
119+ if ( ! Array . isArray ( rules ) ) return
120+
121+ rules . forEach ( ( rule ) => {
122+ if ( ! rule || typeof rule !== "object" || ! ( "use" in rule ) ) return
123+
124+ const ruleWithUse = rule as { use ?: RuleSetUseItem | RuleSetUseItem [ ] }
125+ const loaders = Array . isArray ( ruleWithUse . use )
126+ ? ruleWithUse . use
127+ : [ ruleWithUse . use ]
128+
129+ loaders . forEach ( ( loader ) => {
130+ if ( ! loader || typeof loader !== "object" || ! ( "loader" in loader ) ) return
131+
132+ const loaderConfig = loader as SwcLoaderUse
133+ if ( loaderConfig . loader === "builtin:swc-loader" ) {
134+ const reactTransform = loaderConfig . options ?. jsc ?. transform ?. react
135+ if ( reactTransform ) reactTransform . refresh = true
136+ }
137+ } )
138+ } )
139+ }
140+
98141const bundlerConfig =
99142 config . assets_bundler === "rspack" ? rspackDevConfig ( ) : webpackDevConfig ( )
100143
101- module . exports = merge ( baseConfig , bundlerConfig )
144+ const environmentConfig = merge ( baseConfig , bundlerConfig )
145+
146+ if ( config . assets_bundler === "rspack" && rspackReactRefreshTransformEnabled ) {
147+ enableRspackReactRefreshTransform ( environmentConfig )
148+ }
149+
150+ module . exports = environmentConfig
0 commit comments