@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,113 @@
1
+ import Stripe from 'stripe';
2
+ export const confirmOrder = (props)=>async ({ cartsSlug = 'carts', data, ordersSlug = 'orders', req, transactionsSlug = 'transactions' })=>{
3
+ const payload = req.payload;
4
+ const { apiVersion, appInfo, secretKey } = props || {};
5
+ const customerEmail = data.customerEmail;
6
+ const paymentIntentID = data.paymentIntentID;
7
+ if (!secretKey) {
8
+ throw new Error('Stripe secret key is required');
9
+ }
10
+ if (!paymentIntentID) {
11
+ throw new Error('PaymentIntent ID is required');
12
+ }
13
+ const stripe = new Stripe(secretKey, {
14
+ // API version can only be the latest, stripe recommends ts ignoring it
15
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
16
+ // @ts-ignore - ignoring since possible versions are not type safe, only the latest version is recognised
17
+ apiVersion: apiVersion || '2025-03-31.basil',
18
+ appInfo: appInfo || {
19
+ name: 'Stripe Payload Plugin',
20
+ url: 'https://payloadcms.com'
21
+ }
22
+ });
23
+ try {
24
+ let customer = (await stripe.customers.list({
25
+ email: customerEmail
26
+ })).data[0];
27
+ if (!customer?.id) {
28
+ customer = await stripe.customers.create({
29
+ email: customerEmail
30
+ });
31
+ }
32
+ // Find our existing transaction by the payment intent ID
33
+ const transactionsResults = await payload.find({
34
+ collection: transactionsSlug,
35
+ req,
36
+ where: {
37
+ 'stripe.paymentIntentID': {
38
+ equals: paymentIntentID
39
+ }
40
+ }
41
+ });
42
+ const transaction = transactionsResults.docs[0];
43
+ if (!transactionsResults.totalDocs || !transaction) {
44
+ throw new Error('No transaction found for the provided PaymentIntent ID');
45
+ }
46
+ const paymentIntent = await stripe.paymentIntents.retrieve(paymentIntentID);
47
+ if (paymentIntent.status !== 'succeeded') {
48
+ throw new Error(`Payment not completed.`);
49
+ }
50
+ const cartID = paymentIntent.metadata.cartID;
51
+ const cartItemsSnapshot = paymentIntent.metadata.cartItemsSnapshot ? JSON.parse(paymentIntent.metadata.cartItemsSnapshot) : undefined;
52
+ const shippingAddress = paymentIntent.metadata.shippingAddress ? JSON.parse(paymentIntent.metadata.shippingAddress) : undefined;
53
+ if (!cartID) {
54
+ throw new Error('Cart ID not found in the PaymentIntent metadata');
55
+ }
56
+ if (!cartItemsSnapshot || !Array.isArray(cartItemsSnapshot)) {
57
+ throw new Error('Cart items snapshot not found or invalid in the PaymentIntent metadata');
58
+ }
59
+ const order = await payload.create({
60
+ collection: ordersSlug,
61
+ data: {
62
+ amount: paymentIntent.amount,
63
+ currency: paymentIntent.currency.toUpperCase(),
64
+ ...req.user ? {
65
+ customer: req.user.id
66
+ } : {
67
+ customerEmail
68
+ },
69
+ items: cartItemsSnapshot,
70
+ shippingAddress,
71
+ status: 'processing',
72
+ transactions: [
73
+ transaction.id
74
+ ]
75
+ },
76
+ req
77
+ });
78
+ const timestamp = new Date().toISOString();
79
+ await payload.update({
80
+ id: cartID,
81
+ collection: cartsSlug,
82
+ data: {
83
+ purchasedAt: timestamp
84
+ },
85
+ req
86
+ });
87
+ await payload.update({
88
+ id: transaction.id,
89
+ collection: transactionsSlug,
90
+ data: {
91
+ order: order.id,
92
+ status: 'succeeded'
93
+ },
94
+ req
95
+ });
96
+ return {
97
+ message: 'Payment initiated successfully',
98
+ orderID: order.id,
99
+ transactionID: transaction.id,
100
+ ...order.accessToken ? {
101
+ accessToken: order.accessToken
102
+ } : {}
103
+ };
104
+ } catch (error) {
105
+ payload.logger.error({
106
+ err: error,
107
+ msg: 'Error confirming order with Stripe'
108
+ });
109
+ throw new Error(error instanceof Error ? error.message : 'Unknown error initiating payment');
110
+ }
111
+ };
112
+
113
+ //# sourceMappingURL=confirmOrder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/payments/adapters/stripe/confirmOrder.ts"],"sourcesContent":["import Stripe from 'stripe'\n\nimport type { PaymentAdapter } from '../../../types/index.js'\nimport type { StripeAdapterArgs } from './index.js'\n\ntype Props = {\n apiVersion?: Stripe.StripeConfig['apiVersion']\n appInfo?: Stripe.StripeConfig['appInfo']\n secretKey: StripeAdapterArgs['secretKey']\n}\n\nexport const confirmOrder: (props: Props) => NonNullable<PaymentAdapter>['confirmOrder'] =\n (props) =>\n async ({\n cartsSlug = 'carts',\n data,\n ordersSlug = 'orders',\n req,\n transactionsSlug = 'transactions',\n }) => {\n const payload = req.payload\n const { apiVersion, appInfo, secretKey } = props || {}\n\n const customerEmail = data.customerEmail\n\n const paymentIntentID = data.paymentIntentID as string\n\n if (!secretKey) {\n throw new Error('Stripe secret key is required')\n }\n\n if (!paymentIntentID) {\n throw new Error('PaymentIntent ID is required')\n }\n\n const stripe = new Stripe(secretKey, {\n // API version can only be the latest, stripe recommends ts ignoring it\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - ignoring since possible versions are not type safe, only the latest version is recognised\n apiVersion: apiVersion || '2025-03-31.basil',\n appInfo: appInfo || {\n name: 'Stripe Payload Plugin',\n url: 'https://payloadcms.com',\n },\n })\n\n try {\n let customer = (\n await stripe.customers.list({\n email: customerEmail,\n })\n ).data[0]\n\n if (!customer?.id) {\n customer = await stripe.customers.create({\n email: customerEmail,\n })\n }\n\n // Find our existing transaction by the payment intent ID\n const transactionsResults = await payload.find({\n collection: transactionsSlug,\n req,\n where: {\n 'stripe.paymentIntentID': {\n equals: paymentIntentID,\n },\n },\n })\n\n const transaction = transactionsResults.docs[0]\n\n if (!transactionsResults.totalDocs || !transaction) {\n throw new Error('No transaction found for the provided PaymentIntent ID')\n }\n\n const paymentIntent = await stripe.paymentIntents.retrieve(paymentIntentID)\n\n if (paymentIntent.status !== 'succeeded') {\n throw new Error(`Payment not completed.`)\n }\n\n const cartID = paymentIntent.metadata.cartID\n const cartItemsSnapshot = paymentIntent.metadata.cartItemsSnapshot\n ? JSON.parse(paymentIntent.metadata.cartItemsSnapshot)\n : undefined\n\n const shippingAddress = paymentIntent.metadata.shippingAddress\n ? JSON.parse(paymentIntent.metadata.shippingAddress)\n : undefined\n\n if (!cartID) {\n throw new Error('Cart ID not found in the PaymentIntent metadata')\n }\n\n if (!cartItemsSnapshot || !Array.isArray(cartItemsSnapshot)) {\n throw new Error('Cart items snapshot not found or invalid in the PaymentIntent metadata')\n }\n\n const order = await payload.create({\n collection: ordersSlug,\n data: {\n amount: paymentIntent.amount,\n currency: paymentIntent.currency.toUpperCase(),\n ...(req.user ? { customer: req.user.id } : { customerEmail }),\n items: cartItemsSnapshot,\n shippingAddress,\n status: 'processing',\n transactions: [transaction.id],\n },\n req,\n })\n\n const timestamp = new Date().toISOString()\n\n await payload.update({\n id: cartID,\n collection: cartsSlug,\n data: {\n purchasedAt: timestamp,\n },\n req,\n })\n\n await payload.update({\n id: transaction.id,\n collection: transactionsSlug,\n data: {\n order: order.id,\n status: 'succeeded',\n },\n req,\n })\n\n return {\n message: 'Payment initiated successfully',\n orderID: order.id,\n transactionID: transaction.id,\n ...(order.accessToken ? { accessToken: order.accessToken } : {}),\n }\n } catch (error) {\n payload.logger.error({ err: error, msg: 'Error confirming order with Stripe' })\n\n throw new Error(error instanceof Error ? error.message : 'Unknown error initiating payment')\n }\n }\n"],"names":["Stripe","confirmOrder","props","cartsSlug","data","ordersSlug","req","transactionsSlug","payload","apiVersion","appInfo","secretKey","customerEmail","paymentIntentID","Error","stripe","name","url","customer","customers","list","email","id","create","transactionsResults","find","collection","where","equals","transaction","docs","totalDocs","paymentIntent","paymentIntents","retrieve","status","cartID","metadata","cartItemsSnapshot","JSON","parse","undefined","shippingAddress","Array","isArray","order","amount","currency","toUpperCase","user","items","transactions","timestamp","Date","toISOString","update","purchasedAt","message","orderID","transactionID","accessToken","error","logger","err","msg"],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ const mockCustomersList = vi.fn();
3
+ const mockCustomersCreate = vi.fn();
4
+ const mockPaymentIntentsRetrieve = vi.fn();
5
+ vi.mock('stripe', ()=>{
6
+ const MockStripe = function() {
7
+ return {
8
+ customers: {
9
+ list: mockCustomersList,
10
+ create: mockCustomersCreate
11
+ },
12
+ paymentIntents: {
13
+ retrieve: mockPaymentIntentsRetrieve
14
+ }
15
+ };
16
+ };
17
+ return {
18
+ default: MockStripe
19
+ };
20
+ });
21
+ import { confirmOrder } from './confirmOrder';
22
+ const defaultCartItemsSnapshot = JSON.stringify([
23
+ {
24
+ id: 'item-1',
25
+ quantity: 1
26
+ }
27
+ ]);
28
+ const createMockPaymentIntent = (status)=>({
29
+ amount: 1000,
30
+ currency: 'usd',
31
+ metadata: {
32
+ cartID: 'cart-123',
33
+ cartItemsSnapshot: defaultCartItemsSnapshot,
34
+ shippingAddress: JSON.stringify({
35
+ city: 'Test City'
36
+ })
37
+ },
38
+ status
39
+ });
40
+ const createMockPayload = ()=>({
41
+ create: vi.fn().mockResolvedValue({
42
+ id: 'order-123'
43
+ }),
44
+ find: vi.fn().mockResolvedValue({
45
+ docs: [
46
+ {
47
+ id: 'txn-123'
48
+ }
49
+ ],
50
+ totalDocs: 1
51
+ }),
52
+ logger: {
53
+ error: vi.fn()
54
+ },
55
+ update: vi.fn().mockResolvedValue({})
56
+ });
57
+ const createMockReq = (payload)=>({
58
+ payload,
59
+ user: {
60
+ id: 'user-123'
61
+ }
62
+ });
63
+ describe('confirmOrder - payment status check', ()=>{
64
+ const secretKey = 'sk_test_123';
65
+ beforeEach(()=>{
66
+ vi.clearAllMocks();
67
+ mockCustomersList.mockResolvedValue({
68
+ data: [
69
+ {
70
+ id: 'cus-123'
71
+ }
72
+ ]
73
+ });
74
+ mockCustomersCreate.mockResolvedValue({
75
+ id: 'cus-new'
76
+ });
77
+ });
78
+ it('should throw when paymentIntent status is requires_payment_method', async ()=>{
79
+ mockPaymentIntentsRetrieve.mockResolvedValue(createMockPaymentIntent('requires_payment_method'));
80
+ const mockPayload = createMockPayload();
81
+ const handler = confirmOrder({
82
+ secretKey
83
+ });
84
+ await expect(handler({
85
+ data: {
86
+ customerEmail: 'test@test.com',
87
+ paymentIntentID: 'pi_123'
88
+ },
89
+ req: createMockReq(mockPayload)
90
+ })).rejects.toThrow('Payment not completed.');
91
+ expect(mockPayload.create).not.toHaveBeenCalled();
92
+ });
93
+ it('should throw when paymentIntent status is canceled', async ()=>{
94
+ mockPaymentIntentsRetrieve.mockResolvedValue(createMockPaymentIntent('canceled'));
95
+ const mockPayload = createMockPayload();
96
+ const handler = confirmOrder({
97
+ secretKey
98
+ });
99
+ await expect(handler({
100
+ data: {
101
+ customerEmail: 'test@test.com',
102
+ paymentIntentID: 'pi_123'
103
+ },
104
+ req: createMockReq(mockPayload)
105
+ })).rejects.toThrow('Payment not completed.');
106
+ expect(mockPayload.create).not.toHaveBeenCalled();
107
+ });
108
+ it('should throw when paymentIntent status is processing', async ()=>{
109
+ mockPaymentIntentsRetrieve.mockResolvedValue(createMockPaymentIntent('processing'));
110
+ const mockPayload = createMockPayload();
111
+ const handler = confirmOrder({
112
+ secretKey
113
+ });
114
+ await expect(handler({
115
+ data: {
116
+ customerEmail: 'test@test.com',
117
+ paymentIntentID: 'pi_123'
118
+ },
119
+ req: createMockReq(mockPayload)
120
+ })).rejects.toThrow('Payment not completed.');
121
+ expect(mockPayload.create).not.toHaveBeenCalled();
122
+ });
123
+ it('should not update cart or transaction when payment has not succeeded', async ()=>{
124
+ mockPaymentIntentsRetrieve.mockResolvedValue(createMockPaymentIntent('requires_payment_method'));
125
+ const mockPayload = createMockPayload();
126
+ const handler = confirmOrder({
127
+ secretKey
128
+ });
129
+ await expect(handler({
130
+ data: {
131
+ customerEmail: 'test@test.com',
132
+ paymentIntentID: 'pi_123'
133
+ },
134
+ req: createMockReq(mockPayload)
135
+ })).rejects.toThrow();
136
+ expect(mockPayload.update).not.toHaveBeenCalled();
137
+ });
138
+ it('should create order when paymentIntent status is succeeded', async ()=>{
139
+ mockPaymentIntentsRetrieve.mockResolvedValue(createMockPaymentIntent('succeeded'));
140
+ const mockPayload = createMockPayload();
141
+ const handler = confirmOrder({
142
+ secretKey
143
+ });
144
+ const result = await handler({
145
+ data: {
146
+ customerEmail: 'test@test.com',
147
+ paymentIntentID: 'pi_123'
148
+ },
149
+ req: createMockReq(mockPayload)
150
+ });
151
+ expect(mockPayload.create).toHaveBeenCalledWith(expect.objectContaining({
152
+ collection: 'orders',
153
+ data: expect.objectContaining({
154
+ amount: 1000,
155
+ currency: 'USD',
156
+ status: 'processing'
157
+ })
158
+ }));
159
+ expect(result).toEqual(expect.objectContaining({
160
+ orderID: 'order-123',
161
+ transactionID: 'txn-123'
162
+ }));
163
+ });
164
+ });
165
+
166
+ //# sourceMappingURL=confirmOrder.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/payments/adapters/stripe/confirmOrder.spec.ts"],"sourcesContent":["import { beforeEach, describe, expect, it, vi } from 'vitest'\n\nconst mockCustomersList = vi.fn()\nconst mockCustomersCreate = vi.fn()\nconst mockPaymentIntentsRetrieve = vi.fn()\n\nvi.mock('stripe', () => {\n const MockStripe = function () {\n return {\n customers: {\n list: mockCustomersList,\n create: mockCustomersCreate,\n },\n paymentIntents: {\n retrieve: mockPaymentIntentsRetrieve,\n },\n }\n }\n\n return { default: MockStripe }\n})\n\nimport { confirmOrder } from './confirmOrder'\n\nconst defaultCartItemsSnapshot = JSON.stringify([{ id: 'item-1', quantity: 1 }])\n\nconst createMockPaymentIntent = (status: string) => ({\n amount: 1000,\n currency: 'usd',\n metadata: {\n cartID: 'cart-123',\n cartItemsSnapshot: defaultCartItemsSnapshot,\n shippingAddress: JSON.stringify({ city: 'Test City' }),\n },\n status,\n})\n\nconst createMockPayload = () => ({\n create: vi.fn().mockResolvedValue({ id: 'order-123' }),\n find: vi.fn().mockResolvedValue({\n docs: [{ id: 'txn-123' }],\n totalDocs: 1,\n }),\n logger: { error: vi.fn() },\n update: vi.fn().mockResolvedValue({}),\n})\n\nconst createMockReq = (payload: ReturnType<typeof createMockPayload>) =>\n ({\n payload,\n user: { id: 'user-123' },\n }) as any\n\ndescribe('confirmOrder - payment status check', () => {\n const secretKey = 'sk_test_123'\n\n beforeEach(() => {\n vi.clearAllMocks()\n\n mockCustomersList.mockResolvedValue({ data: [{ id: 'cus-123' }] })\n mockCustomersCreate.mockResolvedValue({ id: 'cus-new' })\n })\n\n it('should throw when paymentIntent status is requires_payment_method', async () => {\n mockPaymentIntentsRetrieve.mockResolvedValue(createMockPaymentIntent('requires_payment_method'))\n\n const mockPayload = createMockPayload()\n const handler = confirmOrder({ secretKey })\n\n await expect(\n handler({\n data: { customerEmail: 'test@test.com', paymentIntentID: 'pi_123' },\n req: createMockReq(mockPayload),\n }),\n ).rejects.toThrow('Payment not completed.')\n\n expect(mockPayload.create).not.toHaveBeenCalled()\n })\n\n it('should throw when paymentIntent status is canceled', async () => {\n mockPaymentIntentsRetrieve.mockResolvedValue(createMockPaymentIntent('canceled'))\n\n const mockPayload = createMockPayload()\n const handler = confirmOrder({ secretKey })\n\n await expect(\n handler({\n data: { customerEmail: 'test@test.com', paymentIntentID: 'pi_123' },\n req: createMockReq(mockPayload),\n }),\n ).rejects.toThrow('Payment not completed.')\n\n expect(mockPayload.create).not.toHaveBeenCalled()\n })\n\n it('should throw when paymentIntent status is processing', async () => {\n mockPaymentIntentsRetrieve.mockResolvedValue(createMockPaymentIntent('processing'))\n\n const mockPayload = createMockPayload()\n const handler = confirmOrder({ secretKey })\n\n await expect(\n handler({\n data: { customerEmail: 'test@test.com', paymentIntentID: 'pi_123' },\n req: createMockReq(mockPayload),\n }),\n ).rejects.toThrow('Payment not completed.')\n\n expect(mockPayload.create).not.toHaveBeenCalled()\n })\n\n it('should not update cart or transaction when payment has not succeeded', async () => {\n mockPaymentIntentsRetrieve.mockResolvedValue(createMockPaymentIntent('requires_payment_method'))\n\n const mockPayload = createMockPayload()\n const handler = confirmOrder({ secretKey })\n\n await expect(\n handler({\n data: { customerEmail: 'test@test.com', paymentIntentID: 'pi_123' },\n req: createMockReq(mockPayload),\n }),\n ).rejects.toThrow()\n\n expect(mockPayload.update).not.toHaveBeenCalled()\n })\n\n it('should create order when paymentIntent status is succeeded', async () => {\n mockPaymentIntentsRetrieve.mockResolvedValue(createMockPaymentIntent('succeeded'))\n\n const mockPayload = createMockPayload()\n const handler = confirmOrder({ secretKey })\n\n const result = await handler({\n data: { customerEmail: 'test@test.com', paymentIntentID: 'pi_123' },\n req: createMockReq(mockPayload),\n })\n\n expect(mockPayload.create).toHaveBeenCalledWith(\n expect.objectContaining({\n collection: 'orders',\n data: expect.objectContaining({\n amount: 1000,\n currency: 'USD',\n status: 'processing',\n }),\n }),\n )\n\n expect(result).toEqual(\n expect.objectContaining({\n orderID: 'order-123',\n transactionID: 'txn-123',\n }),\n )\n })\n})\n"],"names":["beforeEach","describe","expect","it","vi","mockCustomersList","fn","mockCustomersCreate","mockPaymentIntentsRetrieve","mock","MockStripe","customers","list","create","paymentIntents","retrieve","default","confirmOrder","defaultCartItemsSnapshot","JSON","stringify","id","quantity","createMockPaymentIntent","status","amount","currency","metadata","cartID","cartItemsSnapshot","shippingAddress","city","createMockPayload","mockResolvedValue","find","docs","totalDocs","logger","error","update","createMockReq","payload","user","secretKey","clearAllMocks","data","mockPayload","handler","customerEmail","paymentIntentID","req","rejects","toThrow","not","toHaveBeenCalled","result","toHaveBeenCalledWith","objectContaining","collection","toEqual","orderID","transactionID"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../../../../src/payments/adapters/stripe/endpoints/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,KAAK,KAAK,GAAG;IACX,UAAU,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IACxC,SAAS,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;IACzC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACxC,aAAa,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,QAsDhD,CAAA"}
@@ -0,0 +1,53 @@
1
+ import Stripe from 'stripe';
2
+ export const webhooksEndpoint = (props)=>{
3
+ const { apiVersion, appInfo, secretKey, webhooks, webhookSecret } = props || {};
4
+ const handler = async (req)=>{
5
+ let returnStatus = 200;
6
+ if (webhookSecret && secretKey && req.text) {
7
+ const stripe = new Stripe(secretKey, {
8
+ // API version can only be the latest, stripe recommends ts ignoring it
9
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
10
+ // @ts-ignore - ignoring since possible versions are not type safe, only the latest version is recognised
11
+ apiVersion: apiVersion || '2025-03-31.basil',
12
+ appInfo: appInfo || {
13
+ name: 'Stripe Payload Plugin',
14
+ url: 'https://payloadcms.com'
15
+ }
16
+ });
17
+ const body = await req.text();
18
+ const stripeSignature = req.headers.get('stripe-signature');
19
+ if (stripeSignature) {
20
+ let event;
21
+ try {
22
+ event = stripe.webhooks.constructEvent(body, stripeSignature, webhookSecret);
23
+ } catch (err) {
24
+ const msg = err instanceof Error ? err.message : JSON.stringify(err);
25
+ req.payload.logger.error(`Error constructing Stripe event: ${msg}`);
26
+ returnStatus = 400;
27
+ }
28
+ if (typeof webhooks === 'object' && event) {
29
+ const webhookEventHandler = webhooks[event.type];
30
+ if (typeof webhookEventHandler === 'function') {
31
+ await webhookEventHandler({
32
+ event,
33
+ req,
34
+ stripe
35
+ });
36
+ }
37
+ }
38
+ }
39
+ }
40
+ return Response.json({
41
+ received: true
42
+ }, {
43
+ status: returnStatus
44
+ });
45
+ };
46
+ return {
47
+ handler,
48
+ method: 'post',
49
+ path: '/webhooks'
50
+ };
51
+ };
52
+
53
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/payments/adapters/stripe/endpoints/webhooks.ts"],"sourcesContent":["import type { Endpoint } from 'payload'\n\nimport Stripe from 'stripe'\n\nimport type { StripeAdapterArgs } from '../index.js'\n\ntype Props = {\n apiVersion?: Stripe.StripeConfig['apiVersion']\n appInfo?: Stripe.StripeConfig['appInfo']\n secretKey: StripeAdapterArgs['secretKey']\n webhooks?: StripeAdapterArgs['webhooks']\n webhookSecret: StripeAdapterArgs['webhookSecret']\n}\n\nexport const webhooksEndpoint: (props: Props) => Endpoint = (props) => {\n const { apiVersion, appInfo, secretKey, webhooks, webhookSecret } = props || {}\n\n const handler: Endpoint['handler'] = async (req) => {\n let returnStatus = 200\n\n if (webhookSecret && secretKey && req.text) {\n const stripe = new Stripe(secretKey, {\n // API version can only be the latest, stripe recommends ts ignoring it\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - ignoring since possible versions are not type safe, only the latest version is recognised\n apiVersion: apiVersion || '2025-03-31.basil',\n appInfo: appInfo || {\n name: 'Stripe Payload Plugin',\n url: 'https://payloadcms.com',\n },\n })\n\n const body = await req.text()\n const stripeSignature = req.headers.get('stripe-signature')\n\n if (stripeSignature) {\n let event: Stripe.Event | undefined\n\n try {\n event = stripe.webhooks.constructEvent(body, stripeSignature, webhookSecret)\n } catch (err: unknown) {\n const msg: string = err instanceof Error ? err.message : JSON.stringify(err)\n req.payload.logger.error(`Error constructing Stripe event: ${msg}`)\n returnStatus = 400\n }\n\n if (typeof webhooks === 'object' && event) {\n const webhookEventHandler = webhooks[event.type]\n\n if (typeof webhookEventHandler === 'function') {\n await webhookEventHandler({\n event,\n req,\n stripe,\n })\n }\n }\n }\n }\n\n return Response.json({ received: true }, { status: returnStatus })\n }\n\n return {\n handler,\n method: 'post',\n path: '/webhooks',\n }\n}\n"],"names":["Stripe","webhooksEndpoint","props","apiVersion","appInfo","secretKey","webhooks","webhookSecret","handler","req","returnStatus","text","stripe","name","url","body","stripeSignature","headers","get","event","constructEvent","err","msg","Error","message","JSON","stringify","payload","logger","error","webhookEventHandler","type","Response","json","received","status","method","path"],"mappings":"AAEA,OAAOA,YAAY,SAAQ;AAY3B,OAAO,MAAMC,mBAA+C,CAACC;IAC3D,MAAM,EAAEC,UAAU,EAAEC,OAAO,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGL,SAAS,CAAC;IAE9E,MAAMM,UAA+B,OAAOC;QAC1C,IAAIC,eAAe;QAEnB,IAAIH,iBAAiBF,aAAaI,IAAIE,IAAI,EAAE;YAC1C,MAAMC,SAAS,IAAIZ,OAAOK,WAAW;gBACnC,uEAAuE;gBACvE,6DAA6D;gBAC7D,yGAAyG;gBACzGF,YAAYA,cAAc;gBAC1BC,SAASA,WAAW;oBAClBS,MAAM;oBACNC,KAAK;gBACP;YACF;YAEA,MAAMC,OAAO,MAAMN,IAAIE,IAAI;YAC3B,MAAMK,kBAAkBP,IAAIQ,OAAO,CAACC,GAAG,CAAC;YAExC,IAAIF,iBAAiB;gBACnB,IAAIG;gBAEJ,IAAI;oBACFA,QAAQP,OAAON,QAAQ,CAACc,cAAc,CAACL,MAAMC,iBAAiBT;gBAChE,EAAE,OAAOc,KAAc;oBACrB,MAAMC,MAAcD,eAAeE,QAAQF,IAAIG,OAAO,GAAGC,KAAKC,SAAS,CAACL;oBACxEZ,IAAIkB,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,iCAAiC,EAAEP,KAAK;oBAClEZ,eAAe;gBACjB;gBAEA,IAAI,OAAOJ,aAAa,YAAYa,OAAO;oBACzC,MAAMW,sBAAsBxB,QAAQ,CAACa,MAAMY,IAAI,CAAC;oBAEhD,IAAI,OAAOD,wBAAwB,YAAY;wBAC7C,MAAMA,oBAAoB;4BACxBX;4BACAV;4BACAG;wBACF;oBACF;gBACF;YACF;QACF;QAEA,OAAOoB,SAASC,IAAI,CAAC;YAAEC,UAAU;QAAK,GAAG;YAAEC,QAAQzB;QAAa;IAClE;IAEA,OAAO;QACLF;QACA4B,QAAQ;QACRC,MAAM;IACR;AACF,EAAC"}
@@ -0,0 +1,61 @@
1
+ import type { PayloadRequest } from 'payload';
2
+ import type { Stripe } from 'stripe';
3
+ import type { PaymentAdapter, PaymentAdapterArgs, PaymentAdapterClient, PaymentAdapterClientArgs } from '../../../types/index.js';
4
+ type StripeWebhookHandler = (args: {
5
+ event: Stripe.Event;
6
+ req: PayloadRequest;
7
+ stripe: Stripe;
8
+ }) => Promise<void> | void;
9
+ type StripeWebhookHandlers = {
10
+ /**
11
+ * Description of the event (e.g., invoice.created or charge.refunded).
12
+ */
13
+ [webhookName: string]: StripeWebhookHandler;
14
+ };
15
+ export type StripeAdapterArgs = {
16
+ /**
17
+ * This library's types only reflect the latest API version.
18
+ *
19
+ * We recommend upgrading your account's API Version to the latest version
20
+ * if you wish to use TypeScript with this library.
21
+ *
22
+ * If you wish to remain on your account's default API version,
23
+ * you may pass `null` or another version instead of the latest version,
24
+ * and add a `@ts-ignore` comment here and anywhere the types differ between API versions.
25
+ *
26
+ * @docs https://stripe.com/docs/api/versioning
27
+ */
28
+ apiVersion?: Stripe.StripeConfig['apiVersion'];
29
+ appInfo?: Stripe.StripeConfig['appInfo'];
30
+ publishableKey: string;
31
+ secretKey: string;
32
+ webhooks?: StripeWebhookHandlers;
33
+ webhookSecret?: string;
34
+ } & PaymentAdapterArgs;
35
+ export declare const stripeAdapter: (props: StripeAdapterArgs) => PaymentAdapter;
36
+ export type StripeAdapterClientArgs = {
37
+ /**
38
+ * This library's types only reflect the latest API version.
39
+ *
40
+ * We recommend upgrading your account's API Version to the latest version
41
+ * if you wish to use TypeScript with this library.
42
+ *
43
+ * If you wish to remain on your account's default API version,
44
+ * you may pass `null` or another version instead of the latest version,
45
+ * and add a `@ts-ignore` comment here and anywhere the types differ between API versions.
46
+ *
47
+ * @docs https://stripe.com/docs/api/versioning
48
+ */
49
+ apiVersion?: Stripe.StripeConfig['apiVersion'];
50
+ appInfo?: Stripe.StripeConfig['appInfo'];
51
+ publishableKey: string;
52
+ } & PaymentAdapterClientArgs;
53
+ export declare const stripeAdapterClient: (props: StripeAdapterClientArgs) => PaymentAdapterClient;
54
+ export type InitiatePaymentReturnType = {
55
+ clientSecret: string;
56
+ message: string;
57
+ paymentIntentID: string;
58
+ method: string;
59
+ };
60
+ export {};
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/payments/adapters/stripe/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,yBAAyB,CAAA;AAMhC,KAAK,oBAAoB,GAAG,CAAC,IAAI,EAAE;IACjC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAA;IACnB,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAE1B,KAAK,qBAAqB,GAAG;IAC3B;;OAEG;IACH,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IACxC,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,qBAAqB,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,kBAAkB,CAAA;AAEtB,eAAO,MAAM,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,cAmDzD,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IACxC,cAAc,EAAE,MAAM,CAAA;CACvB,GAAG,wBAAwB,CAAA;AAE5B,eAAO,MAAM,mBAAmB,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,oBASrE,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA"}
@@ -0,0 +1,68 @@
1
+ import { confirmOrder } from './confirmOrder.js';
2
+ import { webhooksEndpoint } from './endpoints/webhooks.js';
3
+ import { initiatePayment } from './initiatePayment.js';
4
+ export const stripeAdapter = (props)=>{
5
+ const { apiVersion, appInfo, groupOverrides, secretKey, webhooks, webhookSecret } = props;
6
+ const label = props?.label || 'Stripe';
7
+ const baseFields = [
8
+ {
9
+ name: 'customerID',
10
+ type: 'text',
11
+ label: 'Stripe Customer ID'
12
+ },
13
+ {
14
+ name: 'paymentIntentID',
15
+ type: 'text',
16
+ label: 'Stripe PaymentIntent ID'
17
+ }
18
+ ];
19
+ const groupField = {
20
+ name: 'stripe',
21
+ type: 'group',
22
+ ...groupOverrides,
23
+ admin: {
24
+ condition: (data)=>{
25
+ const path = 'paymentMethod';
26
+ return data?.[path] === 'stripe';
27
+ },
28
+ ...groupOverrides?.admin
29
+ },
30
+ fields: groupOverrides?.fields && typeof groupOverrides?.fields === 'function' ? groupOverrides.fields({
31
+ defaultFields: baseFields
32
+ }) : baseFields
33
+ };
34
+ return {
35
+ name: 'stripe',
36
+ confirmOrder: confirmOrder({
37
+ apiVersion,
38
+ appInfo,
39
+ secretKey
40
+ }),
41
+ endpoints: [
42
+ webhooksEndpoint({
43
+ apiVersion,
44
+ appInfo,
45
+ secretKey,
46
+ webhooks,
47
+ webhookSecret
48
+ })
49
+ ],
50
+ group: groupField,
51
+ initiatePayment: initiatePayment({
52
+ apiVersion,
53
+ appInfo,
54
+ secretKey
55
+ }),
56
+ label
57
+ };
58
+ };
59
+ export const stripeAdapterClient = (props)=>{
60
+ return {
61
+ name: 'stripe',
62
+ confirmOrder: true,
63
+ initiatePayment: true,
64
+ label: 'Card'
65
+ };
66
+ };
67
+
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/payments/adapters/stripe/index.ts"],"sourcesContent":["import type { Field, GroupField, PayloadRequest } from 'payload'\nimport type { Stripe } from 'stripe'\n\nimport type {\n PaymentAdapter,\n PaymentAdapterArgs,\n PaymentAdapterClient,\n PaymentAdapterClientArgs,\n} from '../../../types/index.js'\n\nimport { confirmOrder } from './confirmOrder.js'\nimport { webhooksEndpoint } from './endpoints/webhooks.js'\nimport { initiatePayment } from './initiatePayment.js'\n\ntype StripeWebhookHandler = (args: {\n event: Stripe.Event\n req: PayloadRequest\n stripe: Stripe\n}) => Promise<void> | void\n\ntype StripeWebhookHandlers = {\n /**\n * Description of the event (e.g., invoice.created or charge.refunded).\n */\n [webhookName: string]: StripeWebhookHandler\n}\n\nexport type StripeAdapterArgs = {\n /**\n * This library's types only reflect the latest API version.\n *\n * We recommend upgrading your account's API Version to the latest version\n * if you wish to use TypeScript with this library.\n *\n * If you wish to remain on your account's default API version,\n * you may pass `null` or another version instead of the latest version,\n * and add a `@ts-ignore` comment here and anywhere the types differ between API versions.\n *\n * @docs https://stripe.com/docs/api/versioning\n */\n apiVersion?: Stripe.StripeConfig['apiVersion']\n appInfo?: Stripe.StripeConfig['appInfo']\n publishableKey: string\n secretKey: string\n webhooks?: StripeWebhookHandlers\n webhookSecret?: string\n} & PaymentAdapterArgs\n\nexport const stripeAdapter: (props: StripeAdapterArgs) => PaymentAdapter = (props) => {\n const { apiVersion, appInfo, groupOverrides, secretKey, webhooks, webhookSecret } = props\n const label = props?.label || 'Stripe'\n\n const baseFields: Field[] = [\n {\n name: 'customerID',\n type: 'text',\n label: 'Stripe Customer ID',\n },\n {\n name: 'paymentIntentID',\n type: 'text',\n label: 'Stripe PaymentIntent ID',\n },\n ]\n\n const groupField: GroupField = {\n name: 'stripe',\n type: 'group',\n ...groupOverrides,\n admin: {\n condition: (data) => {\n const path = 'paymentMethod'\n\n return data?.[path] === 'stripe'\n },\n ...groupOverrides?.admin,\n },\n fields:\n groupOverrides?.fields && typeof groupOverrides?.fields === 'function'\n ? groupOverrides.fields({ defaultFields: baseFields })\n : baseFields,\n }\n\n return {\n name: 'stripe',\n confirmOrder: confirmOrder({\n apiVersion,\n appInfo,\n secretKey,\n }),\n endpoints: [webhooksEndpoint({ apiVersion, appInfo, secretKey, webhooks, webhookSecret })],\n group: groupField,\n initiatePayment: initiatePayment({\n apiVersion,\n appInfo,\n secretKey,\n }),\n label,\n }\n}\n\nexport type StripeAdapterClientArgs = {\n /**\n * This library's types only reflect the latest API version.\n *\n * We recommend upgrading your account's API Version to the latest version\n * if you wish to use TypeScript with this library.\n *\n * If you wish to remain on your account's default API version,\n * you may pass `null` or another version instead of the latest version,\n * and add a `@ts-ignore` comment here and anywhere the types differ between API versions.\n *\n * @docs https://stripe.com/docs/api/versioning\n */\n apiVersion?: Stripe.StripeConfig['apiVersion']\n appInfo?: Stripe.StripeConfig['appInfo']\n publishableKey: string\n} & PaymentAdapterClientArgs\n\nexport const stripeAdapterClient: (props: StripeAdapterClientArgs) => PaymentAdapterClient = (\n props,\n) => {\n return {\n name: 'stripe',\n confirmOrder: true,\n initiatePayment: true,\n label: 'Card',\n }\n}\n\nexport type InitiatePaymentReturnType = {\n clientSecret: string\n message: string\n paymentIntentID: string\n method: string\n}\n"],"names":["confirmOrder","webhooksEndpoint","initiatePayment","stripeAdapter","props","apiVersion","appInfo","groupOverrides","secretKey","webhooks","webhookSecret","label","baseFields","name","type","groupField","admin","condition","data","path","fields","defaultFields","endpoints","group","stripeAdapterClient"],"mappings":"AAUA,SAASA,YAAY,QAAQ,oBAAmB;AAChD,SAASC,gBAAgB,QAAQ,0BAAyB;AAC1D,SAASC,eAAe,QAAQ,uBAAsB;AAoCtD,OAAO,MAAMC,gBAA8D,CAACC;IAC1E,MAAM,EAAEC,UAAU,EAAEC,OAAO,EAAEC,cAAc,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGN;IACpF,MAAMO,QAAQP,OAAOO,SAAS;IAE9B,MAAMC,aAAsB;QAC1B;YACEC,MAAM;YACNC,MAAM;YACNH,OAAO;QACT;QACA;YACEE,MAAM;YACNC,MAAM;YACNH,OAAO;QACT;KACD;IAED,MAAMI,aAAyB;QAC7BF,MAAM;QACNC,MAAM;QACN,GAAGP,cAAc;QACjBS,OAAO;YACLC,WAAW,CAACC;gBACV,MAAMC,OAAO;gBAEb,OAAOD,MAAM,CAACC,KAAK,KAAK;YAC1B;YACA,GAAGZ,gBAAgBS,KAAK;QAC1B;QACAI,QACEb,gBAAgBa,UAAU,OAAOb,gBAAgBa,WAAW,aACxDb,eAAea,MAAM,CAAC;YAAEC,eAAeT;QAAW,KAClDA;IACR;IAEA,OAAO;QACLC,MAAM;QACNb,cAAcA,aAAa;YACzBK;YACAC;YACAE;QACF;QACAc,WAAW;YAACrB,iBAAiB;gBAAEI;gBAAYC;gBAASE;gBAAWC;gBAAUC;YAAc;SAAG;QAC1Fa,OAAOR;QACPb,iBAAiBA,gBAAgB;YAC/BG;YACAC;YACAE;QACF;QACAG;IACF;AACF,EAAC;AAoBD,OAAO,MAAMa,sBAAgF,CAC3FpB;IAEA,OAAO;QACLS,MAAM;QACNb,cAAc;QACdE,iBAAiB;QACjBS,OAAO;IACT;AACF,EAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initiatePayment.d.ts","sourceRoot":"","sources":["../../../../src/payments/adapters/stripe/initiatePayment.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAA6B,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE9E,KAAK,KAAK,GAAG;IACX,UAAU,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IACxC,SAAS,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;CAC1C,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,WAAW,CAAC,cAAc,CAAC,CAAC,iBAAiB,CA8HxF,CAAA"}
@@ -0,0 +1,113 @@
1
+ import Stripe from 'stripe';
2
+ export const initiatePayment = (props)=>async ({ data, req, transactionsSlug })=>{
3
+ const payload = req.payload;
4
+ const { apiVersion, appInfo, secretKey } = props || {};
5
+ const customerEmail = data.customerEmail;
6
+ const currency = data.currency;
7
+ const cart = data.cart;
8
+ const amount = cart.subtotal;
9
+ const billingAddressFromData = data.billingAddress;
10
+ const shippingAddressFromData = data.shippingAddress;
11
+ if (!secretKey) {
12
+ throw new Error('Stripe secret key is required.');
13
+ }
14
+ if (!currency) {
15
+ throw new Error('Currency is required.');
16
+ }
17
+ if (!cart || !cart.items || cart.items.length === 0) {
18
+ throw new Error('Cart is empty or not provided.');
19
+ }
20
+ if (!customerEmail || typeof customerEmail !== 'string') {
21
+ throw new Error('A valid customer email is required to make a purchase.');
22
+ }
23
+ if (!amount || typeof amount !== 'number' || amount <= 0) {
24
+ throw new Error('A valid amount is required to initiate a payment.');
25
+ }
26
+ const stripe = new Stripe(secretKey, {
27
+ // API version can only be the latest, stripe recommends ts ignoring it
28
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
29
+ // @ts-ignore - ignoring since possible versions are not type safe, only the latest version is recognised
30
+ apiVersion: apiVersion || '2025-06-30.preview',
31
+ appInfo: appInfo || {
32
+ name: 'Stripe Payload Plugin',
33
+ url: 'https://payloadcms.com'
34
+ }
35
+ });
36
+ try {
37
+ let customer = (await stripe.customers.list({
38
+ email: customerEmail
39
+ })).data[0];
40
+ if (!customer?.id) {
41
+ customer = await stripe.customers.create({
42
+ email: customerEmail
43
+ });
44
+ }
45
+ const flattenedCart = cart.items.map((item)=>{
46
+ const productID = typeof item.product === 'object' ? item.product.id : item.product;
47
+ const variantID = item.variant ? typeof item.variant === 'object' ? item.variant.id : item.variant : undefined;
48
+ // Preserve any additional custom properties (e.g., deliveryOption, customizations)
49
+ // that may have been added via cartItemMatcher
50
+ const { product: _product, variant: _variant, ...customProperties } = item;
51
+ return {
52
+ ...customProperties,
53
+ product: productID,
54
+ quantity: item.quantity,
55
+ ...variantID ? {
56
+ variant: variantID
57
+ } : {}
58
+ };
59
+ });
60
+ const shippingAddressAsString = JSON.stringify(shippingAddressFromData);
61
+ const paymentIntent = await stripe.paymentIntents.create({
62
+ amount,
63
+ automatic_payment_methods: {
64
+ enabled: true
65
+ },
66
+ currency,
67
+ customer: customer.id,
68
+ metadata: {
69
+ cartID: cart.id,
70
+ cartItemsSnapshot: JSON.stringify(flattenedCart),
71
+ shippingAddress: shippingAddressAsString
72
+ }
73
+ });
74
+ // Create a transaction for the payment intent in the database
75
+ const transaction = await payload.create({
76
+ collection: transactionsSlug,
77
+ data: {
78
+ ...req.user ? {
79
+ customer: req.user.id
80
+ } : {
81
+ customerEmail
82
+ },
83
+ amount: paymentIntent.amount,
84
+ billingAddress: billingAddressFromData,
85
+ cart: cart.id,
86
+ currency: paymentIntent.currency.toUpperCase(),
87
+ items: flattenedCart,
88
+ paymentMethod: 'stripe',
89
+ status: 'pending',
90
+ stripe: {
91
+ customerID: customer.id,
92
+ paymentIntentID: paymentIntent.id
93
+ }
94
+ },
95
+ req
96
+ });
97
+ const returnData = {
98
+ clientSecret: paymentIntent.client_secret || '',
99
+ message: 'Payment initiated successfully',
100
+ paymentIntentID: paymentIntent.id,
101
+ method: 'stripe'
102
+ };
103
+ return returnData;
104
+ } catch (error) {
105
+ payload.logger.error({
106
+ err: error,
107
+ msg: 'Error initiating payment with Stripe'
108
+ });
109
+ throw new Error(error instanceof Error ? error.message : 'Unknown error initiating payment');
110
+ }
111
+ };
112
+
113
+ //# sourceMappingURL=initiatePayment.js.map