expo 55.0.0-canary-20260119-70f7c28 → 55.0.0-canary-20260119-17896bf

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/Expo.podspec +0 -1
  2. package/android/build.gradle +5 -5
  3. package/android/src/main/java/expo/modules/ExpoReactHostFactory.kt +32 -67
  4. package/android/src/main/java/expo/modules/ReactActivityDelegateWrapper.kt +9 -6
  5. package/android/src/main/java/expo/modules/ReactNativeHostWrapper.kt +51 -0
  6. package/android/src/main/java/expo/modules/ReactNativeHostWrapperBase.kt +107 -0
  7. package/android/src/main/java/expo/modules/fetch/ExpoFetchModule.kt +3 -4
  8. package/android/src/main/java/expo/modules/fetch/NativeResponse.kt +3 -3
  9. package/android/src/main/java/expo/modules/fetch/ResponseSink.kt +3 -7
  10. package/android/src/test/java/expo/modules/ReactActivityDelegateWrapperDelayLoadTest.kt +3 -2
  11. package/build/Expo.d.ts +1 -1
  12. package/build/Expo.d.ts.map +1 -1
  13. package/build/async-require/getDevServer.d.ts.map +1 -1
  14. package/build/async-require/hmr.d.ts +8 -8
  15. package/build/async-require/hmr.d.ts.map +1 -1
  16. package/build/async-require/hmr.native.d.ts +3 -0
  17. package/build/async-require/hmr.native.d.ts.map +1 -0
  18. package/build/dom/dom-entry.d.ts.map +1 -1
  19. package/build/dom/dom.types.d.ts +0 -5
  20. package/build/dom/dom.types.d.ts.map +1 -1
  21. package/build/dom/internal.d.ts +0 -1
  22. package/build/dom/internal.d.ts.map +1 -1
  23. package/build/dom/webview-wrapper.d.ts +2 -2
  24. package/build/dom/webview-wrapper.d.ts.map +1 -1
  25. package/build/hooks/useEvent.d.ts +2 -2
  26. package/bundledNativeModules.json +101 -99
  27. package/ios/AppDelegates/AppDelegatesLoaderDelegate.swift +0 -2
  28. package/ios/AppDelegates/EXAppDelegateWrapper.h +30 -0
  29. package/ios/AppDelegates/EXAppDelegateWrapper.mm +112 -0
  30. package/ios/AppDelegates/EXReactRootViewFactory.h +1 -8
  31. package/ios/AppDelegates/EXReactRootViewFactory.mm +0 -26
  32. package/ios/AppDelegates/ExpoAppDelegate.swift +52 -13
  33. package/ios/AppDelegates/ExpoReactNativeFactory.swift +1 -22
  34. package/ios/Expo.h +1 -2
  35. package/ios/Fetch/ExpoFetchModule.swift +2 -2
  36. package/package.json +23 -29
  37. package/src/Expo.fx.tsx +25 -1
  38. package/src/Expo.fx.web.tsx +2 -2
  39. package/src/Expo.ts +0 -3
  40. package/src/__tests__/__fbBatchedBridgeConfig-test.ts +3 -7
  41. package/src/async-require/asyncRequireModule.ts +2 -2
  42. package/src/async-require/getDevServer.ts +9 -3
  43. package/src/async-require/hmr.native.ts +3 -0
  44. package/src/async-require/hmr.ts +103 -118
  45. package/src/async-require/index.ts +1 -1
  46. package/src/async-require/setupFastRefresh.ts +2 -3
  47. package/src/dom/dom-entry.tsx +8 -15
  48. package/src/dom/dom.types.ts +0 -6
  49. package/src/dom/internal.ts +0 -2
  50. package/src/dom/webview-wrapper.tsx +6 -14
  51. package/src/hooks/useEvent.ts +2 -2
  52. package/template.tgz +0 -0
  53. package/types/react-native-web.d.ts +1 -1
  54. package/build/async-require/buildErrors.d.ts +0 -5
  55. package/build/async-require/buildErrors.d.ts.map +0 -1
  56. package/build/async-require/getFullBundlerUrl.d.ts +0 -2
  57. package/build/async-require/getFullBundlerUrl.d.ts.map +0 -1
  58. package/build/async-require/hmrUtils.d.ts +0 -13
  59. package/build/async-require/hmrUtils.d.ts.map +0 -1
  60. package/build/async-require/hmrUtils.native.d.ts +0 -13
  61. package/build/async-require/hmrUtils.native.d.ts.map +0 -1
  62. package/build/dom/dom-internal.types.d.ts +0 -11
  63. package/build/dom/dom-internal.types.d.ts.map +0 -1
  64. package/ios/AppDelegates/ExpoReactNativeFactory.h +0 -12
  65. package/ios/AppDelegates/ExpoReactNativeFactory.mm +0 -45
  66. package/local-build-cache-provider.d.ts +0 -1
  67. package/local-build-cache-provider.js +0 -1
  68. package/src/async-require/buildErrors.ts +0 -14
  69. package/src/async-require/getFullBundlerUrl.ts +0 -13
  70. package/src/async-require/hmrUtils.native.ts +0 -97
  71. package/src/async-require/hmrUtils.ts +0 -54
  72. package/src/dom/dom-internal.types.ts +0 -9
package/Expo.podspec CHANGED
@@ -40,7 +40,6 @@ Pod::Spec.new do |s|
40
40
  :osx => '11.0',
41
41
  :tvos => '15.1'
42
42
  }
43
- s.swift_version = '6.0'
44
43
  s.source = { git: 'https://github.com/expo/expo.git' }
45
44
  s.static_framework = true
46
45
  s.header_dir = 'Expo'
@@ -32,7 +32,7 @@ buildscript {
32
32
  def reactNativeVersion = project.extensions.getByType(ExpoModuleExtension).reactNativeVersion
33
33
 
34
34
  group = 'host.exp.exponent'
35
- version = '55.0.0-canary-20260119-70f7c28'
35
+ version = '55.0.0-canary-20260119-17896bf'
36
36
 
37
37
  expoModule {
38
38
  // We can't prebuild the module because it depends on the generated files.
@@ -43,7 +43,7 @@ android {
43
43
  namespace "expo.core"
44
44
  defaultConfig {
45
45
  versionCode 1
46
- versionName "55.0.0-canary-20260119-70f7c28"
46
+ versionName "55.0.0-canary-20260119-17896bf"
47
47
  consumerProguardFiles("proguard-rules.pro")
48
48
  }
49
49
  testOptions {
@@ -78,11 +78,11 @@ dependencies { dependencyHandler ->
78
78
  implementation 'com.facebook.react:react-android'
79
79
 
80
80
  testImplementation 'junit:junit:4.13.2'
81
+ testImplementation 'androidx.test:core:1.5.0'
82
+ testImplementation "com.google.truth:truth:1.1.2"
81
83
  testImplementation 'io.mockk:mockk:1.13.5'
82
- testImplementation 'androidx.test:core:1.7.0'
83
- testImplementation "com.google.truth:truth:1.4.5"
84
84
  testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2'
85
- testImplementation 'org.robolectric:robolectric:4.16'
85
+ testImplementation 'org.robolectric:robolectric:4.15.1'
86
86
 
87
87
  if (useLegacyAutolinking) {
88
88
  // Link expo modules as dependencies of the adapter. It uses `api` configuration so they all will be visible for the app as well.
@@ -5,12 +5,12 @@ package expo.modules
5
5
  import android.content.Context
6
6
  import com.facebook.react.ReactHost
7
7
  import com.facebook.react.ReactInstanceEventListener
8
+ import com.facebook.react.ReactNativeHost
8
9
  import com.facebook.react.ReactPackage
9
10
  import com.facebook.react.ReactPackageTurboModuleManagerDelegate
10
11
  import com.facebook.react.bridge.JSBundleLoader
11
12
  import com.facebook.react.bridge.ReactContext
12
13
  import com.facebook.react.common.annotations.UnstableReactNativeAPI
13
- import com.facebook.react.common.build.ReactBuildConfig
14
14
  import com.facebook.react.defaults.DefaultComponentsRegistry
15
15
  import com.facebook.react.defaults.DefaultTurboModuleManagerDelegate
16
16
  import com.facebook.react.fabric.ComponentFactory
@@ -19,7 +19,6 @@ import com.facebook.react.runtime.JSRuntimeFactory
19
19
  import com.facebook.react.runtime.ReactHostDelegate
20
20
  import com.facebook.react.runtime.ReactHostImpl
21
21
  import com.facebook.react.runtime.hermes.HermesInstance
22
- import expo.modules.core.interfaces.ReactNativeHostHandler
23
22
  import java.lang.ref.WeakReference
24
23
 
25
24
  object ExpoReactHostFactory {
@@ -28,35 +27,12 @@ object ExpoReactHostFactory {
28
27
  @UnstableReactNativeAPI
29
28
  private class ExpoReactHostDelegate(
30
29
  private val weakContext: WeakReference<Context>,
31
- private val packageList: List<ReactPackage>,
32
- override val jsMainModulePath: String,
33
- private val jsBundleAssetPath: String?,
34
- private val jsBundleFilePath: String? = null,
35
- private val useDevSupport: Boolean,
30
+ private val reactNativeHostWrapper: ReactNativeHostWrapper,
36
31
  override val bindingsInstaller: BindingsInstaller? = null,
37
32
  override val turboModuleManagerDelegateBuilder: ReactPackageTurboModuleManagerDelegate.Builder =
38
- DefaultTurboModuleManagerDelegate.Builder(),
39
- private val hostHandlers: List<ReactNativeHostHandler>
33
+ DefaultTurboModuleManagerDelegate.Builder()
40
34
  ) : ReactHostDelegate {
41
35
 
42
- val hostDelegateJsBundleFilePath: String?
43
- get() =
44
- hostHandlers.asSequence()
45
- .mapNotNull { it.getJSBundleFile(useDevSupport) }
46
- .firstOrNull() ?: jsBundleFilePath
47
-
48
- val hostDelegateJSBundleAssetPath: String?
49
- get() =
50
- hostHandlers.asSequence()
51
- .mapNotNull { it.getBundleAssetName(useDevSupport) }
52
- .firstOrNull() ?: jsBundleAssetPath
53
-
54
- val hostDelegateUseDeveloperSupport: Boolean
55
- get() =
56
- hostHandlers.asSequence()
57
- .mapNotNull { it.useDeveloperSupport }
58
- .firstOrNull() ?: useDevSupport
59
-
60
36
  // Keeps this `_jsBundleLoader` backing property for DevLauncher to replace its internal value
61
37
  private var _jsBundleLoader: JSBundleLoader? = null
62
38
  override val jsBundleLoader: JSBundleLoader
@@ -65,85 +41,74 @@ object ExpoReactHostFactory {
65
41
  if (backingJSBundleLoader != null) {
66
42
  return backingJSBundleLoader
67
43
  }
68
- val context = weakContext.get()
69
- ?: throw IllegalStateException("Unable to get concrete Context")
70
- hostDelegateJsBundleFilePath?.let { jsBundleFile ->
44
+ val context = weakContext.get() ?: throw IllegalStateException("Unable to get concrete Context")
45
+ reactNativeHostWrapper.jsBundleFile?.let { jsBundleFile ->
71
46
  if (jsBundleFile.startsWith("assets://")) {
72
47
  return JSBundleLoader.createAssetLoader(context, jsBundleFile, true)
73
48
  }
74
49
  return JSBundleLoader.createFileLoader(jsBundleFile)
75
50
  }
76
-
77
- return JSBundleLoader.createAssetLoader(context, "assets://$hostDelegateJSBundleAssetPath", true)
51
+ val jsBundleAssetPath = reactNativeHostWrapper.bundleAssetName
52
+ return JSBundleLoader.createAssetLoader(context, "assets://$jsBundleAssetPath", true)
78
53
  }
79
54
 
55
+ override val jsMainModulePath: String
56
+ get() = reactNativeHostWrapper.jsMainModuleName
57
+
80
58
  override val jsRuntimeFactory: JSRuntimeFactory
81
59
  get() = HermesInstance()
82
60
 
83
61
  override val reactPackages: List<ReactPackage>
84
- get() = packageList
62
+ get() = reactNativeHostWrapper.packages
85
63
 
86
64
  override fun handleInstanceException(error: Exception) {
87
- if (hostHandlers.isEmpty()) {
65
+ val handlers = reactNativeHostWrapper.reactNativeHostHandlers
66
+ if (handlers.isEmpty()) {
88
67
  throw error
89
68
  }
90
- hostHandlers.forEach { handler ->
91
- handler.onReactInstanceException(hostDelegateUseDeveloperSupport, error)
69
+ val useDeveloperSupport = reactNativeHostWrapper.useDeveloperSupport
70
+ handlers.forEach { handler ->
71
+ handler.onReactInstanceException(useDeveloperSupport, error)
92
72
  }
93
73
  }
94
74
  }
95
75
 
96
76
  @OptIn(UnstableReactNativeAPI::class)
97
77
  @JvmStatic
98
- fun getDefaultReactHost(
78
+ fun createFromReactNativeHost(
99
79
  context: Context,
100
- packageList: List<ReactPackage>,
101
- jsMainModulePath: String = ".expo/.virtual-metro-entry",
102
- jsBundleAssetPath: String = "index.android.bundle",
103
- jsBundleFilePath: String? = null,
104
- jsRuntimeFactory: JSRuntimeFactory? = null,
105
- useDevSupport: Boolean = ReactBuildConfig.DEBUG,
106
- bindingsInstaller: BindingsInstaller? = null
80
+ reactNativeHost: ReactNativeHost
107
81
  ): ReactHost {
82
+ require(reactNativeHost is ReactNativeHostWrapper) {
83
+ "You can call createFromReactNativeHost only with instances of ReactNativeHostWrapper"
84
+ }
108
85
  if (reactHost == null) {
109
- val hostHandlers = ExpoModulesPackage.packageList
110
- .flatMap { it.createReactNativeHostHandlers(context) }
111
-
112
- val reactHostDelegate = ExpoReactHostDelegate(
113
- WeakReference(context),
114
- packageList,
115
- jsMainModulePath,
116
- jsBundleAssetPath,
117
- jsBundleFilePath,
118
- useDevSupport,
119
- bindingsInstaller,
120
- hostHandlers = hostHandlers
121
- )
86
+ val useDeveloperSupport = reactNativeHost.useDeveloperSupport
87
+ val reactHostDelegate = ExpoReactHostDelegate(WeakReference(context), reactNativeHost)
122
88
  val componentFactory = ComponentFactory()
123
89
  DefaultComponentsRegistry.register(componentFactory)
124
90
 
125
- hostHandlers.forEach { handler ->
126
- handler.onWillCreateReactInstance(useDevSupport)
91
+ reactNativeHost.reactNativeHostHandlers.forEach { handler ->
92
+ handler.onWillCreateReactInstance(useDeveloperSupport)
127
93
  }
128
94
 
129
95
  val reactHostImpl =
130
96
  ReactHostImpl(
131
97
  context,
132
- delegate = reactHostDelegate,
133
- componentFactory = componentFactory,
134
- allowPackagerServerAccess = true,
135
- useDevSupport = useDevSupport
98
+ reactHostDelegate,
99
+ componentFactory,
100
+ true,
101
+ useDeveloperSupport
136
102
  )
137
103
 
138
- hostHandlers.forEach { handler ->
139
- handler.onDidCreateReactHost(context, reactHostImpl)
104
+ reactNativeHost.reactNativeHostHandlers.forEach { handler ->
140
105
  handler.onDidCreateDevSupportManager(reactHostImpl.devSupportManager)
141
106
  }
142
107
 
143
108
  reactHostImpl.addReactInstanceEventListener(object : ReactInstanceEventListener {
144
109
  override fun onReactContextInitialized(context: ReactContext) {
145
- hostHandlers.forEach { handler ->
146
- handler.onDidCreateReactInstance(useDevSupport, context)
110
+ reactNativeHost.reactNativeHostHandlers.forEach { handler ->
111
+ handler.onDidCreateReactInstance(useDeveloperSupport, context)
147
112
  }
148
113
  }
149
114
  })
@@ -21,6 +21,7 @@ import com.facebook.react.ReactDelegate
21
21
  import com.facebook.react.ReactHost
22
22
  import com.facebook.react.ReactInstanceEventListener
23
23
  import com.facebook.react.ReactInstanceManager
24
+ import com.facebook.react.ReactNativeHost
24
25
  import com.facebook.react.ReactRootView
25
26
  import com.facebook.react.bridge.ReactContext
26
27
  import com.facebook.react.modules.core.PermissionListener
@@ -54,12 +55,15 @@ class ReactActivityDelegateWrapper(
54
55
  private val reactActivityHandlers = ExpoModulesPackage.packageList
55
56
  .flatMap { it.createReactActivityHandlers(activity) }
56
57
  private val methodMap: ArrayMap<String, Method> = ArrayMap()
58
+ private val _reactNativeHost: ReactNativeHost by lazy {
59
+ invokeDelegateMethod("getReactNativeHost")
60
+ }
57
61
  private val _reactHost: ReactHost? by lazy {
58
62
  delegate.reactHost
59
63
  }
60
64
  private val delayLoadAppHandler: DelayLoadAppHandler? by lazy {
61
65
  reactActivityHandlers.asSequence()
62
- .mapNotNull { it.getDelayLoadAppHandler(activity, reactHost) }
66
+ .mapNotNull { it.getDelayLoadAppHandler(activity, reactNativeHost) }
63
67
  .firstOrNull()
64
68
  }
65
69
 
@@ -98,6 +102,10 @@ class ReactActivityDelegateWrapper(
98
102
  return invokeDelegateMethod("getReactDelegate")
99
103
  }
100
104
 
105
+ override fun getReactNativeHost(): ReactNativeHost {
106
+ return _reactNativeHost
107
+ }
108
+
101
109
  override fun getReactHost(): ReactHost? {
102
110
  return _reactHost
103
111
  }
@@ -123,11 +131,6 @@ class ReactActivityDelegateWrapper(
123
131
  val newDelegate = reactActivityHandlers.asSequence()
124
132
  .mapNotNull { it.onDidCreateReactActivityDelegate(activity, this) }
125
133
  .firstOrNull()
126
-
127
- reactActivityHandlers.forEach { handler ->
128
- handler.onDidCreateReactActivityDelegateNotification(activity, newDelegate)
129
- }
130
-
131
134
  if (newDelegate != null && newDelegate != this) {
132
135
  val mDelegateField = ReactActivity::class.java.getDeclaredField("mDelegate")
133
136
  mDelegateField.isAccessible = true
@@ -0,0 +1,51 @@
1
+ package expo.modules
2
+
3
+ import android.app.Application
4
+ import android.content.Context
5
+ import com.facebook.react.ReactHost
6
+ import com.facebook.react.ReactNativeHost
7
+ import com.facebook.react.ReactPackageTurboModuleManagerDelegate
8
+ import com.facebook.react.bridge.UIManagerProvider
9
+ import com.facebook.react.common.SurfaceDelegateFactory
10
+ import com.facebook.react.devsupport.DevSupportManagerFactory
11
+ import com.facebook.react.devsupport.interfaces.RedBoxHandler
12
+
13
+ class ReactNativeHostWrapper(
14
+ application: Application,
15
+ host: ReactNativeHost
16
+ ) : ReactNativeHostWrapperBase(application, host) {
17
+ override fun getDevSupportManagerFactory(): DevSupportManagerFactory? {
18
+ return reactNativeHostHandlers
19
+ .asSequence()
20
+ .mapNotNull { it.devSupportManagerFactory }
21
+ .firstOrNull() as DevSupportManagerFactory?
22
+ ?: invokeDelegateMethod("getDevSupportManagerFactory")
23
+ }
24
+
25
+ override fun getReactPackageTurboModuleManagerDelegateBuilder(): ReactPackageTurboModuleManagerDelegate.Builder? {
26
+ return invokeDelegateMethod("getReactPackageTurboModuleManagerDelegateBuilder")
27
+ }
28
+
29
+ override fun getUIManagerProvider(): UIManagerProvider? {
30
+ return invokeDelegateMethod("getUIManagerProvider")
31
+ }
32
+
33
+ override fun getShouldRequireActivity(): Boolean {
34
+ return host.shouldRequireActivity
35
+ }
36
+
37
+ override fun getSurfaceDelegateFactory(): SurfaceDelegateFactory {
38
+ return host.surfaceDelegateFactory
39
+ }
40
+
41
+ override fun getRedBoxHandler(): RedBoxHandler? {
42
+ return invokeDelegateMethod("getRedBoxHandler")
43
+ }
44
+
45
+ companion object {
46
+ @JvmStatic
47
+ fun createReactHost(context: Context, reactNativeHost: ReactNativeHost): ReactHost {
48
+ return ExpoReactHostFactory.createFromReactNativeHost(context, reactNativeHost)
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,107 @@
1
+ package expo.modules
2
+
3
+ import android.app.Application
4
+ import androidx.collection.ArrayMap
5
+ import com.facebook.react.ReactInstanceEventListener
6
+ import com.facebook.react.ReactInstanceManager
7
+ import com.facebook.react.ReactNativeHost
8
+ import com.facebook.react.ReactPackage
9
+ import com.facebook.react.bridge.JavaScriptExecutorFactory
10
+ import com.facebook.react.bridge.ReactContext
11
+ import com.facebook.react.defaults.DefaultReactNativeHost
12
+ import java.lang.reflect.Method
13
+
14
+ open class ReactNativeHostWrapperBase(
15
+ application: Application,
16
+ protected val host: ReactNativeHost
17
+ ) : DefaultReactNativeHost(application) {
18
+
19
+ val reactNativeHostHandlers = ExpoModulesPackage.packageList
20
+ .flatMap { it.createReactNativeHostHandlers(application) }
21
+ private val methodMap: ArrayMap<String, Method> = ArrayMap()
22
+
23
+ override fun createReactInstanceManager(): ReactInstanceManager {
24
+ val developerSupport = useDeveloperSupport
25
+ reactNativeHostHandlers.forEach { handler ->
26
+ handler.onWillCreateReactInstance(developerSupport)
27
+ }
28
+
29
+ val result = super.createReactInstanceManager()
30
+
31
+ reactNativeHostHandlers.forEach { handler ->
32
+ handler.onDidCreateDevSupportManager(result.devSupportManager)
33
+ }
34
+
35
+ result.addReactInstanceEventListener(object : ReactInstanceEventListener {
36
+ override fun onReactContextInitialized(context: ReactContext) {
37
+ reactNativeHostHandlers.forEach { handler ->
38
+ handler.onDidCreateReactInstance(developerSupport, context)
39
+ }
40
+ }
41
+ })
42
+
43
+ injectHostReactInstanceManager(result)
44
+
45
+ return result
46
+ }
47
+
48
+ override fun getJavaScriptExecutorFactory(): JavaScriptExecutorFactory? {
49
+ return reactNativeHostHandlers.asSequence()
50
+ .mapNotNull { it.javaScriptExecutorFactory }
51
+ .firstOrNull() ?: invokeDelegateMethod("getJavaScriptExecutorFactory")
52
+ }
53
+
54
+ public override fun getJSMainModuleName(): String {
55
+ return invokeDelegateMethod("getJSMainModuleName")
56
+ }
57
+
58
+ public override fun getJSBundleFile(): String? {
59
+ return reactNativeHostHandlers.asSequence()
60
+ .mapNotNull { it.getJSBundleFile(useDeveloperSupport) }
61
+ .firstOrNull() ?: invokeDelegateMethod("getJSBundleFile")
62
+ }
63
+
64
+ public override fun getBundleAssetName(): String? {
65
+ return reactNativeHostHandlers.asSequence()
66
+ .mapNotNull { it.getBundleAssetName(useDeveloperSupport) }
67
+ .firstOrNull() ?: invokeDelegateMethod("getBundleAssetName")
68
+ }
69
+
70
+ override fun getUseDeveloperSupport(): Boolean {
71
+ return reactNativeHostHandlers.asSequence()
72
+ .mapNotNull { it.useDeveloperSupport }
73
+ .firstOrNull() ?: host.useDeveloperSupport
74
+ }
75
+
76
+ public override fun getPackages(): MutableList<ReactPackage> {
77
+ return invokeDelegateMethod("getPackages")
78
+ }
79
+
80
+ //endregion
81
+
82
+ //region Internals
83
+
84
+ // this is to call the methods as overridden in MainApplication.kt
85
+ @Suppress("UNCHECKED_CAST")
86
+ internal fun <T> invokeDelegateMethod(name: String): T {
87
+ var method = methodMap[name]
88
+ if (method == null) {
89
+ method = ReactNativeHost::class.java.getDeclaredMethod(name)
90
+ method.isAccessible = true
91
+ methodMap[name] = method
92
+ }
93
+ return method!!.invoke(host) as T
94
+ }
95
+
96
+ /**
97
+ * Inject the @{ReactInstanceManager} from the wrapper to the wrapped host.
98
+ * In case the wrapped host to call `getReactInstanceManager` inside its methods.
99
+ */
100
+ private fun injectHostReactInstanceManager(reactInstanceManager: ReactInstanceManager) {
101
+ val mReactInstanceManagerField = ReactNativeHost::class.java.getDeclaredField("mReactInstanceManager")
102
+ mReactInstanceManagerField.isAccessible = true
103
+ mReactInstanceManagerField.set(host, reactInstanceManager)
104
+ }
105
+
106
+ //endregion
107
+ }
@@ -11,7 +11,6 @@ import expo.modules.core.errors.ModuleDestroyedException
11
11
  import expo.modules.kotlin.Promise
12
12
  import expo.modules.kotlin.exception.Exceptions
13
13
  import expo.modules.kotlin.exception.toCodedException
14
- import expo.modules.kotlin.jni.NativeArrayBuffer
15
14
  import expo.modules.kotlin.modules.Module
16
15
  import expo.modules.kotlin.modules.ModuleDefinition
17
16
  import kotlinx.coroutines.CoroutineName
@@ -98,14 +97,14 @@ class ExpoFetchModule : Module() {
98
97
 
99
98
  AsyncFunction("arrayBuffer") { response: NativeResponse, promise: Promise ->
100
99
  response.waitForStates(listOf(ResponseState.BODY_COMPLETED)) {
101
- val data = response.sink.finalize(directBuffer = true)
102
- promise.resolve(NativeArrayBuffer(data))
100
+ val data = response.sink.finalize()
101
+ promise.resolve(data)
103
102
  }
104
103
  }
105
104
 
106
105
  AsyncFunction("text") { response: NativeResponse, promise: Promise ->
107
106
  response.waitForStates(listOf(ResponseState.BODY_COMPLETED)) {
108
- val data = response.sink.finalize(directBuffer = false).array()
107
+ val data = response.sink.finalize()
109
108
  val text = data.toString(Charsets.UTF_8)
110
109
  promise.resolve(text)
111
110
  }
@@ -40,7 +40,7 @@ internal class NativeResponse(appContext: AppContext, private val coroutineScope
40
40
  get() = this.sink.bodyUsed
41
41
 
42
42
  override fun deallocate() {
43
- this.sink.finalize(directBuffer = false)
43
+ this.sink.finalize()
44
44
  super.deallocate()
45
45
  }
46
46
 
@@ -57,10 +57,10 @@ internal class NativeResponse(appContext: AppContext, private val coroutineScope
57
57
  }
58
58
  if (state == ResponseState.RESPONSE_RECEIVED) {
59
59
  state = ResponseState.BODY_STREAMING_STARTED
60
- val queuedData = this.sink.finalize(directBuffer = false).array()
60
+ val queuedData = this.sink.finalize()
61
61
  emit("didReceiveResponseData", queuedData)
62
62
  } else if (state == ResponseState.BODY_COMPLETED) {
63
- val queuedData = this.sink.finalize(directBuffer = false).array()
63
+ val queuedData = this.sink.finalize()
64
64
  return queuedData
65
65
  }
66
66
  return null
@@ -15,19 +15,15 @@ internal class ResponseSink {
15
15
  bodyQueue.add(data)
16
16
  }
17
17
 
18
- fun finalize(directBuffer: Boolean): ByteBuffer {
18
+ fun finalize(): ByteArray {
19
19
  val size = bodyQueue.sumOf { it.size }
20
- val byteBuffer = if (directBuffer) {
21
- ByteBuffer.allocateDirect(size)
22
- } else {
23
- ByteBuffer.allocate(size)
24
- }
20
+ val byteBuffer = ByteBuffer.allocate(size)
25
21
  for (byteArray in bodyQueue) {
26
22
  byteBuffer.put(byteArray)
27
23
  }
28
24
  bodyQueue.clear()
29
25
  bodyUsed = true
30
26
  isFinalized = true
31
- return byteBuffer
27
+ return byteBuffer.array()
32
28
  }
33
29
  }
@@ -7,12 +7,12 @@ import com.facebook.react.ReactActivity
7
7
  import com.facebook.react.ReactActivityDelegate
8
8
  import com.facebook.react.ReactApplication
9
9
  import com.facebook.react.ReactHost
10
+ import com.facebook.react.ReactNativeHost
10
11
  import com.facebook.react.ReactRootView
11
12
  import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
12
13
  import com.facebook.react.defaults.DefaultReactActivityDelegate
13
14
  import com.facebook.react.interfaces.fabric.ReactSurface
14
15
  import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags
15
- import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests
16
16
  import com.facebook.soloader.SoLoader
17
17
  import expo.modules.core.interfaces.Package
18
18
  import expo.modules.core.interfaces.ReactActivityHandler
@@ -59,7 +59,6 @@ internal class ReactActivityDelegateWrapperDelayLoadTest {
59
59
  fun setUp() {
60
60
  SoLoader.setInTestMode()
61
61
  mockkObject(ExpoModulesPackage.Companion)
62
- ReactNativeFeatureFlagsForTests.setUp()
63
62
  mockkStatic(ReactNativeFeatureFlags::class)
64
63
  every { ReactNativeFeatureFlags.enableBridgelessArchitecture() } returns true
65
64
  every { ReactNativeFeatureFlags.enableFabricRenderer() } returns true
@@ -252,6 +251,8 @@ internal class MockApplication : Application(), ReactApplication {
252
251
  currentActivity = activity
253
252
  }
254
253
 
254
+ override val reactNativeHost: ReactNativeHost = mockk<ReactNativeHost>(relaxed = true)
255
+
255
256
  override val reactHost: ReactHost by lazy {
256
257
  mockk<ReactHost>(relaxed = true)
257
258
  .also {
package/build/Expo.d.ts CHANGED
@@ -2,7 +2,7 @@ import './Expo.fx';
2
2
  export { disableErrorHandling } from './errors/ExpoErrorManager';
3
3
  export { default as registerRootComponent } from './launch/registerRootComponent';
4
4
  export { isRunningInExpoGo, getExpoGoProjectConfig } from './environment/ExpoGo';
5
- export { EventEmitter, SharedObject, SharedRef, NativeModule, requireNativeModule, requireOptionalNativeModule, requireNativeViewManager as requireNativeView, registerWebModule, reloadAppAsync, installOnUIRuntime, } from 'expo-modules-core';
5
+ export { EventEmitter, SharedObject, SharedRef, NativeModule, requireNativeModule, requireOptionalNativeModule, requireNativeViewManager as requireNativeView, registerWebModule, reloadAppAsync, } from 'expo-modules-core';
6
6
  export type {
7
7
  /** @deprecated Move to `SharedRef` with a type-only import instead */
8
8
  SharedRef as SharedRefType,
@@ -1 +1 @@
1
- {"version":3,"file":"Expo.d.ts","sourceRoot":"","sources":["../src/Expo.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAC;AAEnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAElF,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAEL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,YAAY,EAGZ,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,IAAI,iBAAiB,EAC7C,iBAAiB,EACjB,cAAc,EAGd,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,YAAY;AACV,sEAAsE;AACtE,SAAS,IAAI,aAAa;AAC1B,yEAAyE;AACzE,YAAY,IAAI,gBAAgB;AAChC,yEAAyE;AACzE,YAAY,IAAI,gBAAgB;AAChC,yEAAyE;AACzE,YAAY,IAAI,gBAAgB,GACjC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"Expo.d.ts","sourceRoot":"","sources":["../src/Expo.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAC;AAEnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAElF,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAEL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,YAAY,EAGZ,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,IAAI,iBAAiB,EAC7C,iBAAiB,EACjB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,YAAY;AACV,sEAAsE;AACtE,SAAS,IAAI,aAAa;AAC1B,yEAAyE;AACzE,YAAY,IAAI,gBAAgB;AAChC,yEAAyE;AACzE,YAAY,IAAI,gBAAgB;AAChC,yEAAyE;AACzE,YAAY,IAAI,gBAAgB,GACjC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getDevServer.d.ts","sourceRoot":"","sources":["../../src/async-require/getDevServer.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,YAAY;;IAcd,0DAA0D;;;CAM7D,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"getDevServer.d.ts","sourceRoot":"","sources":["../../src/async-require/getDevServer.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,YAAY;;IAcd,0DAA0D;;;CAc7D,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,17 +1,17 @@
1
1
  type LogLevel = 'trace' | 'info' | 'warn' | 'error' | 'log' | 'group' | 'groupCollapsed' | 'groupEnd' | 'debug';
2
- /**
3
- * HMR Client that receives from the server HMR updates and propagates them
4
- * runtime to reflects those changes.
5
- */
6
- declare const HMRClient: {
2
+ export type HMRClientNativeInterface = {
7
3
  enable(): void;
8
4
  disable(): void;
9
5
  registerBundle(requestUrl: string): void;
10
6
  log(level: LogLevel, data: any[]): void;
11
- setup(platformOrOptions: string | {
7
+ setup(props: {
12
8
  isEnabled: boolean;
13
- }, bundleEntry?: string, host?: string, port?: number | string, isEnabledOrUndefined?: boolean, scheme?: string): void;
14
- _onMetroError(error: unknown): void;
9
+ }): void;
15
10
  };
11
+ /**
12
+ * HMR Client that receives from the server HMR updates and propagates them
13
+ * runtime to reflects those changes.
14
+ */
15
+ declare const HMRClient: HMRClientNativeInterface;
16
16
  export default HMRClient;
17
17
  //# sourceMappingURL=hmr.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../src/async-require/hmr.ts"],"names":[],"mappings":"AAiCA,KAAK,QAAQ,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,KAAK,GACL,OAAO,GACP,gBAAgB,GAChB,UAAU,GACV,OAAO,CAAC;AAMZ;;;GAGG;AACH,QAAA,MAAM,SAAS;;;+BAyCc,MAAM;eAMtB,QAAQ,QAAQ,GAAG,EAAE;6BA8CX,MAAM,GAAG;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,gBACpC,MAAM,SACb,MAAM,SACN,MAAM,GAAG,MAAM,yBACC,OAAO,WACtB,MAAM;yBAmHK,OAAO;CA4B7B,CAAC;AA8DF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../src/async-require/hmr.ts"],"names":[],"mappings":"AA4CA,KAAK,QAAQ,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,KAAK,GACL,OAAO,GACP,gBAAgB,GAChB,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxC,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC5C,CAAC;AAMF;;;GAGG;AACH,QAAA,MAAM,SAAS,EAAE,wBAiMhB,CAAC;AA4EF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const HMRClient: any;
2
+ export default HMRClient;
3
+ //# sourceMappingURL=hmr.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmr.native.d.ts","sourceRoot":"","sources":["../../src/async-require/hmr.native.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,SAAS,KAAgE,CAAC;AAEhF,eAAe,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dom-entry.d.ts","sourceRoot":"","sources":["../../src/dom/dom-entry.tsx"],"names":[],"mappings":"AACA,OAAO,qBAAqB,CAAC;AAiE7B,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,QAoElD"}
1
+ {"version":3,"file":"dom-entry.d.ts","sourceRoot":"","sources":["../../src/dom/dom-entry.tsx"],"names":[],"mappings":"AACA,OAAO,qBAAqB,CAAC;AAiE7B,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,QA6DlD"}
@@ -29,11 +29,6 @@ export interface DOMProps extends Omit<RNWebViewProps, 'source'> {
29
29
  * @default false
30
30
  */
31
31
  useExpoDOMWebView?: boolean;
32
- /**
33
- * Allows dynamically redirecting a component to a different source, for example a prebuilt version.
34
- * @internal
35
- */
36
- overrideUri?: string;
37
32
  }
38
33
  export {};
39
34
  //# sourceMappingURL=dom.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dom.types.d.ts","sourceRoot":"","sources":["../../src/dom/dom.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,CAAC;AAElF,MAAM,WAAW,SAAU,SAAQ,KAAK,CAAC,SAAS,CAAC;CAAG;AAEtD,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,MAAM,aAAa,CAAC,KAAK,SAAS,SAAS,IAAI;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;CAC/C;AAED,KAAK,YAAY,GAAG,SAAS,CAAC;AAC9B,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC;AACtC,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC;AAE1C,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;IAC9D;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"dom.types.d.ts","sourceRoot":"","sources":["../../src/dom/dom.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,CAAC;AAElF,MAAM,WAAW,SAAU,SAAQ,KAAK,CAAC,SAAS,CAAC;CAAG;AAEtD,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,MAAM,aAAa,CAAC,KAAK,SAAS,SAAS,IAAI;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;CAC/C;AAED,KAAK,YAAY,GAAG,SAAS,CAAC;AAC9B,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC;AACtC,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC;AAE1C,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;IAC9D;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B"}
@@ -1,4 +1,3 @@
1
1
  export { default as WebView } from './webview-wrapper';
2
- export * from './dom-internal.types';
3
2
  export declare const registerDOMComponent: undefined | typeof import('./dom-entry').registerDOMComponent;
4
3
  //# sourceMappingURL=internal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/dom/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEvD,cAAc,sBAAsB,CAAC;AAGrC,eAAO,MAAM,oBAAoB,EAAE,SAAS,GAAG,cAAc,aAAa,EAAE,oBACjE,CAAC"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/dom/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGvD,eAAO,MAAM,oBAAoB,EAAE,SAAS,GAAG,cAAc,aAAa,EAAE,oBACjE,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import React from 'react';
2
- import { DOMPropsInternal } from './dom-internal.types';
2
+ import type { DOMProps } from './dom.types';
3
3
  import ExpoDomWebView from './webview/ExpoDOMWebView';
4
4
  import RNWebView from './webview/RNWebView';
5
5
  type RawWebViewProps = React.ComponentProps<Exclude<typeof ExpoDomWebView, undefined>> & React.ComponentProps<Exclude<typeof RNWebView, undefined>>;
6
6
  interface Props {
7
7
  children?: any;
8
- dom?: DOMPropsInternal;
8
+ dom?: DOMProps;
9
9
  filePath: string;
10
10
  ref: React.Ref<object>;
11
11
  [propName: string]: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"webview-wrapper.d.ts","sourceRoot":"","sources":["../../src/dom/webview-wrapper.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAWxD,OAAO,cAAc,MAAM,0BAA0B,CAAC;AACtD,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAG5C,KAAK,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,cAAc,EAAE,SAAS,CAAC,CAAC,GACpF,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAE7D,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AAED,QAAA,MAAM,UAAU,mFAmMd,CAAC;AAiBH,wBAAgB,cAAc,CAC5B,iBAAiB,EAAE,OAAO,GACzB,KAAK,CAAC,yBAAyB,CAAC,eAAe,CAAC,CASlD;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"webview-wrapper.d.ts","sourceRoot":"","sources":["../../src/dom/webview-wrapper.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAiB,QAAQ,EAA4B,MAAM,aAAa,CAAC;AAUrF,OAAO,cAAc,MAAM,0BAA0B,CAAC;AACtD,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAG5C,KAAK,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,cAAc,EAAE,SAAS,CAAC,CAAC,GACpF,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAE7D,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AAED,QAAA,MAAM,UAAU,mFAgMd,CAAC;AAiBH,wBAAgB,cAAc,CAC5B,iBAAiB,EAAE,OAAO,GACzB,KAAK,CAAC,yBAAyB,CAAC,eAAe,CAAC,CASlD;AAED,eAAe,UAAU,CAAC"}