@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/payments/adapters/stripe/initiatePayment.ts"],"sourcesContent":["import Stripe from 'stripe'\n\nimport type { PaymentAdapter } from '../../../types/index.js'\nimport type { InitiatePaymentReturnType, 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 initiatePayment: (props: Props) => NonNullable<PaymentAdapter>['initiatePayment'] =\n (props) =>\n async ({ data, req, transactionsSlug }) => {\n const payload = req.payload\n const { apiVersion, appInfo, secretKey } = props || {}\n\n const customerEmail = data.customerEmail\n const currency = data.currency\n const cart = data.cart\n const amount = cart.subtotal\n const billingAddressFromData = data.billingAddress\n const shippingAddressFromData = data.shippingAddress\n\n if (!secretKey) {\n throw new Error('Stripe secret key is required.')\n }\n\n if (!currency) {\n throw new Error('Currency is required.')\n }\n\n if (!cart || !cart.items || cart.items.length === 0) {\n throw new Error('Cart is empty or not provided.')\n }\n\n if (!customerEmail || typeof customerEmail !== 'string') {\n throw new Error('A valid customer email is required to make a purchase.')\n }\n\n if (!amount || typeof amount !== 'number' || amount <= 0) {\n throw new Error('A valid amount is required to initiate a payment.')\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-06-30.preview',\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 const flattenedCart = cart.items.map((item) => {\n const productID = typeof item.product === 'object' ? item.product.id : item.product\n const variantID = item.variant\n ? typeof item.variant === 'object'\n ? item.variant.id\n : item.variant\n : undefined\n\n // Preserve any additional custom properties (e.g., deliveryOption, customizations)\n // that may have been added via cartItemMatcher\n const { product: _product, variant: _variant, ...customProperties } = item\n\n return {\n ...customProperties,\n product: productID,\n quantity: item.quantity,\n ...(variantID ? { variant: variantID } : {}),\n }\n })\n\n const shippingAddressAsString = JSON.stringify(shippingAddressFromData)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount,\n automatic_payment_methods: {\n enabled: true,\n },\n currency,\n customer: customer.id,\n metadata: {\n cartID: cart.id,\n cartItemsSnapshot: JSON.stringify(flattenedCart),\n shippingAddress: shippingAddressAsString,\n },\n })\n\n // Create a transaction for the payment intent in the database\n const transaction = await payload.create({\n collection: transactionsSlug,\n data: {\n ...(req.user ? { customer: req.user.id } : { customerEmail }),\n amount: paymentIntent.amount,\n billingAddress: billingAddressFromData,\n cart: cart.id,\n currency: paymentIntent.currency.toUpperCase(),\n items: flattenedCart,\n paymentMethod: 'stripe',\n status: 'pending',\n stripe: {\n customerID: customer.id,\n paymentIntentID: paymentIntent.id,\n },\n },\n req,\n })\n\n const returnData: InitiatePaymentReturnType = {\n clientSecret: paymentIntent.client_secret || '',\n message: 'Payment initiated successfully',\n paymentIntentID: paymentIntent.id,\n }\n\n return returnData\n } catch (error) {\n payload.logger.error({ err: error, msg: 'Error initiating payment with Stripe' })\n\n throw new Error(error instanceof Error ? error.message : 'Unknown error initiating payment')\n }\n }\n"],"names":["Stripe","initiatePayment","props","data","req","transactionsSlug","payload","apiVersion","appInfo","secretKey","customerEmail","currency","cart","amount","subtotal","billingAddressFromData","billingAddress","shippingAddressFromData","shippingAddress","Error","items","length","stripe","name","url","customer","customers","list","email","id","create","flattenedCart","map","item","productID","product","variantID","variant","undefined","_product","_variant","customProperties","quantity","shippingAddressAsString","JSON","stringify","paymentIntent","paymentIntents","automatic_payment_methods","enabled","metadata","cartID","cartItemsSnapshot","transaction","collection","user","toUpperCase","paymentMethod","status","customerID","paymentIntentID","returnData","clientSecret","client_secret","message","error","logger","err","msg"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/payments/adapters/stripe/initiatePayment.ts"],"sourcesContent":["import Stripe from 'stripe'\n\nimport type { PaymentAdapter } from '../../../types/index.js'\nimport type { InitiatePaymentReturnType, 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 initiatePayment: (props: Props) => NonNullable<PaymentAdapter>['initiatePayment'] =\n (props) =>\n async ({ data, req, transactionsSlug }) => {\n const payload = req.payload\n const { apiVersion, appInfo, secretKey } = props || {}\n\n const customerEmail = data.customerEmail\n const currency = data.currency\n const cart = data.cart\n const amount = cart.subtotal\n const billingAddressFromData = data.billingAddress\n const shippingAddressFromData = data.shippingAddress\n\n if (!secretKey) {\n throw new Error('Stripe secret key is required.')\n }\n\n if (!currency) {\n throw new Error('Currency is required.')\n }\n\n if (!cart || !cart.items || cart.items.length === 0) {\n throw new Error('Cart is empty or not provided.')\n }\n\n if (!customerEmail || typeof customerEmail !== 'string') {\n throw new Error('A valid customer email is required to make a purchase.')\n }\n\n if (!amount || typeof amount !== 'number' || amount <= 0) {\n throw new Error('A valid amount is required to initiate a payment.')\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-06-30.preview',\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 const flattenedCart = cart.items.map((item) => {\n const productID = typeof item.product === 'object' ? item.product.id : item.product\n const variantID = item.variant\n ? typeof item.variant === 'object'\n ? item.variant.id\n : item.variant\n : undefined\n\n // Preserve any additional custom properties (e.g., deliveryOption, customizations)\n // that may have been added via cartItemMatcher\n const { product: _product, variant: _variant, ...customProperties } = item\n\n return {\n ...customProperties,\n product: productID,\n quantity: item.quantity,\n ...(variantID ? { variant: variantID } : {}),\n }\n })\n\n const shippingAddressAsString = JSON.stringify(shippingAddressFromData)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount,\n automatic_payment_methods: {\n enabled: true,\n },\n currency,\n customer: customer.id,\n metadata: {\n cartID: cart.id,\n cartItemsSnapshot: JSON.stringify(flattenedCart),\n shippingAddress: shippingAddressAsString,\n },\n })\n\n // Create a transaction for the payment intent in the database\n const transaction = await payload.create({\n collection: transactionsSlug,\n data: {\n ...(req.user ? { customer: req.user.id } : { customerEmail }),\n amount: paymentIntent.amount,\n billingAddress: billingAddressFromData,\n cart: cart.id,\n currency: paymentIntent.currency.toUpperCase(),\n items: flattenedCart,\n paymentMethod: 'stripe',\n status: 'pending',\n stripe: {\n customerID: customer.id,\n paymentIntentID: paymentIntent.id,\n },\n },\n overrideAccess: true,\n req,\n })\n\n const returnData: InitiatePaymentReturnType = {\n clientSecret: paymentIntent.client_secret || '',\n message: 'Payment initiated successfully',\n paymentIntentID: paymentIntent.id,\n }\n\n return returnData\n } catch (error) {\n payload.logger.error({ err: error, msg: 'Error initiating payment with Stripe' })\n\n throw new Error(error instanceof Error ? error.message : 'Unknown error initiating payment')\n }\n }\n"],"names":["Stripe","initiatePayment","props","data","req","transactionsSlug","payload","apiVersion","appInfo","secretKey","customerEmail","currency","cart","amount","subtotal","billingAddressFromData","billingAddress","shippingAddressFromData","shippingAddress","Error","items","length","stripe","name","url","customer","customers","list","email","id","create","flattenedCart","map","item","productID","product","variantID","variant","undefined","_product","_variant","customProperties","quantity","shippingAddressAsString","JSON","stringify","paymentIntent","paymentIntents","automatic_payment_methods","enabled","metadata","cartID","cartItemsSnapshot","transaction","collection","user","toUpperCase","paymentMethod","status","customerID","paymentIntentID","overrideAccess","returnData","clientSecret","client_secret","message","error","logger","err","msg"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ type SettlementPaymentIntent = {
2
+ amount?: unknown;
3
+ currency?: unknown;
4
+ customer?: unknown;
5
+ id?: unknown;
6
+ metadata?: unknown;
7
+ status?: unknown;
8
+ };
9
+ type SettlementTransaction = {
10
+ amount?: unknown;
11
+ cart?: unknown;
12
+ currency?: unknown;
13
+ customer?: unknown;
14
+ customerEmail?: unknown;
15
+ id?: unknown;
16
+ items?: unknown;
17
+ order?: unknown;
18
+ status?: unknown;
19
+ stripe?: unknown;
20
+ };
21
+ type SettlementValidationArgs = {
22
+ canonicalCartID: unknown;
23
+ cartItemsSnapshot: unknown;
24
+ customerEmail: unknown;
25
+ paymentIntent: SettlementPaymentIntent;
26
+ paymentIntentID: string;
27
+ transaction: SettlementTransaction;
28
+ user?: {
29
+ id?: unknown;
30
+ } | null;
31
+ };
32
+ export declare const getRelationshipID: (value: unknown) => string | undefined;
33
+ export declare const normalizeEmail: (value: unknown) => string | undefined;
34
+ export declare const normalizeCartItems: (items: unknown) => unknown[];
35
+ export declare const validateSettlement: ({ canonicalCartID, cartItemsSnapshot, customerEmail, paymentIntent, paymentIntentID, transaction, user, }: SettlementValidationArgs) => void;
36
+ export {};
37
+ //# sourceMappingURL=validateSettlement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSettlement.d.ts","sourceRoot":"","sources":["../../../../src/payments/adapters/stripe/validateSettlement.ts"],"names":[],"mappings":"AAEA,KAAK,uBAAuB,GAAG;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,KAAK,qBAAqB,GAAG;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,KAAK,wBAAwB,GAAG;IAC9B,eAAe,EAAE,OAAO,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,aAAa,EAAE,OAAO,CAAA;IACtB,aAAa,EAAE,uBAAuB,CAAA;IACtC,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,qBAAqB,CAAA;IAClC,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAA;CAC/B,CAAA;AAED,eAAO,MAAM,iBAAiB,UAAW,OAAO,KAAG,MAAM,GAAG,SAY3D,CAAA;AAED,eAAO,MAAM,cAAc,UAAW,OAAO,KAAG,MAAM,GAAG,SAQxD,CAAA;AAED,eAAO,MAAM,kBAAkB,UAAW,OAAO,KAAG,OAAO,EA0C1D,CAAA;AAED,eAAO,MAAM,kBAAkB,8GAQ5B,wBAAwB,KAAG,IA2E7B,CAAA"}
@@ -0,0 +1,157 @@
1
+ export const getRelationshipID = (value)=>{
2
+ const relationshipID = isRecord(value) ? value.id : value;
3
+ if (typeof relationshipID === 'number' && Number.isFinite(relationshipID)) {
4
+ return String(relationshipID);
5
+ }
6
+ if (typeof relationshipID === 'string' && relationshipID.trim()) {
7
+ return relationshipID;
8
+ }
9
+ return undefined;
10
+ };
11
+ export const normalizeEmail = (value)=>{
12
+ if (typeof value !== 'string') {
13
+ return undefined;
14
+ }
15
+ const normalizedEmail = value.trim().toLowerCase();
16
+ return normalizedEmail || undefined;
17
+ };
18
+ export const normalizeCartItems = (items)=>{
19
+ if (!Array.isArray(items) || items.length === 0) {
20
+ throw new Error('Cart items are missing or invalid');
21
+ }
22
+ return items.map((item)=>{
23
+ if (!isRecord(item)) {
24
+ throw new Error('Cart items are missing or invalid');
25
+ }
26
+ const productID = getRelationshipID(item.product);
27
+ if (!productID || typeof item.quantity !== 'number' || !Number.isFinite(item.quantity)) {
28
+ throw new Error('Cart items are missing or invalid');
29
+ }
30
+ return Object.fromEntries(Object.entries(item).flatMap(([key, value])=>{
31
+ if (key === 'product') {
32
+ return [
33
+ [
34
+ key,
35
+ productID
36
+ ]
37
+ ];
38
+ }
39
+ if (key === 'variant') {
40
+ if (value === null || value === undefined) {
41
+ return [];
42
+ }
43
+ const variantID = getRelationshipID(value);
44
+ if (!variantID) {
45
+ throw new Error('Cart item variant relationship is invalid');
46
+ }
47
+ return [
48
+ [
49
+ key,
50
+ variantID
51
+ ]
52
+ ];
53
+ }
54
+ const normalizedValue = normalizeValue(value);
55
+ return normalizedValue === undefined ? [] : [
56
+ [
57
+ key,
58
+ normalizedValue
59
+ ]
60
+ ];
61
+ }));
62
+ });
63
+ };
64
+ export const validateSettlement = ({ canonicalCartID, cartItemsSnapshot, customerEmail, paymentIntent, paymentIntentID, transaction, user })=>{
65
+ if (paymentIntentID !== getNestedString(transaction, 'stripe', 'paymentIntentID') || paymentIntentID !== paymentIntent.id) {
66
+ throw new Error('PaymentIntent does not match the transaction');
67
+ }
68
+ const normalizedCartID = getRelationshipID(canonicalCartID);
69
+ if (!normalizedCartID || normalizedCartID !== getRelationshipID(transaction.cart)) {
70
+ throw new Error('Canonical cart does not match the transaction cart');
71
+ }
72
+ const metadata = isRecord(paymentIntent.metadata) ? paymentIntent.metadata : undefined;
73
+ if (normalizedCartID !== getRelationshipID(metadata?.cartID)) {
74
+ throw new Error('Canonical cart does not match the PaymentIntent cart');
75
+ }
76
+ const transactionCustomerID = getRelationshipID(transaction.customer);
77
+ if (user !== null && user !== undefined) {
78
+ const authenticatedUserID = getRelationshipID(user.id);
79
+ if (!authenticatedUserID) {
80
+ throw new Error('Authenticated customer ID is missing or invalid');
81
+ }
82
+ if (transactionCustomerID !== authenticatedUserID) {
83
+ throw new Error('Authenticated customer does not match the transaction customer');
84
+ }
85
+ } else {
86
+ if (transactionCustomerID) {
87
+ throw new Error('Guest transaction belongs to an authenticated customer');
88
+ }
89
+ const normalizedCustomerEmail = normalizeEmail(customerEmail);
90
+ if (!normalizedCustomerEmail || normalizedCustomerEmail !== normalizeEmail(transaction.customerEmail)) {
91
+ throw new Error('Guest email does not match the transaction email');
92
+ }
93
+ }
94
+ const stripeCustomerID = getNestedString(transaction, 'stripe', 'customerID');
95
+ if (!stripeCustomerID || stripeCustomerID !== getRelationshipID(paymentIntent.customer)) {
96
+ throw new Error('Stripe customer does not match the transaction');
97
+ }
98
+ if (paymentIntent.amount !== transaction.amount) {
99
+ throw new Error('Stripe amount does not match the transaction amount');
100
+ }
101
+ if (typeof paymentIntent.currency !== 'string' || typeof transaction.currency !== 'string' || paymentIntent.currency.toUpperCase() !== transaction.currency) {
102
+ throw new Error('Stripe currency does not match the transaction currency');
103
+ }
104
+ const normalizedSnapshot = normalizeCartItems(cartItemsSnapshot);
105
+ const normalizedTransactionItems = normalizeCartItems(transaction.items);
106
+ if (stableSerialize(normalizedSnapshot) !== stableSerialize(normalizedTransactionItems)) {
107
+ throw new Error('Stripe cart items do not match the transaction items');
108
+ }
109
+ if (paymentIntent.status !== 'succeeded') {
110
+ throw new Error('Payment not completed.');
111
+ }
112
+ };
113
+ const getNestedString = (value, groupName, fieldName)=>{
114
+ if (!isRecord(value)) {
115
+ return undefined;
116
+ }
117
+ const group = value[groupName];
118
+ if (!isRecord(group) || typeof group[fieldName] !== 'string') {
119
+ return undefined;
120
+ }
121
+ return group[fieldName];
122
+ };
123
+ const isRecord = (value)=>typeof value === 'object' && value !== null && !Array.isArray(value);
124
+ const normalizeValue = (value)=>{
125
+ if (Array.isArray(value)) {
126
+ return value.map((entry)=>normalizeValue(entry));
127
+ }
128
+ if (isRecord(value)) {
129
+ return Object.fromEntries(Object.entries(value).flatMap(([entryKey, entryValue])=>{
130
+ const normalizedValue = normalizeValue(entryValue);
131
+ return normalizedValue === undefined ? [] : [
132
+ [
133
+ entryKey,
134
+ normalizedValue
135
+ ]
136
+ ];
137
+ }));
138
+ }
139
+ if (value === null || typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string') {
140
+ return value;
141
+ }
142
+ if (value === undefined) {
143
+ return undefined;
144
+ }
145
+ throw new Error('Cart items contain unsupported data');
146
+ };
147
+ const stableSerialize = (value)=>{
148
+ if (Array.isArray(value)) {
149
+ return `[${value.map((entry)=>stableSerialize(entry)).join(',')}]`;
150
+ }
151
+ if (isRecord(value)) {
152
+ return `{${Object.keys(value).sort().map((key)=>`${JSON.stringify(key)}:${stableSerialize(value[key])}`).join(',')}}`;
153
+ }
154
+ return JSON.stringify(value);
155
+ };
156
+
157
+ //# sourceMappingURL=validateSettlement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/payments/adapters/stripe/validateSettlement.ts"],"sourcesContent":["type RecordValue = Record<string, unknown>\n\ntype SettlementPaymentIntent = {\n amount?: unknown\n currency?: unknown\n customer?: unknown\n id?: unknown\n metadata?: unknown\n status?: unknown\n}\n\ntype SettlementTransaction = {\n amount?: unknown\n cart?: unknown\n currency?: unknown\n customer?: unknown\n customerEmail?: unknown\n id?: unknown\n items?: unknown\n order?: unknown\n status?: unknown\n stripe?: unknown\n}\n\ntype SettlementValidationArgs = {\n canonicalCartID: unknown\n cartItemsSnapshot: unknown\n customerEmail: unknown\n paymentIntent: SettlementPaymentIntent\n paymentIntentID: string\n transaction: SettlementTransaction\n user?: { id?: unknown } | null\n}\n\nexport const getRelationshipID = (value: unknown): string | undefined => {\n const relationshipID = isRecord(value) ? value.id : value\n\n if (typeof relationshipID === 'number' && Number.isFinite(relationshipID)) {\n return String(relationshipID)\n }\n\n if (typeof relationshipID === 'string' && relationshipID.trim()) {\n return relationshipID\n }\n\n return undefined\n}\n\nexport const normalizeEmail = (value: unknown): string | undefined => {\n if (typeof value !== 'string') {\n return undefined\n }\n\n const normalizedEmail = value.trim().toLowerCase()\n\n return normalizedEmail || undefined\n}\n\nexport const normalizeCartItems = (items: unknown): unknown[] => {\n if (!Array.isArray(items) || items.length === 0) {\n throw new Error('Cart items are missing or invalid')\n }\n\n return items.map((item) => {\n if (!isRecord(item)) {\n throw new Error('Cart items are missing or invalid')\n }\n\n const productID = getRelationshipID(item.product)\n\n if (!productID || typeof item.quantity !== 'number' || !Number.isFinite(item.quantity)) {\n throw new Error('Cart items are missing or invalid')\n }\n\n return Object.fromEntries(\n Object.entries(item).flatMap(([key, value]) => {\n if (key === 'product') {\n return [[key, productID]]\n }\n\n if (key === 'variant') {\n if (value === null || value === undefined) {\n return []\n }\n\n const variantID = getRelationshipID(value)\n\n if (!variantID) {\n throw new Error('Cart item variant relationship is invalid')\n }\n\n return [[key, variantID]]\n }\n\n const normalizedValue = normalizeValue(value)\n\n return normalizedValue === undefined ? [] : [[key, normalizedValue]]\n }),\n )\n })\n}\n\nexport const validateSettlement = ({\n canonicalCartID,\n cartItemsSnapshot,\n customerEmail,\n paymentIntent,\n paymentIntentID,\n transaction,\n user,\n}: SettlementValidationArgs): void => {\n if (\n paymentIntentID !== getNestedString(transaction, 'stripe', 'paymentIntentID') ||\n paymentIntentID !== paymentIntent.id\n ) {\n throw new Error('PaymentIntent does not match the transaction')\n }\n\n const normalizedCartID = getRelationshipID(canonicalCartID)\n\n if (!normalizedCartID || normalizedCartID !== getRelationshipID(transaction.cart)) {\n throw new Error('Canonical cart does not match the transaction cart')\n }\n\n const metadata = isRecord(paymentIntent.metadata) ? paymentIntent.metadata : undefined\n\n if (normalizedCartID !== getRelationshipID(metadata?.cartID)) {\n throw new Error('Canonical cart does not match the PaymentIntent cart')\n }\n\n const transactionCustomerID = getRelationshipID(transaction.customer)\n\n if (user !== null && user !== undefined) {\n const authenticatedUserID = getRelationshipID(user.id)\n\n if (!authenticatedUserID) {\n throw new Error('Authenticated customer ID is missing or invalid')\n }\n\n if (transactionCustomerID !== authenticatedUserID) {\n throw new Error('Authenticated customer does not match the transaction customer')\n }\n } else {\n if (transactionCustomerID) {\n throw new Error('Guest transaction belongs to an authenticated customer')\n }\n\n const normalizedCustomerEmail = normalizeEmail(customerEmail)\n\n if (\n !normalizedCustomerEmail ||\n normalizedCustomerEmail !== normalizeEmail(transaction.customerEmail)\n ) {\n throw new Error('Guest email does not match the transaction email')\n }\n }\n\n const stripeCustomerID = getNestedString(transaction, 'stripe', 'customerID')\n\n if (!stripeCustomerID || stripeCustomerID !== getRelationshipID(paymentIntent.customer)) {\n throw new Error('Stripe customer does not match the transaction')\n }\n\n if (paymentIntent.amount !== transaction.amount) {\n throw new Error('Stripe amount does not match the transaction amount')\n }\n\n if (\n typeof paymentIntent.currency !== 'string' ||\n typeof transaction.currency !== 'string' ||\n paymentIntent.currency.toUpperCase() !== transaction.currency\n ) {\n throw new Error('Stripe currency does not match the transaction currency')\n }\n\n const normalizedSnapshot = normalizeCartItems(cartItemsSnapshot)\n const normalizedTransactionItems = normalizeCartItems(transaction.items)\n\n if (stableSerialize(normalizedSnapshot) !== stableSerialize(normalizedTransactionItems)) {\n throw new Error('Stripe cart items do not match the transaction items')\n }\n\n if (paymentIntent.status !== 'succeeded') {\n throw new Error('Payment not completed.')\n }\n}\n\nconst getNestedString = (\n value: unknown,\n groupName: string,\n fieldName: string,\n): string | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n const group = value[groupName]\n\n if (!isRecord(group) || typeof group[fieldName] !== 'string') {\n return undefined\n }\n\n return group[fieldName]\n}\n\nconst isRecord = (value: unknown): value is RecordValue =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst normalizeValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeValue(entry))\n }\n\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value).flatMap(([entryKey, entryValue]) => {\n const normalizedValue = normalizeValue(entryValue)\n\n return normalizedValue === undefined ? [] : [[entryKey, normalizedValue]]\n }),\n )\n }\n\n if (\n value === null ||\n typeof value === 'boolean' ||\n typeof value === 'number' ||\n typeof value === 'string'\n ) {\n return value\n }\n\n if (value === undefined) {\n return undefined\n }\n\n throw new Error('Cart items contain unsupported data')\n}\n\nconst stableSerialize = (value: unknown): string => {\n if (Array.isArray(value)) {\n return `[${value.map((entry) => stableSerialize(entry)).join(',')}]`\n }\n\n if (isRecord(value)) {\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableSerialize(value[key])}`)\n .join(',')}}`\n }\n\n return JSON.stringify(value)\n}\n"],"names":["getRelationshipID","value","relationshipID","isRecord","id","Number","isFinite","String","trim","undefined","normalizeEmail","normalizedEmail","toLowerCase","normalizeCartItems","items","Array","isArray","length","Error","map","item","productID","product","quantity","Object","fromEntries","entries","flatMap","key","variantID","normalizedValue","normalizeValue","validateSettlement","canonicalCartID","cartItemsSnapshot","customerEmail","paymentIntent","paymentIntentID","transaction","user","getNestedString","normalizedCartID","cart","metadata","cartID","transactionCustomerID","customer","authenticatedUserID","normalizedCustomerEmail","stripeCustomerID","amount","currency","toUpperCase","normalizedSnapshot","normalizedTransactionItems","stableSerialize","status","groupName","fieldName","group","entry","entryKey","entryValue","join","keys","sort","JSON","stringify"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/provider/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAIpD,OAAO,KAAgF,MAAM,OAAO,CAAA;AAEpG,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EAEf,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,oBAAoB,EACrB,MAAM,sBAAsB,CAAA;AAsD7B,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAugCpD,CAAA;AAED,eAAO,MAAM,YAAY,4BAQxB,CAAA;AAED,eAAO,MAAM,kBAAkB,uBAI9B,CAAA;AAED,eAAO,MAAM,WAAW;;6BAIX,IAAI,GAAG,MAAM,YAAY;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAG,MAAM;;;CAmCtF,CAAA;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,eAAe;;;;;UAkB/B,CAAC;;;;;;;EAQlB;AAED,eAAO,MAAM,WAAW;;;;;;;;;;CASvB,CAAA;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,mBAAmB;eAOvB,CAAC,EAAE;;;;;;;;;;EACrC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/provider/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAIpD,OAAO,KAAgF,MAAM,OAAO,CAAA;AAEpG,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,oBAAoB,EAErB,MAAM,sBAAsB,CAAA;AAsD7B,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAyiCpD,CAAA;AAED,eAAO,MAAM,YAAY,4BAQxB,CAAA;AAED,eAAO,MAAM,kBAAkB,uBAI9B,CAAA;AAED,eAAO,MAAM,WAAW;;6BAIX,IAAI,GAAG,MAAM,YAAY;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAG,MAAM;;;CAmCtF,CAAA;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,eAAe;;;;;UAkB/B,CAAC;;;;;;;EAQlB;AAED,eAAO,MAAM,WAAW;;;;;;;;;;CASvB,CAAA;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,mBAAmB;eAOvB,CAAC,EAAE;;;;;;;;;;EACrC"}
@@ -68,10 +68,6 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
68
68
  ...syncLocalStorage
69
69
  } : defaultLocalStorage;
70
70
  const { apiRoute = '/api', cartsFetchQuery = {} } = api || {};
71
- const baseAPIURL = formatAdminURL({
72
- apiRoute,
73
- path: ''
74
- });
75
71
  const config = useMemo(()=>({
76
72
  addressesSlug,
77
73
  api: {
@@ -126,7 +122,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
126
122
  ]);
127
123
  const createCart = useCallback(async (initialData)=>{
128
124
  const query = qs.stringify(cartQuery);
129
- const response = await fetch(`${baseAPIURL}/${cartsSlug}?${query}`, {
125
+ const response = await fetch(formatAdminURL({
126
+ apiRoute,
127
+ path: `/${cartsSlug}?${query}`
128
+ }), {
130
129
  body: JSON.stringify({
131
130
  ...initialData,
132
131
  currency: selectedCurrency.code,
@@ -152,7 +151,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
152
151
  }
153
152
  return data.doc;
154
153
  }, [
155
- baseAPIURL,
154
+ apiRoute,
156
155
  cartQuery,
157
156
  cartsSlug,
158
157
  selectedCurrency.code,
@@ -165,7 +164,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
165
164
  secret: options.secret
166
165
  } : {}
167
166
  });
168
- const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}?${query}`, {
167
+ const response = await fetch(formatAdminURL({
168
+ apiRoute,
169
+ path: `/${cartsSlug}/${cartID}?${query}`
170
+ }), {
169
171
  credentials: 'include',
170
172
  headers: {
171
173
  'Content-Type': 'application/json'
@@ -182,7 +184,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
182
184
  }
183
185
  return data;
184
186
  }, [
185
- baseAPIURL,
187
+ apiRoute,
186
188
  cartQuery,
187
189
  cartsSlug
188
190
  ]);
@@ -223,7 +225,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
223
225
  try {
224
226
  if (cartID) {
225
227
  // Use server-side endpoint for adding items
226
- const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/add-item`, {
228
+ const response = await fetch(formatAdminURL({
229
+ apiRoute,
230
+ path: `/${cartsSlug}/${cartID}/add-item`
231
+ }), {
227
232
  body: JSON.stringify({
228
233
  item,
229
234
  quantity,
@@ -274,7 +279,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
274
279
  setIsLoading(false);
275
280
  }
276
281
  }, [
277
- baseAPIURL,
282
+ apiRoute,
278
283
  cartID,
279
284
  cartSecret,
280
285
  cartsSlug,
@@ -288,7 +293,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
288
293
  }
289
294
  setIsLoading(true);
290
295
  try {
291
- const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/remove-item`, {
296
+ const response = await fetch(formatAdminURL({
297
+ apiRoute,
298
+ path: `/${cartsSlug}/${cartID}/remove-item`
299
+ }), {
292
300
  body: JSON.stringify({
293
301
  itemID: targetID,
294
302
  secret: cartSecret
@@ -325,7 +333,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
325
333
  setIsLoading(false);
326
334
  }
327
335
  }, [
328
- baseAPIURL,
336
+ apiRoute,
329
337
  cartID,
330
338
  cartSecret,
331
339
  cartsSlug,
@@ -338,7 +346,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
338
346
  }
339
347
  setIsLoading(true);
340
348
  try {
341
- const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/update-item`, {
349
+ const response = await fetch(formatAdminURL({
350
+ apiRoute,
351
+ path: `/${cartsSlug}/${cartID}/update-item`
352
+ }), {
342
353
  body: JSON.stringify({
343
354
  itemID: targetID,
344
355
  quantity: {
@@ -378,7 +389,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
378
389
  setIsLoading(false);
379
390
  }
380
391
  }, [
381
- baseAPIURL,
392
+ apiRoute,
382
393
  cartID,
383
394
  cartSecret,
384
395
  cartsSlug,
@@ -391,7 +402,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
391
402
  }
392
403
  setIsLoading(true);
393
404
  try {
394
- const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/update-item`, {
405
+ const response = await fetch(formatAdminURL({
406
+ apiRoute,
407
+ path: `/${cartsSlug}/${cartID}/update-item`
408
+ }), {
395
409
  body: JSON.stringify({
396
410
  itemID: targetID,
397
411
  quantity: {
@@ -431,7 +445,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
431
445
  setIsLoading(false);
432
446
  }
433
447
  }, [
434
- baseAPIURL,
448
+ apiRoute,
435
449
  cartID,
436
450
  cartSecret,
437
451
  cartsSlug,
@@ -444,7 +458,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
444
458
  }
445
459
  setIsLoading(true);
446
460
  try {
447
- const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/clear`, {
461
+ const response = await fetch(formatAdminURL({
462
+ apiRoute,
463
+ path: `/${cartsSlug}/${cartID}/clear`
464
+ }), {
448
465
  body: JSON.stringify({
449
466
  secret: cartSecret
450
467
  }),
@@ -480,7 +497,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
480
497
  setIsLoading(false);
481
498
  }
482
499
  }, [
483
- baseAPIURL,
500
+ apiRoute,
484
501
  cartID,
485
502
  cartSecret,
486
503
  cartsSlug,
@@ -511,7 +528,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
511
528
  setSelectedPaymentMethod(paymentMethodID);
512
529
  if (paymentMethod.initiatePayment) {
513
530
  try {
514
- const response = await fetch(`${baseAPIURL}/payments/${paymentMethodID}/initiate`, {
531
+ const response = await fetch(formatAdminURL({
532
+ apiRoute,
533
+ path: `/payments/${paymentMethodID}/initiate`
534
+ }), {
515
535
  body: JSON.stringify({
516
536
  cartID,
517
537
  currency: selectedCurrency.code,
@@ -544,7 +564,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
544
564
  throw new Error(`Payment method "${paymentMethodID}" does not support payment initiation`);
545
565
  }
546
566
  }, [
547
- baseAPIURL,
567
+ apiRoute,
548
568
  cartID,
549
569
  cartSecret,
550
570
  debug,
@@ -560,7 +580,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
560
580
  throw new Error(`Payment method with ID "${paymentMethodID}" not found`);
561
581
  }
562
582
  if (paymentMethod.confirmOrder) {
563
- const response = await fetch(`${baseAPIURL}/payments/${paymentMethodID}/confirm-order`, {
583
+ const response = await fetch(formatAdminURL({
584
+ apiRoute,
585
+ path: `/payments/${paymentMethodID}/confirm-order`
586
+ }), {
564
587
  body: JSON.stringify({
565
588
  cartID,
566
589
  currency: selectedCurrency.code,
@@ -586,7 +609,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
586
609
  throw new Error(`Payment method "${paymentMethodID}" does not support order confirmation`);
587
610
  }
588
611
  }, [
589
- baseAPIURL,
612
+ apiRoute,
590
613
  cartID,
591
614
  cartSecret,
592
615
  paymentMethods,
@@ -601,7 +624,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
601
624
  cart: true
602
625
  }
603
626
  });
604
- const response = await fetch(`${baseAPIURL}/${customersSlug}/me?${query}`, {
627
+ const response = await fetch(formatAdminURL({
628
+ apiRoute,
629
+ path: `/${customersSlug}/me?${query}`
630
+ }), {
605
631
  credentials: 'include',
606
632
  headers: {
607
633
  'Content-Type': 'application/json'
@@ -629,7 +655,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
629
655
  throw new Error(`Failed to fetch user: ${error instanceof Error ? error.message : 'Unknown error'}`);
630
656
  }
631
657
  }, [
632
- baseAPIURL,
658
+ apiRoute,
633
659
  customersSlug,
634
660
  debug
635
661
  ]);
@@ -643,7 +669,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
643
669
  limit: 0,
644
670
  pagination: false
645
671
  });
646
- const response = await fetch(`${baseAPIURL}/${addressesSlug}?${query}`, {
672
+ const response = await fetch(formatAdminURL({
673
+ apiRoute,
674
+ path: `/${addressesSlug}?${query}`
675
+ }), {
647
676
  credentials: 'include',
648
677
  headers: {
649
678
  'Content-Type': 'application/json'
@@ -671,7 +700,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
671
700
  }
672
701
  }, [
673
702
  user,
674
- baseAPIURL,
703
+ apiRoute,
675
704
  addressesSlug,
676
705
  debug
677
706
  ]);
@@ -680,7 +709,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
680
709
  throw new Error('User must be logged in to update or create an address');
681
710
  }
682
711
  try {
683
- const response = await fetch(`${baseAPIURL}/${addressesSlug}/${addressID}`, {
712
+ const response = await fetch(formatAdminURL({
713
+ apiRoute,
714
+ path: `/${addressesSlug}/${addressID}`
715
+ }), {
684
716
  body: JSON.stringify(address),
685
717
  credentials: 'include',
686
718
  headers: {
@@ -707,7 +739,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
707
739
  }
708
740
  }, [
709
741
  user,
710
- baseAPIURL,
742
+ apiRoute,
711
743
  addressesSlug,
712
744
  getAddresses,
713
745
  debug
@@ -717,7 +749,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
717
749
  throw new Error('User must be logged in to update or create an address');
718
750
  }
719
751
  try {
720
- const response = await fetch(`${baseAPIURL}/${addressesSlug}`, {
752
+ const response = await fetch(formatAdminURL({
753
+ apiRoute,
754
+ path: `/${addressesSlug}`
755
+ }), {
721
756
  body: JSON.stringify(address),
722
757
  credentials: 'include',
723
758
  headers: {
@@ -744,7 +779,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
744
779
  }
745
780
  }, [
746
781
  user,
747
- baseAPIURL,
782
+ apiRoute,
748
783
  addressesSlug,
749
784
  getAddresses,
750
785
  debug
@@ -784,7 +819,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
784
819
  */ const mergeCart = useCallback(async (targetCartID, sourceCartID, sourceSecret)=>{
785
820
  setIsLoading(true);
786
821
  try {
787
- const response = await fetch(`${baseAPIURL}/${cartsSlug}/${targetCartID}/merge`, {
822
+ const response = await fetch(formatAdminURL({
823
+ apiRoute,
824
+ path: `/${cartsSlug}/${targetCartID}/merge`
825
+ }), {
788
826
  body: JSON.stringify({
789
827
  sourceCartID,
790
828
  sourceSecret
@@ -818,7 +856,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
818
856
  setIsLoading(false);
819
857
  }
820
858
  }, [
821
- baseAPIURL,
859
+ apiRoute,
822
860
  cartsSlug,
823
861
  debug,
824
862
  getCart
@@ -862,7 +900,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
862
900
  } else {
863
901
  // User has no existing cart - transfer guest cart to user
864
902
  try {
865
- const response = await fetch(`${baseAPIURL}/${cartsSlug}/${guestCartID}?secret=${guestSecret}`, {
903
+ const response = await fetch(formatAdminURL({
904
+ apiRoute,
905
+ path: `/${cartsSlug}/${guestCartID}?secret=${guestSecret}`
906
+ }), {
866
907
  body: JSON.stringify({
867
908
  customer: fetchedUser.id,
868
909
  secret: null
@@ -897,7 +938,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
897
938
  localStorage.setItem(localStorageConfig.key, cartID);
898
939
  }
899
940
  }, [
900
- baseAPIURL,
941
+ apiRoute,
901
942
  cartID,
902
943
  cartSecret,
903
944
  cartsSlug,