✨ app: add wallet extension infrastructure#1155
Conversation
🦋 Changeset detectedLatest commit: a10eea3 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughAdds Apple Wallet issuer and authorization extensions with shared native storage, MPP provisioning integration, generated wallet assets, and Expo iOS/Android build configuration. ChangesWallet provisioning
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant AppRegistry
participant ExaIssuerExtensionHandler
participant WalletExtensionStorage
participant ProvisioningAPI
participant MeaPushProvisioning
AppRegistry->>ExaIssuerExtensionHandler: Render issuer extension
ExaIssuerExtensionHandler->>WalletExtensionStorage: Load token and snapshot
ExaIssuerExtensionHandler->>ProvisioningAPI: Fetch provisioning secrets
ExaIssuerExtensionHandler->>MeaPushProvisioning: Initialize Apple Pay tokenization
MeaPushProvisioning-->>ExaIssuerExtensionHandler: Return tokenization data
ExaIssuerExtensionHandler-->>AppRegistry: Return eligible card entry
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
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. Comment |
There was a problem hiding this comment.
Code Review
This pull request integrates MeaWallet configurations and introduces a new shared storage module (WalletExtensionStorage) along with iOS wallet extensions. Feedback on the changes highlights several critical issues: a potential runtime crash in issuerNonUIExtension.ts when accessing properties on a null snapshot, a potential Objective-C crash in WalletExtensionStorage.m from nil values in a dictionary literal, a fragile string matching check in app.config.ts that could duplicate pod insertions, a reliability issue with dynamic node execution in pods.rb, and a security risk concerning hardcoded repository credentials in app.config.ts.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
There was a problem hiding this comment.
Actionable comments posted: 5
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 103e84d9-d5e8-47a5-8772-6a397e551874
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (21)
.changeset/rich-months-double.md.npmrcapp.config.tscspell.jsoneas.jsonmodules/wallet-extension-storage/ios/WalletExtensionStorage.mmodules/wallet-extension-storage/ios/WalletExtensionStorage.podspecpackage.jsonpatches/@meawallet__react-native-mpp.patchsrc/assets/mea_configsrc/issuerNonUIExtension.tssrc/utils/walletExtensionStorage.tstargets/ExaWalletAuthExtension/ExaWalletAuthExtension.entitlementstargets/ExaWalletAuthExtension/ExaWalletAuthExtension.swifttargets/ExaWalletAuthExtension/Info.plisttargets/ExaWalletAuthExtension/expo-target.config.jstargets/ExaWalletExtension/ExaWalletExtension.entitlementstargets/ExaWalletExtension/ExaWalletExtension.mtargets/ExaWalletExtension/Info.plisttargets/ExaWalletExtension/expo-target.config.jstargets/ExaWalletExtension/pods.rb
There was a problem hiding this comment.
Actionable comments posted: 6
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 98592aef-5cf4-45c7-a176-18390e73da4f
📒 Files selected for processing (16)
app.config.tsmodules/wallet-extension-storage/ios/WalletExtensionStorage.mmodules/wallet-extension-storage/ios/WalletExtensionStorage.podspecpackage.jsonpatches/@meawallet__react-native-mpp.patchsrc/issuerNonUIExtension.tssrc/utils/walletExtensionStorage.tstargets/ExaWalletAuthExtension/ExaWalletAuthExtension.entitlementstargets/ExaWalletAuthExtension/ExaWalletAuthExtension.swifttargets/ExaWalletAuthExtension/Info.plisttargets/ExaWalletAuthExtension/expo-target.config.jstargets/ExaWalletExtension/ExaWalletExtension.entitlementstargets/ExaWalletExtension/ExaWalletExtension.mtargets/ExaWalletExtension/Info.plisttargets/ExaWalletExtension/expo-target.config.jstargets/ExaWalletExtension/pods.rb
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
src/utils/walletExtensionStorage.ts (1)
26-44: 🛠️ Refactor suggestion | 🟠 MajorShorten the storage helper names and drop the object unpacking.
As per coding guidelines, do not repeat the module name in its members and avoid unpacking fields only to pass them individually. This was flagged in a previous review.
src/utils/walletExtensionStorage.ts#L26-L44: Rename these exports toclear,saveToken,saveSnapshot,getToken, andgetSnapshot. Passtokenandexpireas separate arguments instead of an object.src/issuerNonUIExtension.ts#L11-L11: Update the imports to use the shortened names.src/issuerNonUIExtension.ts#L103-L104: Call the updated functions.♻️ Proposed refactor for the storage utilities
-export function clearWalletExtensionStorage() { +export function clear() { return native?.clearWalletExtensionStorage() ?? Promise.resolve(); } -export function saveWalletExtensionToken({ token, expire }: { expire: number; token: string }) { +export function saveToken(token: string, expire: number) { return native?.saveWalletExtensionToken(token, expire) ?? Promise.resolve(); } -export function saveCardProvisioningSnapshot(snapshot: CardProvisioningSnapshot) { +export function saveSnapshot(snapshot: CardProvisioningSnapshot) { return native?.saveCardProvisioningSnapshot(snapshot) ?? Promise.resolve(); } -export function getWalletExtensionToken() { +export function getToken() { return native?.getWalletExtensionToken() ?? Promise.resolve(null); } -export function getCardProvisioningSnapshot() { +export function getSnapshot() { return native?.getCardProvisioningSnapshot() ?? Promise.resolve(null); }Source: Coding guidelines
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 4ade7f83-e7c1-45c5-9d29-59a980bdc6bf
📒 Files selected for processing (16)
app.config.tsmodules/wallet-extension-storage/ios/WalletExtensionStorage.mmodules/wallet-extension-storage/ios/WalletExtensionStorage.podspecpackage.jsonpatches/@meawallet__react-native-mpp.patchsrc/issuerNonUIExtension.tssrc/utils/walletExtensionStorage.tstargets/ExaWalletAuthExtension/ExaWalletAuthExtension.entitlementstargets/ExaWalletAuthExtension/ExaWalletAuthExtension.swifttargets/ExaWalletAuthExtension/Info.plisttargets/ExaWalletAuthExtension/expo-target.config.jstargets/ExaWalletExtension/ExaWalletExtension.entitlementstargets/ExaWalletExtension/ExaWalletExtension.mtargets/ExaWalletExtension/Info.plisttargets/ExaWalletExtension/expo-target.config.jstargets/ExaWalletExtension/pods.rb
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1155 +/- ##
=======================================
Coverage 72.94% 72.94%
=======================================
Files 254 254
Lines 10747 10747
Branches 3557 3557
=======================================
Hits 7839 7839
Misses 2624 2624
Partials 284 284
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Actionable comments posted: 5
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 3995971a-fa2e-4439-b1c7-18a43912597f
📒 Files selected for processing (16)
app.config.tsmodules/wallet-extension-storage/ios/WalletExtensionStorage.mmodules/wallet-extension-storage/ios/WalletExtensionStorage.podspecpackage.jsonpatches/@meawallet__react-native-mpp.patchsrc/issuerNonUIExtension.tssrc/utils/walletExtensionStorage.tstargets/ExaWalletAuthExtension/ExaWalletAuthExtension.entitlementstargets/ExaWalletAuthExtension/ExaWalletAuthExtension.swifttargets/ExaWalletAuthExtension/Info.plisttargets/ExaWalletAuthExtension/expo-target.config.jstargets/ExaWalletExtension/ExaWalletExtension.entitlementstargets/ExaWalletExtension/ExaWalletExtension.mtargets/ExaWalletExtension/Info.plisttargets/ExaWalletExtension/expo-target.config.jstargets/ExaWalletExtension/pods.rb
Summary
Adds the dependencies, native targets, shared storage bridge, issuer configuration, entitlements, and Expo/Xcode integration required by the Exa Wallet extensions.
The Card-screen provisioning flow is intentionally kept in the dependent provisioning PR.
Commits
Summary by CodeRabbit