Skip to content

Commit b363336

Browse files
committed
Fix react refresh for class components
1 parent 9321611 commit b363336

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

packages/app/src/sandbox/eval/presets/create-react-app/v3.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ export default function initialize() {
131131
dependencies['react-dom'] &&
132132
isMinimalReactVersion(dependencies['react-dom'], '16.9.0')
133133
) {
134-
return { ...dependencies, 'react-refresh': '0.7.2' };
134+
return { ...dependencies, 'react-refresh': '0.8.1' };
135135
}
136136

137137
return dependencies;

packages/app/src/sandbox/eval/transpilers/react/refresh-transpiler.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,34 @@ function isReactRefreshBoundary(moduleExports) {
6262
return hasExports && areAllExportsComponents;
6363
};
6464
65+
var registerExportsForReactRefresh = (moduleExports, moduleID) => {
66+
Refresh.register(moduleExports, moduleID + ' %exports%');
67+
if (moduleExports == null || typeof moduleExports !== 'object') {
68+
// Exit if we can't iterate over exports.
69+
// (This is important for legacy environments.)
70+
return;
71+
}
72+
for (const key in moduleExports) {
73+
const desc = Object.getOwnPropertyDescriptor(moduleExports, key);
74+
if (desc && desc.get) {
75+
// Don't invoke getters as they may have side effects.
76+
continue;
77+
}
78+
const exportValue = moduleExports[key];
79+
const typeID = moduleID + ' %exports% ' + key;
80+
Refresh.register(exportValue, typeID);
81+
}
82+
};
83+
6584
module.exports = {
6685
enqueueUpdate: debounce(enqueueUpdate, 30),
67-
isReactRefreshBoundary
86+
isReactRefreshBoundary,
87+
registerExportsForReactRefresh
6888
};
6989
`.trim();
7090

7191
/**
72-
* `var prevRefreshReg = window.$RefreshReg$;
92+
var prevRefreshReg = window.$RefreshReg$;
7393
var prevRefreshSig = window.$RefreshSig$;
7494
var RefreshRuntime = require('react-refresh/runtime');
7595
@@ -90,6 +110,7 @@ try {
90110
const _csbRefreshUtils = require('${HELPER_PATH}');
91111
92112
if (_csbRefreshUtils.isReactRefreshBoundary && _csbRefreshUtils.isReactRefreshBoundary(module.exports)) {
113+
_csbRefreshUtils.registerExportsForReactRefresh(module.exports, module.id)
93114
module.hot.accept();
94115
_csbRefreshUtils.enqueueUpdate();
95116
}
@@ -101,9 +122,8 @@ if (_csbRefreshUtils.isReactRefreshBoundary && _csbRefreshUtils.isReactRefreshBo
101122
* to a single line so we don't mess with the source mapping when showing errors.
102123
*/
103124
const getWrapperCode = (sourceCode: string) =>
104-
`var prevRefreshReg=window.$RefreshReg$,prevRefreshSig=window.$RefreshSig$,RefreshRuntime=require("react-refresh/runtime");window.$RefreshReg$=(a,b)=>{const c=module.id+" "+b;RefreshRuntime.register(a,c)},window.$RefreshSig$=RefreshRuntime.createSignatureFunctionForTransform;try{${sourceCode}
105-
}finally{window.$RefreshReg$=prevRefreshReg,window.$RefreshSig$=prevRefreshSig}const _csbRefreshUtils=require("${HELPER_PATH}");_csbRefreshUtils.isReactRefreshBoundary&&_csbRefreshUtils.isReactRefreshBoundary(module.exports)&&(module.hot.accept(),_csbRefreshUtils.enqueueUpdate());
106-
`.trim();
125+
`var prevRefreshReg=window.$RefreshReg$,prevRefreshSig=window.$RefreshSig$,RefreshRuntime=require("react-refresh/runtime");window.$RefreshReg$=((e,r)=>{const s=module.id+" "+r;RefreshRuntime.register(e,s)}),window.$RefreshSig$=RefreshRuntime.createSignatureFunctionForTransform;try{${sourceCode}
126+
}finally{window.$RefreshReg$=prevRefreshReg,window.$RefreshSig$=prevRefreshSig}const _csbRefreshUtils=require("${HELPER_PATH}");_csbRefreshUtils.isReactRefreshBoundary&&_csbRefreshUtils.isReactRefreshBoundary(module.exports)&&(_csbRefreshUtils.registerExportsForReactRefresh(module.exports,module.id),module.hot.accept(),_csbRefreshUtils.enqueueUpdate());`.trim();
107127

108128
class RefreshTranspiler extends Transpiler {
109129
constructor() {

0 commit comments

Comments
 (0)