@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.
Files changed (85) hide show
  1. package/README.md +1 -1
  2. package/ios/DashXReactNative.mm +7 -7
  3. package/ios/DashXReactNative.swift +15 -11
  4. package/package.json +13 -11
  5. package/.claude/settings.local.json +0 -7
  6. package/.claude/worktrees/autocapture-conventions-review-78f665/.gitattributes +0 -1
  7. package/.claude/worktrees/autocapture-conventions-review-78f665/.github/workflows/ci.yml +0 -67
  8. package/.claude/worktrees/autocapture-conventions-review-78f665/.gitignore +0 -49
  9. package/.claude/worktrees/autocapture-conventions-review-78f665/.nvmrc +0 -1
  10. package/.claude/worktrees/autocapture-conventions-review-78f665/CHANGELOG.md +0 -144
  11. package/.claude/worktrees/autocapture-conventions-review-78f665/CONTRIBUTING.md +0 -190
  12. package/.claude/worktrees/autocapture-conventions-review-78f665/DashXReactNative.podspec +0 -38
  13. package/.claude/worktrees/autocapture-conventions-review-78f665/LICENSE +0 -21
  14. package/.claude/worktrees/autocapture-conventions-review-78f665/README.md +0 -97
  15. package/.claude/worktrees/autocapture-conventions-review-78f665/__tests__/fallback.test.js +0 -72
  16. package/.claude/worktrees/autocapture-conventions-review-78f665/__tests__/index.test.js +0 -702
  17. package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gitignore +0 -10
  18. package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/8.14.3/checksums/checksums.lock +0 -0
  19. package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/8.14.3/fileChanges/last-build.bin +0 -0
  20. package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/8.14.3/fileHashes/fileHashes.lock +0 -0
  21. package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/8.14.3/gc.properties +0 -0
  22. package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  23. package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  24. package/.claude/worktrees/autocapture-conventions-review-78f665/android/.gradle/vcs-1/gc.properties +0 -0
  25. package/.claude/worktrees/autocapture-conventions-review-78f665/android/build/reports/problems/problems-report.html +0 -663
  26. package/.claude/worktrees/autocapture-conventions-review-78f665/android/build.gradle +0 -121
  27. package/.claude/worktrees/autocapture-conventions-review-78f665/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  28. package/.claude/worktrees/autocapture-conventions-review-78f665/android/gradle/wrapper/gradle-wrapper.properties +0 -6
  29. package/.claude/worktrees/autocapture-conventions-review-78f665/android/gradle.properties +0 -1
  30. package/.claude/worktrees/autocapture-conventions-review-78f665/android/gradlew +0 -185
  31. package/.claude/worktrees/autocapture-conventions-review-78f665/android/gradlew.bat +0 -89
  32. package/.claude/worktrees/autocapture-conventions-review-78f665/android/settings.gradle +0 -27
  33. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/AndroidManifest.xml +0 -19
  34. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/DashXNotificationClickedListener.kt +0 -113
  35. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/DashXReactNativeFirebaseMessagingService.kt +0 -72
  36. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/DashXReactNativeModuleImpl.kt +0 -445
  37. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/MessageReceivedEventHolder.kt +0 -14
  38. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/ReactNativeLibraryInfoProvider.kt +0 -8
  39. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/java/com/dashx/rn/sdk/util/Utils.kt +0 -208
  40. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/main/resources/META-INF/services/com.dashx.android.DashXLibraryInfoProvider +0 -1
  41. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/newarch/java/com/dashx/rn/sdk/DashXReactNativeModule.kt +0 -85
  42. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/newarch/java/com/dashx/rn/sdk/DashXReactNativePackage.kt +0 -33
  43. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/oldarch/java/com/dashx/rn/sdk/DashXReactNativeModule.kt +0 -106
  44. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/oldarch/java/com/dashx/rn/sdk/DashXReactNativePackage.kt +0 -33
  45. package/.claude/worktrees/autocapture-conventions-review-78f665/android/src/test/java/com/dashx/rn/sdk/util/UtilsTest.kt +0 -305
  46. package/.claude/worktrees/autocapture-conventions-review-78f665/babel.config.js +0 -3
  47. package/.claude/worktrees/autocapture-conventions-review-78f665/index.d.ts +0 -321
  48. package/.claude/worktrees/autocapture-conventions-review-78f665/index.js +0 -300
  49. package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXEventEmitter.swift +0 -15
  50. package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXNotificationHandler.swift +0 -301
  51. package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative-Bridging-Header.h +0 -3
  52. package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative.mm +0 -77
  53. package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative.swift +0 -244
  54. package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative.xcodeproj/project.pbxproj +0 -280
  55. package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative.xcworkspace/contents.xcworkspacedata +0 -7
  56. package/.claude/worktrees/autocapture-conventions-review-78f665/ios/DashXReactNative.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  57. package/.claude/worktrees/autocapture-conventions-review-78f665/package.json +0 -123
  58. package/.claude/worktrees/autocapture-conventions-review-78f665/scripts/generate-bridge-shim.js +0 -259
  59. package/.claude/worktrees/autocapture-conventions-review-78f665/src/NativeDashXReactNative.ts +0 -42
  60. package/.claude/worktrees/autocapture-conventions-review-78f665/yarn.lock +0 -6244
  61. package/.gitattributes +0 -1
  62. package/.github/workflows/ci.yml +0 -67
  63. package/.gitignore +0 -49
  64. package/.nvmrc +0 -1
  65. package/CHANGELOG.md +0 -144
  66. package/CONTRIBUTING.md +0 -190
  67. package/__tests__/fallback.test.js +0 -72
  68. package/__tests__/index.test.js +0 -702
  69. package/android/.gitignore +0 -10
  70. package/android/.gradle/8.14.3/checksums/checksums.lock +0 -0
  71. package/android/.gradle/8.14.3/fileChanges/last-build.bin +0 -0
  72. package/android/.gradle/8.14.3/fileHashes/fileHashes.lock +0 -0
  73. package/android/.gradle/8.14.3/gc.properties +0 -0
  74. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  75. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  76. package/android/.gradle/vcs-1/gc.properties +0 -0
  77. package/android/build/reports/problems/problems-report.html +0 -663
  78. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  79. package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
  80. package/android/gradlew +0 -185
  81. package/android/gradlew.bat +0 -89
  82. package/android/src/test/java/com/dashx/rn/sdk/util/UtilsTest.kt +0 -305
  83. package/babel.config.js +0 -3
  84. package/scripts/generate-bridge-shim.js +0 -259
  85. 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
- }
@@ -1,3 +0,0 @@
1
- module.exports = {
2
- presets: ['module:@react-native/babel-preset'],
3
- };