Skip to content

fix: modernize store API integrations - #299

Merged
hyochan merged 8 commits into
mainfrom
fix/store-api-modernization
Aug 9, 2026
Merged

hyochan merged 8 commits into
mainfrom
fix/store-api-modernization

Conversation

@hyochan

@hyochan hyochan commented Aug 9, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Modernize StoreKit integrations while preserving externally redeemed win-back offers, deterministic current-entitlement selection, offer-code fallbacks, and older-toolchain AppTransaction behavior.
  • Harden Google Play and Horizon behavior with suspended-subscription capability fallback, foreground-activity validation, single-product enforcement, and isolated composite-build outputs.
  • Synchronize Advanced Commerce period metadata, framework wrappers and examples, documentation, compiled context, and the full-verification workflow.

Validation

  • Apple Swift tests: 134/134 passed; iOS, Simulator, and Mac Catalyst XCFramework archives passed.
  • Google Play unit tests passed; KMP Play tests and Horizon/Amazon compiles passed with clean no-cache reruns.
  • GQL tests: 164/164 passed; generated-source sync checks passed.
  • Agent scripts: 65/65 passed with typecheck and context compilation.
  • Docs build and parity, deprecation, docs, and release-state audits passed.
  • The broader review train also passed React Native, Expo, Flutter, Godot, KMP, MAUI, Apple, and Google package builds and tests.
  • Device-backed Play flows passed on Pixel, and Horizon flows passed on Quest. Apple generic-device signing/build and XCFramework archives passed; no unlocked iPhone runtime session was available.

Preview

A preview recording is not applicable because this PR changes native store integration behavior, generated contracts, documentation, and CI rather than introducing a user-interface feature.

Summary by CodeRabbit

  • New Features

    • Added iOS subscription-period metadata to purchase information.
    • Improved promoted-product handling, including preservation of win-back offers.
    • Added safer Meta Horizon initialization and purchase validation.
  • Bug Fixes

    • Suspended-subscription queries now adapt to store support.
    • Improved redemption results and purchase-refresh guidance.
    • Prevented build-output conflicts across Google package configurations.
  • Documentation

    • Clarified StoreKit, Horizon, promoted-product, and redemption requirements.
    • Updated verification guidance for Expo and Flutter iOS builds.

hyochan added 6 commits August 9, 2026 22:10
Add the Advanced Commerce subscription period, document the current StoreKit intent contracts, and regenerate every synchronized platform type.
Preserve PurchaseIntent win-back offers, select current entitlements deterministically, modernize offer-code redemption, and keep AppTransaction compatibility across supported toolchains.
Guard suspended-subscription queries by Play capability, require a foreground Horizon activity, enforce single-product requests, and isolate composite build outputs.
Propagate current StoreKit and Billing behavior across React Native, Expo, Flutter, Godot, KMP, and MAUI examples, bridges, tests, and build isolation.
Document StoreKit toolchain and platform fallbacks, Horizon activity requirements, current entitlement semantics, and nullable redemption results across searchable, compiled, and knowledge references.
Build the Expo config plugin before prebuild so generated native projects exercise local Google build-directory isolation during verification.
@hyochan hyochan added cross-platform Cross-platform (both Android & iOS) 💨 ci Cloud integration 📖 documentation Improvements or additions to documentation 🚽 migration Activities due to changes in framework 🛠 bugfix All kinds of bug fixes labels Aug 9, 2026
@coderabbitai

coderabbitai Bot commented Aug 9, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@hyochan, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 13 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 01d73aad-4be4-4d10-97ac-5257fd65ba84

📥 Commits

Reviewing files that changed from the base of the PR and between f4744a1 and ffe57d9.

⛔ Files ignored due to path filters (6)
  • packages/gql/src/generated/Types.cs is excluded by !**/generated/**
  • packages/gql/src/generated/Types.kt is excluded by !**/generated/**
  • packages/gql/src/generated/Types.swift is excluded by !**/generated/**
  • packages/gql/src/generated/types.dart is excluded by !**/generated/**
  • packages/gql/src/generated/types.gd is excluded by !**/generated/**
  • packages/gql/src/generated/types.ts is excluded by !**/generated/**
📒 Files selected for processing (31)
  • knowledge/_claude-context/context.md
  • knowledge/external/storekit2-api.md
  • libraries/expo-iap/plugin/src/__tests__/withLocalOpenIAP.test.ts
  • libraries/expo-iap/src/modules/ios.ts
  • libraries/expo-iap/src/types.ts
  • libraries/flutter_inapp_purchase/lib/types.dart
  • libraries/godot-iap/addons/godot-iap/godot_iap.gd
  • libraries/godot-iap/addons/godot-iap/types.gd
  • libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt
  • libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/BillingQueryLifecycleTest.kt
  • libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt
  • libraries/maui-iap/src/OpenIap.Maui/Types.cs
  • libraries/react-native-iap/ios/RnIapHelper.swift
  • libraries/react-native-iap/src/index.ts
  • libraries/react-native-iap/src/specs/RnIap.nitro.ts
  • libraries/react-native-iap/src/types.ts
  • packages/apple/Sources/Helpers/StoreKitTypesBridge.swift
  • packages/apple/Sources/Models/Types.swift
  • packages/apple/Sources/OpenIapModule.swift
  • packages/apple/Tests/OpenIapTests.swift
  • packages/apple/Tests/OpenIapTests/AppAccountTokenTests.swift
  • packages/docs/public/llms-full.txt
  • packages/docs/public/llms.txt
  • packages/docs/src/pages/docs/apis/ios/get-app-transaction-ios.tsx
  • packages/docs/src/pages/docs/apis/ios/present-code-redemption-sheet-ios.tsx
  • packages/docs/src/pages/docs/features/offer-code-redemption.tsx
  • packages/docs/src/pages/docs/setup/godot.tsx
  • packages/docs/src/pages/docs/types/ios/app-transaction-ios.tsx
  • packages/docs/src/pages/docs/updates/deprecations.tsx
  • packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt
  • packages/gql/src/api-ios.graphql
📝 Walkthrough

Walkthrough

The PR updates Apple StoreKit flows, adds iOS subscription-period metadata across SDKs, improves Android billing and Horizon handling, isolates Gradle builds, and updates documentation, examples, tests, and verification commands.

Changes

Platform purchase flows

Layer / File(s) Summary
Apple StoreKit purchase flows
packages/apple/Sources/..., packages/apple/Tests/...
Apple purchase handling now supports promoted purchase intents, win-back offers, deterministic entitlement selection, scene-based redemption, and subscription-period mapping.
Cross-platform purchase metadata and API contracts
libraries/*/..., packages/gql/src/...
Platform models now expose and serialize optional iOS subscription periods. Related redemption and promoted-product contracts describe runtime-specific behavior.
Android billing and Horizon integration
packages/google/..., libraries/kmp-iap/...
Suspended-subscription queries use Billing Library feature detection. Horizon initialization requires an Activity and purchase requests require one SKU.
Expo Gradle integration and verification
libraries/expo-iap/plugin/..., packages/google/..., .claude/commands/verify-all.md
Local builds isolate the Google module directory. Verification builds the Expo plugin and regenerates Flutter iOS configuration before tests.
Documentation and example alignment
packages/docs/..., knowledge/..., libraries/*/example/...
Documentation and examples describe nullable redemption results, promoted-product delivery, Horizon initialization, AppTransaction availability, and purchase reconciliation.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant OpenIapModule
  participant PromotedPurchaseIntentOfferStore
  participant StoreKit
  OpenIapModule->>StoreKit: receive promoted purchase intent
  OpenIapModule->>PromotedPurchaseIntentOfferStore: record subscription offer
  OpenIapModule->>PromotedPurchaseIntentOfferStore: take offer for product purchase
  OpenIapModule->>StoreKit: create purchase options with win-back offer
  OpenIapModule->>StoreKit: present redemption sheet
Loading

Possibly related PRs

Suggested labels: 📱 iOS, 🤖 android, 🧪 test

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 23.75% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the primary change: modernization of store API integrations across Apple, Google Play, Horizon, and related frameworks.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/store-api-modernization

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Gate Product.currentEntitlements on the Xcode 26 Swift compiler so Xcode 16.4 builds retain the Transaction.currentEntitlements fallback.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🧹 Nitpick comments (5)
libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt (1)

229-245: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add the required Android suffix to the helper.

availablePurchasesQueryParams is declared in androidMain and is used only by Android code. Rename it to availablePurchasesQueryParamsAndroid and update the subscription query call.

Proposed rename
-internal fun availablePurchasesQueryParams(
+internal fun availablePurchasesQueryParamsAndroid(
...
-                    val params = availablePurchasesQueryParams(
+                    val params = availablePurchasesQueryParamsAndroid(

As per coding guidelines: “Use IOS and Android as platform suffixes, never as prefixes.”

Also applies to: 1793-1797

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt`
around lines 229 - 245, Rename the Android-only helper
availablePurchasesQueryParams to availablePurchasesQueryParamsAndroid, and
update the subscription query call site that invokes it to use the new name.
Preserve the existing parameter handling and builder behavior.

Source: Coding guidelines

libraries/expo-iap/plugin/src/__tests__/withLocalOpenIAP.test.ts (1)

25-27: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Assert that the build-directory assignment is scoped to :openiap-google.

The Groovy test checks only the assignment text. The Kotlin test checks the project name and assignment independently. Neither test proves that both lines are in the same project block.

Use a scoped regular expression or an exact block assertion for both DSL variants.

Proposed assertion
-    expect(result).toContain(
-      'layout.buildDirectory.set(rootProject.layout.buildDirectory.dir("openiap-google"))',
-    );
+    expect(result).toMatch(
+      /project\(":openiap-google"\)\s*\{\s*layout\.buildDirectory\.set\(rootProject\.layout\.buildDirectory\.dir\("openiap-google"\)\)\s*\}/,
+    );

Also applies to: 44-47

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@libraries/expo-iap/plugin/src/__tests__/withLocalOpenIAP.test.ts` around
lines 25 - 27, Update the assertions in withLocalOpenIAP tests for both Groovy
and Kotlin DSL variants to verify that the project identifier :openiap-google
and the build-directory assignment occur within the same project block. Replace
the independent text checks with a scoped regular expression or exact block
assertion while preserving coverage of both DSL formats.
packages/apple/Tests/OpenIapTests.swift (1)

48-82: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use the IOS suffix for these iOS tests.

Rename the tests to end with IOS. For example, use testEntitlementSelectionUsesLatestDateThenTransactionIdIOS and testPromotedPurchaseIntentOfferIsProductScopedAndOneShotIOS.

As per coding guidelines, “iOS functions must end with the IOS suffix.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/apple/Tests/OpenIapTests.swift` around lines 48 - 82, Rename the
test methods testEntitlementSelectionUsesLatestDateThenTransactionId and
testPromotedPurchaseIntentOfferIsProductScopedAndOneShot to append the IOS
suffix, preserving their existing test logic.

Source: Coding guidelines

packages/apple/Sources/Helpers/StoreKitTypesBridge.swift (1)

383-387: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add IOS suffixes to Apple-only helpers.

These helpers accept StoreKit types or run only on iOS. Rename them to follow the platform naming rule.

  • packages/apple/Sources/Helpers/StoreKitTypesBridge.swift#L383-L387: Rename purchaseOptions to purchaseOptionsIOS.
  • packages/apple/Sources/Helpers/StoreKitTypesBridge.swift#L769-L795: Rename standardizedDiscountOfferType and purchaseOfferTypeString with IOS suffixes.
  • packages/apple/Sources/OpenIapModule.swift#L141-L142: Update the listener call after renaming.
  • packages/apple/Sources/OpenIapModule.swift#L1782-L1807: Rename startPromotedPurchaseIntentListenerIfAvailable to end with IOS.

As per coding guidelines, “iOS functions must end with the IOS suffix.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/apple/Sources/Helpers/StoreKitTypesBridge.swift` around lines 383 -
387, Rename purchaseOptions to purchaseOptionsIOS in
packages/apple/Sources/Helpers/StoreKitTypesBridge.swift at lines 383-387, and
rename standardizedDiscountOfferType and purchaseOfferTypeString with IOS
suffixes at lines 769-795. Update the corresponding listener call in
packages/apple/Sources/OpenIapModule.swift at lines 141-142, and rename
startPromotedPurchaseIntentListenerIfAvailable to an IOS-suffixed name at lines
1782-1807, updating its references consistently.

Source: Coding guidelines

libraries/react-native-iap/ios/RnIapHelper.swift (1)

132-137: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add the IOS suffix to the new iOS helper functions.

Rename wrapSubscriptionPeriodValue to wrapSubscriptionPeriodValueIOS and convertSubscriptionPeriodValue to convertSubscriptionPeriodValueIOS. Update the call in convertAdvancedCommerceInfo.

As per coding guidelines, iOS functions in *.swift files must end with the IOS suffix.

Proposed rename
-static func wrapSubscriptionPeriodValue(
+static func wrapSubscriptionPeriodValueIOS(
@@
-                convertSubscriptionPeriodValue(dictionary["period"])
+                convertSubscriptionPeriodValueIOS(dictionary["period"])
@@
-    static func convertSubscriptionPeriodValue(_ value: Any?) -> SubscriptionPeriodValueIOS? {
+    static func convertSubscriptionPeriodValueIOS(_ value: Any?) -> SubscriptionPeriodValueIOS? {

Also applies to: 195-205

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@libraries/react-native-iap/ios/RnIapHelper.swift` around lines 132 - 137,
Rename the Swift helpers wrapSubscriptionPeriodValue and
convertSubscriptionPeriodValue to wrapSubscriptionPeriodValueIOS and
convertSubscriptionPeriodValueIOS, respectively. Update all references,
including the calls within convertAdvancedCommerceInfo, so the iOS helper
functions consistently use the IOS suffix.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@knowledge/external/storekit2-api.md`:
- Around line 84-92: Update the GraphQL-facing iOS API declaration for
presentCodeRedemptionSheetIOS from non-null PurchaseIOS to nullable PurchaseIOS,
then regenerate or manually synchronize the corresponding generated GraphQL
types and other generated SDKs. Preserve the existing field name and PurchaseIOS
mapping.
- Line 375: Split the “AppTransaction Updates” documentation into sections
matching API availability: keep fields available in Xcode 16.4+ separate from
revocationDate and storeType under an Xcode 27 SDK-only heading. Update the
examples and explanatory text accordingly, then regenerate
knowledge/_claude-context/context.md so it reflects the revised headings and
content.

In `@libraries/godot-iap/addons/godot-iap/godot_iap.gd`:
- Around line 1344-1345: Update the return documentation near the Godot IAP
purchase method to describe all implemented outcomes: return Types.PurchaseIOS
on successful supported requests, and return null for unsupported platforms or
native requests, missing or invalid purchaseJson, and other failures, including
when the system sheet cannot provide the transaction directly.

In `@libraries/react-native-iap/ios/RnIapHelper.swift`:
- Around line 205-213: Update convertSubscriptionPeriodValue to validate
periodValue before constructing SubscriptionPeriodValueIOS: reject non-finite
values and any fractional value, accepting only values representable by the
integer contract. Keep returning nil for invalid payloads and preserve the
existing unit and valid-integer conversion flow.

In `@packages/docs/src/pages/docs/apis/ios/present-code-redemption-sheet-ios.tsx`:
- Around line 31-40: Correct the Mac Catalyst contract throughout the redemption
documentation: in
packages/docs/src/pages/docs/apis/ios/present-code-redemption-sheet-ios.tsx at
lines 31-40, 80-83, and 94, describe AppStore.presentOfferCodeRedeemSheet(in:)
as throwing StoreKitError.unknown and
SKPaymentQueue.presentCodeRedemptionSheet() as having no effect rather than a
successful nil-returning path, and update examples with explicit error or
unsupported handling. Apply the corresponding contract and example updates in
packages/docs/src/pages/docs/features/offer-code-redemption.tsx at lines 29-31
and 94-100, packages/docs/src/pages/docs/updates/deprecations.tsx at line 82,
and packages/docs/public/llms-full.txt at lines 1463-1465.

In `@packages/docs/src/pages/docs/setup/godot.tsx`:
- Around line 126-130: Update the StoreKit offer-code documentation near the
Xcode 27 build guidance to state both requirements: the framework must be built
with Xcode 27 or later and run on an Apple OS 27 or later runtime. Explicitly
preserve the behavior that older runtimes return null even when using an Xcode
27 build, and distinguish runtime requirements from SDK or device-version
references.

In `@packages/docs/src/pages/docs/types/ios/app-transaction-ios.tsx`:
- Around line 139-153: Update the appTransactionID and originalPlatform
descriptions in
packages/docs/src/pages/docs/types/ios/app-transaction-ios.tsx:139-153 to state
their platform-specific runtime floors (iOS 18.4, macOS 15.4, tvOS 18.4, watchOS
11.4, visionOS 2.4) and Xcode 16.4+ back-deployment, keeping the
originalPlatform compatibility modifier clear. Apply the same qualification to
both fields in
packages/docs/src/pages/docs/apis/ios/get-app-transaction-ios.tsx:120-121. In
packages/docs/public/llms-full.txt:1752, keep the heading’s Xcode requirement
separate from the per-field platform runtime-floor notes.

In `@packages/docs/src/pages/docs/types/purchase.tsx`:
- Around line 540-545: Update the generated machine-readable reference in
llms-full.txt for Advanced Commerce API (iOS 18.4+) to include
AdvancedCommerceInfoIOS.period with its optional subscription period unit and
value description, keeping it consistent with the rendered type documentation.

---

Nitpick comments:
In `@libraries/expo-iap/plugin/src/__tests__/withLocalOpenIAP.test.ts`:
- Around line 25-27: Update the assertions in withLocalOpenIAP tests for both
Groovy and Kotlin DSL variants to verify that the project identifier
:openiap-google and the build-directory assignment occur within the same project
block. Replace the independent text checks with a scoped regular expression or
exact block assertion while preserving coverage of both DSL formats.

In
`@libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt`:
- Around line 229-245: Rename the Android-only helper
availablePurchasesQueryParams to availablePurchasesQueryParamsAndroid, and
update the subscription query call site that invokes it to use the new name.
Preserve the existing parameter handling and builder behavior.

In `@libraries/react-native-iap/ios/RnIapHelper.swift`:
- Around line 132-137: Rename the Swift helpers wrapSubscriptionPeriodValue and
convertSubscriptionPeriodValue to wrapSubscriptionPeriodValueIOS and
convertSubscriptionPeriodValueIOS, respectively. Update all references,
including the calls within convertAdvancedCommerceInfo, so the iOS helper
functions consistently use the IOS suffix.

In `@packages/apple/Sources/Helpers/StoreKitTypesBridge.swift`:
- Around line 383-387: Rename purchaseOptions to purchaseOptionsIOS in
packages/apple/Sources/Helpers/StoreKitTypesBridge.swift at lines 383-387, and
rename standardizedDiscountOfferType and purchaseOfferTypeString with IOS
suffixes at lines 769-795. Update the corresponding listener call in
packages/apple/Sources/OpenIapModule.swift at lines 141-142, and rename
startPromotedPurchaseIntentListenerIfAvailable to an IOS-suffixed name at lines
1782-1807, updating its references consistently.

In `@packages/apple/Tests/OpenIapTests.swift`:
- Around line 48-82: Rename the test methods
testEntitlementSelectionUsesLatestDateThenTransactionId and
testPromotedPurchaseIntentOfferIsProductScopedAndOneShot to append the IOS
suffix, preserving their existing test logic.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5aab644e-b857-42d5-8a29-7991f3040ebc

📥 Commits

Reviewing files that changed from the base of the PR and between 8f9c517 and 5a96596.

⛔ Files ignored due to path filters (6)
  • packages/gql/src/generated/Types.cs is excluded by !**/generated/**
  • packages/gql/src/generated/Types.kt is excluded by !**/generated/**
  • packages/gql/src/generated/Types.swift is excluded by !**/generated/**
  • packages/gql/src/generated/types.dart is excluded by !**/generated/**
  • packages/gql/src/generated/types.gd is excluded by !**/generated/**
  • packages/gql/src/generated/types.ts is excluded by !**/generated/**
📒 Files selected for processing (66)
  • .claude/commands/verify-all.md
  • knowledge/_claude-context/context.md
  • knowledge/external/google-billing-api.md
  • knowledge/external/horizon-api.md
  • knowledge/external/storekit2-api.md
  • libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt
  • libraries/expo-iap/example/__tests__/offer-code.test.tsx
  • libraries/expo-iap/example/app/offer-code.tsx
  • libraries/expo-iap/plugin/src/__tests__/withLocalOpenIAP.test.ts
  • libraries/expo-iap/plugin/src/withLocalOpenIAP.ts
  • libraries/expo-iap/src/modules/ios.ts
  • libraries/expo-iap/src/types.ts
  • libraries/flutter_inapp_purchase/example/lib/src/screens/offer_code_screen.dart
  • libraries/flutter_inapp_purchase/lib/types.dart
  • libraries/flutter_inapp_purchase/test/ios_methods_test.dart
  • libraries/godot-iap/Example/tests/test_types_only.gd
  • libraries/godot-iap/addons/godot-iap/godot_iap.gd
  • libraries/godot-iap/addons/godot-iap/types.gd
  • libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/OfferCodeScreen.kt
  • libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt
  • libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/BillingQueryLifecycleTest.kt
  • libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt
  • libraries/kmp-iap/library/src/iosTest/kotlin/io/github/hyochan/kmpiap/ProductPayloadNormalizerTestIOS.kt
  • libraries/maui-iap/example/OpenIap.Maui.Example/Pages/OfferCodePage.xaml.cs
  • libraries/maui-iap/src/OpenIap.Maui/Types.cs
  • libraries/maui-iap/tests/OpenIap.Maui.Tests/RecordJsonTests.cs
  • libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt
  • libraries/react-native-iap/example/screens/OfferCode.tsx
  • libraries/react-native-iap/ios/RnIapHelper.swift
  • libraries/react-native-iap/src/index.ts
  • libraries/react-native-iap/src/specs/RnIap.nitro.ts
  • libraries/react-native-iap/src/types.ts
  • packages/apple/Example/OpenIapExample/Screens/OfferCodeScreen.swift
  • packages/apple/Example/OpenIapExample/Screens/uis/TestingNotesCard.swift
  • packages/apple/Sources/Helpers/IapState.swift
  • packages/apple/Sources/Helpers/StoreKitTypesBridge.swift
  • packages/apple/Sources/Models/Types.swift
  • packages/apple/Sources/OpenIapModule.swift
  • packages/apple/Tests/OpenIapTests.swift
  • packages/docs/public/llms-full.txt
  • packages/docs/public/llms.txt
  • packages/docs/src/lib/searchData.ts
  • packages/docs/src/pages/docs/apis/index.tsx
  • packages/docs/src/pages/docs/apis/init-connection.tsx
  • packages/docs/src/pages/docs/apis/ios/current-entitlement-ios.tsx
  • packages/docs/src/pages/docs/apis/ios/get-app-transaction-ios.tsx
  • packages/docs/src/pages/docs/apis/ios/get-promoted-product-ios.tsx
  • packages/docs/src/pages/docs/apis/ios/present-code-redemption-sheet-ios.tsx
  • packages/docs/src/pages/docs/events/ios/promoted-product-listener-ios.tsx
  • packages/docs/src/pages/docs/features/offer-code-redemption.tsx
  • packages/docs/src/pages/docs/foundation/one-pager.tsx
  • packages/docs/src/pages/docs/setup/godot.tsx
  • packages/docs/src/pages/docs/types/ios/app-transaction-ios.tsx
  • packages/docs/src/pages/docs/types/purchase.tsx
  • packages/docs/src/pages/docs/updates/deprecations.tsx
  • packages/google/build.gradle.kts
  • packages/google/openiap/build.gradle.kts
  • packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt
  • packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt
  • packages/google/openiap/src/play/java/dev/hyo/openiap/helpers/Helpers.kt
  • packages/google/openiap/src/testHorizon/java/dev/hyo/openiap/HorizonPurchaseSafetyTest.kt
  • packages/google/openiap/src/testPlay/java/dev/hyo/openiap/QueryPurchasesRaceTest.kt
  • packages/gql/src/api-ios.graphql
  • packages/gql/src/event.graphql
  • packages/gql/src/type-ios.graphql
  • scripts/agent/compile-context.ts

Comment thread knowledge/external/storekit2-api.md
Comment thread knowledge/external/storekit2-api.md Outdated
Comment thread libraries/godot-iap/addons/godot-iap/godot_iap.gd Outdated
Comment thread libraries/react-native-iap/ios/RnIapHelper.swift Outdated
Comment thread packages/docs/src/pages/docs/apis/ios/present-code-redemption-sheet-ios.tsx Outdated
Comment thread packages/docs/src/pages/docs/setup/godot.tsx Outdated
Comment thread packages/docs/src/pages/docs/types/ios/app-transaction-ios.tsx Outdated
Comment thread packages/docs/src/pages/docs/types/purchase.tsx
Validate native bridge inputs, apply platform naming conventions, document Catalyst and toolchain behavior accurately, and regenerate synchronized contracts and context.
@hyochan
hyochan merged commit 8152913 into main Aug 9, 2026
28 checks passed
@hyochan
hyochan deleted the fix/store-api-modernization branch August 9, 2026 16:07
@coderabbitai coderabbitai Bot mentioned this pull request Aug 17, 2026
9 of 10 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🛠 bugfix All kinds of bug fixes 💨 ci Cloud integration cross-platform Cross-platform (both Android & iOS) 📖 documentation Improvements or additions to documentation 🚽 migration Activities due to changes in framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant