@shadowmkj/plugin-ecommerce 3.85.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 (369) hide show
  1. package/LICENSE.md +22 -0
  2. package/README.md +3 -0
  3. package/dist/collections/addresses/createAddressesCollection.d.ts.map +1 -0
  4. package/dist/collections/addresses/createAddressesCollection.js +73 -0
  5. package/dist/collections/addresses/createAddressesCollection.js.map +1 -0
  6. package/dist/collections/addresses/defaultAddressFields.d.ts.map +1 -0
  7. package/dist/collections/addresses/defaultAddressFields.js +72 -0
  8. package/dist/collections/addresses/defaultAddressFields.js.map +1 -0
  9. package/dist/collections/addresses/defaultCountries.d.ts.map +1 -0
  10. package/dist/collections/addresses/defaultCountries.js +169 -0
  11. package/dist/collections/addresses/defaultCountries.js.map +1 -0
  12. package/dist/collections/addresses/hooks/beforeChange.d.ts.map +1 -0
  13. package/dist/collections/addresses/hooks/beforeChange.js +16 -0
  14. package/dist/collections/addresses/hooks/beforeChange.js.map +1 -0
  15. package/dist/collections/carts/beforeChange.d.ts.map +1 -0
  16. package/dist/collections/carts/beforeChange.js +49 -0
  17. package/dist/collections/carts/beforeChange.js.map +1 -0
  18. package/dist/collections/carts/createCartsCollection.d.ts.map +1 -0
  19. package/dist/collections/carts/createCartsCollection.js +194 -0
  20. package/dist/collections/carts/createCartsCollection.js.map +1 -0
  21. package/dist/collections/carts/endpoints/addItem.d.ts.map +1 -0
  22. package/dist/collections/carts/endpoints/addItem.js +54 -0
  23. package/dist/collections/carts/endpoints/addItem.js.map +1 -0
  24. package/dist/collections/carts/endpoints/clearCart.d.ts.map +1 -0
  25. package/dist/collections/carts/endpoints/clearCart.js +41 -0
  26. package/dist/collections/carts/endpoints/clearCart.js.map +1 -0
  27. package/dist/collections/carts/endpoints/mergeCart.d.ts.map +1 -0
  28. package/dist/collections/carts/endpoints/mergeCart.js +72 -0
  29. package/dist/collections/carts/endpoints/mergeCart.js.map +1 -0
  30. package/dist/collections/carts/endpoints/removeItem.d.ts.map +1 -0
  31. package/dist/collections/carts/endpoints/removeItem.js +51 -0
  32. package/dist/collections/carts/endpoints/removeItem.js.map +1 -0
  33. package/dist/collections/carts/endpoints/updateItem.d.ts.map +1 -0
  34. package/dist/collections/carts/endpoints/updateItem.js +95 -0
  35. package/dist/collections/carts/endpoints/updateItem.js.map +1 -0
  36. package/dist/collections/carts/hasCartSecretAccess.d.ts.map +1 -0
  37. package/dist/collections/carts/hasCartSecretAccess.js +24 -0
  38. package/dist/collections/carts/hasCartSecretAccess.js.map +1 -0
  39. package/dist/collections/carts/operations/addItem.d.ts.map +1 -0
  40. package/dist/collections/carts/operations/addItem.js +95 -0
  41. package/dist/collections/carts/operations/addItem.js.map +1 -0
  42. package/dist/collections/carts/operations/clearCart.d.ts.map +1 -0
  43. package/dist/collections/carts/operations/clearCart.js +53 -0
  44. package/dist/collections/carts/operations/clearCart.js.map +1 -0
  45. package/dist/collections/carts/operations/createRequestWithSecret.d.ts.map +1 -0
  46. package/dist/collections/carts/operations/createRequestWithSecret.js +21 -0
  47. package/dist/collections/carts/operations/createRequestWithSecret.js.map +1 -0
  48. package/dist/collections/carts/operations/defaultCartItemMatcher.d.ts.map +1 -0
  49. package/dist/collections/carts/operations/defaultCartItemMatcher.js +25 -0
  50. package/dist/collections/carts/operations/defaultCartItemMatcher.js.map +1 -0
  51. package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js +358 -0
  52. package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js.map +1 -0
  53. package/dist/collections/carts/operations/mergeCart.d.ts.map +1 -0
  54. package/dist/collections/carts/operations/mergeCart.js +144 -0
  55. package/dist/collections/carts/operations/mergeCart.js.map +1 -0
  56. package/dist/collections/carts/operations/removeItem.d.ts.map +1 -0
  57. package/dist/collections/carts/operations/removeItem.js +69 -0
  58. package/dist/collections/carts/operations/removeItem.js.map +1 -0
  59. package/dist/collections/carts/operations/types.d.ts.map +1 -0
  60. package/dist/collections/carts/operations/types.js +7 -0
  61. package/dist/collections/carts/operations/types.js.map +1 -0
  62. package/dist/collections/carts/operations/updateItem.d.ts.map +1 -0
  63. package/dist/collections/carts/operations/updateItem.js +110 -0
  64. package/dist/collections/carts/operations/updateItem.js.map +1 -0
  65. package/dist/collections/carts/statusBeforeRead.d.ts.map +1 -0
  66. package/dist/collections/carts/statusBeforeRead.js +18 -0
  67. package/dist/collections/carts/statusBeforeRead.js.map +1 -0
  68. package/dist/collections/orders/createOrdersCollection.d.ts.map +1 -0
  69. package/dist/collections/orders/createOrdersCollection.js +163 -0
  70. package/dist/collections/orders/createOrdersCollection.js.map +1 -0
  71. package/dist/collections/products/createProductsCollection.d.ts.map +1 -0
  72. package/dist/collections/products/createProductsCollection.js +62 -0
  73. package/dist/collections/products/createProductsCollection.js.map +1 -0
  74. package/dist/collections/transactions/createTransactionsCollection.d.ts.map +1 -0
  75. package/dist/collections/transactions/createTransactionsCollection.js +157 -0
  76. package/dist/collections/transactions/createTransactionsCollection.js.map +1 -0
  77. package/dist/collections/variants/createVariantOptionsCollection.d.ts.map +1 -0
  78. package/dist/collections/variants/createVariantOptionsCollection.js +53 -0
  79. package/dist/collections/variants/createVariantOptionsCollection.js.map +1 -0
  80. package/dist/collections/variants/createVariantTypesCollection.d.ts.map +1 -0
  81. package/dist/collections/variants/createVariantTypesCollection.js +49 -0
  82. package/dist/collections/variants/createVariantTypesCollection.js.map +1 -0
  83. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.d.ts.map +1 -0
  84. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js +38 -0
  85. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js.map +1 -0
  86. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.d.ts.map +1 -0
  87. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js +58 -0
  88. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js.map +1 -0
  89. package/dist/collections/variants/createVariantsCollection/index.d.ts.map +1 -0
  90. package/dist/collections/variants/createVariantsCollection/index.js +107 -0
  91. package/dist/collections/variants/createVariantsCollection/index.js.map +1 -0
  92. package/dist/currencies/index.d.ts.map +1 -0
  93. package/dist/currencies/index.js +20 -0
  94. package/dist/currencies/index.js.map +1 -0
  95. package/dist/endpoints/confirmOrder.d.ts.map +1 -0
  96. package/dist/endpoints/confirmOrder.js +150 -0
  97. package/dist/endpoints/confirmOrder.js.map +1 -0
  98. package/dist/endpoints/initiatePayment.d.ts.map +1 -0
  99. package/dist/endpoints/initiatePayment.js +226 -0
  100. package/dist/endpoints/initiatePayment.js.map +1 -0
  101. package/dist/exports/client/index.d.ts.map +1 -0
  102. package/dist/exports/client/index.js +4 -0
  103. package/dist/exports/client/index.js.map +1 -0
  104. package/dist/exports/client/react.d.ts.map +1 -0
  105. package/dist/exports/client/react.js +5 -0
  106. package/dist/exports/client/react.js.map +1 -0
  107. package/dist/exports/payments/cod.d.ts +2 -0
  108. package/dist/exports/payments/cod.d.ts.map +1 -0
  109. package/dist/exports/payments/cod.js +3 -0
  110. package/dist/exports/payments/cod.js.map +1 -0
  111. package/dist/exports/payments/stripe.d.ts.map +1 -0
  112. package/dist/exports/payments/stripe.js +3 -0
  113. package/dist/exports/payments/stripe.js.map +1 -0
  114. package/dist/exports/rsc.d.ts.map +1 -0
  115. package/dist/exports/rsc.js +4 -0
  116. package/dist/exports/rsc.js.map +1 -0
  117. package/dist/exports/types.d.ts.map +1 -0
  118. package/dist/exports/types.js +3 -0
  119. package/dist/exports/types.js.map +1 -0
  120. package/dist/fields/amountField.d.ts.map +1 -0
  121. package/dist/fields/amountField.js +33 -0
  122. package/dist/fields/amountField.js.map +1 -0
  123. package/dist/fields/cartItemsField.d.ts.map +1 -0
  124. package/dist/fields/cartItemsField.js +55 -0
  125. package/dist/fields/cartItemsField.js.map +1 -0
  126. package/dist/fields/currencyField.d.ts.map +1 -0
  127. package/dist/fields/currencyField.js +29 -0
  128. package/dist/fields/currencyField.js.map +1 -0
  129. package/dist/fields/inventoryField.d.ts.map +1 -0
  130. package/dist/fields/inventoryField.js +16 -0
  131. package/dist/fields/inventoryField.js.map +1 -0
  132. package/dist/fields/pricesField.d.ts.map +1 -0
  133. package/dist/fields/pricesField.js +54 -0
  134. package/dist/fields/pricesField.js.map +1 -0
  135. package/dist/fields/statusField.d.ts.map +1 -0
  136. package/dist/fields/statusField.js +49 -0
  137. package/dist/fields/statusField.js.map +1 -0
  138. package/dist/fields/variantsFields.d.ts.map +1 -0
  139. package/dist/fields/variantsFields.js +48 -0
  140. package/dist/fields/variantsFields.js.map +1 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +258 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/payments/adapters/cod/confirmOrder.d.ts +5 -0
  145. package/dist/payments/adapters/cod/confirmOrder.d.ts.map +1 -0
  146. package/dist/payments/adapters/cod/confirmOrder.js +83 -0
  147. package/dist/payments/adapters/cod/confirmOrder.js.map +1 -0
  148. package/dist/payments/adapters/cod/confirmOrder.spec.js +166 -0
  149. package/dist/payments/adapters/cod/confirmOrder.spec.js.map +1 -0
  150. package/dist/payments/adapters/cod/endpoints/webhooks.d.ts +5 -0
  151. package/dist/payments/adapters/cod/endpoints/webhooks.d.ts.map +1 -0
  152. package/dist/payments/adapters/cod/endpoints/webhooks.js +18 -0
  153. package/dist/payments/adapters/cod/endpoints/webhooks.js.map +1 -0
  154. package/dist/payments/adapters/cod/index.d.ts +12 -0
  155. package/dist/payments/adapters/cod/index.d.ts.map +1 -0
  156. package/dist/payments/adapters/cod/index.js +64 -0
  157. package/dist/payments/adapters/cod/index.js.map +1 -0
  158. package/dist/payments/adapters/cod/initiatePayment.d.ts +5 -0
  159. package/dist/payments/adapters/cod/initiatePayment.d.ts.map +1 -0
  160. package/dist/payments/adapters/cod/initiatePayment.js +91 -0
  161. package/dist/payments/adapters/cod/initiatePayment.js.map +1 -0
  162. package/dist/payments/adapters/stripe/confirmOrder.d.ts.map +1 -0
  163. package/dist/payments/adapters/stripe/confirmOrder.js +113 -0
  164. package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -0
  165. package/dist/payments/adapters/stripe/confirmOrder.spec.js +166 -0
  166. package/dist/payments/adapters/stripe/confirmOrder.spec.js.map +1 -0
  167. package/dist/payments/adapters/stripe/endpoints/webhooks.d.ts.map +1 -0
  168. package/dist/payments/adapters/stripe/endpoints/webhooks.js +53 -0
  169. package/dist/payments/adapters/stripe/endpoints/webhooks.js.map +1 -0
  170. package/dist/payments/adapters/stripe/index.d.ts +61 -0
  171. package/dist/payments/adapters/stripe/index.d.ts.map +1 -0
  172. package/dist/payments/adapters/stripe/index.js +68 -0
  173. package/dist/payments/adapters/stripe/index.js.map +1 -0
  174. package/dist/payments/adapters/stripe/initiatePayment.d.ts.map +1 -0
  175. package/dist/payments/adapters/stripe/initiatePayment.js +113 -0
  176. package/dist/payments/adapters/stripe/initiatePayment.js.map +1 -0
  177. package/dist/react/provider/index.d.ts.map +1 -0
  178. package/dist/react/provider/index.js +1094 -0
  179. package/dist/react/provider/index.js.map +1 -0
  180. package/dist/react/provider/utilities.d.ts.map +1 -0
  181. package/dist/react/provider/utilities.js +13 -0
  182. package/dist/react/provider/utilities.js.map +1 -0
  183. package/dist/translations/index.d.ts.map +1 -0
  184. package/dist/translations/index.js +84 -0
  185. package/dist/translations/index.js.map +1 -0
  186. package/dist/translations/languages/ar.d.ts.map +1 -0
  187. package/dist/translations/languages/ar.js +92 -0
  188. package/dist/translations/languages/ar.js.map +1 -0
  189. package/dist/translations/languages/az.d.ts.map +1 -0
  190. package/dist/translations/languages/az.js +92 -0
  191. package/dist/translations/languages/az.js.map +1 -0
  192. package/dist/translations/languages/bg.d.ts.map +1 -0
  193. package/dist/translations/languages/bg.js +92 -0
  194. package/dist/translations/languages/bg.js.map +1 -0
  195. package/dist/translations/languages/ca.d.ts.map +1 -0
  196. package/dist/translations/languages/ca.js +92 -0
  197. package/dist/translations/languages/ca.js.map +1 -0
  198. package/dist/translations/languages/cs.d.ts.map +1 -0
  199. package/dist/translations/languages/cs.js +92 -0
  200. package/dist/translations/languages/cs.js.map +1 -0
  201. package/dist/translations/languages/da.d.ts.map +1 -0
  202. package/dist/translations/languages/da.js +92 -0
  203. package/dist/translations/languages/da.js.map +1 -0
  204. package/dist/translations/languages/de.d.ts.map +1 -0
  205. package/dist/translations/languages/de.js +92 -0
  206. package/dist/translations/languages/de.js.map +1 -0
  207. package/dist/translations/languages/en.d.ts.map +1 -0
  208. package/dist/translations/languages/en.js +92 -0
  209. package/dist/translations/languages/en.js.map +1 -0
  210. package/dist/translations/languages/es.d.ts.map +1 -0
  211. package/dist/translations/languages/es.js +92 -0
  212. package/dist/translations/languages/es.js.map +1 -0
  213. package/dist/translations/languages/et.d.ts.map +1 -0
  214. package/dist/translations/languages/et.js +92 -0
  215. package/dist/translations/languages/et.js.map +1 -0
  216. package/dist/translations/languages/fa.d.ts.map +1 -0
  217. package/dist/translations/languages/fa.js +92 -0
  218. package/dist/translations/languages/fa.js.map +1 -0
  219. package/dist/translations/languages/fr.d.ts.map +1 -0
  220. package/dist/translations/languages/fr.js +92 -0
  221. package/dist/translations/languages/fr.js.map +1 -0
  222. package/dist/translations/languages/he.d.ts.map +1 -0
  223. package/dist/translations/languages/he.js +92 -0
  224. package/dist/translations/languages/he.js.map +1 -0
  225. package/dist/translations/languages/hr.d.ts.map +1 -0
  226. package/dist/translations/languages/hr.js +92 -0
  227. package/dist/translations/languages/hr.js.map +1 -0
  228. package/dist/translations/languages/hu.d.ts.map +1 -0
  229. package/dist/translations/languages/hu.js +92 -0
  230. package/dist/translations/languages/hu.js.map +1 -0
  231. package/dist/translations/languages/hy.d.ts.map +1 -0
  232. package/dist/translations/languages/hy.js +92 -0
  233. package/dist/translations/languages/hy.js.map +1 -0
  234. package/dist/translations/languages/is.d.ts.map +1 -0
  235. package/dist/translations/languages/is.js +92 -0
  236. package/dist/translations/languages/is.js.map +1 -0
  237. package/dist/translations/languages/it.d.ts.map +1 -0
  238. package/dist/translations/languages/it.js +92 -0
  239. package/dist/translations/languages/it.js.map +1 -0
  240. package/dist/translations/languages/ja.d.ts.map +1 -0
  241. package/dist/translations/languages/ja.js +92 -0
  242. package/dist/translations/languages/ja.js.map +1 -0
  243. package/dist/translations/languages/ko.d.ts.map +1 -0
  244. package/dist/translations/languages/ko.js +92 -0
  245. package/dist/translations/languages/ko.js.map +1 -0
  246. package/dist/translations/languages/lt.d.ts.map +1 -0
  247. package/dist/translations/languages/lt.js +92 -0
  248. package/dist/translations/languages/lt.js.map +1 -0
  249. package/dist/translations/languages/my.d.ts.map +1 -0
  250. package/dist/translations/languages/my.js +92 -0
  251. package/dist/translations/languages/my.js.map +1 -0
  252. package/dist/translations/languages/nb.d.ts.map +1 -0
  253. package/dist/translations/languages/nb.js +92 -0
  254. package/dist/translations/languages/nb.js.map +1 -0
  255. package/dist/translations/languages/nl.d.ts.map +1 -0
  256. package/dist/translations/languages/nl.js +92 -0
  257. package/dist/translations/languages/nl.js.map +1 -0
  258. package/dist/translations/languages/pl.d.ts.map +1 -0
  259. package/dist/translations/languages/pl.js +92 -0
  260. package/dist/translations/languages/pl.js.map +1 -0
  261. package/dist/translations/languages/pt.d.ts.map +1 -0
  262. package/dist/translations/languages/pt.js +92 -0
  263. package/dist/translations/languages/pt.js.map +1 -0
  264. package/dist/translations/languages/ro.d.ts.map +1 -0
  265. package/dist/translations/languages/ro.js +92 -0
  266. package/dist/translations/languages/ro.js.map +1 -0
  267. package/dist/translations/languages/rs.d.ts.map +1 -0
  268. package/dist/translations/languages/rs.js +92 -0
  269. package/dist/translations/languages/rs.js.map +1 -0
  270. package/dist/translations/languages/rsLatin.d.ts.map +1 -0
  271. package/dist/translations/languages/rsLatin.js +92 -0
  272. package/dist/translations/languages/rsLatin.js.map +1 -0
  273. package/dist/translations/languages/ru.d.ts.map +1 -0
  274. package/dist/translations/languages/ru.js +92 -0
  275. package/dist/translations/languages/ru.js.map +1 -0
  276. package/dist/translations/languages/sk.d.ts.map +1 -0
  277. package/dist/translations/languages/sk.js +92 -0
  278. package/dist/translations/languages/sk.js.map +1 -0
  279. package/dist/translations/languages/sl.d.ts.map +1 -0
  280. package/dist/translations/languages/sl.js +92 -0
  281. package/dist/translations/languages/sl.js.map +1 -0
  282. package/dist/translations/languages/sv.d.ts.map +1 -0
  283. package/dist/translations/languages/sv.js +92 -0
  284. package/dist/translations/languages/sv.js.map +1 -0
  285. package/dist/translations/languages/ta.d.ts.map +1 -0
  286. package/dist/translations/languages/ta.js +92 -0
  287. package/dist/translations/languages/ta.js.map +1 -0
  288. package/dist/translations/languages/th.d.ts.map +1 -0
  289. package/dist/translations/languages/th.js +92 -0
  290. package/dist/translations/languages/th.js.map +1 -0
  291. package/dist/translations/languages/tr.d.ts.map +1 -0
  292. package/dist/translations/languages/tr.js +92 -0
  293. package/dist/translations/languages/tr.js.map +1 -0
  294. package/dist/translations/languages/uk.d.ts.map +1 -0
  295. package/dist/translations/languages/uk.js +92 -0
  296. package/dist/translations/languages/uk.js.map +1 -0
  297. package/dist/translations/languages/vi.d.ts.map +1 -0
  298. package/dist/translations/languages/vi.js +92 -0
  299. package/dist/translations/languages/vi.js.map +1 -0
  300. package/dist/translations/languages/zh.d.ts.map +1 -0
  301. package/dist/translations/languages/zh.js +92 -0
  302. package/dist/translations/languages/zh.js.map +1 -0
  303. package/dist/translations/languages/zhTw.d.ts.map +1 -0
  304. package/dist/translations/languages/zhTw.js +92 -0
  305. package/dist/translations/languages/zhTw.js.map +1 -0
  306. package/dist/translations/translation-schema.json +343 -0
  307. package/dist/translations/types.d.ts.map +1 -0
  308. package/dist/translations/types.js +3 -0
  309. package/dist/translations/types.js.map +1 -0
  310. package/dist/types/index.d.ts.map +1 -0
  311. package/dist/types/index.js +3 -0
  312. package/dist/types/index.js.map +1 -0
  313. package/dist/types/utilities.d.ts.map +1 -0
  314. package/dist/types/utilities.js +3 -0
  315. package/dist/types/utilities.js.map +1 -0
  316. package/dist/ui/PriceCell/index.d.ts.map +1 -0
  317. package/dist/ui/PriceCell/index.js +36 -0
  318. package/dist/ui/PriceCell/index.js.map +1 -0
  319. package/dist/ui/PriceInput/FormattedInput.d.ts.map +1 -0
  320. package/dist/ui/PriceInput/FormattedInput.js +147 -0
  321. package/dist/ui/PriceInput/FormattedInput.js.map +1 -0
  322. package/dist/ui/PriceInput/index.css +35 -0
  323. package/dist/ui/PriceInput/index.d.ts.map +1 -0
  324. package/dist/ui/PriceInput/index.js +21 -0
  325. package/dist/ui/PriceInput/index.js.map +1 -0
  326. package/dist/ui/PriceRowLabel/index.css +13 -0
  327. package/dist/ui/PriceRowLabel/index.d.ts.map +1 -0
  328. package/dist/ui/PriceRowLabel/index.js +66 -0
  329. package/dist/ui/PriceRowLabel/index.js.map +1 -0
  330. package/dist/ui/VariantOptionsSelector/ErrorBox.d.ts.map +1 -0
  331. package/dist/ui/VariantOptionsSelector/ErrorBox.js +28 -0
  332. package/dist/ui/VariantOptionsSelector/ErrorBox.js.map +1 -0
  333. package/dist/ui/VariantOptionsSelector/OptionsSelect.d.ts.map +1 -0
  334. package/dist/ui/VariantOptionsSelector/OptionsSelect.js +71 -0
  335. package/dist/ui/VariantOptionsSelector/OptionsSelect.js.map +1 -0
  336. package/dist/ui/VariantOptionsSelector/index.css +37 -0
  337. package/dist/ui/VariantOptionsSelector/index.d.ts.map +1 -0
  338. package/dist/ui/VariantOptionsSelector/index.js +81 -0
  339. package/dist/ui/VariantOptionsSelector/index.js.map +1 -0
  340. package/dist/ui/utilities.d.ts.map +1 -0
  341. package/dist/ui/utilities.js +40 -0
  342. package/dist/ui/utilities.js.map +1 -0
  343. package/dist/utilities/accessComposition.d.ts.map +1 -0
  344. package/dist/utilities/accessComposition.js +103 -0
  345. package/dist/utilities/accessComposition.js.map +1 -0
  346. package/dist/utilities/accessComposition.spec.js +765 -0
  347. package/dist/utilities/accessComposition.spec.js.map +1 -0
  348. package/dist/utilities/defaultProductsValidation.d.ts.map +1 -0
  349. package/dist/utilities/defaultProductsValidation.js +40 -0
  350. package/dist/utilities/defaultProductsValidation.js.map +1 -0
  351. package/dist/utilities/defaultProductsValidation.spec.js +384 -0
  352. package/dist/utilities/defaultProductsValidation.spec.js.map +1 -0
  353. package/dist/utilities/errorCodes.d.ts.map +1 -0
  354. package/dist/utilities/errorCodes.js +4 -0
  355. package/dist/utilities/errorCodes.js.map +1 -0
  356. package/dist/utilities/getCollectionSlugMap.d.ts.map +1 -0
  357. package/dist/utilities/getCollectionSlugMap.js +36 -0
  358. package/dist/utilities/getCollectionSlugMap.js.map +1 -0
  359. package/dist/utilities/getCollectionSlugMap.spec.js +254 -0
  360. package/dist/utilities/getCollectionSlugMap.spec.js.map +1 -0
  361. package/dist/utilities/pushTypeScriptProperties.d.ts.map +1 -0
  362. package/dist/utilities/pushTypeScriptProperties.js +37 -0
  363. package/dist/utilities/pushTypeScriptProperties.js.map +1 -0
  364. package/dist/utilities/sanitizePluginConfig.d.ts.map +1 -0
  365. package/dist/utilities/sanitizePluginConfig.js +75 -0
  366. package/dist/utilities/sanitizePluginConfig.js.map +1 -0
  367. package/dist/utilities/sanitizePluginConfig.spec.js +516 -0
  368. package/dist/utilities/sanitizePluginConfig.spec.js.map +1 -0
  369. package/package.json +114 -0
@@ -0,0 +1,1094 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { deepMergeSimple, formatAdminURL } from 'payload/shared';
4
+ import * as qs from 'qs-esm';
5
+ import React, { createContext, use, useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
+ const defaultContext = {
7
+ addItem: async ()=>{},
8
+ clearCart: async ()=>{},
9
+ clearSession: ()=>{},
10
+ config: {
11
+ addressesSlug: 'addresses',
12
+ api: {
13
+ apiRoute: '/api'
14
+ },
15
+ cartsSlug: 'carts',
16
+ customersSlug: 'users'
17
+ },
18
+ confirmOrder: async ()=>{},
19
+ createAddress: async ()=>{},
20
+ currenciesConfig: {
21
+ defaultCurrency: 'USD',
22
+ supportedCurrencies: [
23
+ {
24
+ code: 'USD',
25
+ decimals: 2,
26
+ label: 'US Dollar',
27
+ symbol: '$'
28
+ }
29
+ ]
30
+ },
31
+ currency: {
32
+ code: 'USD',
33
+ decimals: 2,
34
+ label: 'US Dollar',
35
+ symbol: '$'
36
+ },
37
+ decrementItem: async ()=>{},
38
+ incrementItem: async ()=>{},
39
+ initiatePayment: async ()=>{},
40
+ isLoading: false,
41
+ mergeCart: async ()=>{},
42
+ onLogin: async ()=>{},
43
+ onLogout: ()=>{},
44
+ paymentMethods: [],
45
+ refreshCart: async ()=>{},
46
+ removeItem: async ()=>{},
47
+ setCurrency: ()=>{},
48
+ updateAddress: async ()=>{},
49
+ user: null
50
+ };
51
+ const EcommerceContext = /*#__PURE__*/ createContext(defaultContext);
52
+ const defaultLocalStorage = {
53
+ key: 'cart'
54
+ };
55
+ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug = 'carts', children, currenciesConfig = {
56
+ defaultCurrency: 'USD',
57
+ supportedCurrencies: [
58
+ {
59
+ code: 'USD',
60
+ decimals: 2,
61
+ label: 'US Dollar',
62
+ symbol: '$'
63
+ }
64
+ ]
65
+ }, customersSlug = 'users', debug = false, paymentMethods = [], syncLocalStorage = true })=>{
66
+ const localStorageConfig = syncLocalStorage && typeof syncLocalStorage === 'object' ? {
67
+ ...defaultLocalStorage,
68
+ ...syncLocalStorage
69
+ } : defaultLocalStorage;
70
+ const { apiRoute = '/api', cartsFetchQuery = {} } = api || {};
71
+ const baseAPIURL = formatAdminURL({
72
+ apiRoute,
73
+ path: ''
74
+ });
75
+ const config = useMemo(()=>({
76
+ addressesSlug,
77
+ api: {
78
+ apiRoute
79
+ },
80
+ cartsSlug,
81
+ customersSlug
82
+ }), [
83
+ addressesSlug,
84
+ apiRoute,
85
+ cartsSlug,
86
+ customersSlug
87
+ ]);
88
+ const [isLoading, setIsLoading] = useState(false);
89
+ const [user, setUser] = useState(null);
90
+ const [addresses, setAddresses] = useState();
91
+ const hasRendered = useRef(false);
92
+ /**
93
+ * The ID of the cart associated with the current session.
94
+ * This is used to identify the cart in the database or local storage.
95
+ * It can be null if no cart has been created yet.
96
+ */ const [cartID, setCartID] = useState();
97
+ /**
98
+ * The secret for accessing guest carts without authentication.
99
+ * This is generated when a guest user creates a cart.
100
+ */ const [cartSecret, setCartSecret] = useState(undefined);
101
+ const [cart, setCart] = useState();
102
+ const [selectedCurrency, setSelectedCurrency] = useState(()=>currenciesConfig.supportedCurrencies.find((c)=>c.code === currenciesConfig.defaultCurrency));
103
+ const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);
104
+ const cartQuery = useMemo(()=>{
105
+ const priceField = `priceIn${selectedCurrency.code}`;
106
+ const baseQuery = {
107
+ depth: 0,
108
+ populate: {
109
+ products: {
110
+ [priceField]: true
111
+ },
112
+ variants: {
113
+ options: true,
114
+ [priceField]: true
115
+ }
116
+ },
117
+ select: {
118
+ items: true,
119
+ subtotal: true
120
+ }
121
+ };
122
+ return deepMergeSimple(baseQuery, cartsFetchQuery);
123
+ }, [
124
+ selectedCurrency.code,
125
+ cartsFetchQuery
126
+ ]);
127
+ const createCart = useCallback(async (initialData)=>{
128
+ const query = qs.stringify(cartQuery);
129
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}?${query}`, {
130
+ body: JSON.stringify({
131
+ ...initialData,
132
+ currency: selectedCurrency.code,
133
+ customer: user?.id
134
+ }),
135
+ credentials: 'include',
136
+ headers: {
137
+ 'Content-Type': 'application/json'
138
+ },
139
+ method: 'POST'
140
+ });
141
+ if (!response.ok) {
142
+ const errorText = await response.text();
143
+ throw new Error(`Failed to create cart: ${errorText}`);
144
+ }
145
+ const data = await response.json();
146
+ if (data.error) {
147
+ throw new Error(`Cart creation error: ${data.error}`);
148
+ }
149
+ // Store the secret for guest cart access
150
+ if (!user && data.doc?.secret) {
151
+ setCartSecret(data.doc.secret);
152
+ }
153
+ return data.doc;
154
+ }, [
155
+ baseAPIURL,
156
+ cartQuery,
157
+ cartsSlug,
158
+ selectedCurrency.code,
159
+ user
160
+ ]);
161
+ const getCart = useCallback(async (cartID, options)=>{
162
+ const query = qs.stringify({
163
+ ...cartQuery,
164
+ ...options?.secret ? {
165
+ secret: options.secret
166
+ } : {}
167
+ });
168
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}?${query}`, {
169
+ credentials: 'include',
170
+ headers: {
171
+ 'Content-Type': 'application/json'
172
+ },
173
+ method: 'GET'
174
+ });
175
+ if (!response.ok) {
176
+ const errorText = await response.text();
177
+ throw new Error(`Failed to fetch cart: ${errorText}`);
178
+ }
179
+ const data = await response.json();
180
+ if (data.error) {
181
+ throw new Error(`Cart fetch error: ${data.error}`);
182
+ }
183
+ return data;
184
+ }, [
185
+ baseAPIURL,
186
+ cartQuery,
187
+ cartsSlug
188
+ ]);
189
+ const refreshCart = useCallback(async ()=>{
190
+ if (!cartID) {
191
+ return;
192
+ }
193
+ const updatedCart = await getCart(cartID);
194
+ setCart(updatedCart);
195
+ }, [
196
+ cartID,
197
+ getCart
198
+ ]);
199
+ // Persist cart ID and secret to localStorage
200
+ useEffect(()=>{
201
+ if (hasRendered.current) {
202
+ if (syncLocalStorage) {
203
+ if (cartID) {
204
+ localStorage.setItem(localStorageConfig.key, cartID);
205
+ } else {
206
+ localStorage.removeItem(localStorageConfig.key);
207
+ }
208
+ if (cartSecret) {
209
+ localStorage.setItem(`${localStorageConfig.key}_secret`, cartSecret);
210
+ } else {
211
+ localStorage.removeItem(`${localStorageConfig.key}_secret`);
212
+ }
213
+ }
214
+ }
215
+ }, [
216
+ cartID,
217
+ cartSecret,
218
+ localStorageConfig.key,
219
+ syncLocalStorage
220
+ ]);
221
+ const addItem = useCallback(async (item, quantity = 1)=>{
222
+ setIsLoading(true);
223
+ try {
224
+ if (cartID) {
225
+ // Use server-side endpoint for adding items
226
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/add-item`, {
227
+ body: JSON.stringify({
228
+ item,
229
+ quantity,
230
+ secret: cartSecret
231
+ }),
232
+ credentials: 'include',
233
+ headers: {
234
+ 'Content-Type': 'application/json'
235
+ },
236
+ method: 'POST'
237
+ });
238
+ if (!response.ok) {
239
+ const errorText = await response.text();
240
+ throw new Error(`Failed to add item: ${errorText}`);
241
+ }
242
+ const result = await response.json();
243
+ if (!result.success) {
244
+ // Cart not found - reset state
245
+ setCartID(undefined);
246
+ setCart(undefined);
247
+ setCartSecret(undefined);
248
+ return;
249
+ }
250
+ // Refresh cart with proper depth/populate settings for UI
251
+ const refreshedCart = await getCart(cartID, {
252
+ secret: cartSecret
253
+ });
254
+ setCart(refreshedCart);
255
+ } else {
256
+ // If no cartID exists, create a new cart with the item
257
+ const newCart = await createCart({
258
+ items: [
259
+ {
260
+ ...item,
261
+ quantity
262
+ }
263
+ ]
264
+ });
265
+ setCartID(newCart.id);
266
+ setCart(newCart);
267
+ }
268
+ } catch (error) {
269
+ if (debug) {
270
+ // eslint-disable-next-line no-console
271
+ console.error('Error adding item to cart:', error);
272
+ }
273
+ } finally{
274
+ setIsLoading(false);
275
+ }
276
+ }, [
277
+ baseAPIURL,
278
+ cartID,
279
+ cartSecret,
280
+ cartsSlug,
281
+ createCart,
282
+ debug,
283
+ getCart
284
+ ]);
285
+ const removeItem = useCallback(async (targetID)=>{
286
+ if (!cartID) {
287
+ return;
288
+ }
289
+ setIsLoading(true);
290
+ try {
291
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/remove-item`, {
292
+ body: JSON.stringify({
293
+ itemID: targetID,
294
+ secret: cartSecret
295
+ }),
296
+ credentials: 'include',
297
+ headers: {
298
+ 'Content-Type': 'application/json'
299
+ },
300
+ method: 'POST'
301
+ });
302
+ if (!response.ok) {
303
+ const errorText = await response.text();
304
+ throw new Error(`Failed to remove item: ${errorText}`);
305
+ }
306
+ const result = await response.json();
307
+ if (!result.success) {
308
+ // Cart not found - reset state
309
+ setCartID(undefined);
310
+ setCart(undefined);
311
+ setCartSecret(undefined);
312
+ return;
313
+ }
314
+ // Refresh cart with proper depth/populate settings for UI
315
+ const refreshedCart = await getCart(cartID, {
316
+ secret: cartSecret
317
+ });
318
+ setCart(refreshedCart);
319
+ } catch (error) {
320
+ if (debug) {
321
+ // eslint-disable-next-line no-console
322
+ console.error('Error removing item from cart:', error);
323
+ }
324
+ } finally{
325
+ setIsLoading(false);
326
+ }
327
+ }, [
328
+ baseAPIURL,
329
+ cartID,
330
+ cartSecret,
331
+ cartsSlug,
332
+ debug,
333
+ getCart
334
+ ]);
335
+ const incrementItem = useCallback(async (targetID)=>{
336
+ if (!cartID) {
337
+ return;
338
+ }
339
+ setIsLoading(true);
340
+ try {
341
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/update-item`, {
342
+ body: JSON.stringify({
343
+ itemID: targetID,
344
+ quantity: {
345
+ $inc: 1
346
+ },
347
+ secret: cartSecret
348
+ }),
349
+ credentials: 'include',
350
+ headers: {
351
+ 'Content-Type': 'application/json'
352
+ },
353
+ method: 'POST'
354
+ });
355
+ if (!response.ok) {
356
+ const errorText = await response.text();
357
+ throw new Error(`Failed to increment item: ${errorText}`);
358
+ }
359
+ const result = await response.json();
360
+ if (!result.success) {
361
+ // Cart not found - reset state
362
+ setCartID(undefined);
363
+ setCart(undefined);
364
+ setCartSecret(undefined);
365
+ return;
366
+ }
367
+ // Refresh cart with proper depth/populate settings for UI
368
+ const refreshedCart = await getCart(cartID, {
369
+ secret: cartSecret
370
+ });
371
+ setCart(refreshedCart);
372
+ } catch (error) {
373
+ if (debug) {
374
+ // eslint-disable-next-line no-console
375
+ console.error('Error incrementing item quantity:', error);
376
+ }
377
+ } finally{
378
+ setIsLoading(false);
379
+ }
380
+ }, [
381
+ baseAPIURL,
382
+ cartID,
383
+ cartSecret,
384
+ cartsSlug,
385
+ debug,
386
+ getCart
387
+ ]);
388
+ const decrementItem = useCallback(async (targetID)=>{
389
+ if (!cartID) {
390
+ return;
391
+ }
392
+ setIsLoading(true);
393
+ try {
394
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/update-item`, {
395
+ body: JSON.stringify({
396
+ itemID: targetID,
397
+ quantity: {
398
+ $inc: -1
399
+ },
400
+ secret: cartSecret
401
+ }),
402
+ credentials: 'include',
403
+ headers: {
404
+ 'Content-Type': 'application/json'
405
+ },
406
+ method: 'POST'
407
+ });
408
+ if (!response.ok) {
409
+ const errorText = await response.text();
410
+ throw new Error(`Failed to decrement item: ${errorText}`);
411
+ }
412
+ const result = await response.json();
413
+ if (!result.success) {
414
+ // Cart not found - reset state
415
+ setCartID(undefined);
416
+ setCart(undefined);
417
+ setCartSecret(undefined);
418
+ return;
419
+ }
420
+ // Refresh cart with proper depth/populate settings for UI
421
+ const refreshedCart = await getCart(cartID, {
422
+ secret: cartSecret
423
+ });
424
+ setCart(refreshedCart);
425
+ } catch (error) {
426
+ if (debug) {
427
+ // eslint-disable-next-line no-console
428
+ console.error('Error decrementing item quantity:', error);
429
+ }
430
+ } finally{
431
+ setIsLoading(false);
432
+ }
433
+ }, [
434
+ baseAPIURL,
435
+ cartID,
436
+ cartSecret,
437
+ cartsSlug,
438
+ debug,
439
+ getCart
440
+ ]);
441
+ const clearCart = useCallback(async ()=>{
442
+ if (!cartID) {
443
+ return;
444
+ }
445
+ setIsLoading(true);
446
+ try {
447
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/clear`, {
448
+ body: JSON.stringify({
449
+ secret: cartSecret
450
+ }),
451
+ credentials: 'include',
452
+ headers: {
453
+ 'Content-Type': 'application/json'
454
+ },
455
+ method: 'POST'
456
+ });
457
+ if (!response.ok) {
458
+ const errorText = await response.text();
459
+ throw new Error(`Failed to clear cart: ${errorText}`);
460
+ }
461
+ const result = await response.json();
462
+ if (!result.success) {
463
+ // Cart not found - reset state
464
+ setCartID(undefined);
465
+ setCart(undefined);
466
+ setCartSecret(undefined);
467
+ return;
468
+ }
469
+ // Refresh cart with proper depth/populate settings for UI
470
+ const refreshedCart = await getCart(cartID, {
471
+ secret: cartSecret
472
+ });
473
+ setCart(refreshedCart);
474
+ } catch (error) {
475
+ if (debug) {
476
+ // eslint-disable-next-line no-console
477
+ console.error('Error clearing cart:', error);
478
+ }
479
+ } finally{
480
+ setIsLoading(false);
481
+ }
482
+ }, [
483
+ baseAPIURL,
484
+ cartID,
485
+ cartSecret,
486
+ cartsSlug,
487
+ debug,
488
+ getCart
489
+ ]);
490
+ const setCurrency = useCallback((currency)=>{
491
+ if (selectedCurrency.code === currency) {
492
+ return;
493
+ }
494
+ const foundCurrency = currenciesConfig.supportedCurrencies.find((c)=>c.code === currency);
495
+ if (!foundCurrency) {
496
+ throw new Error(`Currency with code "${currency}" not found in config`);
497
+ }
498
+ setSelectedCurrency(foundCurrency);
499
+ }, [
500
+ currenciesConfig.supportedCurrencies,
501
+ selectedCurrency.code
502
+ ]);
503
+ const initiatePayment = useCallback(async (paymentMethodID, options)=>{
504
+ const paymentMethod = paymentMethods.find((method)=>method.name === paymentMethodID);
505
+ if (!paymentMethod) {
506
+ throw new Error(`Payment method with ID "${paymentMethodID}" not found`);
507
+ }
508
+ if (!cartID) {
509
+ throw new Error(`No cart is provided.`);
510
+ }
511
+ setSelectedPaymentMethod(paymentMethodID);
512
+ if (paymentMethod.initiatePayment) {
513
+ try {
514
+ const response = await fetch(`${baseAPIURL}/payments/${paymentMethodID}/initiate`, {
515
+ body: JSON.stringify({
516
+ cartID,
517
+ currency: selectedCurrency.code,
518
+ secret: cartSecret,
519
+ ...options?.additionalData || {}
520
+ }),
521
+ credentials: 'include',
522
+ headers: {
523
+ 'Content-Type': 'application/json'
524
+ },
525
+ method: 'POST'
526
+ });
527
+ if (!response.ok) {
528
+ const responseError = await response.text();
529
+ throw new Error(responseError);
530
+ }
531
+ const responseData = await response.json();
532
+ if (responseData.error) {
533
+ throw new Error(responseData.error);
534
+ }
535
+ return responseData;
536
+ } catch (error) {
537
+ if (debug) {
538
+ // eslint-disable-next-line no-console
539
+ console.error('Error initiating payment:', error);
540
+ }
541
+ throw new Error(error instanceof Error ? error.message : 'Failed to initiate payment');
542
+ }
543
+ } else {
544
+ throw new Error(`Payment method "${paymentMethodID}" does not support payment initiation`);
545
+ }
546
+ }, [
547
+ baseAPIURL,
548
+ cartID,
549
+ cartSecret,
550
+ debug,
551
+ paymentMethods,
552
+ selectedCurrency.code
553
+ ]);
554
+ const confirmOrder = useCallback(async (paymentMethodID, options)=>{
555
+ if (!cartID) {
556
+ throw new Error(`Cart is empty.`);
557
+ }
558
+ const paymentMethod = paymentMethods.find((pm)=>pm.name === paymentMethodID);
559
+ if (!paymentMethod) {
560
+ throw new Error(`Payment method with ID "${paymentMethodID}" not found`);
561
+ }
562
+ if (paymentMethod.confirmOrder) {
563
+ const response = await fetch(`${baseAPIURL}/payments/${paymentMethodID}/confirm-order`, {
564
+ body: JSON.stringify({
565
+ cartID,
566
+ currency: selectedCurrency.code,
567
+ secret: cartSecret,
568
+ ...options?.additionalData || {}
569
+ }),
570
+ credentials: 'include',
571
+ headers: {
572
+ 'Content-Type': 'application/json'
573
+ },
574
+ method: 'POST'
575
+ });
576
+ if (!response.ok) {
577
+ const responseError = await response.text();
578
+ throw new Error(responseError);
579
+ }
580
+ const responseData = await response.json();
581
+ if (responseData.error) {
582
+ throw new Error(responseData.error);
583
+ }
584
+ return responseData;
585
+ } else {
586
+ throw new Error(`Payment method "${paymentMethodID}" does not support order confirmation`);
587
+ }
588
+ }, [
589
+ baseAPIURL,
590
+ cartID,
591
+ cartSecret,
592
+ paymentMethods,
593
+ selectedCurrency.code
594
+ ]);
595
+ const getUser = useCallback(async ()=>{
596
+ try {
597
+ const query = qs.stringify({
598
+ depth: 0,
599
+ select: {
600
+ id: true,
601
+ cart: true
602
+ }
603
+ });
604
+ const response = await fetch(`${baseAPIURL}/${customersSlug}/me?${query}`, {
605
+ credentials: 'include',
606
+ headers: {
607
+ 'Content-Type': 'application/json'
608
+ },
609
+ method: 'GET'
610
+ });
611
+ if (!response.ok) {
612
+ const errorText = await response.text();
613
+ throw new Error(`Failed to fetch user: ${errorText}`);
614
+ }
615
+ const userData = await response.json();
616
+ if (userData.error) {
617
+ throw new Error(`User fetch error: ${userData.error}`);
618
+ }
619
+ if (userData.user) {
620
+ setUser(userData.user);
621
+ return userData.user;
622
+ }
623
+ } catch (error) {
624
+ if (debug) {
625
+ // eslint-disable-next-line no-console
626
+ console.error('Error fetching user:', error);
627
+ }
628
+ setUser(null);
629
+ throw new Error(`Failed to fetch user: ${error instanceof Error ? error.message : 'Unknown error'}`);
630
+ }
631
+ }, [
632
+ baseAPIURL,
633
+ customersSlug,
634
+ debug
635
+ ]);
636
+ const getAddresses = useCallback(async ()=>{
637
+ if (!user) {
638
+ return;
639
+ }
640
+ try {
641
+ const query = qs.stringify({
642
+ depth: 0,
643
+ limit: 0,
644
+ pagination: false
645
+ });
646
+ const response = await fetch(`${baseAPIURL}/${addressesSlug}?${query}`, {
647
+ credentials: 'include',
648
+ headers: {
649
+ 'Content-Type': 'application/json'
650
+ },
651
+ method: 'GET'
652
+ });
653
+ if (!response.ok) {
654
+ const errorText = await response.text();
655
+ throw new Error(errorText);
656
+ }
657
+ const data = await response.json();
658
+ if (data.error) {
659
+ throw new Error(`Address fetch error: ${data.error}`);
660
+ }
661
+ if (data.docs && data.docs.length > 0) {
662
+ setAddresses(data.docs);
663
+ }
664
+ } catch (error) {
665
+ if (debug) {
666
+ // eslint-disable-next-line no-console
667
+ console.error('Error fetching addresses:', error);
668
+ }
669
+ setAddresses(undefined);
670
+ throw new Error(`Failed to fetch addresses: ${error instanceof Error ? error.message : 'Unknown error'}`);
671
+ }
672
+ }, [
673
+ user,
674
+ baseAPIURL,
675
+ addressesSlug,
676
+ debug
677
+ ]);
678
+ const updateAddress = useCallback(async (addressID, address)=>{
679
+ if (!user) {
680
+ throw new Error('User must be logged in to update or create an address');
681
+ }
682
+ try {
683
+ const response = await fetch(`${baseAPIURL}/${addressesSlug}/${addressID}`, {
684
+ body: JSON.stringify(address),
685
+ credentials: 'include',
686
+ headers: {
687
+ 'Content-Type': 'application/json'
688
+ },
689
+ method: 'PATCH'
690
+ });
691
+ if (!response.ok) {
692
+ const errorText = await response.text();
693
+ throw new Error(`Failed to update or create address: ${errorText}`);
694
+ }
695
+ const data = await response.json();
696
+ if (data.error) {
697
+ throw new Error(`Address update/create error: ${data.error}`);
698
+ }
699
+ // Refresh addresses after updating or creating
700
+ await getAddresses();
701
+ } catch (error) {
702
+ if (debug) {
703
+ // eslint-disable-next-line no-console
704
+ console.error('Error updating or creating address:', error);
705
+ }
706
+ throw new Error(`Failed to update or create address: ${error instanceof Error ? error.message : 'Unknown error'}`);
707
+ }
708
+ }, [
709
+ user,
710
+ baseAPIURL,
711
+ addressesSlug,
712
+ getAddresses,
713
+ debug
714
+ ]);
715
+ const createAddress = useCallback(async (address)=>{
716
+ if (!user) {
717
+ throw new Error('User must be logged in to update or create an address');
718
+ }
719
+ try {
720
+ const response = await fetch(`${baseAPIURL}/${addressesSlug}`, {
721
+ body: JSON.stringify(address),
722
+ credentials: 'include',
723
+ headers: {
724
+ 'Content-Type': 'application/json'
725
+ },
726
+ method: 'POST'
727
+ });
728
+ if (!response.ok) {
729
+ const errorText = await response.text();
730
+ throw new Error(`Failed to update or create address: ${errorText}`);
731
+ }
732
+ const data = await response.json();
733
+ if (data.error) {
734
+ throw new Error(`Address update/create error: ${data.error}`);
735
+ }
736
+ // Refresh addresses after updating or creating
737
+ await getAddresses();
738
+ } catch (error) {
739
+ if (debug) {
740
+ // eslint-disable-next-line no-console
741
+ console.error('Error updating or creating address:', error);
742
+ }
743
+ throw new Error(`Failed to update or create address: ${error instanceof Error ? error.message : 'Unknown error'}`);
744
+ }
745
+ }, [
746
+ user,
747
+ baseAPIURL,
748
+ addressesSlug,
749
+ getAddresses,
750
+ debug
751
+ ]);
752
+ /**
753
+ * Clears all ecommerce session data from state and localStorage.
754
+ * Used during logout to ensure no user data persists.
755
+ */ const clearSession = useCallback(()=>{
756
+ setCart(undefined);
757
+ setCartID(undefined);
758
+ setCartSecret(undefined);
759
+ setAddresses(undefined);
760
+ setUser(null);
761
+ if (syncLocalStorage) {
762
+ localStorage.removeItem(localStorageConfig.key);
763
+ localStorage.removeItem(`${localStorageConfig.key}_secret`);
764
+ }
765
+ }, [
766
+ localStorageConfig.key,
767
+ syncLocalStorage
768
+ ]);
769
+ /**
770
+ * Called during logout. Clears all session data.
771
+ */ const onLogout = useCallback(()=>{
772
+ clearSession();
773
+ }, [
774
+ clearSession
775
+ ]);
776
+ /**
777
+ * Merges items from a source cart into a target cart.
778
+ * Useful for merging a guest cart into a user's existing cart after login.
779
+ *
780
+ * @param targetCartID - The ID of the cart to merge items into
781
+ * @param sourceCartID - The ID of the cart to merge items from
782
+ * @param sourceSecret - The secret for the source cart (required for guest carts)
783
+ * @returns The merged cart
784
+ */ const mergeCart = useCallback(async (targetCartID, sourceCartID, sourceSecret)=>{
785
+ setIsLoading(true);
786
+ try {
787
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${targetCartID}/merge`, {
788
+ body: JSON.stringify({
789
+ sourceCartID,
790
+ sourceSecret
791
+ }),
792
+ credentials: 'include',
793
+ headers: {
794
+ 'Content-Type': 'application/json'
795
+ },
796
+ method: 'POST'
797
+ });
798
+ if (!response.ok) {
799
+ const errorText = await response.text();
800
+ throw new Error(`Failed to merge carts: ${errorText}`);
801
+ }
802
+ const result = await response.json();
803
+ if (!result.success) {
804
+ throw new Error(result.message || 'Failed to merge carts');
805
+ }
806
+ // Refresh cart with proper depth/populate settings for UI
807
+ const refreshedCart = await getCart(targetCartID);
808
+ setCart(refreshedCart);
809
+ setCartID(targetCartID);
810
+ return refreshedCart;
811
+ } catch (error) {
812
+ if (debug) {
813
+ // eslint-disable-next-line no-console
814
+ console.error('Error merging carts:', error);
815
+ }
816
+ throw error;
817
+ } finally{
818
+ setIsLoading(false);
819
+ }
820
+ }, [
821
+ baseAPIURL,
822
+ cartsSlug,
823
+ debug,
824
+ getCart
825
+ ]);
826
+ /**
827
+ * Called after login to properly set up cart state.
828
+ * Handles merging guest cart with user's existing cart if applicable.
829
+ */ const onLogin = useCallback(async ()=>{
830
+ // Store reference to any existing guest cart before fetching user
831
+ const guestCartID = cartID;
832
+ const guestSecret = cartSecret;
833
+ // Fetch fresh user data
834
+ const fetchedUser = await getUser();
835
+ if (!fetchedUser) {
836
+ // No user means login failed, keep current state
837
+ return;
838
+ }
839
+ // Clear the guest cart secret - authenticated users don't need it
840
+ setCartSecret(undefined);
841
+ if (syncLocalStorage) {
842
+ localStorage.removeItem(`${localStorageConfig.key}_secret`);
843
+ }
844
+ // Check if user has an existing cart
845
+ const userCartID = fetchedUser.cart?.docs && fetchedUser.cart.docs.length > 0 ? typeof fetchedUser.cart.docs[0] === 'object' ? fetchedUser.cart.docs[0].id : fetchedUser.cart.docs[0] : undefined;
846
+ if (guestCartID && guestSecret) {
847
+ // Guest had a cart - need to handle merge/transfer
848
+ if (userCartID) {
849
+ // User has existing cart - merge guest cart into user's cart
850
+ try {
851
+ await mergeCart(userCartID, guestCartID, guestSecret);
852
+ } catch (error) {
853
+ if (debug) {
854
+ // eslint-disable-next-line no-console
855
+ console.error('Error merging carts:', error);
856
+ }
857
+ // Fall back to user's cart
858
+ const userCart = await getCart(userCartID);
859
+ setCart(userCart);
860
+ setCartID(userCartID);
861
+ }
862
+ } else {
863
+ // User has no existing cart - transfer guest cart to user
864
+ try {
865
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${guestCartID}?secret=${guestSecret}`, {
866
+ body: JSON.stringify({
867
+ customer: fetchedUser.id,
868
+ secret: null
869
+ }),
870
+ credentials: 'include',
871
+ headers: {
872
+ 'Content-Type': 'application/json'
873
+ },
874
+ method: 'PATCH'
875
+ });
876
+ if (response.ok) {
877
+ // Fetch updated cart
878
+ const updatedCart = await getCart(guestCartID);
879
+ setCart(updatedCart);
880
+ setCartID(guestCartID);
881
+ }
882
+ } catch (error) {
883
+ if (debug) {
884
+ // eslint-disable-next-line no-console
885
+ console.error('Error transferring cart to user:', error);
886
+ }
887
+ }
888
+ }
889
+ } else if (userCartID) {
890
+ // No guest cart, but user has a cart - fetch it
891
+ const userCart = await getCart(userCartID);
892
+ setCart(userCart);
893
+ setCartID(userCartID);
894
+ }
895
+ // Update localStorage with user's cart ID (no secret needed)
896
+ if (syncLocalStorage && cartID) {
897
+ localStorage.setItem(localStorageConfig.key, cartID);
898
+ }
899
+ }, [
900
+ baseAPIURL,
901
+ cartID,
902
+ cartSecret,
903
+ cartsSlug,
904
+ debug,
905
+ getCart,
906
+ getUser,
907
+ localStorageConfig.key,
908
+ mergeCart,
909
+ syncLocalStorage
910
+ ]);
911
+ // If localStorage is enabled, restore cart from storage
912
+ useEffect(()=>{
913
+ if (!hasRendered.current) {
914
+ if (syncLocalStorage) {
915
+ const storedCartID = localStorage.getItem(localStorageConfig.key);
916
+ const storedSecret = localStorage.getItem(`${localStorageConfig.key}_secret`);
917
+ if (storedCartID) {
918
+ getCart(storedCartID, {
919
+ secret: storedSecret || undefined
920
+ }).then((fetchedCart)=>{
921
+ setCart(fetchedCart);
922
+ setCartID(storedCartID);
923
+ if (storedSecret) {
924
+ setCartSecret(storedSecret);
925
+ }
926
+ }).catch((_)=>{
927
+ // console.error('Error fetching cart from localStorage:', error)
928
+ // If there's an error fetching the cart, clear it from localStorage
929
+ localStorage.removeItem(localStorageConfig.key);
930
+ localStorage.removeItem(`${localStorageConfig.key}_secret`);
931
+ setCartID(undefined);
932
+ setCart(undefined);
933
+ setCartSecret(undefined);
934
+ });
935
+ }
936
+ }
937
+ hasRendered.current = true;
938
+ void getUser().then((user)=>{
939
+ if (user && user.cart?.docs && user.cart.docs.length > 0) {
940
+ // If the user has carts, we can set the cartID to the first cart
941
+ const cartID = typeof user.cart.docs[0] === 'object' ? user.cart.docs[0].id : user.cart.docs[0];
942
+ if (cartID) {
943
+ getCart(cartID).then((fetchedCart)=>{
944
+ setCart(fetchedCart);
945
+ setCartID(cartID);
946
+ }).catch((error)=>{
947
+ if (debug) {
948
+ // eslint-disable-next-line no-console
949
+ console.error('Error fetching user cart:', error);
950
+ }
951
+ setCart(undefined);
952
+ setCartID(undefined);
953
+ throw new Error(`Failed to fetch user cart: ${error.message}`);
954
+ });
955
+ }
956
+ }
957
+ });
958
+ }
959
+ }, [
960
+ debug,
961
+ getAddresses,
962
+ getCart,
963
+ getUser,
964
+ localStorageConfig.key,
965
+ syncLocalStorage
966
+ ]);
967
+ useEffect(()=>{
968
+ if (user) {
969
+ // If the user is logged in, fetch their addresses
970
+ void getAddresses();
971
+ } else {
972
+ // If no user is logged in, clear addresses
973
+ setAddresses(undefined);
974
+ }
975
+ }, [
976
+ getAddresses,
977
+ user
978
+ ]);
979
+ return /*#__PURE__*/ _jsx(EcommerceContext, {
980
+ value: {
981
+ addItem,
982
+ addresses,
983
+ cart,
984
+ clearCart,
985
+ clearSession,
986
+ config,
987
+ confirmOrder,
988
+ createAddress,
989
+ currenciesConfig,
990
+ currency: selectedCurrency,
991
+ decrementItem,
992
+ incrementItem,
993
+ initiatePayment,
994
+ isLoading,
995
+ mergeCart,
996
+ onLogin,
997
+ onLogout,
998
+ paymentMethods,
999
+ refreshCart,
1000
+ removeItem,
1001
+ selectedPaymentMethod,
1002
+ setCurrency,
1003
+ updateAddress,
1004
+ user
1005
+ },
1006
+ children: children
1007
+ });
1008
+ };
1009
+ export const useEcommerce = ()=>{
1010
+ const context = use(EcommerceContext);
1011
+ if (!context) {
1012
+ throw new Error('useEcommerce must be used within an EcommerceProvider');
1013
+ }
1014
+ return context;
1015
+ };
1016
+ export const useEcommerceConfig = ()=>{
1017
+ const { config } = useEcommerce();
1018
+ return config;
1019
+ };
1020
+ export const useCurrency = ()=>{
1021
+ const { currenciesConfig, currency, setCurrency } = useEcommerce();
1022
+ const formatCurrency = useCallback((value, options)=>{
1023
+ if (value === undefined || value === null) {
1024
+ return '';
1025
+ }
1026
+ const currencyToUse = options?.currency || currency;
1027
+ if (!currencyToUse) {
1028
+ return value.toString();
1029
+ }
1030
+ const { code, decimals, symbolDisplay } = currencyToUse;
1031
+ const locale = options?.locale || 'en';
1032
+ return new Intl.NumberFormat(locale, {
1033
+ currency: code,
1034
+ currencyDisplay: symbolDisplay || 'symbol',
1035
+ maximumFractionDigits: decimals,
1036
+ minimumFractionDigits: decimals,
1037
+ style: 'currency'
1038
+ }).format(value / Math.pow(10, decimals));
1039
+ }, [
1040
+ currency
1041
+ ]);
1042
+ if (!currency) {
1043
+ throw new Error('useCurrency must be used within an EcommerceProvider');
1044
+ }
1045
+ return {
1046
+ currency,
1047
+ formatCurrency,
1048
+ setCurrency,
1049
+ supportedCurrencies: currenciesConfig.supportedCurrencies
1050
+ };
1051
+ };
1052
+ export function useCart() {
1053
+ const { addItem, cart, clearCart, decrementItem, incrementItem, isLoading, refreshCart, removeItem } = useEcommerce();
1054
+ if (!addItem) {
1055
+ throw new Error('useCart must be used within an EcommerceProvider');
1056
+ }
1057
+ return {
1058
+ addItem,
1059
+ cart: cart,
1060
+ clearCart,
1061
+ decrementItem,
1062
+ incrementItem,
1063
+ isLoading,
1064
+ refreshCart,
1065
+ removeItem
1066
+ };
1067
+ }
1068
+ export const usePayments = ()=>{
1069
+ const { confirmOrder, initiatePayment, isLoading, paymentMethods, selectedPaymentMethod } = useEcommerce();
1070
+ if (!initiatePayment) {
1071
+ throw new Error('usePayments must be used within an EcommerceProvider');
1072
+ }
1073
+ return {
1074
+ confirmOrder,
1075
+ initiatePayment,
1076
+ isLoading,
1077
+ paymentMethods,
1078
+ selectedPaymentMethod
1079
+ };
1080
+ };
1081
+ export function useAddresses() {
1082
+ const { addresses, createAddress, isLoading, updateAddress } = useEcommerce();
1083
+ if (!createAddress) {
1084
+ throw new Error('usePayments must be used within an EcommerceProvider');
1085
+ }
1086
+ return {
1087
+ addresses: addresses,
1088
+ createAddress,
1089
+ isLoading,
1090
+ updateAddress
1091
+ };
1092
+ }
1093
+
1094
+ //# sourceMappingURL=index.js.map