@doswiftly/storefront-operations 16.1.0 → 18.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/AGENTS.md +3 -3
- package/CHANGELOG.md +880 -0
- package/README.md +10 -7
- package/fragments.graphql +65 -16
- package/llms-full.txt +135 -24
- package/mutations.graphql +24 -2
- package/operations.json +84 -26
- package/package.json +4 -2
- package/schema.graphql +885 -187
package/README.md
CHANGED
|
@@ -380,12 +380,13 @@ full executable body of each operation.
|
|
|
380
380
|
| `CartSetShippingAddress` | Phase 3 unify-cart-graphql-surface: wszystkie fulfillment + payment + completion operations teraz na Cart aggregate (zamiast Checkout dual-aggregate). Klient robi typowy checkout flow: cart create/add items → setShipping/Billing/Method → selectPayment → (optional) applyGiftCard → cartComplete → Order created. Sets the shipping address on the cart (full replace, not patch). Triggers cart re-pricing (tax recalculation per address country/region). Address format validated against `CartAddressInput` constraints (firstName/lastName/streetLine1/city/country/postalCode required). Errors: `INVALID_ADDRESS`, `CART_NOT_FOUND`. |
|
|
381
381
|
| `CartSetBillingAddress` | Sets the billing address on the cart (full replace). Independent of shipping address — pass it explicitly even when "billing same as shipping". Errors: `INVALID_ADDRESS`, `CART_NOT_FOUND`. |
|
|
382
382
|
| `CartSelectShippingMethod` | Selects a shipping method by `shippingMethodId` (typed `ID!`, a stable shipping-method UUID — NOT a per-request token). The id comes from a list of methods available for the current address + cart subtotal (queryable separately). Errors: `SHIPPING_METHOD_REQUIRED`, `ZIP_CODE_NOT_SUPPORTED`, `CART_NOT_FOUND`. |
|
|
383
|
-
| `CartSelectPaymentMethod` | Selects a payment method by `
|
|
383
|
+
| `CartSelectPaymentMethod` | Selects a payment method on the cart by category (`methodType` — BLIK, CARD, BANK_TRANSFER, ...). Optional `preferredProvider` overrides the merchant priority when the buyer explicitly picks a gateway from `PaymentMethod.providersAvailable`. The backend resolves the gateway routing from `MerchantPaymentConfig` at `cartComplete`; the selection persisted here is the category. Errors: `PAYMENT_METHOD_REQUIRED`, `CART_NOT_FOUND`, `CART_UNAUTHENTICATED`. |
|
|
384
384
|
| `CartApplyGiftCard` | Applies a gift card to the cart, stackable with discount codes. Consumption is FIFO: each card consumes `min(remainingBalance, paymentDue)` against the current cart total in the order they were applied. The gift card balance is NOT debited yet — actual deduction happens atomically at `cartComplete`. Errors: `GIFT_CARD_NOT_FOUND`, `GIFT_CARD_DEPLETED`, `GIFT_CARD_UNUSABLE`. |
|
|
385
385
|
| `CartRemoveGiftCard` | Removes a gift card from the applied list and recalculates FIFO `appliedAmount` for the remaining cards. Since gift card balances are only debited at `cartComplete`, removing before completion has no effect on the underlying gift card balance. |
|
|
386
386
|
| `CartUpdateGiftCardRecipient` | Sets per-line-item recipient details (name, email, message) for digital gift card products in the cart (line items where the variant represents a gift-card SKU). Required before `cartComplete` for any line item with a gift-card variant. Recipient details propagated to the resulting order. |
|
|
387
387
|
| `CartComplete` | Finalizes the cart — creates the `Order`, deducts gift cards, sends order-created confirmation — all atomically. **Idempotent on `idempotencyKey`** (auto-generated from cartId + minute timestamp if caller omits it). Returns `order` field after completion. Note: `paymentUrl` is intentionally NOT in payload — for hosted gateways (online providers) the storefront calls a separate `paymentCreate` mutation after this returns (check `order.canCreatePayment` first). Errors: `EMAIL_REQUIRED`, `SHIPPING_ADDRESS_REQUIRED`, `SHIPPING_METHOD_REQUIRED`, `PAYMENT_METHOD_REQUIRED`, `INSUFFICIENT_STOCK`, `ALREADY_COMPLETED`. |
|
|
388
|
-
| `PaymentCreate` | Initiates a payment session for an order created by `cartComplete` — call this when `order.canCreatePayment` is `true` (orders with an offline payment method like cash-on-delivery skip this step). `orderId` is required; `returnUrl` / `cancelUrl` are optional and, when supplied, must point to a verified domain of the shop (open-redirect protected). Branch on the returned `payment.flow`: `ONLINE_REDIRECT` → redirect to `payment.redirectUrl`, `ONLINE_EMBEDDED` → render a widget with `payment.clientSecret`, `INSTANT_DIRECT` → already settled, read `payment.status`. Public, but ownership-checked — an authenticated customer cannot pay for another customer's order. **Idempotent** — calling it again for the same order returns the existing still-valid session instead of creating a duplicate (safe to retry). Rate limit: 5 requests/minute. `userErrors[].code`: `ORDER_NOT_FOUND`, `ORDER_ALREADY_PAID`, `ORDER_NOT_PAYABLE`, `PAYMENT_PROVIDER_NOT_CONFIGURED`, `RETURN_URL_INVALID`, `INVALID_ID_FORMAT`, `PAYMENT_FAILED`. |
|
|
388
|
+
| `PaymentCreate` | Initiates a payment session for an order created by `cartComplete` — call this when `order.canCreatePayment` is `true` (orders with an offline payment method like cash-on-delivery skip this step). `orderId` is required; `returnUrl` / `cancelUrl` are optional and, when supplied, must point to a verified domain of the shop (open-redirect protected). Branch on the returned `payment.flow`: `ONLINE_REDIRECT` → redirect to `payment.redirectUrl`, `ONLINE_EMBEDDED` → render a widget with `payment.clientSecret`, `INSTANT_DIRECT` → already settled, read `payment.status`. Public, but ownership-checked — an authenticated customer cannot pay for another customer's order. **Idempotent** — calling it again for the same order returns the existing still-valid session instead of creating a duplicate (safe to retry). Rate limit: 5 requests/minute. `userErrors[].code`: `ORDER_NOT_FOUND`, `ORDER_ALREADY_PAID`, `ORDER_NOT_PAYABLE`, `PAYMENT_PROVIDER_NOT_CONFIGURED`, `RETURN_URL_INVALID`, `INVALID_ID_FORMAT`, `PAYMENT_FAILED`, `INSTRUMENT_PRESELECTION_FAILED`. `warnings[]` array zawiera `INSTRUMENT_CLEARED_FOR_RETRY` post-auto-clear instrument-specific failure (storefront retry hint: next attempt uses gateway default landing). |
|
|
389
|
+
| `CartClearPaymentSelection` | Clears all payment selection state on the cart in a single atomic operation. Use for accordion "back to method picker" flows w storefront UI. Idempotent — calling twice yields the same end state. Cart MUSI być `ACTIVE` (CONVERTED carts reject z `ALREADY_COMPLETED`). Rate limit: 30 requests/minute per IP+shop. |
|
|
389
390
|
|
|
390
391
|
#### Return Mutations
|
|
391
392
|
|
|
@@ -487,7 +488,7 @@ full executable body of each operation.
|
|
|
487
488
|
| `Cart` | `Cart` | Full cart shape — totals, line items (paginated up to 100), buyer identity, applied discount codes + allocations, note, custom attributes, plus fulfillment fields (email/phone/addresses/shipping method/payment method/applied gift cards). Spread on the cart drawer / cart page; refetch after every cart mutation including completion lifecycle. |
|
|
488
489
|
| `CartShippingMethod` | `CartShippingMethod` | Shipping method selected on a cart (D8 term unification — wcześniej ShippingRate). Returned przez `cart.selectedShippingMethod` po `cartSelectShippingMethod` mutation. |
|
|
489
490
|
| `CartAppliedGiftCard` | `CartAppliedGiftCard` | 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`. |
|
|
490
|
-
| `CartSelectedPaymentMethod` | `PaymentMethod` | Payment method (integration provider) selected on a cart — id, name, provider code, type category (CARD/BLIK/BANK_TRANSFER/etc.), icon, description, isDefault, supportedCurrencies. Storefront UI używa do iconography + selection display. |
|
|
491
|
+
| `CartSelectedPaymentMethod` | `PaymentMethod` | Payment method (integration provider) selected on a cart — id, name, provider code, type category (CARD/BLIK/BANK_TRANSFER/etc.), icon image (transformable), description, isDefault, supportedCurrencies. Storefront UI używa do iconography + selection display. |
|
|
491
492
|
|
|
492
493
|
#### Shop
|
|
493
494
|
|
|
@@ -508,9 +509,11 @@ full executable body of each operation.
|
|
|
508
509
|
|
|
509
510
|
| Fragment | On Type | Description |
|
|
510
511
|
| --- | --- | --- |
|
|
511
|
-
| `
|
|
512
|
+
| `PaymentInstrument` | `PaymentInstrument` | A single concrete instrument exposed by a gateway provider (BLIK code, branded bank, wallet, card brand). Pass `code` as `preferredInstrument` in `cartSelectPaymentMethod` for direct deep-link to that instrument screen on the gateway. `displayHint` is a semantic UX hint (`PROMINENT_BUTTON`, `BRANDED_TILE`, `DROPDOWN_OPTION`, `RADIO_OPTION`) — storefront branches rendering accordingly. `enabled: false` means the gateway reported the instrument as temporarily disabled — gray out, don't hide. |
|
|
513
|
+
| `PaymentMethod` | `PaymentMethod` | Single payment method enabled for the shop — method-centric. `type` is the category (CARD, BLIK, BANK_TRANSFER, INSTALLMENT, WALLET, CASH_ON_DELIVERY, OTHER) — drive iconography here. `provider`, `providersAvailable`, `preferredProvider` are `PaymentProvider` enum (UPPERCASE: `PAYU`, `PRZELEWY24`, ...). `available` is `false` when the resolving gateway is temporarily unavailable or reported the method as disabled — gray-out the tile, don't hide it; `unavailableReason` carries the diagnostic. `instruments` lists concrete gateway-side instruments (BLIK code, branded banks, wallets) when the gateway exposes granular data — pass `code` as `preferredInstrument` in `cartSelectPaymentMethod` for direct deep-link to that instrument screen on the gateway. Spread on the checkout payment step. |
|
|
512
514
|
| `AvailablePaymentMethods` | `AvailablePaymentMethods` | Active payment methods list with the merchant's `defaultMethod`. Returned by the `availablePaymentMethods` query. |
|
|
513
515
|
| `PaymentSession` | `PaymentSession` | Initiated payment session for an order — returned by the `paymentCreate` mutation. Branch on `flow`: `ONLINE_REDIRECT` (redirect the browser to `redirectUrl`), `ONLINE_EMBEDDED` (render an in-page widget with `clientSecret`), `INSTANT_DIRECT` (settled with no UI — read `status`). `expiresAt` is ISO 8601, present when the gateway session has a TTL. |
|
|
516
|
+
| `PaymentWarning` | `PaymentWarning` | Non-blocking signal emitted alongside `userErrors[]` in `paymentCreate` payload — backend state change context (e.g. an auto-clear of preselected instrument after gateway rejection). Pre-translated by backend per shop locale. `code === 'INSTRUMENT_CLEARED_FOR_RETRY'` signals storefront that the next `paymentCreate` will land on the gateway default landing page (server-side cleared `Order.paymentInstrumentCode` after `INSTRUMENT_PRESELECTION_FAILED`). `retryHint` is optional context for UI dispatch — currently unused for `INSTRUMENT_CLEARED_FOR_RETRY`, reserved for future warning codes. |
|
|
514
517
|
|
|
515
518
|
#### Shipments / Tracking
|
|
516
519
|
|
|
@@ -518,7 +521,7 @@ full executable body of each operation.
|
|
|
518
521
|
| --- | --- | --- |
|
|
519
522
|
| `ShipmentEvent` | `ShipmentEvent` | One tracking event in the shipment timeline — status, description, location, timestamp. Spread on the tracking page timeline. |
|
|
520
523
|
| `ShipmentPackage` | `ShipmentPackage` | Physical package metadata (weight + dimensions). Used in the merchant's label generation; storefronts rarely render this directly. |
|
|
521
|
-
| `ShipmentItem` | `ShipmentItem` | One item in a shipment — title, variant, sku, quantity, image
|
|
524
|
+
| `ShipmentItem` | `ShipmentItem` | One item in a shipment — title, variant, sku, quantity, live variant image (transformable). Spread inside `Shipment.items[]` for the tracking page item list. `image` is live from the current variant (snapshot fallback when variant has been deleted since fulfillment — returns null, render a placeholder). |
|
|
522
525
|
| `Shipment` | `Shipment` | Full shipment shape — provider, tracking number + URL, label URL, status, ETA, recipient address, packages, items, full event timeline. Spread on the tracking page. |
|
|
523
526
|
| `ShipmentBasic` | `Shipment` | Lightweight shipment shape — id, tracking number + URL, status, dates. No items / events / address. Use for order summary cards or on the public `shipmentByTrackingNumber` query. |
|
|
524
527
|
|
|
@@ -544,7 +547,7 @@ full executable body of each operation.
|
|
|
544
547
|
|
|
545
548
|
| Fragment | On Type | Description |
|
|
546
549
|
| --- | --- | --- |
|
|
547
|
-
| `ShippingCarrier` | `ShippingCarrier` | Carrier offering the shipping method — id, display name, logo
|
|
550
|
+
| `ShippingCarrier` | `ShippingCarrier` | Carrier offering the shipping method — id, display name, logo image (transformable), internal service code. |
|
|
548
551
|
| `DeliveryEstimate` | `DeliveryEstimate` | Estimated delivery window — `minDays` to `maxDays` plus a human-readable description (e.g. "2-4 business days"). |
|
|
549
552
|
| `FreeShippingProgress` | `FreeShippingProgress` | Free-shipping progress info — `qualifies` flag, current cart amount, threshold, remaining to qualify, percent progress, and a localized message ("Add 20 PLN more for free shipping"). Use to render a free-shipping progress bar in the cart drawer. |
|
|
550
553
|
| `AvailableShippingMethod` | `AvailableShippingMethod` | 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. |
|
|
@@ -553,7 +556,7 @@ full executable body of each operation.
|
|
|
553
556
|
|
|
554
557
|
| Fragment | On Type | Description |
|
|
555
558
|
| --- | --- | --- |
|
|
556
|
-
| `AttributeSwatch` | `AttributeSwatch` | Visual swatch for an attribute filter value — color hex (for color filters) or image
|
|
559
|
+
| `AttributeSwatch` | `AttributeSwatch` | Visual swatch for an attribute filter value — color hex (for color filters) or image (for pattern/material swatches). |
|
|
557
560
|
| `AttributeRangeBounds` | `AttributeRangeBounds` | Numeric range bounds for slider-style filters — min, max, currency code (when relevant). |
|
|
558
561
|
| `AttributeFilterValue` | `AttributeFilterValue` | One discrete value in a filterable attribute (e.g. "Red" for the Color filter). Includes `productCount` in the current listing context (for "(12)" badges next to filter values), optional swatch and price modifier. |
|
|
559
562
|
| `AttributeDefinition` | `AttributeDefinition` | Filterable attribute exposed on the storefront — name, type (SELECT / CHECKBOX / SLIDER / etc.), filterability flags, display order, and either discrete `filterValues[]` or numeric `rangeBounds`. Spread inside `availableFilters.attributes[]`. |
|
package/fragments.graphql
CHANGED
|
@@ -510,6 +510,7 @@ fragment Cart on Cart {
|
|
|
510
510
|
selectedPaymentMethod {
|
|
511
511
|
...CartSelectedPaymentMethod
|
|
512
512
|
}
|
|
513
|
+
selectedPaymentInstrument
|
|
513
514
|
appliedGiftCards {
|
|
514
515
|
...CartAppliedGiftCard
|
|
515
516
|
}
|
|
@@ -549,13 +550,15 @@ fragment CartAppliedGiftCard on CartAppliedGiftCard {
|
|
|
549
550
|
}
|
|
550
551
|
}
|
|
551
552
|
|
|
552
|
-
# Payment method (integration provider) selected on a cart — id, name, provider code, type category (CARD/BLIK/BANK_TRANSFER/etc.), icon, description, isDefault, supportedCurrencies. Storefront UI używa do iconography + selection display.
|
|
553
|
+
# Payment method (integration provider) selected on a cart — id, name, provider code, type category (CARD/BLIK/BANK_TRANSFER/etc.), icon image (transformable), description, isDefault, supportedCurrencies. Storefront UI używa do iconography + selection display.
|
|
553
554
|
fragment CartSelectedPaymentMethod on PaymentMethod {
|
|
554
555
|
id
|
|
555
556
|
name
|
|
556
557
|
provider
|
|
557
558
|
type
|
|
558
|
-
icon
|
|
559
|
+
icon {
|
|
560
|
+
...ImageThumbnail
|
|
561
|
+
}
|
|
559
562
|
description
|
|
560
563
|
isDefault
|
|
561
564
|
supportedCurrencies
|
|
@@ -700,17 +703,44 @@ fragment ShopConfigFields on Shop {
|
|
|
700
703
|
# Payment Methods
|
|
701
704
|
# ============================================
|
|
702
705
|
|
|
703
|
-
#
|
|
706
|
+
# A single concrete instrument exposed by a gateway provider (BLIK code, branded bank, wallet, card brand). Pass `code` as `preferredInstrument` in `cartSelectPaymentMethod` for direct deep-link to that instrument screen on the gateway. `displayHint` is a semantic UX hint (`PROMINENT_BUTTON`, `BRANDED_TILE`, `DROPDOWN_OPTION`, `RADIO_OPTION`) — storefront branches rendering accordingly. `enabled: false` means the gateway reported the instrument as temporarily disabled — gray out, don't hide.
|
|
707
|
+
fragment PaymentInstrument on PaymentInstrument {
|
|
708
|
+
provider
|
|
709
|
+
code
|
|
710
|
+
type
|
|
711
|
+
displayName
|
|
712
|
+
displayHint
|
|
713
|
+
brandImage {
|
|
714
|
+
...ImageThumbnail
|
|
715
|
+
}
|
|
716
|
+
enabled
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
# Single payment method enabled for the shop — method-centric.
|
|
720
|
+
# `type` is the category (CARD, BLIK, BANK_TRANSFER, INSTALLMENT, WALLET, CASH_ON_DELIVERY, OTHER) — drive iconography here.
|
|
721
|
+
# `provider`, `providersAvailable`, `preferredProvider` are `PaymentProvider` enum (UPPERCASE: `PAYU`, `PRZELEWY24`, ...).
|
|
722
|
+
# `available` is `false` when the resolving gateway is temporarily unavailable or reported the method as disabled — gray-out the tile, don't hide it; `unavailableReason` carries the diagnostic.
|
|
723
|
+
# `instruments` lists concrete gateway-side instruments (BLIK code, branded banks, wallets) when the gateway exposes granular data — pass `code` as `preferredInstrument` in `cartSelectPaymentMethod` for direct deep-link to that instrument screen on the gateway.
|
|
724
|
+
# Spread on the checkout payment step.
|
|
704
725
|
fragment PaymentMethod on PaymentMethod {
|
|
705
726
|
id
|
|
706
727
|
name
|
|
707
728
|
provider
|
|
708
729
|
type
|
|
709
|
-
icon
|
|
730
|
+
icon {
|
|
731
|
+
...ImageThumbnail
|
|
732
|
+
}
|
|
710
733
|
description
|
|
711
734
|
isDefault
|
|
712
735
|
supportedCurrencies
|
|
713
736
|
position
|
|
737
|
+
providersAvailable
|
|
738
|
+
preferredProvider
|
|
739
|
+
available
|
|
740
|
+
unavailableReason
|
|
741
|
+
instruments {
|
|
742
|
+
...PaymentInstrument
|
|
743
|
+
}
|
|
714
744
|
}
|
|
715
745
|
|
|
716
746
|
# Active payment methods list with the merchant's `defaultMethod`. Returned by the `availablePaymentMethods` query.
|
|
@@ -735,6 +765,13 @@ fragment PaymentSession on PaymentSession {
|
|
|
735
765
|
expiresAt
|
|
736
766
|
}
|
|
737
767
|
|
|
768
|
+
# Non-blocking signal emitted alongside `userErrors[]` in `paymentCreate` payload — backend state change context (e.g. an auto-clear of preselected instrument after gateway rejection). Pre-translated by backend per shop locale. `code === 'INSTRUMENT_CLEARED_FOR_RETRY'` signals storefront that the next `paymentCreate` will land on the gateway default landing page (server-side cleared `Order.paymentInstrumentCode` after `INSTRUMENT_PRESELECTION_FAILED`). `retryHint` is optional context for UI dispatch — currently unused for `INSTRUMENT_CLEARED_FOR_RETRY`, reserved for future warning codes.
|
|
769
|
+
fragment PaymentWarning on PaymentWarning {
|
|
770
|
+
message
|
|
771
|
+
code
|
|
772
|
+
retryHint
|
|
773
|
+
}
|
|
774
|
+
|
|
738
775
|
# ============================================
|
|
739
776
|
# Discount Code Validation
|
|
740
777
|
# ============================================
|
|
@@ -767,14 +804,16 @@ fragment ShipmentPackage on ShipmentPackage {
|
|
|
767
804
|
height
|
|
768
805
|
}
|
|
769
806
|
|
|
770
|
-
# One item in a shipment — title, variant, sku, quantity, image
|
|
807
|
+
# One item in a shipment — title, variant, sku, quantity, live variant image (transformable). Spread inside `Shipment.items[]` for the tracking page item list. `image` is live from the current variant (snapshot fallback when variant has been deleted since fulfillment — returns null, render a placeholder).
|
|
771
808
|
fragment ShipmentItem on ShipmentItem {
|
|
772
809
|
id
|
|
773
810
|
title
|
|
774
811
|
variantTitle
|
|
775
812
|
sku
|
|
776
813
|
quantity
|
|
777
|
-
|
|
814
|
+
image {
|
|
815
|
+
...ImageThumbnail
|
|
816
|
+
}
|
|
778
817
|
}
|
|
779
818
|
|
|
780
819
|
# Full shipment shape — provider, tracking number + URL, label URL, status, ETA, recipient address, packages, items, full event timeline. Spread on the tracking page.
|
|
@@ -848,7 +887,9 @@ fragment ReturnItem on ReturnItem {
|
|
|
848
887
|
productTitle
|
|
849
888
|
variantTitle
|
|
850
889
|
sku
|
|
851
|
-
|
|
890
|
+
image {
|
|
891
|
+
...ImageThumbnail
|
|
892
|
+
}
|
|
852
893
|
quantity
|
|
853
894
|
reason
|
|
854
895
|
condition
|
|
@@ -942,11 +983,13 @@ fragment GiftCardValidation on GiftCardValidation {
|
|
|
942
983
|
# Shipping Methods
|
|
943
984
|
# ============================================
|
|
944
985
|
|
|
945
|
-
# Carrier offering the shipping method — id, display name, logo
|
|
986
|
+
# Carrier offering the shipping method — id, display name, logo image (transformable), internal service code.
|
|
946
987
|
fragment ShippingCarrier on ShippingCarrier {
|
|
947
988
|
id
|
|
948
989
|
name
|
|
949
|
-
|
|
990
|
+
logo {
|
|
991
|
+
...ImageThumbnail
|
|
992
|
+
}
|
|
950
993
|
serviceCode
|
|
951
994
|
}
|
|
952
995
|
|
|
@@ -999,10 +1042,12 @@ fragment AvailableShippingMethod on AvailableShippingMethod {
|
|
|
999
1042
|
# Attribute Filters
|
|
1000
1043
|
# ============================================
|
|
1001
1044
|
|
|
1002
|
-
# Visual swatch for an attribute filter value — color hex (for color filters) or image
|
|
1045
|
+
# Visual swatch for an attribute filter value — color hex (for color filters) or image (for pattern/material swatches).
|
|
1003
1046
|
fragment AttributeSwatch on AttributeSwatch {
|
|
1004
1047
|
colorHex
|
|
1005
|
-
|
|
1048
|
+
image {
|
|
1049
|
+
...ImageThumbnail
|
|
1050
|
+
}
|
|
1006
1051
|
}
|
|
1007
1052
|
|
|
1008
1053
|
# Numeric range bounds for slider-style filters — min, max, currency code (when relevant).
|
|
@@ -1105,7 +1150,9 @@ fragment LoyaltyTier on LoyaltyTier {
|
|
|
1105
1150
|
customBenefits {
|
|
1106
1151
|
name
|
|
1107
1152
|
description
|
|
1108
|
-
icon
|
|
1153
|
+
icon {
|
|
1154
|
+
...ImageThumbnail
|
|
1155
|
+
}
|
|
1109
1156
|
}
|
|
1110
1157
|
}
|
|
1111
1158
|
|
|
@@ -1262,7 +1309,9 @@ fragment ProductReview on ProductReview {
|
|
|
1262
1309
|
content
|
|
1263
1310
|
pros
|
|
1264
1311
|
cons
|
|
1265
|
-
images
|
|
1312
|
+
images {
|
|
1313
|
+
...ImageThumbnail
|
|
1314
|
+
}
|
|
1266
1315
|
authorName
|
|
1267
1316
|
isVerifiedPurchase
|
|
1268
1317
|
helpfulCount
|
|
@@ -1510,7 +1559,7 @@ fragment MenuItem on MenuItem {
|
|
|
1510
1559
|
... on Collection { id handle title }
|
|
1511
1560
|
... on ShopPage { id handle title }
|
|
1512
1561
|
... on Product { id handle title }
|
|
1513
|
-
... on Brand { id handle name logo }
|
|
1562
|
+
... on Brand { id handle name logo { ...ImageThumbnail } }
|
|
1514
1563
|
}
|
|
1515
1564
|
image {
|
|
1516
1565
|
...Image
|
|
@@ -1527,7 +1576,7 @@ fragment MenuItem on MenuItem {
|
|
|
1527
1576
|
... on Collection { id handle title }
|
|
1528
1577
|
... on ShopPage { id handle title }
|
|
1529
1578
|
... on Product { id handle title }
|
|
1530
|
-
... on Brand { id handle name logo }
|
|
1579
|
+
... on Brand { id handle name logo { ...ImageThumbnail } }
|
|
1531
1580
|
}
|
|
1532
1581
|
items {
|
|
1533
1582
|
id
|
|
@@ -1541,7 +1590,7 @@ fragment MenuItem on MenuItem {
|
|
|
1541
1590
|
... on Collection { id handle title }
|
|
1542
1591
|
... on ShopPage { id handle title }
|
|
1543
1592
|
... on Product { id handle title }
|
|
1544
|
-
... on Brand { id handle name logo }
|
|
1593
|
+
... on Brand { id handle name logo { ...ImageThumbnail } }
|
|
1545
1594
|
}
|
|
1546
1595
|
}
|
|
1547
1596
|
}
|
package/llms-full.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# DoSwiftly Storefront Operations — Full Reference
|
|
2
2
|
|
|
3
|
-
> Schema version: **
|
|
4
|
-
> 52 queries ·
|
|
3
|
+
> Schema version: **18.0.0**
|
|
4
|
+
> 52 queries · 41 mutations · 104 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.
|
|
@@ -1975,7 +1975,7 @@ mutation CartSelectShippingMethod($input: CartSelectShippingMethodInput!) {
|
|
|
1975
1975
|
|
|
1976
1976
|
**Section**: Cart Completion Mutations
|
|
1977
1977
|
|
|
1978
|
-
**Description**: Selects a payment method by `
|
|
1978
|
+
**Description**: Selects a payment method on the cart by category (`methodType` — BLIK, CARD, BANK_TRANSFER, ...). Optional `preferredProvider` overrides the merchant priority when the buyer explicitly picks a gateway from `PaymentMethod.providersAvailable`. The backend resolves the gateway routing from `MerchantPaymentConfig` at `cartComplete`; the selection persisted here is the category. Errors: `PAYMENT_METHOD_REQUIRED`, `CART_NOT_FOUND`, `CART_UNAUTHENTICATED`.
|
|
1979
1979
|
|
|
1980
1980
|
**Variables**:
|
|
1981
1981
|
- `$input`: `CartSelectPaymentMethodInput!`
|
|
@@ -2115,12 +2115,12 @@ mutation CartComplete($input: CartCompleteInput!) {
|
|
|
2115
2115
|
|
|
2116
2116
|
**Section**: Cart Completion Mutations
|
|
2117
2117
|
|
|
2118
|
-
**Description**: Initiates a payment session for an order created by `cartComplete` — call this when `order.canCreatePayment` is `true` (orders with an offline payment method like cash-on-delivery skip this step). `orderId` is required; `returnUrl` / `cancelUrl` are optional and, when supplied, must point to a verified domain of the shop (open-redirect protected). Branch on the returned `payment.flow`: `ONLINE_REDIRECT` → redirect to `payment.redirectUrl`, `ONLINE_EMBEDDED` → render a widget with `payment.clientSecret`, `INSTANT_DIRECT` → already settled, read `payment.status`. Public, but ownership-checked — an authenticated customer cannot pay for another customer's order. **Idempotent** — calling it again for the same order returns the existing still-valid session instead of creating a duplicate (safe to retry). Rate limit: 5 requests/minute. `userErrors[].code`: `ORDER_NOT_FOUND`, `ORDER_ALREADY_PAID`, `ORDER_NOT_PAYABLE`, `PAYMENT_PROVIDER_NOT_CONFIGURED`, `RETURN_URL_INVALID`, `INVALID_ID_FORMAT`, `PAYMENT_FAILED`.
|
|
2118
|
+
**Description**: Initiates a payment session for an order created by `cartComplete` — call this when `order.canCreatePayment` is `true` (orders with an offline payment method like cash-on-delivery skip this step). `orderId` is required; `returnUrl` / `cancelUrl` are optional and, when supplied, must point to a verified domain of the shop (open-redirect protected). Branch on the returned `payment.flow`: `ONLINE_REDIRECT` → redirect to `payment.redirectUrl`, `ONLINE_EMBEDDED` → render a widget with `payment.clientSecret`, `INSTANT_DIRECT` → already settled, read `payment.status`. Public, but ownership-checked — an authenticated customer cannot pay for another customer's order. **Idempotent** — calling it again for the same order returns the existing still-valid session instead of creating a duplicate (safe to retry). Rate limit: 5 requests/minute. `userErrors[].code`: `ORDER_NOT_FOUND`, `ORDER_ALREADY_PAID`, `ORDER_NOT_PAYABLE`, `PAYMENT_PROVIDER_NOT_CONFIGURED`, `RETURN_URL_INVALID`, `INVALID_ID_FORMAT`, `PAYMENT_FAILED`, `INSTRUMENT_PRESELECTION_FAILED`. `warnings[]` array zawiera `INSTRUMENT_CLEARED_FOR_RETRY` post-auto-clear instrument-specific failure (storefront retry hint: next attempt uses gateway default landing).
|
|
2119
2119
|
|
|
2120
2120
|
**Variables**:
|
|
2121
2121
|
- `$input`: `PaymentCreateInput!`
|
|
2122
2122
|
|
|
2123
|
-
**Fragments used**: `PaymentSession`, `UserError`
|
|
2123
|
+
**Fragments used**: `PaymentSession`, `PaymentWarning`, `UserError`
|
|
2124
2124
|
|
|
2125
2125
|
**GraphQL**:
|
|
2126
2126
|
```graphql
|
|
@@ -2132,6 +2132,37 @@ mutation PaymentCreate($input: PaymentCreateInput!) {
|
|
|
2132
2132
|
userErrors {
|
|
2133
2133
|
...UserError
|
|
2134
2134
|
}
|
|
2135
|
+
warnings {
|
|
2136
|
+
...PaymentWarning
|
|
2137
|
+
}
|
|
2138
|
+
}
|
|
2139
|
+
}
|
|
2140
|
+
```
|
|
2141
|
+
|
|
2142
|
+
### Mutation: `CartClearPaymentSelection`
|
|
2143
|
+
|
|
2144
|
+
**Section**: Cart Completion Mutations
|
|
2145
|
+
|
|
2146
|
+
**Description**: Clears all payment selection state on the cart in a single atomic operation. Use for accordion "back to method picker" flows w storefront UI. Idempotent — calling twice yields the same end state. Cart MUSI być `ACTIVE` (CONVERTED carts reject z `ALREADY_COMPLETED`). Rate limit: 30 requests/minute per IP+shop.
|
|
2147
|
+
|
|
2148
|
+
**Variables**:
|
|
2149
|
+
- `$input`: `CartClearPaymentSelectionInput!`
|
|
2150
|
+
|
|
2151
|
+
**Fragments used**: `Cart`, `CartWarning`, `UserError`
|
|
2152
|
+
|
|
2153
|
+
**GraphQL**:
|
|
2154
|
+
```graphql
|
|
2155
|
+
mutation CartClearPaymentSelection($input: CartClearPaymentSelectionInput!) {
|
|
2156
|
+
cartClearPaymentSelection(input: $input) {
|
|
2157
|
+
cart {
|
|
2158
|
+
...Cart
|
|
2159
|
+
}
|
|
2160
|
+
userErrors {
|
|
2161
|
+
...UserError
|
|
2162
|
+
}
|
|
2163
|
+
warnings {
|
|
2164
|
+
...CartWarning
|
|
2165
|
+
}
|
|
2135
2166
|
}
|
|
2136
2167
|
}
|
|
2137
2168
|
```
|
|
@@ -3171,6 +3202,7 @@ fragment Cart on Cart {
|
|
|
3171
3202
|
selectedPaymentMethod {
|
|
3172
3203
|
...CartSelectedPaymentMethod
|
|
3173
3204
|
}
|
|
3205
|
+
selectedPaymentInstrument
|
|
3174
3206
|
appliedGiftCards {
|
|
3175
3207
|
...CartAppliedGiftCard
|
|
3176
3208
|
}
|
|
@@ -3235,7 +3267,9 @@ fragment CartAppliedGiftCard on CartAppliedGiftCard {
|
|
|
3235
3267
|
|
|
3236
3268
|
**Section**: Cart
|
|
3237
3269
|
|
|
3238
|
-
**Description**: Payment method (integration provider) selected on a cart — id, name, provider code, type category (CARD/BLIK/BANK_TRANSFER/etc.), icon, description, isDefault, supportedCurrencies. Storefront UI używa do iconography + selection display.
|
|
3270
|
+
**Description**: Payment method (integration provider) selected on a cart — id, name, provider code, type category (CARD/BLIK/BANK_TRANSFER/etc.), icon image (transformable), description, isDefault, supportedCurrencies. Storefront UI używa do iconography + selection display.
|
|
3271
|
+
|
|
3272
|
+
**Uses fragments**: `ImageThumbnail`
|
|
3239
3273
|
|
|
3240
3274
|
**GraphQL**:
|
|
3241
3275
|
```graphql
|
|
@@ -3244,7 +3278,9 @@ fragment CartSelectedPaymentMethod on PaymentMethod {
|
|
|
3244
3278
|
name
|
|
3245
3279
|
provider
|
|
3246
3280
|
type
|
|
3247
|
-
icon
|
|
3281
|
+
icon {
|
|
3282
|
+
...ImageThumbnail
|
|
3283
|
+
}
|
|
3248
3284
|
description
|
|
3249
3285
|
isDefault
|
|
3250
3286
|
supportedCurrencies
|
|
@@ -3470,11 +3506,36 @@ fragment ShopConfigFields on Shop {
|
|
|
3470
3506
|
}
|
|
3471
3507
|
```
|
|
3472
3508
|
|
|
3509
|
+
### Fragment: `PaymentInstrument` on `PaymentInstrument`
|
|
3510
|
+
|
|
3511
|
+
**Section**: Payment Methods
|
|
3512
|
+
|
|
3513
|
+
**Description**: A single concrete instrument exposed by a gateway provider (BLIK code, branded bank, wallet, card brand). Pass `code` as `preferredInstrument` in `cartSelectPaymentMethod` for direct deep-link to that instrument screen on the gateway. `displayHint` is a semantic UX hint (`PROMINENT_BUTTON`, `BRANDED_TILE`, `DROPDOWN_OPTION`, `RADIO_OPTION`) — storefront branches rendering accordingly. `enabled: false` means the gateway reported the instrument as temporarily disabled — gray out, don't hide.
|
|
3514
|
+
|
|
3515
|
+
**Uses fragments**: `ImageThumbnail`
|
|
3516
|
+
|
|
3517
|
+
**GraphQL**:
|
|
3518
|
+
```graphql
|
|
3519
|
+
fragment PaymentInstrument on PaymentInstrument {
|
|
3520
|
+
provider
|
|
3521
|
+
code
|
|
3522
|
+
type
|
|
3523
|
+
displayName
|
|
3524
|
+
displayHint
|
|
3525
|
+
brandImage {
|
|
3526
|
+
...ImageThumbnail
|
|
3527
|
+
}
|
|
3528
|
+
enabled
|
|
3529
|
+
}
|
|
3530
|
+
```
|
|
3531
|
+
|
|
3473
3532
|
### Fragment: `PaymentMethod` on `PaymentMethod`
|
|
3474
3533
|
|
|
3475
3534
|
**Section**: Payment Methods
|
|
3476
3535
|
|
|
3477
|
-
**Description**: Single payment method enabled for the shop — type (CARD
|
|
3536
|
+
**Description**: Single payment method enabled for the shop — method-centric. `type` is the category (CARD, BLIK, BANK_TRANSFER, INSTALLMENT, WALLET, CASH_ON_DELIVERY, OTHER) — drive iconography here. `provider`, `providersAvailable`, `preferredProvider` are `PaymentProvider` enum (UPPERCASE: `PAYU`, `PRZELEWY24`, ...). `available` is `false` when the resolving gateway is temporarily unavailable or reported the method as disabled — gray-out the tile, don't hide it; `unavailableReason` carries the diagnostic. `instruments` lists concrete gateway-side instruments (BLIK code, branded banks, wallets) when the gateway exposes granular data — pass `code` as `preferredInstrument` in `cartSelectPaymentMethod` for direct deep-link to that instrument screen on the gateway. Spread on the checkout payment step.
|
|
3537
|
+
|
|
3538
|
+
**Uses fragments**: `ImageThumbnail`, `PaymentInstrument`
|
|
3478
3539
|
|
|
3479
3540
|
**GraphQL**:
|
|
3480
3541
|
```graphql
|
|
@@ -3483,11 +3544,20 @@ fragment PaymentMethod on PaymentMethod {
|
|
|
3483
3544
|
name
|
|
3484
3545
|
provider
|
|
3485
3546
|
type
|
|
3486
|
-
icon
|
|
3547
|
+
icon {
|
|
3548
|
+
...ImageThumbnail
|
|
3549
|
+
}
|
|
3487
3550
|
description
|
|
3488
3551
|
isDefault
|
|
3489
3552
|
supportedCurrencies
|
|
3490
3553
|
position
|
|
3554
|
+
providersAvailable
|
|
3555
|
+
preferredProvider
|
|
3556
|
+
available
|
|
3557
|
+
unavailableReason
|
|
3558
|
+
instruments {
|
|
3559
|
+
...PaymentInstrument
|
|
3560
|
+
}
|
|
3491
3561
|
}
|
|
3492
3562
|
```
|
|
3493
3563
|
|
|
@@ -3531,6 +3601,21 @@ fragment PaymentSession on PaymentSession {
|
|
|
3531
3601
|
}
|
|
3532
3602
|
```
|
|
3533
3603
|
|
|
3604
|
+
### Fragment: `PaymentWarning` on `PaymentWarning`
|
|
3605
|
+
|
|
3606
|
+
**Section**: Payment Methods
|
|
3607
|
+
|
|
3608
|
+
**Description**: Non-blocking signal emitted alongside `userErrors[]` in `paymentCreate` payload — backend state change context (e.g. an auto-clear of preselected instrument after gateway rejection). Pre-translated by backend per shop locale. `code === 'INSTRUMENT_CLEARED_FOR_RETRY'` signals storefront that the next `paymentCreate` will land on the gateway default landing page (server-side cleared `Order.paymentInstrumentCode` after `INSTRUMENT_PRESELECTION_FAILED`). `retryHint` is optional context for UI dispatch — currently unused for `INSTRUMENT_CLEARED_FOR_RETRY`, reserved for future warning codes.
|
|
3609
|
+
|
|
3610
|
+
**GraphQL**:
|
|
3611
|
+
```graphql
|
|
3612
|
+
fragment PaymentWarning on PaymentWarning {
|
|
3613
|
+
message
|
|
3614
|
+
code
|
|
3615
|
+
retryHint
|
|
3616
|
+
}
|
|
3617
|
+
```
|
|
3618
|
+
|
|
3534
3619
|
### Fragment: `ShipmentEvent` on `ShipmentEvent`
|
|
3535
3620
|
|
|
3536
3621
|
**Section**: Shipments / Tracking
|
|
@@ -3569,7 +3654,9 @@ fragment ShipmentPackage on ShipmentPackage {
|
|
|
3569
3654
|
|
|
3570
3655
|
**Section**: Shipments / Tracking
|
|
3571
3656
|
|
|
3572
|
-
**Description**: One item in a shipment — title, variant, sku, quantity, image
|
|
3657
|
+
**Description**: One item in a shipment — title, variant, sku, quantity, live variant image (transformable). Spread inside `Shipment.items[]` for the tracking page item list. `image` is live from the current variant (snapshot fallback when variant has been deleted since fulfillment — returns null, render a placeholder).
|
|
3658
|
+
|
|
3659
|
+
**Uses fragments**: `ImageThumbnail`
|
|
3573
3660
|
|
|
3574
3661
|
**GraphQL**:
|
|
3575
3662
|
```graphql
|
|
@@ -3579,7 +3666,9 @@ fragment ShipmentItem on ShipmentItem {
|
|
|
3579
3666
|
variantTitle
|
|
3580
3667
|
sku
|
|
3581
3668
|
quantity
|
|
3582
|
-
|
|
3669
|
+
image {
|
|
3670
|
+
...ImageThumbnail
|
|
3671
|
+
}
|
|
3583
3672
|
}
|
|
3584
3673
|
```
|
|
3585
3674
|
|
|
@@ -3683,7 +3772,7 @@ fragment ReturnItemPhoto on ReturnItemPhoto {
|
|
|
3683
3772
|
|
|
3684
3773
|
**Description**: Single line in a return request — variant identity, quantity requested, reason, condition, photos, status, approved quantity (set by merchant after review). Spread inside `Return.items[]`.
|
|
3685
3774
|
|
|
3686
|
-
**Uses fragments**: `Money`, `ReturnItemPhoto`
|
|
3775
|
+
**Uses fragments**: `ImageThumbnail`, `Money`, `ReturnItemPhoto`
|
|
3687
3776
|
|
|
3688
3777
|
**GraphQL**:
|
|
3689
3778
|
```graphql
|
|
@@ -3693,7 +3782,9 @@ fragment ReturnItem on ReturnItem {
|
|
|
3693
3782
|
productTitle
|
|
3694
3783
|
variantTitle
|
|
3695
3784
|
sku
|
|
3696
|
-
|
|
3785
|
+
image {
|
|
3786
|
+
...ImageThumbnail
|
|
3787
|
+
}
|
|
3697
3788
|
quantity
|
|
3698
3789
|
reason
|
|
3699
3790
|
condition
|
|
@@ -3830,14 +3921,18 @@ fragment GiftCardValidation on GiftCardValidation {
|
|
|
3830
3921
|
|
|
3831
3922
|
**Section**: Shipping Methods
|
|
3832
3923
|
|
|
3833
|
-
**Description**: Carrier offering the shipping method — id, display name, logo
|
|
3924
|
+
**Description**: Carrier offering the shipping method — id, display name, logo image (transformable), internal service code.
|
|
3925
|
+
|
|
3926
|
+
**Uses fragments**: `ImageThumbnail`
|
|
3834
3927
|
|
|
3835
3928
|
**GraphQL**:
|
|
3836
3929
|
```graphql
|
|
3837
3930
|
fragment ShippingCarrier on ShippingCarrier {
|
|
3838
3931
|
id
|
|
3839
3932
|
name
|
|
3840
|
-
|
|
3933
|
+
logo {
|
|
3934
|
+
...ImageThumbnail
|
|
3935
|
+
}
|
|
3841
3936
|
serviceCode
|
|
3842
3937
|
}
|
|
3843
3938
|
```
|
|
@@ -3919,13 +4014,17 @@ fragment AvailableShippingMethod on AvailableShippingMethod {
|
|
|
3919
4014
|
|
|
3920
4015
|
**Section**: Attribute Filters
|
|
3921
4016
|
|
|
3922
|
-
**Description**: Visual swatch for an attribute filter value — color hex (for color filters) or image
|
|
4017
|
+
**Description**: Visual swatch for an attribute filter value — color hex (for color filters) or image (for pattern/material swatches).
|
|
4018
|
+
|
|
4019
|
+
**Uses fragments**: `ImageThumbnail`
|
|
3923
4020
|
|
|
3924
4021
|
**GraphQL**:
|
|
3925
4022
|
```graphql
|
|
3926
4023
|
fragment AttributeSwatch on AttributeSwatch {
|
|
3927
4024
|
colorHex
|
|
3928
|
-
|
|
4025
|
+
image {
|
|
4026
|
+
...ImageThumbnail
|
|
4027
|
+
}
|
|
3929
4028
|
}
|
|
3930
4029
|
```
|
|
3931
4030
|
|
|
@@ -4082,7 +4181,7 @@ fragment LoyaltyPageInfo on LoyaltyPageInfo {
|
|
|
4082
4181
|
|
|
4083
4182
|
**Description**: Loyalty tier definition — name, type enum (`BRONZE` / `SILVER` / `GOLD` / `PLATINUM` / `DIAMOND`), entry threshold (`minPoints` and/or `minAnnualSpend`), points multiplier, custom benefits list. Returned by `loyaltyTiers` and embedded in member tier data.
|
|
4084
4183
|
|
|
4085
|
-
**Uses fragments**: `Money`
|
|
4184
|
+
**Uses fragments**: `ImageThumbnail`, `Money`
|
|
4086
4185
|
|
|
4087
4186
|
**GraphQL**:
|
|
4088
4187
|
```graphql
|
|
@@ -4098,7 +4197,9 @@ fragment LoyaltyTier on LoyaltyTier {
|
|
|
4098
4197
|
customBenefits {
|
|
4099
4198
|
name
|
|
4100
4199
|
description
|
|
4101
|
-
icon
|
|
4200
|
+
icon {
|
|
4201
|
+
...ImageThumbnail
|
|
4202
|
+
}
|
|
4102
4203
|
}
|
|
4103
4204
|
}
|
|
4104
4205
|
```
|
|
@@ -4349,6 +4450,8 @@ fragment GenerateReferralCodePayload on GenerateReferralCodePayload {
|
|
|
4349
4450
|
|
|
4350
4451
|
**Description**: Single product review — rating, title, body, optional pros/cons, image attachments, author, verified-purchase flag, helpful/unhelpful counts, optional merchant response. Only `APPROVED` reviews are exposed to the storefront.
|
|
4351
4452
|
|
|
4453
|
+
**Uses fragments**: `ImageThumbnail`
|
|
4454
|
+
|
|
4352
4455
|
**GraphQL**:
|
|
4353
4456
|
```graphql
|
|
4354
4457
|
fragment ProductReview on ProductReview {
|
|
@@ -4359,7 +4462,9 @@ fragment ProductReview on ProductReview {
|
|
|
4359
4462
|
content
|
|
4360
4463
|
pros
|
|
4361
4464
|
cons
|
|
4362
|
-
images
|
|
4465
|
+
images {
|
|
4466
|
+
...ImageThumbnail
|
|
4467
|
+
}
|
|
4363
4468
|
authorName
|
|
4364
4469
|
isVerifiedPurchase
|
|
4365
4470
|
helpfulCount
|
|
@@ -4717,7 +4822,7 @@ fragment ShopPage on ShopPage {
|
|
|
4717
4822
|
|
|
4718
4823
|
**Description**: One menu item with up to 3 levels of nested children — title, URL, type (`HTTP` / `FRONTPAGE` / `SEARCH` / `CATALOG` / `BLOG` / `PRODUCT` / `COLLECTION` / `CATEGORY` / `PAGE` / `BRAND`), `resourceId` for typed items, optional image, and a typed `resource` union (Category / Collection / ShopPage / Product / Brand) carrying the linked resource's handle. Two ways to render the link target: (1) use the pre-resolved `url` if your storefront follows the standard `/categories|/collections|/pages|/products|/brands/<handle>` route convention; (2) read `resource.__typename` + the per-type `handle` and build your own paths if your storefront uses different routing. Switch on `type` to decide which static (FRONTPAGE/SEARCH/CATALOG/BLOG) or dynamic target to render.
|
|
4719
4824
|
|
|
4720
|
-
**Uses fragments**: `Image`
|
|
4825
|
+
**Uses fragments**: `Image`, `ImageThumbnail`
|
|
4721
4826
|
|
|
4722
4827
|
**GraphQL**:
|
|
4723
4828
|
```graphql
|
|
@@ -4753,7 +4858,9 @@ fragment MenuItem on MenuItem {
|
|
|
4753
4858
|
id
|
|
4754
4859
|
handle
|
|
4755
4860
|
name
|
|
4756
|
-
logo
|
|
4861
|
+
logo {
|
|
4862
|
+
...ImageThumbnail
|
|
4863
|
+
}
|
|
4757
4864
|
}
|
|
4758
4865
|
}
|
|
4759
4866
|
image {
|
|
@@ -4791,7 +4898,9 @@ fragment MenuItem on MenuItem {
|
|
|
4791
4898
|
id
|
|
4792
4899
|
handle
|
|
4793
4900
|
name
|
|
4794
|
-
logo
|
|
4901
|
+
logo {
|
|
4902
|
+
...ImageThumbnail
|
|
4903
|
+
}
|
|
4795
4904
|
}
|
|
4796
4905
|
}
|
|
4797
4906
|
items {
|
|
@@ -4826,7 +4935,9 @@ fragment MenuItem on MenuItem {
|
|
|
4826
4935
|
id
|
|
4827
4936
|
handle
|
|
4828
4937
|
name
|
|
4829
|
-
logo
|
|
4938
|
+
logo {
|
|
4939
|
+
...ImageThumbnail
|
|
4940
|
+
}
|
|
4830
4941
|
}
|
|
4831
4942
|
}
|
|
4832
4943
|
}
|