#88 Continuation: Make AcceleratedCheckouts.Configuration Sendable#274
Merged
kieran-osgood-shopify merged 1 commit intoJun 16, 2026
Conversation
This was referenced Jun 11, 2026
Merged
Contributor
Author
6a7cd0d to
8467a9d
Compare
8467a9d to
96088b4
Compare
c1ee065 to
50f73e7
Compare
50f73e7 to
230c9ac
Compare
a57ebf5 to
91a4072
Compare
91a4072 to
9c3861b
Compare
efdbeec to
71fa876
Compare
9c3861b to
877d467
Compare
71fa876 to
f769683
Compare
877d467 to
f8cfa26
Compare
f769683 to
94c8089
Compare
06180b5 to
db6d494
Compare
d4cc791 to
592b689
Compare
db6d494 to
297b04a
Compare
592b689 to
e723503
Compare
297b04a to
40fc6e7
Compare
aa15323 to
2ae6a1e
Compare
40fc6e7 to
57b8638
Compare
markmur
approved these changes
Jun 16, 2026
kieran-osgood-shopify
added a commit
that referenced
this pull request
Jun 16, 2026
### What changes are you making? > [!IMPORTANT] > When reviewing, consider these changes alongside the ones in #274. > #88 highlighted an issue with ObservableObjects + Swift Concurrency that makes it awkward from a library perspective. > To head off future issues and to encourage consistency in the API, I've added #274 as a recommended but not "essential" step in the Swift 6 migration This PR makes the Storefront/GraphQL checkout path safe to use from Swift concurrency contexts by tightening Sendable boundaries around the Storefront client, cache, request/response values, and test doubles. > [!WARNING] > This intentionally includes a breaking Swift API change: `ShopifyAcceleratedCheckouts.Customer` is now a `Sendable` value type instead of an `ObservableObject` class. > > `Customer` is checkout identity data, not independently-owned UI state. Modeling it as an immutable struct matches normal Swift/SwiftUI patterns: app/configuration state owns and publishes values, while async/network code receives safe value snapshots. Consumers should continue to observe the configuration object and assign a new customer value when inputs change: ```swift @StateObject private var configuration = ShopifyAcceleratedCheckouts.Configuration( storefrontDomain: EnvironmentVariables.storefrontDomain, storefrontAccessToken: EnvironmentVariables.storefrontAccessToken ) configuration.customer = ShopifyAcceleratedCheckouts.Customer( email: email.isEmpty ? nil : email, phoneNumber: phone.isEmpty ? nil : phone ) ``` The sample app was updated to use this pattern in: ```text platforms/swift/Samples/ShopifyAcceleratedCheckoutsApp/ShopifyAcceleratedCheckoutsApp/ShopifyAcceleratedCheckoutsApp.swift ``` This removes the need for an internal `CustomerIdentity` wrapper and lets Storefront cart creation accept `Customer?` directly. ### How to test Validated locally: - `dev swift test` - `dev swift lint` - `dev swift api check` - `dev swift build samples` --- ### Before you merge > [!IMPORTANT] > > - [x] I've added tests to support my implementation > - [ ] I have read and agree with the [Contribution Guidelines](./CONTRIBUTING.md) > - [ ] I have read and agree with the [Code of Conduct](./CODE_OF_CONDUCT.md) > - [ ] I've updated the relevant platform README (`platforms/swift/README.md` and/or `platforms/android/README.md`) --- <details> <summary>Releasing a new Swift version?</summary> - [ ] I have bumped the version in `platforms/swift/ShopifyCheckoutKit.podspec` - [ ] I have bumped the version in `platforms/swift/Sources/ShopifyCheckoutKit/ShopifyCheckoutKit.swift` - [ ] I have updated `platforms/swift/CHANGELOG.md` - [ ] I have updated the SwiftPM/CocoaPods version snippets in `platforms/swift/README.md` (major version only) </details> <details> <summary>Releasing a new Android version?</summary> - [ ] I have bumped the `versionName` in `platforms/android/lib/build.gradle` - [ ] I have updated `platforms/android/CHANGELOG.md` - [ ] I have updated the Gradle/Maven version snippets in `platforms/android/README.md` </details> > [!TIP] > See the [Contributing documentation](./CONTRIBUTING.md) for the full release process per platform.
2ae6a1e to
de1cc5b
Compare
57b8638 to
f4f109d
Compare
f4f109d to
2d5f5d7
Compare
Contributor
Author
Merge activity
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

What changes are you making?
This is an optional, but encouraged step towards API consistency and preventing future incompatibility issues, following on from #88.
#88 migrated the Customer from ObservableObject to struct, so that internal app wiring was simpler.
#274 makes the parent objects of Customer (Configuration -> AcceleratedCheckoutsConfiguration -> Customer) all structs.
This helps simplify our library code, as well as reduce the public maintenance contract (including easing the mental overhead of understanding what the library is doing) when we are in a strict concurrency world.
Warning
This is a breaking change to the V3 API
The breaking change will mean changing two statements:


How to test
Before you merge
Important
platforms/swift/README.mdand/orplatforms/android/README.md)Releasing a new Swift version?
ShopifyCheckoutKit.podspecplatforms/swift/Sources/ShopifyCheckoutKit/ShopifyCheckoutKit.swiftplatforms/swift/CHANGELOG.mdplatforms/swift/README.md(major version only)Releasing a new Android version?
versionNameinplatforms/android/lib/build.gradleplatforms/android/CHANGELOG.mdplatforms/android/README.mdTip
See the Contributing documentation for the full release process per platform.