@dynatrace/react-native-plugin 2.327.1 → 2.329.1
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/README.md +426 -169
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/dynatrace/android/agent/DynatraceConfigurationModule.kt +48 -0
- package/android/src/main/java/com/dynatrace/android/agent/DynatraceRNBridgeImpl.kt +41 -8
- package/android/src/main/java/com/dynatrace/android/agent/DynatraceReactPackage.kt +3 -0
- package/android/src/main/java/com/dynatrace/android/agent/DynatraceRuntimeConfigurationStore.kt +14 -0
- package/android/src/main/java/com/dynatrace/android/agent/DynatraceUtils.kt +103 -47
- package/android/src/new/java/com/dynatrace/android/agent/DynatraceRNBridge.kt +12 -4
- package/android/src/old/java/com/dynatrace/android/agent/DynatraceRNBridge.kt +15 -5
- package/files/default.config.js +7 -0
- package/files/plugin-runtime.gradle +7 -17
- package/files/plugin.gradle +1 -1
- package/instrumentation/DynatraceInstrumentation.js +1 -1
- package/instrumentation/libs/react-native/Touchables.js +9 -0
- package/instrumentation/libs/react-navigation/ReactNavigation.js +53 -18
- package/ios/ConfigurationSubscriber.h +15 -0
- package/ios/DynatraceRNBridge.h +4 -0
- package/ios/DynatraceRNBridge.mm +220 -33
- package/lib/core/Dynatrace.js +8 -11
- package/lib/core/configuration/ConfigurationHandler.js +3 -0
- package/lib/next/Dynatrace.js +14 -32
- package/lib/next/DynatraceEventBus.js +35 -0
- package/lib/next/appstart/AppStartObserver.js +12 -16
- package/lib/next/configuration/INativeRuntimeConfiguration.js +7 -0
- package/lib/next/configuration/RuntimeConfigurationObserver.js +40 -0
- package/lib/next/events/EventBuilderUtil.js +7 -0
- package/lib/next/events/EventData.js +28 -0
- package/lib/next/events/EventPipeline.js +5 -11
- package/lib/next/events/ExceptionEventData.js +26 -0
- package/lib/next/events/{HttpRequestEventBuilder.js → HttpRequestEventData.js} +28 -52
- package/lib/next/events/SessionPropertyEventData.js +22 -0
- package/lib/next/events/interface/IBaseEvent.js +2 -0
- package/lib/next/events/interface/IEventData.js +2 -0
- package/lib/next/events/interface/IExceptionEventData.js +2 -0
- package/lib/next/events/interface/IHttpRequestEventData.js +2 -0
- package/lib/next/events/interface/ISessionPropertyEventData.js +2 -0
- package/lib/next/events/modifier/BaseDataEventModifier.js +1 -3
- package/lib/next/events/modifier/EventModifierUtil.js +34 -41
- package/lib/next/events/modifier/ModifyEventValidation.js +118 -26
- package/lib/next/events/modifier/SendEventValidation.js +53 -22
- package/lib/next/events/modifier/StringLengthEventModifier.js +53 -0
- package/lib/next/events/spec/EventSpecContstants.js +9 -2
- package/package.json +8 -3
- package/public.js +9 -3
- package/react-native-dynatrace.podspec +1 -1
- package/scripts/Config.js +6 -2
- package/scripts/LineOffsetAnalyze.js +1 -4
- package/scripts/core/LineOffsetAnalyzeCall.js +39 -46
- package/src/lib/core/interface/NativeDynatraceBridge.ts +6 -2
- package/types.d.ts +388 -158
- package/lib/next/events/ViewInfoCreator.js +0 -27
- package/lib/next/events/modifier/EventLimitation.js +0 -69
- /package/lib/next/events/{IHttpRequestEventBuilder.js → interface/EventProperty.js} +0 -0
package/android/build.gradle
CHANGED
|
@@ -72,7 +72,7 @@ repositories {
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
dependencies {
|
|
75
|
-
implementation 'com.dynatrace.agent:agent-android:8.
|
|
75
|
+
implementation 'com.dynatrace.agent:agent-android:8.329.1.1014'
|
|
76
76
|
implementation "com.facebook.react:react-native:${safeExtGet('reactNative', '+')}"
|
|
77
77
|
}
|
|
78
78
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
package com.dynatrace.android.agent
|
|
2
|
+
|
|
3
|
+
import android.util.Log
|
|
4
|
+
import com.dynatrace.android.agent.conf.ConfigurationSubscriber
|
|
5
|
+
import com.facebook.react.bridge.Arguments
|
|
6
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
7
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
8
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Name of the module
|
|
12
|
+
*/
|
|
13
|
+
private const val CONFIGURATION_MODULE = "DynatraceConfigurationModule"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Emitting configuration event with this identifier
|
|
17
|
+
*/
|
|
18
|
+
private const val EMIT_CONFIGURATION = "dynatraceConfiguration"
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Module which is handling the runtime configuration changes
|
|
22
|
+
*/
|
|
23
|
+
internal class DynatraceConfigurationModule(reactContext: ReactApplicationContext?) :
|
|
24
|
+
ReactContextBaseJavaModule(reactContext) {
|
|
25
|
+
|
|
26
|
+
init {
|
|
27
|
+
setupInternalListener()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* We setup the listener internally as we
|
|
32
|
+
*/
|
|
33
|
+
private fun setupInternalListener() {
|
|
34
|
+
HybridBridge.addConfigurationSubscriber(object : ConfigurationSubscriber {
|
|
35
|
+
// Called when config changes on native side and for the initial value
|
|
36
|
+
override fun notify(configuration: Map<String, Any>) {
|
|
37
|
+
DynatraceRuntimeConfigurationStore.update(configuration)
|
|
38
|
+
reactApplicationContext
|
|
39
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
40
|
+
.emit(EMIT_CONFIGURATION, Arguments.makeNativeMap(configuration))
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
override fun getName(): String {
|
|
46
|
+
return CONFIGURATION_MODULE
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -10,6 +10,7 @@ import com.facebook.react.bridge.Promise
|
|
|
10
10
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
11
11
|
import com.facebook.react.bridge.ReadableMap
|
|
12
12
|
import com.facebook.react.bridge.ReadableArray
|
|
13
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
13
14
|
import org.json.JSONObject
|
|
14
15
|
import java.net.URI
|
|
15
16
|
import java.net.URISyntaxException
|
|
@@ -21,6 +22,12 @@ private const val DATA_COLLECTION_PERFORMANCE = "PERFORMANCE"
|
|
|
21
22
|
private const val DATA_COLLECTION_USERBEHAVIOR = "USER_BEHAVIOR"
|
|
22
23
|
const val BRIDGE_NAME = "DynatraceBridge"
|
|
23
24
|
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Emitting configuration event with this identifier
|
|
28
|
+
*/
|
|
29
|
+
private const val EMIT_CONFIGURATION = "dynatraceConfiguration"
|
|
30
|
+
|
|
24
31
|
class DynatraceRNBridgeImpl(
|
|
25
32
|
private val reactApplicationContext: ReactApplicationContext,
|
|
26
33
|
private val _internal: DynatraceInternalModule
|
|
@@ -36,6 +43,11 @@ class DynatraceRNBridgeImpl(
|
|
|
36
43
|
"DATA_COLLECTION_USERBEHAVIOR" to DATA_COLLECTION_USERBEHAVIOR
|
|
37
44
|
)
|
|
38
45
|
|
|
46
|
+
private var lastConfiguration: MutableMap<String, Any>? = null
|
|
47
|
+
private var hasInternalListener: Boolean = false
|
|
48
|
+
private var listenersCount: Int = 0
|
|
49
|
+
|
|
50
|
+
|
|
39
51
|
fun getConstants(): Map<String, Any> {
|
|
40
52
|
return constants;
|
|
41
53
|
}
|
|
@@ -300,10 +312,6 @@ class DynatraceRNBridgeImpl(
|
|
|
300
312
|
Dynatrace.startView(name)
|
|
301
313
|
}
|
|
302
314
|
|
|
303
|
-
fun stopView() {
|
|
304
|
-
Dynatrace.stopView()
|
|
305
|
-
}
|
|
306
|
-
|
|
307
315
|
fun setGPSLocation(lat: Double, lng: Double, platform: String?) {
|
|
308
316
|
if (shouldWorkOnAndroid(platform)) {
|
|
309
317
|
val location = Location("")
|
|
@@ -392,14 +400,39 @@ class DynatraceRNBridgeImpl(
|
|
|
392
400
|
}
|
|
393
401
|
}
|
|
394
402
|
|
|
395
|
-
@Suppress("UNUSED_PARAMETER")
|
|
396
403
|
fun addListener(eventName: String) {
|
|
397
|
-
|
|
404
|
+
listenersCount += 1
|
|
405
|
+
reactApplicationContext
|
|
406
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
407
|
+
.emit(EMIT_CONFIGURATION, Arguments.makeNativeMap(DynatraceRuntimeConfigurationStore.get()))
|
|
398
408
|
}
|
|
399
409
|
|
|
400
|
-
@Suppress("UNUSED_PARAMETER")
|
|
401
410
|
fun removeListeners(count: Double) {
|
|
402
|
-
|
|
411
|
+
listenersCount -= count.toInt()
|
|
412
|
+
if (listenersCount < 0) {
|
|
413
|
+
listenersCount = 0
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
fun onConfigurationUpdated(configuration: Map<String, Any>) {
|
|
418
|
+
lastConfiguration = configuration.toMutableMap()
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
fun getCurrentConfiguration(promise: Promise) {
|
|
422
|
+
val config = DynatraceRuntimeConfigurationStore.get()
|
|
423
|
+
if (config != null) {
|
|
424
|
+
promise.resolve(Arguments.makeNativeMap(config))
|
|
425
|
+
} else {
|
|
426
|
+
promise.resolve(null)
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
fun startViewInternal(fields: ReadableMap) {
|
|
431
|
+
HybridBridge.startView(JSONObject(DynatraceUtils.toHashMap(fields)))
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
fun stopViewInternal() {
|
|
435
|
+
HybridBridge.stopView()
|
|
403
436
|
}
|
|
404
437
|
|
|
405
438
|
private fun newAction(name: String, key: String) {
|
|
@@ -20,10 +20,12 @@ class DynatraceReactPackage : TurboReactPackage() {
|
|
|
20
20
|
|
|
21
21
|
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
|
|
22
22
|
val bridge = DynatraceInternalModule(reactContext)
|
|
23
|
+
val configurationSubscriber = DynatraceConfigurationModule(reactContext)
|
|
23
24
|
val appStart = DynatraceAppStartModule(reactContext)
|
|
24
25
|
return Arrays.asList<NativeModule>(
|
|
25
26
|
DynatraceRNBridge(reactContext, bridge),
|
|
26
27
|
bridge,
|
|
28
|
+
configurationSubscriber,
|
|
27
29
|
appStart
|
|
28
30
|
)
|
|
29
31
|
}
|
|
@@ -45,6 +47,7 @@ class DynatraceReactPackage : TurboReactPackage() {
|
|
|
45
47
|
|
|
46
48
|
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
|
|
47
49
|
return if (name == BRIDGE_NAME) {
|
|
50
|
+
DynatraceConfigurationModule(reactContext)
|
|
48
51
|
DynatraceAppStartModule(reactContext)
|
|
49
52
|
DynatraceRNBridge(reactContext, DynatraceInternalModule(reactContext))
|
|
50
53
|
} else {
|
package/android/src/main/java/com/dynatrace/android/agent/DynatraceRuntimeConfigurationStore.kt
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
package com.dynatrace.android.agent
|
|
2
|
+
|
|
3
|
+
object DynatraceRuntimeConfigurationStore {
|
|
4
|
+
@Volatile
|
|
5
|
+
private var lastConfiguration: MutableMap<String, Any>? = null
|
|
6
|
+
|
|
7
|
+
fun update(configuration: Map<String, Any>) {
|
|
8
|
+
lastConfiguration = configuration.toMutableMap()
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
fun get(): MutableMap<String, Any>? {
|
|
12
|
+
return lastConfiguration
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
package com.dynatrace.android.agent
|
|
2
2
|
|
|
3
|
+
import android.util.Log
|
|
3
4
|
import com.facebook.react.bridge.ReadableArray
|
|
4
5
|
import com.facebook.react.bridge.ReadableMap
|
|
5
6
|
import com.facebook.react.bridge.ReadableType
|
|
@@ -8,77 +9,132 @@ import com.facebook.react.bridge.ReadableType
|
|
|
8
9
|
* @author matthias.hochrieser
|
|
9
10
|
*/
|
|
10
11
|
internal object DynatraceUtils {
|
|
11
|
-
|
|
12
|
+
|
|
13
|
+
private const val TAG = "DynatraceUtils"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Converts a ReadableArray to an ArrayList.
|
|
17
|
+
*
|
|
18
|
+
* This method supports the following types:
|
|
19
|
+
* - Null
|
|
20
|
+
* - Boolean
|
|
21
|
+
* - Number (which will be converted to an Int or Long if possible, otherwise a Double)
|
|
22
|
+
* - String
|
|
23
|
+
* - Map (which will be converted to a HashMap)
|
|
24
|
+
* - Array (which will be converted to an ArrayList)
|
|
25
|
+
*
|
|
26
|
+
* If the ReadableArray contains an unsupported type, an IllegalArgumentException will be thrown.
|
|
27
|
+
*
|
|
28
|
+
* @param array the ReadableArray to be converted
|
|
29
|
+
* @return the converted ArrayList
|
|
30
|
+
*/
|
|
12
31
|
private fun toArrayList(array: ReadableArray?): ArrayList<Any?> {
|
|
13
|
-
|
|
14
|
-
|
|
32
|
+
if (array == null) {
|
|
33
|
+
return ArrayList()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
val arrayList = ArrayList<Any?>(array.size())
|
|
37
|
+
|
|
15
38
|
val size = array.size()
|
|
16
|
-
|
|
17
|
-
|
|
39
|
+
for (i in 0 until size) {
|
|
40
|
+
val type = array.getType(i)
|
|
41
|
+
|
|
42
|
+
when (type) {
|
|
18
43
|
ReadableType.Null -> arrayList.add(null)
|
|
19
|
-
|
|
44
|
+
|
|
45
|
+
ReadableType.Boolean ->
|
|
46
|
+
arrayList.add(array.getBoolean(i))
|
|
47
|
+
|
|
20
48
|
ReadableType.Number -> {
|
|
21
49
|
val value = array.getDouble(i)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
.toDouble()
|
|
30
|
-
) {
|
|
31
|
-
// This is a long
|
|
32
|
-
arrayList.add(array.getDouble(i).toLong())
|
|
33
|
-
}
|
|
34
|
-
} else {
|
|
35
|
-
arrayList.add(array.getDouble(i))
|
|
50
|
+
val converted = when {
|
|
51
|
+
value.isFinite() && value == value.toInt().toDouble() ->
|
|
52
|
+
value.toInt()
|
|
53
|
+
value.isFinite() && value == value.toLong().toDouble() ->
|
|
54
|
+
value.toLong()
|
|
55
|
+
else ->
|
|
56
|
+
value
|
|
36
57
|
}
|
|
58
|
+
arrayList.add(converted)
|
|
37
59
|
}
|
|
38
60
|
|
|
39
|
-
ReadableType.String ->
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
61
|
+
ReadableType.String ->
|
|
62
|
+
arrayList.add(array.getString(i))
|
|
63
|
+
|
|
64
|
+
ReadableType.Map -> {
|
|
65
|
+
val map = array.getMap(i)
|
|
66
|
+
arrayList.add(toHashMap(map))
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
ReadableType.Array -> {
|
|
70
|
+
val nestedArray = array.getArray(i)
|
|
71
|
+
arrayList.add(toArrayList(nestedArray))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
else -> {
|
|
75
|
+
throw IllegalArgumentException("Could not convert object at index: $i.")
|
|
76
|
+
}
|
|
43
77
|
}
|
|
44
|
-
i++
|
|
45
78
|
}
|
|
79
|
+
|
|
46
80
|
return arrayList
|
|
47
81
|
}
|
|
48
82
|
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Converts a ReadableMap to a HashMap.
|
|
86
|
+
*
|
|
87
|
+
* @param map the ReadableMap to convert
|
|
88
|
+
* @return a HashMap containing the same key-value pairs as the ReadableMap
|
|
89
|
+
* @throws IllegalArgumentException if the ReadableMap contains an object that cannot be converted to a HashMap
|
|
90
|
+
*/
|
|
49
91
|
fun toHashMap(map: ReadableMap?): HashMap<String, Any?> {
|
|
50
92
|
val hashMap = HashMap<String, Any?>()
|
|
51
|
-
|
|
93
|
+
|
|
94
|
+
if (map == null) {
|
|
95
|
+
return hashMap
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
val iterator = map.keySetIterator()
|
|
52
99
|
while (iterator.hasNextKey()) {
|
|
53
100
|
val key = iterator.nextKey()
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
101
|
+
val type = map.getType(key)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
when (type) {
|
|
105
|
+
ReadableType.Null ->
|
|
106
|
+
hashMap[key] = null
|
|
107
|
+
|
|
108
|
+
ReadableType.Boolean ->
|
|
109
|
+
hashMap[key] = map.getBoolean(key)
|
|
110
|
+
|
|
57
111
|
ReadableType.Number -> {
|
|
58
112
|
val value = map.getDouble(key)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
.toDouble()
|
|
67
|
-
) {
|
|
68
|
-
// This is a long
|
|
69
|
-
hashMap[key] = map.getDouble(key).toLong()
|
|
70
|
-
}
|
|
71
|
-
} else {
|
|
72
|
-
hashMap[key] = map.getDouble(key)
|
|
113
|
+
hashMap[key] = when {
|
|
114
|
+
value.isFinite() && value == value.toInt().toDouble() ->
|
|
115
|
+
value.toInt()
|
|
116
|
+
value.isFinite() && value == value.toLong().toDouble() ->
|
|
117
|
+
value.toLong()
|
|
118
|
+
else ->
|
|
119
|
+
value
|
|
73
120
|
}
|
|
74
121
|
}
|
|
75
122
|
|
|
76
|
-
ReadableType.String ->
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
123
|
+
ReadableType.String ->
|
|
124
|
+
hashMap[key] = map.getString(key)
|
|
125
|
+
|
|
126
|
+
ReadableType.Map ->
|
|
127
|
+
hashMap[key] = toHashMap(map.getMap(key))
|
|
128
|
+
|
|
129
|
+
ReadableType.Array ->
|
|
130
|
+
hashMap[key] = toArrayList(map.getArray(key))
|
|
131
|
+
|
|
132
|
+
else -> {
|
|
133
|
+
throw IllegalArgumentException("Could not convert object with key: $key.")
|
|
134
|
+
}
|
|
80
135
|
}
|
|
81
136
|
}
|
|
137
|
+
|
|
82
138
|
return hashMap
|
|
83
139
|
}
|
|
84
140
|
}
|
|
@@ -183,10 +183,6 @@ class DynatraceRNBridge(
|
|
|
183
183
|
impl.startView(name)
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
-
override fun stopView() {
|
|
187
|
-
impl.stopView()
|
|
188
|
-
}
|
|
189
|
-
|
|
190
186
|
override fun setGPSLocation(latitude: Double, longitude: Double, platform: String?) {
|
|
191
187
|
impl.setGPSLocation(latitude, longitude, platform)
|
|
192
188
|
}
|
|
@@ -230,4 +226,16 @@ class DynatraceRNBridge(
|
|
|
230
226
|
override fun removeListeners(count: Double) {
|
|
231
227
|
impl.removeListeners(count)
|
|
232
228
|
}
|
|
229
|
+
|
|
230
|
+
override fun getCurrentConfiguration(promise: Promise) {
|
|
231
|
+
impl.getCurrentConfiguration(promise)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
override fun startViewInternal(fields: ReadableMap) {
|
|
235
|
+
impl.startViewInternal(fields)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
override fun stopViewInternal() {
|
|
239
|
+
impl.stopViewInternal()
|
|
240
|
+
}
|
|
233
241
|
}
|
|
@@ -202,11 +202,6 @@ class DynatraceRNBridge(
|
|
|
202
202
|
impl.startView(name)
|
|
203
203
|
}
|
|
204
204
|
|
|
205
|
-
@ReactMethod
|
|
206
|
-
fun stopView() {
|
|
207
|
-
impl.stopView()
|
|
208
|
-
}
|
|
209
|
-
|
|
210
205
|
@ReactMethod
|
|
211
206
|
fun setGPSLocation(latitude: Double, longitude: Double, platform: String?) {
|
|
212
207
|
impl.setGPSLocation(latitude, longitude, platform)
|
|
@@ -261,4 +256,19 @@ class DynatraceRNBridge(
|
|
|
261
256
|
fun removeListeners(count: Double) {
|
|
262
257
|
impl.removeListeners(count)
|
|
263
258
|
}
|
|
259
|
+
|
|
260
|
+
@ReactMethod
|
|
261
|
+
fun getCurrentConfiguration(promise: Promise) {
|
|
262
|
+
impl.getCurrentConfiguration(promise)
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
@ReactMethod
|
|
266
|
+
fun startViewInternal(fields: ReadableMap) {
|
|
267
|
+
impl.startViewInternal(fields)
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
@ReactMethod
|
|
271
|
+
fun stopViewInternal() {
|
|
272
|
+
impl.stopViewInternal()
|
|
273
|
+
}
|
|
264
274
|
}
|
package/files/default.config.js
CHANGED
|
@@ -4,24 +4,14 @@ android.applicationVariants.all { variant ->
|
|
|
4
4
|
if (variant.buildType.name == "release") {
|
|
5
5
|
variant.mergeAssetsProvider.configure { task ->
|
|
6
6
|
task.doLast {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
workingDir rootDir
|
|
15
|
-
if (DefaultNativePlatform.currentOperatingSystem.isWindows()) {
|
|
16
|
-
// On windows, npx.cmd may not be a true binary executable and may need to be interpreted by a shell instead of executed direclty
|
|
17
|
-
commandLine 'cmd', '/c', 'npx', 'lineOffsetDynatrace', 'env=prod'
|
|
18
|
-
} else {
|
|
19
|
-
commandLine 'npx', 'lineOffsetDynatrace', 'env=prod'
|
|
20
|
-
}
|
|
7
|
+
exec {
|
|
8
|
+
workingDir rootDir
|
|
9
|
+
if (DefaultNativePlatform.currentOperatingSystem.isWindows()) {
|
|
10
|
+
// On windows, npx.cmd may not be a true binary executable and may need to be interpreted by a shell instead of executed direclty
|
|
11
|
+
commandLine 'cmd', '/c', 'npx', 'lineOffsetDynatrace'
|
|
12
|
+
} else {
|
|
13
|
+
commandLine 'npx', 'lineOffsetDynatrace'
|
|
21
14
|
}
|
|
22
|
-
|
|
23
|
-
} else {
|
|
24
|
-
println("❌ Source map not found")
|
|
25
15
|
}
|
|
26
16
|
}
|
|
27
17
|
}
|
package/files/plugin.gradle
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var o,n=require("@babel/runtime/helpers/interopRequireDefault"),e=n(require("@babel/runtime/helpers/toConsumableArray")),c=(Object.defineProperty(exports,"t",{value:!0}),exports.instrument=void 0,require("path")),u=require("jscodeshift"),i=require("jscodeshift/src/Collection"),r=require("../scripts/FileOperationHelper"),l=require("../scripts/PathsConstants"),f=require("../lib/core/util/GetValuesFromPackage"),t=require("../scripts/util/InstrumentUtil"),a=require("./libs/react-native/Touchables.InstrInfo"),s=require("./libs/react-native/RefreshControl.InstrInfo"),v=require("./libs/react-native/Switch.InstrInfo"),d=require("./libs/community/gesture-handler/Touchables.InstrInfo"),p=require("./libs/community/Picker.InstrInfo"),m=require("./model/Types"),y=require("./parser/ParserUtil"),g=((n=>{n[n.i=-1]="Filtered",n[n.u=0]="Normal",n[n.o=1]="ReactNative",n[n.l=2]="React",n[n.v=3]="ReactNativeCssInterop"})(o=o||{}),[]),q=(g.push.apply(g,(0,e.default)(a.instrumentationInfo)),g.push.apply(g,(0,e.default)(s.instrumentationInfo)),g.push.apply(g,(0,e.default)(v.instrumentationInfo)),g.push.apply(g,(0,e.default)(d.instrumentationInfo)),g.push.apply(g,(0,e.default)(p.instrumentationInfo)),["AppRegistry","AppRegistryImpl","renderApplication","ExceptionsManager"]),b="@dynatrace/react-native-plugin/instrumentation/libs",instrument=function(n,e,r){e=O(e);var t=z(e);if(t!==o.i){var i=!1,u=I(e,n);if(t===o.l)k(u),i=!0;else if(t===o.o)e.endsWith("AppRegistryImpl.js")?null!=r&&r.autoStart&&U(u)&&(i=!0):e.endsWith("AppRegistry.js")?null!=r&&r.autoStart&&w(u)&&(i=!0):e.endsWith("renderApplication.js")?(A(u),i=!0):e.endsWith("ExceptionsManager.js")&&(a=void 0!==r&&r.autoStart&&r.errorHandler.enabled,J(u,r.errorHandler.reportFatalErrorAsCrash,a),i=!0);else if(t===o.v)i=G(u)||i;else{var a=V(e,r);if(r.custom.reactnavigation&&T(e,u))i=!0;else{if(!a.input&&!a.lifecycle)return null!=r&&r.debug&&console.log("Dynatrace - Filtered All: ".concat(e)),h(e),n;a.lifecycle&&A(u)&&(i=!0),a.input&&g.forEach(function(n){n=X(u,n);u=n.root,i=i||n.p})}}i?(n=u.toSource({quote:"single"}),N(n,e)):h(e),null!=r&&r.debug&&i&&console.log("Dynatrace - Modified Filename: "+e)}else e.includes(c.join("@dynatrace","react-native-plugin"))&&e.endsWith(c.join("lib","core","configuration","ConfigurationPreset.js"))&&void 0!==r&&(t=(0,f.getHostAppBundleInfo)(l.default.getPackageJsonFile()),a=I(e,n),void 0!==r.lifecycle&&j(a,"getLifecycleUpdate",r.lifecycle.includeUpdate),void 0!==r.debug&&j(a,"getLogLevel",r.debug?0:1),void 0!==r.bundleName?j(a,"getBundleName",r.bundleName):null!==t&&j(a,"getBundleName",null==t?void 0:t.name),void 0!==r.bundleVersion?j(a,"getBundleVersion",r.bundleVersion):null!==t&&j(a,"getBundleVersion",null==t?void 0:t.version),void 0!==r.input&&void 0!==r.input.actionNamePrivacy&&j(a,"getActionNamePrivacy",r.input.actionNamePrivacy),void 0!==r.errorHandler&&(j(a,"isErrorHandlerEnabled",r.errorHandler.enabled),j(a,"isReportFatalErrorAsCrash",r.errorHandler.reportFatalErrorAsCrash)),r.autoStart&&j(a,"isAutoStartupEnabled",r.autoStart),n=a.toSource({quote:"single"}),N(n,e));return n},T=(exports.instrument=instrument,function(n,e){return!!B(n,e)&&(n="import { registerListener } from '".concat(b,"/react-navigation/ReactNavigation';"),e.find(u.ImportDeclaration).at(0).insertBefore(n),!0)}),B=function(n,e){var r=!1;return n.includes("react-navigation")&&n.includes("NavigationContainer.tsx")&&e.find(u.VariableDeclarator).forEach(function(n){r||null==n.value||null==n.value.id||"refContainer"!==n.value.id.name||null!=n.parent&&null!=n.parent.value&&null!=n.parent.value.type&&"VariableDeclaration"===n.parent.value.type&&(n.parent.insertAfter("registerListener(refContainer);"),r=!0)}),r},A=function(n){var e=n.findJSXElements(),t=!1;return 0<e.length&&(n.find(u.FunctionDeclaration).forEach(function(n){var e,r=(0,i.fromPaths)([n]);0<r.findJSXElements().length&&null!=n&&null!=n.value&&null!=n.value.id&&n.value.id.name.toString()&&(e=r.find(u.ClassDeclaration),r=r.find(u.ClassExpression),0===e.length)&&0===r.length&&(x(n,m.Types.FunctionalComponent,n.value.id.name.toString()),t=!0)}),n.find(u.ClassDeclaration).forEach(function(n){0<(0,i.fromPaths)([n]).findJSXElements().length&&null!=n&&null!=n.value&&n.value.id&&n.value.id.name.toString()&&(x(n,m.Types.ClassComponent,n.value.id.name.toString()),t=!0)}),n.find(u.ArrowFunctionExpression).forEach(function(n){0<(0,i.fromPaths)([n]).findJSXElements().length&&null!=n.parent&&null!=n.parent.value&&null!=n.parent.value.id&&null!=n.parent.value.id.name&&(x(n,m.Types.FunctionalComponent,n.parent.value.id.name),t=!0)})),t},x=function(n,e,r){for(e=u.expressionStatement(u.assignmentExpression("=",u.memberExpression(u.identifier(r),u.identifier("_dtInfo")),M(e,r)));"body"!==(null==n?void 0:n.parentPath.name);)n=n.parentPath;void 0!==n.parentPath&&n.insertAfter(e)},M=function(n,e){return u.objectExpression([u.objectProperty(u.identifier("type"),u.numericLiteral(n)),u.objectProperty(u.identifier("name"),u.stringLiteral(e))])},j=function(n,e,r){var n=n.find(u.Identifier).filter(function(n){return n.node.name===e});1===n.length&&"ReturnStatement"===(n=n.paths()[0].parent.value.body.body[0]).type&&("boolean"==typeof r&&(n.argument=u.booleanLiteral(r)),"string"==typeof r&&(n.argument=u.stringLiteral(r)),"number"==typeof r)&&(n.argument=u.numericLiteral(r))},I=function(n,e){return u.withParser((0,y.chooseParser)(n,e))(e)},O=function(n){return c.isAbsolute(n)?n.replace(l.default.getApplicationPath()+c.sep,""):n},h=function(n){try{var e=c.join(l.default.getBuildPath(),n+t.INSTRUMENTED_FILE_EXTENSION);r.default.checkIfFileExistsSync(e),r.default.deleteFileSync(e)}catch(n){}},N=function(n,e){e=c.join(l.default.getBuildPath(),e);try{r.default.checkIfFileExistsSync(c.dirname(e))}catch(n){r.default.createDirectorySync(c.dirname(e))}r.default.writeTextToFileSync(e+t.INSTRUMENTED_FILE_EXTENSION,n)},V=function(n,e){var r={input:!1,lifecycle:!1};return void 0!==e&&(void 0!==e.lifecycle&&void 0!==e.lifecycle.instrument&&e.lifecycle.instrument(n)&&(r.lifecycle=!0),void 0!==e.input)&&void 0!==e.input.instrument&&e.input.instrument(n)&&(r.input=!0),r},k=function(n){var e,n=n.find(u.Program);1===n.length&&(e=u.expressionStatement(u.callExpression(u.memberExpression(u.callExpression(u.identifier("require"),[u.stringLiteral("@dynatrace/react-native-plugin/instrumentation/jsx/ElementHelper")]),u.identifier("instrumentCreateElement")),[u.memberExpression(u.identifier("module"),u.identifier("exports"))])),n.paths()[0].node.body.push(e))},U=function(n){var e=n.find(u.FunctionDeclaration,{id:{name:"runApplication"}});return 1===e.length&&(_(n,{m:"_DynatraceApplicationHandler",module:"@dynatrace/react-native-plugin",reference:"ApplicationHandler"}),R(e.get().value.body.body,0,F("_DynatraceApplicationHandler","startup",[])),!0)},w=function(n){var e=n.find(u.ObjectMethod,{key:{name:"runApplication"}});return 1===e.length&&(_(n,{m:"_DynatraceApplicationHandler",module:"@dynatrace/react-native-plugin",reference:"ApplicationHandler"}),R(e.get().value.body.body,0,F("_DynatraceApplicationHandler","startup",[])),!0)},J=function(n,r,t){var i=u;n.find(i.FunctionDeclaration,{id:{name:"handleException"}}).forEach(function(n){var e=i.callExpression(i.memberExpression(i.callExpression(i.identifier("require"),[i.literal("@dynatrace/react-native-plugin/lib/core/ErrorHandler")]),i.identifier("reportErrorToDynatrace")),[i.identifier("e"),i.identifier("isFatal"),i.literal(r),i.literal(t)]),e=i.expressionStatement(i.callExpression(i.identifier("setTimeout"),[i.arrowFunctionExpression([],i.blockStatement(n.node.body.body)),e]));n.node.body.body=[e]})},G=function(n){var e=!1,n=n.find(u.CallExpression,{callee:{name:"require"}});return n.find(u.Literal,{value:"react/jsx-runtime"}).replaceWith(function(n){n=n.node;return n.value="@dynatrace/react-native-plugin/jsx-runtime",e=!0,n}),n.find(u.Literal,{value:"react/jsx-dev-runtime"}).replaceWith(function(n){n=n.node;return n.value="@dynatrace/react-native-plugin/jsx-dev-runtime",e=!0,n}),e},R=function(n,e){for(var r=arguments.length,t=new Array(2<r?r-2:0),i=2;i<r;i++)t[i-2]=arguments[i];return n.splice.apply(n,[e,0].concat(t))},z=function(n){if(n.includes("@dynatrace"))return o.i;var e=c.extname(n);if(".js"!==e&&".ts"!==e&&".tsx"!==e&&".jsx"!==e)return o.i;for(var r=c.parse(n),t=r.dir.split(c.sep),i=0;i<t.length;i++)if("node_modules"===t[i]){if("react-native"===t[i+1]||"create-react-class"===t[i+1]||"react-clone-referenced-element"===t[i+1])return q.includes(r.name)?o.o:o.i;if("react"===t[i+1]&&"index"===r.name)return o.l;if("react-native-css-interop"===t[i+1]&&("jsx-runtime"===r.name||"jsx-dev-runtime"===r.name))return o.v}return o.u},K=function(n,e,r){var t=Q(n,e,r);return W(n,e,r)||t},Q=function(n,e,r){var t=Y(n,e);return 0<t.length&&(void 0!==(t=H(t,e.reference,!1))&&(r.m=t.localName),tn(n,r),!0)},W=function(n,e,r){var t=E(n,e.module);if(1===t.length){t=H(t,e.reference,!0);if(void 0!==t)return un(n,r.defaultImport,t.localName,"ImportNamespaceSpecifier"===t.type),!0}return!1},X=function(n,e){var r=JSON.parse(JSON.stringify(e.new));return{root:n,p:K(n,e.old,r)||Z(n,e.old,e.new.defaultImport)}},Y=function(n,e){return n.find(u.ImportDeclaration).filter(function(n){return n.node.source.value===e.module&&null!=n.node.specifiers&&n.node.specifiers.some(function(n){return C(n)&&n.imported.name===e.reference||n.local&&n.local.name===e.reference})})},C=function(n){return void 0!==n.imported},Z=function(n,e,r){var t=!1;return n.find(u.CallExpression).filter(function(n){return $(n.node.callee)&&nn(n.node.arguments[0])&&n.node.arguments[0].value===e.module&&void 0!==n.parent}).forEach(function(n){(void 0===n.parent.value.property||void 0!==n.parent.value.property&&void 0!==n.parent.value.property.name&&n.parent.value.property.name===e.reference)&&(n.node.arguments[0].value=r,t=t||!0)}),t},$=function(n){return"require"===n.name},nn=function(n){return"StringLiteral"===n.type||"Literal"===n.type},E=function(n,e){return n.find(u.ImportDeclaration).filter(function(n){return n.node.source.value===e})},H=function(n,r,t){var i;return n.forEach(function(n){void 0!==n.node.specifiers&&(n.node.specifiers=n.node.specifiers.filter(function(n){var e;return C(n)&&!t?((e=n.imported.name!==r)||null==n.local||n.imported.name===n.local.name||(i={localName:n.local.name.toString(),type:n.type}),e):!(!C(n)&&t&&(null!=n.local&&(i={localName:n.local.name.toString(),type:n.type}),1))}),0===n.node.specifiers.length)&&n.prune()}),i},en=function(n,e){n.find(u.ImportDeclaration).filter(function(n){return n.node.source.value===e.module}).forEach(function(n){null!=n.node.specifiers&&n.node.specifiers.push(P(e))})},rn=function(n,e,r){n.find(u.ImportDeclaration).filter(function(n){return n.node.source.value===e}).forEach(function(n){null!=n.node.specifiers&&n.node.specifiers.push(r)})},D=function(n,e,r){var t=n.find(u.ImportDeclaration);0<t.length?u(t.paths()[0]).insertAfter(S(e,r)):1===(t=n.find(u.Program)).length&&t.paths()[0].node.body.unshift(S(e,r))},tn=function(n,e){0<E(n,e.module).length?en(n,e):D(n,e.module,[P(e)])},un=function(n,e,r,t){var i=E(n,e),t=(t?vn:sn)(r);0<i.length?rn(n,e,t):D(n,e,[t])},_=function(n,e){n=n.find(u.VariableDeclaration);0<n.length&&u(n.paths()[0]).insertAfter(on(e))},F=function(n,e,r){return u.expressionStatement(an(n,e,r))},an=function(n,e,r){return u.callExpression(fn(n,e),r)},on=function(n){return u.variableDeclaration("var",[cn(n)])},cn=function(n){return u.variableDeclarator(void 0!==n.m?u.identifier(n.m):u.identifier(n.reference),(0<n.reference.length?ln:L)(n))},ln=function(n){return u.memberExpression(L(n),u.identifier(n.reference))},fn=function(n,e){return u.memberExpression(u.identifier(n),u.identifier(e))},L=function(n){return u.callExpression(u.identifier("require"),[u.literal(n.module)])},S=function(n,e){return u.importDeclaration(e,u.literal(n))},P=function(n){return void 0!==n.m?u.importSpecifier(u.identifier(n.reference),u.identifier(n.m)):u.importSpecifier(u.identifier(n.reference))},sn=function(n){return u.importDefaultSpecifier(u.identifier(n))},vn=function(n){return u.importNamespaceSpecifier(u.identifier(n))};
|
|
1
|
+
var a,n=require("@babel/runtime/helpers/interopRequireDefault"),e=n(require("@babel/runtime/helpers/toConsumableArray")),c=(Object.defineProperty(exports,"t",{value:!0}),exports.instrument=void 0,require("path")),u=require("jscodeshift"),i=require("jscodeshift/src/Collection"),r=require("../scripts/FileOperationHelper"),l=require("../scripts/PathsConstants"),f=require("../lib/core/util/GetValuesFromPackage"),t=require("../scripts/util/InstrumentUtil"),o=require("./libs/react-native/Touchables.InstrInfo"),s=require("./libs/react-native/RefreshControl.InstrInfo"),v=require("./libs/react-native/Switch.InstrInfo"),d=require("./libs/community/gesture-handler/Touchables.InstrInfo"),p=require("./libs/community/Picker.InstrInfo"),m=require("./model/Types"),g=require("./parser/ParserUtil"),y=((n=>{n[n.i=-1]="Filtered",n[n.u=0]="Normal",n[n.o=1]="ReactNative",n[n.l=2]="React",n[n.v=3]="ReactNativeCssInterop"})(a=a||{}),[]),q=(y.push.apply(y,(0,e.default)(o.instrumentationInfo)),y.push.apply(y,(0,e.default)(s.instrumentationInfo)),y.push.apply(y,(0,e.default)(v.instrumentationInfo)),y.push.apply(y,(0,e.default)(d.instrumentationInfo)),y.push.apply(y,(0,e.default)(p.instrumentationInfo)),["AppRegistry","AppRegistryImpl","renderApplication","ExceptionsManager"]),b="@dynatrace/react-native-plugin/instrumentation/libs",instrument=function(n,e,r){e=O(e);var t=z(e);if(t!==a.i){var i=!1,u=N(e,n);if(t===a.l)U(u),i=!0;else if(t===a.o)e.endsWith("AppRegistryImpl.js")?null!=r&&r.autoStart&&V(u)&&(i=!0):e.endsWith("AppRegistry.js")?null!=r&&r.autoStart&&w(u)&&(i=!0):e.endsWith("renderApplication.js")?(A(u),i=!0):e.endsWith("ExceptionsManager.js")&&(o=void 0!==r&&r.autoStart&&r.errorHandler.enabled,J(u,r.errorHandler.reportFatalErrorAsCrash,o),i=!0);else if(t===a.v)i=G(u)||i;else{var o=k(e,r);if(r.navigation.enabled&&L(e,u))i=!0;else{if(!o.input&&!o.lifecycle)return null!=r&&r.debug&&console.log("Dynatrace - Filtered All: ".concat(e)),I(e),n;o.lifecycle&&A(u)&&(i=!0),o.input&&y.forEach(function(n){n=X(u,n);u=n.root,i=i||n.p})}}i?(n=u.toSource({quote:"single"}),h(n,e)):I(e),null!=r&&r.debug&&i&&console.log("Dynatrace - Modified Filename: "+e)}else e.includes(c.join("@dynatrace","react-native-plugin"))&&e.endsWith(c.join("lib","core","configuration","ConfigurationPreset.js"))&&void 0!==r&&(t=(0,f.getHostAppBundleInfo)(l.default.getPackageJsonFile()),o=N(e,n),void 0!==r.lifecycle&&x(o,"getLifecycleUpdate",r.lifecycle.includeUpdate),void 0!==r.debug&&x(o,"getLogLevel",r.debug?0:1),void 0!==r.bundleName?x(o,"getBundleName",r.bundleName):null!==t&&x(o,"getBundleName",null==t?void 0:t.name),void 0!==r.bundleVersion?x(o,"getBundleVersion",r.bundleVersion):null!==t&&x(o,"getBundleVersion",null==t?void 0:t.version),void 0!==r.input&&void 0!==r.input.actionNamePrivacy&&x(o,"getActionNamePrivacy",r.input.actionNamePrivacy),void 0!==r.errorHandler&&(x(o,"isErrorHandlerEnabled",r.errorHandler.enabled),x(o,"isReportFatalErrorAsCrash",r.errorHandler.reportFatalErrorAsCrash)),r.autoStart&&x(o,"isAutoStartupEnabled",r.autoStart),n=o.toSource({quote:"single"}),h(n,e));return n},L=(exports.instrument=instrument,function(n,e){return!!T(n,e)&&(n="import { monitorNavigation } from '".concat(b,"/react-navigation/ReactNavigation';"),e.find(u.ImportDeclaration).at(0).insertBefore(n),!0)}),T=function(n,e){var r=!1;return n.includes("@react-navigation")&&n.includes("core")&&(n.includes("BaseNavigationContainer.js")||n.includes("BaseNavigationContainer.tsx"))&&e.find(u.VariableDeclarator,{id:{name:"getRootState"}}).forEach(function(n){r=!0,n.parent.insertAfter("monitorNavigation(getRootState);")}),r},A=function(n){var e=n.findJSXElements(),t=!1;return 0<e.length&&(n.find(u.FunctionDeclaration).forEach(function(n){var e,r=(0,i.fromPaths)([n]);0<r.findJSXElements().length&&null!=n&&null!=n.value&&null!=n.value.id&&n.value.id.name.toString()&&(e=r.find(u.ClassDeclaration),r=r.find(u.ClassExpression),0===e.length)&&0===r.length&&(j(n,m.Types.FunctionalComponent,n.value.id.name.toString()),t=!0)}),n.find(u.ClassDeclaration).forEach(function(n){0<(0,i.fromPaths)([n]).findJSXElements().length&&null!=n&&null!=n.value&&n.value.id&&n.value.id.name.toString()&&(j(n,m.Types.ClassComponent,n.value.id.name.toString()),t=!0)}),n.find(u.ArrowFunctionExpression).forEach(function(n){0<(0,i.fromPaths)([n]).findJSXElements().length&&null!=n.parent&&null!=n.parent.value&&null!=n.parent.value.id&&null!=n.parent.value.id.name&&(j(n,m.Types.FunctionalComponent,n.parent.value.id.name),t=!0)})),t},j=function(n,e,r){for(e=u.expressionStatement(u.assignmentExpression("=",u.memberExpression(u.identifier(r),u.identifier("_dtInfo")),M(e,r)));"body"!==(null==n?void 0:n.parentPath.name);)n=n.parentPath;void 0!==n.parentPath&&n.insertAfter(e)},M=function(n,e){return u.objectExpression([u.objectProperty(u.identifier("type"),u.numericLiteral(n)),u.objectProperty(u.identifier("name"),u.stringLiteral(e))])},x=function(n,e,r){var n=n.find(u.Identifier).filter(function(n){return n.node.name===e});1===n.length&&"ReturnStatement"===(n=n.paths()[0].parent.value.body.body[0]).type&&("boolean"==typeof r&&(n.argument=u.booleanLiteral(r)),"string"==typeof r&&(n.argument=u.stringLiteral(r)),"number"==typeof r)&&(n.argument=u.numericLiteral(r))},N=function(n,e){return u.withParser((0,g.chooseParser)(n,e))(e)},O=function(n){return c.isAbsolute(n)?n.replace(l.default.getApplicationPath()+c.sep,""):n},I=function(n){try{var e=c.join(l.default.getBuildPath(),n+t.INSTRUMENTED_FILE_EXTENSION);r.default.checkIfFileExistsSync(e),r.default.deleteFileSync(e)}catch(n){}},h=function(n,e){e=c.join(l.default.getBuildPath(),e);try{r.default.checkIfFileExistsSync(c.dirname(e))}catch(n){r.default.createDirectorySync(c.dirname(e))}r.default.writeTextToFileSync(e+t.INSTRUMENTED_FILE_EXTENSION,n)},k=function(n,e){var r={input:!1,lifecycle:!1};return void 0!==e&&(void 0!==e.lifecycle&&void 0!==e.lifecycle.instrument&&e.lifecycle.instrument(n)&&(r.lifecycle=!0),void 0!==e.input)&&void 0!==e.input.instrument&&e.input.instrument(n)&&(r.input=!0),r},U=function(n){var e,n=n.find(u.Program);1===n.length&&(e=u.expressionStatement(u.callExpression(u.memberExpression(u.callExpression(u.identifier("require"),[u.stringLiteral("@dynatrace/react-native-plugin/instrumentation/jsx/ElementHelper")]),u.identifier("instrumentCreateElement")),[u.memberExpression(u.identifier("module"),u.identifier("exports"))])),n.paths()[0].node.body.push(e))},V=function(n){var e=n.find(u.FunctionDeclaration,{id:{name:"runApplication"}});return 1===e.length&&(D(n,{m:"_DynatraceApplicationHandler",module:"@dynatrace/react-native-plugin",reference:"ApplicationHandler"}),R(e.get().value.body.body,0,_("_DynatraceApplicationHandler","startup",[])),!0)},w=function(n){var e=n.find(u.ObjectMethod,{key:{name:"runApplication"}});return 1===e.length&&(D(n,{m:"_DynatraceApplicationHandler",module:"@dynatrace/react-native-plugin",reference:"ApplicationHandler"}),R(e.get().value.body.body,0,_("_DynatraceApplicationHandler","startup",[])),!0)},J=function(n,r,t){var i=u;n.find(i.FunctionDeclaration,{id:{name:"handleException"}}).forEach(function(n){var e=i.callExpression(i.memberExpression(i.callExpression(i.identifier("require"),[i.literal("@dynatrace/react-native-plugin/lib/core/ErrorHandler")]),i.identifier("reportErrorToDynatrace")),[i.identifier("e"),i.identifier("isFatal"),i.literal(r),i.literal(t)]),e=i.expressionStatement(i.callExpression(i.identifier("setTimeout"),[i.arrowFunctionExpression([],i.blockStatement(n.node.body.body)),e]));n.node.body.body=[e]})},G=function(n){var e=!1,n=n.find(u.CallExpression,{callee:{name:"require"}});return n.find(u.Literal,{value:"react/jsx-runtime"}).replaceWith(function(n){n=n.node;return n.value="@dynatrace/react-native-plugin/jsx-runtime",e=!0,n}),n.find(u.Literal,{value:"react/jsx-dev-runtime"}).replaceWith(function(n){n=n.node;return n.value="@dynatrace/react-native-plugin/jsx-dev-runtime",e=!0,n}),e},R=function(n,e){for(var r=arguments.length,t=new Array(2<r?r-2:0),i=2;i<r;i++)t[i-2]=arguments[i];return n.splice.apply(n,[e,0].concat(t))},z=function(n){if(n.includes("@dynatrace"))return a.i;var e=c.extname(n);if(".js"!==e&&".ts"!==e&&".tsx"!==e&&".jsx"!==e)return a.i;for(var r=c.parse(n),t=r.dir.split(c.sep),i=0;i<t.length;i++)if("node_modules"===t[i]){if("react-native"===t[i+1]||"create-react-class"===t[i+1]||"react-clone-referenced-element"===t[i+1])return q.includes(r.name)?a.o:a.i;if("react"===t[i+1]&&"index"===r.name)return a.l;if("react-native-css-interop"===t[i+1]&&("jsx-runtime"===r.name||"jsx-dev-runtime"===r.name))return a.v}return a.u},K=function(n,e,r){var t=Q(n,e,r);return W(n,e,r)||t},Q=function(n,e,r){var t=Y(n,e);return 0<t.length&&(void 0!==(t=H(t,e.reference,!1))&&(r.m=t.localName),tn(n,r),!0)},W=function(n,e,r){var t=C(n,e.module);if(1===t.length){t=H(t,e.reference,!0);if(void 0!==t)return un(n,r.defaultImport,t.localName,"ImportNamespaceSpecifier"===t.type),!0}return!1},X=function(n,e){var r=JSON.parse(JSON.stringify(e.new));return{root:n,p:K(n,e.old,r)||Z(n,e.old,e.new.defaultImport)}},Y=function(n,e){return n.find(u.ImportDeclaration).filter(function(n){return n.node.source.value===e.module&&null!=n.node.specifiers&&n.node.specifiers.some(function(n){return E(n)&&n.imported.name===e.reference||n.local&&n.local.name===e.reference})})},E=function(n){return void 0!==n.imported},Z=function(n,e,r){var t=!1;return n.find(u.CallExpression).filter(function(n){return $(n.node.callee)&&nn(n.node.arguments[0])&&n.node.arguments[0].value===e.module&&void 0!==n.parent}).forEach(function(n){(void 0===n.parent.value.property||void 0!==n.parent.value.property&&void 0!==n.parent.value.property.name&&n.parent.value.property.name===e.reference)&&(n.node.arguments[0].value=r,t=t||!0)}),t},$=function(n){return"require"===n.name},nn=function(n){return"StringLiteral"===n.type||"Literal"===n.type},C=function(n,e){return n.find(u.ImportDeclaration).filter(function(n){return n.node.source.value===e})},H=function(n,r,t){var i;return n.forEach(function(n){void 0!==n.node.specifiers&&(n.node.specifiers=n.node.specifiers.filter(function(n){var e;return E(n)&&!t?((e=n.imported.name!==r)||null==n.local||n.imported.name===n.local.name||(i={localName:n.local.name.toString(),type:n.type}),e):!(!E(n)&&t&&(null!=n.local&&(i={localName:n.local.name.toString(),type:n.type}),1))}),0===n.node.specifiers.length)&&n.prune()}),i},en=function(n,e){n.find(u.ImportDeclaration).filter(function(n){return n.node.source.value===e.module}).forEach(function(n){null!=n.node.specifiers&&n.node.specifiers.push(P(e))})},rn=function(n,e,r){n.find(u.ImportDeclaration).filter(function(n){return n.node.source.value===e}).forEach(function(n){null!=n.node.specifiers&&n.node.specifiers.push(r)})},S=function(n,e,r){var t=n.find(u.ImportDeclaration);0<t.length?u(t.paths()[0]).insertAfter(B(e,r)):1===(t=n.find(u.Program)).length&&t.paths()[0].node.body.unshift(B(e,r))},tn=function(n,e){0<C(n,e.module).length?en(n,e):S(n,e.module,[P(e)])},un=function(n,e,r,t){var i=C(n,e),t=(t?vn:sn)(r);0<i.length?rn(n,e,t):S(n,e,[t])},D=function(n,e){n=n.find(u.VariableDeclaration);0<n.length&&u(n.paths()[0]).insertAfter(an(e))},_=function(n,e,r){return u.expressionStatement(on(n,e,r))},on=function(n,e,r){return u.callExpression(fn(n,e),r)},an=function(n){return u.variableDeclaration("var",[cn(n)])},cn=function(n){return u.variableDeclarator(void 0!==n.m?u.identifier(n.m):u.identifier(n.reference),(0<n.reference.length?ln:F)(n))},ln=function(n){return u.memberExpression(F(n),u.identifier(n.reference))},fn=function(n,e){return u.memberExpression(u.identifier(n),u.identifier(e))},F=function(n){return u.callExpression(u.identifier("require"),[u.literal(n.module)])},B=function(n,e){return u.importDeclaration(e,u.literal(n))},P=function(n){return void 0!==n.m?u.importSpecifier(u.identifier(n.reference),u.identifier(n.m)):u.importSpecifier(u.identifier(n.reference))},sn=function(n){return u.importDefaultSpecifier(u.identifier(n))},vn=function(n){return u.importNamespaceSpecifier(u.identifier(n))};
|
|
@@ -7,6 +7,15 @@ exports.Button = (0, withOnPressMonitoring_1.withOnPressMonitoring)(ReactNative.
|
|
|
7
7
|
exports.TouchableOpacity = (0, withOnPressMonitoring_1.withOnPressMonitoring)(ReactNative.TouchableOpacity, 'Touchable');
|
|
8
8
|
exports.TouchableHighlight = (0, withOnPressMonitoring_1.withOnPressMonitoring)(ReactNative.TouchableHighlight, 'Touchable');
|
|
9
9
|
exports.TouchableNativeFeedback = (0, withOnPressMonitoring_1.withOnPressMonitoring)(ReactNative.TouchableNativeFeedback, 'Touchable');
|
|
10
|
+
[
|
|
11
|
+
'Ripple',
|
|
12
|
+
'SelectableBackground',
|
|
13
|
+
'SelectableBackgroundBorderless',
|
|
14
|
+
'canUseNativeForeground',
|
|
15
|
+
].forEach((prop) => {
|
|
16
|
+
exports.TouchableNativeFeedback[prop] =
|
|
17
|
+
ReactNative.TouchableNativeFeedback[prop];
|
|
18
|
+
});
|
|
10
19
|
exports.TouchableWithoutFeedback = (0, withOnPressMonitoring_1.withOnPressMonitoring)(ReactNative.TouchableWithoutFeedback, 'Touchable');
|
|
11
20
|
exports.Text = (0, withOnPressMonitoring_1.withOnPressMonitoring)(ReactNative.Text, 'Text');
|
|
12
21
|
exports.Pressable = (0, withOnPressMonitoring_1.withOnPressMonitoring)(ReactNative.Pressable, 'Pressable');
|
|
@@ -1,27 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.monitorNavigation = void 0;
|
|
4
4
|
const react_1 = require("react");
|
|
5
|
+
const react_native_1 = require("react-native");
|
|
5
6
|
const ConsoleLogger_1 = require("../../../lib/core/logging/ConsoleLogger");
|
|
6
|
-
|
|
7
|
+
const DynatraceBridge_1 = require("../../../lib/core/DynatraceBridge");
|
|
8
|
+
const BaseDataEventModifier_1 = require("../../../lib/next/events/modifier/BaseDataEventModifier");
|
|
7
9
|
const logger = new ConsoleLogger_1.ConsoleLogger('ReactNavigation');
|
|
8
|
-
|
|
10
|
+
let activePath = '';
|
|
11
|
+
let appState = react_native_1.AppState.currentState;
|
|
12
|
+
const monitorNavigation = (getRootState) => {
|
|
9
13
|
(0, react_1.useEffect)(() => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
14
|
+
var _a, _b;
|
|
15
|
+
let currentState = getRootState();
|
|
16
|
+
let newPath = '';
|
|
17
|
+
while (currentState === null || currentState === void 0 ? void 0 : currentState.routes[(_a = currentState.index) !== null && _a !== void 0 ? _a : 0]) {
|
|
18
|
+
const currentRoute = currentState === null || currentState === void 0 ? void 0 : currentState.routes[(_b = currentState.index) !== null && _b !== void 0 ? _b : 0];
|
|
19
|
+
newPath += `/${currentRoute.name}`;
|
|
20
|
+
currentState = currentRoute.state;
|
|
21
|
+
}
|
|
22
|
+
if (newPath !== activePath) {
|
|
23
|
+
if (activePath !== '') {
|
|
24
|
+
stopView();
|
|
25
|
+
}
|
|
26
|
+
startView(newPath);
|
|
27
|
+
activePath = newPath;
|
|
24
28
|
}
|
|
25
29
|
});
|
|
30
|
+
(0, react_1.useEffect)(() => {
|
|
31
|
+
const subscription = react_native_1.AppState.addEventListener('change', (nextAppState) => {
|
|
32
|
+
if (nextAppState !== 'active' && appState === 'active') {
|
|
33
|
+
stopView();
|
|
34
|
+
}
|
|
35
|
+
else if (nextAppState === 'active' && appState !== 'active') {
|
|
36
|
+
startView(activePath);
|
|
37
|
+
}
|
|
38
|
+
appState = nextAppState;
|
|
39
|
+
});
|
|
40
|
+
return () => {
|
|
41
|
+
subscription.remove();
|
|
42
|
+
};
|
|
43
|
+
}, []);
|
|
44
|
+
};
|
|
45
|
+
exports.monitorNavigation = monitorNavigation;
|
|
46
|
+
const startView = (newPath) => {
|
|
47
|
+
const startViewInternalEvent = new BaseDataEventModifier_1.BaseDataEventModifier().modifyEvent(Object.assign({ 'view.detected_name': newPath }, (activePath && {
|
|
48
|
+
'view.source.detected_name': activePath,
|
|
49
|
+
})));
|
|
50
|
+
const fn = DynatraceBridge_1.DynatraceNative === null || DynatraceBridge_1.DynatraceNative === void 0 ? void 0 : DynatraceBridge_1.DynatraceNative.startViewInternal;
|
|
51
|
+
if (typeof fn === 'function') {
|
|
52
|
+
fn(startViewInternalEvent);
|
|
53
|
+
}
|
|
54
|
+
logger.debug(`startViewinternal(${JSON.stringify(startViewInternalEvent)})`);
|
|
55
|
+
};
|
|
56
|
+
const stopView = () => {
|
|
57
|
+
const fn = DynatraceBridge_1.DynatraceNative === null || DynatraceBridge_1.DynatraceNative === void 0 ? void 0 : DynatraceBridge_1.DynatraceNative.stopViewInternal;
|
|
58
|
+
if (typeof fn === 'function') {
|
|
59
|
+
fn();
|
|
60
|
+
}
|
|
61
|
+
logger.debug('stopViewInternal()');
|
|
26
62
|
};
|
|
27
|
-
exports.registerListener = registerListener;
|