@sixtyninecommerce/admin 0.9.0 → 0.11.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.
Files changed (258) hide show
  1. package/README.md +4598 -128
  2. package/dist/catalog/assets.d.ts +120 -8
  3. package/dist/catalog/assets.js +98 -12
  4. package/dist/catalog/collections.d.ts +279 -14
  5. package/dist/catalog/collections.js +246 -15
  6. package/dist/catalog/index.d.ts +9 -2
  7. package/dist/catalog/index.js +4 -0
  8. package/dist/catalog/products.d.ts +318 -17
  9. package/dist/catalog/products.js +182 -14
  10. package/dist/catalog/properties.d.ts +102 -14
  11. package/dist/catalog/properties.js +13 -0
  12. package/dist/catalog/recommendations.d.ts +261 -0
  13. package/dist/catalog/recommendations.js +145 -0
  14. package/dist/catalog/reviews.d.ts +368 -0
  15. package/dist/catalog/reviews.js +318 -0
  16. package/dist/catalog/types.d.ts +17 -1
  17. package/dist/catalog/types.js +10 -0
  18. package/dist/catalog/variant-find.d.ts +136 -0
  19. package/dist/catalog/variant-find.js +239 -0
  20. package/dist/catalog/variants.d.ts +282 -25
  21. package/dist/catalog/variants.js +173 -25
  22. package/dist/catalog/visibility.d.ts +20 -5
  23. package/dist/catalog/visibility.js +19 -1
  24. package/dist/client.d.ts +116 -9
  25. package/dist/client.js +41 -7
  26. package/dist/content/assets.d.ts +286 -0
  27. package/dist/content/assets.js +181 -0
  28. package/dist/content/items.d.ts +269 -0
  29. package/dist/content/items.js +170 -0
  30. package/dist/content/types.d.ts +282 -0
  31. package/dist/content/types.js +100 -0
  32. package/dist/customers/age-verification.d.ts +66 -0
  33. package/dist/customers/age-verification.js +79 -0
  34. package/dist/customers/credit.d.ts +263 -0
  35. package/dist/customers/credit.js +244 -0
  36. package/dist/customers/delivery-preferences.d.ts +120 -0
  37. package/dist/customers/delivery-preferences.js +97 -0
  38. package/dist/customers/groups.d.ts +207 -0
  39. package/dist/customers/groups.js +438 -0
  40. package/dist/customers/index.d.ts +447 -37
  41. package/dist/customers/index.js +313 -40
  42. package/dist/customers/invitation-status.d.ts +57 -0
  43. package/dist/customers/invitation-status.js +21 -0
  44. package/dist/customers/notes.d.ts +67 -0
  45. package/dist/customers/notes.js +51 -0
  46. package/dist/customers/notification-recipients.d.ts +97 -0
  47. package/dist/customers/notification-recipients.js +84 -0
  48. package/dist/customers/saved-lists.d.ts +42 -0
  49. package/dist/customers/saved-lists.js +61 -0
  50. package/dist/customers/vat.d.ts +83 -0
  51. package/dist/customers/vat.js +46 -0
  52. package/dist/customers/wire.d.ts +20 -0
  53. package/dist/customers/wire.js +35 -0
  54. package/dist/documents/ar.d.ts +307 -0
  55. package/dist/documents/ar.js +254 -0
  56. package/dist/documents/index.d.ts +731 -21
  57. package/dist/documents/index.js +436 -24
  58. package/dist/documents/pdf.d.ts +2 -0
  59. package/dist/documents/pdf.js +11 -0
  60. package/dist/fulfillments/create.d.ts +167 -0
  61. package/dist/fulfillments/create.js +216 -0
  62. package/dist/fulfillments/index.d.ts +121 -10
  63. package/dist/fulfillments/index.js +120 -2
  64. package/dist/fulfillments/payment-policy.d.ts +64 -0
  65. package/dist/fulfillments/payment-policy.js +140 -0
  66. package/dist/fulfillments/warehouse.d.ts +724 -0
  67. package/dist/fulfillments/warehouse.js +914 -0
  68. package/dist/geo/index.d.ts +119 -0
  69. package/dist/geo/index.js +107 -0
  70. package/dist/index.d.ts +129 -30
  71. package/dist/index.js +47 -9
  72. package/dist/integrations/afas-actions.d.ts +234 -0
  73. package/dist/integrations/afas-actions.js +310 -0
  74. package/dist/integrations/afas-types.d.ts +483 -0
  75. package/dist/integrations/afas-types.js +5 -0
  76. package/dist/integrations/afas.d.ts +234 -0
  77. package/dist/integrations/afas.js +290 -0
  78. package/dist/integrations/connections.d.ts +103 -0
  79. package/dist/integrations/connections.js +55 -0
  80. package/dist/integrations/esp.d.ts +313 -0
  81. package/dist/integrations/esp.js +169 -0
  82. package/dist/integrations/exact-online-types.d.ts +423 -0
  83. package/dist/integrations/exact-online-types.js +6 -0
  84. package/dist/integrations/exact-online.d.ts +248 -0
  85. package/dist/integrations/exact-online.js +376 -0
  86. package/dist/integrations/index.d.ts +40 -0
  87. package/dist/integrations/index.js +24 -0
  88. package/dist/integrations/pipeline-keys.d.ts +13 -0
  89. package/dist/integrations/pipeline-keys.js +22 -0
  90. package/dist/integrations/pipelines.d.ts +114 -0
  91. package/dist/integrations/pipelines.js +46 -0
  92. package/dist/integrations/types.d.ts +322 -0
  93. package/dist/integrations/types.js +8 -0
  94. package/dist/jobs/bulk-action-run.d.ts +11 -2
  95. package/dist/jobs/bulk-action-run.js +4 -5
  96. package/dist/locations/index.d.ts +66 -0
  97. package/dist/locations/index.js +31 -0
  98. package/dist/meta/index.d.ts +162 -0
  99. package/dist/orders/bulk.d.ts +75 -0
  100. package/dist/orders/bulk.js +150 -0
  101. package/dist/orders/cancel-with-money.d.ts +227 -0
  102. package/dist/orders/cancel-with-money.js +153 -0
  103. package/dist/orders/commit-edit.d.ts +7 -1
  104. package/dist/orders/commit-edit.js +5 -1
  105. package/dist/orders/deposit-policy.d.ts +103 -0
  106. package/dist/orders/deposit-policy.js +202 -0
  107. package/dist/orders/drafts.d.ts +800 -0
  108. package/dist/orders/drafts.js +771 -0
  109. package/dist/orders/fields.d.ts +245 -0
  110. package/dist/orders/fields.js +188 -0
  111. package/dist/orders/get.d.ts +29 -19
  112. package/dist/orders/get.js +17 -8
  113. package/dist/orders/index.d.ts +125 -5
  114. package/dist/orders/index.js +35 -2
  115. package/dist/orders/lifecycle.d.ts +128 -0
  116. package/dist/orders/lifecycle.js +158 -0
  117. package/dist/orders/line-price-preview.d.ts +7 -2
  118. package/dist/orders/list.d.ts +222 -0
  119. package/dist/orders/list.js +377 -0
  120. package/dist/orders/manual-discounts.d.ts +11 -2
  121. package/dist/orders/manual-discounts.js +2 -0
  122. package/dist/orders/manual-pricing.d.ts +5 -0
  123. package/dist/orders/order-entry.d.ts +20 -7
  124. package/dist/orders/plan-edit.d.ts +1 -1
  125. package/dist/orders/plan-edit.js +4 -1
  126. package/dist/orders/settings.d.ts +201 -0
  127. package/dist/orders/settings.js +325 -0
  128. package/dist/orders/status.d.ts +159 -13
  129. package/dist/orders/status.js +21 -0
  130. package/dist/orders/surcharges.d.ts +8 -1
  131. package/dist/orders/surcharges.js +3 -2
  132. package/dist/payments/account-credit.d.ts +30 -0
  133. package/dist/payments/account-credit.js +19 -0
  134. package/dist/payments/ar.d.ts +292 -0
  135. package/dist/payments/ar.js +223 -0
  136. package/dist/payments/connected-account.d.ts +47 -0
  137. package/dist/payments/connected-account.js +61 -0
  138. package/dist/payments/credit-noted-fields.d.ts +12 -0
  139. package/dist/payments/credit-noted-fields.js +37 -0
  140. package/dist/payments/index.d.ts +263 -10
  141. package/dist/payments/index.js +133 -1
  142. package/dist/payments/methods.d.ts +332 -0
  143. package/dist/payments/methods.js +363 -0
  144. package/dist/payments/mollie-methods.d.ts +159 -0
  145. package/dist/payments/mollie-methods.js +141 -0
  146. package/dist/payments/payment-links.d.ts +180 -0
  147. package/dist/payments/payment-links.js +97 -0
  148. package/dist/payments/provider-keys.d.ts +150 -0
  149. package/dist/payments/provider-keys.js +118 -0
  150. package/dist/payments/providers.d.ts +86 -11
  151. package/dist/payments/providers.js +29 -0
  152. package/dist/payments/requests.d.ts +144 -0
  153. package/dist/payments/requests.js +92 -0
  154. package/dist/payments/store-credit-fields.d.ts +15 -0
  155. package/dist/payments/store-credit-fields.js +51 -0
  156. package/dist/pickups/index.d.ts +104 -0
  157. package/dist/pickups/index.js +105 -0
  158. package/dist/platform/channels.d.ts +132 -0
  159. package/dist/platform/channels.js +128 -0
  160. package/dist/platform/geo.d.ts +123 -0
  161. package/dist/platform/geo.js +144 -0
  162. package/dist/platform/tax.d.ts +154 -0
  163. package/dist/platform/tax.js +139 -0
  164. package/dist/pos/anomalies.d.ts +158 -0
  165. package/dist/pos/anomalies.js +64 -0
  166. package/dist/pos/assisted-selling.d.ts +79 -0
  167. package/dist/pos/assisted-selling.js +38 -0
  168. package/dist/pos/exchanges.d.ts +103 -0
  169. package/dist/pos/exchanges.js +22 -0
  170. package/dist/pos/gift-cards.d.ts +135 -0
  171. package/dist/pos/gift-cards.js +47 -0
  172. package/dist/pos/index.d.ts +2125 -32
  173. package/dist/pos/index.js +742 -4
  174. package/dist/pos/no-receipt.d.ts +94 -0
  175. package/dist/pos/no-receipt.js +25 -0
  176. package/dist/pos/offline-sales.d.ts +187 -0
  177. package/dist/pos/offline-sales.js +116 -0
  178. package/dist/pos/pay-by-link.d.ts +143 -0
  179. package/dist/pos/pay-by-link.js +57 -0
  180. package/dist/pos/quick-keys.d.ts +103 -0
  181. package/dist/pos/quick-keys.js +45 -0
  182. package/dist/pos/reports.d.ts +360 -0
  183. package/dist/pos/reports.js +62 -0
  184. package/dist/pos/returns.d.ts +217 -0
  185. package/dist/pos/returns.js +53 -0
  186. package/dist/pricing/bulk-coupons.d.ts +139 -0
  187. package/dist/pricing/bulk-coupons.js +112 -0
  188. package/dist/pricing/index.d.ts +177 -4
  189. package/dist/pricing/index.js +176 -1
  190. package/dist/pricing/price-lists.d.ts +604 -0
  191. package/dist/pricing/price-lists.js +600 -0
  192. package/dist/pricing/vouchers.d.ts +103 -0
  193. package/dist/pricing/vouchers.js +69 -0
  194. package/dist/purchasing/alerts.d.ts +89 -0
  195. package/dist/purchasing/alerts.js +62 -0
  196. package/dist/purchasing/cost.d.ts +110 -0
  197. package/dist/purchasing/cost.js +86 -0
  198. package/dist/purchasing/index.d.ts +36 -0
  199. package/dist/purchasing/index.js +16 -0
  200. package/dist/purchasing/purchase-orders.d.ts +548 -0
  201. package/dist/purchasing/purchase-orders.js +491 -0
  202. package/dist/purchasing/replenishment.d.ts +281 -0
  203. package/dist/purchasing/replenishment.js +240 -0
  204. package/dist/purchasing/settings.d.ts +152 -0
  205. package/dist/purchasing/settings.js +181 -0
  206. package/dist/purchasing/suppliers.d.ts +476 -0
  207. package/dist/purchasing/suppliers.js +438 -0
  208. package/dist/quotes/index.d.ts +501 -0
  209. package/dist/quotes/index.js +439 -0
  210. package/dist/reports/index.d.ts +71 -8
  211. package/dist/reports/index.js +74 -11
  212. package/dist/returns/index.d.ts +818 -0
  213. package/dist/returns/index.js +844 -0
  214. package/dist/search/index.d.ts +174 -0
  215. package/dist/search/index.js +125 -0
  216. package/dist/shipping/definitions.d.ts +29 -0
  217. package/dist/shipping/definitions.js +47 -0
  218. package/dist/shipping/fulfillment-profiles.d.ts +174 -0
  219. package/dist/shipping/fulfillment-profiles.js +104 -0
  220. package/dist/shipping/hendriks.d.ts +97 -0
  221. package/dist/shipping/hendriks.js +50 -0
  222. package/dist/shipping/index.d.ts +48 -0
  223. package/dist/shipping/index.js +25 -0
  224. package/dist/shipping/methods.d.ts +198 -0
  225. package/dist/shipping/methods.js +240 -0
  226. package/dist/shipping/myparcel.d.ts +254 -0
  227. package/dist/shipping/myparcel.js +178 -0
  228. package/dist/shipping/parcel-count-suggestion.d.ts +2 -0
  229. package/dist/shipping/parcel-rule.d.ts +6 -5
  230. package/dist/shipping/parcel-rule.js +21 -23
  231. package/dist/shipping/rate-tables.d.ts +179 -0
  232. package/dist/shipping/rate-tables.js +184 -0
  233. package/dist/stock/index.d.ts +10 -3
  234. package/dist/stock/index.js +3 -0
  235. package/dist/stock/locations.d.ts +144 -0
  236. package/dist/stock/locations.js +168 -0
  237. package/dist/stock/transfers.d.ts +216 -43
  238. package/dist/stock/transfers.js +140 -13
  239. package/dist/stored-value/index.d.ts +214 -4
  240. package/dist/stored-value/index.js +152 -0
  241. package/dist/subscriptions/index.d.ts +682 -0
  242. package/dist/subscriptions/index.js +815 -0
  243. package/dist/tax/index.d.ts +76 -1
  244. package/dist/tax/index.js +50 -0
  245. package/dist/tenant/email-style.d.ts +102 -0
  246. package/dist/tenant/email-style.js +72 -0
  247. package/dist/tenant/email-templates.d.ts +66 -0
  248. package/dist/tenant/email-templates.js +54 -0
  249. package/dist/tenant/notifications.d.ts +23 -17
  250. package/dist/tenant/settings-sources.d.ts +1 -1
  251. package/dist/tenant/time-zone.d.ts +17 -0
  252. package/dist/tenant/time-zone.js +11 -0
  253. package/dist/types.d.ts +51 -4
  254. package/dist/users/index.d.ts +3 -0
  255. package/dist/users/index.js +2 -0
  256. package/dist/users/warehouses.d.ts +50 -0
  257. package/dist/users/warehouses.js +51 -0
  258. package/package.json +2 -2
@@ -2,7 +2,8 @@ import { type Page, type Transport } from '@sixtyninecommerce/core';
2
2
  import type { JobHandle } from '../jobs/index.js';
3
3
  import type { Call, ListOptions } from '../types.js';
4
4
  import { type ProductBulkInput, type ProductBulkRun } from './products-bulk.js';
5
- import { type AssetRef, type Availability, type AvailabilityInput, type CatalogueOwnership, type FacetValueRef, type LanguageCode, type ProductAvailabilityState, type TranslationInput } from './types.js';
5
+ import { type AssetRef, type Availability, type AvailabilityInput, type CatalogueOwnership, type FacetValueRef, type LanguageCode, type PriceBasis, type ProductAvailabilityState, type TranslationInput, type VariantAvailabilityState, type WireAssetRef } from './types.js';
6
+ import { type ParcelPacking, type VariantBackorderPolicy, type VariantPriceInput, type VariantStorePrice } from './variants.js';
6
7
  export interface ProductOptionRef {
7
8
  id: string;
8
9
  code: string;
@@ -12,7 +13,18 @@ export interface ProductOptionGroupRef {
12
13
  id: string;
13
14
  code: string;
14
15
  name: string;
16
+ /**
17
+ * The group is offered for reuse on the store's other products (the option-group editor's
18
+ * "shared" switch); false for a group made for this product alone.
19
+ */
20
+ isShared: boolean;
15
21
  options: ProductOptionRef[];
22
+ /** The group's name in each language it has one in. */
23
+ translations: Array<{
24
+ id: string;
25
+ languageCode: LanguageCode;
26
+ name: string;
27
+ }>;
16
28
  }
17
29
  export interface ProductTranslation {
18
30
  id: string;
@@ -50,6 +62,27 @@ export interface Product extends Availability<ProductAvailabilityState> {
50
62
  * product and in an organization's workspace.
51
63
  */
52
64
  excludedFromStore: boolean;
65
+ /** The brand feeds name; null when none is set. */
66
+ brand: string | null;
67
+ /**
68
+ * The condition feeds state; null when none is set. A string on the wire: a stored value
69
+ * outside {@link ProductCondition} is answered as it is.
70
+ */
71
+ condition: ProductCondition | (string & {}) | null;
72
+ }
73
+ /** A collection a product is in, as {@link ProductsModule.get} names it. */
74
+ export interface ProductCollectionRef {
75
+ id: string;
76
+ name: string;
77
+ slug: string;
78
+ }
79
+ /** A product as {@link ProductsModule.get} reads it: the {@link Product} and its collections. */
80
+ export interface ProductDetail extends Product {
81
+ /**
82
+ * Every collection of the store the product is in, by hand or through a collection's other
83
+ * filters, in the language the call asked for.
84
+ */
85
+ collections: ProductCollectionRef[];
53
86
  }
54
87
  export interface ProductTranslationInput extends TranslationInput {
55
88
  name?: string;
@@ -67,7 +100,15 @@ export interface CreateProductInput extends AvailabilityInput<ProductAvailabilit
67
100
  assetIds?: string[];
68
101
  /** Replaces the product's facet values on update — send the whole set. */
69
102
  facetValueIds?: string[];
103
+ /**
104
+ * The brand feeds name; at most 70 characters when new or changed (`FEED_IDENTIFIER_INVALID`
105
+ * otherwise). Null or blank clears it. A stored value sent back unchanged is never judged.
106
+ */
107
+ brand?: string | null;
108
+ condition?: ProductCondition;
70
109
  }
110
+ /** A product's condition, as feeds state it. */
111
+ export type ProductCondition = 'new' | 'refurbished' | 'used';
71
112
  /** A PATCH: omitted fields are left alone. */
72
113
  export interface UpdateProductInput extends Partial<CreateProductInput> {
73
114
  id: string;
@@ -93,6 +134,24 @@ export interface ProductListOptions extends ListOptions {
93
134
  }
94
135
  /** The engine's bound on one `exclude` or `include` call (`STORE_EXCLUSION_BATCH_LIMIT`). */
95
136
  export declare const MAX_STORE_EXCLUSION_PRODUCTS = 500;
137
+ /** At most this many distinct products per {@link ProductsModule.storePriceRanges} call. */
138
+ export declare const MAX_STORE_PRICE_RANGE_PRODUCTS = 100;
139
+ /**
140
+ * The cheapest and the dearest of a product's variants in the ACTIVE store and the request's
141
+ * currency, as `ProductVariant.storePrice` prices them (stored prices and prices converted at the
142
+ * store's rate, compared). `price` is net and `priceWithTax` gross, as on `storePrice`.
143
+ */
144
+ export interface ProductStorePriceRange {
145
+ min: VariantStorePrice;
146
+ max: VariantStorePrice;
147
+ /** At least one variant the store holds has no price in it; it is left out of min and max, never counted as 0. */
148
+ someVariantsUnpriced: boolean;
149
+ }
150
+ export interface ProductStorePriceRangeEntry {
151
+ productId: string;
152
+ /** Null when the store prices none of the product's variants it holds. */
153
+ range: ProductStorePriceRange | null;
154
+ }
96
155
  /**
97
156
  * The engine's bounds on one `setAvailabilityInStores` or `availabilityInStores` call
98
157
  * (`AVAILABILITY_*_LIMIT`).
@@ -195,6 +254,109 @@ export interface ProductCollectionsResult {
195
254
  reason: ProductCollectionNotRemovedReason | (string & {});
196
255
  }>;
197
256
  }
257
+ /** The product's own fields in a {@link ProductsModule.save}; a PATCH. */
258
+ export interface SaveProductFieldsInput extends AvailabilityInput<ProductAvailabilityState> {
259
+ /** In the save's `languageCode`. */
260
+ name?: string;
261
+ slug?: string;
262
+ description?: string;
263
+ enabled?: boolean;
264
+ /** Null: no featured image. */
265
+ featuredAssetId?: string | null;
266
+ /** The product's images, in display order; replaces the list. */
267
+ assetIds?: string[];
268
+ /** At most 70 characters when new or changed; null or blank clears it. */
269
+ brand?: string | null;
270
+ condition?: ProductCondition;
271
+ }
272
+ /**
273
+ * One variant in a {@link ProductsModule.save}; a PATCH. A price (`price` or `prices`) travels
274
+ * with `priceBasis`, the store's basis, exactly as for `catalog.variants.update`.
275
+ */
276
+ export interface SaveProductVariantInput extends AvailabilityInput<VariantAvailabilityState> {
277
+ id: string;
278
+ /** In the save's `languageCode`; trimmed. */
279
+ name?: string;
280
+ sku?: string;
281
+ enabled?: boolean;
282
+ /** Integer minor units of the store's default currency. */
283
+ price?: number;
284
+ /**
285
+ * The price in each named currency. A currency left out keeps its stored price (the list
286
+ * removes nothing), and one equal to what is stored is no change. Its default-currency entry
287
+ * must equal `price` when both are sent.
288
+ */
289
+ prices?: VariantPriceInput[];
290
+ priceBasis?: PriceBasis;
291
+ taxCategoryId?: string;
292
+ /** Compared as a set. */
293
+ facetValueIds?: string[];
294
+ /** Null: no featured image. */
295
+ featuredAssetId?: string | null;
296
+ assetIds?: string[];
297
+ minOrderQuantity?: number | null;
298
+ salesUnit?: number | null;
299
+ /** Integer minor units of the store's default currency. */
300
+ cost?: number | null;
301
+ packageWeightGrams?: number | null;
302
+ packageLengthCm?: number | null;
303
+ packageWidthCm?: number | null;
304
+ packageHeightCm?: number | null;
305
+ /** 1 to 10,000; null: the store's items per parcel. */
306
+ parcelCapacity?: number | null;
307
+ /** Null: `shared`. */
308
+ parcelPacking?: ParcelPacking | null;
309
+ /** Null: `inherit`. */
310
+ backorderPolicy?: VariantBackorderPolicy | null;
311
+ backorderLimit?: number | null;
312
+ /** 8, 12, 13 or 14 digits when new or changed; null or blank clears it. */
313
+ gtin?: string | null;
314
+ mpn?: string | null;
315
+ }
316
+ /** One property value in a {@link ProductsModule.save}. */
317
+ export interface SaveProductPropertyValueInput {
318
+ propertyId: string;
319
+ /** A translatable property's language; the save's `languageCode` when left out. */
320
+ languageCode?: LanguageCode;
321
+ /** Null, `''` or `[]` clears it; a content-item or product property takes a list of ids. */
322
+ value: unknown;
323
+ }
324
+ /** A product page's whole change, for {@link ProductsModule.save}. */
325
+ export interface SaveProductInput {
326
+ id: string;
327
+ /** The editing language: names, slugs, descriptions and text values are written in it. */
328
+ languageCode: LanguageCode;
329
+ product?: SaveProductFieldsInput;
330
+ variants?: SaveProductVariantInput[];
331
+ /** The collections the product is in by hand: the whole wanted list. */
332
+ collectionIds?: string[];
333
+ /**
334
+ * The collections the caller last read the product in: only the difference is applied, so a
335
+ * change someone else made meanwhile stands (as `setCollections`' `from`). Needs `collectionIds`.
336
+ */
337
+ fromCollectionIds?: string[];
338
+ /** An absent property keeps its value. */
339
+ propertyValues?: SaveProductPropertyValueInput[];
340
+ }
341
+ /**
342
+ * Something a save did not do although everything it wrote is saved. A string on the wire: a
343
+ * newer engine may add a code.
344
+ * - `CONTENT_LABELS_NOT_SYNCED`: the content system did not answer, so the filter values of the
345
+ * properties in `propertyIds` were saved without their titles; run
346
+ * `catalog.syncContentFacets(propertyId)` on them once it is back.
347
+ */
348
+ export interface SaveProductWarning {
349
+ code: 'CONTENT_LABELS_NOT_SYNCED' | (string & {});
350
+ message: string;
351
+ propertyIds: string[];
352
+ }
353
+ export interface SaveProductResult {
354
+ /** The product as saved. */
355
+ product: Product;
356
+ /** What the collection step did; null when the save changed no collection. */
357
+ collections: ProductCollectionsResult | null;
358
+ warnings: SaveProductWarning[];
359
+ }
198
360
  /**
199
361
  * Product-level catalog writes. Reading needs `ReadCatalog` (or `ReadProduct`),
200
362
  * creating `CreateCatalog`, updating `UpdateCatalog`, deleting `DeleteCatalog`.
@@ -208,14 +370,66 @@ export interface ProductCollectionsResult {
208
370
  * refuses".
209
371
  */
210
372
  export interface ProductsModule {
373
+ /** @effect read */
211
374
  list(options?: ProductListOptions): Promise<Page<Product>>;
212
- /** Null for an id this store does not have — the same answer another tenant's product gets. */
213
- get(id: string, options?: Call): Promise<Product | null>;
375
+ /**
376
+ * One product with the collections it is in; null for an id this store does not have — the
377
+ * same answer another tenant's product gets. Its variants are not part of it, however few: read
378
+ * them a page at a time with `catalog.variants.list(productId)` (a product can have 100,000).
379
+ *
380
+ * @effect read
381
+ */
382
+ get(id: string, options?: Call): Promise<ProductDetail | null>;
383
+ /**
384
+ * Create a product, without variants (`catalog.variants.create` adds them). Needs
385
+ * `CreateCatalog` or `CreateProduct`.
386
+ *
387
+ * A new translation needs a name; its slug, when left out, is made from the name in that
388
+ * language, and its description is `''` (multi-region decision 106).
389
+ *
390
+ * Refusals (nothing is written):
391
+ * - `INVALID_PRODUCT_INPUT` → `ValidationError` (400): no translation; refused before sending.
392
+ * - `TRANSLATION_INPUT_INVALID` → `ValidationError` (400): a translation without a name, or
393
+ * with a name no slug can be made from (`!!!`) and no slug. One `details` entry per refused
394
+ * field, each message naming the language and the field; the entries carry no `field`
395
+ * pointer (the engine refuses below the call's arguments).
396
+ * - `TRANSLATION_LANGUAGE_NOT_OFFERED` → `BusinessRuleError` (422): a translation in a
397
+ * language the store does not offer. `details[].field` points at the translation entry
398
+ * (`/input/translations/<i>`); `message` names the language and the ones the store offers.
399
+ * - `FEED_IDENTIFIER_INVALID` → `ValidationError` (400): a brand over 70 characters.
400
+ * - `INVALID_DATETIME` → `ValidationError` (400): an `availableFrom` without an offset;
401
+ * refused before sending.
402
+ *
403
+ * @effect write
404
+ */
214
405
  create(input: CreateProductInput, options?: Call): Promise<Product>;
406
+ /**
407
+ * A PATCH of the product's own fields. A translation for a language the product has no row in
408
+ * is a NEW row, judged as on {@link create}; an existing row keeps what the input leaves out,
409
+ * and setting its name or slug to null is refused `TRANSLATION_INPUT_INVALID`. The other
410
+ * refusals are {@link create}'s, plus `FIELD_GROUP_LOCKED` and `MANAGED_BY_ORGANIZATION`
411
+ * (see above).
412
+ *
413
+ * @effect write
414
+ */
215
415
  update(input: UpdateProductInput, options?: Call): Promise<Product>;
216
416
  /**
217
- * Soft-deletes the product and its variants. `PRODUCT_NOT_DELETED`
218
- * (`ConflictError`) carries the engine's own reason when it refuses.
417
+ * Soft-deletes the product and its variants: they are no longer listed, and orders keep the
418
+ * lines that name them. Nothing in this SDK restores it. Needs `DeleteCatalog` or
419
+ * `DeleteProduct`.
420
+ *
421
+ * Refusals (nothing is deleted):
422
+ * - `PRODUCT_NOT_DELETED` → `ConflictError` (409): the engine declined, in its own words.
423
+ * - `ENTITY_NOT_FOUND` → `NotFoundError` (404): a product this store does not hold.
424
+ * - `SHARED_PRODUCT_NOT_ALLOWED` → `PermissionDeniedError` (403): another store also holds it,
425
+ * and you may not delete there.
426
+ * - `MANAGED_BY_ORGANIZATION` → `BusinessRuleError` (422): a product of the store's
427
+ * organization.
428
+ * - `FIELD_GROUP_LOCKED` → `BusinessRuleError` (422): an app or API token owns a field group of
429
+ * the product or its variants.
430
+ * - `EXTERNAL_LINE_CARRIER_PROTECTED` → `BusinessRuleError` (422): the platform's carrier.
431
+ *
432
+ * @effect destructive
219
433
  */
220
434
  delete(id: string, options?: Call): Promise<void>;
221
435
  /**
@@ -316,6 +530,23 @@ export interface ProductsModule {
316
530
  * store that is not a member.
317
531
  */
318
532
  availabilityInStores(input: AvailabilityInStoresInput, options?: Call): Promise<OrganizationProductStoreAvailability[]>;
533
+ /**
534
+ * Each product's price range in the ACTIVE store and the request's currency
535
+ * (`Product.storePriceRange`), for a page of products in ONE request: the engine ranks only the
536
+ * variants the store holds, by the store's own prices. Use it rather than the first and last
537
+ * variant of a price-sorted variant list, which cannot compare stored prices with converted ones
538
+ * nor say that some variants are unpriced. One entry per distinct product, in the order named;
539
+ * a product the store does not hold is left out, the same answer another tenant's product gets.
540
+ * No ids answers none, without a request. Needs `ReadCatalog`.
541
+ *
542
+ * Refusals:
543
+ * - `PRODUCT_STORE_PRICE_RANGE_INPUT_INVALID` → `ValidationError` (400): more than
544
+ * {@link MAX_STORE_PRICE_RANGE_PRODUCTS} distinct ids; refused before sending.
545
+ * - An engine without `Product.storePriceRange` (vendure-server before #1580) refuses the
546
+ * document before running it: `ValidationError`, `GRAPHQL_VALIDATION_FAILED` (or
547
+ * `BAD_REQUEST`), never an empty answer.
548
+ */
549
+ storePriceRanges(productIds: string[], options?: Call): Promise<ProductStorePriceRangeEntry[]>;
319
550
  /**
320
551
  * Make the ACTIVE member store's own copy of a product its organization shares with it, and
321
552
  * stop offering the shared one, in one step (a local copy, or detach; spec §7.2.8). The copy
@@ -403,6 +634,54 @@ export interface ProductsModule {
403
634
  setCollections(productId: string, collectionIds: readonly string[], options?: Call & {
404
635
  from?: readonly string[];
405
636
  }): Promise<ProductCollectionsResult>;
637
+ /**
638
+ * Save a product page's whole change in ONE engine transaction: all of it, or none of it
639
+ * (headless spec §7 `products.save`). In this order: the variants, the hand-picked collections
640
+ * (as {@link setCollections}), the property values (and the filter-label sync of each
641
+ * filterable product property), the product. Every step's check runs before the first write.
642
+ *
643
+ * A PATCH with an echo rule: only what the input names is compared, and only what differs from
644
+ * what the store holds is written. A head may send the whole form: an unchanged value is not a
645
+ * write, so it never records a change of its field group, and a product the store's
646
+ * organization shares is not refused for a shared field sent back unchanged.
647
+ *
648
+ * Labels of content-item values are read from the content system before the transaction. When
649
+ * it does not answer, the save still goes through and `warnings` names the properties whose
650
+ * filter values were saved without their titles.
651
+ *
652
+ * Needs `UpdateCatalog` or `UpdateProduct`, plus `UpdateCatalog` or `UpdateCollection` when it
653
+ * changes collections and `UpdateCatalog` when it changes property values. `idempotencyKey`: a
654
+ * repeat answers the first call's result. Platform releases before this method do not have the
655
+ * mutation and refuse it as `ValidationError` `GRAPHQL_VALIDATION_FAILED` (400): deploy the
656
+ * engine first.
657
+ *
658
+ * Refusals (nothing is written), GraphQL errors mapped by `core`:
659
+ * - `PRICE_BASIS_REQUIRED` / `PRICE_BASIS_MISMATCH` / `INVALID_PRICE` → `ValidationError`
660
+ * (400): a variant price without the store's basis; refused before sending.
661
+ * - `PRODUCT_SAVE_INPUT_INVALID` → `ValidationError` (400): the input names nothing, names a
662
+ * variant, currency or property value twice, uses a language the store does not offer, gives
663
+ * a value outside its field's range, or `price` and the default-currency entry of `prices`
664
+ * differ. `error.details` names each (`field` is a pointer into the call).
665
+ * - `PRODUCT_COLLECTIONS_INPUT_INVALID` → `ValidationError` (400): a collection list names one
666
+ * twice, or more than {@link MAX_PRODUCT_COLLECTION_IDS}; refused before sending too.
667
+ * - `FEED_IDENTIFIER_INVALID` → `ValidationError` (400): a new or changed brand over 70
668
+ * characters, or a GTIN of another shape.
669
+ * - `ENTITY_NOT_FOUND` → `NotFoundError` (404): a product, variant (of another product
670
+ * included), collection or property this store does not hold.
671
+ * - `FORBIDDEN` → `PermissionDeniedError` (403): a step's permission above is missing.
672
+ * - `SHARED_PRODUCT_NOT_ALLOWED`, `SHARED_PRODUCT_VARIANT_NOT_ALLOWED`,
673
+ * `SHARED_COLLECTION_NOT_ALLOWED` → `PermissionDeniedError` (403): a row another store also
674
+ * holds, which you cannot change there.
675
+ * - `MANAGED_BY_ORGANIZATION` → `BusinessRuleError` (422): a CHANGED field of a product, variant,
676
+ * collection or property value the store's organization holds. The store's own price, its own
677
+ * facet values, its own collections and its own property values pass.
678
+ * - `FIELD_GROUP_LOCKED` → `BusinessRuleError` (422): a field group an app or API token owns.
679
+ * - `PRODUCT_COLLECTION_FILTER_INVALID` → `ValidationError` (400): a collection whose
680
+ * hand-picked list cannot be read.
681
+ * - `EXTERNAL_LINE_CARRIER_PROTECTED` → `BusinessRuleError` (422): the platform's carrier.
682
+ * - `INVALID_TAX_CATEGORY_FOR_CLASS` → `ValidationError` (400).
683
+ */
684
+ save(input: SaveProductInput, options?: Call): Promise<SaveProductResult>;
406
685
  /**
407
686
  * Enable, disable, delete or clone up to `MAX_BULK_PRODUCTS` (50) products of the store in ONE
408
687
  * call (headless spec §7 `products.bulkClone`; §6.11).
@@ -457,27 +736,46 @@ export interface ProductsModule {
457
736
  */
458
737
  bulkRun(runId: string, options?: Call): Promise<ProductBulkRun>;
459
738
  }
460
- export declare const PRODUCT_FIELDS = "\n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n }\n assets { \n id\n name\n preview\n source\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n options {\n id\n code\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n }\n";
461
- export declare const PRODUCTS_QUERY = "\n query CatalogProducts($options: ProductListOptions) {\n products(options: $options) {\n items { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n }\n assets { \n id\n name\n preview\n source\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n options {\n id\n code\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n }\n }\n totalItems\n }\n }\n";
462
- export declare const PRODUCT_QUERY = "\n query CatalogProduct($id: ID!) {\n product(id: $id) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n }\n assets { \n id\n name\n preview\n source\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n options {\n id\n code\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n }\n }\n }\n";
463
- export declare const CREATE_PRODUCT_MUTATION = "\n mutation CatalogCreateProduct($input: CreateProductInput!) {\n createProduct(input: $input) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n }\n assets { \n id\n name\n preview\n source\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n options {\n id\n code\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n }\n }\n }\n";
464
- export declare const UPDATE_PRODUCT_MUTATION = "\n mutation CatalogUpdateProduct($input: UpdateProductInput!) {\n updateProduct(input: $input) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n }\n assets { \n id\n name\n preview\n source\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n options {\n id\n code\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n }\n }\n }\n";
739
+ export declare const PRODUCT_FIELDS = "\n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n";
740
+ export declare const PRODUCTS_QUERY = "\n query CatalogProducts($options: ProductListOptions) {\n products(options: $options) {\n items { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n }\n totalItems\n }\n }\n";
741
+ export declare const PRODUCT_STORE_PRICE_RANGES_QUERY = "\n query CatalogProductStorePriceRanges($options: ProductListOptions) {\n products(options: $options) {\n items {\n id\n storePriceRange {\n min { price priceWithTax currencyCode }\n max { price priceWithTax currencyCode }\n someVariantsUnpriced\n }\n }\n }\n }\n";
742
+ /**
743
+ * One product, with the collections it is in. No variant data beyond `variantList`'s count: a
744
+ * product can have 100,000 variants, and core's `variants` would hand back the first 1,000 with
745
+ * no sign of the rest (`catalog.variants.list` pages them).
746
+ */
747
+ export declare const PRODUCT_QUERY = "\n query CatalogProduct($id: ID!) {\n product(id: $id) {\n \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n\n collections {\n id\n name\n slug\n }\n }\n }\n";
748
+ export declare const CREATE_PRODUCT_MUTATION = "\n mutation CatalogCreateProduct($input: CreateProductInput!) {\n createProduct(input: $input) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n }\n }\n";
749
+ export declare const UPDATE_PRODUCT_MUTATION = "\n mutation CatalogUpdateProduct($input: UpdateProductInput!) {\n updateProduct(input: $input) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n }\n }\n";
465
750
  export declare const DELETE_PRODUCT_MUTATION = "\n mutation CatalogDeleteProduct($id: ID!) {\n deleteProduct(id: $id) { \n result\n message\n }\n }\n";
466
751
  export declare const CLONE_PRODUCT_MUTATION = "\n mutation CatalogCloneProduct($id: ID!) {\n cloneProduct(id: $id)\n }\n";
467
- export declare const ADD_OPTION_GROUP_MUTATION = "\n mutation CatalogAddOptionGroup($productId: ID!, $optionGroupId: ID!) {\n addOptionGroupToProduct(productId: $productId, optionGroupId: $optionGroupId) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n }\n assets { \n id\n name\n preview\n source\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n options {\n id\n code\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n }\n }\n }\n";
468
- export declare const REMOVE_OPTION_GROUP_MUTATION = "\n mutation CatalogRemoveOptionGroup($productId: ID!, $optionGroupId: ID!, $force: Boolean) {\n removeOptionGroupFromProduct(productId: $productId, optionGroupId: $optionGroupId, force: $force) {\n ... on Product { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n }\n assets { \n id\n name\n preview\n source\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n options {\n id\n code\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n }\n }\n ... on ErrorResult {\n errorCode\n message\n }\n }\n }\n";
469
- export declare const EXCLUDE_PRODUCTS_FROM_STORE_MUTATION = "\n mutation CatalogExcludeProductsFromStore($productIds: [ID!]!) {\n excludeProductsFromStore(productIds: $productIds) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n }\n assets { \n id\n name\n preview\n source\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n options {\n id\n code\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n }\n }\n }\n";
470
- export declare const INCLUDE_PRODUCTS_IN_STORE_MUTATION = "\n mutation CatalogIncludeProductsInStore($productIds: [ID!]!) {\n includeProductsInStore(productIds: $productIds) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n }\n assets { \n id\n name\n preview\n source\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n options {\n id\n code\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n }\n }\n }\n";
752
+ export declare const ADD_OPTION_GROUP_MUTATION = "\n mutation CatalogAddOptionGroup($productId: ID!, $optionGroupId: ID!) {\n addOptionGroupToProduct(productId: $productId, optionGroupId: $optionGroupId) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n }\n }\n";
753
+ export declare const REMOVE_OPTION_GROUP_MUTATION = "\n mutation CatalogRemoveOptionGroup($productId: ID!, $optionGroupId: ID!, $force: Boolean) {\n removeOptionGroupFromProduct(productId: $productId, optionGroupId: $optionGroupId, force: $force) {\n ... on Product { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n }\n ... on ErrorResult {\n errorCode\n message\n }\n }\n }\n";
754
+ export declare const EXCLUDE_PRODUCTS_FROM_STORE_MUTATION = "\n mutation CatalogExcludeProductsFromStore($productIds: [ID!]!) {\n excludeProductsFromStore(productIds: $productIds) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n }\n }\n";
755
+ export declare const INCLUDE_PRODUCTS_IN_STORE_MUTATION = "\n mutation CatalogIncludeProductsInStore($productIds: [ID!]!) {\n includeProductsInStore(productIds: $productIds) { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n }\n }\n";
471
756
  export declare const SET_ORGANIZATION_PRODUCT_AVAILABILITY_MUTATION = "\n mutation CatalogSetOrganizationProductAvailability(\n $productIds: [ID!]!\n $channelIds: [ID!]!\n $available: Boolean!\n ) {\n setOrganizationProductAvailability(\n productIds: $productIds\n channelIds: $channelIds\n available: $available\n ) {\n productId\n channelId\n action\n }\n }\n";
472
757
  export declare const ORGANIZATION_PRODUCT_AVAILABILITY_QUERY = "\n query CatalogOrganizationProductAvailability($productIds: [ID!]!, $channelIds: [ID!]!) {\n organizationProductAvailability(productIds: $productIds, channelIds: $channelIds) {\n productId\n channelId\n state\n localCopyId\n }\n }\n";
473
- export declare const MAKE_LOCAL_COPY_MUTATION = "\n mutation CatalogMakeLocalCopy($productId: ID!, $skus: [LocalCopySkuInput!]) {\n makeLocalCopy(productId: $productId, skus: $skus) {\n product { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n }\n assets { \n id\n name\n preview\n source\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n options {\n id\n code\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n }\n }\n originalProductId\n original\n droppedOrganizationPropertyCount\n }\n }\n";
758
+ export declare const MAKE_LOCAL_COPY_MUTATION = "\n mutation CatalogMakeLocalCopy($productId: ID!, $skus: [LocalCopySkuInput!]) {\n makeLocalCopy(productId: $productId, skus: $skus) {\n product { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n }\n originalProductId\n original\n droppedOrganizationPropertyCount\n }\n }\n";
474
759
  export declare const SET_PRODUCT_COLLECTIONS_MUTATION = "\n mutation CatalogSetProductCollections(\n $productId: ID!\n $collectionIds: [ID!]!\n $fromCollectionIds: [ID!]\n ) {\n setProductCollections(\n productId: $productId\n collectionIds: $collectionIds\n fromCollectionIds: $fromCollectionIds\n ) {\n added\n removed\n unchanged\n notRemoved {\n collectionId\n reason\n }\n }\n }\n";
760
+ export declare const SAVE_PRODUCT_MUTATION = "\n mutation CatalogSaveProduct($input: SaveProductInput!, $idempotencyKey: String) {\n saveProduct(input: $input, idempotencyKey: $idempotencyKey) {\n product { \n id\n \n catalogueOwnership {\n state\n organizationName\n editableHere\n }\n\n createdAt\n updatedAt\n languageCode\n name\n slug\n description\n enabled\n featuredAsset { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n assets { \n id\n name\n preview\n source\n type\n mimeType\n customFields {\n altText\n }\n }\n facetValues { \n id\n code\n name\n facet {\n id\n code\n name\n }\n }\n optionGroups {\n id\n code\n name\n customFields {\n isShared\n }\n options {\n id\n code\n name\n }\n translations {\n id\n languageCode\n name\n }\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n excludedFromStore\n variantList(options: { take: 1 }) {\n totalItems\n }\n customFields {\n availabilityState\n availableFrom\n preorderLimit\n brand\n condition\n }\n }\n collections {\n added\n removed\n unchanged\n notRemoved {\n collectionId\n reason\n }\n }\n warnings {\n code\n message\n propertyIds\n }\n }\n }\n";
761
+ /** An option group as the Admin API answers it inside a product, before `toProduct`. */
762
+ interface WireProductOptionGroup extends Omit<ProductOptionGroupRef, 'isShared'> {
763
+ customFields: {
764
+ isShared?: boolean | null;
765
+ } | null;
766
+ }
475
767
  /** The product as the Admin API answers it, before `toProduct`. */
476
- export interface WireProduct extends Omit<Product, keyof Availability<string> | 'variantCount'> {
768
+ export interface WireProduct extends Omit<Product, keyof Availability<string> | 'variantCount' | 'featuredAsset' | 'assets' | 'optionGroups' | 'brand' | 'condition'> {
769
+ featuredAsset: WireAssetRef | null;
770
+ assets: WireAssetRef[];
771
+ optionGroups: WireProductOptionGroup[];
477
772
  variantList: {
478
773
  totalItems: number;
479
774
  };
480
- customFields: Partial<Availability<ProductAvailabilityState>> | null;
775
+ customFields: (Partial<Availability<ProductAvailabilityState>> & {
776
+ brand?: string | null;
777
+ condition?: string | null;
778
+ }) | null;
481
779
  }
482
780
  /**
483
781
  * Lift the availability custom fields to first-class fields. A server older
@@ -486,4 +784,7 @@ export interface WireProduct extends Omit<Product, keyof Availability<string> |
486
784
  */
487
785
  export declare function toProduct(wire: WireProduct): Product;
488
786
  export declare function productFilter(filter: ProductListFilter | undefined): Record<string, unknown>;
787
+ /** The engine's `ProductListOptions` for one page of {@link ProductListOptions}. */
788
+ export declare function productListOptions(options: ProductListOptions | undefined, skip: number, take: number): Record<string, unknown>;
489
789
  export declare function createProductsModule(transport: Transport): ProductsModule;
790
+ export {};