@doswiftly/storefront-operations 13.1.0 → 15.1.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 +236 -0
- package/README.md +17 -15
- package/fragments.graphql +57 -18
- package/llms-full.txt +175 -36
- package/operations.json +60 -36
- package/package.json +1 -1
- package/queries.graphql +26 -11
- package/schema.graphql +1213 -559
package/llms-full.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# DoSwiftly Storefront Operations — Full Reference
|
|
2
2
|
|
|
3
|
-
> Schema version: **
|
|
4
|
-
>
|
|
3
|
+
> Schema version: **15.1.0**
|
|
4
|
+
> 51 queries · 40 mutations · 101 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.
|
|
@@ -41,7 +41,7 @@ query Shop {
|
|
|
41
41
|
|
|
42
42
|
**Section**: Products
|
|
43
43
|
|
|
44
|
-
**Description**: Fetches a single product by `id` or `handle` (URL
|
|
44
|
+
**Description**: Fetches a single product by `id` or `handle` (URL-friendly identifier). Pass either — whichever is provided wins; if both are missing, returns null. Returns null if the product is not storefront-accessible (must be `ACTIVE` status with `PUBLIC` or `BUNDLE_ONLY` visibility).
|
|
45
45
|
|
|
46
46
|
**Variables**:
|
|
47
47
|
- `$id`: `ID`
|
|
@@ -274,18 +274,18 @@ query Collections($first: Int = 20, $after: String, $query: String, $sortKey: Co
|
|
|
274
274
|
|
|
275
275
|
**Section**: Categories
|
|
276
276
|
|
|
277
|
-
**Description**: Fetches a single category by `id` or `
|
|
277
|
+
**Description**: Fetches a single category by `id` or `handle` with its parent and immediate children. Use for breadcrumbs and sub-navigation. Nested queries on `parent` / `children` are batched server-side — safe to use in lists without N+1 concerns.
|
|
278
278
|
|
|
279
279
|
**Variables**:
|
|
280
280
|
- `$id`: `ID`
|
|
281
|
-
- `$
|
|
281
|
+
- `$handle`: `String`
|
|
282
282
|
|
|
283
283
|
**Fragments used**: `Category`
|
|
284
284
|
|
|
285
285
|
**GraphQL**:
|
|
286
286
|
```graphql
|
|
287
|
-
query Category($id: ID, $
|
|
288
|
-
category(id: $id,
|
|
287
|
+
query Category($id: ID, $handle: String) {
|
|
288
|
+
category(id: $id, handle: $handle) {
|
|
289
289
|
...Category
|
|
290
290
|
parent {
|
|
291
291
|
...Category
|
|
@@ -410,6 +410,33 @@ query CustomerProfile {
|
|
|
410
410
|
}
|
|
411
411
|
```
|
|
412
412
|
|
|
413
|
+
### Query: `CustomerAddresses`
|
|
414
|
+
|
|
415
|
+
**Section**: Customer (requires auth)
|
|
416
|
+
|
|
417
|
+
**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`.
|
|
418
|
+
|
|
419
|
+
**Variables**: none
|
|
420
|
+
|
|
421
|
+
**Fragments used**: `MailingAddress`, `PageInfo`
|
|
422
|
+
|
|
423
|
+
**GraphQL**:
|
|
424
|
+
```graphql
|
|
425
|
+
query CustomerAddresses {
|
|
426
|
+
customer {
|
|
427
|
+
addresses(first: 50) {
|
|
428
|
+
nodes {
|
|
429
|
+
...MailingAddress
|
|
430
|
+
}
|
|
431
|
+
pageInfo {
|
|
432
|
+
...PageInfo
|
|
433
|
+
}
|
|
434
|
+
totalCount
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
```
|
|
439
|
+
|
|
413
440
|
### Query: `CustomerOrder`
|
|
414
441
|
|
|
415
442
|
**Section**: Customer (requires auth)
|
|
@@ -1018,13 +1045,13 @@ query WishlistById($id: ID!) {
|
|
|
1018
1045
|
|
|
1019
1046
|
**Section**: Blog
|
|
1020
1047
|
|
|
1021
|
-
**Description**: Paginated list of published blog posts. Filter by `
|
|
1048
|
+
**Description**: Paginated list of published blog posts. Filter by `categoryHandle`, `tagHandle`, or `featured` (boolean flag, not enum). Sort: `PUBLISHED_AT` (default), `TITLE`, `VIEW_COUNT`, or `CREATED_AT`. Public; no auth required.
|
|
1022
1049
|
|
|
1023
1050
|
**Variables**:
|
|
1024
1051
|
- `$first`: `Int` *(default: `20`)*
|
|
1025
1052
|
- `$after`: `String`
|
|
1026
|
-
- `$
|
|
1027
|
-
- `$
|
|
1053
|
+
- `$categoryHandle`: `String`
|
|
1054
|
+
- `$tagHandle`: `String`
|
|
1028
1055
|
- `$featured`: `Boolean`
|
|
1029
1056
|
- `$sortKey`: `BlogPostSortKey` *(default: `PUBLISHED_AT`)*
|
|
1030
1057
|
- `$reverse`: `Boolean` *(default: `false`)*
|
|
@@ -1033,12 +1060,12 @@ query WishlistById($id: ID!) {
|
|
|
1033
1060
|
|
|
1034
1061
|
**GraphQL**:
|
|
1035
1062
|
```graphql
|
|
1036
|
-
query BlogPosts($first: Int = 20, $after: String, $
|
|
1063
|
+
query BlogPosts($first: Int = 20, $after: String, $categoryHandle: String, $tagHandle: String, $featured: Boolean, $sortKey: BlogPostSortKey = PUBLISHED_AT, $reverse: Boolean = false) {
|
|
1037
1064
|
blogPosts(
|
|
1038
1065
|
first: $first
|
|
1039
1066
|
after: $after
|
|
1040
|
-
|
|
1041
|
-
|
|
1067
|
+
categoryHandle: $categoryHandle
|
|
1068
|
+
tagHandle: $tagHandle
|
|
1042
1069
|
featured: $featured
|
|
1043
1070
|
sortKey: $sortKey
|
|
1044
1071
|
reverse: $reverse
|
|
@@ -1061,18 +1088,18 @@ query BlogPosts($first: Int = 20, $after: String, $categorySlug: String, $tagSlu
|
|
|
1061
1088
|
|
|
1062
1089
|
**Section**: Blog
|
|
1063
1090
|
|
|
1064
|
-
**Description**: Fetches a single blog post by `id` or `
|
|
1091
|
+
**Description**: Fetches a single blog post by `id` or `handle`. Visibility-gated: returns null if the post is not yet `PUBLISHED` or if its publish date is in the future (scheduled posts stay hidden until their publish time). Side effect: fetching a post increments its `view_count` asynchronously (does not block the response).
|
|
1065
1092
|
|
|
1066
1093
|
**Variables**:
|
|
1067
1094
|
- `$id`: `ID`
|
|
1068
|
-
- `$
|
|
1095
|
+
- `$handle`: `String`
|
|
1069
1096
|
|
|
1070
1097
|
**Fragments used**: `BlogPost`
|
|
1071
1098
|
|
|
1072
1099
|
**GraphQL**:
|
|
1073
1100
|
```graphql
|
|
1074
|
-
query BlogPost($id: ID, $
|
|
1075
|
-
blogPost(id: $id,
|
|
1101
|
+
query BlogPost($id: ID, $handle: String) {
|
|
1102
|
+
blogPost(id: $id, handle: $handle) {
|
|
1076
1103
|
...BlogPost
|
|
1077
1104
|
}
|
|
1078
1105
|
}
|
|
@@ -1202,7 +1229,7 @@ query Pages($first: Int = 20, $after: String, $sortKey: PageSortKeys = TITLE, $r
|
|
|
1202
1229
|
|
|
1203
1230
|
**Section**: Content: Navigation Menus
|
|
1204
1231
|
|
|
1205
|
-
**Description**: Fetches a navigation menu by `handle` (e.g. `"main-menu"`, `"footer"`, `"mobile"`). Returns the nested item tree. Each item is typed as one of: `HTTP`, `FRONTPAGE`, `SEARCH`, `CATALOG`, `BLOG`, `PRODUCT`, `COLLECTION`, `CATEGORY`, or `
|
|
1232
|
+
**Description**: Fetches a navigation menu by `handle` (e.g. `"main-menu"`, `"footer"`, `"mobile"`). Returns the nested item tree (up to 3 levels). Each item is typed as one of: `HTTP`, `FRONTPAGE`, `SEARCH`, `CATALOG`, `BLOG`, `PRODUCT`, `COLLECTION`, `CATEGORY`, `PAGE`, or `BRAND` — switch on the type to render the right link target. Each resource-linked item exposes both a pre-resolved `url` (standard `/categories|/collections|/pages|/products|/brands/<handle>` convention) and a typed `resource` union with the raw handle so storefronts with custom routing can construct their own paths instead. All resource lookups are batched per request — no N+1 even for deep menus.
|
|
1206
1233
|
|
|
1207
1234
|
**Variables**:
|
|
1208
1235
|
- `$handle`: `String!`
|
|
@@ -2590,7 +2617,7 @@ fragment ProductCard on Product {
|
|
|
2590
2617
|
vendor
|
|
2591
2618
|
categories {
|
|
2592
2619
|
id
|
|
2593
|
-
|
|
2620
|
+
handle
|
|
2594
2621
|
name
|
|
2595
2622
|
}
|
|
2596
2623
|
isAvailable
|
|
@@ -2723,7 +2750,7 @@ fragment Collection on Collection {
|
|
|
2723
2750
|
|
|
2724
2751
|
**Section**: Categories
|
|
2725
2752
|
|
|
2726
|
-
**Description**: Category node in the shop's taxonomy — name,
|
|
2753
|
+
**Description**: Category node in the shop's taxonomy — name, handle, hero image, depth `level`, materialized `path`, product count, sort order. Spread on category cards and breadcrumb segments. Does NOT include parent / children — query those fields separately and let the server batch them.
|
|
2727
2754
|
|
|
2728
2755
|
**Uses fragments**: `ImageCard`
|
|
2729
2756
|
|
|
@@ -2732,7 +2759,7 @@ fragment Collection on Collection {
|
|
|
2732
2759
|
fragment Category on Category {
|
|
2733
2760
|
id
|
|
2734
2761
|
name
|
|
2735
|
-
|
|
2762
|
+
handle
|
|
2736
2763
|
description
|
|
2737
2764
|
image {
|
|
2738
2765
|
...ImageCard
|
|
@@ -2744,11 +2771,29 @@ fragment Category on Category {
|
|
|
2744
2771
|
}
|
|
2745
2772
|
```
|
|
2746
2773
|
|
|
2774
|
+
### Fragment: `PickupPoint` on `PickupPoint`
|
|
2775
|
+
|
|
2776
|
+
**Section**: Customer
|
|
2777
|
+
|
|
2778
|
+
**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.
|
|
2779
|
+
|
|
2780
|
+
**GraphQL**:
|
|
2781
|
+
```graphql
|
|
2782
|
+
fragment PickupPoint on PickupPoint {
|
|
2783
|
+
provider
|
|
2784
|
+
pointId
|
|
2785
|
+
name
|
|
2786
|
+
address
|
|
2787
|
+
}
|
|
2788
|
+
```
|
|
2789
|
+
|
|
2747
2790
|
### Fragment: `MailingAddress` on `MailingAddress`
|
|
2748
2791
|
|
|
2749
2792
|
**Section**: Customer
|
|
2750
2793
|
|
|
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.
|
|
2794
|
+
**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.
|
|
2795
|
+
|
|
2796
|
+
**Uses fragments**: `PickupPoint`
|
|
2752
2797
|
|
|
2753
2798
|
**GraphQL**:
|
|
2754
2799
|
```graphql
|
|
@@ -2768,6 +2813,11 @@ fragment MailingAddress on MailingAddress {
|
|
|
2768
2813
|
stateCode
|
|
2769
2814
|
postalCode
|
|
2770
2815
|
isDefault
|
|
2816
|
+
taxId
|
|
2817
|
+
vatNumber
|
|
2818
|
+
pickupPoint {
|
|
2819
|
+
...PickupPoint
|
|
2820
|
+
}
|
|
2771
2821
|
}
|
|
2772
2822
|
```
|
|
2773
2823
|
|
|
@@ -3123,13 +3173,14 @@ fragment CartShippingMethod on CartShippingMethod {
|
|
|
3123
3173
|
|
|
3124
3174
|
**Section**: Cart
|
|
3125
3175
|
|
|
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`.
|
|
3176
|
+
**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
3177
|
|
|
3128
3178
|
**Uses fragments**: `Money`
|
|
3129
3179
|
|
|
3130
3180
|
**GraphQL**:
|
|
3131
3181
|
```graphql
|
|
3132
3182
|
fragment CartAppliedGiftCard on CartAppliedGiftCard {
|
|
3183
|
+
id
|
|
3133
3184
|
maskedCode
|
|
3134
3185
|
lastCharacters
|
|
3135
3186
|
appliedAmount {
|
|
@@ -3772,7 +3823,7 @@ fragment FreeShippingProgress on FreeShippingProgress {
|
|
|
3772
3823
|
|
|
3773
3824
|
**Section**: Shipping Methods
|
|
3774
3825
|
|
|
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.
|
|
3826
|
+
**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
3827
|
|
|
3777
3828
|
**Uses fragments**: `DeliveryEstimate`, `FreeShippingProgress`, `Money`, `ShippingCarrier`
|
|
3778
3829
|
|
|
@@ -3782,6 +3833,7 @@ fragment AvailableShippingMethod on AvailableShippingMethod {
|
|
|
3782
3833
|
id
|
|
3783
3834
|
name
|
|
3784
3835
|
description
|
|
3836
|
+
deliveryType
|
|
3785
3837
|
carrier {
|
|
3786
3838
|
...ShippingCarrier
|
|
3787
3839
|
}
|
|
@@ -3904,14 +3956,14 @@ fragment PriceRangeFilter on PriceRange {
|
|
|
3904
3956
|
|
|
3905
3957
|
**Section**: Attribute Filters
|
|
3906
3958
|
|
|
3907
|
-
**Description**: One category option in the categories filter — id, name,
|
|
3959
|
+
**Description**: One category option in the categories filter — id, name, handle, count of products in this category within the current listing context, level + parentId for tree rendering.
|
|
3908
3960
|
|
|
3909
3961
|
**GraphQL**:
|
|
3910
3962
|
```graphql
|
|
3911
3963
|
fragment CategoryFilterOption on CategoryFilterOption {
|
|
3912
3964
|
id
|
|
3913
3965
|
name
|
|
3914
|
-
|
|
3966
|
+
handle
|
|
3915
3967
|
productCount
|
|
3916
3968
|
level
|
|
3917
3969
|
parentId
|
|
@@ -4094,7 +4146,7 @@ fragment LoyaltyTransaction on LoyaltyTransaction {
|
|
|
4094
4146
|
fragment LoyaltyReward on LoyaltyReward {
|
|
4095
4147
|
id
|
|
4096
4148
|
name
|
|
4097
|
-
|
|
4149
|
+
handle
|
|
4098
4150
|
type
|
|
4099
4151
|
pointsCost
|
|
4100
4152
|
discountPercent
|
|
@@ -4327,14 +4379,14 @@ fragment Wishlist on Wishlist {
|
|
|
4327
4379
|
|
|
4328
4380
|
**Section**: Blog
|
|
4329
4381
|
|
|
4330
|
-
**Description**: Blog category — name,
|
|
4382
|
+
**Description**: Blog category — name, handle, description, post count. Spread on category navigation and post category labels.
|
|
4331
4383
|
|
|
4332
4384
|
**GraphQL**:
|
|
4333
4385
|
```graphql
|
|
4334
4386
|
fragment BlogCategory on BlogCategory {
|
|
4335
4387
|
id
|
|
4336
4388
|
name
|
|
4337
|
-
|
|
4389
|
+
handle
|
|
4338
4390
|
description
|
|
4339
4391
|
postCount
|
|
4340
4392
|
}
|
|
@@ -4344,14 +4396,14 @@ fragment BlogCategory on BlogCategory {
|
|
|
4344
4396
|
|
|
4345
4397
|
**Section**: Blog
|
|
4346
4398
|
|
|
4347
|
-
**Description**: Blog tag — name,
|
|
4399
|
+
**Description**: Blog tag — name, handle, post count. Spread on tag clouds and post tag labels.
|
|
4348
4400
|
|
|
4349
4401
|
**GraphQL**:
|
|
4350
4402
|
```graphql
|
|
4351
4403
|
fragment BlogTag on BlogTag {
|
|
4352
4404
|
id
|
|
4353
4405
|
name
|
|
4354
|
-
|
|
4406
|
+
handle
|
|
4355
4407
|
postCount
|
|
4356
4408
|
}
|
|
4357
4409
|
```
|
|
@@ -4360,7 +4412,7 @@ fragment BlogTag on BlogTag {
|
|
|
4360
4412
|
|
|
4361
4413
|
**Section**: Blog
|
|
4362
4414
|
|
|
4363
|
-
**Description**: Full blog post — title,
|
|
4415
|
+
**Description**: Full blog post — title, handle, excerpt, content (with `contentFormat` indicating HTML/Markdown), featured image, author, category, tags, publish date, reading time, view + comment counts, SEO metadata. Spread on the post detail page.
|
|
4364
4416
|
|
|
4365
4417
|
**Uses fragments**: `BlogCategory`, `BlogTag`, `ImageCard`, `ImageThumbnail`
|
|
4366
4418
|
|
|
@@ -4369,7 +4421,7 @@ fragment BlogTag on BlogTag {
|
|
|
4369
4421
|
fragment BlogPost on BlogPost {
|
|
4370
4422
|
id
|
|
4371
4423
|
title
|
|
4372
|
-
|
|
4424
|
+
handle
|
|
4373
4425
|
excerpt
|
|
4374
4426
|
content
|
|
4375
4427
|
contentFormat
|
|
@@ -4575,7 +4627,7 @@ fragment VariantStoreAvailability on ProductVariant {
|
|
|
4575
4627
|
|
|
4576
4628
|
**Section**: Pages
|
|
4577
4629
|
|
|
4578
|
-
**Description**: CMS page — handle (URL
|
|
4630
|
+
**Description**: CMS page — handle (URL-friendly identifier), title, body (HTML), excerpt, SEO metadata, publish date. Spread on About / Privacy / Terms / Returns Policy pages.
|
|
4579
4631
|
|
|
4580
4632
|
**GraphQL**:
|
|
4581
4633
|
```graphql
|
|
@@ -4599,7 +4651,7 @@ fragment ShopPage on ShopPage {
|
|
|
4599
4651
|
|
|
4600
4652
|
**Section**: Navigation Menus
|
|
4601
4653
|
|
|
4602
|
-
**Description**: One menu item with up to 3 levels of nested children — title, URL, type (`HTTP` / `FRONTPAGE` / `SEARCH` / `CATALOG` / `BLOG` / `PRODUCT` / `COLLECTION` / `CATEGORY` / `PAGE`), `resourceId` for typed items, optional image. Switch on `type` to
|
|
4654
|
+
**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.
|
|
4603
4655
|
|
|
4604
4656
|
**Uses fragments**: `Image`
|
|
4605
4657
|
|
|
@@ -4611,6 +4663,35 @@ fragment MenuItem on MenuItem {
|
|
|
4611
4663
|
url
|
|
4612
4664
|
type
|
|
4613
4665
|
resourceId
|
|
4666
|
+
resource {
|
|
4667
|
+
__typename
|
|
4668
|
+
... on Category {
|
|
4669
|
+
id
|
|
4670
|
+
handle
|
|
4671
|
+
name
|
|
4672
|
+
}
|
|
4673
|
+
... on Collection {
|
|
4674
|
+
id
|
|
4675
|
+
handle
|
|
4676
|
+
title
|
|
4677
|
+
}
|
|
4678
|
+
... on ShopPage {
|
|
4679
|
+
id
|
|
4680
|
+
handle
|
|
4681
|
+
title
|
|
4682
|
+
}
|
|
4683
|
+
... on Product {
|
|
4684
|
+
id
|
|
4685
|
+
handle
|
|
4686
|
+
title
|
|
4687
|
+
}
|
|
4688
|
+
... on Brand {
|
|
4689
|
+
id
|
|
4690
|
+
handle
|
|
4691
|
+
name
|
|
4692
|
+
logo
|
|
4693
|
+
}
|
|
4694
|
+
}
|
|
4614
4695
|
image {
|
|
4615
4696
|
...Image
|
|
4616
4697
|
}
|
|
@@ -4620,12 +4701,70 @@ fragment MenuItem on MenuItem {
|
|
|
4620
4701
|
url
|
|
4621
4702
|
type
|
|
4622
4703
|
resourceId
|
|
4704
|
+
resource {
|
|
4705
|
+
__typename
|
|
4706
|
+
... on Category {
|
|
4707
|
+
id
|
|
4708
|
+
handle
|
|
4709
|
+
name
|
|
4710
|
+
}
|
|
4711
|
+
... on Collection {
|
|
4712
|
+
id
|
|
4713
|
+
handle
|
|
4714
|
+
title
|
|
4715
|
+
}
|
|
4716
|
+
... on ShopPage {
|
|
4717
|
+
id
|
|
4718
|
+
handle
|
|
4719
|
+
title
|
|
4720
|
+
}
|
|
4721
|
+
... on Product {
|
|
4722
|
+
id
|
|
4723
|
+
handle
|
|
4724
|
+
title
|
|
4725
|
+
}
|
|
4726
|
+
... on Brand {
|
|
4727
|
+
id
|
|
4728
|
+
handle
|
|
4729
|
+
name
|
|
4730
|
+
logo
|
|
4731
|
+
}
|
|
4732
|
+
}
|
|
4623
4733
|
items {
|
|
4624
4734
|
id
|
|
4625
4735
|
title
|
|
4626
4736
|
url
|
|
4627
4737
|
type
|
|
4628
4738
|
resourceId
|
|
4739
|
+
resource {
|
|
4740
|
+
__typename
|
|
4741
|
+
... on Category {
|
|
4742
|
+
id
|
|
4743
|
+
handle
|
|
4744
|
+
name
|
|
4745
|
+
}
|
|
4746
|
+
... on Collection {
|
|
4747
|
+
id
|
|
4748
|
+
handle
|
|
4749
|
+
title
|
|
4750
|
+
}
|
|
4751
|
+
... on ShopPage {
|
|
4752
|
+
id
|
|
4753
|
+
handle
|
|
4754
|
+
title
|
|
4755
|
+
}
|
|
4756
|
+
... on Product {
|
|
4757
|
+
id
|
|
4758
|
+
handle
|
|
4759
|
+
title
|
|
4760
|
+
}
|
|
4761
|
+
... on Brand {
|
|
4762
|
+
id
|
|
4763
|
+
handle
|
|
4764
|
+
name
|
|
4765
|
+
logo
|
|
4766
|
+
}
|
|
4767
|
+
}
|
|
4629
4768
|
}
|
|
4630
4769
|
}
|
|
4631
4770
|
}
|
|
@@ -4723,7 +4862,7 @@ fragment ProductAttributeOption on ProductAttributeOption {
|
|
|
4723
4862
|
fragment ProductAttributeDefinition on ProductAttributeDefinition {
|
|
4724
4863
|
id
|
|
4725
4864
|
name
|
|
4726
|
-
|
|
4865
|
+
handle
|
|
4727
4866
|
description
|
|
4728
4867
|
type
|
|
4729
4868
|
fillingMode
|