@shopify/hydrogen-react 2026.1.0 → 2026.1.2

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 (287) hide show
  1. package/LICENSE.md +7 -0
  2. package/dist/browser-dev/AddToCartButton.mjs.map +1 -1
  3. package/dist/browser-dev/BuyNowButton.mjs.map +1 -1
  4. package/dist/browser-dev/CartCost.mjs.map +1 -1
  5. package/dist/browser-dev/CartLineProvider.mjs +1 -1
  6. package/dist/browser-dev/CartProvider.mjs +1 -1
  7. package/dist/browser-dev/ProductPrice.mjs.map +1 -1
  8. package/dist/browser-dev/ProductProvider.mjs +1 -1
  9. package/dist/browser-dev/ShopifyProvider.mjs +1 -1
  10. package/dist/browser-dev/ShopifyProvider.mjs.map +1 -1
  11. package/dist/browser-dev/analytics-schema-custom-storefront-customer-tracking.mjs +1 -1
  12. package/dist/{node-dev/packages/hydrogen-react → browser-dev}/package.json.mjs +1 -1
  13. package/dist/browser-dev/useCartAPIStateMachine.mjs +9 -9
  14. package/dist/browser-dev/useCartAPIStateMachine.mjs.map +1 -1
  15. package/dist/browser-dev/useMachine.mjs +68 -0
  16. package/dist/browser-dev/useMachine.mjs.map +1 -0
  17. package/dist/browser-prod/AddToCartButton.mjs.map +1 -1
  18. package/dist/browser-prod/BuyNowButton.mjs.map +1 -1
  19. package/dist/browser-prod/CartCost.mjs.map +1 -1
  20. package/dist/browser-prod/CartLineProvider.mjs +1 -1
  21. package/dist/browser-prod/CartProvider.mjs +1 -1
  22. package/dist/browser-prod/ProductPrice.mjs.map +1 -1
  23. package/dist/browser-prod/ProductProvider.mjs +1 -1
  24. package/dist/browser-prod/ShopifyProvider.mjs +1 -1
  25. package/dist/browser-prod/ShopifyProvider.mjs.map +1 -1
  26. package/dist/browser-prod/analytics-schema-custom-storefront-customer-tracking.mjs +1 -1
  27. package/dist/browser-prod/{packages/hydrogen-react/package.json.mjs → package.json.mjs} +1 -1
  28. package/dist/browser-prod/useCartAPIStateMachine.mjs +9 -9
  29. package/dist/browser-prod/useCartAPIStateMachine.mjs.map +1 -1
  30. package/dist/browser-prod/useMachine.mjs +68 -0
  31. package/dist/browser-prod/useMachine.mjs.map +1 -0
  32. package/dist/node-dev/AddToCartButton.js.map +1 -1
  33. package/dist/node-dev/AddToCartButton.mjs.map +1 -1
  34. package/dist/node-dev/BuyNowButton.js.map +1 -1
  35. package/dist/node-dev/BuyNowButton.mjs.map +1 -1
  36. package/dist/node-dev/CartCost.js.map +1 -1
  37. package/dist/node-dev/CartCost.mjs.map +1 -1
  38. package/dist/node-dev/CartLineProvider.mjs +1 -1
  39. package/dist/node-dev/CartProvider.mjs +1 -1
  40. package/dist/node-dev/ProductPrice.js.map +1 -1
  41. package/dist/node-dev/ProductPrice.mjs.map +1 -1
  42. package/dist/node-dev/ProductProvider.mjs +1 -1
  43. package/dist/node-dev/ShopifyProvider.js.map +1 -1
  44. package/dist/node-dev/ShopifyProvider.mjs +1 -1
  45. package/dist/node-dev/ShopifyProvider.mjs.map +1 -1
  46. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.js +1 -1
  47. package/dist/node-dev/analytics-schema-custom-storefront-customer-tracking.mjs +1 -1
  48. package/dist/{node-prod/packages/hydrogen-react → node-dev}/package.json.js +1 -1
  49. package/dist/{node-prod/packages/hydrogen-react → node-dev}/package.json.mjs +1 -1
  50. package/dist/node-dev/useCartAPIStateMachine.js +10 -10
  51. package/dist/node-dev/useCartAPIStateMachine.js.map +1 -1
  52. package/dist/node-dev/useCartAPIStateMachine.mjs +9 -9
  53. package/dist/node-dev/useCartAPIStateMachine.mjs.map +1 -1
  54. package/dist/node-dev/useMachine.js +68 -0
  55. package/dist/node-dev/useMachine.js.map +1 -0
  56. package/dist/node-dev/useMachine.mjs +68 -0
  57. package/dist/node-dev/useMachine.mjs.map +1 -0
  58. package/dist/node-prod/AddToCartButton.js.map +1 -1
  59. package/dist/node-prod/AddToCartButton.mjs.map +1 -1
  60. package/dist/node-prod/BuyNowButton.js.map +1 -1
  61. package/dist/node-prod/BuyNowButton.mjs.map +1 -1
  62. package/dist/node-prod/CartCost.js.map +1 -1
  63. package/dist/node-prod/CartCost.mjs.map +1 -1
  64. package/dist/node-prod/CartLineProvider.mjs +1 -1
  65. package/dist/node-prod/CartProvider.mjs +1 -1
  66. package/dist/node-prod/ProductPrice.js.map +1 -1
  67. package/dist/node-prod/ProductPrice.mjs.map +1 -1
  68. package/dist/node-prod/ProductProvider.mjs +1 -1
  69. package/dist/node-prod/ShopifyProvider.js.map +1 -1
  70. package/dist/node-prod/ShopifyProvider.mjs +1 -1
  71. package/dist/node-prod/ShopifyProvider.mjs.map +1 -1
  72. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.js +1 -1
  73. package/dist/node-prod/analytics-schema-custom-storefront-customer-tracking.mjs +1 -1
  74. package/dist/{node-dev/packages/hydrogen-react → node-prod}/package.json.js +1 -1
  75. package/dist/{browser-dev/packages/hydrogen-react → node-prod}/package.json.mjs +1 -1
  76. package/dist/node-prod/useCartAPIStateMachine.js +10 -10
  77. package/dist/node-prod/useCartAPIStateMachine.js.map +1 -1
  78. package/dist/node-prod/useCartAPIStateMachine.mjs +9 -9
  79. package/dist/node-prod/useCartAPIStateMachine.mjs.map +1 -1
  80. package/dist/node-prod/useMachine.js +68 -0
  81. package/dist/node-prod/useMachine.js.map +1 -0
  82. package/dist/node-prod/useMachine.mjs +68 -0
  83. package/dist/node-prod/useMachine.mjs.map +1 -0
  84. package/dist/types/useMachine.d.ts +11 -0
  85. package/dist/umd/hydrogen-react.dev.js +56 -251
  86. package/dist/umd/hydrogen-react.dev.js.map +1 -1
  87. package/dist/umd/hydrogen-react.prod.js +16 -32
  88. package/dist/umd/hydrogen-react.prod.js.map +1 -1
  89. package/package.json +38 -44
  90. package/dist/browser-dev/_virtual/index.mjs +0 -5
  91. package/dist/browser-dev/_virtual/index.mjs.map +0 -1
  92. package/dist/browser-dev/_virtual/use-sync-external-store-shim.development.mjs +0 -5
  93. package/dist/browser-dev/_virtual/use-sync-external-store-shim.development.mjs.map +0 -1
  94. package/dist/browser-dev/_virtual/use-sync-external-store-shim.production.mjs +0 -5
  95. package/dist/browser-dev/_virtual/use-sync-external-store-shim.production.mjs.map +0 -1
  96. package/dist/browser-dev/_virtual/with-selector.development.mjs +0 -5
  97. package/dist/browser-dev/_virtual/with-selector.development.mjs.map +0 -1
  98. package/dist/browser-dev/_virtual/with-selector.mjs +0 -6
  99. package/dist/browser-dev/_virtual/with-selector.mjs.map +0 -1
  100. package/dist/browser-dev/_virtual/with-selector.production.mjs +0 -5
  101. package/dist/browser-dev/_virtual/with-selector.production.mjs.map +0 -1
  102. package/dist/browser-dev/_virtual/with-selector2.mjs +0 -5
  103. package/dist/browser-dev/_virtual/with-selector2.mjs.map +0 -1
  104. package/dist/browser-dev/node_modules/@xstate/fsm/es/index.mjs +0 -151
  105. package/dist/browser-dev/node_modules/@xstate/fsm/es/index.mjs.map +0 -1
  106. package/dist/browser-dev/node_modules/@xstate/react/es/fsm.mjs +0 -89
  107. package/dist/browser-dev/node_modules/@xstate/react/es/fsm.mjs.map +0 -1
  108. package/dist/browser-dev/node_modules/@xstate/react/es/useConstant.mjs +0 -12
  109. package/dist/browser-dev/node_modules/@xstate/react/es/useConstant.mjs.map +0 -1
  110. package/dist/browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs +0 -82
  111. package/dist/browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map +0 -1
  112. package/dist/browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.mjs +0 -78
  113. package/dist/browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.mjs.map +0 -1
  114. package/dist/browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs +0 -78
  115. package/dist/browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map +0 -1
  116. package/dist/browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.mjs +0 -63
  117. package/dist/browser-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.mjs.map +0 -1
  118. package/dist/browser-dev/node_modules/use-sync-external-store/shim/index.mjs +0 -18
  119. package/dist/browser-dev/node_modules/use-sync-external-store/shim/index.mjs.map +0 -1
  120. package/dist/browser-dev/node_modules/use-sync-external-store/shim/with-selector.mjs +0 -18
  121. package/dist/browser-dev/node_modules/use-sync-external-store/shim/with-selector.mjs.map +0 -1
  122. package/dist/browser-prod/_virtual/index.mjs +0 -5
  123. package/dist/browser-prod/_virtual/index.mjs.map +0 -1
  124. package/dist/browser-prod/_virtual/use-sync-external-store-shim.development.mjs +0 -5
  125. package/dist/browser-prod/_virtual/use-sync-external-store-shim.development.mjs.map +0 -1
  126. package/dist/browser-prod/_virtual/use-sync-external-store-shim.production.mjs +0 -5
  127. package/dist/browser-prod/_virtual/use-sync-external-store-shim.production.mjs.map +0 -1
  128. package/dist/browser-prod/_virtual/with-selector.development.mjs +0 -5
  129. package/dist/browser-prod/_virtual/with-selector.development.mjs.map +0 -1
  130. package/dist/browser-prod/_virtual/with-selector.mjs +0 -6
  131. package/dist/browser-prod/_virtual/with-selector.mjs.map +0 -1
  132. package/dist/browser-prod/_virtual/with-selector.production.mjs +0 -5
  133. package/dist/browser-prod/_virtual/with-selector.production.mjs.map +0 -1
  134. package/dist/browser-prod/_virtual/with-selector2.mjs +0 -5
  135. package/dist/browser-prod/_virtual/with-selector2.mjs.map +0 -1
  136. package/dist/browser-prod/node_modules/@xstate/fsm/es/index.mjs +0 -151
  137. package/dist/browser-prod/node_modules/@xstate/fsm/es/index.mjs.map +0 -1
  138. package/dist/browser-prod/node_modules/@xstate/react/es/fsm.mjs +0 -89
  139. package/dist/browser-prod/node_modules/@xstate/react/es/fsm.mjs.map +0 -1
  140. package/dist/browser-prod/node_modules/@xstate/react/es/useConstant.mjs +0 -12
  141. package/dist/browser-prod/node_modules/@xstate/react/es/useConstant.mjs.map +0 -1
  142. package/dist/browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs +0 -82
  143. package/dist/browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map +0 -1
  144. package/dist/browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.mjs +0 -78
  145. package/dist/browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.mjs.map +0 -1
  146. package/dist/browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs +0 -78
  147. package/dist/browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map +0 -1
  148. package/dist/browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.mjs +0 -63
  149. package/dist/browser-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.mjs.map +0 -1
  150. package/dist/browser-prod/node_modules/use-sync-external-store/shim/index.mjs +0 -18
  151. package/dist/browser-prod/node_modules/use-sync-external-store/shim/index.mjs.map +0 -1
  152. package/dist/browser-prod/node_modules/use-sync-external-store/shim/with-selector.mjs +0 -18
  153. package/dist/browser-prod/node_modules/use-sync-external-store/shim/with-selector.mjs.map +0 -1
  154. package/dist/node-dev/_virtual/index.js +0 -5
  155. package/dist/node-dev/_virtual/index.js.map +0 -1
  156. package/dist/node-dev/_virtual/index.mjs +0 -5
  157. package/dist/node-dev/_virtual/index.mjs.map +0 -1
  158. package/dist/node-dev/_virtual/use-sync-external-store-shim.development.js +0 -5
  159. package/dist/node-dev/_virtual/use-sync-external-store-shim.development.js.map +0 -1
  160. package/dist/node-dev/_virtual/use-sync-external-store-shim.development.mjs +0 -5
  161. package/dist/node-dev/_virtual/use-sync-external-store-shim.development.mjs.map +0 -1
  162. package/dist/node-dev/_virtual/use-sync-external-store-shim.production.js +0 -5
  163. package/dist/node-dev/_virtual/use-sync-external-store-shim.production.js.map +0 -1
  164. package/dist/node-dev/_virtual/use-sync-external-store-shim.production.mjs +0 -5
  165. package/dist/node-dev/_virtual/use-sync-external-store-shim.production.mjs.map +0 -1
  166. package/dist/node-dev/_virtual/with-selector.development.js +0 -5
  167. package/dist/node-dev/_virtual/with-selector.development.js.map +0 -1
  168. package/dist/node-dev/_virtual/with-selector.development.mjs +0 -5
  169. package/dist/node-dev/_virtual/with-selector.development.mjs.map +0 -1
  170. package/dist/node-dev/_virtual/with-selector.js +0 -6
  171. package/dist/node-dev/_virtual/with-selector.js.map +0 -1
  172. package/dist/node-dev/_virtual/with-selector.mjs +0 -6
  173. package/dist/node-dev/_virtual/with-selector.mjs.map +0 -1
  174. package/dist/node-dev/_virtual/with-selector.production.js +0 -5
  175. package/dist/node-dev/_virtual/with-selector.production.js.map +0 -1
  176. package/dist/node-dev/_virtual/with-selector.production.mjs +0 -5
  177. package/dist/node-dev/_virtual/with-selector.production.mjs.map +0 -1
  178. package/dist/node-dev/_virtual/with-selector2.js +0 -5
  179. package/dist/node-dev/_virtual/with-selector2.js.map +0 -1
  180. package/dist/node-dev/_virtual/with-selector2.mjs +0 -5
  181. package/dist/node-dev/_virtual/with-selector2.mjs.map +0 -1
  182. package/dist/node-dev/node_modules/@xstate/fsm/es/index.js +0 -150
  183. package/dist/node-dev/node_modules/@xstate/fsm/es/index.js.map +0 -1
  184. package/dist/node-dev/node_modules/@xstate/fsm/es/index.mjs +0 -151
  185. package/dist/node-dev/node_modules/@xstate/fsm/es/index.mjs.map +0 -1
  186. package/dist/node-dev/node_modules/@xstate/react/es/fsm.js +0 -89
  187. package/dist/node-dev/node_modules/@xstate/react/es/fsm.js.map +0 -1
  188. package/dist/node-dev/node_modules/@xstate/react/es/fsm.mjs +0 -89
  189. package/dist/node-dev/node_modules/@xstate/react/es/fsm.mjs.map +0 -1
  190. package/dist/node-dev/node_modules/@xstate/react/es/useConstant.js +0 -28
  191. package/dist/node-dev/node_modules/@xstate/react/es/useConstant.js.map +0 -1
  192. package/dist/node-dev/node_modules/@xstate/react/es/useConstant.mjs +0 -12
  193. package/dist/node-dev/node_modules/@xstate/react/es/useConstant.mjs.map +0 -1
  194. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +0 -82
  195. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +0 -1
  196. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs +0 -82
  197. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map +0 -1
  198. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js +0 -78
  199. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js.map +0 -1
  200. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.mjs +0 -78
  201. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.mjs.map +0 -1
  202. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -78
  203. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -1
  204. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs +0 -78
  205. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map +0 -1
  206. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +0 -63
  207. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +0 -1
  208. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.mjs +0 -63
  209. package/dist/node-dev/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.mjs.map +0 -1
  210. package/dist/node-dev/node_modules/use-sync-external-store/shim/index.js +0 -18
  211. package/dist/node-dev/node_modules/use-sync-external-store/shim/index.js.map +0 -1
  212. package/dist/node-dev/node_modules/use-sync-external-store/shim/index.mjs +0 -18
  213. package/dist/node-dev/node_modules/use-sync-external-store/shim/index.mjs.map +0 -1
  214. package/dist/node-dev/node_modules/use-sync-external-store/shim/with-selector.js +0 -18
  215. package/dist/node-dev/node_modules/use-sync-external-store/shim/with-selector.js.map +0 -1
  216. package/dist/node-dev/node_modules/use-sync-external-store/shim/with-selector.mjs +0 -18
  217. package/dist/node-dev/node_modules/use-sync-external-store/shim/with-selector.mjs.map +0 -1
  218. package/dist/node-prod/_virtual/index.js +0 -5
  219. package/dist/node-prod/_virtual/index.js.map +0 -1
  220. package/dist/node-prod/_virtual/index.mjs +0 -5
  221. package/dist/node-prod/_virtual/index.mjs.map +0 -1
  222. package/dist/node-prod/_virtual/use-sync-external-store-shim.development.js +0 -5
  223. package/dist/node-prod/_virtual/use-sync-external-store-shim.development.js.map +0 -1
  224. package/dist/node-prod/_virtual/use-sync-external-store-shim.development.mjs +0 -5
  225. package/dist/node-prod/_virtual/use-sync-external-store-shim.development.mjs.map +0 -1
  226. package/dist/node-prod/_virtual/use-sync-external-store-shim.production.js +0 -5
  227. package/dist/node-prod/_virtual/use-sync-external-store-shim.production.js.map +0 -1
  228. package/dist/node-prod/_virtual/use-sync-external-store-shim.production.mjs +0 -5
  229. package/dist/node-prod/_virtual/use-sync-external-store-shim.production.mjs.map +0 -1
  230. package/dist/node-prod/_virtual/with-selector.development.js +0 -5
  231. package/dist/node-prod/_virtual/with-selector.development.js.map +0 -1
  232. package/dist/node-prod/_virtual/with-selector.development.mjs +0 -5
  233. package/dist/node-prod/_virtual/with-selector.development.mjs.map +0 -1
  234. package/dist/node-prod/_virtual/with-selector.js +0 -6
  235. package/dist/node-prod/_virtual/with-selector.js.map +0 -1
  236. package/dist/node-prod/_virtual/with-selector.mjs +0 -6
  237. package/dist/node-prod/_virtual/with-selector.mjs.map +0 -1
  238. package/dist/node-prod/_virtual/with-selector.production.js +0 -5
  239. package/dist/node-prod/_virtual/with-selector.production.js.map +0 -1
  240. package/dist/node-prod/_virtual/with-selector.production.mjs +0 -5
  241. package/dist/node-prod/_virtual/with-selector.production.mjs.map +0 -1
  242. package/dist/node-prod/_virtual/with-selector2.js +0 -5
  243. package/dist/node-prod/_virtual/with-selector2.js.map +0 -1
  244. package/dist/node-prod/_virtual/with-selector2.mjs +0 -5
  245. package/dist/node-prod/_virtual/with-selector2.mjs.map +0 -1
  246. package/dist/node-prod/node_modules/@xstate/fsm/es/index.js +0 -150
  247. package/dist/node-prod/node_modules/@xstate/fsm/es/index.js.map +0 -1
  248. package/dist/node-prod/node_modules/@xstate/fsm/es/index.mjs +0 -151
  249. package/dist/node-prod/node_modules/@xstate/fsm/es/index.mjs.map +0 -1
  250. package/dist/node-prod/node_modules/@xstate/react/es/fsm.js +0 -89
  251. package/dist/node-prod/node_modules/@xstate/react/es/fsm.js.map +0 -1
  252. package/dist/node-prod/node_modules/@xstate/react/es/fsm.mjs +0 -89
  253. package/dist/node-prod/node_modules/@xstate/react/es/fsm.mjs.map +0 -1
  254. package/dist/node-prod/node_modules/@xstate/react/es/useConstant.js +0 -28
  255. package/dist/node-prod/node_modules/@xstate/react/es/useConstant.js.map +0 -1
  256. package/dist/node-prod/node_modules/@xstate/react/es/useConstant.mjs +0 -12
  257. package/dist/node-prod/node_modules/@xstate/react/es/useConstant.mjs.map +0 -1
  258. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +0 -82
  259. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +0 -1
  260. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs +0 -82
  261. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.mjs.map +0 -1
  262. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js +0 -78
  263. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js.map +0 -1
  264. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.mjs +0 -78
  265. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.mjs.map +0 -1
  266. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -78
  267. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -1
  268. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs +0 -78
  269. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.mjs.map +0 -1
  270. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +0 -63
  271. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +0 -1
  272. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.mjs +0 -63
  273. package/dist/node-prod/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.mjs.map +0 -1
  274. package/dist/node-prod/node_modules/use-sync-external-store/shim/index.js +0 -18
  275. package/dist/node-prod/node_modules/use-sync-external-store/shim/index.js.map +0 -1
  276. package/dist/node-prod/node_modules/use-sync-external-store/shim/index.mjs +0 -18
  277. package/dist/node-prod/node_modules/use-sync-external-store/shim/index.mjs.map +0 -1
  278. package/dist/node-prod/node_modules/use-sync-external-store/shim/with-selector.js +0 -18
  279. package/dist/node-prod/node_modules/use-sync-external-store/shim/with-selector.js.map +0 -1
  280. package/dist/node-prod/node_modules/use-sync-external-store/shim/with-selector.mjs +0 -18
  281. package/dist/node-prod/node_modules/use-sync-external-store/shim/with-selector.mjs.map +0 -1
  282. /package/dist/browser-dev/{packages/hydrogen-react/package.json.mjs.map → package.json.mjs.map} +0 -0
  283. /package/dist/browser-prod/{packages/hydrogen-react/package.json.mjs.map → package.json.mjs.map} +0 -0
  284. /package/dist/node-dev/{packages/hydrogen-react/package.json.js.map → package.json.js.map} +0 -0
  285. /package/dist/node-dev/{packages/hydrogen-react/package.json.mjs.map → package.json.mjs.map} +0 -0
  286. /package/dist/node-prod/{packages/hydrogen-react/package.json.js.map → package.json.js.map} +0 -0
  287. /package/dist/node-prod/{packages/hydrogen-react/package.json.mjs.map → package.json.mjs.map} +0 -0
@@ -1,5 +1,5 @@
1
- import { useMachine } from "./node_modules/@xstate/react/es/fsm.mjs";
2
- import { assign as i, createMachine as s } from "./node_modules/@xstate/fsm/es/index.mjs";
1
+ import { useMachine } from "./useMachine.mjs";
2
+ import { assign, createMachine } from "@xstate/fsm";
3
3
  import { flattenConnection } from "./flatten-connection.mjs";
4
4
  import { useCartActions } from "./useCartActions.mjs";
5
5
  import { useMemo } from "react";
@@ -7,7 +7,7 @@ function invokeCart(action, options) {
7
7
  return {
8
8
  entry: [
9
9
  ...(options == null ? void 0 : options.entryActions) || [],
10
- i({
10
+ assign({
11
11
  lastValidCart: (context) => context == null ? void 0 : context.cart
12
12
  }),
13
13
  "onCartActionEntry",
@@ -18,7 +18,7 @@ function invokeCart(action, options) {
18
18
  RESOLVE: {
19
19
  target: (options == null ? void 0 : options.resolveTarget) || "idle",
20
20
  actions: [
21
- i({
21
+ assign({
22
22
  prevCart: (context) => context == null ? void 0 : context.lastValidCart,
23
23
  cart: (_, event) => {
24
24
  var _a;
@@ -36,7 +36,7 @@ function invokeCart(action, options) {
36
36
  ERROR: {
37
37
  target: (options == null ? void 0 : options.errorTarget) || "error",
38
38
  actions: [
39
- i({
39
+ assign({
40
40
  prevCart: (context) => context == null ? void 0 : context.lastValidCart,
41
41
  cart: (context) => context == null ? void 0 : context.lastValidCart,
42
42
  errors: (_, event) => {
@@ -48,7 +48,7 @@ function invokeCart(action, options) {
48
48
  },
49
49
  CART_COMPLETED: {
50
50
  target: "cartCompleted",
51
- actions: i({
51
+ actions: assign({
52
52
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
53
53
  prevCart: (_) => void 0,
54
54
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -75,7 +75,7 @@ const INITIALIZING_CART_EVENTS = {
75
75
  CART_SET: {
76
76
  target: "idle",
77
77
  actions: [
78
- i({
78
+ assign({
79
79
  rawCartResult: (_, event) => event.payload.cart,
80
80
  cart: (_, event) => cartFromGraphQL(event.payload.cart)
81
81
  })
@@ -106,7 +106,7 @@ const UPDATING_CART_EVENTS = {
106
106
  }
107
107
  };
108
108
  function createCartMachine(initialCart) {
109
- return s({
109
+ return createMachine({
110
110
  id: "Cart",
111
111
  initial: initialCart ? "idle" : "uninitialized",
112
112
  context: {
@@ -309,7 +309,7 @@ function useCartAPIStateMachine({
309
309
  }
310
310
  },
311
311
  ...onCartActionOptimisticUI && {
312
- onCartActionOptimisticUI: i((context, event) => {
312
+ onCartActionOptimisticUI: assign((context, event) => {
313
313
  return onCartActionOptimisticUI(context, event);
314
314
  })
315
315
  },
@@ -1 +1 @@
1
- {"version":3,"file":"useCartAPIStateMachine.mjs","sources":["../../src/useCartAPIStateMachine.tsx"],"sourcesContent":["import {useMachine} from '@xstate/react/fsm';\nimport {createMachine, assign, StateMachine} from '@xstate/fsm';\nimport {\n Cart,\n CartMachineActionEvent,\n CartMachineActions,\n CartMachineContext,\n CartMachineEvent,\n CartMachineFetchResultEvent,\n CartMachineTypeState,\n} from './cart-types.js';\nimport {flattenConnection} from './flatten-connection.js';\nimport {useCartActions} from './useCartActions.js';\nimport {useMemo} from 'react';\nimport {InitEvent} from '@xstate/fsm/lib/types.js';\nimport {\n CountryCode,\n Cart as CartType,\n LanguageCode,\n} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\n\nfunction invokeCart(\n action: keyof CartMachineActions,\n options?: {\n entryActions?: [keyof CartMachineActions];\n resolveTarget?: CartMachineTypeState['value'];\n errorTarget?: CartMachineTypeState['value'];\n exitActions?: [keyof CartMachineActions];\n },\n): StateMachine.Config<CartMachineContext, CartMachineEvent>['states']['on'] {\n return {\n entry: [\n ...(options?.entryActions || []),\n assign({\n lastValidCart: (context) => context?.cart,\n }),\n 'onCartActionEntry',\n 'onCartActionOptimisticUI',\n action,\n ],\n on: {\n RESOLVE: {\n target: options?.resolveTarget || 'idle',\n actions: [\n assign({\n prevCart: (context) => context?.lastValidCart,\n cart: (_, event) => event?.payload?.cart,\n rawCartResult: (_, event) => event?.payload?.rawCartResult,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n errors: (_) => undefined,\n }),\n ],\n },\n ERROR: {\n target: options?.errorTarget || 'error',\n actions: [\n assign({\n prevCart: (context) => context?.lastValidCart,\n cart: (context) => context?.lastValidCart,\n errors: (_, event) => event?.payload?.errors,\n }),\n ],\n },\n CART_COMPLETED: {\n target: 'cartCompleted',\n actions: assign({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n prevCart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n cart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n lastValidCart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n rawCartResult: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n errors: (_) => undefined,\n }),\n },\n },\n exit: ['onCartActionComplete', ...(options?.exitActions || [])],\n };\n}\n\nconst INITIALIZING_CART_EVENTS: StateMachine.Machine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n>['config']['states']['uninitialized']['on'] = {\n CART_FETCH: {\n target: 'cartFetching',\n },\n CART_CREATE: {\n target: 'cartCreating',\n },\n CART_SET: {\n target: 'idle',\n actions: [\n assign({\n rawCartResult: (_, event) => event.payload.cart,\n cart: (_, event) => cartFromGraphQL(event.payload.cart),\n }),\n ],\n },\n};\n\nconst UPDATING_CART_EVENTS: StateMachine.Machine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n>['config']['states']['idle']['on'] = {\n CARTLINE_ADD: {\n target: 'cartLineAdding',\n },\n CARTLINE_UPDATE: {\n target: 'cartLineUpdating',\n },\n CARTLINE_REMOVE: {\n target: 'cartLineRemoving',\n },\n NOTE_UPDATE: {\n target: 'noteUpdating',\n },\n BUYER_IDENTITY_UPDATE: {\n target: 'buyerIdentityUpdating',\n },\n CART_ATTRIBUTES_UPDATE: {\n target: 'cartAttributesUpdating',\n },\n DISCOUNT_CODES_UPDATE: {\n target: 'discountCodesUpdating',\n },\n};\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction createCartMachine(\n initialCart?: PartialDeep<CartType, {recurseIntoArrays: true}>,\n) {\n return createMachine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n >({\n id: 'Cart',\n initial: initialCart ? 'idle' : 'uninitialized',\n context: {\n cart: initialCart && cartFromGraphQL(initialCart),\n },\n states: {\n uninitialized: {\n on: INITIALIZING_CART_EVENTS,\n },\n cartCompleted: {\n on: INITIALIZING_CART_EVENTS,\n },\n initializationError: {\n on: INITIALIZING_CART_EVENTS,\n },\n idle: {\n on: {...INITIALIZING_CART_EVENTS, ...UPDATING_CART_EVENTS},\n },\n error: {\n on: {...INITIALIZING_CART_EVENTS, ...UPDATING_CART_EVENTS},\n },\n cartFetching: invokeCart('cartFetchAction', {\n errorTarget: 'initializationError',\n }),\n cartCreating: invokeCart('cartCreateAction', {\n errorTarget: 'initializationError',\n }),\n cartLineRemoving: invokeCart('cartLineRemoveAction'),\n cartLineUpdating: invokeCart('cartLineUpdateAction'),\n cartLineAdding: invokeCart('cartLineAddAction'),\n noteUpdating: invokeCart('noteUpdateAction'),\n buyerIdentityUpdating: invokeCart('buyerIdentityUpdateAction'),\n cartAttributesUpdating: invokeCart('cartAttributesUpdateAction'),\n discountCodesUpdating: invokeCart('discountCodesUpdateAction'),\n },\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function useCartAPIStateMachine({\n numCartLines,\n onCartActionEntry,\n onCartActionOptimisticUI,\n onCartActionComplete,\n data: cart,\n cartFragment,\n countryCode,\n languageCode,\n}: {\n /** Maximum number of cart lines to fetch. Defaults to 250 cart lines. */\n numCartLines?: number;\n /** A callback that is invoked just before a Cart API action executes. */\n onCartActionEntry?: (\n context: CartMachineContext,\n event: CartMachineActionEvent,\n ) => void;\n /** A callback that is invoked after executing the entry actions for optimistic UI changes. */\n onCartActionOptimisticUI?: (\n context: CartMachineContext,\n event: CartMachineEvent,\n ) => Partial<CartMachineContext>;\n /** A callback that is invoked after a Cart API completes. */\n onCartActionComplete?: (\n context: CartMachineContext,\n event: CartMachineFetchResultEvent,\n ) => void;\n /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/2026-01/objects/cart). */\n data?: PartialDeep<CartType, {recurseIntoArrays: true}>;\n /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/2026-01/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */\n cartFragment: string;\n /** The ISO country code for i18n. */\n countryCode?: CountryCode;\n /** The ISO language code for i18n. */\n languageCode?: LanguageCode;\n}) {\n const {\n cartFetch,\n cartCreate,\n cartLineAdd,\n cartLineUpdate,\n cartLineRemove,\n noteUpdate,\n buyerIdentityUpdate,\n cartAttributesUpdate,\n discountCodesUpdate,\n } = useCartActions({\n numCartLines,\n cartFragment,\n countryCode,\n languageCode,\n });\n\n const cartMachine = useMemo(() => createCartMachine(cart), [cart]);\n\n const [state, send, service] = useMachine(cartMachine, {\n actions: {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartFetchAction: async (_, event) => {\n if (event.type !== 'CART_FETCH') return;\n\n const {data, errors} = await cartFetch(event?.payload?.cartId);\n const resultEvent = eventFromFetchResult(event, data?.cart, errors);\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartCreateAction: async (_, event) => {\n if (event.type !== 'CART_CREATE') return;\n\n const {data, errors} = await cartCreate(event?.payload);\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartCreate?.cart,\n errors,\n );\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartLineAddAction: async (context, event) => {\n if (event.type !== 'CARTLINE_ADD' || !context?.cart?.id) return;\n\n const {data, errors} = await cartLineAdd(\n context.cart.id,\n event.payload.lines,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesAdd?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartLineUpdateAction: async (context, event) => {\n if (event.type !== 'CARTLINE_UPDATE' || !context?.cart?.id) return;\n const {data, errors} = await cartLineUpdate(\n context.cart.id,\n event.payload.lines,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesUpdate?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartLineRemoveAction: async (context, event) => {\n if (event.type !== 'CARTLINE_REMOVE' || !context?.cart?.id) return;\n const {data, errors} = await cartLineRemove(\n context.cart.id,\n event.payload.lines,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesRemove?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n noteUpdateAction: async (context, event) => {\n if (event.type !== 'NOTE_UPDATE' || !context?.cart?.id) return;\n const {data, errors} = await noteUpdate(\n context.cart.id,\n event.payload.note,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartNoteUpdate?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n buyerIdentityUpdateAction: async (context, event) => {\n if (event.type !== 'BUYER_IDENTITY_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await buyerIdentityUpdate(\n context.cart.id,\n event.payload.buyerIdentity,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartBuyerIdentityUpdate?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartAttributesUpdateAction: async (context, event) => {\n if (event.type !== 'CART_ATTRIBUTES_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await cartAttributesUpdate(\n context.cart.id,\n event.payload.attributes,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartAttributesUpdate?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n discountCodesUpdateAction: async (context, event) => {\n if (event.type !== 'DISCOUNT_CODES_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await discountCodesUpdate(\n context.cart.id,\n event.payload.discountCodes,\n );\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartDiscountCodesUpdate?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n ...(onCartActionEntry && {\n onCartActionEntry: (context, event): void => {\n if (isCartActionEvent(event)) {\n onCartActionEntry(context, event);\n }\n },\n }),\n ...(onCartActionOptimisticUI && {\n onCartActionOptimisticUI: assign((context, event) => {\n return onCartActionOptimisticUI(context, event);\n }),\n }),\n ...(onCartActionComplete && {\n onCartActionComplete: (context, event): void => {\n if (isCartFetchResultEvent(event)) {\n onCartActionComplete(context, event);\n }\n },\n }),\n } as CartMachineActions,\n });\n\n return useMemo(() => [state, send, service] as const, [state, send, service]);\n}\n\nexport function cartFromGraphQL(\n cart: PartialDeep<CartType, {recurseIntoArrays: true}>,\n): Cart {\n return {\n ...cart,\n lines: flattenConnection(cart?.lines),\n note: cart.note ?? undefined,\n };\n}\n\nfunction eventFromFetchResult(\n cartActionEvent: CartMachineActionEvent,\n cart?: PartialDeep<CartType, {recurseIntoArrays: true}> | null,\n errors?: unknown,\n): CartMachineFetchResultEvent {\n if (errors) {\n return {type: 'ERROR', payload: {errors, cartActionEvent}};\n }\n\n if (!cart) {\n return {\n type: 'CART_COMPLETED',\n payload: {\n cartActionEvent,\n },\n };\n }\n\n return {\n type: 'RESOLVE',\n payload: {\n cart: cartFromGraphQL(cart),\n rawCartResult: cart,\n cartActionEvent,\n },\n };\n}\n\nfunction isCartActionEvent(\n event: CartMachineEvent | InitEvent,\n): event is CartMachineActionEvent {\n return (\n event.type === 'CART_CREATE' ||\n event.type === 'CARTLINE_ADD' ||\n event.type === 'CARTLINE_UPDATE' ||\n event.type === 'CARTLINE_REMOVE' ||\n event.type === 'NOTE_UPDATE' ||\n event.type === 'BUYER_IDENTITY_UPDATE' ||\n event.type === 'CART_ATTRIBUTES_UPDATE' ||\n event.type === 'DISCOUNT_CODES_UPDATE'\n );\n}\n\nfunction isCartFetchResultEvent(\n event: CartMachineEvent | InitEvent,\n): event is CartMachineFetchResultEvent {\n return (\n event.type === 'RESOLVE' ||\n event.type === 'ERROR' ||\n event.type === 'CART_COMPLETED'\n );\n}\n"],"names":["assign","createMachine"],"mappings":"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"}
1
+ {"version":3,"file":"useCartAPIStateMachine.mjs","sources":["../../src/useCartAPIStateMachine.tsx"],"sourcesContent":["import {useMachine} from './useMachine.js';\nimport {createMachine, assign, StateMachine} from '@xstate/fsm';\nimport {\n Cart,\n CartMachineActionEvent,\n CartMachineActions,\n CartMachineContext,\n CartMachineEvent,\n CartMachineFetchResultEvent,\n CartMachineTypeState,\n} from './cart-types.js';\nimport {flattenConnection} from './flatten-connection.js';\nimport {useCartActions} from './useCartActions.js';\nimport {useMemo} from 'react';\nimport {InitEvent} from '@xstate/fsm/lib/types.js';\nimport {\n CountryCode,\n Cart as CartType,\n LanguageCode,\n} from './storefront-api-types.js';\nimport type {PartialDeep} from 'type-fest';\n\nfunction invokeCart(\n action: keyof CartMachineActions,\n options?: {\n entryActions?: [keyof CartMachineActions];\n resolveTarget?: CartMachineTypeState['value'];\n errorTarget?: CartMachineTypeState['value'];\n exitActions?: [keyof CartMachineActions];\n },\n): StateMachine.Config<CartMachineContext, CartMachineEvent>['states']['on'] {\n return {\n entry: [\n ...(options?.entryActions || []),\n assign({\n lastValidCart: (context) => context?.cart,\n }),\n 'onCartActionEntry',\n 'onCartActionOptimisticUI',\n action,\n ],\n on: {\n RESOLVE: {\n target: options?.resolveTarget || 'idle',\n actions: [\n assign({\n prevCart: (context) => context?.lastValidCart,\n cart: (_, event) => event?.payload?.cart,\n rawCartResult: (_, event) => event?.payload?.rawCartResult,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n errors: (_) => undefined,\n }),\n ],\n },\n ERROR: {\n target: options?.errorTarget || 'error',\n actions: [\n assign({\n prevCart: (context) => context?.lastValidCart,\n cart: (context) => context?.lastValidCart,\n errors: (_, event) => event?.payload?.errors,\n }),\n ],\n },\n CART_COMPLETED: {\n target: 'cartCompleted',\n actions: assign({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n prevCart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n cart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n lastValidCart: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n rawCartResult: (_) => undefined,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n errors: (_) => undefined,\n }),\n },\n },\n exit: ['onCartActionComplete', ...(options?.exitActions || [])],\n };\n}\n\nconst INITIALIZING_CART_EVENTS: StateMachine.Machine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n>['config']['states']['uninitialized']['on'] = {\n CART_FETCH: {\n target: 'cartFetching',\n },\n CART_CREATE: {\n target: 'cartCreating',\n },\n CART_SET: {\n target: 'idle',\n actions: [\n assign({\n rawCartResult: (_, event) => event.payload.cart,\n cart: (_, event) => cartFromGraphQL(event.payload.cart),\n }),\n ],\n },\n};\n\nconst UPDATING_CART_EVENTS: StateMachine.Machine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n>['config']['states']['idle']['on'] = {\n CARTLINE_ADD: {\n target: 'cartLineAdding',\n },\n CARTLINE_UPDATE: {\n target: 'cartLineUpdating',\n },\n CARTLINE_REMOVE: {\n target: 'cartLineRemoving',\n },\n NOTE_UPDATE: {\n target: 'noteUpdating',\n },\n BUYER_IDENTITY_UPDATE: {\n target: 'buyerIdentityUpdating',\n },\n CART_ATTRIBUTES_UPDATE: {\n target: 'cartAttributesUpdating',\n },\n DISCOUNT_CODES_UPDATE: {\n target: 'discountCodesUpdating',\n },\n};\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction createCartMachine(\n initialCart?: PartialDeep<CartType, {recurseIntoArrays: true}>,\n) {\n return createMachine<\n CartMachineContext,\n CartMachineEvent,\n CartMachineTypeState\n >({\n id: 'Cart',\n initial: initialCart ? 'idle' : 'uninitialized',\n context: {\n cart: initialCart && cartFromGraphQL(initialCart),\n },\n states: {\n uninitialized: {\n on: INITIALIZING_CART_EVENTS,\n },\n cartCompleted: {\n on: INITIALIZING_CART_EVENTS,\n },\n initializationError: {\n on: INITIALIZING_CART_EVENTS,\n },\n idle: {\n on: {...INITIALIZING_CART_EVENTS, ...UPDATING_CART_EVENTS},\n },\n error: {\n on: {...INITIALIZING_CART_EVENTS, ...UPDATING_CART_EVENTS},\n },\n cartFetching: invokeCart('cartFetchAction', {\n errorTarget: 'initializationError',\n }),\n cartCreating: invokeCart('cartCreateAction', {\n errorTarget: 'initializationError',\n }),\n cartLineRemoving: invokeCart('cartLineRemoveAction'),\n cartLineUpdating: invokeCart('cartLineUpdateAction'),\n cartLineAdding: invokeCart('cartLineAddAction'),\n noteUpdating: invokeCart('noteUpdateAction'),\n buyerIdentityUpdating: invokeCart('buyerIdentityUpdateAction'),\n cartAttributesUpdating: invokeCart('cartAttributesUpdateAction'),\n discountCodesUpdating: invokeCart('discountCodesUpdateAction'),\n },\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function useCartAPIStateMachine({\n numCartLines,\n onCartActionEntry,\n onCartActionOptimisticUI,\n onCartActionComplete,\n data: cart,\n cartFragment,\n countryCode,\n languageCode,\n}: {\n /** Maximum number of cart lines to fetch. Defaults to 250 cart lines. */\n numCartLines?: number;\n /** A callback that is invoked just before a Cart API action executes. */\n onCartActionEntry?: (\n context: CartMachineContext,\n event: CartMachineActionEvent,\n ) => void;\n /** A callback that is invoked after executing the entry actions for optimistic UI changes. */\n onCartActionOptimisticUI?: (\n context: CartMachineContext,\n event: CartMachineEvent,\n ) => Partial<CartMachineContext>;\n /** A callback that is invoked after a Cart API completes. */\n onCartActionComplete?: (\n context: CartMachineContext,\n event: CartMachineFetchResultEvent,\n ) => void;\n /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/2026-01/objects/cart). */\n data?: PartialDeep<CartType, {recurseIntoArrays: true}>;\n /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/2026-01/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */\n cartFragment: string;\n /** The ISO country code for i18n. */\n countryCode?: CountryCode;\n /** The ISO language code for i18n. */\n languageCode?: LanguageCode;\n}) {\n const {\n cartFetch,\n cartCreate,\n cartLineAdd,\n cartLineUpdate,\n cartLineRemove,\n noteUpdate,\n buyerIdentityUpdate,\n cartAttributesUpdate,\n discountCodesUpdate,\n } = useCartActions({\n numCartLines,\n cartFragment,\n countryCode,\n languageCode,\n });\n\n const cartMachine = useMemo(() => createCartMachine(cart), [cart]);\n\n const [state, send, service] = useMachine(cartMachine, {\n actions: {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartFetchAction: async (_, event) => {\n if (event.type !== 'CART_FETCH') return;\n\n const {data, errors} = await cartFetch(event?.payload?.cartId);\n const resultEvent = eventFromFetchResult(event, data?.cart, errors);\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartCreateAction: async (_, event) => {\n if (event.type !== 'CART_CREATE') return;\n\n const {data, errors} = await cartCreate(event?.payload);\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartCreate?.cart,\n errors,\n );\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartLineAddAction: async (context, event) => {\n if (event.type !== 'CARTLINE_ADD' || !context?.cart?.id) return;\n\n const {data, errors} = await cartLineAdd(\n context.cart.id,\n event.payload.lines,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesAdd?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartLineUpdateAction: async (context, event) => {\n if (event.type !== 'CARTLINE_UPDATE' || !context?.cart?.id) return;\n const {data, errors} = await cartLineUpdate(\n context.cart.id,\n event.payload.lines,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesUpdate?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartLineRemoveAction: async (context, event) => {\n if (event.type !== 'CARTLINE_REMOVE' || !context?.cart?.id) return;\n const {data, errors} = await cartLineRemove(\n context.cart.id,\n event.payload.lines,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartLinesRemove?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n noteUpdateAction: async (context, event) => {\n if (event.type !== 'NOTE_UPDATE' || !context?.cart?.id) return;\n const {data, errors} = await noteUpdate(\n context.cart.id,\n event.payload.note,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartNoteUpdate?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n buyerIdentityUpdateAction: async (context, event) => {\n if (event.type !== 'BUYER_IDENTITY_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await buyerIdentityUpdate(\n context.cart.id,\n event.payload.buyerIdentity,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartBuyerIdentityUpdate?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cartAttributesUpdateAction: async (context, event) => {\n if (event.type !== 'CART_ATTRIBUTES_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await cartAttributesUpdate(\n context.cart.id,\n event.payload.attributes,\n );\n\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartAttributesUpdate?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n discountCodesUpdateAction: async (context, event) => {\n if (event.type !== 'DISCOUNT_CODES_UPDATE' || !context?.cart?.id)\n return;\n const {data, errors} = await discountCodesUpdate(\n context.cart.id,\n event.payload.discountCodes,\n );\n const resultEvent = eventFromFetchResult(\n event,\n data?.cartDiscountCodesUpdate?.cart,\n errors,\n );\n\n send(resultEvent);\n },\n ...(onCartActionEntry && {\n onCartActionEntry: (context, event): void => {\n if (isCartActionEvent(event)) {\n onCartActionEntry(context, event);\n }\n },\n }),\n ...(onCartActionOptimisticUI && {\n onCartActionOptimisticUI: assign((context, event) => {\n return onCartActionOptimisticUI(context, event);\n }),\n }),\n ...(onCartActionComplete && {\n onCartActionComplete: (context, event): void => {\n if (isCartFetchResultEvent(event)) {\n onCartActionComplete(context, event);\n }\n },\n }),\n } as CartMachineActions,\n });\n\n return useMemo(() => [state, send, service] as const, [state, send, service]);\n}\n\nexport function cartFromGraphQL(\n cart: PartialDeep<CartType, {recurseIntoArrays: true}>,\n): Cart {\n return {\n ...cart,\n lines: flattenConnection(cart?.lines),\n note: cart.note ?? undefined,\n };\n}\n\nfunction eventFromFetchResult(\n cartActionEvent: CartMachineActionEvent,\n cart?: PartialDeep<CartType, {recurseIntoArrays: true}> | null,\n errors?: unknown,\n): CartMachineFetchResultEvent {\n if (errors) {\n return {type: 'ERROR', payload: {errors, cartActionEvent}};\n }\n\n if (!cart) {\n return {\n type: 'CART_COMPLETED',\n payload: {\n cartActionEvent,\n },\n };\n }\n\n return {\n type: 'RESOLVE',\n payload: {\n cart: cartFromGraphQL(cart),\n rawCartResult: cart,\n cartActionEvent,\n },\n };\n}\n\nfunction isCartActionEvent(\n event: CartMachineEvent | InitEvent,\n): event is CartMachineActionEvent {\n return (\n event.type === 'CART_CREATE' ||\n event.type === 'CARTLINE_ADD' ||\n event.type === 'CARTLINE_UPDATE' ||\n event.type === 'CARTLINE_REMOVE' ||\n event.type === 'NOTE_UPDATE' ||\n event.type === 'BUYER_IDENTITY_UPDATE' ||\n event.type === 'CART_ATTRIBUTES_UPDATE' ||\n event.type === 'DISCOUNT_CODES_UPDATE'\n );\n}\n\nfunction isCartFetchResultEvent(\n event: CartMachineEvent | InitEvent,\n): event is CartMachineFetchResultEvent {\n return (\n event.type === 'RESOLVE' ||\n event.type === 'ERROR' ||\n event.type === 'CART_COMPLETED'\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const fsm = require("@xstate/fsm");
4
+ const React = require("react");
5
+ const useIsomorphicLayoutEffect = typeof window !== "undefined" ? React.useLayoutEffect : React.useEffect;
6
+ function useConstant(fn) {
7
+ const ref = React.useRef();
8
+ if (!ref.current) {
9
+ ref.current = { v: fn() };
10
+ }
11
+ return ref.current.v;
12
+ }
13
+ function getServiceState(service) {
14
+ let currentValue;
15
+ service.subscribe((state) => currentValue = state).unsubscribe();
16
+ return currentValue;
17
+ }
18
+ function useMachine(stateMachine, options) {
19
+ const persistedStateRef = React.useRef();
20
+ const [service, queue] = useConstant(() => {
21
+ const eventQueue = [];
22
+ const svc = fsm.interpret(
23
+ fsm.createMachine(
24
+ stateMachine.config,
25
+ options ? options : stateMachine._options
26
+ )
27
+ );
28
+ const originalSend = svc.send;
29
+ svc.send = (event) => {
30
+ if (svc.status === fsm.InterpreterStatus.NotStarted) {
31
+ eventQueue.push(event);
32
+ return;
33
+ }
34
+ originalSend(event);
35
+ persistedStateRef.current = svc.state;
36
+ };
37
+ return [svc, eventQueue];
38
+ });
39
+ useIsomorphicLayoutEffect(() => {
40
+ if (options) {
41
+ service._machine._options = options;
42
+ }
43
+ });
44
+ const getSnapshot = React.useCallback(() => getServiceState(service), [service]);
45
+ const subscribe = React.useCallback(
46
+ (handleStoreChange) => {
47
+ const { unsubscribe } = service.subscribe(handleStoreChange);
48
+ return unsubscribe;
49
+ },
50
+ [service]
51
+ );
52
+ const storeSnapshot = React.useSyncExternalStore(
53
+ subscribe,
54
+ getSnapshot,
55
+ getSnapshot
56
+ );
57
+ React.useEffect(() => {
58
+ service.start(persistedStateRef.current);
59
+ queue.forEach(service.send);
60
+ persistedStateRef.current = service.state;
61
+ return () => {
62
+ service.stop();
63
+ };
64
+ }, []);
65
+ return [storeSnapshot, service.send, service];
66
+ }
67
+ exports.useMachine = useMachine;
68
+ //# sourceMappingURL=useMachine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMachine.js","sources":["../../src/useMachine.ts"],"sourcesContent":["// Inlined React binding for xstate/fsm's state machine interpreter.\n//\n// This replaces the xstate/react/fsm entrypoint, which had no official version\n// supporting both React 19 and xstate/fsm. By owning this hook, we eliminate\n// the xstate/react dependency (and its React version peer dep constraint)\n// while keeping xstate/fsm and the cart state machine definition unchanged.\n//\n// Adapted from xstate/react v3.2.1/fsm (MIT license, Stately/xstate).\n// Copyright (c) 2015 David Khourshid\nimport {\n createMachine,\n interpret,\n InterpreterStatus,\n StateMachine,\n EventObject,\n} from '@xstate/fsm';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useSyncExternalStore,\n} from 'react';\n\n// useLayoutEffect in the browser (sync after DOM mutations, before paint),\n// useEffect on the server (where useLayoutEffect warns). The check runs once\n// at module evaluation time (not per-render). This matches the original\n// xstate/react behavior via use-isomorphic-layout-effect.\nconst useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nfunction useConstant<T>(fn: () => T): T {\n const ref = useRef<{v: T}>();\n if (!ref.current) {\n ref.current = {v: fn()};\n }\n return ref.current.v;\n}\n\nfunction getServiceState<\n TC extends object,\n TE extends EventObject,\n TS extends {value: any; context: TC},\n>(service: StateMachine.Service<TC, TE, TS>): StateMachine.State<TC, TE, TS> {\n let currentValue!: StateMachine.State<TC, TE, TS>;\n service.subscribe((state) => (currentValue = state)).unsubscribe();\n return currentValue;\n}\n\nexport function useMachine<\n TC extends object,\n TE extends EventObject,\n TS extends {value: any; context: TC},\n>(\n stateMachine: StateMachine.Machine<TC, TE, TS>,\n options?: {actions?: StateMachine.ActionMap<TC, TE>},\n): readonly [\n StateMachine.State<TC, TE, TS>,\n StateMachine.Service<TC, TE, TS>['send'],\n StateMachine.Service<TC, TE, TS>,\n] {\n const persistedStateRef = useRef<StateMachine.State<TC, TE, TS>>();\n\n const [service, queue] = useConstant(() => {\n const eventQueue: Array<TE | TE['type']> = [];\n const svc = interpret(\n createMachine(\n stateMachine.config,\n options ? options : (stateMachine as any)._options,\n ),\n );\n const originalSend = svc.send;\n svc.send = (event: TE | TE['type']) => {\n if (svc.status === InterpreterStatus.NotStarted) {\n eventQueue.push(event);\n return;\n }\n originalSend(event);\n persistedStateRef.current = svc.state;\n };\n return [svc, eventQueue] as const;\n });\n\n // Keep action implementations in sync without re-creating the service.\n // useIsomorphicLayoutEffect ensures this runs before child effects and paint,\n // preventing a window where stale action handlers could be invoked.\n useIsomorphicLayoutEffect(() => {\n if (options) {\n (service as any)._machine._options = options;\n }\n });\n\n const getSnapshot = useCallback(() => getServiceState(service), [service]);\n\n const subscribe = useCallback(\n (handleStoreChange: () => void) => {\n const {unsubscribe} = service.subscribe(handleStoreChange);\n return unsubscribe;\n },\n [service],\n );\n\n const storeSnapshot = useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n );\n\n useEffect(() => {\n service.start(persistedStateRef.current as any);\n queue.forEach(service.send);\n persistedStateRef.current = service.state;\n return () => {\n service.stop();\n };\n // service and queue are stable refs from useConstant\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return [storeSnapshot, service.send, service] as const;\n}\n"],"names":["useLayoutEffect","useEffect","useRef","interpret","createMachine","InterpreterStatus","useCallback","useSyncExternalStore"],"mappings":";;;;AA4BA,MAAM,4BACJ,OAAO,WAAW,cAAcA,MAAAA,kBAAkBC,MAAAA;AAEpD,SAAS,YAAe,IAAgB;AACtC,QAAM,MAAMC,MAAAA,OAAA;AACZ,MAAI,CAAC,IAAI,SAAS;AAChB,QAAI,UAAU,EAAC,GAAG,GAAA,EAAG;AAAA,EACvB;AACA,SAAO,IAAI,QAAQ;AACrB;AAEA,SAAS,gBAIP,SAA2E;AAC3E,MAAI;AACJ,UAAQ,UAAU,CAAC,UAAW,eAAe,KAAM,EAAE,YAAA;AACrD,SAAO;AACT;AAEO,SAAS,WAKd,cACA,SAKA;AACA,QAAM,oBAAoBA,MAAAA,OAAA;AAE1B,QAAM,CAAC,SAAS,KAAK,IAAI,YAAY,MAAM;AACzC,UAAM,aAAqC,CAAA;AAC3C,UAAM,MAAMC,IAAAA;AAAAA,MACVC,IAAAA;AAAAA,QACE,aAAa;AAAA,QACb,UAAU,UAAW,aAAqB;AAAA,MAAA;AAAA,IAC5C;AAEF,UAAM,eAAe,IAAI;AACzB,QAAI,OAAO,CAAC,UAA2B;AACrC,UAAI,IAAI,WAAWC,IAAAA,kBAAkB,YAAY;AAC/C,mBAAW,KAAK,KAAK;AACrB;AAAA,MACF;AACA,mBAAa,KAAK;AAClB,wBAAkB,UAAU,IAAI;AAAA,IAClC;AACA,WAAO,CAAC,KAAK,UAAU;AAAA,EACzB,CAAC;AAKD,4BAA0B,MAAM;AAC9B,QAAI,SAAS;AACV,cAAgB,SAAS,WAAW;AAAA,IACvC;AAAA,EACF,CAAC;AAED,QAAM,cAAcC,MAAAA,YAAY,MAAM,gBAAgB,OAAO,GAAG,CAAC,OAAO,CAAC;AAEzE,QAAM,YAAYA,MAAAA;AAAAA,IAChB,CAAC,sBAAkC;AACjC,YAAM,EAAC,YAAA,IAAe,QAAQ,UAAU,iBAAiB;AACzD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,OAAO;AAAA,EAAA;AAGV,QAAM,gBAAgBC,MAAAA;AAAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGFN,QAAAA,UAAU,MAAM;AACd,YAAQ,MAAM,kBAAkB,OAAc;AAC9C,UAAM,QAAQ,QAAQ,IAAI;AAC1B,sBAAkB,UAAU,QAAQ;AACpC,WAAO,MAAM;AACX,cAAQ,KAAA;AAAA,IACV;AAAA,EAGF,GAAG,CAAA,CAAE;AAEL,SAAO,CAAC,eAAe,QAAQ,MAAM,OAAO;AAC9C;;"}
@@ -0,0 +1,68 @@
1
+ import { interpret, createMachine, InterpreterStatus } from "@xstate/fsm";
2
+ import { useRef, useCallback, useSyncExternalStore, useEffect, useLayoutEffect } from "react";
3
+ const useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
4
+ function useConstant(fn) {
5
+ const ref = useRef();
6
+ if (!ref.current) {
7
+ ref.current = { v: fn() };
8
+ }
9
+ return ref.current.v;
10
+ }
11
+ function getServiceState(service) {
12
+ let currentValue;
13
+ service.subscribe((state) => currentValue = state).unsubscribe();
14
+ return currentValue;
15
+ }
16
+ function useMachine(stateMachine, options) {
17
+ const persistedStateRef = useRef();
18
+ const [service, queue] = useConstant(() => {
19
+ const eventQueue = [];
20
+ const svc = interpret(
21
+ createMachine(
22
+ stateMachine.config,
23
+ options ? options : stateMachine._options
24
+ )
25
+ );
26
+ const originalSend = svc.send;
27
+ svc.send = (event) => {
28
+ if (svc.status === InterpreterStatus.NotStarted) {
29
+ eventQueue.push(event);
30
+ return;
31
+ }
32
+ originalSend(event);
33
+ persistedStateRef.current = svc.state;
34
+ };
35
+ return [svc, eventQueue];
36
+ });
37
+ useIsomorphicLayoutEffect(() => {
38
+ if (options) {
39
+ service._machine._options = options;
40
+ }
41
+ });
42
+ const getSnapshot = useCallback(() => getServiceState(service), [service]);
43
+ const subscribe = useCallback(
44
+ (handleStoreChange) => {
45
+ const { unsubscribe } = service.subscribe(handleStoreChange);
46
+ return unsubscribe;
47
+ },
48
+ [service]
49
+ );
50
+ const storeSnapshot = useSyncExternalStore(
51
+ subscribe,
52
+ getSnapshot,
53
+ getSnapshot
54
+ );
55
+ useEffect(() => {
56
+ service.start(persistedStateRef.current);
57
+ queue.forEach(service.send);
58
+ persistedStateRef.current = service.state;
59
+ return () => {
60
+ service.stop();
61
+ };
62
+ }, []);
63
+ return [storeSnapshot, service.send, service];
64
+ }
65
+ export {
66
+ useMachine
67
+ };
68
+ //# sourceMappingURL=useMachine.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMachine.mjs","sources":["../../src/useMachine.ts"],"sourcesContent":["// Inlined React binding for xstate/fsm's state machine interpreter.\n//\n// This replaces the xstate/react/fsm entrypoint, which had no official version\n// supporting both React 19 and xstate/fsm. By owning this hook, we eliminate\n// the xstate/react dependency (and its React version peer dep constraint)\n// while keeping xstate/fsm and the cart state machine definition unchanged.\n//\n// Adapted from xstate/react v3.2.1/fsm (MIT license, Stately/xstate).\n// Copyright (c) 2015 David Khourshid\nimport {\n createMachine,\n interpret,\n InterpreterStatus,\n StateMachine,\n EventObject,\n} from '@xstate/fsm';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useSyncExternalStore,\n} from 'react';\n\n// useLayoutEffect in the browser (sync after DOM mutations, before paint),\n// useEffect on the server (where useLayoutEffect warns). The check runs once\n// at module evaluation time (not per-render). This matches the original\n// xstate/react behavior via use-isomorphic-layout-effect.\nconst useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nfunction useConstant<T>(fn: () => T): T {\n const ref = useRef<{v: T}>();\n if (!ref.current) {\n ref.current = {v: fn()};\n }\n return ref.current.v;\n}\n\nfunction getServiceState<\n TC extends object,\n TE extends EventObject,\n TS extends {value: any; context: TC},\n>(service: StateMachine.Service<TC, TE, TS>): StateMachine.State<TC, TE, TS> {\n let currentValue!: StateMachine.State<TC, TE, TS>;\n service.subscribe((state) => (currentValue = state)).unsubscribe();\n return currentValue;\n}\n\nexport function useMachine<\n TC extends object,\n TE extends EventObject,\n TS extends {value: any; context: TC},\n>(\n stateMachine: StateMachine.Machine<TC, TE, TS>,\n options?: {actions?: StateMachine.ActionMap<TC, TE>},\n): readonly [\n StateMachine.State<TC, TE, TS>,\n StateMachine.Service<TC, TE, TS>['send'],\n StateMachine.Service<TC, TE, TS>,\n] {\n const persistedStateRef = useRef<StateMachine.State<TC, TE, TS>>();\n\n const [service, queue] = useConstant(() => {\n const eventQueue: Array<TE | TE['type']> = [];\n const svc = interpret(\n createMachine(\n stateMachine.config,\n options ? options : (stateMachine as any)._options,\n ),\n );\n const originalSend = svc.send;\n svc.send = (event: TE | TE['type']) => {\n if (svc.status === InterpreterStatus.NotStarted) {\n eventQueue.push(event);\n return;\n }\n originalSend(event);\n persistedStateRef.current = svc.state;\n };\n return [svc, eventQueue] as const;\n });\n\n // Keep action implementations in sync without re-creating the service.\n // useIsomorphicLayoutEffect ensures this runs before child effects and paint,\n // preventing a window where stale action handlers could be invoked.\n useIsomorphicLayoutEffect(() => {\n if (options) {\n (service as any)._machine._options = options;\n }\n });\n\n const getSnapshot = useCallback(() => getServiceState(service), [service]);\n\n const subscribe = useCallback(\n (handleStoreChange: () => void) => {\n const {unsubscribe} = service.subscribe(handleStoreChange);\n return unsubscribe;\n },\n [service],\n );\n\n const storeSnapshot = useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n );\n\n useEffect(() => {\n service.start(persistedStateRef.current as any);\n queue.forEach(service.send);\n persistedStateRef.current = service.state;\n return () => {\n service.stop();\n };\n // service and queue are stable refs from useConstant\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return [storeSnapshot, service.send, service] as const;\n}\n"],"names":[],"mappings":";;AA4BA,MAAM,4BACJ,OAAO,WAAW,cAAc,kBAAkB;AAEpD,SAAS,YAAe,IAAgB;AACtC,QAAM,MAAM,OAAA;AACZ,MAAI,CAAC,IAAI,SAAS;AAChB,QAAI,UAAU,EAAC,GAAG,GAAA,EAAG;AAAA,EACvB;AACA,SAAO,IAAI,QAAQ;AACrB;AAEA,SAAS,gBAIP,SAA2E;AAC3E,MAAI;AACJ,UAAQ,UAAU,CAAC,UAAW,eAAe,KAAM,EAAE,YAAA;AACrD,SAAO;AACT;AAEO,SAAS,WAKd,cACA,SAKA;AACA,QAAM,oBAAoB,OAAA;AAE1B,QAAM,CAAC,SAAS,KAAK,IAAI,YAAY,MAAM;AACzC,UAAM,aAAqC,CAAA;AAC3C,UAAM,MAAM;AAAA,MACV;AAAA,QACE,aAAa;AAAA,QACb,UAAU,UAAW,aAAqB;AAAA,MAAA;AAAA,IAC5C;AAEF,UAAM,eAAe,IAAI;AACzB,QAAI,OAAO,CAAC,UAA2B;AACrC,UAAI,IAAI,WAAW,kBAAkB,YAAY;AAC/C,mBAAW,KAAK,KAAK;AACrB;AAAA,MACF;AACA,mBAAa,KAAK;AAClB,wBAAkB,UAAU,IAAI;AAAA,IAClC;AACA,WAAO,CAAC,KAAK,UAAU;AAAA,EACzB,CAAC;AAKD,4BAA0B,MAAM;AAC9B,QAAI,SAAS;AACV,cAAgB,SAAS,WAAW;AAAA,IACvC;AAAA,EACF,CAAC;AAED,QAAM,cAAc,YAAY,MAAM,gBAAgB,OAAO,GAAG,CAAC,OAAO,CAAC;AAEzE,QAAM,YAAY;AAAA,IAChB,CAAC,sBAAkC;AACjC,YAAM,EAAC,YAAA,IAAe,QAAQ,UAAU,iBAAiB;AACzD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,OAAO;AAAA,EAAA;AAGV,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,YAAU,MAAM;AACd,YAAQ,MAAM,kBAAkB,OAAc;AAC9C,UAAM,QAAQ,QAAQ,IAAI;AAC1B,sBAAkB,UAAU,QAAQ;AACpC,WAAO,MAAM;AACX,cAAQ,KAAA;AAAA,IACV;AAAA,EAGF,GAAG,CAAA,CAAE;AAEL,SAAO,CAAC,eAAe,QAAQ,MAAM,OAAO;AAC9C;"}
@@ -0,0 +1,11 @@
1
+ import { StateMachine, EventObject } from '@xstate/fsm';
2
+ export declare function useMachine<TC extends object, TE extends EventObject, TS extends {
3
+ value: any;
4
+ context: TC;
5
+ }>(stateMachine: StateMachine.Machine<TC, TE, TS>, options?: {
6
+ actions?: StateMachine.ActionMap<TC, TE>;
7
+ }): readonly [
8
+ StateMachine.State<TC, TE, TS>,
9
+ StateMachine.Service<TC, TE, TS>['send'],
10
+ StateMachine.Service<TC, TE, TS>
11
+ ];