expo-dev-menu 5.0.17 → 5.0.19
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.
- package/CHANGELOG.md +12 -0
- package/android/build.gradle +18 -4
- package/android/src/debug/java/expo/modules/devmenu/DevMenuDevSettings.kt +15 -1
- package/android/src/main/java/expo/modules/devmenu/DevMenuUtils.kt +0 -5
- package/android/src/main/java/expo/modules/devmenu/helpers/DevMenuReflectionExtensions.kt +2 -0
- package/android/src/{react-native-74/main → main/java}/expo/modules/devmenu/react/DevMenuPackagerConnectionSettings.kt +0 -1
- package/android/src/{main/java → react-native-74/main}/com/facebook/react/devsupport/DevMenuReactInternalSettings.kt +2 -0
- package/android/src/react-native-75/debug/expo/modules/devmenu/DevMenuReactHost.kt +145 -0
- package/android/src/react-native-75/debug/expo/modules/devmenu/DevMenuReactNativeHost.kt +108 -0
- package/android/src/react-native-75/main/com/facebook/react/devsupport/DevMenuReactSettings.kt +56 -0
- package/android/src/react-native-75/main/com/facebook/react/devsupport/DevMenuSettingsBase.kt +71 -0
- package/assets/EXDevMenuApp.android.js +1 -1
- package/assets/EXDevMenuApp.ios.js +1 -1
- package/assets/react-native-75/EXDevMenuApp.android.js +880 -0
- package/package.json +3 -3
- /package/android/src/{debug/java → react-native-74/debug}/expo/modules/devmenu/DevMenuReactHost.kt +0 -0
- /package/android/src/{debug/java → react-native-74/debug}/expo/modules/devmenu/DevMenuReactNativeHost.kt +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,18 @@
|
|
|
10
10
|
|
|
11
11
|
### 💡 Others
|
|
12
12
|
|
|
13
|
+
## 5.0.19 — 2024-08-14
|
|
14
|
+
|
|
15
|
+
### 🎉 New features
|
|
16
|
+
|
|
17
|
+
- Add support for react-native 0.75. ([#30965](https://github.com/expo/expo/pull/30965) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
|
18
|
+
|
|
19
|
+
## 5.0.18 — 2024-08-07
|
|
20
|
+
|
|
21
|
+
### 📚 3rd party library updates
|
|
22
|
+
|
|
23
|
+
- Update react-native to 0.74.5. ([#30822](https://github.com/expo/expo/pull/30822) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
|
24
|
+
|
|
13
25
|
## 5.0.17 — 2024-07-29
|
|
14
26
|
|
|
15
27
|
### 🐛 Bug fixes
|
package/android/build.gradle
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
apply plugin: 'com.android.library'
|
|
2
2
|
|
|
3
3
|
group = 'host.exp.exponent'
|
|
4
|
-
version = '5.0.
|
|
4
|
+
version = '5.0.19'
|
|
5
5
|
|
|
6
6
|
def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
|
|
7
7
|
apply from: expoModulesCorePlugin
|
|
@@ -20,7 +20,7 @@ android {
|
|
|
20
20
|
namespace "expo.modules.devmenu"
|
|
21
21
|
defaultConfig {
|
|
22
22
|
versionCode 10
|
|
23
|
-
versionName '5.0.
|
|
23
|
+
versionName '5.0.19'
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
buildTypes {
|
|
@@ -34,7 +34,9 @@ android {
|
|
|
34
34
|
def rnVersion = getRNVersion()
|
|
35
35
|
main {
|
|
36
36
|
java {
|
|
37
|
-
if (rnVersion >= versionToNumber(0,
|
|
37
|
+
if (rnVersion >= versionToNumber(0, 75, 0)) {
|
|
38
|
+
srcDirs += "src/react-native-75/main"
|
|
39
|
+
} else if (rnVersion >= versionToNumber(0, 74, 0)) {
|
|
38
40
|
srcDirs += "src/react-native-74/main"
|
|
39
41
|
}
|
|
40
42
|
}
|
|
@@ -43,7 +45,11 @@ android {
|
|
|
43
45
|
java {
|
|
44
46
|
srcDirs += ['../vendored/react-native-gesture-handler/android/']
|
|
45
47
|
srcDirs += ['../vendored/react-native-safe-area-context/android/']
|
|
46
|
-
|
|
48
|
+
if (rnVersion >= versionToNumber(0, 75, 0)) {
|
|
49
|
+
srcDirs += "src/react-native-75/debug"
|
|
50
|
+
} else if (rnVersion >= versionToNumber(0, 74, 0)) {
|
|
51
|
+
srcDirs += "src/react-native-74/debug"
|
|
52
|
+
}
|
|
47
53
|
}
|
|
48
54
|
}
|
|
49
55
|
|
|
@@ -68,7 +74,15 @@ task copyAssets(type: Copy) {
|
|
|
68
74
|
|
|
69
75
|
from('../assets') {
|
|
70
76
|
exclude "*.ios.*"
|
|
77
|
+
exclude "react-native-*/**"
|
|
71
78
|
}
|
|
79
|
+
|
|
80
|
+
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
|
81
|
+
def rnVersion = getRNVersion()
|
|
82
|
+
if (rnVersion >= versionToNumber(0, 75, 0)) {
|
|
83
|
+
from('../assets/react-native-75')
|
|
84
|
+
}
|
|
85
|
+
|
|
72
86
|
into 'src/debug/assets'
|
|
73
87
|
}
|
|
74
88
|
|
|
@@ -9,7 +9,21 @@ object DevMenuDevSettings {
|
|
|
9
9
|
val devDelegate = DevMenuDevToolsDelegate(DevMenuManager, reactHost)
|
|
10
10
|
val devSettings = devDelegate.devSettings
|
|
11
11
|
|
|
12
|
-
val jsBundleURL =
|
|
12
|
+
val jsBundleURL = try {
|
|
13
|
+
// Attempt to get the field "jsBundleURLForRemoteDebugging"
|
|
14
|
+
val field = reactHost.devSupportManager?.javaClass?.getDeclaredField("jsBundleURLForRemoteDebugging")
|
|
15
|
+
field?.isAccessible = true
|
|
16
|
+
field?.get(reactHost.devSupportManager) as? String
|
|
17
|
+
} catch (e: NoSuchFieldException) {
|
|
18
|
+
// If the field is not found, try "jSBundleURLForRemoteDebugging"
|
|
19
|
+
try {
|
|
20
|
+
val field = reactHost.devSupportManager?.javaClass?.getDeclaredField("jSBundleURLForRemoteDebugging")
|
|
21
|
+
field?.isAccessible = true
|
|
22
|
+
field?.get(reactHost.devSupportManager) as? String
|
|
23
|
+
} catch (e: NoSuchFieldException) {
|
|
24
|
+
null
|
|
25
|
+
}
|
|
26
|
+
} ?: ""
|
|
13
27
|
|
|
14
28
|
if (devSettings != null) {
|
|
15
29
|
return Bundle().apply {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
package expo.modules.devmenu
|
|
2
2
|
|
|
3
3
|
import com.facebook.react.ReactPackage
|
|
4
|
-
import com.facebook.react.bridge.JSIModulePackage
|
|
5
4
|
|
|
6
5
|
const val DEV_MENU_TAG = "ExpoDevMenu"
|
|
7
6
|
|
|
@@ -9,10 +8,6 @@ fun getVendoredPackage(className: String): ReactPackage {
|
|
|
9
8
|
return getVendoredClass(className, emptyArray(), emptyArray())
|
|
10
9
|
}
|
|
11
10
|
|
|
12
|
-
fun getVendoredJNIPackage(className: String): JSIModulePackage {
|
|
13
|
-
return getVendoredClass(className, emptyArray(), emptyArray())
|
|
14
|
-
}
|
|
15
|
-
|
|
16
11
|
fun <T> getVendoredClass(className: String, argsType: Array<Class<*>>, args: Array<Any>): T {
|
|
17
12
|
val clazz = try {
|
|
18
13
|
Class.forName("devmenu.$className")
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
package expo.modules.devmenu.helpers
|
|
2
2
|
|
|
3
|
+
import android.annotation.SuppressLint
|
|
3
4
|
import java.lang.reflect.Field
|
|
4
5
|
import java.lang.reflect.Modifier
|
|
5
6
|
|
|
@@ -10,6 +11,7 @@ fun <T, R> Class<out T>.getPrivateDeclaredFieldValue(filedName: String, obj: T):
|
|
|
10
11
|
return field.get(obj) as R
|
|
11
12
|
}
|
|
12
13
|
|
|
14
|
+
@SuppressLint("DiscouragedPrivateApi")
|
|
13
15
|
fun <T> Class<out T>.setPrivateDeclaredFieldValue(filedName: String, obj: T, newValue: Any) {
|
|
14
16
|
val field = getDeclaredField(filedName)
|
|
15
17
|
val modifiersField = Field::class.java.getDeclaredField("accessFlags")
|
|
@@ -2,7 +2,6 @@ package expo.modules.devmenu.react
|
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
4
|
import com.facebook.react.packagerconnection.PackagerConnectionSettings
|
|
5
|
-
|
|
6
5
|
/**
|
|
7
6
|
* Class representing react's internal [PackagerConnectionSettings] class, which we want to replace to change bundler's url.
|
|
8
7
|
* It is only use when [expo.modules.devmenu.DevMenuReactNativeHost.getUseDeveloperSupport] returns true.
|
|
@@ -7,6 +7,8 @@ import com.facebook.react.modules.debug.interfaces.DeveloperSettings
|
|
|
7
7
|
import com.facebook.react.packagerconnection.PackagerConnectionSettings
|
|
8
8
|
import expo.modules.devmenu.react.DevMenuPackagerConnectionSettings
|
|
9
9
|
|
|
10
|
+
|
|
11
|
+
|
|
10
12
|
/**
|
|
11
13
|
* Class representing react's internal [DevInternalSettings] class, which we want to replace to change [packagerConnectionSettings] and others settings.
|
|
12
14
|
* It is only use when [expo.modules.devmenu.DevMenuReactNativeHost.getUseDeveloperSupport] returns true.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
package expo.modules.devmenu
|
|
2
|
+
|
|
3
|
+
import android.app.Application
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.util.Log
|
|
6
|
+
import com.facebook.react.JSEngineResolutionAlgorithm
|
|
7
|
+
import com.facebook.react.ReactHost
|
|
8
|
+
import com.facebook.react.ReactPackage
|
|
9
|
+
import com.facebook.react.bridge.JSBundleLoader
|
|
10
|
+
import com.facebook.react.common.annotations.UnstableReactNativeAPI
|
|
11
|
+
import com.facebook.react.defaults.DefaultComponentsRegistry
|
|
12
|
+
import com.facebook.react.defaults.DefaultReactHostDelegate
|
|
13
|
+
import com.facebook.react.defaults.DefaultTurboModuleManagerDelegate
|
|
14
|
+
import com.facebook.react.devsupport.DevMenuReactSettings
|
|
15
|
+
import com.facebook.react.devsupport.DevServerHelper
|
|
16
|
+
import com.facebook.react.fabric.ComponentFactory
|
|
17
|
+
import com.facebook.react.runtime.JSCInstance
|
|
18
|
+
import com.facebook.react.runtime.ReactHostImpl
|
|
19
|
+
import com.facebook.react.runtime.hermes.HermesInstance
|
|
20
|
+
import com.facebook.react.shell.MainReactPackage
|
|
21
|
+
import com.facebook.soloader.SoLoader
|
|
22
|
+
//import devmenu.com.th3rdwave.safeareacontext.SafeAreaProviderManager
|
|
23
|
+
import expo.modules.adapters.react.ModuleRegistryAdapter
|
|
24
|
+
import expo.modules.adapters.react.ReactModuleRegistryProvider
|
|
25
|
+
import expo.modules.devmenu.modules.DevMenuInternalModule
|
|
26
|
+
import expo.modules.devmenu.modules.DevMenuPreferences
|
|
27
|
+
import expo.modules.kotlin.ModulesProvider
|
|
28
|
+
import java.io.BufferedReader
|
|
29
|
+
import java.io.FileNotFoundException
|
|
30
|
+
import java.io.InputStreamReader
|
|
31
|
+
|
|
32
|
+
object DevMenuReactHost {
|
|
33
|
+
|
|
34
|
+
@OptIn(UnstableReactNativeAPI::class)
|
|
35
|
+
fun create(application: Application, useDeveloperSupport: Boolean): ReactHost {
|
|
36
|
+
val jsBundleAssetPath = "EXDevMenuApp.android.js"
|
|
37
|
+
val jsBundleLoader =
|
|
38
|
+
JSBundleLoader.createAssetLoader(application, "assets://$jsBundleAssetPath", true)
|
|
39
|
+
val jsResolutionAlgorithm = createJSEngineResolutionAlgorithm(application)
|
|
40
|
+
val jsRuntimeFactory = if (jsResolutionAlgorithm == JSEngineResolutionAlgorithm.JSC) {
|
|
41
|
+
JSCInstance()
|
|
42
|
+
} else {
|
|
43
|
+
HermesInstance()
|
|
44
|
+
}
|
|
45
|
+
val jsMainModuleName = "index"
|
|
46
|
+
val defaultReactHostDelegate =
|
|
47
|
+
DefaultReactHostDelegate(
|
|
48
|
+
jsMainModulePath = jsMainModuleName,
|
|
49
|
+
jsBundleLoader = jsBundleLoader,
|
|
50
|
+
reactPackages = getPackages(),
|
|
51
|
+
jsRuntimeFactory = jsRuntimeFactory,
|
|
52
|
+
turboModuleManagerDelegateBuilder = DefaultTurboModuleManagerDelegate.Builder()
|
|
53
|
+
)
|
|
54
|
+
val componentFactory = ComponentFactory()
|
|
55
|
+
DefaultComponentsRegistry.register(componentFactory)
|
|
56
|
+
val reactHost = ReactHostImpl(
|
|
57
|
+
application,
|
|
58
|
+
defaultReactHostDelegate,
|
|
59
|
+
componentFactory,
|
|
60
|
+
useDeveloperSupport,
|
|
61
|
+
useDeveloperSupport
|
|
62
|
+
)
|
|
63
|
+
.apply {
|
|
64
|
+
jsEngineResolutionAlgorithm = jsResolutionAlgorithm
|
|
65
|
+
}
|
|
66
|
+
if (useDeveloperSupport) {
|
|
67
|
+
injectDevServerSettings(application.applicationContext, reactHost)
|
|
68
|
+
}
|
|
69
|
+
return reactHost
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private fun getPackages(): List<ReactPackage> {
|
|
73
|
+
val packages = mutableListOf(
|
|
74
|
+
MainReactPackage(null),
|
|
75
|
+
ModuleRegistryAdapter(
|
|
76
|
+
ReactModuleRegistryProvider(emptyList()),
|
|
77
|
+
object : ModulesProvider {
|
|
78
|
+
override fun getModulesList() =
|
|
79
|
+
listOf(
|
|
80
|
+
DevMenuInternalModule::class.java,
|
|
81
|
+
DevMenuPreferences::class.java,
|
|
82
|
+
// SafeAreaProviderManager::class.java
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
DevMenuPackage()
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
val devLauncherPackage = Class.forName("expo.modules.devlauncher.DevLauncherPackage")
|
|
91
|
+
val pkg = devLauncherPackage.getConstructor().newInstance() as ReactPackage
|
|
92
|
+
packages.add(pkg)
|
|
93
|
+
} catch (e: ClassNotFoundException) {
|
|
94
|
+
// dev launcher is not installed in this project
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return packages
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private fun createJSEngineResolutionAlgorithm(application: Application): JSEngineResolutionAlgorithm {
|
|
101
|
+
SoLoader.init(application.applicationContext, /* native exopackage */ false)
|
|
102
|
+
if (SoLoader.getLibraryPath("libjsc.so") != null) {
|
|
103
|
+
return JSEngineResolutionAlgorithm.JSC
|
|
104
|
+
}
|
|
105
|
+
return JSEngineResolutionAlgorithm.HERMES
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* To use a different packager url, we need to replace internal RN objects.
|
|
110
|
+
*/
|
|
111
|
+
private fun injectDevServerSettings(applicationContext: Context, reactHost: ReactHostImpl) {
|
|
112
|
+
try {
|
|
113
|
+
val serverIp = BufferedReader(
|
|
114
|
+
InputStreamReader(applicationContext.assets.open("dev-menu-packager-host"))
|
|
115
|
+
).use {
|
|
116
|
+
it.readLine()
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
val devMenuInternalReactSettings = DevMenuReactSettings(applicationContext, serverIp)
|
|
120
|
+
|
|
121
|
+
val devSupportManager = reactHost.devSupportManager
|
|
122
|
+
val devSupportManagerBaseClass = devSupportManager.javaClass.superclass!!
|
|
123
|
+
setPrivateField(
|
|
124
|
+
obj = devSupportManager,
|
|
125
|
+
objClass = devSupportManagerBaseClass,
|
|
126
|
+
field = "mDevSettings",
|
|
127
|
+
newValue = devMenuInternalReactSettings
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
val devServerHelper: DevServerHelper = getPrivateFiled(devSupportManager, devSupportManagerBaseClass, "mDevServerHelper")
|
|
131
|
+
setPrivateField(
|
|
132
|
+
obj = devServerHelper,
|
|
133
|
+
objClass = devServerHelper.javaClass,
|
|
134
|
+
field = "mSettings",
|
|
135
|
+
newValue = devMenuInternalReactSettings
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
Log.i(DEV_MENU_TAG, "DevSettings was correctly injected.")
|
|
139
|
+
} catch (e: FileNotFoundException) {
|
|
140
|
+
Log.e(DEV_MENU_TAG, "Couldn't find `dev-menu-packager-host` file.", e)
|
|
141
|
+
} catch (e: Exception) {
|
|
142
|
+
Log.e(DEV_MENU_TAG, "Couldn't inject DevSettings object.", e)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
package expo.modules.devmenu
|
|
2
|
+
|
|
3
|
+
import android.app.Application
|
|
4
|
+
import android.util.Log
|
|
5
|
+
import com.facebook.react.ReactInstanceManager
|
|
6
|
+
import com.facebook.react.ReactPackage
|
|
7
|
+
import com.facebook.react.bridge.JavaScriptExecutorFactory
|
|
8
|
+
import com.facebook.react.defaults.DefaultReactNativeHost
|
|
9
|
+
import com.facebook.react.devsupport.DevMenuReactSettings
|
|
10
|
+
import com.facebook.react.devsupport.DevServerHelper
|
|
11
|
+
import com.facebook.react.shell.MainReactPackage
|
|
12
|
+
//import devmenu.com.th3rdwave.safeareacontext.SafeAreaProviderManager
|
|
13
|
+
import expo.modules.adapters.react.ModuleRegistryAdapter
|
|
14
|
+
import expo.modules.adapters.react.ReactModuleRegistryProvider
|
|
15
|
+
import expo.modules.devmenu.modules.DevMenuInternalModule
|
|
16
|
+
import expo.modules.devmenu.modules.DevMenuPreferences
|
|
17
|
+
import expo.modules.devmenu.react.createNonDebuggableJavaScriptExecutorFactory
|
|
18
|
+
import expo.modules.kotlin.ModulesProvider
|
|
19
|
+
import java.io.BufferedReader
|
|
20
|
+
import java.io.FileNotFoundException
|
|
21
|
+
import java.io.InputStreamReader
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Class that represents react host used by dev menu.
|
|
25
|
+
*/
|
|
26
|
+
class DevMenuReactNativeHost(application: Application, private val useDeveloperSupport: Boolean) :
|
|
27
|
+
DefaultReactNativeHost(application) {
|
|
28
|
+
|
|
29
|
+
override fun getPackages(): List<ReactPackage> {
|
|
30
|
+
val packages = mutableListOf(
|
|
31
|
+
MainReactPackage(null),
|
|
32
|
+
ModuleRegistryAdapter(
|
|
33
|
+
ReactModuleRegistryProvider(emptyList()),
|
|
34
|
+
object : ModulesProvider {
|
|
35
|
+
override fun getModulesList() =
|
|
36
|
+
listOf(
|
|
37
|
+
DevMenuInternalModule::class.java,
|
|
38
|
+
DevMenuPreferences::class.java,
|
|
39
|
+
// SafeAreaProviderManager::class.java
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
),
|
|
43
|
+
DevMenuPackage()
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
val devLauncherPackage = Class.forName("expo.modules.devlauncher.DevLauncherPackage")
|
|
48
|
+
val pkg = devLauncherPackage.getConstructor().newInstance() as ReactPackage
|
|
49
|
+
packages.add(pkg)
|
|
50
|
+
} catch (e: ClassNotFoundException) {
|
|
51
|
+
// dev launcher is not installed in this project
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return packages
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
override fun getUseDeveloperSupport() = useDeveloperSupport
|
|
58
|
+
|
|
59
|
+
override fun getBundleAssetName() = "EXDevMenuApp.android.js"
|
|
60
|
+
|
|
61
|
+
override fun getJSMainModuleName() = "index"
|
|
62
|
+
|
|
63
|
+
override fun getJavaScriptExecutorFactory(): JavaScriptExecutorFactory {
|
|
64
|
+
return createNonDebuggableJavaScriptExecutorFactory(application)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
override fun createReactInstanceManager(): ReactInstanceManager {
|
|
68
|
+
val reactInstanceManager = super.createReactInstanceManager()
|
|
69
|
+
|
|
70
|
+
if (useDeveloperSupport) {
|
|
71
|
+
try {
|
|
72
|
+
// To use a different packager url, we need to replace internal RN objects.
|
|
73
|
+
val serverIp = BufferedReader(
|
|
74
|
+
InputStreamReader(super.getApplication().assets.open("dev-menu-packager-host"))
|
|
75
|
+
).use {
|
|
76
|
+
it.readLine()
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
val devMenuInternalReactSettings = DevMenuReactSettings(super.getApplication(), serverIp)
|
|
80
|
+
|
|
81
|
+
val devSupportManager = reactInstanceManager.devSupportManager
|
|
82
|
+
val devSupportManagerBaseClass = devSupportManager.javaClass.superclass!!
|
|
83
|
+
setPrivateField(
|
|
84
|
+
obj = devSupportManager,
|
|
85
|
+
objClass = devSupportManagerBaseClass,
|
|
86
|
+
field = "mDevSettings",
|
|
87
|
+
newValue = devMenuInternalReactSettings
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
val devServerHelper: DevServerHelper = getPrivateFiled(devSupportManager, devSupportManagerBaseClass, "mDevServerHelper")
|
|
91
|
+
setPrivateField(
|
|
92
|
+
obj = devServerHelper,
|
|
93
|
+
objClass = devServerHelper.javaClass,
|
|
94
|
+
field = "mSettings",
|
|
95
|
+
newValue = devMenuInternalReactSettings
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
Log.i(DEV_MENU_TAG, "DevSettings was correctly injected.")
|
|
99
|
+
} catch (e: FileNotFoundException) {
|
|
100
|
+
Log.e(DEV_MENU_TAG, "Couldn't find `dev-menu-packager-host` file.", e)
|
|
101
|
+
} catch (e: Exception) {
|
|
102
|
+
Log.e(DEV_MENU_TAG, "Couldn't inject DevSettings object.", e)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return reactInstanceManager
|
|
107
|
+
}
|
|
108
|
+
}
|
package/android/src/react-native-75/main/com/facebook/react/devsupport/DevMenuReactSettings.kt
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
@file:Suppress("RedundantVisibilityModifier")
|
|
2
|
+
|
|
3
|
+
package com.facebook.react.devsupport
|
|
4
|
+
|
|
5
|
+
import android.content.Context
|
|
6
|
+
import android.content.SharedPreferences
|
|
7
|
+
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
|
8
|
+
import android.preference.PreferenceManager
|
|
9
|
+
import com.facebook.react.common.build.ReactBuildConfig
|
|
10
|
+
import com.facebook.react.modules.debug.interfaces.DeveloperSettings
|
|
11
|
+
import com.facebook.react.packagerconnection.PackagerConnectionSettings
|
|
12
|
+
import expo.modules.devmenu.react.DevMenuPackagerConnectionSettings
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Class representing react's internal [DevInternalSettings] class, which we want to replace to change [packagerConnectionSettings] and others settings.
|
|
16
|
+
* It is only use when [expo.modules.devmenu.DevMenuReactNativeHost.getUseDeveloperSupport] returns true.
|
|
17
|
+
* Implementation has been copied from reacts internal [DevInternalSettings] class
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
internal class DevMenuReactSettings(
|
|
21
|
+
context: Context,
|
|
22
|
+
serverIp: String,
|
|
23
|
+
) : DevMenuSettingsBase(context) {
|
|
24
|
+
override val packagerConnectionSettings = DevMenuPackagerConnectionSettings(serverIp, context)
|
|
25
|
+
|
|
26
|
+
// Implemented here so `this` is not leaked
|
|
27
|
+
init {
|
|
28
|
+
mPreferences.registerOnSharedPreferenceChangeListener(this)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* A wrapper of [DevInternalSettings] allows us to access the package-private [DevInternalSettings] properties
|
|
34
|
+
*/
|
|
35
|
+
internal class DevMenuInternalSettingsWrapper(private val devSettings: DeveloperSettings) {
|
|
36
|
+
val isFpsDebugEnabled = devSettings.isFpsDebugEnabled
|
|
37
|
+
var isHotModuleReplacementEnabled: Boolean
|
|
38
|
+
get() = devSettings.isHotModuleReplacementEnabled
|
|
39
|
+
set(value) {
|
|
40
|
+
devSettings.isHotModuleReplacementEnabled = value
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
var isRemoteJSDebugEnabled: Boolean
|
|
44
|
+
get() = devSettings.isRemoteJSDebugEnabled
|
|
45
|
+
set(value) {
|
|
46
|
+
devSettings.isRemoteJSDebugEnabled = value
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
var isJSDevModeEnabled: Boolean
|
|
50
|
+
get() = devSettings.isJSDevModeEnabled
|
|
51
|
+
set(value) {
|
|
52
|
+
devSettings.isJSDevModeEnabled = value
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
val packagerConnectionSettings: PackagerConnectionSettings = devSettings.packagerConnectionSettings
|
|
56
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
package com.facebook.react.devsupport
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.content.SharedPreferences
|
|
5
|
+
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
|
6
|
+
import android.preference.PreferenceManager
|
|
7
|
+
import com.facebook.react.common.build.ReactBuildConfig
|
|
8
|
+
import com.facebook.react.devsupport.DevMenuSettingsBase.Listener
|
|
9
|
+
import com.facebook.react.modules.debug.interfaces.DeveloperSettings
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Implementation has been copied from reacts internal [DevInternalSettings] class
|
|
13
|
+
*/
|
|
14
|
+
abstract class DevMenuSettingsBase(
|
|
15
|
+
context: Context,
|
|
16
|
+
private val listener: Listener? = Listener {}
|
|
17
|
+
) : DeveloperSettings, OnSharedPreferenceChangeListener {
|
|
18
|
+
protected val mPreferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
|
19
|
+
|
|
20
|
+
override var isFpsDebugEnabled: Boolean
|
|
21
|
+
get() = mPreferences.getBoolean("fps_debug", false)
|
|
22
|
+
set(enabled) {
|
|
23
|
+
mPreferences.edit().putBoolean("fps_debug", enabled).apply()
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
override var isAnimationFpsDebugEnabled = mPreferences.getBoolean("animations_debug", false)
|
|
27
|
+
|
|
28
|
+
override var isJSDevModeEnabled: Boolean
|
|
29
|
+
get() = mPreferences.getBoolean("js_dev_mode_debug", true)
|
|
30
|
+
set(value) {
|
|
31
|
+
mPreferences.edit().putBoolean("js_dev_mode_debug", value).apply()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
override var isJSMinifyEnabled: Boolean = mPreferences.getBoolean("js_minify_debug", false)
|
|
35
|
+
|
|
36
|
+
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
|
|
37
|
+
if (this.listener != null && ("fps_debug" == key || "js_dev_mode_debug" == key || "start_sampling_profiler_on_init" == key || "js_minify_debug" == key)) {
|
|
38
|
+
listener.onInternalSettingsChanged()
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
override var isElementInspectorEnabled: Boolean
|
|
43
|
+
get() = mPreferences.getBoolean("inspector_debug", false)
|
|
44
|
+
set(enabled) {
|
|
45
|
+
mPreferences.edit().putBoolean("inspector_debug", enabled).apply()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
override var isDeviceDebugEnabled: Boolean = ReactBuildConfig.DEBUG
|
|
49
|
+
|
|
50
|
+
override var isRemoteJSDebugEnabled: Boolean
|
|
51
|
+
get() = mPreferences.getBoolean("remote_js_debug", false)
|
|
52
|
+
set(remoteJSDebugEnabled) {
|
|
53
|
+
mPreferences.edit().putBoolean("remote_js_debug", remoteJSDebugEnabled).apply()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
override var isStartSamplingProfilerOnInit: Boolean =
|
|
57
|
+
mPreferences.getBoolean("start_sampling_profiler_on_init", false)
|
|
58
|
+
|
|
59
|
+
override fun addMenuItem(title: String) {
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
override var isHotModuleReplacementEnabled: Boolean
|
|
63
|
+
get() = mPreferences.getBoolean("hot_module_replacement", true)
|
|
64
|
+
set(enabled) {
|
|
65
|
+
mPreferences.edit().putBoolean("hot_module_replacement", enabled).apply()
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fun interface Listener {
|
|
69
|
+
fun onInternalSettingsChanged()
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -2,7 +2,7 @@ var __BUNDLE_START_TIME__=this.nativePerformanceNow?nativePerformanceNow():Date.
|
|
|
2
2
|
!(function(e){"use strict";e.__r=i,e[`${__METRO_GLOBAL_PREFIX__}__d`]=function(e,n,o){if(null!=r[n])return;var i={dependencyMap:o,factory:e,hasError:!1,importedAll:t,importedDefault:t,isInitialized:!1,publicModule:{exports:{}}};r[n]=i},e.__c=o,e.__registerSegment=function(e,t,n){f[e]=t,n&&n.forEach((function(t){r[t]||p.has(t)||p.set(t,e)}))};var r=o(),t={},n={}.hasOwnProperty;function o(){return r=Object.create(null)}function i(e){var t=e,n=r[t];return n&&n.isInitialized?n.publicModule.exports:d(t,n)}function l(e){var n=e;if(r[n]&&r[n].importedDefault!==t)return r[n].importedDefault;var o=i(n),l=o&&o.__esModule?o.default:o;return r[n].importedDefault=l}function a(e){var o=e;if(r[o]&&r[o].importedAll!==t)return r[o].importedAll;var l,a=i(o);if(a&&a.__esModule)l=a;else{if(l={},a)for(var u in a)n.call(a,u)&&(l[u]=a[u]);l.default=a}return r[o].importedAll=l}i.importDefault=l,i.importAll=a,i.context=function(){throw new Error("The experimental Metro feature `require.context` is not enabled in your project.")},i.resolveWeak=function(){throw new Error("require.resolveWeak cannot be called dynamically.")};var u=!1;function d(r,t){if(!u&&e.ErrorUtils){var n;u=!0;try{n=s(r,t)}catch(r){e.ErrorUtils.reportFatalError(r)}return u=!1,n}return s(r,t)}function c(e){return{segmentId:e>>>16,localId:65535&e}}i.unpackModuleId=c,i.packModuleId=function(e){return(e.segmentId<<16)+e.localId};var f=[],p=new Map;function s(t,n){if(!n&&f.length>0){var o,u=null!=(o=p.get(t))?o:0,d=f[u];null!=d&&(d(t),n=r[t],p.delete(t))}var s=e.nativeRequire;if(!n&&s){var v=c(t),h=v.segmentId;s(v.localId,h),n=r[t]}if(!n)throw Error('Requiring unknown module "'+t+'".');if(n.hasError)throw n.error;n.isInitialized=!0;var _=n,m=_.factory,y=_.dependencyMap;try{var w=n.publicModule;return w.id=t,m(e,i,l,a,w,w.exports,y),n.factory=void 0,n.dependencyMap=void 0,w.exports}catch(e){throw n.hasError=!0,n.error=e,n.isInitialized=!1,n.publicModule.exports=void 0,e}}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
|
|
3
3
|
!(function(n){var e=(function(){function n(n,e){return n}function e(n){var e={};return n.forEach((function(n,t){e[n]=!0})),e}function t(n,t,a){if(n.formatValueCalls++,n.formatValueCalls>200)return`[TOO BIG formatValueCalls ${n.formatValueCalls} exceeded limit of 200]`;var c=r(n,t);if(c)return c;var f=Object.keys(t),p=e(f);if(d(t)&&(f.indexOf('message')>=0||f.indexOf('description')>=0))return o(t);if(0===f.length){if(v(t)){var g=t.name?': '+t.name:'';return n.stylize('[Function'+g+']','special')}if(s(t))return n.stylize(RegExp.prototype.toString.call(t),'regexp');if(y(t))return n.stylize(Date.prototype.toString.call(t),'date');if(d(t))return o(t)}var h,m,b='',j=!1,O=['{','}'];(h=t,Array.isArray(h)&&(j=!0,O=['[',']']),v(t))&&(b=' [Function'+(t.name?': '+t.name:'')+']');return s(t)&&(b=' '+RegExp.prototype.toString.call(t)),y(t)&&(b=' '+Date.prototype.toUTCString.call(t)),d(t)&&(b=' '+o(t)),0!==f.length||j&&0!=t.length?a<0?s(t)?n.stylize(RegExp.prototype.toString.call(t),'regexp'):n.stylize('[Object]','special'):(n.seen.push(t),m=j?i(n,t,a,p,f):f.map((function(e){return l(n,t,a,p,e,j)})),n.seen.pop(),u(m,b,O)):O[0]+b+O[1]}function r(n,e){if(p(e))return n.stylize('undefined','undefined');if('string'==typeof e){var t="'"+JSON.stringify(e).replace(/^"|"$/g,'').replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return n.stylize(t,'string')}return f(e)?n.stylize(''+e,'number'):a(e)?n.stylize(''+e,'boolean'):c(e)?n.stylize('null','null'):void 0}function o(n){return'['+Error.prototype.toString.call(n)+']'}function i(n,e,t,r,o){for(var i=[],u=0,a=e.length;u<a;++u)m(e,String(u))?i.push(l(n,e,t,r,String(u),!0)):i.push('');return o.forEach((function(o){o.match(/^\d+$/)||i.push(l(n,e,t,r,o,!0))})),i}function l(n,e,r,o,i,l){var u,a,f;if((f=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?a=f.set?n.stylize('[Getter/Setter]','special'):n.stylize('[Getter]','special'):f.set&&(a=n.stylize('[Setter]','special')),m(o,i)||(u='['+i+']'),a||(n.seen.indexOf(f.value)<0?(a=c(r)?t(n,f.value,null):t(n,f.value,r-1)).indexOf('\n')>-1&&(a=l?a.split('\n').map((function(n){return' '+n})).join('\n').slice(2):'\n'+a.split('\n').map((function(n){return' '+n})).join('\n')):a=n.stylize('[Circular]','special')),p(u)){if(l&&i.match(/^\d+$/))return a;(u=JSON.stringify(''+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(u=u.slice(1,u.length-1),u=n.stylize(u,'name')):(u=u.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),u=n.stylize(u,'string'))}return u+': '+a}function u(n,e,t){return n.reduce((function(n,e){return e.indexOf('\n')>=0&&0,n+e.replace(/\u001b\[\d\d?m/g,'').length+1}),0)>60?t[0]+(''===e?'':e+'\n ')+' '+n.join(',\n ')+' '+t[1]:t[0]+e+' '+n.join(', ')+' '+t[1]}function a(n){return'boolean'==typeof n}function c(n){return null===n}function f(n){return'number'==typeof n}function p(n){return void 0===n}function s(n){return g(n)&&'[object RegExp]'===h(n)}function g(n){return'object'==typeof n&&null!==n}function y(n){return g(n)&&'[object Date]'===h(n)}function d(n){return g(n)&&('[object Error]'===h(n)||n instanceof Error)}function v(n){return'function'==typeof n}function h(n){return Object.prototype.toString.call(n)}function m(n,e){return Object.prototype.hasOwnProperty.call(n,e)}return function(e,r){return t({seen:[],formatValueCalls:0,stylize:n},e,r.depth)}})(),t=0,r=1,o=2,i=3,l=[];l[t]='debug',l[r]='log',l[o]='warning',l[i]='error';function u(t){return function(){var r;r=1===arguments.length&&'string'==typeof arguments[0]?arguments[0]:Array.prototype.map.call(arguments,(function(n){return e(n,{depth:10})})).join(', ');var u=arguments[0],a=t;'string'==typeof u&&'Warning: '===u.slice(0,9)&&a>=i&&(a=o),n.__inspectorLog&&n.__inspectorLog(l[a],r,[].slice.call(arguments),1),c.length&&(r=f('',r)),n.nativeLoggingHook(r,a)}}function a(n,e){return Array.apply(null,Array(e)).map((function(){return n}))}var c=[];function f(n,e){return c.join('')+n+' '+(e||'')}if(n.nativeLoggingHook){n.console;n.console={error:u(i),info:u(r),log:u(r),warn:u(o),trace:u(t),debug:u(t),table:function(e){if(!Array.isArray(e)){var t=e;for(var o in e=[],t)if(t.hasOwnProperty(o)){var i=t[o];i["(index)"]=o,e.push(i)}}if(0!==e.length){var l=Object.keys(e[0]).sort(),u=[],c=[];l.forEach((function(n,t){c[t]=n.length;for(var r=0;r<e.length;r++){var o=(e[r][n]||'?').toString();u[r]=u[r]||[],u[r][t]=o,c[t]=Math.max(c[t],o.length)}}));for(var f=g(c.map((function(n){return a('-',n).join('')})),'-'),p=[g(l),f],s=0;s<e.length;s++)p.push(g(u[s]));n.nativeLoggingHook('\n'+p.join('\n'),r)}else n.nativeLoggingHook('',r);function g(n,e){var t=n.map((function(n,e){return n+a(' ',c[e]-n.length).join('')}));return e=e||' ',t.join(e+'|'+e)}},group:function(e){n.nativeLoggingHook(f("\u2510",e),r),c.push("\u2502")},groupEnd:function(){c.pop(),n.nativeLoggingHook(f("\u2518"),r)},groupCollapsed:function(e){n.nativeLoggingHook(f("\u2518",e),r),c.push("\u2502")},assert:function(e,t){e||n.nativeLoggingHook('Assertion failed: '+t,i)}},Object.defineProperty(console,'_isPolyfilled',{value:!0,enumerable:!1})}else if(!n.console){var p=function(){},s=n.print||p;n.console={debug:s,error:s,info:s,log:s,trace:s,warn:s,assert:function(n,e){n||s('Assertion failed: '+e)},clear:p,dir:p,dirxml:p,group:p,groupCollapsed:p,groupEnd:p,profile:p,profileEnd:p,table:p},Object.defineProperty(console,'_isPolyfilled',{value:!0,enumerable:!1})}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
|
|
4
4
|
!(function(n){var r=0,t=function(n,r){throw n},l={setGlobalHandler:function(n){t=n},getGlobalHandler:function(){return t},reportError:function(n){t&&t(n,!1)},reportFatalError:function(n){t&&t(n,!0)},applyWithGuard:function(n,t,u,o,e){try{return r++,n.apply(t,u)}catch(n){l.reportError(n)}finally{r--}return null},applyWithGuardIfNeeded:function(n,r,t){return l.inGuard()?n.apply(r,t):(l.applyWithGuard(n,r,t),null)},inGuard:function(){return!!r},guard:function(n,r,t){var u;if('function'!=typeof n)return console.warn('A function must be passed to ErrorUtils.guard, got ',n),null;var o=null!=(u=null!=r?r:n.name)?u:'<generated guard>';return function(){for(var r=arguments.length,u=new Array(r),e=0;e<r;e++)u[e]=arguments[e];return l.applyWithGuard(n,null!=t?t:this,u,null,o)}}};n.ErrorUtils=l})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
|
|
5
|
-
(function(
|
|
5
|
+
!(function(e){try{e.$$require_external="undefined"==typeof expo?require:function(e){throw new Error(`Node.js standard library module ${e} is not available in this JavaScript environment`)}}catch(n){e.$$require_external=function(e){throw new Error(`Node.js standard library module ${e} is not available in this JavaScript environment`)}}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
|
|
6
6
|
'undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window&&window;
|
|
7
7
|
__d((function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),p=r(d[2]);(0,t.enableScreens)(!1),n.AppRegistry.registerComponent('main',(function(){return p.App}))}),0,[1,464,489]);
|
|
8
8
|
__d((function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);r(d[1]);m.exports={get registerCallableModule(){return r(d[2]).default},get AccessibilityInfo(){return r(d[3]).default},get ActivityIndicator(){return r(d[4]).default},get Button(){return r(d[5]).default},get DrawerLayoutAndroid(){return r(d[6])},get FlatList(){return r(d[7])},get Image(){return r(d[8])},get ImageBackground(){return r(d[9])},get InputAccessoryView(){return r(d[10]).default},get KeyboardAvoidingView(){return r(d[11]).default},get Modal(){return r(d[12])},get Pressable(){return r(d[13]).default},get ProgressBarAndroid(){return t('progress-bar-android-moved',"ProgressBarAndroid has been extracted from react-native core and will be removed in a future release. It can now be installed and imported from '@react-native-community/progress-bar-android' instead of 'react-native'. See https://github.com/react-native-progress-view/progress-bar-android"),r(d[14])},get RefreshControl(){return r(d[15])},get SafeAreaView(){return r(d[16]).default},get ScrollView(){return r(d[17])},get SectionList(){return r(d[18]).default},get StatusBar(){return r(d[19])},get Switch(){return r(d[20]).default},get Text(){return r(d[21])},get TextInput(){return r(d[22])},get Touchable(){return r(d[23]).default},get TouchableHighlight(){return r(d[24])},get TouchableNativeFeedback(){return r(d[25])},get TouchableOpacity(){return r(d[26])},get TouchableWithoutFeedback(){return r(d[27])},get View(){return r(d[28])},get VirtualizedList(){return r(d[29])},get VirtualizedSectionList(){return r(d[30])},get ActionSheetIOS(){return r(d[31])},get Alert(){return r(d[32])},get Animated(){return r(d[33]).default},get Appearance(){return r(d[34])},get AppRegistry(){return r(d[35])},get AppState(){return r(d[36])},get BackHandler(){return r(d[37])},get Clipboard(){return t('clipboard-moved',"Clipboard has been extracted from react-native core and will be removed in a future release. It can now be installed and imported from '@react-native-clipboard/clipboard' instead of 'react-native'. See https://github.com/react-native-clipboard/clipboard"),r(d[38])},get DeviceInfo(){return r(d[39])},get DevSettings(){return r(d[40])},get Dimensions(){return r(d[41]).default},get Easing(){return r(d[42]).default},get findNodeHandle(){return r(d[43]).findNodeHandle},get I18nManager(){return r(d[44])},get InteractionManager(){return r(d[45])},get Keyboard(){return r(d[46])},get LayoutAnimation(){return r(d[47])},get Linking(){return r(d[48])},get LogBox(){return r(d[49]).default},get NativeDialogManagerAndroid(){return r(d[50]).default},get NativeEventEmitter(){return r(d[51]).default},get Networking(){return r(d[52]).default},get PanResponder(){return r(d[53]).default},get PermissionsAndroid(){return r(d[54])},get PixelRatio(){return r(d[55]).default},get PushNotificationIOS(){return t('pushNotificationIOS-moved',"PushNotificationIOS has been extracted from react-native core and will be removed in a future release. It can now be installed and imported from '@react-native-community/push-notification-ios' instead of 'react-native'. See https://github.com/react-native-push-notification/ios"),r(d[56])},get Settings(){return r(d[57])},get Share(){return r(d[58])},get StyleSheet(){return r(d[59])},get Systrace(){return r(d[60])},get ToastAndroid(){return r(d[61])},get TurboModuleRegistry(){return r(d[62])},get UIManager(){return r(d[63])},get unstable_batchedUpdates(){return r(d[43]).unstable_batchedUpdates},get useAnimatedValue(){return r(d[64]).default},get useColorScheme(){return r(d[65]).default},get useWindowDimensions(){return r(d[66]).default},get UTFSequence(){return r(d[67]).default},get Vibration(){return r(d[68])},get YellowBox(){return r(d[69])},get DeviceEventEmitter(){return r(d[70]).default},get DynamicColorIOS(){return r(d[71]).DynamicColorIOS},get NativeAppEventEmitter(){return r(d[72])},get NativeModules(){return r(d[73])},get Platform(){return r(d[74])},get PlatformColor(){return r(d[75]).PlatformColor},get processColor(){return r(d[76]).default},get requireNativeComponent(){return r(d[77]).default},get RootTagContext(){return r(d[78]).RootTagContext},get unstable_enableLogBox(){return function(){return console.warn('LogBox is enabled by default so there is no need to call unstable_enableLogBox() anymore. This is a no op and will be removed in the next version.')}}}}),1,[2,3,4,23,255,262,377,319,338,385,386,389,390,399,256,349,401,354,374,378,402,263,407,408,412,275,276,413,236,414,415,416,202,277,419,220,423,244,427,430,431,81,290,35,396,287,360,361,434,439,204,180,179,440,442,80,445,448,449,241,18,452,50,91,455,456,457,458,459,462,24,463,215,51,57,71,68,260,242]);
|
|
@@ -2,7 +2,7 @@ var __BUNDLE_START_TIME__=this.nativePerformanceNow?nativePerformanceNow():Date.
|
|
|
2
2
|
!(function(e){"use strict";e.__r=i,e[`${__METRO_GLOBAL_PREFIX__}__d`]=function(e,n,o){if(null!=r[n])return;var i={dependencyMap:o,factory:e,hasError:!1,importedAll:t,importedDefault:t,isInitialized:!1,publicModule:{exports:{}}};r[n]=i},e.__c=o,e.__registerSegment=function(e,t,n){f[e]=t,n&&n.forEach((function(t){r[t]||p.has(t)||p.set(t,e)}))};var r=o(),t={},n={}.hasOwnProperty;function o(){return r=Object.create(null)}function i(e){var t=e,n=r[t];return n&&n.isInitialized?n.publicModule.exports:d(t,n)}function l(e){var n=e;if(r[n]&&r[n].importedDefault!==t)return r[n].importedDefault;var o=i(n),l=o&&o.__esModule?o.default:o;return r[n].importedDefault=l}function a(e){var o=e;if(r[o]&&r[o].importedAll!==t)return r[o].importedAll;var l,a=i(o);if(a&&a.__esModule)l=a;else{if(l={},a)for(var u in a)n.call(a,u)&&(l[u]=a[u]);l.default=a}return r[o].importedAll=l}i.importDefault=l,i.importAll=a,i.context=function(){throw new Error("The experimental Metro feature `require.context` is not enabled in your project.")},i.resolveWeak=function(){throw new Error("require.resolveWeak cannot be called dynamically.")};var u=!1;function d(r,t){if(!u&&e.ErrorUtils){var n;u=!0;try{n=s(r,t)}catch(r){e.ErrorUtils.reportFatalError(r)}return u=!1,n}return s(r,t)}function c(e){return{segmentId:e>>>16,localId:65535&e}}i.unpackModuleId=c,i.packModuleId=function(e){return(e.segmentId<<16)+e.localId};var f=[],p=new Map;function s(t,n){if(!n&&f.length>0){var o,u=null!=(o=p.get(t))?o:0,d=f[u];null!=d&&(d(t),n=r[t],p.delete(t))}var s=e.nativeRequire;if(!n&&s){var v=c(t),h=v.segmentId;s(v.localId,h),n=r[t]}if(!n)throw Error('Requiring unknown module "'+t+'".');if(n.hasError)throw n.error;n.isInitialized=!0;var _=n,m=_.factory,y=_.dependencyMap;try{var w=n.publicModule;return w.id=t,m(e,i,l,a,w,w.exports,y),n.factory=void 0,n.dependencyMap=void 0,w.exports}catch(e){throw n.hasError=!0,n.error=e,n.isInitialized=!1,n.publicModule.exports=void 0,e}}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
|
|
3
3
|
!(function(n){var e=(function(){function n(n,e){return n}function e(n){var e={};return n.forEach((function(n,t){e[n]=!0})),e}function t(n,t,a){if(n.formatValueCalls++,n.formatValueCalls>200)return`[TOO BIG formatValueCalls ${n.formatValueCalls} exceeded limit of 200]`;var c=r(n,t);if(c)return c;var f=Object.keys(t),p=e(f);if(d(t)&&(f.indexOf('message')>=0||f.indexOf('description')>=0))return o(t);if(0===f.length){if(v(t)){var g=t.name?': '+t.name:'';return n.stylize('[Function'+g+']','special')}if(s(t))return n.stylize(RegExp.prototype.toString.call(t),'regexp');if(y(t))return n.stylize(Date.prototype.toString.call(t),'date');if(d(t))return o(t)}var h,m,b='',j=!1,O=['{','}'];(h=t,Array.isArray(h)&&(j=!0,O=['[',']']),v(t))&&(b=' [Function'+(t.name?': '+t.name:'')+']');return s(t)&&(b=' '+RegExp.prototype.toString.call(t)),y(t)&&(b=' '+Date.prototype.toUTCString.call(t)),d(t)&&(b=' '+o(t)),0!==f.length||j&&0!=t.length?a<0?s(t)?n.stylize(RegExp.prototype.toString.call(t),'regexp'):n.stylize('[Object]','special'):(n.seen.push(t),m=j?i(n,t,a,p,f):f.map((function(e){return l(n,t,a,p,e,j)})),n.seen.pop(),u(m,b,O)):O[0]+b+O[1]}function r(n,e){if(p(e))return n.stylize('undefined','undefined');if('string'==typeof e){var t="'"+JSON.stringify(e).replace(/^"|"$/g,'').replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return n.stylize(t,'string')}return f(e)?n.stylize(''+e,'number'):a(e)?n.stylize(''+e,'boolean'):c(e)?n.stylize('null','null'):void 0}function o(n){return'['+Error.prototype.toString.call(n)+']'}function i(n,e,t,r,o){for(var i=[],u=0,a=e.length;u<a;++u)m(e,String(u))?i.push(l(n,e,t,r,String(u),!0)):i.push('');return o.forEach((function(o){o.match(/^\d+$/)||i.push(l(n,e,t,r,o,!0))})),i}function l(n,e,r,o,i,l){var u,a,f;if((f=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?a=f.set?n.stylize('[Getter/Setter]','special'):n.stylize('[Getter]','special'):f.set&&(a=n.stylize('[Setter]','special')),m(o,i)||(u='['+i+']'),a||(n.seen.indexOf(f.value)<0?(a=c(r)?t(n,f.value,null):t(n,f.value,r-1)).indexOf('\n')>-1&&(a=l?a.split('\n').map((function(n){return' '+n})).join('\n').slice(2):'\n'+a.split('\n').map((function(n){return' '+n})).join('\n')):a=n.stylize('[Circular]','special')),p(u)){if(l&&i.match(/^\d+$/))return a;(u=JSON.stringify(''+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(u=u.slice(1,u.length-1),u=n.stylize(u,'name')):(u=u.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),u=n.stylize(u,'string'))}return u+': '+a}function u(n,e,t){return n.reduce((function(n,e){return e.indexOf('\n')>=0&&0,n+e.replace(/\u001b\[\d\d?m/g,'').length+1}),0)>60?t[0]+(''===e?'':e+'\n ')+' '+n.join(',\n ')+' '+t[1]:t[0]+e+' '+n.join(', ')+' '+t[1]}function a(n){return'boolean'==typeof n}function c(n){return null===n}function f(n){return'number'==typeof n}function p(n){return void 0===n}function s(n){return g(n)&&'[object RegExp]'===h(n)}function g(n){return'object'==typeof n&&null!==n}function y(n){return g(n)&&'[object Date]'===h(n)}function d(n){return g(n)&&('[object Error]'===h(n)||n instanceof Error)}function v(n){return'function'==typeof n}function h(n){return Object.prototype.toString.call(n)}function m(n,e){return Object.prototype.hasOwnProperty.call(n,e)}return function(e,r){return t({seen:[],formatValueCalls:0,stylize:n},e,r.depth)}})(),t=0,r=1,o=2,i=3,l=[];l[t]='debug',l[r]='log',l[o]='warning',l[i]='error';function u(t){return function(){var r;r=1===arguments.length&&'string'==typeof arguments[0]?arguments[0]:Array.prototype.map.call(arguments,(function(n){return e(n,{depth:10})})).join(', ');var u=arguments[0],a=t;'string'==typeof u&&'Warning: '===u.slice(0,9)&&a>=i&&(a=o),n.__inspectorLog&&n.__inspectorLog(l[a],r,[].slice.call(arguments),1),c.length&&(r=f('',r)),n.nativeLoggingHook(r,a)}}function a(n,e){return Array.apply(null,Array(e)).map((function(){return n}))}var c=[];function f(n,e){return c.join('')+n+' '+(e||'')}if(n.nativeLoggingHook){n.console;n.console={error:u(i),info:u(r),log:u(r),warn:u(o),trace:u(t),debug:u(t),table:function(e){if(!Array.isArray(e)){var t=e;for(var o in e=[],t)if(t.hasOwnProperty(o)){var i=t[o];i["(index)"]=o,e.push(i)}}if(0!==e.length){var l=Object.keys(e[0]).sort(),u=[],c=[];l.forEach((function(n,t){c[t]=n.length;for(var r=0;r<e.length;r++){var o=(e[r][n]||'?').toString();u[r]=u[r]||[],u[r][t]=o,c[t]=Math.max(c[t],o.length)}}));for(var f=g(c.map((function(n){return a('-',n).join('')})),'-'),p=[g(l),f],s=0;s<e.length;s++)p.push(g(u[s]));n.nativeLoggingHook('\n'+p.join('\n'),r)}else n.nativeLoggingHook('',r);function g(n,e){var t=n.map((function(n,e){return n+a(' ',c[e]-n.length).join('')}));return e=e||' ',t.join(e+'|'+e)}},group:function(e){n.nativeLoggingHook(f("\u2510",e),r),c.push("\u2502")},groupEnd:function(){c.pop(),n.nativeLoggingHook(f("\u2518"),r)},groupCollapsed:function(e){n.nativeLoggingHook(f("\u2518",e),r),c.push("\u2502")},assert:function(e,t){e||n.nativeLoggingHook('Assertion failed: '+t,i)}},Object.defineProperty(console,'_isPolyfilled',{value:!0,enumerable:!1})}else if(!n.console){var p=function(){},s=n.print||p;n.console={debug:s,error:s,info:s,log:s,trace:s,warn:s,assert:function(n,e){n||s('Assertion failed: '+e)},clear:p,dir:p,dirxml:p,group:p,groupCollapsed:p,groupEnd:p,profile:p,profileEnd:p,table:p},Object.defineProperty(console,'_isPolyfilled',{value:!0,enumerable:!1})}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
|
|
4
4
|
!(function(n){var r=0,t=function(n,r){throw n},l={setGlobalHandler:function(n){t=n},getGlobalHandler:function(){return t},reportError:function(n){t&&t(n,!1)},reportFatalError:function(n){t&&t(n,!0)},applyWithGuard:function(n,t,u,o,e){try{return r++,n.apply(t,u)}catch(n){l.reportError(n)}finally{r--}return null},applyWithGuardIfNeeded:function(n,r,t){return l.inGuard()?n.apply(r,t):(l.applyWithGuard(n,r,t),null)},inGuard:function(){return!!r},guard:function(n,r,t){var u;if('function'!=typeof n)return console.warn('A function must be passed to ErrorUtils.guard, got ',n),null;var o=null!=(u=null!=r?r:n.name)?u:'<generated guard>';return function(){for(var r=arguments.length,u=new Array(r),e=0;e<r;e++)u[e]=arguments[e];return l.applyWithGuard(n,null!=t?t:this,u,null,o)}}};n.ErrorUtils=l})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
|
|
5
|
-
(function(
|
|
5
|
+
!(function(e){try{e.$$require_external="undefined"==typeof expo?require:function(e){throw new Error(`Node.js standard library module ${e} is not available in this JavaScript environment`)}}catch(n){e.$$require_external=function(e){throw new Error(`Node.js standard library module ${e} is not available in this JavaScript environment`)}}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
|
|
6
6
|
'undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window&&window;
|
|
7
7
|
__d((function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),p=r(d[2]);(0,t.enableScreens)(!1),n.AppRegistry.registerComponent('main',(function(){return p.App}))}),0,[1,461,486]);
|
|
8
8
|
__d((function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);r(d[1]);m.exports={get registerCallableModule(){return r(d[2]).default},get AccessibilityInfo(){return r(d[3]).default},get ActivityIndicator(){return r(d[4]).default},get Button(){return r(d[5]).default},get DrawerLayoutAndroid(){return r(d[6])},get FlatList(){return r(d[7])},get Image(){return r(d[8])},get ImageBackground(){return r(d[9])},get InputAccessoryView(){return r(d[10]).default},get KeyboardAvoidingView(){return r(d[11]).default},get Modal(){return r(d[12])},get Pressable(){return r(d[13]).default},get ProgressBarAndroid(){return t('progress-bar-android-moved',"ProgressBarAndroid has been extracted from react-native core and will be removed in a future release. It can now be installed and imported from '@react-native-community/progress-bar-android' instead of 'react-native'. See https://github.com/react-native-progress-view/progress-bar-android"),r(d[14])},get RefreshControl(){return r(d[15])},get SafeAreaView(){return r(d[16]).default},get ScrollView(){return r(d[17])},get SectionList(){return r(d[18]).default},get StatusBar(){return r(d[19])},get Switch(){return r(d[20]).default},get Text(){return r(d[21])},get TextInput(){return r(d[22])},get Touchable(){return r(d[23]).default},get TouchableHighlight(){return r(d[24])},get TouchableNativeFeedback(){return r(d[25])},get TouchableOpacity(){return r(d[26])},get TouchableWithoutFeedback(){return r(d[27])},get View(){return r(d[28])},get VirtualizedList(){return r(d[29])},get VirtualizedSectionList(){return r(d[30])},get ActionSheetIOS(){return r(d[31])},get Alert(){return r(d[32])},get Animated(){return r(d[33]).default},get Appearance(){return r(d[34])},get AppRegistry(){return r(d[35])},get AppState(){return r(d[36])},get BackHandler(){return r(d[37])},get Clipboard(){return t('clipboard-moved',"Clipboard has been extracted from react-native core and will be removed in a future release. It can now be installed and imported from '@react-native-clipboard/clipboard' instead of 'react-native'. See https://github.com/react-native-clipboard/clipboard"),r(d[38])},get DeviceInfo(){return r(d[39])},get DevSettings(){return r(d[40])},get Dimensions(){return r(d[41]).default},get Easing(){return r(d[42]).default},get findNodeHandle(){return r(d[43]).findNodeHandle},get I18nManager(){return r(d[44])},get InteractionManager(){return r(d[45])},get Keyboard(){return r(d[46])},get LayoutAnimation(){return r(d[47])},get Linking(){return r(d[48])},get LogBox(){return r(d[49]).default},get NativeDialogManagerAndroid(){return r(d[50]).default},get NativeEventEmitter(){return r(d[51]).default},get Networking(){return r(d[52]).default},get PanResponder(){return r(d[53]).default},get PermissionsAndroid(){return r(d[54])},get PixelRatio(){return r(d[55]).default},get PushNotificationIOS(){return t('pushNotificationIOS-moved',"PushNotificationIOS has been extracted from react-native core and will be removed in a future release. It can now be installed and imported from '@react-native-community/push-notification-ios' instead of 'react-native'. See https://github.com/react-native-push-notification/ios"),r(d[56])},get Settings(){return r(d[57])},get Share(){return r(d[58])},get StyleSheet(){return r(d[59])},get Systrace(){return r(d[60])},get ToastAndroid(){return r(d[61])},get TurboModuleRegistry(){return r(d[62])},get UIManager(){return r(d[63])},get unstable_batchedUpdates(){return r(d[43]).unstable_batchedUpdates},get useAnimatedValue(){return r(d[64]).default},get useColorScheme(){return r(d[65]).default},get useWindowDimensions(){return r(d[66]).default},get UTFSequence(){return r(d[67]).default},get Vibration(){return r(d[68])},get YellowBox(){return r(d[69])},get DeviceEventEmitter(){return r(d[70]).default},get DynamicColorIOS(){return r(d[71]).DynamicColorIOS},get NativeAppEventEmitter(){return r(d[72])},get NativeModules(){return r(d[73])},get Platform(){return r(d[74])},get PlatformColor(){return r(d[75]).PlatformColor},get processColor(){return r(d[76]).default},get requireNativeComponent(){return r(d[77]).default},get RootTagContext(){return r(d[78]).RootTagContext},get unstable_enableLogBox(){return function(){return console.warn('LogBox is enabled by default so there is no need to call unstable_enableLogBox() anymore. This is a no op and will be removed in the next version.')}}}}),1,[2,3,4,23,254,260,374,317,336,375,376,379,380,389,391,346,392,351,371,395,396,261,401,403,407,273,274,408,238,409,410,411,204,275,414,222,418,246,422,425,426,81,288,35,386,285,357,358,429,434,435,193,181,437,439,80,442,445,448,243,18,451,50,91,452,453,454,455,456,459,24,460,217,51,57,71,68,258,244]);
|