@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/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 `paymentMethodId` (UUID from `availablePaymentMethods` query). Validates existence + active status; no pre-authorization performed here. Errors: `PAYMENT_METHOD_REQUIRED`, `INVALID_PAYMENT`, `CART_NOT_FOUND`. |
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
- | `PaymentMethod` | `PaymentMethod` | Single payment method enabled for the shop type (CARD / BANK_TRANSFER / BLIK / PAYPAL / APPLE_PAY / GOOGLE_PAY / CASH_ON_DELIVERY / OTHER), provider, icon, supported currencies, default flag, sort position. Spread on the checkout payment step. |
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 URL. Spread inside `Shipment.items[]` for the tracking page item list. |
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 URL, internal service code. |
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 URL (for pattern/material swatches). |
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
- # Single payment method enabled for the shop type (CARD / BANK_TRANSFER / BLIK / PAYPAL / APPLE_PAY / GOOGLE_PAY / CASH_ON_DELIVERY / OTHER), provider, icon, supported currencies, default flag, sort position. Spread on the checkout payment step.
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 URL. Spread inside `Shipment.items[]` for the tracking page item list.
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
- imageUrl
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
- imageUrl
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 URL, internal service code.
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
- logoUrl
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 URL (for pattern/material swatches).
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
- imageUrl
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: **16.1.0**
4
- > 52 queries · 40 mutations · 102 fragments
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 `paymentMethodId` (UUID from `availablePaymentMethods` query). Validates existence + active status; no pre-authorization performed here. Errors: `PAYMENT_METHOD_REQUIRED`, `INVALID_PAYMENT`, `CART_NOT_FOUND`.
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 / BANK_TRANSFER / BLIK / PAYPAL / APPLE_PAY / GOOGLE_PAY / CASH_ON_DELIVERY / OTHER), provider, icon, supported currencies, default flag, sort position. Spread on the checkout payment step.
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 URL. Spread inside `Shipment.items[]` for the tracking page item list.
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
- imageUrl
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
- imageUrl
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 URL, internal service code.
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
- logoUrl
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 URL (for pattern/material swatches).
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
- imageUrl
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
  }