expo-iap 3.4.1 → 3.4.2

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.
@@ -4,6 +4,8 @@ import android.util.Log
4
4
  import dev.hyo.openiap.AndroidSubscriptionOfferInput
5
5
  import dev.hyo.openiap.OpenIapModule
6
6
  import dev.hyo.openiap.ProductQueryType
7
+ import dev.hyo.openiap.SubscriptionProductReplacementParamsAndroid
8
+ import dev.hyo.openiap.SubscriptionReplacementModeAndroid
7
9
  import expo.modules.kotlin.Promise
8
10
  import expo.modules.kotlin.modules.Module
9
11
  import kotlinx.coroutines.CoroutineScope
@@ -79,6 +81,19 @@ object ExpoIapHelper {
79
81
  (params["purchaseTokenAndroid"] ?: params["purchaseToken"]) as? String
80
82
  val replacementMode =
81
83
  (params["replacementModeAndroid"] ?: params["replacementMode"]) as? Number
84
+ val subscriptionProductReplacementParams =
85
+ (params["subscriptionProductReplacementParams"] as? Map<*, *>)?.let { paramsMap ->
86
+ val oldProductId = paramsMap["oldProductId"] as? String
87
+ val replacementModeStr = paramsMap["replacementMode"] as? String
88
+ if (oldProductId.isNullOrEmpty() || replacementModeStr.isNullOrEmpty()) {
89
+ null
90
+ } else {
91
+ SubscriptionProductReplacementParamsAndroid(
92
+ oldProductId = oldProductId,
93
+ replacementMode = parseSubscriptionReplacementMode(replacementModeStr),
94
+ )
95
+ }
96
+ }
82
97
 
83
98
  return RequestPurchaseParams(
84
99
  type = type,
@@ -90,9 +105,21 @@ object ExpoIapHelper {
90
105
  explicitSubscriptionOffers = explicitSubscriptionOffers,
91
106
  purchaseToken = purchaseToken,
92
107
  replacementMode = replacementMode,
108
+ subscriptionProductReplacementParams = subscriptionProductReplacementParams,
93
109
  )
94
110
  }
95
111
 
112
+ fun parseSubscriptionReplacementMode(mode: String): SubscriptionReplacementModeAndroid =
113
+ when (mode) {
114
+ "with-time-proration" -> SubscriptionReplacementModeAndroid.WithTimeProration
115
+ "charge-prorated-price" -> SubscriptionReplacementModeAndroid.ChargeProratedPrice
116
+ "charge-full-price" -> SubscriptionReplacementModeAndroid.ChargeFullPrice
117
+ "without-proration" -> SubscriptionReplacementModeAndroid.WithoutProration
118
+ "deferred" -> SubscriptionReplacementModeAndroid.Deferred
119
+ "keep-existing" -> SubscriptionReplacementModeAndroid.KeepExisting
120
+ else -> SubscriptionReplacementModeAndroid.UnknownReplacementMode
121
+ }
122
+
96
123
  data class RequestPurchaseParams(
97
124
  val type: String?,
98
125
  val skus: List<String>,
@@ -103,6 +130,7 @@ object ExpoIapHelper {
103
130
  val explicitSubscriptionOffers: List<AndroidSubscriptionOfferInput>,
104
131
  val purchaseToken: String?,
105
132
  val replacementMode: Number?,
133
+ val subscriptionProductReplacementParams: SubscriptionProductReplacementParamsAndroid?,
106
134
  )
107
135
 
108
136
  fun addPurchasePromise(promise: Promise) {
@@ -19,6 +19,7 @@ import dev.hyo.openiap.RequestPurchaseResultPurchase
19
19
  import dev.hyo.openiap.RequestPurchaseResultPurchases
20
20
  import dev.hyo.openiap.RequestSubscriptionAndroidProps
21
21
  import dev.hyo.openiap.RequestSubscriptionPropsByPlatforms
22
+ import dev.hyo.openiap.SubscriptionProductReplacementParamsAndroid
22
23
  import dev.hyo.openiap.VerifyPurchaseGoogleOptions
23
24
  import dev.hyo.openiap.VerifyPurchaseProps
24
25
  import dev.hyo.openiap.VerifyPurchaseWithProviderProps
@@ -274,6 +275,7 @@ class ExpoIapModule : Module() {
274
275
  replacementModeAndroid = parsedParams.replacementMode?.toInt(),
275
276
  skus = parsedParams.skus,
276
277
  subscriptionOffers = subscriptionOffers,
278
+ subscriptionProductReplacementParams = parsedParams.subscriptionProductReplacementParams,
277
279
  )
278
280
  RequestPurchaseProps(
279
281
  request =
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <coverage generated="1768605526262" clover="3.2.0">
3
- <project timestamp="1768605526262" name="All files">
2
+ <coverage generated="1768611008702" clover="3.2.0">
3
+ <project timestamp="1768611008702" name="All files">
4
4
  <metrics statements="492" coveredstatements="463" conditionals="270" coveredconditionals="236" methods="103" coveredmethods="82" elements="865" coveredelements="781" complexity="0" loc="492" ncloc="492" packages="3" files="5" classes="5"/>
5
5
  <package name="src">
6
6
  <metrics statements="222" coveredstatements="215" conditionals="116" coveredconditionals="106" methods="46" coveredmethods="36"/>
@@ -131,7 +131,7 @@
131
131
  <div class='footer quiet pad2 space-top1 center small'>
132
132
  Code coverage generated by
133
133
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2026-01-16T23:18:46.242Z
134
+ at 2026-01-17T00:50:08.682Z
135
135
  </div>
136
136
  <script src="prettify.js"></script>
137
137
  <script>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-01-16T23:18:46.242Z
104
+ at 2026-01-17T00:50:08.682Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -2788,7 +2788,7 @@ export {<span class="fstat-no" title="function not covered" >ExpoIapConsole}</sp
2788
2788
  <div class='footer quiet pad2 space-top1 center small'>
2789
2789
  Code coverage generated by
2790
2790
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2791
- at 2026-01-16T23:18:46.242Z
2791
+ at 2026-01-17T00:50:08.682Z
2792
2792
  </div>
2793
2793
  <script src="../prettify.js"></script>
2794
2794
  <script>
@@ -1033,7 +1033,7 @@ export const createBillingProgramReportingDetailsAndroid: MutationField&lt;
1033
1033
  <div class='footer quiet pad2 space-top1 center small'>
1034
1034
  Code coverage generated by
1035
1035
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1036
- at 2026-01-16T23:18:46.242Z
1036
+ at 2026-01-17T00:50:08.682Z
1037
1037
  </div>
1038
1038
  <script src="../../prettify.js"></script>
1039
1039
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-01-16T23:18:46.242Z
119
+ at 2026-01-17T00:50:08.682Z
120
120
  </div>
121
121
  <script src="../../prettify.js"></script>
122
122
  <script>
@@ -1276,7 +1276,7 @@ export const presentExternalPurchaseLinkIOS: MutationField&lt;
1276
1276
  <div class='footer quiet pad2 space-top1 center small'>
1277
1277
  Code coverage generated by
1278
1278
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1279
- at 2026-01-16T23:18:46.242Z
1279
+ at 2026-01-17T00:50:08.682Z
1280
1280
  </div>
1281
1281
  <script src="../../prettify.js"></script>
1282
1282
  <script>
@@ -268,7 +268,7 @@ export const ExpoIapConsole = createConsole();
268
268
  <div class='footer quiet pad2 space-top1 center small'>
269
269
  Code coverage generated by
270
270
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
271
- at 2026-01-16T23:18:46.242Z
271
+ at 2026-01-17T00:50:08.682Z
272
272
  </div>
273
273
  <script src="../../prettify.js"></script>
274
274
  <script>
@@ -1126,7 +1126,7 @@ export function getUserFriendlyErrorMessage(error: ErrorLike): string {
1126
1126
  <div class='footer quiet pad2 space-top1 center small'>
1127
1127
  Code coverage generated by
1128
1128
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1129
- at 2026-01-16T23:18:46.242Z
1129
+ at 2026-01-17T00:50:08.682Z
1130
1130
  </div>
1131
1131
  <script src="../../prettify.js"></script>
1132
1132
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-01-16T23:18:46.242Z
119
+ at 2026-01-17T00:50:08.682Z
120
120
  </div>
121
121
  <script src="../../prettify.js"></script>
122
122
  <script>
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "apple": "1.3.10",
3
- "google": "1.3.22",
3
+ "google": "1.3.23",
4
4
  "gql": "1.3.12"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-iap",
3
- "version": "3.4.1",
3
+ "version": "3.4.2",
4
4
  "description": "In App Purchase module in Expo",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",