diff --git a/packages/react-refresh/src/ReactFreshRuntime.js b/packages/react-refresh/src/ReactFreshRuntime.js index e6f0fb70ae5c6..252375eee8faa 100644 --- a/packages/react-refresh/src/ReactFreshRuntime.js +++ b/packages/react-refresh/src/ReactFreshRuntime.js @@ -178,6 +178,15 @@ function cloneSet(set: Set): Set { return clone; } +// This is a safety mechanism to protect against rogue getters and Proxies. +function getProperty(object, property) { + try { + return object[property]; + } catch (err) { + return undefined; + } +} + export function performReactRefresh(): RefreshUpdate | null { if (!__DEV__) { throw new Error( @@ -322,7 +331,7 @@ export function register(type: any, id: string): void { // Visit inner types because we might not have registered them. if (typeof type === 'object' && type !== null) { - switch (type.$$typeof) { + switch (getProperty(type, '$$typeof')) { case REACT_FORWARD_REF_TYPE: register(type.render, id + '$render'); break; @@ -676,7 +685,7 @@ export function isLikelyComponentType(type: any): boolean { } case 'object': { if (type != null) { - switch (type.$$typeof) { + switch (getProperty(type, '$$typeof')) { case REACT_FORWARD_REF_TYPE: case REACT_MEMO_TYPE: // Definitely React components.