@mercurjs/core 2.1.2 → 2.2.0-canary.1

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 (725) hide show
  1. package/.medusa/server/src/api/admin/commission-rates/validators.d.ts +8 -8
  2. package/.medusa/server/src/api/admin/middlewares.js +20 -30
  3. package/.medusa/server/src/api/admin/offers/[id]/route.d.ts +3 -0
  4. package/.medusa/server/src/api/admin/offers/[id]/route.js +37 -0
  5. package/.medusa/server/src/api/admin/offers/batch/route.d.ts +3 -0
  6. package/.medusa/server/src/api/admin/offers/batch/route.js +37 -0
  7. package/.medusa/server/src/api/admin/offers/middlewares.d.ts +2 -0
  8. package/.medusa/server/src/api/admin/offers/middlewares.js +31 -0
  9. package/.medusa/server/src/api/admin/offers/query-config.d.ts +11 -0
  10. package/.medusa/server/src/api/admin/offers/query-config.js +47 -0
  11. package/.medusa/server/src/api/admin/offers/route.d.ts +3 -0
  12. package/.medusa/server/src/api/admin/offers/route.js +21 -0
  13. package/.medusa/server/src/api/admin/offers/validators.d.ts +299 -0
  14. package/.medusa/server/src/api/admin/offers/validators.js +65 -0
  15. package/.medusa/server/src/api/admin/product-attributes/[id]/route.d.ts +7 -0
  16. package/.medusa/server/src/api/admin/product-attributes/[id]/route.js +51 -0
  17. package/.medusa/server/src/api/admin/product-attributes/[id]/values/[value_id]/route.d.ts +6 -0
  18. package/.medusa/server/src/api/admin/product-attributes/[id]/values/[value_id]/route.js +37 -0
  19. package/.medusa/server/src/api/admin/product-attributes/[id]/values/route.d.ts +4 -0
  20. package/.medusa/server/src/api/admin/product-attributes/[id]/values/route.js +22 -0
  21. package/.medusa/server/src/api/admin/product-attributes/middlewares.d.ts +2 -0
  22. package/.medusa/server/src/api/admin/product-attributes/middlewares.js +75 -0
  23. package/.medusa/server/src/api/admin/product-attributes/query-config.d.ts +12 -0
  24. package/.medusa/server/src/api/admin/product-attributes/query-config.js +34 -0
  25. package/.medusa/server/src/api/admin/product-attributes/route.d.ts +6 -0
  26. package/.medusa/server/src/api/admin/product-attributes/route.js +38 -0
  27. package/.medusa/server/src/api/admin/product-attributes/validators.d.ts +548 -0
  28. package/.medusa/server/src/api/admin/product-attributes/validators.js +128 -0
  29. package/.medusa/server/src/api/admin/product-brands/[id]/route.d.ts +7 -0
  30. package/.medusa/server/src/api/admin/product-brands/[id]/route.js +51 -0
  31. package/.medusa/server/src/api/admin/product-brands/[id]/sellers/route.d.ts +3 -0
  32. package/.medusa/server/src/api/admin/product-brands/[id]/sellers/route.js +20 -0
  33. package/.medusa/server/src/api/admin/product-brands/middlewares.d.ts +2 -0
  34. package/.medusa/server/src/api/admin/product-brands/middlewares.js +49 -0
  35. package/.medusa/server/src/api/admin/product-brands/query-config.d.ts +12 -0
  36. package/.medusa/server/src/api/admin/product-brands/query-config.js +24 -0
  37. package/.medusa/server/src/api/admin/product-brands/route.d.ts +6 -0
  38. package/.medusa/server/src/api/admin/product-brands/route.js +38 -0
  39. package/.medusa/server/src/api/admin/product-brands/validators.d.ts +284 -0
  40. package/.medusa/server/src/api/admin/product-brands/validators.js +41 -0
  41. package/.medusa/server/src/api/admin/product-categories/[id]/products/route.d.ts +3 -0
  42. package/.medusa/server/src/api/admin/product-categories/[id]/products/route.js +20 -0
  43. package/.medusa/server/src/api/admin/product-categories/[id]/route.d.ts +7 -0
  44. package/.medusa/server/src/api/admin/product-categories/[id]/route.js +50 -0
  45. package/.medusa/server/src/api/admin/product-categories/[id]/sellers/route.d.ts +3 -0
  46. package/.medusa/server/src/api/admin/product-categories/[id]/sellers/route.js +20 -0
  47. package/.medusa/server/src/api/admin/product-categories/middlewares.d.ts +2 -0
  48. package/.medusa/server/src/api/admin/product-categories/middlewares.js +54 -0
  49. package/.medusa/server/src/api/admin/product-categories/query-config.d.ts +12 -0
  50. package/.medusa/server/src/api/admin/product-categories/query-config.js +32 -0
  51. package/.medusa/server/src/api/admin/product-categories/route.d.ts +6 -0
  52. package/.medusa/server/src/api/admin/product-categories/route.js +39 -0
  53. package/.medusa/server/src/api/admin/product-categories/validators.d.ts +446 -0
  54. package/.medusa/server/src/api/admin/product-categories/validators.js +65 -0
  55. package/.medusa/server/src/api/admin/product-changes/[id]/cancel/route.d.ts +10 -0
  56. package/.medusa/server/src/api/admin/product-changes/[id]/cancel/route.js +33 -0
  57. package/.medusa/server/src/api/admin/product-changes/[id]/confirm/route.d.ts +10 -0
  58. package/.medusa/server/src/api/admin/product-changes/[id]/confirm/route.js +27 -0
  59. package/.medusa/server/src/api/admin/product-changes/middlewares.d.ts +2 -0
  60. package/.medusa/server/src/api/admin/product-changes/middlewares.js +18 -0
  61. package/.medusa/server/src/api/admin/product-changes/validators.d.ts +17 -0
  62. package/.medusa/server/src/api/admin/product-changes/validators.js +15 -0
  63. package/.medusa/server/src/api/admin/products/[id]/attributes/[attribute_id]/route.d.ts +7 -0
  64. package/.medusa/server/src/api/admin/products/[id]/attributes/[attribute_id]/route.js +53 -0
  65. package/.medusa/server/src/api/admin/products/[id]/attributes/batch/route.d.ts +3 -0
  66. package/.medusa/server/src/api/admin/products/[id]/attributes/batch/route.js +36 -0
  67. package/.medusa/server/src/api/admin/products/[id]/attributes/route.d.ts +6 -0
  68. package/.medusa/server/src/api/admin/products/[id]/attributes/route.js +48 -0
  69. package/.medusa/server/src/api/admin/products/[id]/confirm/route.d.ts +4 -0
  70. package/.medusa/server/src/api/admin/products/[id]/confirm/route.js +26 -0
  71. package/.medusa/server/src/api/admin/products/[id]/preview/route.d.ts +5 -0
  72. package/.medusa/server/src/api/admin/products/[id]/preview/route.js +14 -0
  73. package/.medusa/server/src/api/admin/products/[id]/reject/route.d.ts +4 -0
  74. package/.medusa/server/src/api/admin/products/[id]/reject/route.js +27 -0
  75. package/.medusa/server/src/api/admin/products/[id]/request-changes/route.d.ts +4 -0
  76. package/.medusa/server/src/api/admin/products/[id]/request-changes/route.js +27 -0
  77. package/.medusa/server/src/api/admin/products/[id]/route.d.ts +7 -0
  78. package/.medusa/server/src/api/admin/products/[id]/route.js +55 -0
  79. package/.medusa/server/src/api/admin/products/[id]/variants/[variant_id]/route.d.ts +7 -0
  80. package/.medusa/server/src/api/admin/products/[id]/variants/[variant_id]/route.js +60 -0
  81. package/.medusa/server/src/api/admin/products/[id]/variants/route.d.ts +6 -0
  82. package/.medusa/server/src/api/admin/products/[id]/variants/route.js +41 -0
  83. package/.medusa/server/src/api/admin/products/batch/route.d.ts +4 -0
  84. package/.medusa/server/src/api/admin/products/batch/route.js +36 -0
  85. package/.medusa/server/src/api/admin/products/middlewares.d.ts +2 -0
  86. package/.medusa/server/src/api/admin/products/middlewares.js +161 -0
  87. package/.medusa/server/src/api/admin/products/query-config.d.ts +25 -0
  88. package/.medusa/server/src/api/admin/products/query-config.js +101 -0
  89. package/.medusa/server/src/api/admin/products/route.d.ts +4 -2
  90. package/.medusa/server/src/api/admin/products/route.js +48 -1
  91. package/.medusa/server/src/api/admin/products/validators.d.ts +2076 -799
  92. package/.medusa/server/src/api/admin/products/validators.js +254 -4
  93. package/.medusa/server/src/api/admin/sellers/validators.d.ts +12 -12
  94. package/.medusa/server/src/api/store/carts/[id]/line-items/route.d.ts +3 -0
  95. package/.medusa/server/src/api/store/carts/[id]/line-items/route.js +20 -0
  96. package/.medusa/server/src/api/store/carts/[id]/line-items/validators.d.ts +27 -0
  97. package/.medusa/server/src/api/store/carts/[id]/line-items/validators.js +16 -0
  98. package/.medusa/server/src/api/store/carts/middlewares.js +26 -1
  99. package/.medusa/server/src/api/store/middlewares.js +11 -5
  100. package/.medusa/server/src/api/store/product-attributes/[id]/route.d.ts +2 -0
  101. package/.medusa/server/src/api/store/product-attributes/[id]/route.js +18 -0
  102. package/.medusa/server/src/api/store/product-attributes/middlewares.d.ts +2 -0
  103. package/.medusa/server/src/api/store/product-attributes/middlewares.js +31 -0
  104. package/.medusa/server/src/api/store/product-attributes/query-config.d.ts +12 -0
  105. package/.medusa/server/src/api/store/product-attributes/query-config.js +31 -0
  106. package/.medusa/server/src/api/store/product-attributes/route.d.ts +2 -0
  107. package/.medusa/server/src/api/store/product-attributes/route.js +21 -0
  108. package/.medusa/server/src/api/store/product-attributes/validators.d.ts +234 -0
  109. package/.medusa/server/src/api/store/product-attributes/validators.js +26 -0
  110. package/.medusa/server/src/api/store/product-brands/[id]/route.d.ts +2 -0
  111. package/.medusa/server/src/api/store/product-brands/[id]/route.js +18 -0
  112. package/.medusa/server/src/api/store/product-brands/middlewares.d.ts +2 -0
  113. package/.medusa/server/src/api/store/product-brands/middlewares.js +23 -0
  114. package/.medusa/server/src/api/store/product-brands/query-config.d.ts +12 -0
  115. package/.medusa/server/src/api/store/product-brands/query-config.js +23 -0
  116. package/.medusa/server/src/api/store/product-brands/route.d.ts +2 -0
  117. package/.medusa/server/src/api/store/product-brands/route.js +21 -0
  118. package/.medusa/server/src/api/store/product-brands/validators.d.ts +215 -0
  119. package/.medusa/server/src/api/store/product-brands/validators.js +21 -0
  120. package/.medusa/server/src/api/store/product-categories/[id]/route.d.ts +2 -0
  121. package/.medusa/server/src/api/store/product-categories/[id]/route.js +18 -0
  122. package/.medusa/server/src/api/store/product-categories/middlewares.d.ts +2 -0
  123. package/.medusa/server/src/api/store/product-categories/middlewares.js +31 -0
  124. package/.medusa/server/src/api/store/product-categories/query-config.d.ts +12 -0
  125. package/.medusa/server/src/api/store/product-categories/query-config.js +28 -0
  126. package/.medusa/server/src/api/store/product-categories/route.d.ts +2 -0
  127. package/.medusa/server/src/api/store/product-categories/route.js +21 -0
  128. package/.medusa/server/src/api/store/product-categories/validators.d.ts +240 -0
  129. package/.medusa/server/src/api/store/product-categories/validators.js +27 -0
  130. package/.medusa/server/src/api/store/products/[id]/route.d.ts +2 -0
  131. package/.medusa/server/src/api/store/products/[id]/route.js +47 -0
  132. package/.medusa/server/src/api/store/products/middlewares.d.ts +1 -1
  133. package/.medusa/server/src/api/store/products/middlewares.js +29 -5
  134. package/.medusa/server/src/api/store/products/query-config.d.ts +14 -0
  135. package/.medusa/server/src/api/store/products/query-config.js +58 -0
  136. package/.medusa/server/src/api/store/products/route.d.ts +2 -0
  137. package/.medusa/server/src/api/store/products/route.js +44 -0
  138. package/.medusa/server/src/api/store/products/validators.d.ts +276 -0
  139. package/.medusa/server/src/api/store/products/validators.js +33 -0
  140. package/.medusa/server/src/api/utils/format-product-attributes.d.ts +8 -0
  141. package/.medusa/server/src/api/utils/format-product-attributes.js +44 -0
  142. package/.medusa/server/src/api/utils/index.d.ts +1 -0
  143. package/.medusa/server/src/api/utils/index.js +2 -1
  144. package/.medusa/server/src/api/utils/wrap-variants-with-offers-inventory.d.ts +12 -0
  145. package/.medusa/server/src/api/utils/wrap-variants-with-offers-inventory.js +165 -0
  146. package/.medusa/server/src/api/utils/wrap-variants-with-offers-prices.d.ts +12 -0
  147. package/.medusa/server/src/api/utils/wrap-variants-with-offers-prices.js +64 -0
  148. package/.medusa/server/src/api/vendor/collections/validators.d.ts +4 -4
  149. package/.medusa/server/src/api/vendor/inventory-items/route.js +1 -1
  150. package/.medusa/server/src/api/vendor/inventory-items/validators.d.ts +56 -56
  151. package/.medusa/server/src/api/vendor/middlewares.js +55 -51
  152. package/.medusa/server/src/api/vendor/offers/[id]/inventory-items/batch/route.d.ts +3 -0
  153. package/.medusa/server/src/api/vendor/offers/[id]/inventory-items/batch/route.js +24 -0
  154. package/.medusa/server/src/api/vendor/offers/[id]/route.d.ts +5 -0
  155. package/.medusa/server/src/api/vendor/offers/[id]/route.js +38 -0
  156. package/.medusa/server/src/api/vendor/{products/[id]/variants/[variant_id]/media → offers/batch}/route.d.ts +2 -2
  157. package/.medusa/server/src/api/vendor/offers/batch/route.js +34 -0
  158. package/.medusa/server/src/api/vendor/offers/helpers.d.ts +3 -0
  159. package/.medusa/server/src/api/vendor/offers/helpers.js +27 -0
  160. package/.medusa/server/src/api/vendor/offers/middlewares.d.ts +2 -0
  161. package/.medusa/server/src/api/vendor/offers/middlewares.js +65 -0
  162. package/.medusa/server/src/api/vendor/offers/query-config.d.ts +11 -0
  163. package/.medusa/server/src/api/vendor/offers/query-config.js +47 -0
  164. package/.medusa/server/src/api/vendor/offers/route.d.ts +4 -0
  165. package/.medusa/server/src/api/vendor/offers/route.js +41 -0
  166. package/.medusa/server/src/api/vendor/offers/validators.d.ts +607 -0
  167. package/.medusa/server/src/api/vendor/offers/validators.js +119 -0
  168. package/.medusa/server/src/api/vendor/price-lists/validators.d.ts +24 -24
  169. package/.medusa/server/src/api/vendor/product-attributes/[id]/route.d.ts +3 -0
  170. package/.medusa/server/src/api/vendor/product-attributes/[id]/route.js +18 -0
  171. package/.medusa/server/src/api/vendor/product-attributes/middlewares.d.ts +2 -0
  172. package/.medusa/server/src/api/vendor/product-attributes/middlewares.js +23 -0
  173. package/.medusa/server/src/api/vendor/product-attributes/query-config.d.ts +12 -0
  174. package/.medusa/server/src/api/vendor/product-attributes/query-config.js +34 -0
  175. package/.medusa/server/src/api/vendor/product-attributes/route.d.ts +3 -0
  176. package/.medusa/server/src/api/vendor/product-attributes/route.js +23 -0
  177. package/.medusa/server/src/api/vendor/product-attributes/validators.d.ts +394 -0
  178. package/.medusa/server/src/api/vendor/product-attributes/validators.js +85 -0
  179. package/.medusa/server/src/api/vendor/{attributes → product-brands/[id]}/route.d.ts +2 -1
  180. package/.medusa/server/src/api/vendor/product-brands/[id]/route.js +18 -0
  181. package/.medusa/server/src/api/vendor/product-brands/middlewares.d.ts +2 -0
  182. package/.medusa/server/src/api/vendor/product-brands/middlewares.js +23 -0
  183. package/.medusa/server/src/api/vendor/product-brands/query-config.d.ts +12 -0
  184. package/.medusa/server/src/api/vendor/product-brands/query-config.js +24 -0
  185. package/.medusa/server/src/api/vendor/product-brands/route.d.ts +3 -0
  186. package/.medusa/server/src/api/vendor/product-brands/route.js +21 -0
  187. package/.medusa/server/src/api/vendor/product-brands/validators.d.ts +221 -0
  188. package/.medusa/server/src/api/vendor/product-brands/validators.js +22 -0
  189. package/.medusa/server/src/api/vendor/product-categories/[id]/route.js +2 -4
  190. package/.medusa/server/src/api/vendor/product-categories/middlewares.js +5 -47
  191. package/.medusa/server/src/api/vendor/product-categories/query-config.d.ts +11 -8
  192. package/.medusa/server/src/api/vendor/product-categories/query-config.js +17 -12
  193. package/.medusa/server/src/api/vendor/product-categories/validators.d.ts +328 -44
  194. package/.medusa/server/src/api/vendor/product-categories/validators.js +20 -11
  195. package/.medusa/server/src/api/vendor/product-variants/middlewares.js +34 -11
  196. package/.medusa/server/src/api/vendor/product-variants/query-config.d.ts +2 -2
  197. package/.medusa/server/src/api/vendor/product-variants/query-config.js +16 -13
  198. package/.medusa/server/src/api/vendor/product-variants/route.d.ts +2 -1
  199. package/.medusa/server/src/api/vendor/product-variants/route.js +1 -1
  200. package/.medusa/server/src/api/vendor/product-variants/validators.d.ts +377 -21
  201. package/.medusa/server/src/api/vendor/product-variants/validators.js +14 -8
  202. package/.medusa/server/src/api/vendor/products/[id]/attributes/[attribute_id]/route.d.ts +7 -2
  203. package/.medusa/server/src/api/vendor/products/[id]/attributes/[attribute_id]/route.js +25 -137
  204. package/.medusa/server/src/api/vendor/products/[id]/attributes/route.d.ts +8 -0
  205. package/.medusa/server/src/api/vendor/products/[id]/attributes/route.js +39 -103
  206. package/.medusa/server/src/api/vendor/products/[id]/cancel/route.d.ts +13 -0
  207. package/.medusa/server/src/api/vendor/products/[id]/cancel/route.js +46 -0
  208. package/.medusa/server/src/api/vendor/products/[id]/preview/route.d.ts +14 -0
  209. package/.medusa/server/src/api/vendor/products/[id]/preview/route.js +31 -0
  210. package/.medusa/server/src/api/vendor/products/[id]/route.d.ts +12 -2
  211. package/.medusa/server/src/api/vendor/products/[id]/route.js +28 -34
  212. package/.medusa/server/src/api/vendor/products/[id]/variants/[variant_id]/route.d.ts +13 -3
  213. package/.medusa/server/src/api/vendor/products/[id]/variants/[variant_id]/route.js +34 -36
  214. package/.medusa/server/src/api/vendor/products/[id]/variants/route.d.ts +7 -2
  215. package/.medusa/server/src/api/vendor/products/[id]/variants/route.js +15 -30
  216. package/.medusa/server/src/api/vendor/products/middlewares.js +54 -56
  217. package/.medusa/server/src/api/vendor/products/query-config.d.ts +4 -1
  218. package/.medusa/server/src/api/vendor/products/query-config.js +46 -13
  219. package/.medusa/server/src/api/vendor/products/route.js +11 -8
  220. package/.medusa/server/src/api/vendor/products/validators.d.ts +886 -1820
  221. package/.medusa/server/src/api/vendor/products/validators.js +182 -117
  222. package/.medusa/server/src/api/vendor/promotions/validators.d.ts +16 -16
  223. package/.medusa/server/src/api/vendor/returns/validators.d.ts +18 -18
  224. package/.medusa/server/src/api/vendor/sales-channels/[id]/products/route.js +1 -5
  225. package/.medusa/server/src/api/vendor/sellers/validators.d.ts +10 -10
  226. package/.medusa/server/src/api/vendor/shipping-options/validators.d.ts +32 -32
  227. package/.medusa/server/src/api/vendor/shipping-profiles/validators.d.ts +2 -2
  228. package/.medusa/server/src/api/vendor/stock-locations/validators.d.ts +3 -3
  229. package/.medusa/server/src/feature-flags/product-request.d.ts +3 -0
  230. package/.medusa/server/src/feature-flags/product-request.js +10 -0
  231. package/.medusa/server/src/links/brand-seller-link.js +16 -0
  232. package/.medusa/server/src/links/cart-line-item-offer-link.js +10 -0
  233. package/.medusa/server/src/links/category-seller-link.js +16 -0
  234. package/.medusa/server/src/links/offer-inventory-item-link.js +26 -0
  235. package/.medusa/server/src/links/offer-price-set-link.js +15 -0
  236. package/.medusa/server/src/links/offer-seller-link.js +15 -0
  237. package/.medusa/server/src/links/offer-shipping-profile-link.d.ts +2 -0
  238. package/.medusa/server/src/links/offer-shipping-profile-link.js +15 -0
  239. package/.medusa/server/src/links/offer-variant-link.d.ts +2 -0
  240. package/.medusa/server/src/links/offer-variant-link.js +15 -0
  241. package/.medusa/server/src/links/order-line-item-offer-link.d.ts +2 -0
  242. package/.medusa/server/src/links/order-line-item-offer-link.js +10 -0
  243. package/.medusa/server/src/links/product-seller-link.js +13 -3
  244. package/.medusa/server/src/modules/offer/index.d.ts +21 -0
  245. package/.medusa/server/src/modules/offer/index.js +12 -0
  246. package/.medusa/server/src/modules/{attribute/migrations/Migration20260325000000.d.ts → offer/migrations/Migration20260520104835.d.ts} +1 -1
  247. package/.medusa/server/src/modules/offer/migrations/Migration20260520104835.js +22 -0
  248. package/.medusa/server/src/modules/offer/models/index.d.ts +1 -0
  249. package/.medusa/server/src/modules/offer/models/index.js +9 -0
  250. package/.medusa/server/src/modules/offer/models/offer.d.ts +13 -0
  251. package/.medusa/server/src/modules/offer/models/offer.js +56 -0
  252. package/.medusa/server/src/modules/offer/service.d.ts +17 -0
  253. package/.medusa/server/src/modules/offer/service.js +10 -0
  254. package/.medusa/server/src/modules/product/index.d.ts +7 -0
  255. package/.medusa/server/src/modules/product/index.js +14 -0
  256. package/.medusa/server/src/modules/{vendor-product-attribute/migrations/Migration20260325000000.d.ts → product/migrations/Migration20260414141012.d.ts} +1 -1
  257. package/.medusa/server/src/modules/product/migrations/Migration20260414141012.js +169 -0
  258. package/.medusa/server/src/modules/product/migrations/Migration20260415151424.d.ts +5 -0
  259. package/.medusa/server/src/modules/product/migrations/Migration20260415151424.js +14 -0
  260. package/.medusa/server/src/modules/product/migrations/Migration20260416104248.d.ts +5 -0
  261. package/.medusa/server/src/modules/product/migrations/Migration20260416104248.js +14 -0
  262. package/.medusa/server/src/modules/product/migrations/Migration20260416105443.d.ts +5 -0
  263. package/.medusa/server/src/modules/product/migrations/Migration20260416105443.js +16 -0
  264. package/.medusa/server/src/modules/product/migrations/Migration20260421093258.d.ts +5 -0
  265. package/.medusa/server/src/modules/product/migrations/Migration20260421093258.js +22 -0
  266. package/.medusa/server/src/modules/product/migrations/Migration20260422105949.d.ts +5 -0
  267. package/.medusa/server/src/modules/product/migrations/Migration20260422105949.js +32 -0
  268. package/.medusa/server/src/modules/product/migrations/Migration20260422112250.d.ts +5 -0
  269. package/.medusa/server/src/modules/product/migrations/Migration20260422112250.js +16 -0
  270. package/.medusa/server/src/modules/product/migrations/Migration20260424120000.d.ts +5 -0
  271. package/.medusa/server/src/modules/product/migrations/Migration20260424120000.js +16 -0
  272. package/.medusa/server/src/modules/product/migrations/Migration20260427140959.d.ts +5 -0
  273. package/.medusa/server/src/modules/product/migrations/Migration20260427140959.js +20 -0
  274. package/.medusa/server/src/modules/product/migrations/Migration20260427141021.d.ts +5 -0
  275. package/.medusa/server/src/modules/product/migrations/Migration20260427141021.js +16 -0
  276. package/.medusa/server/src/modules/product/migrations/Migration20260428115720.d.ts +5 -0
  277. package/.medusa/server/src/modules/product/migrations/Migration20260428115720.js +16 -0
  278. package/.medusa/server/src/modules/product/migrations/Migration20260430143600.d.ts +5 -0
  279. package/.medusa/server/src/modules/product/migrations/Migration20260430143600.js +15 -0
  280. package/.medusa/server/src/modules/product/migrations/Migration20260430144500.d.ts +5 -0
  281. package/.medusa/server/src/modules/product/migrations/Migration20260430144500.js +23 -0
  282. package/.medusa/server/src/modules/product/migrations/Migration20260430150000.d.ts +5 -0
  283. package/.medusa/server/src/modules/product/migrations/Migration20260430150000.js +14 -0
  284. package/.medusa/server/src/modules/product/migrations/Migration20260520120000.d.ts +5 -0
  285. package/.medusa/server/src/modules/product/migrations/Migration20260520120000.js +16 -0
  286. package/.medusa/server/src/modules/product/models/index.d.ts +13 -0
  287. package/.medusa/server/src/modules/product/models/index.js +33 -0
  288. package/.medusa/server/src/modules/product/models/product-attribute-value.d.ts +1676 -0
  289. package/.medusa/server/src/modules/product/models/product-attribute-value.js +38 -0
  290. package/.medusa/server/src/modules/product/models/product-attribute.d.ts +1597 -0
  291. package/.medusa/server/src/modules/product/models/product-attribute.js +57 -0
  292. package/.medusa/server/src/modules/product/models/product-brand.d.ts +539 -0
  293. package/.medusa/server/src/modules/product/models/product-brand.js +34 -0
  294. package/.medusa/server/src/modules/product/models/product-category.d.ts +1658 -0
  295. package/.medusa/server/src/modules/product/models/product-category.js +55 -0
  296. package/.medusa/server/src/modules/product/models/product-change-action.d.ts +1081 -0
  297. package/.medusa/server/src/modules/product/models/product-change-action.js +42 -0
  298. package/.medusa/server/src/modules/product/models/product-change.d.ts +547 -0
  299. package/.medusa/server/src/modules/product/models/product-change.js +50 -0
  300. package/.medusa/server/src/modules/product/models/product-collection.d.ts +540 -0
  301. package/.medusa/server/src/modules/product/models/product-collection.js +27 -0
  302. package/.medusa/server/src/modules/product/models/product-image.d.ts +1733 -0
  303. package/.medusa/server/src/modules/product/models/product-image.js +51 -0
  304. package/.medusa/server/src/modules/product/models/product-tag.d.ts +549 -0
  305. package/.medusa/server/src/modules/product/models/product-tag.js +26 -0
  306. package/.medusa/server/src/modules/product/models/product-type.d.ts +541 -0
  307. package/.medusa/server/src/modules/product/models/product-type.js +26 -0
  308. package/.medusa/server/src/modules/product/models/product-variant-product-image.d.ts +3352 -0
  309. package/.medusa/server/src/modules/product/models/product-variant-product-image.js +19 -0
  310. package/.medusa/server/src/modules/product/models/product-variant.d.ts +1617 -0
  311. package/.medusa/server/src/modules/product/models/product-variant.js +84 -0
  312. package/.medusa/server/src/modules/product/models/product.d.ts +547 -0
  313. package/.medusa/server/src/modules/product/models/product.js +137 -0
  314. package/.medusa/server/src/modules/product/repositories/product-category.d.ts +53 -0
  315. package/.medusa/server/src/modules/product/repositories/product-category.js +381 -0
  316. package/.medusa/server/src/modules/product/service.d.ts +11013 -0
  317. package/.medusa/server/src/modules/product/service.js +1471 -0
  318. package/.medusa/server/src/modules/product/services/product-category.d.ts +37 -0
  319. package/.medusa/server/src/modules/product/services/product-category.js +166 -0
  320. package/.medusa/server/src/modules/seller/loaders/register-feature-flags.js +7 -1
  321. package/.medusa/server/src/modules/seller/migrations/Migration20260414123048.d.ts +5 -0
  322. package/.medusa/server/src/modules/seller/migrations/Migration20260414123048.js +16 -0
  323. package/.medusa/server/src/types/cart-line-item.d.ts +15 -0
  324. package/.medusa/server/src/types/cart-line-item.js +3 -0
  325. package/.medusa/server/src/utils/disable-medusa-middlewares.d.ts +2 -0
  326. package/.medusa/server/src/utils/disable-medusa-middlewares.js +90 -0
  327. package/.medusa/server/src/with-mercur.js +9 -2
  328. package/.medusa/server/src/workflows/cart/hooks/index.d.ts +2 -0
  329. package/.medusa/server/src/workflows/cart/hooks/index.js +5 -0
  330. package/.medusa/server/src/workflows/cart/hooks/validate-add-to-cart-stock.js +52 -0
  331. package/.medusa/server/src/workflows/cart/hooks/validate-update-line-item-stock.js +60 -0
  332. package/.medusa/server/src/workflows/cart/index.d.ts +1 -0
  333. package/.medusa/server/src/workflows/cart/index.js +2 -1
  334. package/.medusa/server/src/workflows/cart/steps/calculate-offer-prices.d.ts +19 -0
  335. package/.medusa/server/src/workflows/cart/steps/calculate-offer-prices.js +39 -0
  336. package/.medusa/server/src/workflows/cart/steps/decorate-line-item-with-offer.d.ts +8 -0
  337. package/.medusa/server/src/workflows/cart/steps/decorate-line-item-with-offer.js +45 -0
  338. package/.medusa/server/src/workflows/cart/steps/get-line-item-actions.d.ts +21 -0
  339. package/.medusa/server/src/workflows/cart/steps/get-line-item-actions.js +85 -0
  340. package/.medusa/server/src/workflows/cart/steps/index.d.ts +5 -0
  341. package/.medusa/server/src/workflows/cart/steps/index.js +6 -1
  342. package/.medusa/server/src/workflows/cart/steps/link-line-item-to-offer.d.ts +13 -0
  343. package/.medusa/server/src/workflows/cart/steps/link-line-item-to-offer.js +31 -0
  344. package/.medusa/server/src/workflows/cart/steps/mirror-line-item-offer-links-to-order.d.ts +16 -0
  345. package/.medusa/server/src/workflows/cart/steps/mirror-line-item-offer-links-to-order.js +32 -0
  346. package/.medusa/server/src/workflows/cart/steps/validate-seller-cart-items.d.ts +5 -7
  347. package/.medusa/server/src/workflows/cart/steps/validate-seller-cart-items.js +6 -4
  348. package/.medusa/server/src/workflows/cart/steps/validate-seller-cart-shipping.d.ts +5 -6
  349. package/.medusa/server/src/workflows/cart/steps/validate-seller-cart-shipping.js +5 -4
  350. package/.medusa/server/src/workflows/cart/utils/fields.js +11 -20
  351. package/.medusa/server/src/workflows/cart/utils/index.d.ts +0 -1
  352. package/.medusa/server/src/workflows/cart/utils/index.js +1 -2
  353. package/.medusa/server/src/workflows/cart/utils/prepare-line-item-data.d.ts +1 -0
  354. package/.medusa/server/src/workflows/cart/utils/prepare-line-item-data.js +2 -2
  355. package/.medusa/server/src/workflows/cart/workflows/add-to-cart.d.ts +12 -0
  356. package/.medusa/server/src/workflows/cart/workflows/add-to-cart.js +235 -0
  357. package/.medusa/server/src/workflows/cart/workflows/complete-cart-with-split-orders.js +76 -24
  358. package/.medusa/server/src/workflows/cart/workflows/index.d.ts +2 -0
  359. package/.medusa/server/src/workflows/cart/workflows/index.js +3 -1
  360. package/.medusa/server/src/workflows/cart/workflows/list-seller-shipping-options-for-cart.js +18 -15
  361. package/.medusa/server/src/workflows/cart/workflows/update-line-item-in-cart.d.ts +16 -0
  362. package/.medusa/server/src/workflows/cart/workflows/update-line-item-in-cart.js +87 -0
  363. package/.medusa/server/src/workflows/commission/workflows/refresh-order-commission-lines.js +5 -3
  364. package/.medusa/server/src/workflows/events.d.ts +5 -0
  365. package/.medusa/server/src/workflows/events.js +7 -2
  366. package/.medusa/server/src/workflows/index.d.ts +4 -0
  367. package/.medusa/server/src/workflows/index.js +5 -1
  368. package/.medusa/server/src/workflows/offer/index.d.ts +3 -0
  369. package/.medusa/server/src/workflows/{attribute/workflows → offer}/index.js +4 -6
  370. package/.medusa/server/src/workflows/offer/steps/create-offers.d.ts +17 -0
  371. package/.medusa/server/src/workflows/offer/steps/create-offers.js +17 -0
  372. package/.medusa/server/src/workflows/offer/steps/delete-offers.d.ts +1 -0
  373. package/.medusa/server/src/workflows/offer/steps/delete-offers.js +17 -0
  374. package/.medusa/server/src/workflows/offer/steps/index.d.ts +3 -0
  375. package/.medusa/server/src/workflows/{product-attribute → offer}/steps/index.js +4 -8
  376. package/.medusa/server/src/workflows/offer/steps/update-offers.d.ts +26 -0
  377. package/.medusa/server/src/workflows/offer/steps/update-offers.js +35 -0
  378. package/.medusa/server/src/workflows/offer/utils/index.d.ts +1 -0
  379. package/.medusa/server/src/workflows/offer/utils/index.js +18 -0
  380. package/.medusa/server/src/workflows/offer/utils/prepare-offer-inventory-input.d.ts +59 -0
  381. package/.medusa/server/src/workflows/offer/utils/prepare-offer-inventory-input.js +128 -0
  382. package/.medusa/server/src/workflows/offer/workflows/batch-offer-inventory-items.d.ts +35 -0
  383. package/.medusa/server/src/workflows/offer/workflows/batch-offer-inventory-items.js +118 -0
  384. package/.medusa/server/src/workflows/offer/workflows/create-offers.d.ts +116 -0
  385. package/.medusa/server/src/workflows/offer/workflows/create-offers.js +117 -0
  386. package/.medusa/server/src/workflows/offer/workflows/delete-offers.d.ts +11 -0
  387. package/.medusa/server/src/workflows/offer/workflows/delete-offers.js +22 -0
  388. package/.medusa/server/src/workflows/offer/workflows/index.d.ts +4 -0
  389. package/.medusa/server/src/workflows/{attribute/steps → offer/workflows}/index.js +5 -8
  390. package/.medusa/server/src/workflows/offer/workflows/update-offers.d.ts +123 -0
  391. package/.medusa/server/src/workflows/offer/workflows/update-offers.js +66 -0
  392. package/.medusa/server/src/workflows/order/index.d.ts +1 -0
  393. package/.medusa/server/src/workflows/order/index.js +18 -0
  394. package/.medusa/server/src/workflows/order/workflows/cancel-order-fulfillment.d.ts +15 -0
  395. package/.medusa/server/src/workflows/order/workflows/cancel-order-fulfillment.js +187 -0
  396. package/.medusa/server/src/workflows/order/workflows/confirm-return-receive.d.ts +7 -0
  397. package/.medusa/server/src/workflows/order/workflows/confirm-return-receive.js +221 -0
  398. package/.medusa/server/src/workflows/order/workflows/create-order-fulfillment.d.ts +39 -0
  399. package/.medusa/server/src/workflows/order/workflows/create-order-fulfillment.js +367 -0
  400. package/.medusa/server/src/workflows/order/workflows/index.d.ts +3 -0
  401. package/.medusa/server/src/workflows/order/workflows/index.js +20 -0
  402. package/.medusa/server/src/workflows/product/events.d.ts +54 -0
  403. package/.medusa/server/src/workflows/product/events.js +58 -0
  404. package/.medusa/server/src/workflows/product/index.d.ts +3 -0
  405. package/.medusa/server/src/workflows/product/index.js +20 -0
  406. package/.medusa/server/src/workflows/product/steps/associate-sellers-with-product-brand.d.ts +8 -0
  407. package/.medusa/server/src/workflows/product/steps/associate-sellers-with-product-brand.js +26 -0
  408. package/.medusa/server/src/workflows/product/steps/associate-sellers-with-product-category.d.ts +8 -0
  409. package/.medusa/server/src/workflows/product/steps/associate-sellers-with-product-category.js +26 -0
  410. package/.medusa/server/src/workflows/product/steps/associate-sellers-with-product.d.ts +8 -0
  411. package/.medusa/server/src/workflows/product/steps/associate-sellers-with-product.js +26 -0
  412. package/.medusa/server/src/workflows/product/steps/batch-link-products-in-category.d.ts +7 -0
  413. package/.medusa/server/src/workflows/product/steps/batch-link-products-in-category.js +61 -0
  414. package/.medusa/server/src/workflows/product/steps/batch-product-attributes.d.ts +11 -0
  415. package/.medusa/server/src/workflows/product/steps/batch-product-attributes.js +16 -0
  416. package/.medusa/server/src/workflows/product/steps/create-product-attribute-values.d.ts +6 -0
  417. package/.medusa/server/src/workflows/product/steps/create-product-attribute-values.js +17 -0
  418. package/.medusa/server/src/workflows/product/steps/create-product-attributes.d.ts +2 -0
  419. package/.medusa/server/src/workflows/product/steps/create-product-attributes.js +17 -0
  420. package/.medusa/server/src/workflows/product/steps/create-product-brands.d.ts +2 -0
  421. package/.medusa/server/src/workflows/product/steps/create-product-brands.js +17 -0
  422. package/.medusa/server/src/workflows/product/steps/create-product-categories.d.ts +1548 -0
  423. package/.medusa/server/src/workflows/product/steps/create-product-categories.js +18 -0
  424. package/.medusa/server/src/workflows/product/steps/create-product-variants.d.ts +2 -0
  425. package/.medusa/server/src/workflows/product/steps/create-product-variants.js +18 -0
  426. package/.medusa/server/src/workflows/product/steps/create-products.d.ts +2 -0
  427. package/.medusa/server/src/workflows/product/steps/create-products.js +17 -0
  428. package/.medusa/server/src/workflows/product/steps/delete-product-attribute-values.d.ts +1 -0
  429. package/.medusa/server/src/workflows/product/steps/delete-product-attribute-values.js +17 -0
  430. package/.medusa/server/src/workflows/product/steps/delete-product-attributes.d.ts +1 -0
  431. package/.medusa/server/src/workflows/product/steps/delete-product-attributes.js +17 -0
  432. package/.medusa/server/src/workflows/product/steps/delete-product-brands.d.ts +1 -0
  433. package/.medusa/server/src/workflows/product/steps/delete-product-brands.js +17 -0
  434. package/.medusa/server/src/workflows/product/steps/delete-product-categories.d.ts +1 -0
  435. package/.medusa/server/src/workflows/product/steps/delete-product-categories.js +17 -0
  436. package/.medusa/server/src/workflows/product/steps/delete-product-variants.d.ts +1 -0
  437. package/.medusa/server/src/workflows/product/steps/delete-product-variants.js +17 -0
  438. package/.medusa/server/src/workflows/product/steps/delete-products.d.ts +1 -0
  439. package/.medusa/server/src/workflows/product/steps/delete-products.js +17 -0
  440. package/.medusa/server/src/workflows/product/steps/detach-sellers-from-product-brand.d.ts +8 -0
  441. package/.medusa/server/src/workflows/product/steps/detach-sellers-from-product-brand.js +26 -0
  442. package/.medusa/server/src/workflows/product/steps/detach-sellers-from-product-category.d.ts +8 -0
  443. package/.medusa/server/src/workflows/product/steps/detach-sellers-from-product-category.js +26 -0
  444. package/.medusa/server/src/workflows/product/steps/detach-sellers-from-product.d.ts +8 -0
  445. package/.medusa/server/src/workflows/product/steps/detach-sellers-from-product.js +26 -0
  446. package/.medusa/server/src/workflows/product/steps/index.d.ts +33 -0
  447. package/.medusa/server/src/workflows/product/steps/index.js +50 -0
  448. package/.medusa/server/src/workflows/product/steps/remove-attribute-from-product.d.ts +6 -0
  449. package/.medusa/server/src/workflows/product/steps/remove-attribute-from-product.js +11 -0
  450. package/.medusa/server/src/workflows/product/steps/update-product-attribute-values.d.ts +7 -0
  451. package/.medusa/server/src/workflows/product/steps/update-product-attribute-values.js +22 -0
  452. package/.medusa/server/src/workflows/product/steps/update-product-attributes.d.ts +7 -0
  453. package/.medusa/server/src/workflows/product/steps/update-product-attributes.js +22 -0
  454. package/.medusa/server/src/workflows/product/steps/update-product-brands.d.ts +7 -0
  455. package/.medusa/server/src/workflows/product/steps/update-product-brands.js +28 -0
  456. package/.medusa/server/src/workflows/product/steps/update-product-categories.d.ts +1552 -0
  457. package/.medusa/server/src/workflows/product/steps/update-product-categories.js +20 -0
  458. package/.medusa/server/src/workflows/product/steps/update-product-variants.d.ts +10 -0
  459. package/.medusa/server/src/workflows/product/steps/update-product-variants.js +32 -0
  460. package/.medusa/server/src/workflows/product/steps/update-products.d.ts +10 -0
  461. package/.medusa/server/src/workflows/product/steps/update-products.js +33 -0
  462. package/.medusa/server/src/workflows/product/steps/upsert-product-attribute-values.d.ts +5 -0
  463. package/.medusa/server/src/workflows/product/steps/upsert-product-attribute-values.js +30 -0
  464. package/.medusa/server/src/workflows/product/steps/validate-attribute-accepts-values.d.ts +5 -0
  465. package/.medusa/server/src/workflows/product/steps/validate-attribute-accepts-values.js +19 -0
  466. package/.medusa/server/src/workflows/product/steps/validate-confirm-products.d.ts +3 -0
  467. package/.medusa/server/src/workflows/product/steps/validate-confirm-products.js +14 -0
  468. package/.medusa/server/src/workflows/product/steps/validate-delete-product-attribute-values.d.ts +5 -0
  469. package/.medusa/server/src/workflows/product/steps/validate-delete-product-attribute-values.js +19 -0
  470. package/.medusa/server/src/workflows/product/steps/validate-delete-product-attributes.d.ts +5 -0
  471. package/.medusa/server/src/workflows/product/steps/validate-delete-product-attributes.js +30 -0
  472. package/.medusa/server/src/workflows/product/steps/validate-reject-product.d.ts +3 -0
  473. package/.medusa/server/src/workflows/product/steps/validate-reject-product.js +12 -0
  474. package/.medusa/server/src/workflows/product/steps/validate-request-changes.d.ts +3 -0
  475. package/.medusa/server/src/workflows/product/steps/validate-request-changes.js +12 -0
  476. package/.medusa/server/src/workflows/product/steps/validate-resubmit-product.d.ts +3 -0
  477. package/.medusa/server/src/workflows/product/steps/validate-resubmit-product.js +12 -0
  478. package/.medusa/server/src/workflows/product/steps/validate-seller-product-permissions.d.ts +7 -0
  479. package/.medusa/server/src/workflows/product/steps/validate-seller-product-permissions.js +45 -0
  480. package/.medusa/server/src/workflows/product/workflows/batch-link-products-in-category.d.ts +8 -0
  481. package/.medusa/server/src/workflows/product/workflows/batch-link-products-in-category.js +10 -0
  482. package/.medusa/server/src/workflows/product/workflows/batch-product-attributes.d.ts +12 -0
  483. package/.medusa/server/src/workflows/product/workflows/batch-product-attributes.js +23 -0
  484. package/.medusa/server/src/workflows/product/workflows/batch-products.d.ts +3 -0
  485. package/.medusa/server/src/workflows/product/workflows/batch-products.js +86 -0
  486. package/.medusa/server/src/workflows/product/workflows/confirm-products.d.ts +15 -0
  487. package/.medusa/server/src/workflows/product/workflows/confirm-products.js +57 -0
  488. package/.medusa/server/src/workflows/product/workflows/create-product-attribute-values.d.ts +8 -0
  489. package/.medusa/server/src/workflows/product/workflows/create-product-attribute-values.js +21 -0
  490. package/.medusa/server/src/workflows/product/workflows/create-product-attributes.d.ts +7 -0
  491. package/.medusa/server/src/workflows/product/workflows/create-product-attributes.js +18 -0
  492. package/.medusa/server/src/workflows/product/workflows/create-product-brands.d.ts +7 -0
  493. package/.medusa/server/src/workflows/product/workflows/create-product-brands.js +19 -0
  494. package/.medusa/server/src/workflows/product/workflows/create-product-categories.d.ts +1553 -0
  495. package/.medusa/server/src/workflows/product/workflows/create-product-categories.js +18 -0
  496. package/.medusa/server/src/workflows/product/workflows/create-product-variants.d.ts +3 -0
  497. package/.medusa/server/src/workflows/product/workflows/create-product-variants.js +25 -0
  498. package/.medusa/server/src/workflows/product/workflows/create-products.d.ts +3 -0
  499. package/.medusa/server/src/workflows/product/workflows/create-products.js +35 -0
  500. package/.medusa/server/src/workflows/product/workflows/delete-product-attribute-values.d.ts +6 -0
  501. package/.medusa/server/src/workflows/product/workflows/delete-product-attribute-values.js +20 -0
  502. package/.medusa/server/src/workflows/product/workflows/delete-product-attributes.d.ts +6 -0
  503. package/.medusa/server/src/workflows/product/workflows/delete-product-attributes.js +20 -0
  504. package/.medusa/server/src/workflows/product/workflows/delete-product-brands.d.ts +6 -0
  505. package/.medusa/server/src/workflows/product/workflows/delete-product-brands.js +19 -0
  506. package/.medusa/server/src/workflows/product/workflows/delete-product-categories.d.ts +6 -0
  507. package/.medusa/server/src/workflows/product/workflows/delete-product-categories.js +18 -0
  508. package/.medusa/server/src/workflows/product/workflows/delete-product-variants.d.ts +8 -0
  509. package/.medusa/server/src/workflows/product/workflows/delete-product-variants.js +24 -0
  510. package/.medusa/server/src/workflows/product/workflows/delete-products.d.ts +6 -0
  511. package/.medusa/server/src/workflows/product/workflows/delete-products.js +19 -0
  512. package/.medusa/server/src/workflows/product/workflows/index.d.ts +30 -0
  513. package/.medusa/server/src/workflows/product/workflows/index.js +47 -0
  514. package/.medusa/server/src/workflows/product/workflows/link-sellers-to-product-brand.d.ts +14 -0
  515. package/.medusa/server/src/workflows/product/workflows/link-sellers-to-product-brand.js +21 -0
  516. package/.medusa/server/src/workflows/product/workflows/link-sellers-to-product-category.d.ts +14 -0
  517. package/.medusa/server/src/workflows/product/workflows/link-sellers-to-product-category.js +21 -0
  518. package/.medusa/server/src/workflows/product/workflows/link-sellers-to-product.d.ts +14 -0
  519. package/.medusa/server/src/workflows/product/workflows/link-sellers-to-product.js +21 -0
  520. package/.medusa/server/src/workflows/product/workflows/reject-product.d.ts +11 -0
  521. package/.medusa/server/src/workflows/product/workflows/reject-product.js +61 -0
  522. package/.medusa/server/src/workflows/product/workflows/remove-attribute-from-product.d.ts +7 -0
  523. package/.medusa/server/src/workflows/product/workflows/remove-attribute-from-product.js +20 -0
  524. package/.medusa/server/src/workflows/product/workflows/request-product-changes.d.ts +11 -0
  525. package/.medusa/server/src/workflows/product/workflows/request-product-changes.js +61 -0
  526. package/.medusa/server/src/workflows/product/workflows/resubmit-product.d.ts +8 -0
  527. package/.medusa/server/src/workflows/product/workflows/resubmit-product.js +48 -0
  528. package/.medusa/server/src/workflows/product/workflows/submit-seller-products.d.ts +3 -0
  529. package/.medusa/server/src/workflows/product/workflows/submit-seller-products.js +76 -0
  530. package/.medusa/server/src/workflows/product/workflows/update-product-attribute-values.d.ts +8 -0
  531. package/.medusa/server/src/workflows/product/workflows/update-product-attribute-values.js +18 -0
  532. package/.medusa/server/src/workflows/product/workflows/update-product-attributes.d.ts +8 -0
  533. package/.medusa/server/src/workflows/product/workflows/update-product-attributes.js +18 -0
  534. package/.medusa/server/src/workflows/product/workflows/update-product-brands.d.ts +8 -0
  535. package/.medusa/server/src/workflows/product/workflows/update-product-brands.js +19 -0
  536. package/.medusa/server/src/workflows/product/workflows/update-product-categories.d.ts +1555 -0
  537. package/.medusa/server/src/workflows/product/workflows/update-product-categories.js +18 -0
  538. package/.medusa/server/src/workflows/product/workflows/update-product-variants.d.ts +3 -0
  539. package/.medusa/server/src/workflows/product/workflows/update-product-variants.js +36 -0
  540. package/.medusa/server/src/workflows/product/workflows/update-products.d.ts +3 -0
  541. package/.medusa/server/src/workflows/product/workflows/update-products.js +23 -0
  542. package/.medusa/server/src/workflows/product/workflows/upsert-product-attribute-values.d.ts +8 -0
  543. package/.medusa/server/src/workflows/product/workflows/upsert-product-attribute-values.js +21 -0
  544. package/.medusa/server/src/workflows/{attribute → product-edit}/index.js +2 -2
  545. package/.medusa/server/src/workflows/product-edit/steps/cancel-product-change.d.ts +7 -0
  546. package/.medusa/server/src/workflows/product-edit/steps/cancel-product-change.js +14 -0
  547. package/.medusa/server/src/workflows/product-edit/steps/confirm-product-changes.d.ts +8 -0
  548. package/.medusa/server/src/workflows/product-edit/steps/confirm-product-changes.js +11 -0
  549. package/.medusa/server/src/workflows/product-edit/steps/create-product-change-actions.d.ts +16 -0
  550. package/.medusa/server/src/workflows/product-edit/steps/create-product-change-actions.js +17 -0
  551. package/.medusa/server/src/workflows/product-edit/steps/create-product-changes.d.ts +17 -0
  552. package/.medusa/server/src/workflows/product-edit/steps/create-product-changes.js +25 -0
  553. package/.medusa/server/src/workflows/product-edit/steps/decline-product-change.d.ts +8 -0
  554. package/.medusa/server/src/workflows/product-edit/steps/decline-product-change.js +14 -0
  555. package/.medusa/server/src/workflows/product-edit/steps/index.d.ts +8 -0
  556. package/.medusa/server/src/workflows/{product-attribute/workflows → product-edit/steps}/index.js +9 -9
  557. package/.medusa/server/src/workflows/product-edit/steps/retrieve-product-with-change.d.ts +5 -0
  558. package/.medusa/server/src/workflows/product-edit/steps/retrieve-product-with-change.js +11 -0
  559. package/.medusa/server/src/workflows/product-edit/steps/validate-no-pending-product-change.d.ts +12 -0
  560. package/.medusa/server/src/workflows/product-edit/steps/validate-no-pending-product-change.js +21 -0
  561. package/.medusa/server/src/workflows/product-edit/steps/validate-product-change-pending.d.ts +11 -0
  562. package/.medusa/server/src/workflows/product-edit/steps/validate-product-change-pending.js +21 -0
  563. package/.medusa/server/src/workflows/product-edit/workflows/auto-confirm-product-change.d.ts +16 -0
  564. package/.medusa/server/src/workflows/product-edit/workflows/auto-confirm-product-change.js +37 -0
  565. package/.medusa/server/src/workflows/product-edit/workflows/cancel-product-edit.d.ts +19 -0
  566. package/.medusa/server/src/workflows/product-edit/workflows/cancel-product-edit.js +40 -0
  567. package/.medusa/server/src/workflows/product-edit/workflows/confirm-product-edit.d.ts +21 -0
  568. package/.medusa/server/src/workflows/product-edit/workflows/confirm-product-edit.js +44 -0
  569. package/.medusa/server/src/workflows/product-edit/workflows/decline-product-edit.d.ts +16 -0
  570. package/.medusa/server/src/workflows/product-edit/workflows/decline-product-edit.js +42 -0
  571. package/.medusa/server/src/workflows/product-edit/workflows/index.d.ts +11 -0
  572. package/.medusa/server/src/workflows/product-edit/workflows/index.js +28 -0
  573. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-add-attribute.d.ts +19 -0
  574. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-add-attribute.js +66 -0
  575. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-add-variant.d.ts +17 -0
  576. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-add-variant.js +58 -0
  577. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-delete-product.d.ts +20 -0
  578. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-delete-product.js +60 -0
  579. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-remove-attribute.d.ts +17 -0
  580. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-remove-attribute.js +62 -0
  581. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-remove-variant.d.ts +16 -0
  582. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-remove-variant.js +68 -0
  583. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-update-fields.d.ts +18 -0
  584. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-update-fields.js +72 -0
  585. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-update-variant.d.ts +21 -0
  586. package/.medusa/server/src/workflows/product-edit/workflows/product-edit-update-variant.js +89 -0
  587. package/.medusa/server/src/workflows/seller/workflows/create-sellers.js +5 -2
  588. package/.medusa/server/src/workflows/utils/override-workflow.d.ts +12 -0
  589. package/.medusa/server/src/workflows/utils/override-workflow.js +21 -0
  590. package/package.json +8 -4
  591. package/.medusa/server/src/api/admin/attributes/[id]/route.d.ts +0 -5
  592. package/.medusa/server/src/api/admin/attributes/[id]/route.js +0 -68
  593. package/.medusa/server/src/api/admin/attributes/[id]/values/[value_id]/route.d.ts +0 -4
  594. package/.medusa/server/src/api/admin/attributes/[id]/values/[value_id]/route.js +0 -40
  595. package/.medusa/server/src/api/admin/attributes/[id]/values/route.d.ts +0 -4
  596. package/.medusa/server/src/api/admin/attributes/[id]/values/route.js +0 -44
  597. package/.medusa/server/src/api/admin/attributes/middlewares.d.ts +0 -2
  598. package/.medusa/server/src/api/admin/attributes/middlewares.js +0 -102
  599. package/.medusa/server/src/api/admin/attributes/query-config.d.ts +0 -20
  600. package/.medusa/server/src/api/admin/attributes/query-config.js +0 -41
  601. package/.medusa/server/src/api/admin/attributes/route.d.ts +0 -4
  602. package/.medusa/server/src/api/admin/attributes/route.js +0 -51
  603. package/.medusa/server/src/api/admin/attributes/validators.d.ts +0 -793
  604. package/.medusa/server/src/api/admin/attributes/validators.js +0 -92
  605. package/.medusa/server/src/api/vendor/attributes/middlewares.d.ts +0 -2
  606. package/.medusa/server/src/api/vendor/attributes/middlewares.js +0 -32
  607. package/.medusa/server/src/api/vendor/attributes/route.js +0 -20
  608. package/.medusa/server/src/api/vendor/product-categories/[id]/products/route.d.ts +0 -3
  609. package/.medusa/server/src/api/vendor/product-categories/[id]/products/route.js +0 -27
  610. package/.medusa/server/src/api/vendor/product-categories/helpers.d.ts +0 -2
  611. package/.medusa/server/src/api/vendor/product-categories/helpers.js +0 -24
  612. package/.medusa/server/src/api/vendor/products/[id]/attributes/utils.d.ts +0 -7
  613. package/.medusa/server/src/api/vendor/products/[id]/attributes/utils.js +0 -16
  614. package/.medusa/server/src/api/vendor/products/[id]/options/[option_id]/route.d.ts +0 -5
  615. package/.medusa/server/src/api/vendor/products/[id]/options/[option_id]/route.js +0 -74
  616. package/.medusa/server/src/api/vendor/products/[id]/options/route.d.ts +0 -4
  617. package/.medusa/server/src/api/vendor/products/[id]/options/route.js +0 -34
  618. package/.medusa/server/src/api/vendor/products/[id]/variants/[variant_id]/media/route.js +0 -20
  619. package/.medusa/server/src/api/vendor/products/helpers.d.ts +0 -2
  620. package/.medusa/server/src/api/vendor/products/helpers.js +0 -20
  621. package/.medusa/server/src/api/vendor/products/utils/transform-product-attributes.d.ts +0 -34
  622. package/.medusa/server/src/api/vendor/products/utils/transform-product-attributes.js +0 -71
  623. package/.medusa/server/src/links/category-attribute-link.js +0 -16
  624. package/.medusa/server/src/links/product-attribute-value-link.js +0 -16
  625. package/.medusa/server/src/links/product-vendor-product-attribute-link.js +0 -16
  626. package/.medusa/server/src/links/seller-attribute-link.js +0 -13
  627. package/.medusa/server/src/links/seller-attribute-value-link.js +0 -13
  628. package/.medusa/server/src/links/seller-vendor-product-attribute-link.js +0 -13
  629. package/.medusa/server/src/modules/attribute/index.d.ts +0 -51
  630. package/.medusa/server/src/modules/attribute/index.js +0 -15
  631. package/.medusa/server/src/modules/attribute/migrations/Migration20260325000000.js +0 -32
  632. package/.medusa/server/src/modules/attribute/models/attribute-possible-value.d.ts +0 -27
  633. package/.medusa/server/src/modules/attribute/models/attribute-possible-value.js +0 -26
  634. package/.medusa/server/src/modules/attribute/models/attribute-value.d.ts +0 -27
  635. package/.medusa/server/src/modules/attribute/models/attribute-value.js +0 -26
  636. package/.medusa/server/src/modules/attribute/models/attribute.d.ts +0 -28
  637. package/.medusa/server/src/modules/attribute/models/attribute.js +0 -36
  638. package/.medusa/server/src/modules/attribute/models/index.d.ts +0 -3
  639. package/.medusa/server/src/modules/attribute/models/index.js +0 -13
  640. package/.medusa/server/src/modules/attribute/service.d.ts +0 -105
  641. package/.medusa/server/src/modules/attribute/service.js +0 -74
  642. package/.medusa/server/src/modules/vendor-product-attribute/index.d.ts +0 -23
  643. package/.medusa/server/src/modules/vendor-product-attribute/index.js +0 -15
  644. package/.medusa/server/src/modules/vendor-product-attribute/migrations/Migration20260325000000.js +0 -16
  645. package/.medusa/server/src/modules/vendor-product-attribute/models/vendor-product-attribute.d.ts +0 -11
  646. package/.medusa/server/src/modules/vendor-product-attribute/models/vendor-product-attribute.js +0 -24
  647. package/.medusa/server/src/modules/vendor-product-attribute/service.d.ts +0 -14
  648. package/.medusa/server/src/modules/vendor-product-attribute/service.js +0 -13
  649. package/.medusa/server/src/workflows/attribute/steps/create-attribute-possible-values.d.ts +0 -40
  650. package/.medusa/server/src/workflows/attribute/steps/create-attribute-possible-values.js +0 -18
  651. package/.medusa/server/src/workflows/attribute/steps/create-attributes.d.ts +0 -5
  652. package/.medusa/server/src/workflows/attribute/steps/create-attributes.js +0 -32
  653. package/.medusa/server/src/workflows/attribute/steps/delete-attribute.d.ts +0 -6
  654. package/.medusa/server/src/workflows/attribute/steps/delete-attribute.js +0 -31
  655. package/.medusa/server/src/workflows/attribute/steps/index.d.ts +0 -7
  656. package/.medusa/server/src/workflows/attribute/steps/update-attribute-possible-value.d.ts +0 -39
  657. package/.medusa/server/src/workflows/attribute/steps/update-attribute-possible-value.js +0 -18
  658. package/.medusa/server/src/workflows/attribute/steps/update-attributes.d.ts +0 -21
  659. package/.medusa/server/src/workflows/attribute/steps/update-attributes.js +0 -37
  660. package/.medusa/server/src/workflows/attribute/steps/validate-attribute-delete.d.ts +0 -6
  661. package/.medusa/server/src/workflows/attribute/steps/validate-attribute-delete.js +0 -50
  662. package/.medusa/server/src/workflows/attribute/steps/validate-possible-values-removal.d.ts +0 -7
  663. package/.medusa/server/src/workflows/attribute/steps/validate-possible-values-removal.js +0 -70
  664. package/.medusa/server/src/workflows/attribute/workflows/create-attribute-possible-values.d.ts +0 -39
  665. package/.medusa/server/src/workflows/attribute/workflows/create-attribute-possible-values.js +0 -11
  666. package/.medusa/server/src/workflows/attribute/workflows/create-attributes.d.ts +0 -7
  667. package/.medusa/server/src/workflows/attribute/workflows/create-attributes.js +0 -40
  668. package/.medusa/server/src/workflows/attribute/workflows/delete-attribute.d.ts +0 -6
  669. package/.medusa/server/src/workflows/attribute/workflows/delete-attribute.js +0 -11
  670. package/.medusa/server/src/workflows/attribute/workflows/index.d.ts +0 -5
  671. package/.medusa/server/src/workflows/attribute/workflows/update-attribute-possible-value.d.ts +0 -39
  672. package/.medusa/server/src/workflows/attribute/workflows/update-attribute-possible-value.js +0 -11
  673. package/.medusa/server/src/workflows/attribute/workflows/update-attributes.d.ts +0 -24
  674. package/.medusa/server/src/workflows/attribute/workflows/update-attributes.js +0 -69
  675. package/.medusa/server/src/workflows/cart/utils/prepare-confirm-inventory-input.d.ts +0 -28
  676. package/.medusa/server/src/workflows/cart/utils/prepare-confirm-inventory-input.js +0 -165
  677. package/.medusa/server/src/workflows/hooks/product-created.js +0 -75
  678. package/.medusa/server/src/workflows/hooks/product-variant-created.js +0 -50
  679. package/.medusa/server/src/workflows/product-attribute/steps/create-attribute-value.d.ts +0 -39
  680. package/.medusa/server/src/workflows/product-attribute/steps/create-attribute-value.js +0 -21
  681. package/.medusa/server/src/workflows/product-attribute/steps/create-attribute-values.d.ts +0 -12
  682. package/.medusa/server/src/workflows/product-attribute/steps/create-attribute-values.js +0 -24
  683. package/.medusa/server/src/workflows/product-attribute/steps/create-vendor-product-attribute.d.ts +0 -14
  684. package/.medusa/server/src/workflows/product-attribute/steps/create-vendor-product-attribute.js +0 -18
  685. package/.medusa/server/src/workflows/product-attribute/steps/delete-attribute-value.d.ts +0 -2
  686. package/.medusa/server/src/workflows/product-attribute/steps/delete-attribute-value.js +0 -18
  687. package/.medusa/server/src/workflows/product-attribute/steps/index.d.ts +0 -7
  688. package/.medusa/server/src/workflows/product-attribute/steps/restore-variant-image-associations.d.ts +0 -10
  689. package/.medusa/server/src/workflows/product-attribute/steps/restore-variant-image-associations.js +0 -49
  690. package/.medusa/server/src/workflows/product-attribute/steps/save-variant-image-associations.d.ts +0 -8
  691. package/.medusa/server/src/workflows/product-attribute/steps/save-variant-image-associations.js +0 -29
  692. package/.medusa/server/src/workflows/product-attribute/steps/validate-attribute-value.d.ts +0 -3
  693. package/.medusa/server/src/workflows/product-attribute/steps/validate-attribute-value.js +0 -59
  694. package/.medusa/server/src/workflows/product-attribute/utils/find-or-create-vendor-attribute.d.ts +0 -13
  695. package/.medusa/server/src/workflows/product-attribute/utils/find-or-create-vendor-attribute.js +0 -56
  696. package/.medusa/server/src/workflows/product-attribute/utils/get-applicable-attributes.d.ts +0 -2
  697. package/.medusa/server/src/workflows/product-attribute/utils/get-applicable-attributes.js +0 -58
  698. package/.medusa/server/src/workflows/product-attribute/utils/products-created-handler.d.ts +0 -8
  699. package/.medusa/server/src/workflows/product-attribute/utils/products-created-handler.js +0 -100
  700. package/.medusa/server/src/workflows/product-attribute/workflows/convert-attribute-to-option.d.ts +0 -3
  701. package/.medusa/server/src/workflows/product-attribute/workflows/convert-attribute-to-option.js +0 -46
  702. package/.medusa/server/src/workflows/product-attribute/workflows/convert-option-to-attribute.d.ts +0 -3
  703. package/.medusa/server/src/workflows/product-attribute/workflows/convert-option-to-attribute.js +0 -29
  704. package/.medusa/server/src/workflows/product-attribute/workflows/create-and-link-attribute-values.d.ts +0 -16
  705. package/.medusa/server/src/workflows/product-attribute/workflows/create-and-link-attribute-values.js +0 -72
  706. package/.medusa/server/src/workflows/product-attribute/workflows/create-attribute-value.d.ts +0 -39
  707. package/.medusa/server/src/workflows/product-attribute/workflows/create-attribute-value.js +0 -35
  708. package/.medusa/server/src/workflows/product-attribute/workflows/create-vendor-product-attribute.d.ts +0 -24
  709. package/.medusa/server/src/workflows/product-attribute/workflows/create-vendor-product-attribute.js +0 -42
  710. package/.medusa/server/src/workflows/product-attribute/workflows/delete-attribute-value.d.ts +0 -3
  711. package/.medusa/server/src/workflows/product-attribute/workflows/delete-attribute-value.js +0 -59
  712. package/.medusa/server/src/workflows/product-attribute/workflows/index.d.ts +0 -8
  713. package/.medusa/server/src/workflows/product-attribute/workflows/sync-product-attribute-values.d.ts +0 -20
  714. package/.medusa/server/src/workflows/product-attribute/workflows/sync-product-attribute-values.js +0 -67
  715. package/.medusa/server/src/workflows/product-attribute/workflows/update-product-with-variant-images.d.ts +0 -11
  716. package/.medusa/server/src/workflows/product-attribute/workflows/update-product-with-variant-images.js +0 -34
  717. package/.medusa/server/src/links/{category-attribute-link.d.ts → brand-seller-link.d.ts} +0 -0
  718. package/.medusa/server/src/links/{product-attribute-value-link.d.ts → cart-line-item-offer-link.d.ts} +0 -0
  719. package/.medusa/server/src/links/{product-vendor-product-attribute-link.d.ts → category-seller-link.d.ts} +0 -0
  720. package/.medusa/server/src/links/{seller-attribute-link.d.ts → offer-inventory-item-link.d.ts} +0 -0
  721. package/.medusa/server/src/links/{seller-attribute-value-link.d.ts → offer-price-set-link.d.ts} +0 -0
  722. package/.medusa/server/src/links/{seller-vendor-product-attribute-link.d.ts → offer-seller-link.d.ts} +0 -0
  723. package/.medusa/server/src/workflows/{hooks/product-created.d.ts → cart/hooks/validate-add-to-cart-stock.d.ts} +0 -0
  724. package/.medusa/server/src/workflows/{hooks/product-variant-created.d.ts → cart/hooks/validate-update-line-item-stock.d.ts} +0 -0
  725. package/.medusa/server/src/workflows/{attribute → product-edit}/index.d.ts +1 -1
@@ -0,0 +1,1471 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var _a, _b;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ const utils_1 = require("@medusajs/framework/utils");
14
+ const types_1 = require("@mercurjs/types");
15
+ const models_1 = require("./models");
16
+ const ProductModuleServiceBase = (0, utils_1.MedusaService)({
17
+ Product: models_1.Product,
18
+ ProductAttribute: models_1.ProductAttribute,
19
+ ProductAttributeValue: models_1.ProductAttributeValue,
20
+ ProductBrand: models_1.ProductBrand,
21
+ ProductCategory: models_1.ProductCategory,
22
+ ProductChange: models_1.ProductChange,
23
+ ProductChangeAction: models_1.ProductChangeAction,
24
+ ProductCollection: models_1.ProductCollection,
25
+ ProductImage: models_1.ProductImage,
26
+ ProductTag: models_1.ProductTag,
27
+ ProductType: models_1.ProductType,
28
+ ProductVariant: models_1.ProductVariant,
29
+ ProductVariantProductImage: models_1.ProductVariantProductImage,
30
+ });
31
+ class ProductModuleService extends ProductModuleServiceBase {
32
+ constructor(container) {
33
+ super(...arguments);
34
+ this.productCategoryService_ = container.productCategoryService;
35
+ }
36
+ __joinerConfig() {
37
+ return (0, utils_1.defineJoinerConfig)(utils_1.Modules.PRODUCT, {
38
+ models: [
39
+ models_1.Product,
40
+ models_1.ProductAttribute,
41
+ models_1.ProductAttributeValue,
42
+ models_1.ProductBrand,
43
+ models_1.ProductCategory,
44
+ models_1.ProductChange,
45
+ models_1.ProductChangeAction,
46
+ models_1.ProductCollection,
47
+ models_1.ProductImage,
48
+ models_1.ProductTag,
49
+ models_1.ProductType,
50
+ models_1.ProductVariant,
51
+ models_1.ProductVariantProductImage,
52
+ ],
53
+ alias: [
54
+ {
55
+ name: [
56
+ "product_variant",
57
+ "product_variants",
58
+ "variant",
59
+ "variants",
60
+ ],
61
+ entity: "ProductVariant",
62
+ args: {
63
+ methodSuffix: "ProductVariants",
64
+ },
65
+ },
66
+ ],
67
+ });
68
+ }
69
+ async retrieveProduct(id, config, sharedContext) {
70
+ const product = await super.retrieveProduct(id, config, sharedContext);
71
+ const productChange = await this.getActiveProductChange_(product.id, true, sharedContext);
72
+ product.product_change = productChange;
73
+ this.formatProductAttributes_(product);
74
+ return product;
75
+ }
76
+ async listProducts(filters, config, sharedContext) {
77
+ const products = await super.listProducts(filters, config, sharedContext);
78
+ for (const product of products) {
79
+ this.formatProductAttributes_(product);
80
+ }
81
+ return products;
82
+ }
83
+ async listAndCountProducts(filters, config, sharedContext) {
84
+ const [products, count] = await super.listAndCountProducts(filters, config, sharedContext);
85
+ for (const product of products) {
86
+ this.formatProductAttributes_(product);
87
+ }
88
+ return [products, count];
89
+ }
90
+ /**
91
+ * Computes a unified `attributes` array on the product by merging
92
+ * variant_attributes, custom_attributes, and attribute_values into
93
+ * a single grouped structure with values nested under each attribute.
94
+ */
95
+ formatProductAttributes_(product) {
96
+ const hasAttrData = product.variant_attributes ||
97
+ product.custom_attributes ||
98
+ product.attribute_values;
99
+ if (!hasAttrData)
100
+ return;
101
+ const attrsById = new Map();
102
+ // Add variant_attributes (global or product-scoped, used as variant axes)
103
+ for (const attr of product.variant_attributes ?? []) {
104
+ attrsById.set(attr.id, { ...attr, values: [...(attr.values ?? [])] });
105
+ }
106
+ // Add custom_attributes (product-scoped, non-variant)
107
+ for (const attr of product.custom_attributes ?? []) {
108
+ if (!attrsById.has(attr.id)) {
109
+ attrsById.set(attr.id, {
110
+ ...attr,
111
+ values: [...(attr.values ?? [])],
112
+ });
113
+ }
114
+ }
115
+ // Add attributes discovered only via attribute_values
116
+ // (global non-variant attributes linked through values)
117
+ for (const val of product.attribute_values ?? []) {
118
+ if (!val.attribute)
119
+ continue;
120
+ const attrId = val.attribute.id ?? val.attribute_id;
121
+ if (!attrId || attrsById.has(attrId))
122
+ continue;
123
+ attrsById.set(attrId, { ...val.attribute, values: [] });
124
+ }
125
+ // Filter each attribute's values to only those linked to this product
126
+ const productValueIds = new Set((product.attribute_values ?? []).map((v) => v.id));
127
+ for (const attr of attrsById.values()) {
128
+ attr.values = (attr.values ?? []).filter((v) => productValueIds.has(v.id));
129
+ attr.values.sort((a, b) => (a.rank ?? 0) - (b.rank ?? 0));
130
+ }
131
+ // Sort attributes by rank
132
+ product.attributes = [...attrsById.values()].sort((a, b) => (a.rank ?? 0) - (b.rank ?? 0));
133
+ }
134
+ async getActiveProductChange_(productId, includeActions, sharedContext) {
135
+ const options = {
136
+ select: [
137
+ "id",
138
+ "product_id",
139
+ "status",
140
+ "internal_note",
141
+ "external_note",
142
+ "created_by",
143
+ "confirmed_by",
144
+ "confirmed_at",
145
+ "declined_by",
146
+ "declined_at",
147
+ "declined_reason",
148
+ "canceled_by",
149
+ "canceled_at",
150
+ ],
151
+ relations: [],
152
+ order: {},
153
+ };
154
+ if (includeActions) {
155
+ options.select.push("actions");
156
+ options.relations.push("actions");
157
+ options.order = {
158
+ actions: {
159
+ ordering: "ASC",
160
+ },
161
+ };
162
+ }
163
+ const [productChange] = await this.listProductChanges({
164
+ product_id: productId,
165
+ status: [types_1.ProductChangeStatus.PENDING],
166
+ }, options, sharedContext);
167
+ return productChange;
168
+ }
169
+ validateProductHandle_(handle) {
170
+ if (handle && !(0, utils_1.isValidHandle)(handle)) {
171
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Invalid product handle '${handle}'. It must contain URL safe characters`);
172
+ }
173
+ }
174
+ validateProductAttributeType_(attr) {
175
+ const VARIANT_AXIS_ALLOWED = new Set([
176
+ types_1.AttributeType.MULTI_SELECT,
177
+ ]);
178
+ const FILTERABLE_ALLOWED = new Set([
179
+ types_1.AttributeType.SINGLE_SELECT,
180
+ types_1.AttributeType.MULTI_SELECT,
181
+ types_1.AttributeType.TOGGLE,
182
+ types_1.AttributeType.UNIT,
183
+ ]);
184
+ if (attr.is_variant_axis &&
185
+ attr.type &&
186
+ !VARIANT_AXIS_ALLOWED.has(attr.type)) {
187
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Attribute '${attr.name ?? attr.id ?? "(unnamed)"}' (type=${attr.type}) cannot be a variant axis. Only multi_select attributes may drive variants.`);
188
+ }
189
+ if (attr.is_filterable &&
190
+ attr.type &&
191
+ !FILTERABLE_ALLOWED.has(attr.type)) {
192
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Attribute '${attr.name ?? attr.id ?? "(unnamed)"}' (type=${attr.type}) cannot be filterable. Only single_select, multi_select, toggle, and unit attributes are filterable.`);
193
+ }
194
+ }
195
+ async normalizeProductInput_(products, sharedContext) {
196
+ for (const product of products) {
197
+ // Handle
198
+ this.validateProductHandle_(product.handle);
199
+ if (!product.handle && product.title) {
200
+ product.handle = (0, utils_1.toHandle)(product.title);
201
+ }
202
+ // Dimension fields: API accepts numbers, model stores as text
203
+ if ("weight" in product) {
204
+ product.weight = product.weight?.toString();
205
+ }
206
+ if ("length" in product) {
207
+ product.length = product.length?.toString();
208
+ }
209
+ if ("height" in product) {
210
+ product.height = product.height?.toString();
211
+ }
212
+ if ("width" in product) {
213
+ product.width = product.width?.toString();
214
+ }
215
+ // M:M refs → plain IDs (Medusa pattern: MikroORM needs IDs, not { id } objects)
216
+ if (product.categories?.length) {
217
+ product.categories = product.categories.map((c) => (typeof c === "string" ? c : c.id));
218
+ }
219
+ if (product.tags?.length) {
220
+ product.tags = product.tags.map((t) => (typeof t === "string" ? t : t.id));
221
+ }
222
+ }
223
+ // Attribute normalization (variant attrs, product-level attr values, variant attr values)
224
+ const hasAttributeInput = products.some((p) => p.variant_attributes !== undefined ||
225
+ p.product_attributes !== undefined ||
226
+ (Array.isArray(p.variants) &&
227
+ p.variants.some((v) => v?.attribute_values !== undefined)));
228
+ if (hasAttributeInput) {
229
+ await this.normalizeAttributes_(products, sharedContext);
230
+ }
231
+ return products;
232
+ }
233
+ /**
234
+ * Normalizes product attribute inputs:
235
+ *
236
+ * **`variant_attributes`** — each entry is either:
237
+ * 1. Global attribute ref: `{ attribute_id, value_ids }` → links via M2M
238
+ * 2. Inline custom attr: `{ name, type, values }` → creates ProductAttribute + values
239
+ *
240
+ * **`product_attributes`** — non-variant attributes, same format as variant_attributes.
241
+ * Creates product-scoped attributes and links their values to the product.
242
+ *
243
+ * **`variant.attribute_values`** — `Record<string, string | string[]>`
244
+ * keyed by attribute name/handle, resolved to ProductAttributeValue IDs per variant.
245
+ */
246
+ async normalizeAttributes_(products, sharedContext) {
247
+ // Collect all global attribute IDs referenced (from variant_attributes and product attribute_values)
248
+ const attrIds = new Set();
249
+ for (const product of products) {
250
+ for (const input of product.variant_attributes ?? []) {
251
+ if (input.attribute_id)
252
+ attrIds.add(input.attribute_id);
253
+ }
254
+ for (const input of product.product_attributes ?? []) {
255
+ if (input.attribute_id)
256
+ attrIds.add(input.attribute_id);
257
+ }
258
+ }
259
+ // Batch-load referenced global attributes with their values
260
+ const attrsById = new Map();
261
+ if (attrIds.size) {
262
+ const attrs = await super.listProductAttributes({ id: Array.from(attrIds) }, { relations: ["values"] }, sharedContext);
263
+ for (const a of attrs) {
264
+ attrsById.set(a.id, a);
265
+ }
266
+ }
267
+ // Process each product
268
+ for (const product of products) {
269
+ // Lookup: attr name/handle/id → value name → ProductAttributeValue id
270
+ // Shared across variant_attributes + product attribute_values + variant attribute_values
271
+ const valueLookup = new Map();
272
+ const variantAttrValueIds = [];
273
+ const variantCustomAttributeIds = [];
274
+ const productAttrValueIds = [];
275
+ const customAttributeIds = [];
276
+ // Collect IDs of all inline-created attributes so we can batch-fetch
277
+ // their values in a single query after both loops.
278
+ const createdInlineAttrIds = [];
279
+ // --- Process variant_attributes ---
280
+ const attrsInput = product.variant_attributes;
281
+ if (attrsInput?.length) {
282
+ const variantAttributeIds = [];
283
+ for (const input of attrsInput) {
284
+ if (input.attribute_id) {
285
+ // Global attribute reference
286
+ const attr = attrsById.get(input.attribute_id);
287
+ if (!attr) {
288
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Product attribute with id '${input.attribute_id}' was not found`);
289
+ }
290
+ variantAttributeIds.push(attr.id);
291
+ // Validate value_ids if provided
292
+ const attrValuesById = new Map();
293
+ for (const v of attr.values ?? []) {
294
+ attrValuesById.set(v.id, v);
295
+ }
296
+ if (input.value_ids?.length) {
297
+ for (const vid of input.value_ids) {
298
+ if (!attrValuesById.has(vid)) {
299
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Attribute value with id '${vid}' was not found on attribute '${attr.name}'`);
300
+ }
301
+ variantAttrValueIds.push(vid);
302
+ }
303
+ }
304
+ // Build lookup
305
+ this.addAttrToLookup_(attr, valueLookup);
306
+ }
307
+ else {
308
+ // Inline custom attribute — create ProductAttribute + values
309
+ const customAttr = await this.createProductAttributes({
310
+ name: input.name,
311
+ type: input.type,
312
+ handle: input.name ? (0, utils_1.toHandle)(input.name) : undefined,
313
+ is_variant_axis: input.is_variant_axis ?? false,
314
+ is_filterable: input.is_filterable ?? false,
315
+ is_required: input.is_required ?? false,
316
+ description: input.description ?? null,
317
+ product_id: product.id ?? null,
318
+ metadata: input.metadata ?? null,
319
+ values: (input.values ?? []).map((v, i) => ({
320
+ name: v,
321
+ handle: (0, utils_1.toHandle)(v),
322
+ rank: i,
323
+ })),
324
+ }, sharedContext);
325
+ variantAttributeIds.push(customAttr.id);
326
+ variantCustomAttributeIds.push(customAttr.id);
327
+ createdInlineAttrIds.push(customAttr.id);
328
+ }
329
+ }
330
+ // Set M2M variant_attributes as IDs
331
+ product.variant_attributes = variantAttributeIds;
332
+ }
333
+ // --- Process product_attributes (non-variant) ---
334
+ const productAttrsInput = product.product_attributes;
335
+ if (productAttrsInput?.length) {
336
+ for (const input of productAttrsInput) {
337
+ if (input.attribute_id) {
338
+ // Global attribute reference
339
+ const attr = attrsById.get(input.attribute_id);
340
+ if (!attr) {
341
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Product attribute with id '${input.attribute_id}' was not found`);
342
+ }
343
+ this.addAttrToLookup_(attr, valueLookup);
344
+ // Collect specified value IDs
345
+ if (input.value_ids?.length) {
346
+ const attrValuesById = new Map();
347
+ for (const v of attr.values ?? []) {
348
+ attrValuesById.set(v.id, v);
349
+ }
350
+ for (const vid of input.value_ids) {
351
+ if (!attrValuesById.has(vid)) {
352
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Attribute value with id '${vid}' was not found on attribute '${attr.name}'`);
353
+ }
354
+ productAttrValueIds.push(vid);
355
+ }
356
+ }
357
+ // Upsert values by name (for text/unit/toggle attributes)
358
+ if (input.values?.length) {
359
+ const existingByName = new Map();
360
+ for (const v of attr.values ?? []) {
361
+ existingByName.set(v.name, v.id);
362
+ }
363
+ const toCreate = [];
364
+ for (const name of input.values) {
365
+ const existingId = existingByName.get(name);
366
+ if (existingId) {
367
+ productAttrValueIds.push(existingId);
368
+ }
369
+ else {
370
+ toCreate.push(name);
371
+ }
372
+ }
373
+ if (toCreate.length) {
374
+ const created = await this.createProductAttributeValues(toCreate.map((name, i) => ({
375
+ name,
376
+ handle: (0, utils_1.toHandle)(name),
377
+ rank: (attr.values?.length ?? 0) + i,
378
+ attribute_id: attr.id,
379
+ })), sharedContext);
380
+ const createdArr = Array.isArray(created)
381
+ ? created
382
+ : [created];
383
+ for (const v of createdArr) {
384
+ productAttrValueIds.push(v.id);
385
+ }
386
+ }
387
+ }
388
+ }
389
+ else {
390
+ // Inline custom attribute — create and collect value IDs
391
+ const customAttr = await this.createProductAttributes({
392
+ name: input.name,
393
+ type: input.type,
394
+ handle: input.name ? (0, utils_1.toHandle)(input.name) : undefined,
395
+ is_variant_axis: false,
396
+ is_filterable: input.is_filterable ?? false,
397
+ is_required: input.is_required ?? false,
398
+ description: input.description ?? null,
399
+ product_id: product.id ?? null,
400
+ metadata: input.metadata ?? null,
401
+ values: (input.values ?? []).map((v, i) => ({
402
+ name: v,
403
+ handle: (0, utils_1.toHandle)(v),
404
+ rank: i,
405
+ })),
406
+ }, sharedContext);
407
+ customAttributeIds.push(customAttr.id);
408
+ createdInlineAttrIds.push(customAttr.id);
409
+ }
410
+ }
411
+ delete product.product_attributes;
412
+ }
413
+ // Batch-fetch all inline-created attributes with their values in a single query
414
+ // instead of calling retrieveProductAttribute inside each loop iteration.
415
+ if (createdInlineAttrIds.length) {
416
+ const createdAttrs = await super.listProductAttributes({ id: createdInlineAttrIds }, { relations: ["values"] }, sharedContext);
417
+ const createdAttrsById = new Map();
418
+ for (const a of createdAttrs) {
419
+ createdAttrsById.set(a.id, a);
420
+ }
421
+ // Collect value IDs and build lookups from inline-created attributes
422
+ for (const attrId of variantCustomAttributeIds) {
423
+ const attr = createdAttrsById.get(attrId);
424
+ if (!attr)
425
+ continue;
426
+ this.addAttrToLookup_(attr, valueLookup);
427
+ for (const v of attr.values ?? []) {
428
+ variantAttrValueIds.push(v.id);
429
+ }
430
+ }
431
+ for (const attrId of customAttributeIds) {
432
+ const attr = createdAttrsById.get(attrId);
433
+ if (!attr)
434
+ continue;
435
+ this.addAttrToLookup_(attr, valueLookup);
436
+ for (const v of attr.values ?? []) {
437
+ productAttrValueIds.push(v.id);
438
+ }
439
+ }
440
+ }
441
+ // Stash custom attribute IDs — product_id will be set after product creation
442
+ const allPendingCustomAttrIds = [
443
+ ...variantCustomAttributeIds,
444
+ ...customAttributeIds,
445
+ ];
446
+ if (allPendingCustomAttrIds.length) {
447
+ product.__pending_custom_attribute_ids = allPendingCustomAttrIds;
448
+ }
449
+ // Merge variant + product attribute value IDs into attribute_values
450
+ const allAttrValueIds = [
451
+ ...variantAttrValueIds,
452
+ ...productAttrValueIds,
453
+ ];
454
+ if (allAttrValueIds.length) {
455
+ const existing = Array.isArray(product.attribute_values)
456
+ ? product.attribute_values
457
+ : [];
458
+ product.attribute_values = [...existing, ...allAttrValueIds];
459
+ }
460
+ // --- Resolve variant.attribute_values ---
461
+ if (Array.isArray(product.variants)) {
462
+ const hasMapValues = product.variants.some((v) => v?.attribute_values !== undefined &&
463
+ !Array.isArray(v.attribute_values));
464
+ // If variants use map-style attribute_values but no variant_attributes
465
+ // were provided in this call, load existing product variant attributes
466
+ // to build the lookup for resolution.
467
+ if (hasMapValues && valueLookup.size === 0 && product.id) {
468
+ const existingProduct = await this.retrieveProduct(product.id, {
469
+ select: ["id"],
470
+ relations: ["variant_attributes", "variant_attributes.values"],
471
+ }, sharedContext);
472
+ for (const attr of existingProduct.variant_attributes ??
473
+ []) {
474
+ this.addAttrToLookup_(attr, valueLookup);
475
+ }
476
+ }
477
+ for (const variant of product.variants) {
478
+ if (variant?.attribute_values === undefined)
479
+ continue;
480
+ if (Array.isArray(variant.attribute_values))
481
+ continue;
482
+ variant.attribute_values = this.resolveValueMap_(variant.attribute_values, valueLookup);
483
+ }
484
+ }
485
+ }
486
+ }
487
+ /**
488
+ * Resolves map-style `attribute_values` on variants to arrays of
489
+ * `ProductAttributeValue` IDs. Variants with `attribute_values` already
490
+ * an array of IDs (or undefined) are left untouched.
491
+ *
492
+ * Looks up each variant's parent product's `variant_attributes` (and their
493
+ * values) to translate `{ attrKey: "valueName" }` to value IDs.
494
+ */
495
+ async normalizeVariantAttributeValues_(variants, sharedContext) {
496
+ const mapVariants = variants.filter((v) => v.attribute_values !== undefined &&
497
+ !Array.isArray(v.attribute_values) &&
498
+ typeof v.attribute_values === "object");
499
+ if (!mapVariants.length)
500
+ return;
501
+ // Resolve missing product_ids by looking up variants by id
502
+ const variantIdsNeedingProductId = mapVariants
503
+ .filter((v) => !v.product_id && v.id)
504
+ .map((v) => v.id);
505
+ if (variantIdsNeedingProductId.length) {
506
+ const existing = await super.listProductVariants({ id: variantIdsNeedingProductId }, { select: ["id", "product_id"] }, sharedContext);
507
+ const variantToProductId = new Map();
508
+ for (const v of existing) {
509
+ if (v.product_id)
510
+ variantToProductId.set(v.id, v.product_id);
511
+ }
512
+ for (const v of mapVariants) {
513
+ if (!v.product_id && v.id) {
514
+ v.product_id = variantToProductId.get(v.id);
515
+ }
516
+ }
517
+ }
518
+ const productIds = Array.from(new Set(mapVariants.map((v) => v.product_id).filter(Boolean)));
519
+ if (!productIds.length)
520
+ return;
521
+ // Build per-product lookup from variant_attributes + values
522
+ const products = await this.listProducts({ id: productIds }, {
523
+ select: ["id"],
524
+ relations: ["variant_attributes", "variant_attributes.values"],
525
+ }, sharedContext);
526
+ const productLookups = new Map();
527
+ for (const product of products) {
528
+ const lookup = new Map();
529
+ for (const attr of product.variant_attributes ?? []) {
530
+ this.addAttrToLookup_(attr, lookup);
531
+ }
532
+ productLookups.set(product.id, lookup);
533
+ }
534
+ for (const variant of mapVariants) {
535
+ if (!variant.product_id)
536
+ continue;
537
+ const lookup = productLookups.get(variant.product_id);
538
+ if (!lookup)
539
+ continue;
540
+ variant.attribute_values = this.resolveValueMap_(variant.attribute_values, lookup);
541
+ }
542
+ }
543
+ /**
544
+ * Adds an attribute's values to the lookup map (name/handle/id → value name → value id).
545
+ */
546
+ addAttrToLookup_(attr, lookup) {
547
+ const valueMap = new Map();
548
+ for (const v of attr.values ?? []) {
549
+ valueMap.set(v.name, v.id);
550
+ if (v.handle)
551
+ valueMap.set(v.handle, v.id);
552
+ }
553
+ if (attr.handle)
554
+ lookup.set(attr.handle, valueMap);
555
+ if (attr.name)
556
+ lookup.set(attr.name, valueMap);
557
+ lookup.set(attr.id, valueMap);
558
+ }
559
+ /**
560
+ * Resolves `{ attrKey: "valueName" | ["v1", "v2"] }` → array of ProductAttributeValue IDs.
561
+ */
562
+ resolveValueMap_(input, lookup) {
563
+ const resolvedIds = [];
564
+ for (const [key, raw] of Object.entries(input)) {
565
+ const valueMap = lookup.get(key);
566
+ if (!valueMap)
567
+ continue;
568
+ const vals = Array.isArray(raw) ? raw : [raw];
569
+ for (const v of vals) {
570
+ const valueId = valueMap.get(v);
571
+ if (valueId)
572
+ resolvedIds.push(valueId);
573
+ }
574
+ }
575
+ return resolvedIds;
576
+ }
577
+ async retrieveProductAttribute(id, config, sharedContext) {
578
+ const attribute = await super.retrieveProductAttribute(id, config, sharedContext);
579
+ await this.resolveSelectAttributeValues_([attribute], config, sharedContext);
580
+ return attribute;
581
+ }
582
+ async listProductAttributes(filters, config, sharedContext) {
583
+ const attributes = await super.listProductAttributes(filters, config, sharedContext);
584
+ await this.resolveSelectAttributeValues_(attributes, config, sharedContext);
585
+ return attributes;
586
+ }
587
+ async listAndCountProductAttributes(filters, config, sharedContext) {
588
+ const [attributes, count] = await super.listAndCountProductAttributes(filters, config, sharedContext);
589
+ await this.resolveSelectAttributeValues_(attributes, config, sharedContext);
590
+ return [attributes, count];
591
+ }
592
+ /**
593
+ * For attributes with type single_select or multi_select, resolves their
594
+ * values via listProductAttributeValues. Non-select attributes keep values empty.
595
+ * Only runs when the caller requested the "values" relation.
596
+ */
597
+ async resolveSelectAttributeValues_(attributes, config, sharedContext) {
598
+ const requestedRelations = (config?.relations ?? []);
599
+ if (!requestedRelations.includes("values"))
600
+ return;
601
+ if (!attributes.length)
602
+ return;
603
+ const SELECT_TYPES = new Set([
604
+ types_1.AttributeType.SINGLE_SELECT,
605
+ types_1.AttributeType.MULTI_SELECT,
606
+ ]);
607
+ const selectAttrIds = [];
608
+ for (const attr of attributes) {
609
+ if (SELECT_TYPES.has(attr.type)) {
610
+ selectAttrIds.push(attr.id);
611
+ }
612
+ else {
613
+ // Non-select types: clear values
614
+ attr.values = [];
615
+ }
616
+ }
617
+ if (!selectAttrIds.length)
618
+ return;
619
+ // Batch-fetch values for all select-type attributes
620
+ const values = await super.listProductAttributeValues({ attribute_id: selectAttrIds }, { order: { rank: "ASC" } }, sharedContext);
621
+ // Group values by attribute_id
622
+ const valuesByAttrId = new Map();
623
+ for (const val of values) {
624
+ const attrId = val.attribute_id ?? val.attribute?.id;
625
+ if (!attrId)
626
+ continue;
627
+ if (!valuesByAttrId.has(attrId)) {
628
+ valuesByAttrId.set(attrId, []);
629
+ }
630
+ valuesByAttrId.get(attrId).push(val);
631
+ }
632
+ // Map values onto attributes
633
+ for (const attr of attributes) {
634
+ if (SELECT_TYPES.has(attr.type)) {
635
+ attr.values = valuesByAttrId.get(attr.id) ?? [];
636
+ }
637
+ }
638
+ }
639
+ // @ts-ignore
640
+ async createProductAttributes(data, sharedContext) {
641
+ const input = (Array.isArray(data) ? data : [data]).map((attr) => {
642
+ this.validateProductAttributeType_(attr);
643
+ if (!attr.handle && attr.name) {
644
+ attr.handle = (0, utils_1.toHandle)(attr.name);
645
+ }
646
+ return attr;
647
+ });
648
+ const result = await super.createProductAttributes(input, sharedContext);
649
+ // When product_id is set, link created attributes and their values to the product
650
+ const created = Array.isArray(result) ? result : [result];
651
+ const attrsWithProductId = created.filter((attr) => !!attr.product_id);
652
+ if (attrsWithProductId.length) {
653
+ // Batch-fetch all created attributes with values in a single query
654
+ const attrIdsToFetch = attrsWithProductId.map((a) => a.id);
655
+ const fetchedAttrs = await super.listProductAttributes({ id: attrIdsToFetch }, { relations: ["values"] }, sharedContext);
656
+ const fetchedAttrsById = new Map();
657
+ for (const a of fetchedAttrs) {
658
+ fetchedAttrsById.set(a.id, a);
659
+ }
660
+ // Batch-fetch all referenced products in a single query
661
+ const productIds = [
662
+ ...new Set(attrsWithProductId.map((a) => a.product_id)),
663
+ ];
664
+ const products = await this.listProducts({ id: productIds }, {
665
+ select: ["id"],
666
+ relations: ["attribute_values", "variant_attributes"],
667
+ }, sharedContext);
668
+ const productsById = new Map();
669
+ for (const p of products) {
670
+ productsById.set(p.id, p);
671
+ }
672
+ // Build update payloads per product
673
+ const updatesByProductId = new Map();
674
+ for (const attr of attrsWithProductId) {
675
+ const productId = attr.product_id;
676
+ const fetchedAttr = fetchedAttrsById.get(attr.id);
677
+ const product = productsById.get(productId);
678
+ if (!product)
679
+ continue;
680
+ if (!updatesByProductId.has(productId)) {
681
+ updatesByProductId.set(productId, {
682
+ id: productId,
683
+ attribute_values: [
684
+ ...new Set((product.attribute_values ?? []).map((v) => v.id)),
685
+ ],
686
+ variant_attributes: [
687
+ ...new Set((product.variant_attributes ?? []).map((a) => a.id)),
688
+ ],
689
+ });
690
+ }
691
+ const payload = updatesByProductId.get(productId);
692
+ // Merge attribute value IDs
693
+ const valueIds = (fetchedAttr?.values ?? []).map((v) => v.id);
694
+ for (const vid of valueIds) {
695
+ if (!payload.attribute_values.includes(vid)) {
696
+ payload.attribute_values.push(vid);
697
+ }
698
+ }
699
+ // Merge variant attribute ID
700
+ if (attr.is_variant_axis) {
701
+ if (!payload.variant_attributes.includes(attr.id)) {
702
+ payload.variant_attributes.push(attr.id);
703
+ }
704
+ }
705
+ }
706
+ // Apply all product updates
707
+ await (0, utils_1.promiseAll)(Array.from(updatesByProductId.values()).map((payload) => super.updateProducts(payload, sharedContext)));
708
+ }
709
+ return (Array.isArray(data) ? result : result[0]);
710
+ }
711
+ /**
712
+ * Adds existing global attributes to a product by linking them via the
713
+ * variant_attributes M2M and their values via the attribute_values M2M.
714
+ */
715
+ async addAttributesToProduct(productId, items, sharedContext) {
716
+ if (!items.length)
717
+ return;
718
+ const product = await this.retrieveProduct(productId, {
719
+ select: ["id"],
720
+ relations: ["variant_attributes", "attribute_values"],
721
+ }, sharedContext);
722
+ const existingVariantAttrIds = new Set((product.variant_attributes ?? []).map((a) => a.id));
723
+ const existingValueIds = new Set((product.attribute_values ?? []).map((v) => v.id));
724
+ // Batch-fetch all referenced attributes with their values in a single query
725
+ const attrIdsToFetch = items.map((item) => item.attribute_id);
726
+ const fetchedAttrs = await super.listProductAttributes({ id: attrIdsToFetch }, { relations: ["values"] }, sharedContext);
727
+ const fetchedAttrsById = new Map();
728
+ for (const a of fetchedAttrs) {
729
+ fetchedAttrsById.set(a.id, a);
730
+ }
731
+ const newAttrIds = new Set();
732
+ const newValueIds = new Set();
733
+ for (const item of items) {
734
+ const attr = fetchedAttrsById.get(item.attribute_id);
735
+ if (!attr) {
736
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Product attribute with id '${item.attribute_id}' was not found`);
737
+ }
738
+ if (attr.product_id) {
739
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Attribute '${item.attribute_id}' is product-scoped and cannot be linked to another product`);
740
+ }
741
+ newAttrIds.add(attr.id);
742
+ // Determine which value IDs to link
743
+ const attrValues = (attr.values ?? []);
744
+ if (item.attribute_value_ids?.length) {
745
+ // Select types — reference existing value IDs
746
+ const validIds = new Set(attrValues.map((v) => v.id));
747
+ for (const vid of item.attribute_value_ids) {
748
+ if (!validIds.has(vid)) {
749
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Attribute value '${vid}' not found on attribute '${attr.name}'`);
750
+ }
751
+ newValueIds.add(vid);
752
+ }
753
+ }
754
+ else if (item.values?.length) {
755
+ // Text/unit/toggle types — find-or-create values by name
756
+ const existingByName = new Map();
757
+ for (const v of attrValues) {
758
+ existingByName.set(v.name, v.id);
759
+ }
760
+ const toCreate = [];
761
+ for (const name of item.values) {
762
+ const existingId = existingByName.get(name);
763
+ if (existingId) {
764
+ newValueIds.add(existingId);
765
+ }
766
+ else {
767
+ toCreate.push(name);
768
+ }
769
+ }
770
+ if (toCreate.length) {
771
+ const created = await this.createProductAttributeValues(toCreate.map((name, i) => ({
772
+ name,
773
+ handle: (0, utils_1.toHandle)(name),
774
+ rank: attrValues.length + i,
775
+ attribute_id: attr.id,
776
+ })), sharedContext);
777
+ const createdArr = Array.isArray(created) ? created : [created];
778
+ for (const v of createdArr) {
779
+ newValueIds.add(v.id);
780
+ }
781
+ }
782
+ }
783
+ else {
784
+ // No specific values — link all existing values
785
+ for (const v of attrValues) {
786
+ newValueIds.add(v.id);
787
+ }
788
+ }
789
+ }
790
+ const mergedAttrIds = [
791
+ ...new Set([...existingVariantAttrIds, ...newAttrIds]),
792
+ ];
793
+ const mergedValueIds = [
794
+ ...new Set([...existingValueIds, ...newValueIds]),
795
+ ];
796
+ await super.updateProducts({
797
+ id: productId,
798
+ variant_attributes: mergedAttrIds,
799
+ attribute_values: mergedValueIds,
800
+ }, sharedContext);
801
+ }
802
+ /**
803
+ * Removes attributes from a product.
804
+ *
805
+ * - If an attribute is a variant axis and any product variant references its
806
+ * values, the removal is rejected (variants must be deleted first).
807
+ * - If an attribute is global (no product_id), it is unlinked from the
808
+ * product's M2M relations.
809
+ * - If an attribute is product-scoped (product_id matches), it is soft-deleted.
810
+ */
811
+ async removeAttributeFromProduct(productId, attributeIds, sharedContext) {
812
+ const ids = Array.isArray(attributeIds) ? attributeIds : [attributeIds];
813
+ if (!ids.length)
814
+ return;
815
+ const product = await this.retrieveProduct(productId, {
816
+ select: ["id"],
817
+ relations: [
818
+ "variant_attributes",
819
+ "attribute_values",
820
+ "variants",
821
+ "variants.attribute_values",
822
+ ],
823
+ }, sharedContext);
824
+ // Batch-fetch all attributes with their values
825
+ const attributes = await super.listProductAttributes({ id: ids }, { relations: ["values"] }, sharedContext);
826
+ const attributesById = new Map();
827
+ for (const a of attributes) {
828
+ attributesById.set(a.id, a);
829
+ }
830
+ // Collect all value IDs to remove and validate variant axis constraints
831
+ const allAttrValueIds = new Set();
832
+ const attrIdsToRemove = new Set();
833
+ const productScopedToDelete = [];
834
+ const variants = (product.variants ?? []);
835
+ for (const attrId of ids) {
836
+ const attribute = attributesById.get(attrId);
837
+ if (!attribute)
838
+ continue;
839
+ const valueIds = (attribute.values ?? []).map((v) => v.id);
840
+ // If attribute is a variant axis, check for variants using its values
841
+ if (attribute.is_variant_axis) {
842
+ const valueIdSet = new Set(valueIds);
843
+ const hasVariantsWithAttr = variants.some((variant) => (variant.attribute_values ?? []).some((v) => valueIdSet.has(v.id)));
844
+ if (hasVariantsWithAttr) {
845
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, `Cannot remove variant axis attribute '${attribute.name}' because product variants are using it. Delete those variants first.`);
846
+ }
847
+ }
848
+ attrIdsToRemove.add(attrId);
849
+ for (const vid of valueIds) {
850
+ allAttrValueIds.add(vid);
851
+ }
852
+ if (attribute.product_id === productId) {
853
+ productScopedToDelete.push(attrId);
854
+ }
855
+ }
856
+ // Build a single update payload to unlink everything at once
857
+ const updatePayload = { id: productId };
858
+ let needsUpdate = false;
859
+ // Remove attributes from variant_attributes M2M
860
+ const existingVariantAttrIds = (product.variant_attributes ?? []).map((a) => a.id);
861
+ const filteredVariantAttrIds = existingVariantAttrIds.filter((id) => !attrIdsToRemove.has(id));
862
+ if (filteredVariantAttrIds.length !== existingVariantAttrIds.length) {
863
+ updatePayload.variant_attributes = filteredVariantAttrIds;
864
+ needsUpdate = true;
865
+ }
866
+ // Remove attribute values from product's attribute_values M2M
867
+ if (allAttrValueIds.size) {
868
+ const existingValueIds = (product.attribute_values ?? []).map((v) => v.id);
869
+ const filteredValueIds = existingValueIds.filter((id) => !allAttrValueIds.has(id));
870
+ if (filteredValueIds.length !== existingValueIds.length) {
871
+ updatePayload.attribute_values = filteredValueIds;
872
+ needsUpdate = true;
873
+ }
874
+ }
875
+ if (needsUpdate) {
876
+ await super.updateProducts(updatePayload, sharedContext);
877
+ }
878
+ // Soft-delete product-scoped attributes
879
+ if (productScopedToDelete.length) {
880
+ await this.softDeleteProductAttributes(productScopedToDelete, {}, sharedContext);
881
+ }
882
+ }
883
+ async updateProductAttributes(idOrSelectorOrData, dataOrContext, sharedContext) {
884
+ const isSelectorForm = typeof idOrSelectorOrData === "string" ||
885
+ (!Array.isArray(idOrSelectorOrData) &&
886
+ dataOrContext &&
887
+ typeof dataOrContext === "object");
888
+ if (isSelectorForm) {
889
+ const update = dataOrContext;
890
+ this.validateProductAttributeType_(update);
891
+ // @ts-ignore
892
+ return await super.updateProductAttributes(idOrSelectorOrData, update, sharedContext);
893
+ }
894
+ const data = idOrSelectorOrData;
895
+ for (const attr of data) {
896
+ this.validateProductAttributeType_(attr);
897
+ }
898
+ // @ts-ignore
899
+ return await super.updateProductAttributes(data, dataOrContext);
900
+ }
901
+ // @ts-ignore
902
+ async createProductAttributeValues(data, sharedContext) {
903
+ const input = (Array.isArray(data) ? data : [data]).map((val) => {
904
+ if (!val.handle && val.name) {
905
+ val.handle = (0, utils_1.toHandle)(val.name);
906
+ }
907
+ return val;
908
+ });
909
+ const result = await super.createProductAttributeValues(input, sharedContext);
910
+ return (Array.isArray(data) ? result : result[0]);
911
+ }
912
+ async upsertProductAttributeValues(data, sharedContext) {
913
+ const forCreate = data.filter((v) => !("id" in v) || !v.id);
914
+ const forUpdate = data.filter((v) => "id" in v && !!v.id);
915
+ let created = [];
916
+ let updated = [];
917
+ if (forCreate.length) {
918
+ created = await this.createProductAttributeValues(forCreate, sharedContext);
919
+ }
920
+ if (forUpdate.length) {
921
+ updated = await super.updateProductAttributeValues(forUpdate, sharedContext);
922
+ }
923
+ return [...created, ...updated];
924
+ }
925
+ async createProductBrands(data, sharedContext) {
926
+ const input = (Array.isArray(data) ? data : [data]).map((brand) => {
927
+ if (!brand.handle && brand.name) {
928
+ brand.handle = (0, utils_1.toHandle)(brand.name);
929
+ }
930
+ return brand;
931
+ });
932
+ const result = await super.createProductBrands(input, sharedContext);
933
+ return (Array.isArray(data) ? result : result[0]);
934
+ }
935
+ async updateProductBrands(idOrSelectorOrData, dataOrContext, sharedContext) {
936
+ const isSelectorForm = typeof idOrSelectorOrData === "string" ||
937
+ (!Array.isArray(idOrSelectorOrData) &&
938
+ dataOrContext &&
939
+ typeof dataOrContext === "object");
940
+ if (isSelectorForm) {
941
+ const update = dataOrContext;
942
+ if (!update.handle && update.name) {
943
+ update.handle = (0, utils_1.toHandle)(update.name);
944
+ }
945
+ // @ts-ignore
946
+ return await super.updateProductBrands(idOrSelectorOrData, update, sharedContext);
947
+ }
948
+ const data = idOrSelectorOrData;
949
+ const input = data.map((brand) => {
950
+ if (!brand.handle && brand.name) {
951
+ brand.handle = (0, utils_1.toHandle)(brand.name);
952
+ }
953
+ return brand;
954
+ });
955
+ // @ts-ignore
956
+ return await super.updateProductBrands(input, dataOrContext);
957
+ }
958
+ async createProducts(data, sharedContext) {
959
+ const input = Array.isArray(data) ? data : [data];
960
+ await this.normalizeProductInput_(input, sharedContext);
961
+ // Extract pending custom attribute IDs before passing to super
962
+ const pendingCustomAttrs = new Map();
963
+ for (let i = 0; i < input.length; i++) {
964
+ if (input[i].__pending_custom_attribute_ids) {
965
+ pendingCustomAttrs.set(i, input[i].__pending_custom_attribute_ids);
966
+ delete input[i].__pending_custom_attribute_ids;
967
+ }
968
+ }
969
+ const result = await super.createProducts(input, sharedContext);
970
+ const products = (Array.isArray(result) ? result : [result]);
971
+ // Assign product_id to custom attributes now that products have IDs
972
+ for (const [index, attrIds] of pendingCustomAttrs) {
973
+ const productId = products[index].id;
974
+ await this.updateProductAttributes(attrIds.map((id) => ({ id, product_id: productId })), sharedContext);
975
+ }
976
+ return (Array.isArray(data) ? products : products[0]);
977
+ }
978
+ async updateProducts(idOrSelectorOrData, dataOrContext, sharedContext) {
979
+ const isSelectorForm = typeof idOrSelectorOrData === "string" ||
980
+ (!Array.isArray(idOrSelectorOrData) &&
981
+ dataOrContext &&
982
+ typeof dataOrContext === "object");
983
+ if (isSelectorForm) {
984
+ const update = dataOrContext;
985
+ // For selector/id form with attributes, expand to array form
986
+ const hasAttributeInput = update.variant_attributes !== undefined ||
987
+ update.product_attributes !== undefined ||
988
+ (Array.isArray(update.variants) &&
989
+ update.variants.some((v) => v?.attribute_values !== undefined));
990
+ if (hasAttributeInput) {
991
+ const wasIdForm = typeof idOrSelectorOrData === "string";
992
+ let productIds;
993
+ if (wasIdForm) {
994
+ productIds = [idOrSelectorOrData];
995
+ }
996
+ else {
997
+ const products = await this.listProducts(idOrSelectorOrData, { select: ["id"] }, sharedContext);
998
+ productIds = products.map((p) => p.id);
999
+ }
1000
+ if (!productIds.length) {
1001
+ return wasIdForm ? undefined : [];
1002
+ }
1003
+ const batch = productIds.map((id) => ({
1004
+ id,
1005
+ ...update,
1006
+ }));
1007
+ await this.normalizeProductInput_(batch, sharedContext);
1008
+ // @ts-ignore
1009
+ const results = await super.updateProducts(batch, sharedContext);
1010
+ const arr = Array.isArray(results) ? results : [results];
1011
+ return (wasIdForm ? arr[0] : arr);
1012
+ }
1013
+ // Simple path: normalize in place
1014
+ await this.normalizeProductInput_([update], sharedContext);
1015
+ // @ts-ignore
1016
+ return await super.updateProducts(idOrSelectorOrData, update, sharedContext);
1017
+ }
1018
+ const input = idOrSelectorOrData;
1019
+ await this.normalizeProductInput_(input, sharedContext);
1020
+ // @ts-ignore
1021
+ return await super.updateProducts(input, dataOrContext);
1022
+ }
1023
+ async createProductVariants(data, sharedContext) {
1024
+ const input = Array.isArray(data) ? data : [data];
1025
+ await this.normalizeVariantAttributeValues_(input, sharedContext);
1026
+ // @ts-ignore
1027
+ const result = await super.createProductVariants(input, sharedContext);
1028
+ const variants = (Array.isArray(result) ? result : [result]);
1029
+ return Array.isArray(data) ? variants : variants[0];
1030
+ }
1031
+ async upsertProductVariants(data, sharedContext) {
1032
+ const input = Array.isArray(data) ? data : [data];
1033
+ const forUpdate = input.filter((v) => !!v.id);
1034
+ const forCreate = input.filter((v) => !v.id);
1035
+ let created = [];
1036
+ let updated = [];
1037
+ if (forCreate.length) {
1038
+ const result = await this.createProductVariants(forCreate, sharedContext);
1039
+ created = (Array.isArray(result) ? result : [result]);
1040
+ }
1041
+ if (forUpdate.length) {
1042
+ const result = await this.updateProductVariants(forUpdate, sharedContext);
1043
+ updated = (Array.isArray(result) ? result : [result]);
1044
+ }
1045
+ const all = [...created, ...updated];
1046
+ return Array.isArray(data) ? all : all[0];
1047
+ }
1048
+ async updateProductVariants(idOrSelectorOrData, dataOrContext, sharedContext) {
1049
+ const isSelectorForm = typeof idOrSelectorOrData === "string" ||
1050
+ (!Array.isArray(idOrSelectorOrData) &&
1051
+ dataOrContext &&
1052
+ typeof dataOrContext === "object");
1053
+ if (isSelectorForm) {
1054
+ const update = dataOrContext;
1055
+ // Map-style attribute_values must resolve per variant (each may have a
1056
+ // different parent product), so expand selector/id form to array form.
1057
+ const hasMapAttrValues = update?.attribute_values !== undefined &&
1058
+ !Array.isArray(update.attribute_values) &&
1059
+ typeof update.attribute_values === "object";
1060
+ if (hasMapAttrValues) {
1061
+ const wasIdForm = typeof idOrSelectorOrData === "string";
1062
+ let variantIds;
1063
+ if (wasIdForm) {
1064
+ variantIds = [idOrSelectorOrData];
1065
+ }
1066
+ else {
1067
+ const variants = await super.listProductVariants(idOrSelectorOrData, { select: ["id"] }, sharedContext);
1068
+ variantIds = variants.map((v) => v.id);
1069
+ }
1070
+ if (!variantIds.length) {
1071
+ return wasIdForm ? undefined : [];
1072
+ }
1073
+ const batch = variantIds.map((id) => ({
1074
+ id,
1075
+ ...update,
1076
+ }));
1077
+ await this.normalizeVariantAttributeValues_(batch, sharedContext);
1078
+ // @ts-ignore
1079
+ const results = await super.updateProductVariants(batch, sharedContext);
1080
+ const arr = Array.isArray(results) ? results : [results];
1081
+ return (wasIdForm ? arr[0] : arr);
1082
+ }
1083
+ // @ts-ignore
1084
+ return await super.updateProductVariants(idOrSelectorOrData, update, sharedContext);
1085
+ }
1086
+ const data = idOrSelectorOrData;
1087
+ await this.normalizeVariantAttributeValues_(data, sharedContext);
1088
+ // @ts-ignore
1089
+ return await super.updateProductVariants(data, dataOrContext);
1090
+ }
1091
+ async createProductCategories(data, sharedContext) {
1092
+ const input = (Array.isArray(data) ? data : [data]).map((category) => {
1093
+ category.handle ??= (0, utils_1.kebabCase)(category.name);
1094
+ return category;
1095
+ });
1096
+ const categories = await this.productCategoryService_.create(input, sharedContext);
1097
+ return Array.isArray(data) ? categories : categories[0];
1098
+ }
1099
+ async updateProductCategories(data, sharedContext) {
1100
+ let normalizedInput;
1101
+ if (typeof data === "object" && !Array.isArray(data) && data.id) {
1102
+ normalizedInput = [data];
1103
+ }
1104
+ else if (Array.isArray(data)) {
1105
+ normalizedInput = data;
1106
+ }
1107
+ else {
1108
+ normalizedInput = [data];
1109
+ }
1110
+ const categories = await this.productCategoryService_.update(normalizedInput, sharedContext);
1111
+ return Array.isArray(data) ? categories : categories[0];
1112
+ }
1113
+ async retrieveProductCategory(id, config, sharedContext) {
1114
+ return await this.productCategoryService_.retrieve(id, config, sharedContext);
1115
+ }
1116
+ async listProductCategories(filters, config, sharedContext) {
1117
+ return await this.productCategoryService_.list(filters, config, sharedContext);
1118
+ }
1119
+ async listAndCountProductCategories(filters, config, sharedContext) {
1120
+ return await this.productCategoryService_.listAndCount(filters, config, sharedContext);
1121
+ }
1122
+ async deleteProductCategories(ids, sharedContext) {
1123
+ const idsArray = Array.isArray(ids) ? ids : [ids];
1124
+ return await this.productCategoryService_.delete(idsArray, sharedContext);
1125
+ }
1126
+ async softDeleteProductCategories(ids, sharedContext) {
1127
+ const idsArray = Array.isArray(ids) ? ids : [ids];
1128
+ return await this.productCategoryService_.softDelete(idsArray, sharedContext);
1129
+ }
1130
+ async restoreProductCategories(ids, sharedContext) {
1131
+ const idsArray = Array.isArray(ids) ? ids : [ids];
1132
+ return await this.productCategoryService_.restore(idsArray, sharedContext);
1133
+ }
1134
+ // --- ProductChange lifecycle methods ---
1135
+ /**
1136
+ * Confirms one or more pending product changes and applies their actions
1137
+ * to the underlying products. Mirrors Medusa's `confirmOrderChange`:
1138
+ * validation + status update + action application happen atomically.
1139
+ *
1140
+ * `internal_note` is operator-only context. `external_note` is the
1141
+ * vendor-visible message (e.g. rejection / changes-required reason)
1142
+ * that is also forwarded to notification subscribers.
1143
+ */
1144
+ async confirmProductChange(data, sharedContext) {
1145
+ const items = Array.isArray(data) ? data : [data];
1146
+ const ids = items.map((i) => i.id);
1147
+ const changes = await this.listProductChanges({ id: ids }, {
1148
+ select: ["id", "status", "actions"],
1149
+ relations: ["actions"],
1150
+ order: { actions: { ordering: "ASC" } },
1151
+ }, sharedContext);
1152
+ if (changes.length !== ids.length) {
1153
+ const found = new Set(changes.map((c) => c.id));
1154
+ const missing = ids.filter((id) => !found.has(id));
1155
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Product change(s) not found: ${missing.join(", ")}`);
1156
+ }
1157
+ for (const change of changes) {
1158
+ if (change.status !== types_1.ProductChangeStatus.PENDING) {
1159
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, `Cannot confirm product change '${change.id}' with status '${change.status}'. Only pending changes can be confirmed.`);
1160
+ }
1161
+ }
1162
+ await this.updateProductChanges(items.map((item) => {
1163
+ const update = {
1164
+ id: item.id,
1165
+ status: types_1.ProductChangeStatus.CONFIRMED,
1166
+ confirmed_by: item.confirmed_by,
1167
+ confirmed_at: new Date(),
1168
+ };
1169
+ if (item.internal_note !== undefined) {
1170
+ update.internal_note = item.internal_note;
1171
+ }
1172
+ if (item.external_note !== undefined) {
1173
+ update.external_note = item.external_note;
1174
+ }
1175
+ return update;
1176
+ }), sharedContext);
1177
+ const allActions = changes.flatMap((c) => c.actions ?? []);
1178
+ await this.applyProductChangeActions_(allActions, sharedContext);
1179
+ }
1180
+ /**
1181
+ * Applies pending change actions to their products. Public entrypoint
1182
+ * for callers that want to apply without confirming (e.g. previewing
1183
+ * effects). Internally delegates to the same routine `confirmProductChange`
1184
+ * uses.
1185
+ */
1186
+ async applyProductChangeActions(actions, sharedContext) {
1187
+ await this.applyProductChangeActions_(actions, sharedContext);
1188
+ }
1189
+ async applyProductChangeActions_(actions, sharedContext) {
1190
+ const pending = (actions ?? []).filter((a) => !a.applied);
1191
+ if (!pending.length)
1192
+ return;
1193
+ // Bucket actions per type so each kind dispatches in one DB round.
1194
+ const productUpdatesByProductId = new Map();
1195
+ const variantsToCreate = [];
1196
+ const variantUpdates = [];
1197
+ const variantsToDelete = [];
1198
+ const attributeAddsByProductId = new Map();
1199
+ const attributeRemovesByProductId = new Map();
1200
+ const productsToDelete = new Set();
1201
+ for (const action of pending) {
1202
+ const details = (action.details ?? {});
1203
+ switch (action.action) {
1204
+ case types_1.ProductChangeActionType.STATUS_CHANGE: {
1205
+ const status = details.status;
1206
+ if (status === undefined)
1207
+ break;
1208
+ const update = productUpdatesByProductId.get(action.product_id) ??
1209
+ { id: action.product_id };
1210
+ update.status = status;
1211
+ productUpdatesByProductId.set(action.product_id, update);
1212
+ break;
1213
+ }
1214
+ case types_1.ProductChangeActionType.UPDATE: {
1215
+ const { field, value } = details;
1216
+ if (!field)
1217
+ break;
1218
+ const update = productUpdatesByProductId.get(action.product_id) ??
1219
+ { id: action.product_id };
1220
+ update[field] = value;
1221
+ productUpdatesByProductId.set(action.product_id, update);
1222
+ break;
1223
+ }
1224
+ case types_1.ProductChangeActionType.VARIANT_ADD: {
1225
+ const variant = details
1226
+ .variant;
1227
+ if (!variant)
1228
+ break;
1229
+ variantsToCreate.push({
1230
+ ...variant,
1231
+ product_id: action.product_id,
1232
+ });
1233
+ break;
1234
+ }
1235
+ case types_1.ProductChangeActionType.VARIANT_UPDATE: {
1236
+ const { variant_id, fields } = details;
1237
+ if (!variant_id || !fields || !Object.keys(fields).length)
1238
+ break;
1239
+ variantUpdates.push({
1240
+ id: variant_id,
1241
+ ...fields,
1242
+ });
1243
+ break;
1244
+ }
1245
+ case types_1.ProductChangeActionType.VARIANT_REMOVE: {
1246
+ const { variant_id } = details;
1247
+ if (variant_id)
1248
+ variantsToDelete.push(variant_id);
1249
+ break;
1250
+ }
1251
+ case types_1.ProductChangeActionType.ATTRIBUTE_ADD: {
1252
+ const { attribute_id, attribute_value_ids, values } = details;
1253
+ if (!attribute_id)
1254
+ break;
1255
+ const list = attributeAddsByProductId.get(action.product_id) ?? [];
1256
+ list.push({ attribute_id, attribute_value_ids, values });
1257
+ attributeAddsByProductId.set(action.product_id, list);
1258
+ break;
1259
+ }
1260
+ case types_1.ProductChangeActionType.ATTRIBUTE_REMOVE: {
1261
+ const { attribute_id } = details;
1262
+ if (!attribute_id)
1263
+ break;
1264
+ const list = attributeRemovesByProductId.get(action.product_id) ?? [];
1265
+ list.push(attribute_id);
1266
+ attributeRemovesByProductId.set(action.product_id, list);
1267
+ break;
1268
+ }
1269
+ case types_1.ProductChangeActionType.PRODUCT_DELETE: {
1270
+ productsToDelete.add(action.product_id);
1271
+ break;
1272
+ }
1273
+ }
1274
+ }
1275
+ // Top-level Product field + status updates — one call per product.
1276
+ const productUpdates = Array.from(productUpdatesByProductId.values()).filter((u) => Object.keys(u).length > 1);
1277
+ if (productUpdates.length) {
1278
+ await this.updateProducts(productUpdates, sharedContext);
1279
+ }
1280
+ // Variant deletes first — frees up SKU/title uniqueness for adds in the
1281
+ // same change. Updates last so they see a stable variant set.
1282
+ if (variantsToDelete.length) {
1283
+ await this.deleteProductVariants(variantsToDelete, sharedContext);
1284
+ }
1285
+ if (variantsToCreate.length) {
1286
+ await this.createProductVariants(variantsToCreate, sharedContext);
1287
+ }
1288
+ if (variantUpdates.length) {
1289
+ await this.updateProductVariants(variantUpdates, sharedContext);
1290
+ }
1291
+ // Attribute removes before adds so the same attribute can be re-linked
1292
+ // with a different value set in a single change.
1293
+ for (const [productId, attrIds] of attributeRemovesByProductId) {
1294
+ await this.removeAttributeFromProduct(productId, attrIds, sharedContext);
1295
+ }
1296
+ for (const [productId, items] of attributeAddsByProductId) {
1297
+ await this.addAttributesToProduct(productId, items, sharedContext);
1298
+ }
1299
+ // Product deletes happen last — any audit-trail updates above still
1300
+ // write through before the product is gone. Soft-delete preserves the
1301
+ // ProductChange record (it stays linked to the now-deleted product so
1302
+ // the change history remains queryable).
1303
+ if (productsToDelete.size) {
1304
+ await this.softDeleteProducts(Array.from(productsToDelete), {}, sharedContext);
1305
+ }
1306
+ await this.updateProductChangeActions(pending.map((a) => ({ id: a.id, applied: true })), sharedContext);
1307
+ }
1308
+ async declineProductChange(id, data, sharedContext) {
1309
+ const change = await this.retrieveProductChange(id, {}, sharedContext);
1310
+ if (change.status !== types_1.ProductChangeStatus.PENDING) {
1311
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, `Cannot decline product change with status '${change.status}'. Only pending changes can be declined.`);
1312
+ }
1313
+ await this.updateProductChanges({
1314
+ id,
1315
+ status: types_1.ProductChangeStatus.DECLINED,
1316
+ declined_by: data.declined_by,
1317
+ declined_at: new Date(),
1318
+ declined_reason: data.declined_reason,
1319
+ }, sharedContext);
1320
+ }
1321
+ async cancelProductChange(id, data, sharedContext) {
1322
+ const change = await this.retrieveProductChange(id, {}, sharedContext);
1323
+ if (change.status !== types_1.ProductChangeStatus.PENDING) {
1324
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, `Cannot cancel product change with status '${change.status}'. Only pending changes can be canceled.`);
1325
+ }
1326
+ const update = {
1327
+ id,
1328
+ status: types_1.ProductChangeStatus.CANCELED,
1329
+ canceled_by: data.canceled_by,
1330
+ canceled_at: new Date(),
1331
+ };
1332
+ if (data.internal_note !== undefined) {
1333
+ update.internal_note = data.internal_note;
1334
+ }
1335
+ await this.updateProductChanges(update, sharedContext);
1336
+ }
1337
+ async addProductAction(data, sharedContext) {
1338
+ const items = Array.isArray(data) ? data : [data];
1339
+ for (const item of items) {
1340
+ if (item.applied)
1341
+ continue;
1342
+ const change = await this.retrieveProductChange(item.product_change_id, {}, sharedContext);
1343
+ if (change.status !== types_1.ProductChangeStatus.PENDING) {
1344
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, `Cannot add action to product change with status '${change.status}'. Only pending changes accept actions.`);
1345
+ }
1346
+ }
1347
+ const result = await this.createProductChangeActions(items.map((item) => ({
1348
+ product_change_id: item.product_change_id,
1349
+ product_id: item.product_id,
1350
+ action: item.action,
1351
+ details: item.details ?? {},
1352
+ internal_note: item.internal_note,
1353
+ applied: item.applied,
1354
+ })), sharedContext);
1355
+ return (Array.isArray(data) ? result : result[0]);
1356
+ }
1357
+ }
1358
+ __decorate([
1359
+ (0, utils_1.InjectTransactionManager)()
1360
+ // @ts-ignore
1361
+ ,
1362
+ __metadata("design:type", Function),
1363
+ __metadata("design:paramtypes", [typeof (_a = typeof TInput !== "undefined" && TInput) === "function" ? _a : Object, Object]),
1364
+ __metadata("design:returntype", Promise)
1365
+ ], ProductModuleService.prototype, "createProductAttributes", null);
1366
+ __decorate([
1367
+ (0, utils_1.InjectTransactionManager)(),
1368
+ __metadata("design:type", Function),
1369
+ __metadata("design:paramtypes", [String, Array, Object]),
1370
+ __metadata("design:returntype", Promise)
1371
+ ], ProductModuleService.prototype, "addAttributesToProduct", null);
1372
+ __decorate([
1373
+ (0, utils_1.InjectTransactionManager)(),
1374
+ __metadata("design:type", Function),
1375
+ __metadata("design:paramtypes", [String, Object, Object]),
1376
+ __metadata("design:returntype", Promise)
1377
+ ], ProductModuleService.prototype, "removeAttributeFromProduct", null);
1378
+ __decorate([
1379
+ (0, utils_1.InjectTransactionManager)(),
1380
+ __metadata("design:type", Function),
1381
+ __metadata("design:paramtypes", [Object, Object, Object]),
1382
+ __metadata("design:returntype", Promise)
1383
+ ], ProductModuleService.prototype, "updateProductAttributes", null);
1384
+ __decorate([
1385
+ (0, utils_1.InjectTransactionManager)()
1386
+ // @ts-ignore
1387
+ ,
1388
+ __metadata("design:type", Function),
1389
+ __metadata("design:paramtypes", [typeof (_b = typeof TInput !== "undefined" && TInput) === "function" ? _b : Object, Object]),
1390
+ __metadata("design:returntype", Promise)
1391
+ ], ProductModuleService.prototype, "createProductAttributeValues", null);
1392
+ __decorate([
1393
+ (0, utils_1.InjectTransactionManager)(),
1394
+ __metadata("design:type", Function),
1395
+ __metadata("design:paramtypes", [Array, Object]),
1396
+ __metadata("design:returntype", Promise)
1397
+ ], ProductModuleService.prototype, "upsertProductAttributeValues", null);
1398
+ __decorate([
1399
+ (0, utils_1.InjectTransactionManager)(),
1400
+ __metadata("design:type", Function),
1401
+ __metadata("design:paramtypes", [Object, Object]),
1402
+ __metadata("design:returntype", Promise)
1403
+ ], ProductModuleService.prototype, "createProductBrands", null);
1404
+ __decorate([
1405
+ (0, utils_1.InjectTransactionManager)(),
1406
+ __metadata("design:type", Function),
1407
+ __metadata("design:paramtypes", [Object, Object, Object]),
1408
+ __metadata("design:returntype", Promise)
1409
+ ], ProductModuleService.prototype, "updateProductBrands", null);
1410
+ __decorate([
1411
+ (0, utils_1.InjectTransactionManager)(),
1412
+ __metadata("design:type", Function),
1413
+ __metadata("design:paramtypes", [Object, Object]),
1414
+ __metadata("design:returntype", Promise)
1415
+ ], ProductModuleService.prototype, "createProducts", null);
1416
+ __decorate([
1417
+ (0, utils_1.InjectTransactionManager)(),
1418
+ __metadata("design:type", Function),
1419
+ __metadata("design:paramtypes", [Object, Object, Object]),
1420
+ __metadata("design:returntype", Promise)
1421
+ ], ProductModuleService.prototype, "updateProducts", null);
1422
+ __decorate([
1423
+ (0, utils_1.InjectTransactionManager)(),
1424
+ __metadata("design:type", Function),
1425
+ __metadata("design:paramtypes", [Object, Object]),
1426
+ __metadata("design:returntype", Promise)
1427
+ ], ProductModuleService.prototype, "createProductVariants", null);
1428
+ __decorate([
1429
+ (0, utils_1.InjectTransactionManager)(),
1430
+ __metadata("design:type", Function),
1431
+ __metadata("design:paramtypes", [Object, Object]),
1432
+ __metadata("design:returntype", Promise)
1433
+ ], ProductModuleService.prototype, "upsertProductVariants", null);
1434
+ __decorate([
1435
+ (0, utils_1.InjectTransactionManager)(),
1436
+ __metadata("design:type", Function),
1437
+ __metadata("design:paramtypes", [Object, Object, Object]),
1438
+ __metadata("design:returntype", Promise)
1439
+ ], ProductModuleService.prototype, "updateProductVariants", null);
1440
+ __decorate([
1441
+ (0, utils_1.InjectTransactionManager)(),
1442
+ __metadata("design:type", Function),
1443
+ __metadata("design:paramtypes", [Object, Object]),
1444
+ __metadata("design:returntype", Promise)
1445
+ ], ProductModuleService.prototype, "confirmProductChange", null);
1446
+ __decorate([
1447
+ (0, utils_1.InjectTransactionManager)(),
1448
+ __metadata("design:type", Function),
1449
+ __metadata("design:paramtypes", [Array, Object]),
1450
+ __metadata("design:returntype", Promise)
1451
+ ], ProductModuleService.prototype, "applyProductChangeActions", null);
1452
+ __decorate([
1453
+ (0, utils_1.InjectTransactionManager)(),
1454
+ __metadata("design:type", Function),
1455
+ __metadata("design:paramtypes", [String, Object, Object]),
1456
+ __metadata("design:returntype", Promise)
1457
+ ], ProductModuleService.prototype, "declineProductChange", null);
1458
+ __decorate([
1459
+ (0, utils_1.InjectTransactionManager)(),
1460
+ __metadata("design:type", Function),
1461
+ __metadata("design:paramtypes", [String, Object, Object]),
1462
+ __metadata("design:returntype", Promise)
1463
+ ], ProductModuleService.prototype, "cancelProductChange", null);
1464
+ __decorate([
1465
+ (0, utils_1.InjectTransactionManager)(),
1466
+ __metadata("design:type", Function),
1467
+ __metadata("design:paramtypes", [Object, Object]),
1468
+ __metadata("design:returntype", Promise)
1469
+ ], ProductModuleService.prototype, "addProductAction", null);
1470
+ exports.default = ProductModuleService;
1471
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3Byb2R1Y3Qvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFLQSxxREFVbUM7QUFDbkMsMkNBQThlO0FBRTllLHFDQWNrQjtBQXFDbEIsTUFBTSx3QkFBd0IsR0FBRyxJQUFBLHFCQUFhLEVBQUM7SUFDN0MsT0FBTyxFQUFQLGdCQUFPO0lBQ1AsZ0JBQWdCLEVBQWhCLHlCQUFnQjtJQUNoQixxQkFBcUIsRUFBckIsOEJBQXFCO0lBQ3JCLFlBQVksRUFBWixxQkFBWTtJQUNaLGVBQWUsRUFBZix3QkFBZTtJQUNmLGFBQWEsRUFBYixzQkFBYTtJQUNiLG1CQUFtQixFQUFuQiw0QkFBbUI7SUFDbkIsaUJBQWlCLEVBQWpCLDBCQUFpQjtJQUNqQixZQUFZLEVBQVoscUJBQVk7SUFDWixVQUFVLEVBQVYsbUJBQVU7SUFDVixXQUFXLEVBQVgsb0JBQVc7SUFDWCxjQUFjLEVBQWQsdUJBQWM7SUFDZCwwQkFBMEIsRUFBMUIsbUNBQTBCO0NBQzNCLENBQTJDLENBQUM7QUFFN0MsTUFBTSxvQkFBcUIsU0FBUSx3QkFBd0I7SUFHekQsWUFBWSxTQUErQjtRQUN6QyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDO0lBQ2xFLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFBLDBCQUFrQixFQUFDLGVBQU8sQ0FBQyxPQUFPLEVBQUU7WUFDekMsTUFBTSxFQUFFO2dCQUNOLGdCQUFPO2dCQUNQLHlCQUFnQjtnQkFDaEIsOEJBQXFCO2dCQUNyQixxQkFBWTtnQkFDWix3QkFBZTtnQkFDZixzQkFBYTtnQkFDYiw0QkFBbUI7Z0JBQ25CLDBCQUFpQjtnQkFDakIscUJBQVk7Z0JBQ1osbUJBQVU7Z0JBQ1Ysb0JBQVc7Z0JBQ1gs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