expo-iap 4.2.7 → 4.3.0
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/CLAUDE.md +8 -8
- package/CONTRIBUTING.md +2 -2
- package/README.md +13 -14
- package/android/build.gradle +36 -18
- package/android/openiap-android-sdk.gradle +30 -0
- package/android/src/main/java/expo/modules/iap/ExpoIapHelper.kt +7 -9
- package/android/src/main/java/expo/modules/iap/ExpoIapLog.kt +3 -1
- package/android/src/main/java/expo/modules/iap/ExpoIapModule.kt +12 -11
- package/android/src/main/java/expo/modules/iap/PromiseUtils.kt +2 -3
- package/build/ExpoIapModule.d.ts.map +1 -1
- package/build/ExpoIapModule.js +53 -14
- package/build/ExpoIapModule.js.map +1 -1
- package/build/index.d.ts +20 -20
- package/build/index.d.ts.map +1 -1
- package/build/index.js +210 -66
- package/build/index.js.map +1 -1
- package/build/modules/android.d.ts +8 -8
- package/build/modules/android.js +8 -8
- package/build/modules/android.js.map +1 -1
- package/build/modules/ios.d.ts +24 -24
- package/build/modules/ios.js +25 -25
- package/build/modules/ios.js.map +1 -1
- package/build/types.d.ts +63 -49
- package/build/types.d.ts.map +1 -1
- package/build/types.js.map +1 -1
- package/build/useIAP.d.ts +8 -2
- package/build/useIAP.d.ts.map +1 -1
- package/build/useIAP.js +13 -13
- package/build/useIAP.js.map +1 -1
- package/bun.lock +30 -529
- package/ios/ExpoIapHelper.swift +54 -9
- package/ios/ExpoIapModule.swift +30 -12
- package/ios/onside/OnsideIapModule.swift +128 -41
- package/openiap-versions.json +3 -3
- package/package.json +1 -1
- package/plugin/build/withLocalOpenIAP.js +45 -9
- package/plugin/src/withLocalOpenIAP.ts +94 -14
- package/plugin/tsconfig.tsbuildinfo +1 -1
- package/scripts/test-coverage.sh +5 -1
- package/src/ExpoIapModule.ts +60 -19
- package/src/index.ts +286 -80
- package/src/modules/android.ts +8 -8
- package/src/modules/ios.ts +25 -25
- package/src/types.ts +66 -49
- package/src/useIAP.ts +20 -11
package/build/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DeveloperProvidedBillingDetailsAndroid, MutationField, Product, ProductQueryType, Purchase, QueryField, UserChoiceBillingDetails } from './types';
|
|
1
|
+
import type { DeveloperProvidedBillingDetailsAndroid, MutationField, Product, ProductQueryType, Purchase, PurchaseUpdatedListenerOptions, QueryField, UserChoiceBillingDetails } from './types';
|
|
2
2
|
import { type PurchaseError } from './utils/errorMapping';
|
|
3
3
|
export * from './types';
|
|
4
4
|
export * from './modules/android';
|
|
@@ -41,10 +41,10 @@ type ExpoIapEmitter = {
|
|
|
41
41
|
};
|
|
42
42
|
export declare const emitter: ExpoIapEmitter;
|
|
43
43
|
/**
|
|
44
|
-
* TODO(
|
|
44
|
+
* TODO(next-major): Remove legacy 'inapp' alias once downstream apps migrate to 'in-app'.
|
|
45
45
|
*/
|
|
46
46
|
export type ProductTypeInput = ProductQueryType | 'inapp';
|
|
47
|
-
export declare const purchaseUpdatedListener: (listener: (event: Purchase) => void) => {
|
|
47
|
+
export declare const purchaseUpdatedListener: (listener: (event: Purchase) => void, options?: PurchaseUpdatedListenerOptions | null) => {
|
|
48
48
|
remove: () => void;
|
|
49
49
|
};
|
|
50
50
|
export declare const purchaseErrorListener: (listener: (error: PurchaseError) => void) => {
|
|
@@ -85,7 +85,7 @@ export declare const promotedProductListenerIOS: (listener: (product: Product) =
|
|
|
85
85
|
* ```typescript
|
|
86
86
|
* const subscription = userChoiceBillingListenerAndroid((details) => {
|
|
87
87
|
* console.log('User selected alternative billing');
|
|
88
|
-
* console.log('
|
|
88
|
+
* console.log('External transaction token received; send it to your backend without logging it.');
|
|
89
89
|
* console.log('Products:', details.products);
|
|
90
90
|
*
|
|
91
91
|
* // Process payment in your system, then report token to Google
|
|
@@ -115,7 +115,7 @@ export declare const userChoiceBillingListenerAndroid: (listener: (details: User
|
|
|
115
115
|
* ```typescript
|
|
116
116
|
* const subscription = developerProvidedBillingListenerAndroid(async (details) => {
|
|
117
117
|
* console.log('User selected developer billing');
|
|
118
|
-
* console.log('
|
|
118
|
+
* console.log('External transaction token received; send it to your backend without logging it.');
|
|
119
119
|
*
|
|
120
120
|
* // Process payment with your payment gateway
|
|
121
121
|
* await processPaymentWithYourGateway(details.externalTransactionToken);
|
|
@@ -176,13 +176,13 @@ export declare const subscriptionBillingIssueListener: (listener: (purchase: Pur
|
|
|
176
176
|
* @remarks When using `useIAP()`, connection is auto-managed on mount/unmount —
|
|
177
177
|
* pass options to the hook instead of calling this directly.
|
|
178
178
|
*
|
|
179
|
-
* @see {@link https://
|
|
179
|
+
* @see {@link https://openiap.dev/docs/apis/init-connection}
|
|
180
180
|
*/
|
|
181
181
|
export declare const initConnection: MutationField<'initConnection'>;
|
|
182
182
|
/**
|
|
183
183
|
* Close the store connection and release resources.
|
|
184
184
|
*
|
|
185
|
-
* @see {@link https://
|
|
185
|
+
* @see {@link https://openiap.dev/docs/apis/end-connection}
|
|
186
186
|
*/
|
|
187
187
|
export declare const endConnection: MutationField<'endConnection'>;
|
|
188
188
|
/**
|
|
@@ -206,7 +206,7 @@ export declare const endConnection: MutationField<'endConnection'>;
|
|
|
206
206
|
* @remarks This is a regular promise-based call. Don't confuse with `request*` APIs
|
|
207
207
|
* (`requestPurchase`), which are event-based.
|
|
208
208
|
*
|
|
209
|
-
* @see {@link https://
|
|
209
|
+
* @see {@link https://openiap.dev/docs/apis/fetch-products}
|
|
210
210
|
*/
|
|
211
211
|
export declare const fetchProducts: QueryField<'fetchProducts'>;
|
|
212
212
|
/**
|
|
@@ -226,7 +226,7 @@ export declare const fetchProducts: QueryField<'fetchProducts'>;
|
|
|
226
226
|
* }
|
|
227
227
|
* ```
|
|
228
228
|
*
|
|
229
|
-
* @see {@link https://
|
|
229
|
+
* @see {@link https://openiap.dev/docs/apis/get-available-purchases}
|
|
230
230
|
*/
|
|
231
231
|
export declare const getAvailablePurchases: QueryField<'getAvailablePurchases'>;
|
|
232
232
|
/**
|
|
@@ -257,7 +257,7 @@ export declare const getAvailablePurchases: QueryField<'getAvailablePurchases'>;
|
|
|
257
257
|
* });
|
|
258
258
|
* ```
|
|
259
259
|
*
|
|
260
|
-
* @see {@link https://
|
|
260
|
+
* @see {@link https://openiap.dev/docs/apis/get-active-subscriptions}
|
|
261
261
|
*/
|
|
262
262
|
export declare const getActiveSubscriptions: QueryField<'getActiveSubscriptions'>;
|
|
263
263
|
/**
|
|
@@ -275,13 +275,13 @@ export declare const getActiveSubscriptions: QueryField<'getActiveSubscriptions'
|
|
|
275
275
|
* const hasPremium = await hasActiveSubscriptions(['premium', 'premium_year']);
|
|
276
276
|
* ```
|
|
277
277
|
*
|
|
278
|
-
* @see {@link https://
|
|
278
|
+
* @see {@link https://openiap.dev/docs/apis/has-active-subscriptions}
|
|
279
279
|
*/
|
|
280
280
|
export declare const hasActiveSubscriptions: QueryField<'hasActiveSubscriptions'>;
|
|
281
281
|
/**
|
|
282
282
|
* Return the user's storefront country code.
|
|
283
283
|
*
|
|
284
|
-
* @see {@link https://
|
|
284
|
+
* @see {@link https://openiap.dev/docs/apis/get-storefront}
|
|
285
285
|
*/
|
|
286
286
|
export declare const getStorefront: QueryField<'getStorefront'>;
|
|
287
287
|
/**
|
|
@@ -308,7 +308,7 @@ export declare const getStorefront: QueryField<'getStorefront'>;
|
|
|
308
308
|
* @remarks Event-based. Listen for the result via {@link purchaseUpdatedListener} /
|
|
309
309
|
* {@link purchaseErrorListener}, or use `useIAP({ onPurchaseSuccess, onPurchaseError })`.
|
|
310
310
|
*
|
|
311
|
-
* @see {@link https://
|
|
311
|
+
* @see {@link https://openiap.dev/docs/apis/request-purchase}
|
|
312
312
|
*/
|
|
313
313
|
export declare const requestPurchase: MutationField<'requestPurchase'>;
|
|
314
314
|
/**
|
|
@@ -332,20 +332,20 @@ export declare const requestPurchase: MutationField<'requestPurchase'>;
|
|
|
332
332
|
* @remarks **Critical:** Android purchases must be finalized within 3 days or Google
|
|
333
333
|
* auto-refunds. iOS unfinished transactions replay on every app launch.
|
|
334
334
|
*
|
|
335
|
-
* @see {@link https://
|
|
335
|
+
* @see {@link https://openiap.dev/docs/apis/finish-transaction}
|
|
336
336
|
*/
|
|
337
337
|
export declare const finishTransaction: MutationField<'finishTransaction'>;
|
|
338
338
|
/**
|
|
339
339
|
* Restore completed transactions (cross-platform behavior)
|
|
340
340
|
*
|
|
341
|
-
* - iOS: perform a lightweight sync
|
|
341
|
+
* - iOS: perform a lightweight sync, or Onside restore when OnsideKit is active,
|
|
342
342
|
* then fetch available purchases to surface restored items to the app.
|
|
343
343
|
* - Android: simply fetch available purchases (restoration happens via query).
|
|
344
344
|
*
|
|
345
345
|
* This helper triggers the refresh flows but does not return the purchases; consumers should
|
|
346
346
|
* call `getAvailablePurchases` or rely on hook state to inspect the latest items.
|
|
347
347
|
*
|
|
348
|
-
* @see {@link https://
|
|
348
|
+
* @see {@link https://openiap.dev/docs/apis/restore-purchases}
|
|
349
349
|
*/
|
|
350
350
|
export declare const restorePurchases: MutationField<'restorePurchases'>;
|
|
351
351
|
/**
|
|
@@ -366,7 +366,7 @@ export declare const restorePurchases: MutationField<'restorePurchases'>;
|
|
|
366
366
|
* packageNameAndroid: 'com.example.app'
|
|
367
367
|
* });
|
|
368
368
|
*
|
|
369
|
-
* @see {@link https://
|
|
369
|
+
* @see {@link https://openiap.dev/docs/apis/deep-link-to-subscriptions}
|
|
370
370
|
*/
|
|
371
371
|
export declare const deepLinkToSubscriptions: MutationField<'deepLinkToSubscriptions'>;
|
|
372
372
|
/**
|
|
@@ -379,7 +379,7 @@ export declare const deepLinkToSubscriptions: MutationField<'deepLinkToSubscript
|
|
|
379
379
|
*
|
|
380
380
|
* @deprecated Use verifyPurchase instead
|
|
381
381
|
*
|
|
382
|
-
* @see {@link https://
|
|
382
|
+
* @see {@link https://openiap.dev/docs/apis/validate-receipt}
|
|
383
383
|
*/
|
|
384
384
|
export declare const validateReceipt: MutationField<'validateReceipt'>;
|
|
385
385
|
/**
|
|
@@ -391,7 +391,7 @@ export declare const validateReceipt: MutationField<'validateReceipt'>;
|
|
|
391
391
|
* @param options - Receipt validation options containing the SKU
|
|
392
392
|
* @returns Promise resolving to receipt validation result
|
|
393
393
|
*
|
|
394
|
-
* @see {@link https://
|
|
394
|
+
* @see {@link https://openiap.dev/docs/features/validation#verify-purchase}
|
|
395
395
|
*/
|
|
396
396
|
export declare const verifyPurchase: MutationField<'verifyPurchase'>;
|
|
397
397
|
/**
|
|
@@ -419,7 +419,7 @@ export declare const verifyPurchase: MutationField<'verifyPurchase'>;
|
|
|
419
419
|
* });
|
|
420
420
|
* ```
|
|
421
421
|
*
|
|
422
|
-
* @see {@link https://
|
|
422
|
+
* @see {@link https://openiap.dev/docs/features/validation#verify-purchase-with-provider}
|
|
423
423
|
*/
|
|
424
424
|
export declare const verifyPurchaseWithProvider: MutationField<'verifyPurchaseWithProvider'>;
|
|
425
425
|
export * from './useIAP';
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAIV,sCAAsC,EACtC,aAAa,EAGb,OAAO,EACP,gBAAgB,EAEhB,QAAQ,EAER,UAAU,EAOV,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAsB,KAAK,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAG7E,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AAGzB,oBAAY,YAAY;IACtB,eAAe,qBAAqB;IACpC,aAAa,mBAAmB;IAChC,kBAAkB,yBAAyB;IAC3C,wBAAwB,gCAAgC;IACxD;;;OAGG;IACH,+BAA+B,uCAAuC;IACtE;;;;OAIG;IACH,wBAAwB,+BAA+B;CACxD;AAED,KAAK,oBAAoB,GAAG;IAC1B,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC;IACzC,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC5C,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAC7B,OAAO,GACP,MAAM,GACN;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IACtC,CAAC,YAAY,CAAC,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;IAClE,CAAC,YAAY,CAAC,+BAA+B,CAAC,EAAE,sCAAsC,CAAC;IACvF,CAAC,YAAY,CAAC,wBAAwB,CAAC,EAAE,QAAQ,CAAC;CACnD,CAAC;AAEF,KAAK,oBAAoB,CAAC,CAAC,SAAS,YAAY,IAAI,CAClD,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAC7B,IAAI,CAAC;AAEV,KAAK,cAAc,GAAG;IACpB,WAAW,CAAC,CAAC,SAAS,YAAY,EAChC,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAChC;QAAC,MAAM,EAAE,MAAM,IAAI,CAAA;KAAC,CAAC;IACxB,cAAc,CAAC,CAAC,SAAS,YAAY,EACnC,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAChC,IAAI,CAAC;CACT,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|