From 978d484c57cd33e7f0a94cdc8a45401dc1ec0199 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Wed, 10 Sep 2025 14:24:43 +0100 Subject: [PATCH] Fix metro-runtime's require system getter checks for ESM live bindings --- .../metro-runtime/src/polyfills/require.js | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/metro-runtime/src/polyfills/require.js b/packages/metro-runtime/src/polyfills/require.js index aad735f446..f238f50a1d 100644 --- a/packages/metro-runtime/src/polyfills/require.js +++ b/packages/metro-runtime/src/polyfills/require.js @@ -929,6 +929,19 @@ if (__DEV__) { } }; + // We skip getters, but only on non ESM output + var isSpecifierSafeToCheck = ( + moduleExports: Exports, + key: string, + ): boolean => { + if (moduleExports && moduleExports.__esModule) { + return true; + } else { + const desc = Object.getOwnPropertyDescriptor(moduleExports, key); + return !desc || !desc.get; + } + }; + // Modules that only export components become React Refresh boundaries. var isReactRefreshBoundary = function ( Refresh: any, @@ -947,9 +960,7 @@ if (__DEV__) { hasExports = true; if (key === '__esModule') { continue; - } - const desc = Object.getOwnPropertyDescriptor(moduleExports, key); - if (desc && desc.get) { + } else if (!isSpecifierSafeToCheck(moduleExports, key)) { // Don't invoke getters as they may have side effects. return false; } @@ -994,9 +1005,7 @@ if (__DEV__) { for (const key in moduleExports) { if (key === '__esModule') { continue; - } - const desc = Object.getOwnPropertyDescriptor(moduleExports, key); - if (desc && desc.get) { + } else if (!isSpecifierSafeToCheck(moduleExports, key)) { continue; } const exportValue = moduleExports[key]; @@ -1018,8 +1027,7 @@ if (__DEV__) { return; } for (const key in moduleExports) { - const desc = Object.getOwnPropertyDescriptor(moduleExports, key); - if (desc && desc.get) { + if (!isSpecifierSafeToCheck(moduleExports, key)) { // Don't invoke getters as they may have side effects. continue; }