From a634b57650f4ed06a536fccf3076da4ff87b7374 Mon Sep 17 00:00:00 2001 From: Kevin Gozali Date: Wed, 24 Jul 2024 14:48:54 -0700 Subject: [PATCH] Allow passing through optional custom transform options to Metro (#45634) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/45634 This allows the Android runtime to pass additional options to Metro. Each app can decide what to send based on the needs. The use case is to send transform.xyz=somevalue to Metro. Changelog: [Internal] Reviewed By: javache Differential Revision: D60155757 fbshipit-source-id: 006d5ff2e3f14634fb39d44b390f30da479b1faa --- .../react-native/ReactAndroid/api/ReactAndroid.api | 5 +++++ .../facebook/react/devsupport/DevServerHelper.java | 11 ++++++++++- .../react/devsupport/DevSupportManagerBase.java | 5 +++++ .../react/devsupport/ReleaseDevSupportManager.java | 3 +++ .../react/devsupport/interfaces/DevSupportManager.kt | 5 ++++- .../PackagerConnectionSettings.java | 11 +++++++++++ 6 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index d60bbbb9898..8afeee79e05 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -2141,6 +2141,7 @@ public abstract class com/facebook/react/devsupport/DevSupportManagerBase : com/ public fun registerErrorCustomizer (Lcom/facebook/react/devsupport/interfaces/ErrorCustomizer;)V public fun reloadJSFromServer (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/BundleLoadCallback;)V public fun reloadSettings ()V + public fun setAdditionalOptionForPackager (Ljava/lang/String;Ljava/lang/String;)V public fun setDevSupportEnabled (Z)V public fun setFpsDebugEnabled (Z)V public fun setHotModuleReplacementEnabled (Z)V @@ -2305,6 +2306,7 @@ public class com/facebook/react/devsupport/ReleaseDevSupportManager : com/facebo public fun registerErrorCustomizer (Lcom/facebook/react/devsupport/interfaces/ErrorCustomizer;)V public fun reloadJSFromServer (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/BundleLoadCallback;)V public fun reloadSettings ()V + public fun setAdditionalOptionForPackager (Ljava/lang/String;Ljava/lang/String;)V public fun setDevSupportEnabled (Z)V public fun setFpsDebugEnabled (Z)V public fun setHotModuleReplacementEnabled (Z)V @@ -2424,6 +2426,7 @@ public abstract interface class com/facebook/react/devsupport/interfaces/DevSupp public abstract fun registerErrorCustomizer (Lcom/facebook/react/devsupport/interfaces/ErrorCustomizer;)V public abstract fun reloadJSFromServer (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/BundleLoadCallback;)V public abstract fun reloadSettings ()V + public abstract fun setAdditionalOptionForPackager (Ljava/lang/String;Ljava/lang/String;)V public abstract fun setDevSupportEnabled (Z)V public abstract fun setFpsDebugEnabled (Z)V public abstract fun setHotModuleReplacementEnabled (Z)V @@ -3666,8 +3669,10 @@ public abstract class com/facebook/react/packagerconnection/NotificationOnlyHand public class com/facebook/react/packagerconnection/PackagerConnectionSettings { public fun (Landroid/content/Context;)V + public fun getAdditionalOptionsForPackager ()Ljava/util/Map; public fun getDebugServerHost ()Ljava/lang/String; public fun getPackageName ()Ljava/lang/String; + public fun setAdditionalOptionForPackager (Ljava/lang/String;Ljava/lang/String;)V public fun setDebugServerHost (Ljava/lang/String;)V } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java index 5e907fd884a..b1c41bb38d5 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java @@ -385,6 +385,14 @@ public class DevServerHelper { private String createBundleURL( String mainModuleID, BundleType type, String host, boolean modulesOnly, boolean runModule) { boolean dev = getDevMode(); + StringBuilder additionalOptionsBuilder = new StringBuilder(); + for (Map.Entry entry : + mPackagerConnectionSettings.getAdditionalOptionsForPackager().entrySet()) { + if (entry.getValue().length() == 0) { + continue; + } + additionalOptionsBuilder.append("&" + entry.getKey() + "=" + Uri.encode(entry.getValue())); + } return String.format( Locale.US, "http://%s/%s.%s?platform=android&dev=%s&lazy=%s&minify=%s&app=%s&modulesOnly=%s&runModule=%s", @@ -397,7 +405,8 @@ public class DevServerHelper { mPackageName, modulesOnly ? "true" : "false", runModule ? "true" : "false") - + (InspectorFlags.getFuseboxEnabled() ? "&excludeSource=true&sourcePaths=url-server" : ""); + + (InspectorFlags.getFuseboxEnabled() ? "&excludeSource=true&sourcePaths=url-server" : "") + + additionalOptionsBuilder.toString(); } private String createBundleURL(String mainModuleID, BundleType type) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java index ebd0a03a439..d02f9bb3b63 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java @@ -1183,4 +1183,9 @@ public abstract class DevSupportManagerBase implements DevSupportManager { public void hidePausedInDebuggerOverlay() { mPausedInDebuggerOverlayManager.hidePausedInDebuggerOverlay(); } + + @Override + public void setAdditionalOptionForPackager(String name, String value) { + mDevSettings.getPackagerConnectionSettings().setAdditionalOptionForPackager(name, value); + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReleaseDevSupportManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReleaseDevSupportManager.java index 5484c706c71..94dd527db59 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReleaseDevSupportManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReleaseDevSupportManager.java @@ -211,4 +211,7 @@ public class ReleaseDevSupportManager implements DevSupportManager { @Override public void hidePausedInDebuggerOverlay() {} + + @Override + public void setAdditionalOptionForPackager(String name, String value) {} } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.kt index 3ec1c944eef..67bc3b0e21b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.kt @@ -106,12 +106,15 @@ public interface DevSupportManager : JSExceptionHandler { /** Shows the "paused in debugger" overlay with the given message. */ public fun showPausedInDebuggerOverlay( message: String, - listener: PausedInDebuggerOverlayCommandListener + listener: PausedInDebuggerOverlayCommandListener, ) /** Hides the "paused in debugger" overlay, if currently shown. */ public fun hidePausedInDebuggerOverlay() + /** Add an option to send to packager when requesting JS bundle. */ + public fun setAdditionalOptionForPackager(name: String, value: String) + /** * The PackagerLocationCustomizer allows you to have a dynamic packager location that is * determined right before loading the packager. Your customizer must call |callback|, as loading diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/PackagerConnectionSettings.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/PackagerConnectionSettings.java index ae9dc75e2b9..50522f8b2c1 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/PackagerConnectionSettings.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/PackagerConnectionSettings.java @@ -16,6 +16,8 @@ import com.facebook.common.logging.FLog; import com.facebook.infer.annotation.Assertions; import com.facebook.infer.annotation.Nullsafe; import com.facebook.react.modules.systeminfo.AndroidInfoHelpers; +import java.util.HashMap; +import java.util.Map; @Nullsafe(Nullsafe.Mode.LOCAL) public class PackagerConnectionSettings { @@ -25,6 +27,7 @@ public class PackagerConnectionSettings { private final SharedPreferences mPreferences; private final String mPackageName; private final Context mAppContext; + private final Map mAdditionalOptionsForPackager = new HashMap<>(); public PackagerConnectionSettings(Context applicationContext) { mPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext); @@ -62,4 +65,12 @@ public class PackagerConnectionSettings { public @Nullable String getPackageName() { return mPackageName; } + + public void setAdditionalOptionForPackager(String key, String value) { + mAdditionalOptionsForPackager.put(key, value); + } + + public Map getAdditionalOptionsForPackager() { + return mAdditionalOptionsForPackager; + } }