Skip to content

AC Storefront: GraphQL values Sendable#88

Merged
kieran-osgood-shopify merged 1 commit into
mainfrom
kieran-osgood/swift6/storefront-sendable-cache
Jun 16, 2026
Merged

AC Storefront: GraphQL values Sendable#88
kieran-osgood-shopify merged 1 commit into
mainfrom
kieran-osgood/swift6/storefront-sendable-cache

Conversation

@kieran-osgood-shopify

@kieran-osgood-shopify kieran-osgood-shopify commented May 13, 2026

Copy link
Copy Markdown
Contributor

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:

@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:

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

  • I've added tests to support my implementation
  • I have read and agree with the Contribution Guidelines
  • I have read and agree with the Code of Conduct
  • I've updated the relevant platform README (platforms/swift/README.md and/or platforms/android/README.md)

Releasing a new Swift version?
  • 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)
Releasing a new Android version?
  • 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

Tip

See the Contributing documentation for the full release process per platform.

@github-actions

github-actions Bot commented Jun 10, 2026

Copy link
Copy Markdown

React Native — Coverage Report

Lines Statements Branches Functions
Coverage: 92%
91.66% (319/348) 87.86% (181/206) 100% (82/82)

@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch from aecdfa8 to a2a8f7d Compare June 11, 2026 08:54
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/generated-model-sendable branch from 08574c6 to 92ab70f Compare June 11, 2026 08:54
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch 2 times, most recently from 3dce64e to 3dbd021 Compare June 11, 2026 10:01
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/generated-model-sendable branch 2 times, most recently from 65f806c to 5678177 Compare June 11, 2026 10:23
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch from 3dbd021 to 3afa77a Compare June 11, 2026 10:23
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/generated-model-sendable branch from 5678177 to 679b65c Compare June 11, 2026 10:32
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch from 3afa77a to 37a6f41 Compare June 11, 2026 10:32
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/generated-model-sendable branch from 679b65c to d8af537 Compare June 11, 2026 13:08
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch 3 times, most recently from 70f862a to c1ee065 Compare June 11, 2026 15:57
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch 2 times, most recently from 3cd64d0 to 6ca3a7c Compare June 15, 2026 09:13

if [[ "$MODE" == "fix" ]]; then
$SWIFTLINT lint --fix --no-cache $QUIET_FLAG
(cd "$PROJECT_ROOT" && $SWIFTLINT lint --fix --no-cache $QUIET_FLAG)

@kieran-osgood-shopify kieran-osgood-shopify Jun 15, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

the script appears to have been running from the wrong dir - which means the .swiftlint paths were resolving the wrong paths - I had tons of file changes as a result on generated files

@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch from 6ca3a7c to efdbeec Compare June 15, 2026 13:17
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/generated-model-sendable branch 2 times, most recently from 0fb8d20 to cc14713 Compare June 15, 2026 13:35
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch from efdbeec to 71fa876 Compare June 15, 2026 13:35
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/generated-model-sendable branch from cc14713 to f5f36ff Compare June 15, 2026 13:49
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch from 71fa876 to f769683 Compare June 15, 2026 13:50
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/generated-model-sendable branch 2 times, most recently from accb183 to 9054752 Compare June 15, 2026 14:07
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch from f769683 to 94c8089 Compare June 15, 2026 14:07
@kieran-osgood-shopify kieran-osgood-shopify changed the base branch from kieran-osgood/swift6/generated-model-sendable to graphite-base/88 June 15, 2026 14:10
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch from 94c8089 to d4cc791 Compare June 15, 2026 14:39
@kieran-osgood-shopify kieran-osgood-shopify changed the base branch from graphite-base/88 to kieran-osgood/swift6/generated-model-sendable June 15, 2026 14:39
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/generated-model-sendable branch from 1cb7220 to ba1bee5 Compare June 16, 2026 08:49
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch 2 times, most recently from 592b689 to e723503 Compare June 16, 2026 09:07
@kieran-osgood-shopify kieran-osgood-shopify changed the base branch from kieran-osgood/swift6/generated-model-sendable to graphite-base/88 June 16, 2026 10:40
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch from e723503 to aa15323 Compare June 16, 2026 10:40
@graphite-app graphite-app Bot changed the base branch from graphite-base/88 to main June 16, 2026 10:41
@kieran-osgood-shopify kieran-osgood-shopify force-pushed the kieran-osgood/swift6/storefront-sendable-cache branch from aa15323 to 2ae6a1e Compare June 16, 2026 10:41
@kieran-osgood-shopify kieran-osgood-shopify merged commit de1cc5b into main Jun 16, 2026
24 checks passed

Copy link
Copy Markdown
Contributor Author

Merge activity

@kieran-osgood-shopify kieran-osgood-shopify deleted the kieran-osgood/swift6/storefront-sendable-cache branch June 16, 2026 10:54
kieran-osgood-shopify added a commit that referenced this pull request Jun 16, 2026
)

### 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:
![image.png](https://app.graphite.com/user-attachments/assets/a294caf0-032a-439f-a894-4d22691a2cbe.png)
![image.png](https://app.graphite.com/user-attachments/assets/f01af7ac-876f-4a1f-99c0-ca41901477a0.png)


### How to test

<!-- Please outline the steps to test your changes -->

---

### Before you merge

> [!IMPORTANT]
>
> - [ ] 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 `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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

#gsd:50662 Rebase Checkout Kit on UCP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants