@dashx/react-native 1.5.0 → 1.5.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 +1 -1
- package/ios/DashXReactNative.mm +7 -7
- package/ios/DashXReactNative.swift +15 -11
- package/package.json +13 -11
- package/.claude/settings.local.json +0 -7
- package/.claude/worktrees/autocapture-conventions-review-78f665/.gitattributes +0 -1
- package/.claude/worktrees/autocapture-conventions-review-78f665/.github/workflows/ci.yml +0 -67
- package/.claude/worktrees/autocapture-conventions-review-78f665/.gitignore +0 -49
- package/.claude/worktrees/autocapture-conventions-review-78f665/.nvmrc +0 -1
- package/.claude/worktrees/autocapture-conventions-review-78f665/CHANGELOG.md +0 -144
- package/.claude/worktrees/autocapture-conventions-review-78f665/CONTRIBUTING.md +0 -190
- package/.claude/worktrees/autocapture-conventions-review-78f665/DashXReactNative.podspec +0 -38
- package/.claude/worktrees/autocapture-conventions-review-78f665/LICENSE +0 -21
- package/.claude/worktrees/autocapture-conventions-review-78f665/README.md +0 -97
- package/.claude/worktrees/autocapture-conventions-review-78f665/__tests__/fallback.test.js +0 -72
- package/.claude/worktrees/autocapture-conventions-review-78f665/__tests__/index.test.js +0 -702
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gitignore +0 -10
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/8.14.3/checksums/checksums.lock +0 -0
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/8.14.3/fileChanges/last-build.bin +0 -0
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/8.14.3/fileHashes/fileHashes.lock +0 -0
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/8.14.3/gc.properties +0 -0
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/buildOutputCleanup/cache.properties +0 -2
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/vcs-1/gc.properties +0 -0
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/build/reports/problems/problems-report.html +0 -663
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/build.gradle +0 -121
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/gradle/wrapper/gradle-wrapper.properties +0 -6
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/gradle.properties +0 -1
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/gradlew +0 -185
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/gradlew.bat +0 -89
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/settings.gradle +0 -27
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/AndroidManifest.xml +0 -19
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/DashXNotificationClickedListener.kt +0 -113
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/DashXReactNativeFirebaseMessagingService.kt +0 -72
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/DashXReactNativeModuleImpl.kt +0 -445
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/MessageReceivedEventHolder.kt +0 -14
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/ReactNativeLibraryInfoProvider.kt +0 -8
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/util/Utils.kt +0 -208
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/resources/META-INF/services/com.dashx.android.DashXLibraryInfoProvider +0 -1
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/newarch/java/com/dashx/rn/sdk/DashXReactNativeModule.kt +0 -85
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/newarch/java/com/dashx/rn/sdk/DashXReactNativePackage.kt +0 -33
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/oldarch/java/com/dashx/rn/sdk/DashXReactNativeModule.kt +0 -106
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/oldarch/java/com/dashx/rn/sdk/DashXReactNativePackage.kt +0 -33
- package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/test/java/com/dashx/rn/sdk/util/UtilsTest.kt +0 -305
- package/.claude/worktrees/autocapture-conventions-review-78f665/babel.config.js +0 -3
- package/.claude/worktrees/autocapture-conventions-review-78f665/index.d.ts +0 -321
- package/.claude/worktrees/autocapture-conventions-review-78f665/index.js +0 -300
- package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXEventEmitter.swift +0 -15
- package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXNotificationHandler.swift +0 -301
- package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative-Bridging-Header.h +0 -3
- package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative.mm +0 -77
- package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative.swift +0 -244
- package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative.xcodeproj/project.pbxproj +0 -280
- package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative.xcworkspace/contents.xcworkspacedata +0 -7
- package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/.claude/worktrees/autocapture-conventions-review-78f665/package.json +0 -123
- package/.claude/worktrees/autocapture-conventions-review-78f665/scripts/generate-bridge-shim.js +0 -259
- package/.claude/worktrees/autocapture-conventions-review-78f665/src/NativeDashXReactNative.ts +0 -42
- package/.claude/worktrees/autocapture-conventions-review-78f665/yarn.lock +0 -6244
- package/.gitattributes +0 -1
- package/.github/workflows/ci.yml +0 -67
- package/.gitignore +0 -49
- package/.nvmrc +0 -1
- package/CHANGELOG.md +0 -144
- package/CONTRIBUTING.md +0 -190
- package/__tests__/fallback.test.js +0 -72
- package/__tests__/index.test.js +0 -702
- package/android/.gitignore +0 -10
- package/android/.gradle/8.14.3/checksums/checksums.lock +0 -0
- package/android/.gradle/8.14.3/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.14.3/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.14.3/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/build/reports/problems/problems-report.html +0 -663
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
- package/android/gradlew +0 -185
- package/android/gradlew.bat +0 -89
- package/android/src/test/java/com/dashx/rn/sdk/util/UtilsTest.kt +0 -305
- package/babel.config.js +0 -3
- package/scripts/generate-bridge-shim.js +0 -259
- package/yarn.lock +0 -6244
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
package com.dashx.rn.sdk
|
|
2
|
-
|
|
3
|
-
import com.facebook.react.bridge.Promise
|
|
4
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
-
import com.facebook.react.bridge.ReadableMap
|
|
6
|
-
|
|
7
|
-
class DashXReactNativeModule(reactContext: ReactApplicationContext) :
|
|
8
|
-
NativeDashXReactNativeSpec(reactContext) {
|
|
9
|
-
|
|
10
|
-
private val impl = DashXReactNativeModuleImpl(reactContext)
|
|
11
|
-
|
|
12
|
-
override fun getName(): String = DashXReactNativeModuleImpl.NAME
|
|
13
|
-
|
|
14
|
-
override fun initialize() {
|
|
15
|
-
super.initialize()
|
|
16
|
-
impl.initialize()
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
override fun invalidate() {
|
|
20
|
-
impl.invalidate()
|
|
21
|
-
super.invalidate()
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
override fun configure(options: ReadableMap) = impl.configure(options)
|
|
25
|
-
|
|
26
|
-
override fun identify(options: ReadableMap?) = impl.identify(options)
|
|
27
|
-
|
|
28
|
-
override fun setIdentity(uid: String?, token: String?) = impl.setIdentity(uid, token)
|
|
29
|
-
|
|
30
|
-
override fun reset() = impl.reset()
|
|
31
|
-
|
|
32
|
-
override fun track(event: String, data: ReadableMap?) = impl.track(event, data)
|
|
33
|
-
|
|
34
|
-
override fun screen(screenName: String, data: ReadableMap?) = impl.screen(screenName, data)
|
|
35
|
-
|
|
36
|
-
override fun fetchRecord(urn: String, options: ReadableMap?, promise: Promise) =
|
|
37
|
-
impl.fetchRecord(urn, options, promise)
|
|
38
|
-
|
|
39
|
-
override fun searchRecords(resource: String, options: ReadableMap?, promise: Promise) =
|
|
40
|
-
impl.searchRecords(resource, options, promise)
|
|
41
|
-
|
|
42
|
-
override fun fetchStoredPreferences(promise: Promise) = impl.fetchStoredPreferences(promise)
|
|
43
|
-
|
|
44
|
-
override fun saveStoredPreferences(preferenceData: ReadableMap?, promise: Promise) =
|
|
45
|
-
impl.saveStoredPreferences(preferenceData, promise)
|
|
46
|
-
|
|
47
|
-
override fun subscribe() = impl.subscribe()
|
|
48
|
-
|
|
49
|
-
override fun unsubscribe(promise: Promise) = impl.unsubscribe(promise)
|
|
50
|
-
|
|
51
|
-
override fun setLogLevel(level: Double) = impl.setLogLevel(level)
|
|
52
|
-
|
|
53
|
-
override fun enableLifecycleTracking() = impl.enableLifecycleTracking()
|
|
54
|
-
|
|
55
|
-
override fun enableAdTracking() = impl.enableAdTracking()
|
|
56
|
-
|
|
57
|
-
override fun processURL(url: String, source: String?, forwardToLinkHandler: Boolean) =
|
|
58
|
-
impl.processURL(url, source, forwardToLinkHandler)
|
|
59
|
-
|
|
60
|
-
override fun trackNotificationNavigation(action: ReadableMap?, notificationId: String?) =
|
|
61
|
-
impl.trackNotificationNavigation(action, notificationId)
|
|
62
|
-
|
|
63
|
-
override fun uploadAsset(
|
|
64
|
-
filePath: String,
|
|
65
|
-
resource: String,
|
|
66
|
-
attribute: String,
|
|
67
|
-
promise: Promise
|
|
68
|
-
) = impl.uploadAsset(filePath, resource, attribute, promise)
|
|
69
|
-
|
|
70
|
-
override fun fetchAsset(assetId: String, promise: Promise) = impl.fetchAsset(assetId, promise)
|
|
71
|
-
|
|
72
|
-
override fun requestNotificationPermission(fallbackToSettings: Boolean, promise: Promise) =
|
|
73
|
-
impl.requestNotificationPermission(fallbackToSettings, promise)
|
|
74
|
-
|
|
75
|
-
override fun getNotificationPermissionStatus(promise: Promise) =
|
|
76
|
-
impl.getNotificationPermissionStatus(promise)
|
|
77
|
-
|
|
78
|
-
override fun addListener(eventName: String) {
|
|
79
|
-
// Required for RN built-in Event Emitter Calls
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
override fun removeListeners(count: Double) {
|
|
83
|
-
// Required for RN built-in Event Emitter Calls
|
|
84
|
-
}
|
|
85
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
package com.dashx.rn.sdk
|
|
2
|
-
|
|
3
|
-
import com.facebook.react.BaseReactPackage
|
|
4
|
-
import com.facebook.react.bridge.NativeModule
|
|
5
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
-
import com.facebook.react.module.model.ReactModuleInfo
|
|
7
|
-
import com.facebook.react.module.model.ReactModuleInfoProvider
|
|
8
|
-
|
|
9
|
-
class DashXReactNativePackage : BaseReactPackage() {
|
|
10
|
-
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
|
|
11
|
-
return if (name == DashXReactNativeModuleImpl.NAME) {
|
|
12
|
-
DashXReactNativeModule(reactContext)
|
|
13
|
-
} else {
|
|
14
|
-
null
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
|
|
19
|
-
return ReactModuleInfoProvider {
|
|
20
|
-
mapOf(
|
|
21
|
-
DashXReactNativeModuleImpl.NAME to ReactModuleInfo(
|
|
22
|
-
DashXReactNativeModuleImpl.NAME,
|
|
23
|
-
DashXReactNativeModuleImpl.NAME,
|
|
24
|
-
false, // canOverrideExistingModule
|
|
25
|
-
false, // needsEagerInit
|
|
26
|
-
false, // hasConstants
|
|
27
|
-
false, // isCxxModule
|
|
28
|
-
true // isTurboModule
|
|
29
|
-
)
|
|
30
|
-
)
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
package com.dashx.rn.sdk
|
|
2
|
-
|
|
3
|
-
import com.facebook.react.bridge.Promise
|
|
4
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
-
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
6
|
-
import com.facebook.react.bridge.ReactMethod
|
|
7
|
-
import com.facebook.react.bridge.ReadableMap
|
|
8
|
-
|
|
9
|
-
class DashXReactNativeModule(reactContext: ReactApplicationContext) :
|
|
10
|
-
ReactContextBaseJavaModule(reactContext) {
|
|
11
|
-
|
|
12
|
-
private val impl = DashXReactNativeModuleImpl(reactContext)
|
|
13
|
-
|
|
14
|
-
override fun getName(): String = DashXReactNativeModuleImpl.NAME
|
|
15
|
-
|
|
16
|
-
override fun initialize() {
|
|
17
|
-
super.initialize()
|
|
18
|
-
impl.initialize()
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
override fun invalidate() {
|
|
22
|
-
impl.invalidate()
|
|
23
|
-
super.invalidate()
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
@ReactMethod
|
|
27
|
-
fun configure(options: ReadableMap) = impl.configure(options)
|
|
28
|
-
|
|
29
|
-
@ReactMethod
|
|
30
|
-
fun identify(options: ReadableMap?) = impl.identify(options)
|
|
31
|
-
|
|
32
|
-
@ReactMethod
|
|
33
|
-
fun setIdentity(uid: String?, token: String?) = impl.setIdentity(uid, token)
|
|
34
|
-
|
|
35
|
-
@ReactMethod
|
|
36
|
-
fun reset() = impl.reset()
|
|
37
|
-
|
|
38
|
-
@ReactMethod
|
|
39
|
-
fun track(event: String, data: ReadableMap?) = impl.track(event, data)
|
|
40
|
-
|
|
41
|
-
@ReactMethod
|
|
42
|
-
fun screen(screenName: String, data: ReadableMap?) = impl.screen(screenName, data)
|
|
43
|
-
|
|
44
|
-
@ReactMethod
|
|
45
|
-
fun fetchRecord(urn: String, options: ReadableMap?, promise: Promise) =
|
|
46
|
-
impl.fetchRecord(urn, options, promise)
|
|
47
|
-
|
|
48
|
-
@ReactMethod
|
|
49
|
-
fun searchRecords(resource: String, options: ReadableMap?, promise: Promise) =
|
|
50
|
-
impl.searchRecords(resource, options, promise)
|
|
51
|
-
|
|
52
|
-
@ReactMethod
|
|
53
|
-
fun fetchStoredPreferences(promise: Promise) = impl.fetchStoredPreferences(promise)
|
|
54
|
-
|
|
55
|
-
@ReactMethod
|
|
56
|
-
fun saveStoredPreferences(preferenceData: ReadableMap?, promise: Promise) =
|
|
57
|
-
impl.saveStoredPreferences(preferenceData, promise)
|
|
58
|
-
|
|
59
|
-
@ReactMethod
|
|
60
|
-
fun subscribe() = impl.subscribe()
|
|
61
|
-
|
|
62
|
-
@ReactMethod
|
|
63
|
-
fun unsubscribe(promise: Promise) = impl.unsubscribe(promise)
|
|
64
|
-
|
|
65
|
-
@ReactMethod
|
|
66
|
-
fun setLogLevel(level: Double) = impl.setLogLevel(level)
|
|
67
|
-
|
|
68
|
-
@ReactMethod
|
|
69
|
-
fun enableLifecycleTracking() = impl.enableLifecycleTracking()
|
|
70
|
-
|
|
71
|
-
@ReactMethod
|
|
72
|
-
fun enableAdTracking() = impl.enableAdTracking()
|
|
73
|
-
|
|
74
|
-
@ReactMethod
|
|
75
|
-
fun processURL(url: String, source: String?, forwardToLinkHandler: Boolean) =
|
|
76
|
-
impl.processURL(url, source, forwardToLinkHandler)
|
|
77
|
-
|
|
78
|
-
@ReactMethod
|
|
79
|
-
fun trackNotificationNavigation(action: ReadableMap?, notificationId: String?) =
|
|
80
|
-
impl.trackNotificationNavigation(action, notificationId)
|
|
81
|
-
|
|
82
|
-
@ReactMethod
|
|
83
|
-
fun uploadAsset(filePath: String, resource: String, attribute: String, promise: Promise) =
|
|
84
|
-
impl.uploadAsset(filePath, resource, attribute, promise)
|
|
85
|
-
|
|
86
|
-
@ReactMethod
|
|
87
|
-
fun fetchAsset(assetId: String, promise: Promise) = impl.fetchAsset(assetId, promise)
|
|
88
|
-
|
|
89
|
-
@ReactMethod
|
|
90
|
-
fun requestNotificationPermission(fallbackToSettings: Boolean, promise: Promise) =
|
|
91
|
-
impl.requestNotificationPermission(fallbackToSettings, promise)
|
|
92
|
-
|
|
93
|
-
@ReactMethod
|
|
94
|
-
fun getNotificationPermissionStatus(promise: Promise) =
|
|
95
|
-
impl.getNotificationPermissionStatus(promise)
|
|
96
|
-
|
|
97
|
-
@ReactMethod
|
|
98
|
-
fun addListener(eventName: String) {
|
|
99
|
-
// Required for RN built-in Event Emitter Calls
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
@ReactMethod
|
|
103
|
-
fun removeListeners(count: Double) {
|
|
104
|
-
// Required for RN built-in Event Emitter Calls
|
|
105
|
-
}
|
|
106
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
package com.dashx.rn.sdk
|
|
2
|
-
|
|
3
|
-
import com.facebook.react.BaseReactPackage
|
|
4
|
-
import com.facebook.react.bridge.NativeModule
|
|
5
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
-
import com.facebook.react.module.model.ReactModuleInfo
|
|
7
|
-
import com.facebook.react.module.model.ReactModuleInfoProvider
|
|
8
|
-
|
|
9
|
-
class DashXReactNativePackage : BaseReactPackage() {
|
|
10
|
-
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
|
|
11
|
-
return if (name == DashXReactNativeModuleImpl.NAME) {
|
|
12
|
-
DashXReactNativeModule(reactContext)
|
|
13
|
-
} else {
|
|
14
|
-
null
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
|
|
19
|
-
return ReactModuleInfoProvider {
|
|
20
|
-
mapOf(
|
|
21
|
-
DashXReactNativeModuleImpl.NAME to ReactModuleInfo(
|
|
22
|
-
DashXReactNativeModuleImpl.NAME,
|
|
23
|
-
DashXReactNativeModuleImpl.NAME,
|
|
24
|
-
false, // canOverrideExistingModule
|
|
25
|
-
false, // needsEagerInit
|
|
26
|
-
false, // hasConstants
|
|
27
|
-
false, // isCxxModule
|
|
28
|
-
false // isTurboModule
|
|
29
|
-
)
|
|
30
|
-
)
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
package com.dashx.rn.sdk.util
|
|
2
|
-
|
|
3
|
-
import com.facebook.react.bridge.JavaOnlyArray
|
|
4
|
-
import com.facebook.react.bridge.JavaOnlyMap
|
|
5
|
-
import com.facebook.react.bridge.ReadableArray
|
|
6
|
-
import com.facebook.react.bridge.ReadableMap
|
|
7
|
-
import com.facebook.react.bridge.ReadableType
|
|
8
|
-
import com.facebook.react.bridge.WritableArray
|
|
9
|
-
import com.facebook.react.bridge.WritableMap
|
|
10
|
-
import kotlinx.serialization.json.JsonArray
|
|
11
|
-
import kotlinx.serialization.json.JsonNull
|
|
12
|
-
import kotlinx.serialization.json.JsonObject
|
|
13
|
-
import kotlinx.serialization.json.JsonPrimitive
|
|
14
|
-
import kotlinx.serialization.json.add
|
|
15
|
-
import kotlinx.serialization.json.boolean
|
|
16
|
-
import kotlinx.serialization.json.buildJsonArray
|
|
17
|
-
import kotlinx.serialization.json.buildJsonObject
|
|
18
|
-
import kotlinx.serialization.json.double
|
|
19
|
-
import kotlinx.serialization.json.jsonArray
|
|
20
|
-
import kotlinx.serialization.json.jsonObject
|
|
21
|
-
import kotlinx.serialization.json.jsonPrimitive
|
|
22
|
-
import kotlinx.serialization.json.put
|
|
23
|
-
import org.junit.After
|
|
24
|
-
import org.junit.Assert.assertEquals
|
|
25
|
-
import org.junit.Assert.assertFalse
|
|
26
|
-
import org.junit.Assert.assertNull
|
|
27
|
-
import org.junit.Assert.assertTrue
|
|
28
|
-
import org.junit.Before
|
|
29
|
-
import org.junit.Test
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Pure-JVM unit tests for the conversion helpers in [Utils.kt]. Swaps
|
|
33
|
-
* [WritableFactory] over to `JavaOnlyMap` / `JavaOnlyArray` in [setUp] so
|
|
34
|
-
* the JNI-backed `WritableNative*` constructors don't execute — those need
|
|
35
|
-
* the Android runtime and would crash a plain JUnit run.
|
|
36
|
-
*
|
|
37
|
-
* `JavaOnlyMap` / `JavaOnlyArray` are pure-Java RN-provided stand-ins that
|
|
38
|
-
* implement the full `WritableMap` / `WritableArray` contracts, so their
|
|
39
|
-
* `.get*` accessors let the assertions inspect everything the helpers wrote.
|
|
40
|
-
*/
|
|
41
|
-
class UtilsTest {
|
|
42
|
-
|
|
43
|
-
@Before
|
|
44
|
-
fun setUp() {
|
|
45
|
-
WritableFactory.createMap = { JavaOnlyMap() }
|
|
46
|
-
WritableFactory.createArray = { JavaOnlyArray() }
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
@After
|
|
50
|
-
fun tearDown() {
|
|
51
|
-
// Not strictly necessary (tests don't share state with prod) but keeps
|
|
52
|
-
// the invariant clear: the object factory is production-pointed at
|
|
53
|
-
// rest, test-pointed only inside a test method.
|
|
54
|
-
WritableFactory.createMap = { error("WritableNativeMap not available in JVM tests") }
|
|
55
|
-
WritableFactory.createArray = { error("WritableNativeArray not available in JVM tests") }
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// ---------------------------------------------------------------------
|
|
59
|
-
// convertMapToJson: ReadableMap → kotlinx JsonObject
|
|
60
|
-
// ---------------------------------------------------------------------
|
|
61
|
-
|
|
62
|
-
@Test
|
|
63
|
-
fun convertMapToJson_returnsNullForNullInput() {
|
|
64
|
-
assertNull(convertMapToJson(null))
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
@Test
|
|
68
|
-
fun convertMapToJson_emptyMapProducesEmptyJsonObject() {
|
|
69
|
-
val json = convertMapToJson(JavaOnlyMap())
|
|
70
|
-
assertEquals(0, json!!.size)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
@Test
|
|
74
|
-
fun convertMapToJson_primitives() {
|
|
75
|
-
val input = JavaOnlyMap().apply {
|
|
76
|
-
putBoolean("flag", true)
|
|
77
|
-
putDouble("n", 3.14)
|
|
78
|
-
putString("s", "hello")
|
|
79
|
-
putNull("nothing")
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
val json = convertMapToJson(input)!!
|
|
83
|
-
|
|
84
|
-
assertEquals(true, json["flag"]!!.jsonPrimitive.boolean)
|
|
85
|
-
assertEquals(3.14, json["n"]!!.jsonPrimitive.double, 0.0)
|
|
86
|
-
assertEquals("hello", json["s"]!!.jsonPrimitive.content)
|
|
87
|
-
assertTrue(
|
|
88
|
-
"null RN value should land as JsonNull",
|
|
89
|
-
json["nothing"] is JsonNull
|
|
90
|
-
)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
@Test
|
|
94
|
-
fun convertMapToJson_nestedMap() {
|
|
95
|
-
val inner = JavaOnlyMap().apply { putString("k", "v") }
|
|
96
|
-
val input = JavaOnlyMap().apply { putMap("child", inner) }
|
|
97
|
-
|
|
98
|
-
val json = convertMapToJson(input)!!
|
|
99
|
-
val childJson = json["child"]!!.jsonObject
|
|
100
|
-
|
|
101
|
-
assertEquals("v", childJson["k"]!!.jsonPrimitive.content)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
@Test
|
|
105
|
-
fun convertMapToJson_nestedArray() {
|
|
106
|
-
val inner = JavaOnlyArray().apply {
|
|
107
|
-
pushString("a")
|
|
108
|
-
pushDouble(1.0)
|
|
109
|
-
}
|
|
110
|
-
val input = JavaOnlyMap().apply { putArray("xs", inner) }
|
|
111
|
-
|
|
112
|
-
val json = convertMapToJson(input)!!
|
|
113
|
-
val arr = json["xs"]!!.jsonArray
|
|
114
|
-
|
|
115
|
-
assertEquals(2, arr.size)
|
|
116
|
-
assertEquals("a", arr[0].jsonPrimitive.content)
|
|
117
|
-
assertEquals(1.0, arr[1].jsonPrimitive.double, 0.0)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// ---------------------------------------------------------------------
|
|
121
|
-
// convertArrayToJson: ReadableArray → kotlinx JsonArray
|
|
122
|
-
// ---------------------------------------------------------------------
|
|
123
|
-
|
|
124
|
-
@Test
|
|
125
|
-
fun convertArrayToJson_returnsNullForNullInput() {
|
|
126
|
-
assertNull(convertArrayToJson(null))
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
@Test
|
|
130
|
-
fun convertArrayToJson_mixedPrimitives() {
|
|
131
|
-
val input = JavaOnlyArray().apply {
|
|
132
|
-
pushBoolean(false)
|
|
133
|
-
pushDouble(42.0)
|
|
134
|
-
pushString("foo")
|
|
135
|
-
pushNull()
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
val arr = convertArrayToJson(input)!!
|
|
139
|
-
|
|
140
|
-
assertEquals(4, arr.size)
|
|
141
|
-
assertFalse(arr[0].jsonPrimitive.boolean)
|
|
142
|
-
assertEquals(42.0, arr[1].jsonPrimitive.double, 0.0)
|
|
143
|
-
assertEquals("foo", arr[2].jsonPrimitive.content)
|
|
144
|
-
assertTrue(arr[3] is JsonNull)
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// ---------------------------------------------------------------------
|
|
148
|
-
// convertReadableArrayToKJsonList: ReadableArray[ReadableMap] → List<JsonObject>
|
|
149
|
-
// ---------------------------------------------------------------------
|
|
150
|
-
|
|
151
|
-
@Test
|
|
152
|
-
fun convertReadableArrayToKJsonList_filtersNonMapEntries() {
|
|
153
|
-
val input = JavaOnlyArray().apply {
|
|
154
|
-
pushMap(JavaOnlyMap().apply { putString("a", "1") })
|
|
155
|
-
pushString("not-a-map")
|
|
156
|
-
pushMap(JavaOnlyMap().apply { putString("b", "2") })
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
val list = convertReadableArrayToKJsonList(input)!!
|
|
160
|
-
|
|
161
|
-
assertEquals(2, list.size)
|
|
162
|
-
assertEquals("1", list[0]["a"]!!.jsonPrimitive.content)
|
|
163
|
-
assertEquals("2", list[1]["b"]!!.jsonPrimitive.content)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
@Test
|
|
167
|
-
fun convertReadableArrayToKJsonList_returnsNullForEmpty() {
|
|
168
|
-
assertNull(convertReadableArrayToKJsonList(null))
|
|
169
|
-
assertNull(convertReadableArrayToKJsonList(JavaOnlyArray()))
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// ---------------------------------------------------------------------
|
|
173
|
-
// convertJsonToMap: kotlinx JsonObject → WritableMap
|
|
174
|
-
// ---------------------------------------------------------------------
|
|
175
|
-
|
|
176
|
-
@Test
|
|
177
|
-
fun convertJsonToMap_returnsNullForNullInput() {
|
|
178
|
-
assertNull(convertJsonToMap(null))
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
@Test
|
|
182
|
-
fun convertJsonToMap_primitives() {
|
|
183
|
-
val input = buildJsonObject {
|
|
184
|
-
put("flag", true)
|
|
185
|
-
put("n", 3.14)
|
|
186
|
-
put("s", "hello")
|
|
187
|
-
put("nothing", JsonNull)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
val map = convertJsonToMap(input) as JavaOnlyMap
|
|
191
|
-
|
|
192
|
-
assertEquals(true, map.getBoolean("flag"))
|
|
193
|
-
assertEquals(3.14, map.getDouble("n"), 0.0)
|
|
194
|
-
assertEquals("hello", map.getString("s"))
|
|
195
|
-
assertTrue(
|
|
196
|
-
"JsonNull should land as RN null",
|
|
197
|
-
map.isNull("nothing")
|
|
198
|
-
)
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
@Test
|
|
202
|
-
fun convertJsonToMap_nestedObject() {
|
|
203
|
-
val input = buildJsonObject {
|
|
204
|
-
put("outer", buildJsonObject {
|
|
205
|
-
put("inner", "deep")
|
|
206
|
-
})
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
val map = convertJsonToMap(input) as JavaOnlyMap
|
|
210
|
-
val inner = map.getMap("outer") as JavaOnlyMap
|
|
211
|
-
|
|
212
|
-
assertEquals("deep", inner.getString("inner"))
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
@Test
|
|
216
|
-
fun convertJsonToMap_nestedArray() {
|
|
217
|
-
val input = buildJsonObject {
|
|
218
|
-
put("xs", buildJsonArray {
|
|
219
|
-
add("a")
|
|
220
|
-
add(1.0)
|
|
221
|
-
add(JsonNull)
|
|
222
|
-
})
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
val map = convertJsonToMap(input) as JavaOnlyMap
|
|
226
|
-
val arr = map.getArray("xs") as JavaOnlyArray
|
|
227
|
-
|
|
228
|
-
assertEquals(3, arr.size())
|
|
229
|
-
assertEquals("a", arr.getString(0))
|
|
230
|
-
assertEquals(1.0, arr.getDouble(1), 0.0)
|
|
231
|
-
assertTrue(arr.isNull(2))
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// ---------------------------------------------------------------------
|
|
235
|
-
// Round-trip: ReadableMap → JsonObject → WritableMap
|
|
236
|
-
// ---------------------------------------------------------------------
|
|
237
|
-
|
|
238
|
-
@Test
|
|
239
|
-
fun roundTrip_preservesEverything() {
|
|
240
|
-
val input = JavaOnlyMap().apply {
|
|
241
|
-
putString("str", "hello")
|
|
242
|
-
putDouble("num", 12.5)
|
|
243
|
-
putBoolean("bool", true)
|
|
244
|
-
putNull("nil")
|
|
245
|
-
putMap(
|
|
246
|
-
"nested",
|
|
247
|
-
JavaOnlyMap().apply { putString("k", "v") }
|
|
248
|
-
)
|
|
249
|
-
putArray(
|
|
250
|
-
"arr",
|
|
251
|
-
JavaOnlyArray().apply {
|
|
252
|
-
pushString("a")
|
|
253
|
-
pushDouble(1.0)
|
|
254
|
-
}
|
|
255
|
-
)
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
val json = convertMapToJson(input)!!
|
|
259
|
-
val roundTripped = convertJsonToMap(json) as JavaOnlyMap
|
|
260
|
-
|
|
261
|
-
assertEquals("hello", roundTripped.getString("str"))
|
|
262
|
-
assertEquals(12.5, roundTripped.getDouble("num"), 0.0)
|
|
263
|
-
assertEquals(true, roundTripped.getBoolean("bool"))
|
|
264
|
-
assertTrue(roundTripped.isNull("nil"))
|
|
265
|
-
assertEquals("v", (roundTripped.getMap("nested") as JavaOnlyMap).getString("k"))
|
|
266
|
-
val arr = roundTripped.getArray("arr") as JavaOnlyArray
|
|
267
|
-
assertEquals("a", arr.getString(0))
|
|
268
|
-
assertEquals(1.0, arr.getDouble(1), 0.0)
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// ---------------------------------------------------------------------
|
|
272
|
-
// Regression: pre-migration crashes
|
|
273
|
-
// ---------------------------------------------------------------------
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* The Gson-based `convertJsonToMap` crashed on JSON nulls because
|
|
277
|
-
* `value.asJsonPrimitive.isBoolean` throws when `value is JsonNull`.
|
|
278
|
-
* The kotlinx rewrite explicitly branches `is JsonNull` → `putNull(key)`.
|
|
279
|
-
*/
|
|
280
|
-
@Test
|
|
281
|
-
fun convertJsonToMap_doesNotCrashOnNestedJsonNull() {
|
|
282
|
-
val input = buildJsonObject {
|
|
283
|
-
put("outer", buildJsonObject {
|
|
284
|
-
put("inner", JsonNull)
|
|
285
|
-
})
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
val map = convertJsonToMap(input) as JavaOnlyMap
|
|
289
|
-
val nested = map.getMap("outer") as JavaOnlyMap
|
|
290
|
-
assertTrue(nested.isNull("inner"))
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Pre-migration `saveStoredPreferences` NPE'd on a null preferenceData
|
|
295
|
-
* because `MapUtil.toJSONElement(null).toString()` dereferenced null.
|
|
296
|
-
* The new path is `convertMapToJson(null) ?: buildJsonObject {}` which
|
|
297
|
-
* can't NPE — null input returns a null `JsonObject?`, caller
|
|
298
|
-
* substitutes an empty object.
|
|
299
|
-
*/
|
|
300
|
-
@Test
|
|
301
|
-
fun convertMapToJson_nullInputIsSafe() {
|
|
302
|
-
val fallback: JsonObject = convertMapToJson(null) ?: buildJsonObject { }
|
|
303
|
-
assertEquals(0, fallback.size)
|
|
304
|
-
}
|
|
305
|
-
}
|