@payloadcms/plugin-ecommerce 4.0.0-internal.45cfa3d → 4.0.0-internal.4a6b4c3

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 (139) hide show
  1. package/README.md +6 -0
  2. package/dist/collections/addresses/createAddressesCollection.d.ts.map +1 -1
  3. package/dist/collections/addresses/createAddressesCollection.js +1 -0
  4. package/dist/collections/addresses/createAddressesCollection.js.map +1 -1
  5. package/dist/collections/carts/beforeChange.d.ts.map +1 -1
  6. package/dist/collections/carts/beforeChange.js +2 -0
  7. package/dist/collections/carts/beforeChange.js.map +1 -1
  8. package/dist/collections/carts/createCartsCollection.d.ts.map +1 -1
  9. package/dist/collections/carts/createCartsCollection.js +1 -0
  10. package/dist/collections/carts/createCartsCollection.js.map +1 -1
  11. package/dist/collections/carts/endpoints/addItem.d.ts.map +1 -1
  12. package/dist/collections/carts/endpoints/clearCart.d.ts.map +1 -1
  13. package/dist/collections/carts/endpoints/mergeCart.d.ts.map +1 -1
  14. package/dist/collections/carts/endpoints/removeItem.d.ts.map +1 -1
  15. package/dist/collections/carts/endpoints/updateItem.d.ts.map +1 -1
  16. package/dist/collections/carts/hasCartSecretAccess.d.ts.map +1 -1
  17. package/dist/collections/carts/operations/addItem.d.ts.map +1 -1
  18. package/dist/collections/carts/operations/clearCart.d.ts.map +1 -1
  19. package/dist/collections/carts/operations/createRequestWithSecret.d.ts.map +1 -1
  20. package/dist/collections/carts/operations/mergeCart.d.ts.map +1 -1
  21. package/dist/collections/carts/operations/removeItem.d.ts.map +1 -1
  22. package/dist/collections/carts/operations/updateItem.d.ts.map +1 -1
  23. package/dist/collections/orders/createOrdersCollection.d.ts.map +1 -1
  24. package/dist/collections/orders/createOrdersCollection.js +1 -0
  25. package/dist/collections/orders/createOrdersCollection.js.map +1 -1
  26. package/dist/collections/products/createProductsCollection.d.ts.map +1 -1
  27. package/dist/collections/products/createProductsCollection.js +1 -0
  28. package/dist/collections/products/createProductsCollection.js.map +1 -1
  29. package/dist/collections/transactions/createTransactionsCollection.d.ts.map +1 -1
  30. package/dist/collections/transactions/createTransactionsCollection.js +1 -0
  31. package/dist/collections/transactions/createTransactionsCollection.js.map +1 -1
  32. package/dist/collections/variants/createVariantOptionsCollection.d.ts.map +1 -1
  33. package/dist/collections/variants/createVariantOptionsCollection.js +1 -0
  34. package/dist/collections/variants/createVariantOptionsCollection.js.map +1 -1
  35. package/dist/collections/variants/createVariantTypesCollection.d.ts.map +1 -1
  36. package/dist/collections/variants/createVariantTypesCollection.js +1 -0
  37. package/dist/collections/variants/createVariantTypesCollection.js.map +1 -1
  38. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.d.ts.map +1 -1
  39. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js +2 -0
  40. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js.map +1 -1
  41. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.d.ts.map +1 -1
  42. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js +1 -0
  43. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js.map +1 -1
  44. package/dist/collections/variants/createVariantsCollection/index.d.ts.map +1 -1
  45. package/dist/collections/variants/createVariantsCollection/index.js +1 -0
  46. package/dist/collections/variants/createVariantsCollection/index.js.map +1 -1
  47. package/dist/endpoints/confirmOrder.d.ts.map +1 -1
  48. package/dist/endpoints/confirmOrder.js +306 -44
  49. package/dist/endpoints/confirmOrder.js.map +1 -1
  50. package/dist/endpoints/initiatePayment.d.ts.map +1 -1
  51. package/dist/endpoints/initiatePayment.js +2 -0
  52. package/dist/endpoints/initiatePayment.js.map +1 -1
  53. package/dist/exports/types.d.ts +1 -1
  54. package/dist/exports/types.d.ts.map +1 -1
  55. package/dist/exports/types.js.map +1 -1
  56. package/dist/fields/statusField.d.ts.map +1 -1
  57. package/dist/fields/statusField.js +5 -0
  58. package/dist/fields/statusField.js.map +1 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +1 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/payments/adapters/stripe/confirmOrder.d.ts.map +1 -1
  63. package/dist/payments/adapters/stripe/confirmOrder.js +108 -75
  64. package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -1
  65. package/dist/payments/adapters/stripe/initiatePayment.d.ts.map +1 -1
  66. package/dist/payments/adapters/stripe/initiatePayment.js +1 -0
  67. package/dist/payments/adapters/stripe/initiatePayment.js.map +1 -1
  68. package/dist/payments/adapters/stripe/validateSettlement.d.ts +37 -0
  69. package/dist/payments/adapters/stripe/validateSettlement.d.ts.map +1 -0
  70. package/dist/payments/adapters/stripe/validateSettlement.js +157 -0
  71. package/dist/payments/adapters/stripe/validateSettlement.js.map +1 -0
  72. package/dist/react/provider/index.d.ts.map +1 -1
  73. package/dist/react/provider/index.js +75 -34
  74. package/dist/react/provider/index.js.map +1 -1
  75. package/dist/react/provider/utilities.d.ts.map +1 -1
  76. package/dist/translations/languages/ar.d.ts.map +1 -1
  77. package/dist/translations/languages/az.d.ts.map +1 -1
  78. package/dist/translations/languages/bg.d.ts.map +1 -1
  79. package/dist/translations/languages/ca.d.ts.map +1 -1
  80. package/dist/translations/languages/cs.d.ts.map +1 -1
  81. package/dist/translations/languages/da.d.ts.map +1 -1
  82. package/dist/translations/languages/de.d.ts.map +1 -1
  83. package/dist/translations/languages/en.d.ts.map +1 -1
  84. package/dist/translations/languages/es.d.ts.map +1 -1
  85. package/dist/translations/languages/et.d.ts.map +1 -1
  86. package/dist/translations/languages/fa.d.ts.map +1 -1
  87. package/dist/translations/languages/fr.d.ts.map +1 -1
  88. package/dist/translations/languages/he.d.ts.map +1 -1
  89. package/dist/translations/languages/hr.d.ts.map +1 -1
  90. package/dist/translations/languages/hu.d.ts.map +1 -1
  91. package/dist/translations/languages/hy.d.ts.map +1 -1
  92. package/dist/translations/languages/is.d.ts.map +1 -1
  93. package/dist/translations/languages/it.d.ts.map +1 -1
  94. package/dist/translations/languages/ja.d.ts.map +1 -1
  95. package/dist/translations/languages/ko.d.ts.map +1 -1
  96. package/dist/translations/languages/lt.d.ts.map +1 -1
  97. package/dist/translations/languages/my.d.ts.map +1 -1
  98. package/dist/translations/languages/nb.d.ts.map +1 -1
  99. package/dist/translations/languages/nl.d.ts.map +1 -1
  100. package/dist/translations/languages/pl.d.ts.map +1 -1
  101. package/dist/translations/languages/pt.d.ts.map +1 -1
  102. package/dist/translations/languages/ro.d.ts.map +1 -1
  103. package/dist/translations/languages/rs.d.ts.map +1 -1
  104. package/dist/translations/languages/rsLatin.d.ts.map +1 -1
  105. package/dist/translations/languages/ru.d.ts.map +1 -1
  106. package/dist/translations/languages/sk.d.ts.map +1 -1
  107. package/dist/translations/languages/sl.d.ts.map +1 -1
  108. package/dist/translations/languages/sv.d.ts.map +1 -1
  109. package/dist/translations/languages/ta.d.ts.map +1 -1
  110. package/dist/translations/languages/th.d.ts.map +1 -1
  111. package/dist/translations/languages/tr.d.ts.map +1 -1
  112. package/dist/translations/languages/uk.d.ts.map +1 -1
  113. package/dist/translations/languages/vi.d.ts.map +1 -1
  114. package/dist/translations/languages/zh.d.ts.map +1 -1
  115. package/dist/translations/languages/zhTw.d.ts.map +1 -1
  116. package/dist/types/index.d.ts +26 -9
  117. package/dist/types/index.d.ts.map +1 -1
  118. package/dist/types/index.js.map +1 -1
  119. package/dist/ui/VariantOptionsSelector/index.d.ts.map +1 -1
  120. package/dist/ui/VariantOptionsSelector/index.js +3 -1
  121. package/dist/ui/VariantOptionsSelector/index.js.map +1 -1
  122. package/dist/ui/utilities.d.ts.map +1 -1
  123. package/dist/utilities/accessComposition.d.ts.map +1 -1
  124. package/dist/utilities/getCollectionSlugMap.d.ts.map +1 -1
  125. package/dist/utilities/pushTypeScriptProperties.d.ts.map +1 -1
  126. package/dist/utilities/sanitizePluginConfig.d.ts.map +1 -1
  127. package/package.json +10 -10
  128. package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js +0 -358
  129. package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js.map +0 -1
  130. package/dist/payments/adapters/stripe/confirmOrder.spec.js +0 -166
  131. package/dist/payments/adapters/stripe/confirmOrder.spec.js.map +0 -1
  132. package/dist/utilities/accessComposition.spec.js +0 -765
  133. package/dist/utilities/accessComposition.spec.js.map +0 -1
  134. package/dist/utilities/defaultProductsValidation.spec.js +0 -384
  135. package/dist/utilities/defaultProductsValidation.spec.js.map +0 -1
  136. package/dist/utilities/getCollectionSlugMap.spec.js +0 -254
  137. package/dist/utilities/getCollectionSlugMap.spec.js.map +0 -1
  138. package/dist/utilities/sanitizePluginConfig.spec.js +0 -516
  139. package/dist/utilities/sanitizePluginConfig.spec.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoints/initiatePayment.ts"],"sourcesContent":["import { addDataAndFileToRequest, type DefaultDocumentIDType, type Endpoint } from 'payload'\n\nimport type {\n CurrenciesConfig,\n PaymentAdapter,\n ProductsValidation,\n SanitizedEcommercePluginConfig,\n UserWithCart,\n} from '../types/index.js'\n\nimport { defaultProductsValidation } from '../utilities/defaultProductsValidation.js'\n\ntype Args = {\n /**\n * The slug of the carts collection, defaults to 'carts'.\n */\n cartsSlug?: string\n currenciesConfig: CurrenciesConfig\n /**\n * The slug of the customers collection, defaults to 'users'.\n */\n customersSlug?: string\n /**\n * Track inventory stock for the products and variants.\n * Accepts an object to override the default field name.\n */\n inventory?: SanitizedEcommercePluginConfig['inventory']\n paymentMethod: PaymentAdapter\n /**\n * The slug of the products collection, defaults to 'products'.\n */\n productsSlug?: string\n /**\n * Customise the validation used for checking products or variants before a transaction is created.\n */\n productsValidation?: ProductsValidation\n /**\n * The slug of the transactions collection, defaults to 'transactions'.\n */\n transactionsSlug?: string\n /**\n * The slug of the variants collection, defaults to 'variants'.\n */\n variantsSlug?: string\n}\n\ntype InitiatePayment = (args: Args) => Endpoint['handler']\n\n/**\n * Handles the endpoint for initiating payments. We will handle checking the amount and product and variant prices here before it is sent to the payment provider.\n * This is the first step in the payment process.\n */\nexport const initiatePaymentHandler: InitiatePayment =\n ({\n cartsSlug = 'carts',\n currenciesConfig,\n customersSlug = 'users',\n paymentMethod,\n productsSlug = 'products',\n productsValidation,\n transactionsSlug = 'transactions',\n variantsSlug = 'variants',\n }) =>\n async (req) => {\n await addDataAndFileToRequest(req)\n const data = req.data\n const payload = req.payload\n const user = req.user as null | UserWithCart\n\n let currency: string = currenciesConfig.defaultCurrency\n let cartID: DefaultDocumentIDType = data?.cartID\n let cart: any = undefined\n const billingAddress = data?.billingAddress\n const shippingAddress = data?.shippingAddress\n const cartSecret = data?.secret\n\n let customerEmail: string = user?.email ?? ''\n\n if (user) {\n if (user.cart?.docs && Array.isArray(user.cart.docs) && user.cart.docs.length > 0) {\n if (!cartID && user.cart.docs[0]) {\n // Use the user's cart instead\n if (typeof user.cart.docs[0] === 'object') {\n cartID = user.cart.docs[0].id\n cart = user.cart.docs[0]\n } else {\n cartID = user.cart.docs[0]\n }\n }\n }\n } else {\n // Get the email from the data if user is not available\n if (data?.customerEmail && typeof data.customerEmail === 'string') {\n customerEmail = data.customerEmail\n } else {\n return Response.json(\n {\n message: 'A customer email is required to make a purchase.',\n },\n {\n status: 400,\n },\n )\n }\n }\n\n if (!cart) {\n if (cartID) {\n // Add cart secret to query for guest cart access control\n if (cartSecret && typeof cartSecret === 'string') {\n req.query = req.query || {}\n req.query.secret = cartSecret\n }\n\n cart = await payload.findByID({\n id: cartID,\n collection: cartsSlug,\n depth: 2,\n overrideAccess: false,\n req,\n select: {\n id: true,\n currency: true,\n customerEmail: true,\n items: true,\n subtotal: true,\n },\n })\n\n if (!cart) {\n return Response.json(\n {\n message: `Cart with ID ${cartID} not found.`,\n },\n {\n status: 404,\n },\n )\n }\n } else {\n return Response.json(\n {\n message: 'Cart ID is required.',\n },\n {\n status: 400,\n },\n )\n }\n }\n\n if (cart.currency && typeof cart.currency === 'string') {\n currency = cart.currency\n }\n\n // Ensure the currency is provided or inferred in some way\n if (!currency) {\n return Response.json(\n {\n message: 'Currency is required.',\n },\n {\n status: 400,\n },\n )\n }\n\n // Ensure the selected currency is supported\n if (\n !currenciesConfig.supportedCurrencies.find(\n (c) => c.code.toLocaleLowerCase() === currency.toLocaleLowerCase(),\n )\n ) {\n return Response.json(\n {\n message: `Currency ${currency} is not supported.`,\n },\n {\n status: 400,\n },\n )\n }\n\n // Verify the cart is available and items are present in an array\n if (!cart || !cart.items || !Array.isArray(cart.items) || cart.items.length === 0) {\n return Response.json(\n {\n message: 'Cart is required and must contain at least one item.',\n },\n {\n status: 400,\n },\n )\n }\n\n for (const item of cart.items) {\n // Target field to check the price based on the currency so we can validate the total\n const priceField = `priceIn${currency.toUpperCase()}`\n const quantity = item.quantity || 1\n\n // If the item has a product but no variant, we assume the product has a price in the specified currency\n if (item.product && !item.variant) {\n const id = typeof item.product === 'object' ? item.product.id : item.product\n\n const product = await payload.findByID({\n id,\n collection: productsSlug,\n depth: 0,\n select: {\n inventory: true,\n [priceField]: true,\n },\n })\n\n if (!product) {\n return Response.json(\n {\n message: `Product with ID ${item.product} not found.`,\n },\n {\n status: 404,\n },\n )\n }\n\n try {\n if (productsValidation) {\n await productsValidation({ currenciesConfig, currency, product, quantity })\n } else {\n await defaultProductsValidation({\n currenciesConfig,\n currency,\n product,\n quantity,\n })\n }\n } catch (error) {\n payload.logger.error(\n error,\n 'Error validating product or variant during payment initiation.',\n )\n\n return Response.json(\n {\n message: error,\n ...(error instanceof Error ? { cause: error.cause } : {}),\n },\n {\n status: 400,\n },\n )\n }\n\n if (item.variant) {\n const id = typeof item.variant === 'object' ? item.variant.id : item.variant\n\n const variant = await payload.findByID({\n id,\n collection: variantsSlug,\n depth: 0,\n select: {\n inventory: true,\n [priceField]: true,\n },\n })\n\n if (!variant) {\n return Response.json(\n {\n message: `Variant with ID ${item.variant} not found.`,\n },\n {\n status: 404,\n },\n )\n }\n\n try {\n if (productsValidation) {\n await productsValidation({\n currenciesConfig,\n currency,\n product: item.product,\n quantity,\n variant,\n })\n } else {\n await defaultProductsValidation({\n currenciesConfig,\n currency,\n product: item.product,\n quantity,\n variant,\n })\n }\n } catch (error) {\n payload.logger.error(\n error,\n 'Error validating product or variant during payment initiation.',\n )\n\n return Response.json(\n {\n message: error,\n },\n {\n status: 400,\n },\n )\n }\n }\n }\n }\n\n try {\n const paymentResponse = await paymentMethod.initiatePayment({\n customersSlug,\n data: {\n billingAddress,\n cart,\n currency,\n customerEmail,\n shippingAddress,\n },\n req,\n transactionsSlug,\n })\n\n return Response.json(paymentResponse)\n } catch (error) {\n payload.logger.error(error, 'Error initiating payment.')\n\n return Response.json(\n {\n message: 'Error initiating payment.',\n },\n {\n status: 500,\n },\n )\n }\n }\n"],"names":["addDataAndFileToRequest","defaultProductsValidation","initiatePaymentHandler","cartsSlug","currenciesConfig","customersSlug","paymentMethod","productsSlug","productsValidation","transactionsSlug","variantsSlug","req","data","payload","user","currency","defaultCurrency","cartID","cart","undefined","billingAddress","shippingAddress","cartSecret","secret","customerEmail","email","docs","Array","isArray","length","id","Response","json","message","status","query","findByID","collection","depth","overrideAccess","select","items","subtotal","supportedCurrencies","find","c","code","toLocaleLowerCase","item","priceField","toUpperCase","quantity","product","variant","inventory","error","logger","Error","cause","paymentResponse","initiatePayment"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/endpoints/initiatePayment.ts"],"sourcesContent":["import { addDataAndFileToRequest, type DefaultDocumentIDType, type Endpoint } from 'payload'\n\nimport type {\n CurrenciesConfig,\n PaymentAdapter,\n ProductsValidation,\n SanitizedEcommercePluginConfig,\n UserWithCart,\n} from '../types/index.js'\n\nimport { defaultProductsValidation } from '../utilities/defaultProductsValidation.js'\n\ntype Args = {\n /**\n * The slug of the carts collection, defaults to 'carts'.\n */\n cartsSlug?: string\n currenciesConfig: CurrenciesConfig\n /**\n * The slug of the customers collection, defaults to 'users'.\n */\n customersSlug?: string\n /**\n * Track inventory stock for the products and variants.\n * Accepts an object to override the default field name.\n */\n inventory?: SanitizedEcommercePluginConfig['inventory']\n paymentMethod: PaymentAdapter\n /**\n * The slug of the products collection, defaults to 'products'.\n */\n productsSlug?: string\n /**\n * Customise the validation used for checking products or variants before a transaction is created.\n */\n productsValidation?: ProductsValidation\n /**\n * The slug of the transactions collection, defaults to 'transactions'.\n */\n transactionsSlug?: string\n /**\n * The slug of the variants collection, defaults to 'variants'.\n */\n variantsSlug?: string\n}\n\ntype InitiatePayment = (args: Args) => Endpoint['handler']\n\n/**\n * Handles the endpoint for initiating payments. We will handle checking the amount and product and variant prices here before it is sent to the payment provider.\n * This is the first step in the payment process.\n */\nexport const initiatePaymentHandler: InitiatePayment =\n ({\n cartsSlug = 'carts',\n currenciesConfig,\n customersSlug = 'users',\n paymentMethod,\n productsSlug = 'products',\n productsValidation,\n transactionsSlug = 'transactions',\n variantsSlug = 'variants',\n }) =>\n async (req) => {\n await addDataAndFileToRequest(req)\n const data = req.data\n const payload = req.payload\n const user = req.user as null | UserWithCart\n\n let currency: string = currenciesConfig.defaultCurrency\n let cartID: DefaultDocumentIDType = data?.cartID\n let cart: any = undefined\n const billingAddress = data?.billingAddress\n const shippingAddress = data?.shippingAddress\n const cartSecret = data?.secret\n\n let customerEmail: string = user?.email ?? ''\n\n if (user) {\n if (user.cart?.docs && Array.isArray(user.cart.docs) && user.cart.docs.length > 0) {\n if (!cartID && user.cart.docs[0]) {\n // Use the user's cart instead\n if (typeof user.cart.docs[0] === 'object') {\n cartID = user.cart.docs[0].id\n cart = user.cart.docs[0]\n } else {\n cartID = user.cart.docs[0]\n }\n }\n }\n } else {\n // Get the email from the data if user is not available\n if (data?.customerEmail && typeof data.customerEmail === 'string') {\n customerEmail = data.customerEmail\n } else {\n return Response.json(\n {\n message: 'A customer email is required to make a purchase.',\n },\n {\n status: 400,\n },\n )\n }\n }\n\n if (!cart) {\n if (cartID) {\n // Add cart secret to query for guest cart access control\n if (cartSecret && typeof cartSecret === 'string') {\n req.query = req.query || {}\n req.query.secret = cartSecret\n }\n\n cart = await payload.findByID({\n id: cartID,\n collection: cartsSlug,\n depth: 2,\n overrideAccess: false,\n req,\n select: {\n id: true,\n currency: true,\n customerEmail: true,\n items: true,\n subtotal: true,\n },\n })\n\n if (!cart) {\n return Response.json(\n {\n message: `Cart with ID ${cartID} not found.`,\n },\n {\n status: 404,\n },\n )\n }\n } else {\n return Response.json(\n {\n message: 'Cart ID is required.',\n },\n {\n status: 400,\n },\n )\n }\n }\n\n if (cart.currency && typeof cart.currency === 'string') {\n currency = cart.currency\n }\n\n // Ensure the currency is provided or inferred in some way\n if (!currency) {\n return Response.json(\n {\n message: 'Currency is required.',\n },\n {\n status: 400,\n },\n )\n }\n\n // Ensure the selected currency is supported\n if (\n !currenciesConfig.supportedCurrencies.find(\n (c) => c.code.toLocaleLowerCase() === currency.toLocaleLowerCase(),\n )\n ) {\n return Response.json(\n {\n message: `Currency ${currency} is not supported.`,\n },\n {\n status: 400,\n },\n )\n }\n\n // Verify the cart is available and items are present in an array\n if (!cart || !cart.items || !Array.isArray(cart.items) || cart.items.length === 0) {\n return Response.json(\n {\n message: 'Cart is required and must contain at least one item.',\n },\n {\n status: 400,\n },\n )\n }\n\n for (const item of cart.items) {\n // Target field to check the price based on the currency so we can validate the total\n const priceField = `priceIn${currency.toUpperCase()}`\n const quantity = item.quantity || 1\n\n // If the item has a product but no variant, we assume the product has a price in the specified currency\n if (item.product && !item.variant) {\n const id = typeof item.product === 'object' ? item.product.id : item.product\n\n const product = await payload.findByID({\n id,\n collection: productsSlug,\n depth: 0,\n overrideAccess: true,\n select: {\n inventory: true,\n [priceField]: true,\n },\n })\n\n if (!product) {\n return Response.json(\n {\n message: `Product with ID ${item.product} not found.`,\n },\n {\n status: 404,\n },\n )\n }\n\n try {\n if (productsValidation) {\n await productsValidation({ currenciesConfig, currency, product, quantity })\n } else {\n await defaultProductsValidation({\n currenciesConfig,\n currency,\n product,\n quantity,\n })\n }\n } catch (error) {\n payload.logger.error(\n error,\n 'Error validating product or variant during payment initiation.',\n )\n\n return Response.json(\n {\n message: error,\n ...(error instanceof Error ? { cause: error.cause } : {}),\n },\n {\n status: 400,\n },\n )\n }\n\n if (item.variant) {\n const id = typeof item.variant === 'object' ? item.variant.id : item.variant\n\n const variant = await payload.findByID({\n id,\n collection: variantsSlug,\n depth: 0,\n overrideAccess: true,\n select: {\n inventory: true,\n [priceField]: true,\n },\n })\n\n if (!variant) {\n return Response.json(\n {\n message: `Variant with ID ${item.variant} not found.`,\n },\n {\n status: 404,\n },\n )\n }\n\n try {\n if (productsValidation) {\n await productsValidation({\n currenciesConfig,\n currency,\n product: item.product,\n quantity,\n variant,\n })\n } else {\n await defaultProductsValidation({\n currenciesConfig,\n currency,\n product: item.product,\n quantity,\n variant,\n })\n }\n } catch (error) {\n payload.logger.error(\n error,\n 'Error validating product or variant during payment initiation.',\n )\n\n return Response.json(\n {\n message: error,\n },\n {\n status: 400,\n },\n )\n }\n }\n }\n }\n\n try {\n const paymentResponse = await paymentMethod.initiatePayment({\n customersSlug,\n data: {\n billingAddress,\n cart,\n currency,\n customerEmail,\n shippingAddress,\n },\n req,\n transactionsSlug,\n })\n\n return Response.json(paymentResponse)\n } catch (error) {\n payload.logger.error(error, 'Error initiating payment.')\n\n return Response.json(\n {\n message: 'Error initiating payment.',\n },\n {\n status: 500,\n },\n )\n }\n }\n"],"names":["addDataAndFileToRequest","defaultProductsValidation","initiatePaymentHandler","cartsSlug","currenciesConfig","customersSlug","paymentMethod","productsSlug","productsValidation","transactionsSlug","variantsSlug","req","data","payload","user","currency","defaultCurrency","cartID","cart","undefined","billingAddress","shippingAddress","cartSecret","secret","customerEmail","email","docs","Array","isArray","length","id","Response","json","message","status","query","findByID","collection","depth","overrideAccess","select","items","subtotal","supportedCurrencies","find","c","code","toLocaleLowerCase","item","priceField","toUpperCase","quantity","product","variant","inventory","error","logger","Error","cause","paymentResponse","initiatePayment"],"mappings":"AAAA,SAASA,uBAAuB,QAAmD,UAAS;AAU5F,SAASC,yBAAyB,QAAQ,4CAA2C;AAsCrF;;;CAGC,GACD,OAAO,MAAMC,yBACX,CAAC,EACCC,YAAY,OAAO,EACnBC,gBAAgB,EAChBC,gBAAgB,OAAO,EACvBC,aAAa,EACbC,eAAe,UAAU,EACzBC,kBAAkB,EAClBC,mBAAmB,cAAc,EACjCC,eAAe,UAAU,EAC1B,GACD,OAAOC;QACL,MAAMX,wBAAwBW;QAC9B,MAAMC,OAAOD,IAAIC,IAAI;QACrB,MAAMC,UAAUF,IAAIE,OAAO;QAC3B,MAAMC,OAAOH,IAAIG,IAAI;QAErB,IAAIC,WAAmBX,iBAAiBY,eAAe;QACvD,IAAIC,SAAgCL,MAAMK;QAC1C,IAAIC,OAAYC;QAChB,MAAMC,iBAAiBR,MAAMQ;QAC7B,MAAMC,kBAAkBT,MAAMS;QAC9B,MAAMC,aAAaV,MAAMW;QAEzB,IAAIC,gBAAwBV,MAAMW,SAAS;QAE3C,IAAIX,MAAM;YACR,IAAIA,KAAKI,IAAI,EAAEQ,QAAQC,MAAMC,OAAO,CAACd,KAAKI,IAAI,CAACQ,IAAI,KAAKZ,KAAKI,IAAI,CAACQ,IAAI,CAACG,MAAM,GAAG,GAAG;gBACjF,IAAI,CAACZ,UAAUH,KAAKI,IAAI,CAACQ,IAAI,CAAC,EAAE,EAAE;oBAChC,8BAA8B;oBAC9B,IAAI,OAAOZ,KAAKI,IAAI,CAACQ,IAAI,CAAC,EAAE,KAAK,UAAU;wBACzCT,SAASH,KAAKI,IAAI,CAACQ,IAAI,CAAC,EAAE,CAACI,EAAE;wBAC7BZ,OAAOJ,KAAKI,IAAI,CAACQ,IAAI,CAAC,EAAE;oBAC1B,OAAO;wBACLT,SAASH,KAAKI,IAAI,CAACQ,IAAI,CAAC,EAAE;oBAC5B;gBACF;YACF;QACF,OAAO;YACL,uDAAuD;YACvD,IAAId,MAAMY,iBAAiB,OAAOZ,KAAKY,aAAa,KAAK,UAAU;gBACjEA,gBAAgBZ,KAAKY,aAAa;YACpC,OAAO;gBACL,OAAOO,SAASC,IAAI,CAClB;oBACEC,SAAS;gBACX,GACA;oBACEC,QAAQ;gBACV;YAEJ;QACF;QAEA,IAAI,CAAChB,MAAM;YACT,IAAID,QAAQ;gBACV,yDAAyD;gBACzD,IAAIK,cAAc,OAAOA,eAAe,UAAU;oBAChDX,IAAIwB,KAAK,GAAGxB,IAAIwB,KAAK,IAAI,CAAC;oBAC1BxB,IAAIwB,KAAK,CAACZ,MAAM,GAAGD;gBACrB;gBAEAJ,OAAO,MAAML,QAAQuB,QAAQ,CAAC;oBAC5BN,IAAIb;oBACJoB,YAAYlC;oBACZmC,OAAO;oBACPC,gBAAgB;oBAChB5B;oBACA6B,QAAQ;wBACNV,IAAI;wBACJf,UAAU;wBACVS,eAAe;wBACfiB,OAAO;wBACPC,UAAU;oBACZ;gBACF;gBAEA,IAAI,CAACxB,MAAM;oBACT,OAAOa,SAASC,IAAI,CAClB;wBACEC,SAAS,CAAC,aAAa,EAAEhB,OAAO,WAAW,CAAC;oBAC9C,GACA;wBACEiB,QAAQ;oBACV;gBAEJ;YACF,OAAO;gBACL,OAAOH,SAASC,IAAI,CAClB;oBACEC,SAAS;gBACX,GACA;oBACEC,QAAQ;gBACV;YAEJ;QACF;QAEA,IAAIhB,KAAKH,QAAQ,IAAI,OAAOG,KAAKH,QAAQ,KAAK,UAAU;YACtDA,WAAWG,KAAKH,QAAQ;QAC1B;QAEA,0DAA0D;QAC1D,IAAI,CAACA,UAAU;YACb,OAAOgB,SAASC,IAAI,CAClB;gBACEC,SAAS;YACX,GACA;gBACEC,QAAQ;YACV;QAEJ;QAEA,4CAA4C;QAC5C,IACE,CAAC9B,iBAAiBuC,mBAAmB,CAACC,IAAI,CACxC,CAACC,IAAMA,EAAEC,IAAI,CAACC,iBAAiB,OAAOhC,SAASgC,iBAAiB,KAElE;YACA,OAAOhB,SAASC,IAAI,CAClB;gBACEC,SAAS,CAAC,SAAS,EAAElB,SAAS,kBAAkB,CAAC;YACnD,GACA;gBACEmB,QAAQ;YACV;QAEJ;QAEA,iEAAiE;QACjE,IAAI,CAAChB,QAAQ,CAACA,KAAKuB,KAAK,IAAI,CAACd,MAAMC,OAAO,CAACV,KAAKuB,KAAK,KAAKvB,KAAKuB,KAAK,CAACZ,MAAM,KAAK,GAAG;YACjF,OAAOE,SAASC,IAAI,CAClB;gBACEC,SAAS;YACX,GACA;gBACEC,QAAQ;YACV;QAEJ;QAEA,KAAK,MAAMc,QAAQ9B,KAAKuB,KAAK,CAAE;YAC7B,qFAAqF;YACrF,MAAMQ,aAAa,CAAC,OAAO,EAAElC,SAASmC,WAAW,IAAI;YACrD,MAAMC,WAAWH,KAAKG,QAAQ,IAAI;YAElC,wGAAwG;YACxG,IAAIH,KAAKI,OAAO,IAAI,CAACJ,KAAKK,OAAO,EAAE;gBACjC,MAAMvB,KAAK,OAAOkB,KAAKI,OAAO,KAAK,WAAWJ,KAAKI,OAAO,CAACtB,EAAE,GAAGkB,KAAKI,OAAO;gBAE5E,MAAMA,UAAU,MAAMvC,QAAQuB,QAAQ,CAAC;oBACrCN;oBACAO,YAAY9B;oBACZ+B,OAAO;oBACPC,gBAAgB;oBAChBC,QAAQ;wBACNc,WAAW;wBACX,CAACL,WAAW,EAAE;oBAChB;gBACF;gBAEA,IAAI,CAACG,SAAS;oBACZ,OAAOrB,SAASC,IAAI,CAClB;wBACEC,SAAS,CAAC,gBAAgB,EAAEe,KAAKI,OAAO,CAAC,WAAW,CAAC;oBACvD,GACA;wBACElB,QAAQ;oBACV;gBAEJ;gBAEA,IAAI;oBACF,IAAI1B,oBAAoB;wBACtB,MAAMA,mBAAmB;4BAAEJ;4BAAkBW;4BAAUqC;4BAASD;wBAAS;oBAC3E,OAAO;wBACL,MAAMlD,0BAA0B;4BAC9BG;4BACAW;4BACAqC;4BACAD;wBACF;oBACF;gBACF,EAAE,OAAOI,OAAO;oBACd1C,QAAQ2C,MAAM,CAACD,KAAK,CAClBA,OACA;oBAGF,OAAOxB,SAASC,IAAI,CAClB;wBACEC,SAASsB;wBACT,GAAIA,iBAAiBE,QAAQ;4BAAEC,OAAOH,MAAMG,KAAK;wBAAC,IAAI,CAAC,CAAC;oBAC1D,GACA;wBACExB,QAAQ;oBACV;gBAEJ;gBAEA,IAAIc,KAAKK,OAAO,EAAE;oBAChB,MAAMvB,KAAK,OAAOkB,KAAKK,OAAO,KAAK,WAAWL,KAAKK,OAAO,CAACvB,EAAE,GAAGkB,KAAKK,OAAO;oBAE5E,MAAMA,UAAU,MAAMxC,QAAQuB,QAAQ,CAAC;wBACrCN;wBACAO,YAAY3B;wBACZ4B,OAAO;wBACPC,gBAAgB;wBAChBC,QAAQ;4BACNc,WAAW;4BACX,CAACL,WAAW,EAAE;wBAChB;oBACF;oBAEA,IAAI,CAACI,SAAS;wBACZ,OAAOtB,SAASC,IAAI,CAClB;4BACEC,SAAS,CAAC,gBAAgB,EAAEe,KAAKK,OAAO,CAAC,WAAW,CAAC;wBACvD,GACA;4BACEnB,QAAQ;wBACV;oBAEJ;oBAEA,IAAI;wBACF,IAAI1B,oBAAoB;4BACtB,MAAMA,mBAAmB;gCACvBJ;gCACAW;gCACAqC,SAASJ,KAAKI,OAAO;gCACrBD;gCACAE;4BACF;wBACF,OAAO;4BACL,MAAMpD,0BAA0B;gCAC9BG;gCACAW;gCACAqC,SAASJ,KAAKI,OAAO;gCACrBD;gCACAE;4BACF;wBACF;oBACF,EAAE,OAAOE,OAAO;wBACd1C,QAAQ2C,MAAM,CAACD,KAAK,CAClBA,OACA;wBAGF,OAAOxB,SAASC,IAAI,CAClB;4BACEC,SAASsB;wBACX,GACA;4BACErB,QAAQ;wBACV;oBAEJ;gBACF;YACF;QACF;QAEA,IAAI;YACF,MAAMyB,kBAAkB,MAAMrD,cAAcsD,eAAe,CAAC;gBAC1DvD;gBACAO,MAAM;oBACJQ;oBACAF;oBACAH;oBACAS;oBACAH;gBACF;gBACAV;gBACAF;YACF;YAEA,OAAOsB,SAASC,IAAI,CAAC2B;QACvB,EAAE,OAAOJ,OAAO;YACd1C,QAAQ2C,MAAM,CAACD,KAAK,CAACA,OAAO;YAE5B,OAAOxB,SAASC,IAAI,CAClB;gBACEC,SAAS;YACX,GACA;gBACEC,QAAQ;YACV;QAEJ;IACF,EAAC"}
@@ -1,3 +1,3 @@
1
- export type { ClientUserWithCart, CollectionOverride, CollectionSlugMap, ContextProps, CountryType, CurrenciesConfig, Currency, EcommerceCollections, EcommerceConfig, EcommerceContextType, EcommercePluginConfig, PaymentAdapter, PaymentAdapterArgs, PaymentAdapterClient, PaymentAdapterClientArgs, ProductsValidation, SanitizedEcommercePluginConfig, UserWithCart, } from '../types/index.js';
1
+ export type { CollectionOverride, CollectionSlugMap, ContextProps, CountryType, CurrenciesConfig, Currency, EcommerceCollections, EcommerceConfig, EcommerceContextType, EcommercePluginConfig, PaymentAdapter, PaymentAdapterArgs, PaymentAdapterClient, PaymentAdapterClientArgs, ProductsValidation, SanitizedEcommercePluginConfig, UserWithCart, } from '../types/index.js';
2
2
  export type { TypedEcommerce } from '../types/utilities.js';
3
3
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,8BAA8B,EAC9B,YAAY,GACb,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,8BAA8B,EAC9B,YAAY,GACb,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type {\n ClientUserWithCart,\n CollectionOverride,\n CollectionSlugMap,\n ContextProps,\n CountryType,\n CurrenciesConfig,\n Currency,\n EcommerceCollections,\n EcommerceConfig,\n EcommerceContextType,\n EcommercePluginConfig,\n PaymentAdapter,\n PaymentAdapterArgs,\n PaymentAdapterClient,\n PaymentAdapterClientArgs,\n ProductsValidation,\n SanitizedEcommercePluginConfig,\n UserWithCart,\n} from '../types/index.js'\n\nexport type { TypedEcommerce } from '../types/utilities.js'\n"],"names":[],"mappings":"AAqBA,WAA2D"}
1
+ {"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type {\n CollectionOverride,\n CollectionSlugMap,\n ContextProps,\n CountryType,\n CurrenciesConfig,\n Currency,\n EcommerceCollections,\n EcommerceConfig,\n EcommerceContextType,\n EcommercePluginConfig,\n PaymentAdapter,\n PaymentAdapterArgs,\n PaymentAdapterClient,\n PaymentAdapterClientArgs,\n ProductsValidation,\n SanitizedEcommercePluginConfig,\n UserWithCart,\n} from '../types/index.js'\n\nexport type { TypedEcommerce } from '../types/utilities.js'\n"],"names":[],"mappings":"AAoBA,WAA2D"}
@@ -1 +1 @@
1
- {"version":3,"file":"statusField.d.ts","sourceRoot":"","sources":["../../src/fields/statusField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,SAAS,CA+BhD,CAAA;AAED,KAAK,KAAK,GAAG;IACX,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;CACjC,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,WAiB5C,CAAA"}
1
+ {"version":3,"file":"statusField.d.ts","sourceRoot":"","sources":["../../src/fields/statusField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,SAAS,CAoChD,CAAA;AAED,KAAK,KAAK,GAAG;IACX,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;CACjC,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,WAiB5C,CAAA"}
@@ -4,6 +4,11 @@ export const statusOptions = [
4
4
  label: ({ t })=>t('plugin-ecommerce:pending'),
5
5
  value: 'pending'
6
6
  },
7
+ {
8
+ // @ts-expect-error - translations are not typed in plugins yet
9
+ label: ({ t })=>t('plugin-ecommerce:processing'),
10
+ value: 'processing'
11
+ },
7
12
  {
8
13
  // @ts-expect-error - translations are not typed in plugins yet
9
14
  label: ({ t })=>t('plugin-ecommerce:succeeded'),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/fields/statusField.ts"],"sourcesContent":["import type { SelectField } from 'payload'\n\nexport const statusOptions: SelectField['options'] = [\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:pending'),\n value: 'pending',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:succeeded'),\n value: 'succeeded',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:failed'),\n value: 'failed',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:cancelled'),\n value: 'cancelled',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:expired'),\n value: 'expired',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:refunded'),\n value: 'refunded',\n },\n]\n\ntype Props = {\n overrides?: Partial<SelectField>\n}\n\nexport const statusField: (props?: Props) => SelectField = (props) => {\n const { overrides } = props || {}\n\n // @ts-expect-error - issue with payload types\n const field: SelectField = {\n name: 'status',\n type: 'select',\n defaultValue: 'pending',\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:status'),\n options: statusOptions,\n required: true,\n ...overrides,\n }\n\n return field\n}\n"],"names":["statusOptions","label","t","value","statusField","props","overrides","field","name","type","defaultValue","options","required"],"mappings":"AAEA,OAAO,MAAMA,gBAAwC;IACnD;QACE,+DAA+D;QAC/DC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;CACD,CAAA;AAMD,OAAO,MAAMC,cAA8C,CAACC;IAC1D,MAAM,EAAEC,SAAS,EAAE,GAAGD,SAAS,CAAC;IAEhC,8CAA8C;IAC9C,MAAME,QAAqB;QACzBC,MAAM;QACNC,MAAM;QACNC,cAAc;QACdT,OAAO,CAAC,EAAEC,CAAC,EAAE,GACX,+DAA+D;YAC/DA,EAAE;QACJS,SAASX;QACTY,UAAU;QACV,GAAGN,SAAS;IACd;IAEA,OAAOC;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/fields/statusField.ts"],"sourcesContent":["import type { SelectField } from 'payload'\n\nexport const statusOptions: SelectField['options'] = [\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:pending'),\n value: 'pending',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:processing'),\n value: 'processing',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:succeeded'),\n value: 'succeeded',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:failed'),\n value: 'failed',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:cancelled'),\n value: 'cancelled',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:expired'),\n value: 'expired',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:refunded'),\n value: 'refunded',\n },\n]\n\ntype Props = {\n overrides?: Partial<SelectField>\n}\n\nexport const statusField: (props?: Props) => SelectField = (props) => {\n const { overrides } = props || {}\n\n // @ts-expect-error - issue with payload types\n const field: SelectField = {\n name: 'status',\n type: 'select',\n defaultValue: 'pending',\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:status'),\n options: statusOptions,\n required: true,\n ...overrides,\n }\n\n return field\n}\n"],"names":["statusOptions","label","t","value","statusField","props","overrides","field","name","type","defaultValue","options","required"],"mappings":"AAEA,OAAO,MAAMA,gBAAwC;IACnD;QACE,+DAA+D;QAC/DC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;CACD,CAAA;AAMD,OAAO,MAAMC,cAA8C,CAACC;IAC1D,MAAM,EAAEC,SAAS,EAAE,GAAGD,SAAS,CAAC;IAEhC,8CAA8C;IAC9C,MAAME,QAAqB;QACzBC,MAAM;QACNC,MAAM;QACNC,cAAc;QACdT,OAAO,CAAC,EAAEC,CAAC,EAAE,GACX,+DAA+D;YAC/DA,EAAE;QACJS,SAASX;QACTY,UAAU;QACV,GAAGN,SAAS;IACd;IAEA,OAAOC;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAkC,MAAM,kBAAkB,CAAA;AAE7F,OAAO,EAAE,yBAAyB,EAAE,MAAM,sDAAsD,CAAA;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAA;AACpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAA;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAA;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,4DAA4D,CAAA;AACzG,OAAO,EAAE,8BAA8B,EAAE,MAAM,0DAA0D,CAAA;AACzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,0DAA0D,CAAA;AACnG,OAAO,EAAE,4BAA4B,EAAE,MAAM,wDAAwD,CAAA;AAQrG,eAAO,MAAM,eAAe,2EAkV1B,CAAA;AAEF,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,4BAA4B,EAC5B,8BAA8B,EAC9B,wBAAwB,EACxB,4BAA4B,GAC7B,CAAA;AAED,OAAO,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAA;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0DAA0D,CAAA;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAC3E,YAAY,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AACzE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAkC,MAAM,kBAAkB,CAAA;AAE7F,OAAO,EAAE,yBAAyB,EAAE,MAAM,sDAAsD,CAAA;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAA;AACpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAA;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAA;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,4DAA4D,CAAA;AACzG,OAAO,EAAE,8BAA8B,EAAE,MAAM,0DAA0D,CAAA;AACzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,0DAA0D,CAAA;AACnG,OAAO,EAAE,4BAA4B,EAAE,MAAM,wDAAwD,CAAA;AAQrG,eAAO,MAAM,eAAe,2EAmV1B,CAAA;AAEF,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,4BAA4B,EAC5B,8BAA8B,EAC9B,wBAAwB,EACxB,4BAA4B,GAC7B,CAAA;AAED,OAAO,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAA;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0DAA0D,CAAA;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAC3E,YAAY,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AACzE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA"}
package/dist/index.js CHANGED
@@ -123,6 +123,7 @@ export const ecommercePlugin = definePlugin({
123
123
  customersSlug: collectionSlugMap.customers,
124
124
  enableVariants,
125
125
  productsSlug: collectionSlugMap.products,
126
+ transactionsSlug: collectionSlugMap.transactions,
126
127
  variantsSlug: collectionSlugMap.variants ?? 'variants'
127
128
  });
128
129
  const ordersCollection = sanitizedPluginConfig.orders && typeof sanitizedPluginConfig.orders === 'object' && 'ordersCollectionOverride' in sanitizedPluginConfig.orders && sanitizedPluginConfig.orders.ordersCollectionOverride ? await sanitizedPluginConfig.orders.ordersCollectionOverride({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { Endpoint } from 'payload'\n\nimport { definePlugin } from 'payload'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { EcommercePluginConfig, SanitizedEcommercePluginConfig } from './types/index.js'\n\nimport { createAddressesCollection } from './collections/addresses/createAddressesCollection.js'\nimport { createCartsCollection } from './collections/carts/createCartsCollection.js'\nimport { createOrdersCollection } from './collections/orders/createOrdersCollection.js'\nimport { createProductsCollection } from './collections/products/createProductsCollection.js'\nimport { createTransactionsCollection } from './collections/transactions/createTransactionsCollection.js'\nimport { createVariantOptionsCollection } from './collections/variants/createVariantOptionsCollection.js'\nimport { createVariantsCollection } from './collections/variants/createVariantsCollection/index.js'\nimport { createVariantTypesCollection } from './collections/variants/createVariantTypesCollection.js'\nimport { confirmOrderHandler } from './endpoints/confirmOrder.js'\nimport { initiatePaymentHandler } from './endpoints/initiatePayment.js'\nimport { translations } from './translations/index.js'\nimport { getCollectionSlugMap } from './utilities/getCollectionSlugMap.js'\nimport { pushTypeScriptProperties } from './utilities/pushTypeScriptProperties.js'\nimport { sanitizePluginConfig } from './utilities/sanitizePluginConfig.js'\n\nexport const ecommercePlugin = definePlugin<EcommercePluginConfig | undefined>({\n slug: '@payloadcms/plugin-ecommerce',\n plugin: async ({ config: incomingConfig, options: pluginConfig }) => {\n if (!pluginConfig) {\n return incomingConfig\n }\n\n const sanitizedPluginConfig = sanitizePluginConfig({ pluginConfig })\n\n const accessConfig = sanitizedPluginConfig.access\n\n // Ensure collections exists\n if (!incomingConfig.collections) {\n incomingConfig.collections = []\n }\n\n // Determine if variants are enabled based on products config\n const productsConfig =\n typeof sanitizedPluginConfig.products === 'boolean'\n ? sanitizedPluginConfig.products\n ? { variants: true }\n : undefined\n : sanitizedPluginConfig.products\n\n const enableVariants = Boolean(productsConfig?.variants)\n\n /**\n * Used to keep track of the slugs of collections in case they are overridden by the user.\n * Variant-related slugs are only included when variants are enabled.\n */\n const collectionSlugMap = getCollectionSlugMap({ enableVariants, sanitizedPluginConfig })\n\n const currenciesConfig: Required<SanitizedEcommercePluginConfig['currencies']> =\n sanitizedPluginConfig.currencies\n\n let addressFields\n\n if (sanitizedPluginConfig.addresses) {\n addressFields = sanitizedPluginConfig.addresses.addressFields\n\n const supportedCountries = sanitizedPluginConfig.addresses.supportedCountries\n\n const defaultAddressesCollection = createAddressesCollection({\n access: accessConfig,\n addressFields,\n customersSlug: collectionSlugMap.customers,\n supportedCountries,\n })\n\n const addressesCollection =\n sanitizedPluginConfig.addresses &&\n typeof sanitizedPluginConfig.addresses === 'object' &&\n 'addressesCollectionOverride' in sanitizedPluginConfig.addresses &&\n sanitizedPluginConfig.addresses.addressesCollectionOverride\n ? await sanitizedPluginConfig.addresses.addressesCollectionOverride({\n defaultCollection: defaultAddressesCollection,\n })\n : defaultAddressesCollection\n\n incomingConfig.collections.push(addressesCollection)\n }\n\n if (productsConfig) {\n if (productsConfig.variants) {\n const variantsConfig =\n typeof productsConfig.variants === 'boolean' ? undefined : productsConfig.variants\n\n const defaultVariantsCollection = createVariantsCollection({\n access: accessConfig,\n currenciesConfig,\n inventory: sanitizedPluginConfig.inventory,\n productsSlug: collectionSlugMap.products,\n variantOptionsSlug: collectionSlugMap.variantOptions ?? 'variantOptions',\n variantTypesSlug: collectionSlugMap.variantTypes ?? 'variantTypes',\n })\n\n const variants =\n variantsConfig &&\n typeof variantsConfig === 'object' &&\n 'variantsCollectionOverride' in variantsConfig &&\n variantsConfig.variantsCollectionOverride\n ? await variantsConfig.variantsCollectionOverride({\n defaultCollection: defaultVariantsCollection,\n })\n : defaultVariantsCollection\n\n const defaultVariantTypesCollection = createVariantTypesCollection({\n access: accessConfig,\n variantOptionsSlug: collectionSlugMap.variantOptions ?? 'variantOptions',\n })\n\n const variantTypes =\n variantsConfig &&\n typeof variantsConfig === 'object' &&\n 'variantTypesCollectionOverride' in variantsConfig &&\n variantsConfig.variantTypesCollectionOverride\n ? await variantsConfig.variantTypesCollectionOverride({\n defaultCollection: defaultVariantTypesCollection,\n })\n : defaultVariantTypesCollection\n\n const defaultVariantOptionsCollection = createVariantOptionsCollection({\n access: accessConfig,\n variantTypesSlug: collectionSlugMap.variantTypes ?? 'variantTypes',\n })\n\n const variantOptions =\n variantsConfig &&\n typeof variantsConfig === 'object' &&\n 'variantOptionsCollectionOverride' in variantsConfig &&\n variantsConfig.variantOptionsCollectionOverride\n ? await variantsConfig.variantOptionsCollectionOverride({\n defaultCollection: defaultVariantOptionsCollection,\n })\n : defaultVariantOptionsCollection\n\n incomingConfig.collections.push(variants, variantTypes, variantOptions)\n }\n\n const defaultProductsCollection = createProductsCollection({\n access: accessConfig,\n currenciesConfig,\n enableVariants,\n inventory: sanitizedPluginConfig.inventory,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n variantTypesSlug: collectionSlugMap.variantTypes ?? 'variantTypes',\n })\n\n const productsCollection =\n productsConfig &&\n 'productsCollectionOverride' in productsConfig &&\n productsConfig.productsCollectionOverride\n ? await productsConfig.productsCollectionOverride({\n defaultCollection: defaultProductsCollection,\n })\n : defaultProductsCollection\n\n incomingConfig.collections.push(productsCollection)\n\n if (sanitizedPluginConfig.carts) {\n const cartsConfig =\n typeof sanitizedPluginConfig.carts === 'object' ? sanitizedPluginConfig.carts : {}\n\n const defaultCartsCollection = createCartsCollection({\n access: accessConfig,\n allowGuestCarts: cartsConfig.allowGuestCarts,\n cartItemMatcher: cartsConfig.cartItemMatcher,\n currenciesConfig,\n customersSlug: collectionSlugMap.customers,\n enableVariants: Boolean(productsConfig.variants),\n productsSlug: collectionSlugMap.products,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n })\n\n const cartsCollection =\n sanitizedPluginConfig.carts &&\n typeof sanitizedPluginConfig.carts === 'object' &&\n 'cartsCollectionOverride' in sanitizedPluginConfig.carts &&\n sanitizedPluginConfig.carts.cartsCollectionOverride\n ? await sanitizedPluginConfig.carts.cartsCollectionOverride({\n defaultCollection: defaultCartsCollection,\n })\n : defaultCartsCollection\n\n incomingConfig.collections.push(cartsCollection)\n }\n }\n\n if (sanitizedPluginConfig.orders) {\n const defaultOrdersCollection = createOrdersCollection({\n access: accessConfig,\n addressFields,\n currenciesConfig,\n customersSlug: collectionSlugMap.customers,\n enableVariants,\n productsSlug: collectionSlugMap.products,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n })\n\n const ordersCollection =\n sanitizedPluginConfig.orders &&\n typeof sanitizedPluginConfig.orders === 'object' &&\n 'ordersCollectionOverride' in sanitizedPluginConfig.orders &&\n sanitizedPluginConfig.orders.ordersCollectionOverride\n ? await sanitizedPluginConfig.orders.ordersCollectionOverride({\n defaultCollection: defaultOrdersCollection,\n })\n : defaultOrdersCollection\n\n incomingConfig.collections.push(ordersCollection)\n }\n\n const paymentMethods = sanitizedPluginConfig.payments.paymentMethods\n\n if (sanitizedPluginConfig.payments) {\n if (paymentMethods.length) {\n if (!Array.isArray(incomingConfig.endpoints)) {\n incomingConfig.endpoints = []\n }\n\n const productsValidation =\n (typeof sanitizedPluginConfig.products === 'object' &&\n sanitizedPluginConfig.products.validation) ||\n undefined\n\n paymentMethods.forEach((paymentMethod) => {\n const methodPath = `/payments/${paymentMethod.name}`\n const endpoints: Endpoint[] = []\n\n const initiatePayment: Endpoint = {\n handler: initiatePaymentHandler({\n currenciesConfig,\n inventory: sanitizedPluginConfig.inventory,\n paymentMethod,\n productsSlug: collectionSlugMap.products,\n productsValidation,\n transactionsSlug: collectionSlugMap.transactions,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n }),\n method: 'post',\n path: `${methodPath}/initiate`,\n }\n\n const confirmOrder: Endpoint = {\n handler: confirmOrderHandler({\n cartsSlug: collectionSlugMap.carts,\n currenciesConfig,\n ordersSlug: collectionSlugMap.orders,\n paymentMethod,\n productsSlug: collectionSlugMap.products,\n productsValidation,\n transactionsSlug: collectionSlugMap.transactions,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n }),\n method: 'post',\n path: `${methodPath}/confirm-order`,\n }\n\n endpoints.push(initiatePayment, confirmOrder)\n\n // Attach any additional endpoints defined in the payment method\n if (paymentMethod.endpoints && paymentMethod.endpoints.length > 0) {\n const methodEndpoints = paymentMethod.endpoints.map((endpoint) => {\n const path = endpoint.path.startsWith('/') ? endpoint.path : `/${endpoint.path}`\n\n return {\n ...endpoint,\n path: `${methodPath}${path}`,\n }\n })\n\n endpoints.push(...methodEndpoints)\n }\n\n incomingConfig.endpoints!.push(...endpoints)\n })\n }\n }\n\n if (sanitizedPluginConfig.transactions) {\n const defaultTransactionsCollection = createTransactionsCollection({\n access: accessConfig,\n addressFields,\n cartsSlug: collectionSlugMap.carts,\n currenciesConfig,\n customersSlug: collectionSlugMap.customers,\n enableVariants,\n ordersSlug: collectionSlugMap.orders,\n paymentMethods,\n productsSlug: collectionSlugMap.products,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n })\n\n const transactionsCollection =\n sanitizedPluginConfig.transactions &&\n typeof sanitizedPluginConfig.transactions === 'object' &&\n 'transactionsCollectionOverride' in sanitizedPluginConfig.transactions &&\n sanitizedPluginConfig.transactions.transactionsCollectionOverride\n ? await sanitizedPluginConfig.transactions.transactionsCollectionOverride({\n defaultCollection: defaultTransactionsCollection,\n })\n : defaultTransactionsCollection\n\n incomingConfig.collections.push(transactionsCollection)\n }\n\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n\n if (!incomingConfig.i18n.translations) {\n incomingConfig.i18n.translations = {}\n }\n\n /**\n * Merge plugin translations — only for languages the user has enabled.\n * Plugins run before sanitize, so `supportedLanguages` may be undefined; sanitize will\n * default it to `{ en }`, so we mirror that here. Plugin-ecommerce translations always\n * win over user-provided ones for the `plugin-ecommerce` namespace.\n */\n const supportedLanguageKeys = incomingConfig.i18n?.supportedLanguages\n ? Object.keys(incomingConfig.i18n.supportedLanguages)\n : ['en']\n\n for (const lang of supportedLanguageKeys) {\n const pluginEntry = translations[lang as keyof typeof translations]\n if (!pluginEntry) {\n continue\n }\n const typedLocale = lang as AcceptedLanguages\n const existing = (incomingConfig.i18n.translations[typedLocale] ?? {}) as Record<\n string,\n unknown\n >\n incomingConfig.i18n.translations[typedLocale] = {\n ...existing,\n 'plugin-ecommerce': pluginEntry.translations['plugin-ecommerce'],\n } as PluginDefaultTranslationsObject\n }\n\n if (!incomingConfig.typescript) {\n incomingConfig.typescript = {}\n }\n\n if (!incomingConfig.typescript.schema) {\n incomingConfig.typescript.schema = []\n }\n\n incomingConfig.typescript.schema.push((args) =>\n pushTypeScriptProperties({\n ...args,\n collectionSlugMap,\n sanitizedPluginConfig,\n }),\n )\n\n return incomingConfig\n },\n})\n\nexport {\n createAddressesCollection,\n createCartsCollection,\n createOrdersCollection,\n createProductsCollection,\n createTransactionsCollection,\n createVariantOptionsCollection,\n createVariantsCollection,\n createVariantTypesCollection,\n}\n\nexport { addItem } from './collections/carts/operations/addItem.js'\nexport { clearCart } from './collections/carts/operations/clearCart.js'\nexport { defaultCartItemMatcher } from './collections/carts/operations/defaultCartItemMatcher.js'\nexport { removeItem } from './collections/carts/operations/removeItem.js'\nexport { isNumericOperator } from './collections/carts/operations/types.js'\nexport type {\n AddItemArgs,\n CartItemData,\n CartItemMatcher,\n CartItemMatcherArgs,\n CartOperationResult,\n ClearCartArgs,\n FieldWithOperator,\n NewCartItem,\n NumericOperator,\n RemoveItemArgs,\n UpdateItemArgs,\n} from './collections/carts/operations/types.js'\nexport { updateItem } from './collections/carts/operations/updateItem.js'\nexport { EUR, GBP, USD } from './currencies/index.js'\nexport { amountField } from './fields/amountField.js'\nexport { currencyField } from './fields/currencyField.js'\nexport { pricesField } from './fields/pricesField.js'\nexport { statusField } from './fields/statusField.js'\nexport { variantsFields } from './fields/variantsFields.js'\n"],"names":["definePlugin","createAddressesCollection","createCartsCollection","createOrdersCollection","createProductsCollection","createTransactionsCollection","createVariantOptionsCollection","createVariantsCollection","createVariantTypesCollection","confirmOrderHandler","initiatePaymentHandler","translations","getCollectionSlugMap","pushTypeScriptProperties","sanitizePluginConfig","ecommercePlugin","slug","plugin","config","incomingConfig","options","pluginConfig","sanitizedPluginConfig","accessConfig","access","collections","productsConfig","products","variants","undefined","enableVariants","Boolean","collectionSlugMap","currenciesConfig","currencies","addressFields","addresses","supportedCountries","defaultAddressesCollection","customersSlug","customers","addressesCollection","addressesCollectionOverride","defaultCollection","push","variantsConfig","defaultVariantsCollection","inventory","productsSlug","variantOptionsSlug","variantOptions","variantTypesSlug","variantTypes","variantsCollectionOverride","defaultVariantTypesCollection","variantTypesCollectionOverride","defaultVariantOptionsCollection","variantOptionsCollectionOverride","defaultProductsCollection","variantsSlug","productsCollection","productsCollectionOverride","carts","cartsConfig","defaultCartsCollection","allowGuestCarts","cartItemMatcher","cartsCollection","cartsCollectionOverride","orders","defaultOrdersCollection","ordersCollection","ordersCollectionOverride","paymentMethods","payments","length","Array","isArray","endpoints","productsValidation","validation","forEach","paymentMethod","methodPath","name","initiatePayment","handler","transactionsSlug","transactions","method","path","confirmOrder","cartsSlug","ordersSlug","methodEndpoints","map","endpoint","startsWith","defaultTransactionsCollection","transactionsCollection","transactionsCollectionOverride","i18n","supportedLanguageKeys","supportedLanguages","Object","keys","lang","pluginEntry","typedLocale","existing","typescript","schema","args","addItem","clearCart","defaultCartItemMatcher","removeItem","isNumericOperator","updateItem","EUR","GBP","USD","amountField","currencyField","pricesField","statusField","variantsFields"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { Endpoint } from 'payload'\n\nimport { definePlugin } from 'payload'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { EcommercePluginConfig, SanitizedEcommercePluginConfig } from './types/index.js'\n\nimport { createAddressesCollection } from './collections/addresses/createAddressesCollection.js'\nimport { createCartsCollection } from './collections/carts/createCartsCollection.js'\nimport { createOrdersCollection } from './collections/orders/createOrdersCollection.js'\nimport { createProductsCollection } from './collections/products/createProductsCollection.js'\nimport { createTransactionsCollection } from './collections/transactions/createTransactionsCollection.js'\nimport { createVariantOptionsCollection } from './collections/variants/createVariantOptionsCollection.js'\nimport { createVariantsCollection } from './collections/variants/createVariantsCollection/index.js'\nimport { createVariantTypesCollection } from './collections/variants/createVariantTypesCollection.js'\nimport { confirmOrderHandler } from './endpoints/confirmOrder.js'\nimport { initiatePaymentHandler } from './endpoints/initiatePayment.js'\nimport { translations } from './translations/index.js'\nimport { getCollectionSlugMap } from './utilities/getCollectionSlugMap.js'\nimport { pushTypeScriptProperties } from './utilities/pushTypeScriptProperties.js'\nimport { sanitizePluginConfig } from './utilities/sanitizePluginConfig.js'\n\nexport const ecommercePlugin = definePlugin<EcommercePluginConfig | undefined>({\n slug: '@payloadcms/plugin-ecommerce',\n plugin: async ({ config: incomingConfig, options: pluginConfig }) => {\n if (!pluginConfig) {\n return incomingConfig\n }\n\n const sanitizedPluginConfig = sanitizePluginConfig({ pluginConfig })\n\n const accessConfig = sanitizedPluginConfig.access\n\n // Ensure collections exists\n if (!incomingConfig.collections) {\n incomingConfig.collections = []\n }\n\n // Determine if variants are enabled based on products config\n const productsConfig =\n typeof sanitizedPluginConfig.products === 'boolean'\n ? sanitizedPluginConfig.products\n ? { variants: true }\n : undefined\n : sanitizedPluginConfig.products\n\n const enableVariants = Boolean(productsConfig?.variants)\n\n /**\n * Used to keep track of the slugs of collections in case they are overridden by the user.\n * Variant-related slugs are only included when variants are enabled.\n */\n const collectionSlugMap = getCollectionSlugMap({ enableVariants, sanitizedPluginConfig })\n\n const currenciesConfig: Required<SanitizedEcommercePluginConfig['currencies']> =\n sanitizedPluginConfig.currencies\n\n let addressFields\n\n if (sanitizedPluginConfig.addresses) {\n addressFields = sanitizedPluginConfig.addresses.addressFields\n\n const supportedCountries = sanitizedPluginConfig.addresses.supportedCountries\n\n const defaultAddressesCollection = createAddressesCollection({\n access: accessConfig,\n addressFields,\n customersSlug: collectionSlugMap.customers,\n supportedCountries,\n })\n\n const addressesCollection =\n sanitizedPluginConfig.addresses &&\n typeof sanitizedPluginConfig.addresses === 'object' &&\n 'addressesCollectionOverride' in sanitizedPluginConfig.addresses &&\n sanitizedPluginConfig.addresses.addressesCollectionOverride\n ? await sanitizedPluginConfig.addresses.addressesCollectionOverride({\n defaultCollection: defaultAddressesCollection,\n })\n : defaultAddressesCollection\n\n incomingConfig.collections.push(addressesCollection)\n }\n\n if (productsConfig) {\n if (productsConfig.variants) {\n const variantsConfig =\n typeof productsConfig.variants === 'boolean' ? undefined : productsConfig.variants\n\n const defaultVariantsCollection = createVariantsCollection({\n access: accessConfig,\n currenciesConfig,\n inventory: sanitizedPluginConfig.inventory,\n productsSlug: collectionSlugMap.products,\n variantOptionsSlug: collectionSlugMap.variantOptions ?? 'variantOptions',\n variantTypesSlug: collectionSlugMap.variantTypes ?? 'variantTypes',\n })\n\n const variants =\n variantsConfig &&\n typeof variantsConfig === 'object' &&\n 'variantsCollectionOverride' in variantsConfig &&\n variantsConfig.variantsCollectionOverride\n ? await variantsConfig.variantsCollectionOverride({\n defaultCollection: defaultVariantsCollection,\n })\n : defaultVariantsCollection\n\n const defaultVariantTypesCollection = createVariantTypesCollection({\n access: accessConfig,\n variantOptionsSlug: collectionSlugMap.variantOptions ?? 'variantOptions',\n })\n\n const variantTypes =\n variantsConfig &&\n typeof variantsConfig === 'object' &&\n 'variantTypesCollectionOverride' in variantsConfig &&\n variantsConfig.variantTypesCollectionOverride\n ? await variantsConfig.variantTypesCollectionOverride({\n defaultCollection: defaultVariantTypesCollection,\n })\n : defaultVariantTypesCollection\n\n const defaultVariantOptionsCollection = createVariantOptionsCollection({\n access: accessConfig,\n variantTypesSlug: collectionSlugMap.variantTypes ?? 'variantTypes',\n })\n\n const variantOptions =\n variantsConfig &&\n typeof variantsConfig === 'object' &&\n 'variantOptionsCollectionOverride' in variantsConfig &&\n variantsConfig.variantOptionsCollectionOverride\n ? await variantsConfig.variantOptionsCollectionOverride({\n defaultCollection: defaultVariantOptionsCollection,\n })\n : defaultVariantOptionsCollection\n\n incomingConfig.collections.push(variants, variantTypes, variantOptions)\n }\n\n const defaultProductsCollection = createProductsCollection({\n access: accessConfig,\n currenciesConfig,\n enableVariants,\n inventory: sanitizedPluginConfig.inventory,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n variantTypesSlug: collectionSlugMap.variantTypes ?? 'variantTypes',\n })\n\n const productsCollection =\n productsConfig &&\n 'productsCollectionOverride' in productsConfig &&\n productsConfig.productsCollectionOverride\n ? await productsConfig.productsCollectionOverride({\n defaultCollection: defaultProductsCollection,\n })\n : defaultProductsCollection\n\n incomingConfig.collections.push(productsCollection)\n\n if (sanitizedPluginConfig.carts) {\n const cartsConfig =\n typeof sanitizedPluginConfig.carts === 'object' ? sanitizedPluginConfig.carts : {}\n\n const defaultCartsCollection = createCartsCollection({\n access: accessConfig,\n allowGuestCarts: cartsConfig.allowGuestCarts,\n cartItemMatcher: cartsConfig.cartItemMatcher,\n currenciesConfig,\n customersSlug: collectionSlugMap.customers,\n enableVariants: Boolean(productsConfig.variants),\n productsSlug: collectionSlugMap.products,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n })\n\n const cartsCollection =\n sanitizedPluginConfig.carts &&\n typeof sanitizedPluginConfig.carts === 'object' &&\n 'cartsCollectionOverride' in sanitizedPluginConfig.carts &&\n sanitizedPluginConfig.carts.cartsCollectionOverride\n ? await sanitizedPluginConfig.carts.cartsCollectionOverride({\n defaultCollection: defaultCartsCollection,\n })\n : defaultCartsCollection\n\n incomingConfig.collections.push(cartsCollection)\n }\n }\n\n if (sanitizedPluginConfig.orders) {\n const defaultOrdersCollection = createOrdersCollection({\n access: accessConfig,\n addressFields,\n currenciesConfig,\n customersSlug: collectionSlugMap.customers,\n enableVariants,\n productsSlug: collectionSlugMap.products,\n transactionsSlug: collectionSlugMap.transactions,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n })\n\n const ordersCollection =\n sanitizedPluginConfig.orders &&\n typeof sanitizedPluginConfig.orders === 'object' &&\n 'ordersCollectionOverride' in sanitizedPluginConfig.orders &&\n sanitizedPluginConfig.orders.ordersCollectionOverride\n ? await sanitizedPluginConfig.orders.ordersCollectionOverride({\n defaultCollection: defaultOrdersCollection,\n })\n : defaultOrdersCollection\n\n incomingConfig.collections.push(ordersCollection)\n }\n\n const paymentMethods = sanitizedPluginConfig.payments.paymentMethods\n\n if (sanitizedPluginConfig.payments) {\n if (paymentMethods.length) {\n if (!Array.isArray(incomingConfig.endpoints)) {\n incomingConfig.endpoints = []\n }\n\n const productsValidation =\n (typeof sanitizedPluginConfig.products === 'object' &&\n sanitizedPluginConfig.products.validation) ||\n undefined\n\n paymentMethods.forEach((paymentMethod) => {\n const methodPath = `/payments/${paymentMethod.name}`\n const endpoints: Endpoint[] = []\n\n const initiatePayment: Endpoint = {\n handler: initiatePaymentHandler({\n currenciesConfig,\n inventory: sanitizedPluginConfig.inventory,\n paymentMethod,\n productsSlug: collectionSlugMap.products,\n productsValidation,\n transactionsSlug: collectionSlugMap.transactions,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n }),\n method: 'post',\n path: `${methodPath}/initiate`,\n }\n\n const confirmOrder: Endpoint = {\n handler: confirmOrderHandler({\n cartsSlug: collectionSlugMap.carts,\n currenciesConfig,\n ordersSlug: collectionSlugMap.orders,\n paymentMethod,\n productsSlug: collectionSlugMap.products,\n productsValidation,\n transactionsSlug: collectionSlugMap.transactions,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n }),\n method: 'post',\n path: `${methodPath}/confirm-order`,\n }\n\n endpoints.push(initiatePayment, confirmOrder)\n\n // Attach any additional endpoints defined in the payment method\n if (paymentMethod.endpoints && paymentMethod.endpoints.length > 0) {\n const methodEndpoints = paymentMethod.endpoints.map((endpoint) => {\n const path = endpoint.path.startsWith('/') ? endpoint.path : `/${endpoint.path}`\n\n return {\n ...endpoint,\n path: `${methodPath}${path}`,\n }\n })\n\n endpoints.push(...methodEndpoints)\n }\n\n incomingConfig.endpoints!.push(...endpoints)\n })\n }\n }\n\n if (sanitizedPluginConfig.transactions) {\n const defaultTransactionsCollection = createTransactionsCollection({\n access: accessConfig,\n addressFields,\n cartsSlug: collectionSlugMap.carts,\n currenciesConfig,\n customersSlug: collectionSlugMap.customers,\n enableVariants,\n ordersSlug: collectionSlugMap.orders,\n paymentMethods,\n productsSlug: collectionSlugMap.products,\n variantsSlug: collectionSlugMap.variants ?? 'variants',\n })\n\n const transactionsCollection =\n sanitizedPluginConfig.transactions &&\n typeof sanitizedPluginConfig.transactions === 'object' &&\n 'transactionsCollectionOverride' in sanitizedPluginConfig.transactions &&\n sanitizedPluginConfig.transactions.transactionsCollectionOverride\n ? await sanitizedPluginConfig.transactions.transactionsCollectionOverride({\n defaultCollection: defaultTransactionsCollection,\n })\n : defaultTransactionsCollection\n\n incomingConfig.collections.push(transactionsCollection)\n }\n\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n\n if (!incomingConfig.i18n.translations) {\n incomingConfig.i18n.translations = {}\n }\n\n /**\n * Merge plugin translations — only for languages the user has enabled.\n * Plugins run before sanitize, so `supportedLanguages` may be undefined; sanitize will\n * default it to `{ en }`, so we mirror that here. Plugin-ecommerce translations always\n * win over user-provided ones for the `plugin-ecommerce` namespace.\n */\n const supportedLanguageKeys = incomingConfig.i18n?.supportedLanguages\n ? Object.keys(incomingConfig.i18n.supportedLanguages)\n : ['en']\n\n for (const lang of supportedLanguageKeys) {\n const pluginEntry = translations[lang as keyof typeof translations]\n if (!pluginEntry) {\n continue\n }\n const typedLocale = lang as AcceptedLanguages\n const existing = (incomingConfig.i18n.translations[typedLocale] ?? {}) as Record<\n string,\n unknown\n >\n incomingConfig.i18n.translations[typedLocale] = {\n ...existing,\n 'plugin-ecommerce': pluginEntry.translations['plugin-ecommerce'],\n } as PluginDefaultTranslationsObject\n }\n\n if (!incomingConfig.typescript) {\n incomingConfig.typescript = {}\n }\n\n if (!incomingConfig.typescript.schema) {\n incomingConfig.typescript.schema = []\n }\n\n incomingConfig.typescript.schema.push((args) =>\n pushTypeScriptProperties({\n ...args,\n collectionSlugMap,\n sanitizedPluginConfig,\n }),\n )\n\n return incomingConfig\n },\n})\n\nexport {\n createAddressesCollection,\n createCartsCollection,\n createOrdersCollection,\n createProductsCollection,\n createTransactionsCollection,\n createVariantOptionsCollection,\n createVariantsCollection,\n createVariantTypesCollection,\n}\n\nexport { addItem } from './collections/carts/operations/addItem.js'\nexport { clearCart } from './collections/carts/operations/clearCart.js'\nexport { defaultCartItemMatcher } from './collections/carts/operations/defaultCartItemMatcher.js'\nexport { removeItem } from './collections/carts/operations/removeItem.js'\nexport { isNumericOperator } from './collections/carts/operations/types.js'\nexport type {\n AddItemArgs,\n CartItemData,\n CartItemMatcher,\n CartItemMatcherArgs,\n CartOperationResult,\n ClearCartArgs,\n FieldWithOperator,\n NewCartItem,\n NumericOperator,\n RemoveItemArgs,\n UpdateItemArgs,\n} from './collections/carts/operations/types.js'\nexport { updateItem } from './collections/carts/operations/updateItem.js'\nexport { EUR, GBP, USD } from './currencies/index.js'\nexport { amountField } from './fields/amountField.js'\nexport { currencyField } from './fields/currencyField.js'\nexport { pricesField } from './fields/pricesField.js'\nexport { statusField } from './fields/statusField.js'\nexport { variantsFields } from './fields/variantsFields.js'\n"],"names":["definePlugin","createAddressesCollection","createCartsCollection","createOrdersCollection","createProductsCollection","createTransactionsCollection","createVariantOptionsCollection","createVariantsCollection","createVariantTypesCollection","confirmOrderHandler","initiatePaymentHandler","translations","getCollectionSlugMap","pushTypeScriptProperties","sanitizePluginConfig","ecommercePlugin","slug","plugin","config","incomingConfig","options","pluginConfig","sanitizedPluginConfig","accessConfig","access","collections","productsConfig","products","variants","undefined","enableVariants","Boolean","collectionSlugMap","currenciesConfig","currencies","addressFields","addresses","supportedCountries","defaultAddressesCollection","customersSlug","customers","addressesCollection","addressesCollectionOverride","defaultCollection","push","variantsConfig","defaultVariantsCollection","inventory","productsSlug","variantOptionsSlug","variantOptions","variantTypesSlug","variantTypes","variantsCollectionOverride","defaultVariantTypesCollection","variantTypesCollectionOverride","defaultVariantOptionsCollection","variantOptionsCollectionOverride","defaultProductsCollection","variantsSlug","productsCollection","productsCollectionOverride","carts","cartsConfig","defaultCartsCollection","allowGuestCarts","cartItemMatcher","cartsCollection","cartsCollectionOverride","orders","defaultOrdersCollection","transactionsSlug","transactions","ordersCollection","ordersCollectionOverride","paymentMethods","payments","length","Array","isArray","endpoints","productsValidation","validation","forEach","paymentMethod","methodPath","name","initiatePayment","handler","method","path","confirmOrder","cartsSlug","ordersSlug","methodEndpoints","map","endpoint","startsWith","defaultTransactionsCollection","transactionsCollection","transactionsCollectionOverride","i18n","supportedLanguageKeys","supportedLanguages","Object","keys","lang","pluginEntry","typedLocale","existing","typescript","schema","args","addItem","clearCart","defaultCartItemMatcher","removeItem","isNumericOperator","updateItem","EUR","GBP","USD","amountField","currencyField","pricesField","statusField","variantsFields"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"confirmOrder.d.ts","sourceRoot":"","sources":["../../../../src/payments/adapters/stripe/confirmOrder.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,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,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,WAAW,CAAC,cAAc,CAAC,CAAC,cAAc,CAsIpF,CAAA"}
1
+ {"version":3,"file":"confirmOrder.d.ts","sourceRoot":"","sources":["../../../../src/payments/adapters/stripe/confirmOrder.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAInD,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;AAID,eAAO,MAAM,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,WAAW,CAAC,cAAc,CAAC,CAAC,cAAc,CAmFpF,CAAA"}
@@ -1,15 +1,18 @@
1
1
  import Stripe from 'stripe';
2
- export const confirmOrder = (props)=>async ({ cartsSlug = 'carts', data, ordersSlug = 'orders', req, transactionsSlug = 'transactions' })=>{
2
+ import { normalizeEmail, validateSettlement } from './validateSettlement.js';
3
+ export const confirmOrder = (props)=>async ({ data, finalizeOrder, req, transactionsSlug = 'transactions' })=>{
3
4
  const payload = req.payload;
4
5
  const { apiVersion, appInfo, secretKey } = props || {};
5
- const customerEmail = data.customerEmail;
6
6
  const paymentIntentID = data.paymentIntentID;
7
7
  if (!secretKey) {
8
8
  throw new Error('Stripe secret key is required');
9
9
  }
10
- if (!paymentIntentID) {
10
+ if (typeof paymentIntentID !== 'string' || !paymentIntentID) {
11
11
  throw new Error('PaymentIntent ID is required');
12
12
  }
13
+ if (typeof finalizeOrder !== 'function') {
14
+ throw new Error('Core order finalizer is required');
15
+ }
13
16
  const stripe = new Stripe(secretKey, {
14
17
  // API version can only be the latest, stripe recommends ts ignoring it
15
18
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -21,86 +24,56 @@ export const confirmOrder = (props)=>async ({ cartsSlug = 'carts', data, ordersS
21
24
  }
22
25
  });
23
26
  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,
27
+ const transaction = await findTransaction({
28
+ paymentIntentID,
35
29
  req,
36
- where: {
37
- 'stripe.paymentIntentID': {
38
- equals: paymentIntentID
39
- }
40
- }
30
+ transactionsSlug
31
+ });
32
+ const transactionID = requireDocumentID({
33
+ fieldName: 'transaction ID',
34
+ value: transaction.id
41
35
  });
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
36
  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
- },
37
+ const cartItemsSnapshot = parseRequiredMetadata({
38
+ fieldName: 'cartItemsSnapshot',
39
+ value: paymentIntent.metadata.cartItemsSnapshot
40
+ });
41
+ const shippingAddress = parseOptionalMetadata({
42
+ fieldName: 'shippingAddress',
43
+ value: paymentIntent.metadata.shippingAddress
44
+ });
45
+ const purchaser = req.user === null || req.user === undefined ? {
46
+ customerEmail: normalizeEmail(data.customerEmail)
47
+ } : {
48
+ customer: requireDocumentID({
49
+ fieldName: 'authenticated customer ID',
50
+ value: req.user.id
51
+ })
52
+ };
53
+ validateSettlement({
54
+ canonicalCartID: data.cartID,
55
+ cartItemsSnapshot,
56
+ customerEmail: data.customerEmail,
57
+ paymentIntent,
58
+ paymentIntentID,
59
+ transaction,
60
+ user: req.user
61
+ });
62
+ const order = await finalizeOrder({
63
+ orderData: {
64
+ amount: transaction.amount,
65
+ currency: transaction.currency,
66
+ ...purchaser,
69
67
  items: cartItemsSnapshot,
70
68
  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
69
+ status: 'processing'
84
70
  },
85
- req
71
+ transactionID
86
72
  });
87
- await payload.update({
88
- id: transaction.id,
89
- collection: transactionsSlug,
90
- data: {
91
- order: order.id,
92
- status: 'succeeded'
93
- },
94
- req
73
+ return createConfirmationResult({
74
+ order,
75
+ transactionID
95
76
  });
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
77
  } catch (error) {
105
78
  payload.logger.error({
106
79
  err: error,
@@ -109,5 +82,65 @@ export const confirmOrder = (props)=>async ({ cartsSlug = 'carts', data, ordersS
109
82
  throw new Error(error instanceof Error ? error.message : 'Unknown error initiating payment');
110
83
  }
111
84
  };
85
+ const createConfirmationResult = ({ order, transactionID })=>({
86
+ message: 'Payment initiated successfully',
87
+ orderID: requireDocumentID({
88
+ fieldName: 'order ID',
89
+ value: order.id
90
+ }),
91
+ transactionID,
92
+ ...typeof order.accessToken === 'string' ? {
93
+ accessToken: order.accessToken
94
+ } : {}
95
+ });
96
+ const findTransaction = async ({ paymentIntentID, req, transactionsSlug })=>{
97
+ const result = await req.payload.find({
98
+ collection: transactionsSlug,
99
+ depth: 0,
100
+ limit: 2,
101
+ overrideAccess: true,
102
+ pagination: false,
103
+ req,
104
+ where: {
105
+ 'stripe.paymentIntentID': {
106
+ equals: paymentIntentID
107
+ }
108
+ }
109
+ });
110
+ if (result.totalDocs !== 1 || result.docs.length !== 1 || !result.docs[0]) {
111
+ throw new Error('Expected exactly one transaction for the provided PaymentIntent ID');
112
+ }
113
+ return result.docs[0];
114
+ };
115
+ const parseOptionalMetadata = ({ fieldName, value })=>{
116
+ if (value === undefined) {
117
+ return undefined;
118
+ }
119
+ const parsedValue = parseRequiredMetadata({
120
+ fieldName,
121
+ value
122
+ });
123
+ if (!isRecord(parsedValue)) {
124
+ throw new Error(`${fieldName} metadata is invalid`);
125
+ }
126
+ return parsedValue;
127
+ };
128
+ const parseRequiredMetadata = ({ fieldName, value })=>{
129
+ if (typeof value !== 'string' || !value) {
130
+ throw new Error(`${fieldName} metadata is missing or invalid`);
131
+ }
132
+ try {
133
+ return JSON.parse(value);
134
+ } catch {
135
+ throw new Error(`${fieldName} metadata is missing or invalid`);
136
+ }
137
+ };
138
+ const requireDocumentID = ({ fieldName, value })=>{
139
+ if ((typeof value !== 'number' || !Number.isFinite(value)) && (typeof value !== 'string' || !value.trim())) {
140
+ throw new Error(`${fieldName} is missing or invalid`);
141
+ }
142
+ return value;
143
+ };
144
+ const isRecord = (value)=>typeof value === 'object' && value !== null && !Array.isArray(value);
112
145
 
113
146
  //# sourceMappingURL=confirmOrder.js.map
@@ -1 +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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"}
1
+ {"version":3,"sources":["../../../../src/payments/adapters/stripe/confirmOrder.ts"],"sourcesContent":["import type { DefaultDocumentIDType } from 'payload'\n\nimport Stripe from 'stripe'\n\nimport type { PaymentAdapter } from '../../../types/index.js'\nimport type { StripeAdapterArgs } from './index.js'\n\nimport { normalizeEmail, validateSettlement } from './validateSettlement.js'\n\ntype Props = {\n apiVersion?: Stripe.StripeConfig['apiVersion']\n appInfo?: Stripe.StripeConfig['appInfo']\n secretKey: StripeAdapterArgs['secretKey']\n}\n\ntype RecordValue = Record<string, unknown>\n\nexport const confirmOrder: (props: Props) => NonNullable<PaymentAdapter>['confirmOrder'] =\n (props) =>\n async ({ data, finalizeOrder, req, transactionsSlug = 'transactions' }) => {\n const payload = req.payload\n const { apiVersion, appInfo, secretKey } = props || {}\n const paymentIntentID = data.paymentIntentID\n\n if (!secretKey) {\n throw new Error('Stripe secret key is required')\n }\n\n if (typeof paymentIntentID !== 'string' || !paymentIntentID) {\n throw new Error('PaymentIntent ID is required')\n }\n\n if (typeof finalizeOrder !== 'function') {\n throw new Error('Core order finalizer 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 const transaction = await findTransaction({ paymentIntentID, req, transactionsSlug })\n const transactionID = requireDocumentID({\n fieldName: 'transaction ID',\n value: transaction.id,\n })\n const paymentIntent = await stripe.paymentIntents.retrieve(paymentIntentID)\n const cartItemsSnapshot = parseRequiredMetadata({\n fieldName: 'cartItemsSnapshot',\n value: paymentIntent.metadata.cartItemsSnapshot,\n })\n const shippingAddress = parseOptionalMetadata({\n fieldName: 'shippingAddress',\n value: paymentIntent.metadata.shippingAddress,\n })\n const purchaser =\n req.user === null || req.user === undefined\n ? { customerEmail: normalizeEmail(data.customerEmail) }\n : {\n customer: requireDocumentID({\n fieldName: 'authenticated customer ID',\n value: req.user.id,\n }),\n }\n\n validateSettlement({\n canonicalCartID: data.cartID,\n cartItemsSnapshot,\n customerEmail: data.customerEmail,\n paymentIntent,\n paymentIntentID,\n transaction,\n user: req.user,\n })\n\n const order = await finalizeOrder({\n orderData: {\n amount: transaction.amount,\n currency: transaction.currency,\n ...purchaser,\n items: cartItemsSnapshot,\n shippingAddress,\n status: 'processing',\n },\n transactionID,\n })\n\n return createConfirmationResult({ order, transactionID })\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\nconst createConfirmationResult = ({\n order,\n transactionID,\n}: {\n order: RecordValue\n transactionID: DefaultDocumentIDType\n}) => ({\n message: 'Payment initiated successfully',\n orderID: requireDocumentID({ fieldName: 'order ID', value: order.id }),\n transactionID,\n ...(typeof order.accessToken === 'string' ? { accessToken: order.accessToken } : {}),\n})\n\nconst findTransaction = async ({\n paymentIntentID,\n req,\n transactionsSlug,\n}: {\n paymentIntentID: string\n req: Parameters<NonNullable<PaymentAdapter>['confirmOrder']>[0]['req']\n transactionsSlug: string\n}): Promise<RecordValue> => {\n const result = await req.payload.find({\n collection: transactionsSlug,\n depth: 0,\n limit: 2,\n overrideAccess: true,\n pagination: false,\n req,\n where: {\n 'stripe.paymentIntentID': {\n equals: paymentIntentID,\n },\n },\n })\n\n if (result.totalDocs !== 1 || result.docs.length !== 1 || !result.docs[0]) {\n throw new Error('Expected exactly one transaction for the provided PaymentIntent ID')\n }\n\n return result.docs[0] as RecordValue\n}\n\nconst parseOptionalMetadata = ({\n fieldName,\n value,\n}: {\n fieldName: string\n value?: string\n}): RecordValue | undefined => {\n if (value === undefined) {\n return undefined\n }\n\n const parsedValue = parseRequiredMetadata({ fieldName, value })\n\n if (!isRecord(parsedValue)) {\n throw new Error(`${fieldName} metadata is invalid`)\n }\n\n return parsedValue\n}\n\nconst parseRequiredMetadata = ({\n fieldName,\n value,\n}: {\n fieldName: string\n value?: string\n}): unknown => {\n if (typeof value !== 'string' || !value) {\n throw new Error(`${fieldName} metadata is missing or invalid`)\n }\n\n try {\n return JSON.parse(value)\n } catch {\n throw new Error(`${fieldName} metadata is missing or invalid`)\n }\n}\n\nconst requireDocumentID = ({\n fieldName,\n value,\n}: {\n fieldName: string\n value: unknown\n}): DefaultDocumentIDType => {\n if (\n (typeof value !== 'number' || !Number.isFinite(value)) &&\n (typeof value !== 'string' || !value.trim())\n ) {\n throw new Error(`${fieldName} is missing or invalid`)\n }\n\n return value\n}\n\nconst isRecord = (value: unknown): value is RecordValue =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n"],"names":["Stripe","normalizeEmail","validateSettlement","confirmOrder","props","data","finalizeOrder","req","transactionsSlug","payload","apiVersion","appInfo","secretKey","paymentIntentID","Error","stripe","name","url","transaction","findTransaction","transactionID","requireDocumentID","fieldName","value","id","paymentIntent","paymentIntents","retrieve","cartItemsSnapshot","parseRequiredMetadata","metadata","shippingAddress","parseOptionalMetadata","purchaser","user","undefined","customerEmail","customer","canonicalCartID","cartID","order","orderData","amount","currency","items","status","createConfirmationResult","error","logger","err","msg","message","orderID","accessToken","result","find","collection","depth","limit","overrideAccess","pagination","where","equals","totalDocs","docs","length","parsedValue","isRecord","JSON","parse","Number","isFinite","trim","Array","isArray"],"mappings":"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"}
@@ -1 +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,CA6H1F,CAAA"}
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,CA8H1F,CAAA"}
@@ -92,6 +92,7 @@ export const initiatePayment = (props)=>async ({ data, req, transactionsSlug })=
92
92
  paymentIntentID: paymentIntent.id
93
93
  }
94
94
  },
95
+ overrideAccess: true,
95
96
  req
96
97
  });
97
98
  const returnData = {