@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/llms-full.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  # DoSwiftly Storefront Operations — Full Reference
2
2
 
3
- > Schema version: **13.1.0**
4
- > 50 queries · 40 mutations · 100 fragments
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 slug). 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).
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 `slug` 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.
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
- - `$slug`: `String`
281
+ - `$handle`: `String`
282
282
 
283
283
  **Fragments used**: `Category`
284
284
 
285
285
  **GraphQL**:
286
286
  ```graphql
287
- query Category($id: ID, $slug: String) {
288
- category(id: $id, slug: $slug) {
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 `categorySlug`, `tagSlug`, or `featured` (boolean flag, not enum). Sort: `PUBLISHED_AT` (default), `TITLE`, `VIEW_COUNT`, or `CREATED_AT`. Public; no auth required.
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
- - `$categorySlug`: `String`
1027
- - `$tagSlug`: `String`
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, $categorySlug: String, $tagSlug: String, $featured: Boolean, $sortKey: BlogPostSortKey = PUBLISHED_AT, $reverse: Boolean = false) {
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
- categorySlug: $categorySlug
1041
- tagSlug: $tagSlug
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 `slug`. 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).
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
- - `$slug`: `String`
1095
+ - `$handle`: `String`
1069
1096
 
1070
1097
  **Fragments used**: `BlogPost`
1071
1098
 
1072
1099
  **GraphQL**:
1073
1100
  ```graphql
1074
- query BlogPost($id: ID, $slug: String) {
1075
- blogPost(id: $id, slug: $slug) {
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 `PAGE` — switch on the type to render the right link target. Linked resources and URLs are resolved on demand by the field selections in the `Menu` fragment.
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
- slug
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, slug, 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.
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
- slug
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, slug, count of products in this category within the current listing context, level + parentId for tree rendering.
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
- slug
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
- slug
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, slug, description, post count. Spread on category navigation and post category labels.
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
- slug
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, slug, post count. Spread on tag clouds and post tag labels.
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
- slug
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, slug, 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.
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
- slug
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 slug), title, body (HTML), excerpt, SEO metadata, publish date. Spread on About / Privacy / Terms / Returns Policy pages.
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 render the right link target.
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
- slug
4865
+ handle
4727
4866
  description
4728
4867
  type
4729
4868
  fillingMode