@doswiftly/storefront-operations 14.0.0 → 16.0.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/llms-full.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  # DoSwiftly Storefront Operations — Full Reference
2
2
 
3
- > Schema version: **14.0.0**
4
- > 50 queries · 40 mutations · 100 fragments
3
+ > Schema version: **16.0.0**
4
+ > 52 queries · 40 mutations · 102 fragments
5
5
 
6
6
  Auto-generated from `.graphql` source files. Do not edit by hand — this file is
7
7
  regenerated on every release to match the published schema.
@@ -37,6 +37,25 @@ query Shop {
37
37
  }
38
38
  ```
39
39
 
40
+ ### Query: `ShopConfig`
41
+
42
+ **Section**: Shop
43
+
44
+ **Description**: Minimal Shop payload for `<StorefrontProvider shopData={...}>` from `@doswiftly/storefront-sdk/react`. Returns exactly the fields the SDK's `ShopConfig` interface declares — currency setup (with `localeToCurrencyMap` for browser-locale-based currency detection), language setup, and bot protection. Cache for the session; refetch when the merchant updates currency / language settings or you want to pick up new bot-protection rules.
45
+
46
+ **Variables**: none
47
+
48
+ **Fragments used**: `ShopConfigFields`
49
+
50
+ **GraphQL**:
51
+ ```graphql
52
+ query ShopConfig {
53
+ shop {
54
+ ...ShopConfigFields
55
+ }
56
+ }
57
+ ```
58
+
40
59
  ### Query: `Product`
41
60
 
42
61
  **Section**: Products
@@ -410,6 +429,33 @@ query CustomerProfile {
410
429
  }
411
430
  ```
412
431
 
432
+ ### Query: `CustomerAddresses`
433
+
434
+ **Section**: Customer (requires auth)
435
+
436
+ **Description**: Authenticated customer's saved address book — used on checkout to let the buyer pick a previously-used shipping / billing address instead of typing it. Each entry carries B2B invoicing fields (`taxId`, `vatNumber`) and the `isDefault` flag so the same list serves both as the shipping picker and as the billing/invoice picker. Returns up to 50 addresses (Relay Connection — buyers rarely keep more); for the unauthenticated case the connection is empty (no error). The default address is also surfaced as `Customer.defaultAddress`.
437
+
438
+ **Variables**: none
439
+
440
+ **Fragments used**: `MailingAddress`, `PageInfo`
441
+
442
+ **GraphQL**:
443
+ ```graphql
444
+ query CustomerAddresses {
445
+ customer {
446
+ addresses(first: 50) {
447
+ nodes {
448
+ ...MailingAddress
449
+ }
450
+ pageInfo {
451
+ ...PageInfo
452
+ }
453
+ totalCount
454
+ }
455
+ }
456
+ }
457
+ ```
458
+
413
459
  ### Query: `CustomerOrder`
414
460
 
415
461
  **Section**: Customer (requires auth)
@@ -2744,11 +2790,29 @@ fragment Category on Category {
2744
2790
  }
2745
2791
  ```
2746
2792
 
2793
+ ### Fragment: `PickupPoint` on `PickupPoint`
2794
+
2795
+ **Section**: Customer
2796
+
2797
+ **Description**: Selected pickup point (parcel locker or collection point) attached to a delivery address. Returned on `MailingAddress.pickupPoint` when the buyer chose a non-home delivery method (`deliveryType` other than `HOME`). Null for home delivery.
2798
+
2799
+ **GraphQL**:
2800
+ ```graphql
2801
+ fragment PickupPoint on PickupPoint {
2802
+ provider
2803
+ pointId
2804
+ name
2805
+ address
2806
+ }
2807
+ ```
2808
+
2747
2809
  ### Fragment: `MailingAddress` on `MailingAddress`
2748
2810
 
2749
2811
  **Section**: Customer
2750
2812
 
2751
- **Description**: Customer mailing address — full street/city/state/country/postal code with names and phone. `isDefault` flips when this address is the default for shipping. Spread on the address book UI and order summaries.
2813
+ **Description**: Customer mailing address — full street/city/state/country/postal code with names and phone. `isDefault` flips when this address is the default for shipping. Carries B2B invoicing fields (`taxId`, `vatNumber`) and the selected `pickupPoint` for parcel locker / collection point deliveries. Spread on the address book UI, checkout shipping/billing forms, and order summaries.
2814
+
2815
+ **Uses fragments**: `PickupPoint`
2752
2816
 
2753
2817
  **GraphQL**:
2754
2818
  ```graphql
@@ -2768,6 +2832,11 @@ fragment MailingAddress on MailingAddress {
2768
2832
  stateCode
2769
2833
  postalCode
2770
2834
  isDefault
2835
+ taxId
2836
+ vatNumber
2837
+ pickupPoint {
2838
+ ...PickupPoint
2839
+ }
2771
2840
  }
2772
2841
  ```
2773
2842
 
@@ -2870,7 +2939,7 @@ fragment Order on Order {
2870
2939
 
2871
2940
  **Section**: Cart
2872
2941
 
2873
- **Description**: Cart-level totals — subtotal, total, tax, duty, checkout charge. Spread inside the `Cart` fragment.
2942
+ **Description**: Cart-level totals — subtotal, total, tax, duty, discount, shipping, checkout charge. Spread inside the `Cart` fragment.
2874
2943
 
2875
2944
  **Uses fragments**: `Money`
2876
2945
 
@@ -2892,6 +2961,12 @@ fragment CartCost on CartCost {
2892
2961
  checkoutCharge {
2893
2962
  ...Money
2894
2963
  }
2964
+ totalDiscount {
2965
+ ...Money
2966
+ }
2967
+ totalShipping {
2968
+ ...Money
2969
+ }
2895
2970
  }
2896
2971
  ```
2897
2972
 
@@ -3097,6 +3172,15 @@ fragment Cart on Cart {
3097
3172
  requiresShipping
3098
3173
  createdAt
3099
3174
  updatedAt
3175
+ status
3176
+ completedOrder {
3177
+ id
3178
+ orderNumber
3179
+ accessToken
3180
+ status
3181
+ paymentStatus
3182
+ fulfillmentStatus
3183
+ }
3100
3184
  }
3101
3185
  ```
3102
3186
 
@@ -3123,13 +3207,14 @@ fragment CartShippingMethod on CartShippingMethod {
3123
3207
 
3124
3208
  **Section**: Cart
3125
3209
 
3126
- **Description**: Gift card applied to a cart — masked code for display, last 4 chars for matching, applied amount + remaining balance. Balance NIE debited yet — actual deduction atomically at `cartComplete`.
3210
+ **Description**: Gift card applied to a cart — `id` is the stable handle the storefront passes to `cartRemoveGiftCard` (no need to keep the raw code around). Plus masked code for display, last 4 chars for matching, applied amount + remaining balance. Balance NIE debited yet — actual deduction atomically at `cartComplete`.
3127
3211
 
3128
3212
  **Uses fragments**: `Money`
3129
3213
 
3130
3214
  **GraphQL**:
3131
3215
  ```graphql
3132
3216
  fragment CartAppliedGiftCard on CartAppliedGiftCard {
3217
+ id
3133
3218
  maskedCode
3134
3219
  lastCharacters
3135
3220
  appliedAmount {
@@ -3355,6 +3440,31 @@ fragment Shop on Shop {
3355
3440
  }
3356
3441
  ```
3357
3442
 
3443
+ ### Fragment: `ShopConfigFields` on `Shop`
3444
+
3445
+ **Section**: Shop
3446
+
3447
+ **Description**: Minimal Shop fields consumed by `<StorefrontProvider shopData={...}>` from `@doswiftly/storefront-sdk/react`. Spread this in your `shop` query to get a response shape that matches the SDK `ShopConfig` interface 1:1 — no manual field selection, no drift when the SDK adds optional fields. Use the larger `Shop` fragment when you also need branding / contact / business hours for your UI.
3448
+
3449
+ **Uses fragments**: `BotProtection`
3450
+
3451
+ **GraphQL**:
3452
+ ```graphql
3453
+ fragment ShopConfigFields on Shop {
3454
+ currencyCode
3455
+ supportedCurrencies
3456
+ localeToCurrencyMap {
3457
+ locale
3458
+ currency
3459
+ }
3460
+ defaultLanguage
3461
+ supportedLanguages
3462
+ botProtection {
3463
+ ...BotProtection
3464
+ }
3465
+ }
3466
+ ```
3467
+
3358
3468
  ### Fragment: `PaymentMethod` on `PaymentMethod`
3359
3469
 
3360
3470
  **Section**: Payment Methods
@@ -3772,7 +3882,7 @@ fragment FreeShippingProgress on FreeShippingProgress {
3772
3882
 
3773
3883
  **Section**: Shipping Methods
3774
3884
 
3775
- **Description**: One shipping method offered for the destination + cart — id, name, carrier, price, free-shipping progress, estimated delivery, sort order. Spread on the checkout shipping step.
3885
+ **Description**: One shipping method offered for the destination + cart — id, name, carrier, price, free-shipping progress, estimated delivery, sort order. `deliveryType` signals whether to render a pickup-point / locker picker (`HOME` vs `PICKUP_POINT` / `LOCKER`) so the storefront does not have to infer it from the method name. Spread on the checkout shipping step.
3776
3886
 
3777
3887
  **Uses fragments**: `DeliveryEstimate`, `FreeShippingProgress`, `Money`, `ShippingCarrier`
3778
3888
 
@@ -3782,6 +3892,7 @@ fragment AvailableShippingMethod on AvailableShippingMethod {
3782
3892
  id
3783
3893
  name
3784
3894
  description
3895
+ deliveryType
3785
3896
  carrier {
3786
3897
  ...ShippingCarrier
3787
3898
  }
package/operations.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "schemaVersion": "14.0.0",
2
+ "schemaVersion": "16.0.0",
3
3
  "queries": [
4
4
  {
5
5
  "name": "Shop",
@@ -12,6 +12,17 @@
12
12
  ],
13
13
  "body": "query Shop {\n shop {\n ...Shop\n }\n}"
14
14
  },
15
+ {
16
+ "name": "ShopConfig",
17
+ "kind": "query",
18
+ "section": "Shop",
19
+ "description": "Minimal Shop payload for `<StorefrontProvider shopData={...}>` from `@doswiftly/storefront-sdk/react`. Returns exactly the fields the SDK's `ShopConfig` interface declares — currency setup (with `localeToCurrencyMap` for browser-locale-based currency detection), language setup, and bot protection. Cache for the session; refetch when the merchant updates currency / language settings or you want to pick up new bot-protection rules.",
20
+ "variables": [],
21
+ "fragmentRefs": [
22
+ "ShopConfigFields"
23
+ ],
24
+ "body": "query ShopConfig {\n shop {\n ...ShopConfigFields\n }\n}"
25
+ },
15
26
  {
16
27
  "name": "Product",
17
28
  "kind": "query",
@@ -307,6 +318,18 @@
307
318
  ],
308
319
  "body": "query CustomerProfile {\n customer {\n ...Customer\n }\n}"
309
320
  },
321
+ {
322
+ "name": "CustomerAddresses",
323
+ "kind": "query",
324
+ "section": "Customer (requires auth)",
325
+ "description": "Authenticated customer's saved address book — used on checkout to let the buyer pick a previously-used shipping / billing address instead of typing it. Each entry carries B2B invoicing fields (`taxId`, `vatNumber`) and the `isDefault` flag so the same list serves both as the shipping picker and as the billing/invoice picker. Returns up to 50 addresses (Relay Connection — buyers rarely keep more); for the unauthenticated case the connection is empty (no error). The default address is also surfaced as `Customer.defaultAddress`.",
326
+ "variables": [],
327
+ "fragmentRefs": [
328
+ "MailingAddress",
329
+ "PageInfo"
330
+ ],
331
+ "body": "query CustomerAddresses {\n customer {\n addresses(first: 50) {\n nodes {\n ...MailingAddress\n }\n pageInfo {\n ...PageInfo\n }\n totalCount\n }\n }\n}"
332
+ },
310
333
  {
311
334
  "name": "CustomerOrder",
312
335
  "kind": "query",
@@ -1999,13 +2022,25 @@
1999
2022
  "onType": "Category"
2000
2023
  },
2001
2024
  {
2002
- "name": "MailingAddress",
2025
+ "name": "PickupPoint",
2003
2026
  "kind": "fragment",
2004
2027
  "section": "Customer",
2005
- "description": "Customer mailing address full street/city/state/country/postal code with names and phone. `isDefault` flips when this address is the default for shipping. Spread on the address book UI and order summaries.",
2028
+ "description": "Selected pickup point (parcel locker or collection point) attached to a delivery address. Returned on `MailingAddress.pickupPoint` when the buyer chose a non-home delivery method (`deliveryType` other than `HOME`). Null for home delivery.",
2006
2029
  "variables": [],
2007
2030
  "fragmentRefs": [],
2008
- "body": "fragment MailingAddress on MailingAddress {\n id\n streetLine1\n streetLine2\n city\n company\n country\n countryCode\n firstName\n lastName\n name\n phone\n state\n stateCode\n postalCode\n isDefault\n}",
2031
+ "body": "fragment PickupPoint on PickupPoint {\n provider\n pointId\n name\n address\n}",
2032
+ "onType": "PickupPoint"
2033
+ },
2034
+ {
2035
+ "name": "MailingAddress",
2036
+ "kind": "fragment",
2037
+ "section": "Customer",
2038
+ "description": "Customer mailing address — full street/city/state/country/postal code with names and phone. `isDefault` flips when this address is the default for shipping. Carries B2B invoicing fields (`taxId`, `vatNumber`) and the selected `pickupPoint` for parcel locker / collection point deliveries. Spread on the address book UI, checkout shipping/billing forms, and order summaries.",
2039
+ "variables": [],
2040
+ "fragmentRefs": [
2041
+ "PickupPoint"
2042
+ ],
2043
+ "body": "fragment MailingAddress on MailingAddress {\n id\n streetLine1\n streetLine2\n city\n company\n country\n countryCode\n firstName\n lastName\n name\n phone\n state\n stateCode\n postalCode\n isDefault\n taxId\n vatNumber\n pickupPoint {\n ...PickupPoint\n }\n}",
2009
2044
  "onType": "MailingAddress"
2010
2045
  },
2011
2046
  {
@@ -2048,12 +2083,12 @@
2048
2083
  "name": "CartCost",
2049
2084
  "kind": "fragment",
2050
2085
  "section": "Cart",
2051
- "description": "Cart-level totals — subtotal, total, tax, duty, checkout charge. Spread inside the `Cart` fragment.",
2086
+ "description": "Cart-level totals — subtotal, total, tax, duty, discount, shipping, checkout charge. Spread inside the `Cart` fragment.",
2052
2087
  "variables": [],
2053
2088
  "fragmentRefs": [
2054
2089
  "Money"
2055
2090
  ],
2056
- "body": "fragment CartCost on CartCost {\n total {\n ...Money\n }\n subtotal {\n ...Money\n }\n totalTax {\n ...Money\n }\n totalDuty {\n ...Money\n }\n checkoutCharge {\n ...Money\n }\n}",
2091
+ "body": "fragment CartCost on CartCost {\n total {\n ...Money\n }\n subtotal {\n ...Money\n }\n totalTax {\n ...Money\n }\n totalDuty {\n ...Money\n }\n checkoutCharge {\n ...Money\n }\n totalDiscount {\n ...Money\n }\n totalShipping {\n ...Money\n }\n}",
2057
2092
  "onType": "CartCost"
2058
2093
  },
2059
2094
  {
@@ -2142,7 +2177,7 @@
2142
2177
  "MailingAddress",
2143
2178
  "PageInfo"
2144
2179
  ],
2145
- "body": "fragment Cart on Cart {\n id\n checkoutUrl\n totalQuantity\n cost {\n ...CartCost\n }\n lines(first: 100) {\n edges {\n cursor\n node {\n ... on CartLine {\n ...CartLine\n }\n }\n }\n nodes {\n ... on CartLine {\n ...CartLine\n }\n }\n pageInfo {\n ...PageInfo\n }\n totalCount\n }\n buyerIdentity {\n ...CartBuyerIdentity\n }\n discountCodes {\n ...CartDiscountCode\n }\n discountAllocations {\n ...CartDiscountAllocation\n }\n note\n attributes {\n key\n value\n }\n email\n phone\n shippingAddress {\n ...MailingAddress\n }\n billingAddress {\n ...MailingAddress\n }\n selectedShippingMethod {\n ...CartShippingMethod\n }\n selectedPaymentMethod {\n ...CartSelectedPaymentMethod\n }\n appliedGiftCards {\n ...CartAppliedGiftCard\n }\n requiresShipping\n createdAt\n updatedAt\n}",
2180
+ "body": "fragment Cart on Cart {\n id\n checkoutUrl\n totalQuantity\n cost {\n ...CartCost\n }\n lines(first: 100) {\n edges {\n cursor\n node {\n ... on CartLine {\n ...CartLine\n }\n }\n }\n nodes {\n ... on CartLine {\n ...CartLine\n }\n }\n pageInfo {\n ...PageInfo\n }\n totalCount\n }\n buyerIdentity {\n ...CartBuyerIdentity\n }\n discountCodes {\n ...CartDiscountCode\n }\n discountAllocations {\n ...CartDiscountAllocation\n }\n note\n attributes {\n key\n value\n }\n email\n phone\n shippingAddress {\n ...MailingAddress\n }\n billingAddress {\n ...MailingAddress\n }\n selectedShippingMethod {\n ...CartShippingMethod\n }\n selectedPaymentMethod {\n ...CartSelectedPaymentMethod\n }\n appliedGiftCards {\n ...CartAppliedGiftCard\n }\n requiresShipping\n createdAt\n updatedAt\n status\n completedOrder {\n id\n orderNumber\n accessToken\n status\n paymentStatus\n fulfillmentStatus\n }\n}",
2146
2181
  "onType": "Cart"
2147
2182
  },
2148
2183
  {
@@ -2161,12 +2196,12 @@
2161
2196
  "name": "CartAppliedGiftCard",
2162
2197
  "kind": "fragment",
2163
2198
  "section": "Cart",
2164
- "description": "Gift card applied to a cart — masked code for display, last 4 chars for matching, applied amount + remaining balance. Balance NIE debited yet — actual deduction atomically at `cartComplete`.",
2199
+ "description": "Gift card applied to a cart — `id` is the stable handle the storefront passes to `cartRemoveGiftCard` (no need to keep the raw code around). Plus masked code for display, last 4 chars for matching, applied amount + remaining balance. Balance NIE debited yet — actual deduction atomically at `cartComplete`.",
2165
2200
  "variables": [],
2166
2201
  "fragmentRefs": [
2167
2202
  "Money"
2168
2203
  ],
2169
- "body": "fragment CartAppliedGiftCard on CartAppliedGiftCard {\n maskedCode\n lastCharacters\n appliedAmount {\n ...Money\n }\n remainingBalance {\n ...Money\n }\n}",
2204
+ "body": "fragment CartAppliedGiftCard on CartAppliedGiftCard {\n id\n maskedCode\n lastCharacters\n appliedAmount {\n ...Money\n }\n remainingBalance {\n ...Money\n }\n}",
2170
2205
  "onType": "CartAppliedGiftCard"
2171
2206
  },
2172
2207
  {
@@ -2282,6 +2317,18 @@
2282
2317
  "body": "fragment Shop on Shop {\n id\n name\n description\n primaryDomain {\n host\n url\n isSslEnabled\n }\n currencyCode\n supportedCurrencies\n paymentCurrencies\n defaultLanguage\n supportedLanguages\n logo {\n ...Image\n }\n contactEmail\n contactPhone\n address {\n ...ShopAddress\n }\n businessHours {\n ...BusinessHour\n }\n branding {\n ...ShopBranding\n }\n botProtection {\n ...BotProtection\n }\n}",
2283
2318
  "onType": "Shop"
2284
2319
  },
2320
+ {
2321
+ "name": "ShopConfigFields",
2322
+ "kind": "fragment",
2323
+ "section": "Shop",
2324
+ "description": "Minimal Shop fields consumed by `<StorefrontProvider shopData={...}>` from `@doswiftly/storefront-sdk/react`. Spread this in your `shop` query to get a response shape that matches the SDK `ShopConfig` interface 1:1 — no manual field selection, no drift when the SDK adds optional fields. Use the larger `Shop` fragment when you also need branding / contact / business hours for your UI.",
2325
+ "variables": [],
2326
+ "fragmentRefs": [
2327
+ "BotProtection"
2328
+ ],
2329
+ "body": "fragment ShopConfigFields on Shop {\n currencyCode\n supportedCurrencies\n localeToCurrencyMap {\n locale\n currency\n }\n defaultLanguage\n supportedLanguages\n botProtection {\n ...BotProtection\n }\n}",
2330
+ "onType": "Shop"
2331
+ },
2285
2332
  {
2286
2333
  "name": "PaymentMethod",
2287
2334
  "kind": "fragment",
@@ -2498,7 +2545,7 @@
2498
2545
  "name": "AvailableShippingMethod",
2499
2546
  "kind": "fragment",
2500
2547
  "section": "Shipping Methods",
2501
- "description": "One shipping method offered for the destination + cart — id, name, carrier, price, free-shipping progress, estimated delivery, sort order. Spread on the checkout shipping step.",
2548
+ "description": "One shipping method offered for the destination + cart — id, name, carrier, price, free-shipping progress, estimated delivery, sort order. `deliveryType` signals whether to render a pickup-point / locker picker (`HOME` vs `PICKUP_POINT` / `LOCKER`) so the storefront does not have to infer it from the method name. Spread on the checkout shipping step.",
2502
2549
  "variables": [],
2503
2550
  "fragmentRefs": [
2504
2551
  "DeliveryEstimate",
@@ -2506,7 +2553,7 @@
2506
2553
  "Money",
2507
2554
  "ShippingCarrier"
2508
2555
  ],
2509
- "body": "fragment AvailableShippingMethod on AvailableShippingMethod {\n id\n name\n description\n carrier {\n ...ShippingCarrier\n }\n price {\n ...Money\n }\n isFree\n estimatedDelivery {\n ...DeliveryEstimate\n }\n freeShippingProgress {\n ...FreeShippingProgress\n }\n sortOrder\n}",
2556
+ "body": "fragment AvailableShippingMethod on AvailableShippingMethod {\n id\n name\n description\n deliveryType\n carrier {\n ...ShippingCarrier\n }\n price {\n ...Money\n }\n isFree\n estimatedDelivery {\n ...DeliveryEstimate\n }\n freeShippingProgress {\n ...FreeShippingProgress\n }\n sortOrder\n}",
2510
2557
  "onType": "AvailableShippingMethod"
2511
2558
  },
2512
2559
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doswiftly/storefront-operations",
3
- "version": "14.0.0",
3
+ "version": "16.0.0",
4
4
  "description": "GraphQL operations for DoSwiftly Storefront - SSOT from backend",
5
5
  "homepage": "https://doswiftly.pl",
6
6
  "publishConfig": {
package/queries.graphql CHANGED
@@ -14,6 +14,13 @@ query Shop {
14
14
  }
15
15
  }
16
16
 
17
+ # Minimal Shop payload for `<StorefrontProvider shopData={...}>` from `@doswiftly/storefront-sdk/react`. Returns exactly the fields the SDK's `ShopConfig` interface declares — currency setup (with `localeToCurrencyMap` for browser-locale-based currency detection), language setup, and bot protection. Cache for the session; refetch when the merchant updates currency / language settings or you want to pick up new bot-protection rules.
18
+ query ShopConfig {
19
+ shop {
20
+ ...ShopConfigFields
21
+ }
22
+ }
23
+
17
24
  # ============================================
18
25
  # Products
19
26
  # ============================================
@@ -224,6 +231,21 @@ query CustomerProfile {
224
231
  }
225
232
  }
226
233
 
234
+ # Authenticated customer's saved address book — used on checkout to let the buyer pick a previously-used shipping / billing address instead of typing it. Each entry carries B2B invoicing fields (`taxId`, `vatNumber`) and the `isDefault` flag so the same list serves both as the shipping picker and as the billing/invoice picker. Returns up to 50 addresses (Relay Connection — buyers rarely keep more); for the unauthenticated case the connection is empty (no error). The default address is also surfaced as `Customer.defaultAddress`.
235
+ query CustomerAddresses {
236
+ customer {
237
+ addresses(first: 50) {
238
+ nodes {
239
+ ...MailingAddress
240
+ }
241
+ pageInfo {
242
+ ...PageInfo
243
+ }
244
+ totalCount
245
+ }
246
+ }
247
+ }
248
+
227
249
  # Single order by `orderId`. Returns only orders that belong to the authenticated customer (cross-customer access returns null, not an error). Much cheaper than fetching the full `Customer` payload to access one order. Use on the order detail page.
228
250
  query CustomerOrder($orderId: ID!) {
229
251
  customerOrder(orderId: $orderId) {