@payment-kit-js/vanilla 0.5.15 → 0.5.16

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 (80) hide show
  1. package/dist/{airwallex-apple-pay-adapter-Bs8AdQKY.mjs → airwallex-apple-pay-adapter-CPz54c9e.mjs} +1 -1
  2. package/dist/{airwallex-apple-pay-adapter-Bs8AdQKY.mjs.map → airwallex-apple-pay-adapter-CPz54c9e.mjs.map} +1 -1
  3. package/dist/{airwallex-apple-pay-adapter-D8enI9Vq.d.mts → airwallex-apple-pay-adapter-CnnZ7VL6.d.mts} +1 -1
  4. package/dist/{airwallex-apple-pay-adapter-D8enI9Vq.d.mts.map → airwallex-apple-pay-adapter-CnnZ7VL6.d.mts.map} +1 -1
  5. package/dist/{airwallex-google-pay-adapter-C8JTp01q.mjs → airwallex-google-pay-adapter-BvlROwj_.mjs} +1 -1
  6. package/dist/{airwallex-google-pay-adapter-C8JTp01q.mjs.map → airwallex-google-pay-adapter-BvlROwj_.mjs.map} +1 -1
  7. package/dist/{airwallex-google-pay-adapter-adaDktQM.d.mts → airwallex-google-pay-adapter-D-AxVLLq.d.mts} +1 -1
  8. package/dist/{airwallex-google-pay-adapter-adaDktQM.d.mts.map → airwallex-google-pay-adapter-D-AxVLLq.d.mts.map} +1 -1
  9. package/dist/analytics-Blvs2DW7.mjs +333 -0
  10. package/dist/analytics-Blvs2DW7.mjs.map +1 -0
  11. package/dist/{bnpl-shared-B-en2sPr.d.mts → bnpl-shared-BQwCBD45.d.mts} +2 -2
  12. package/dist/{bnpl-shared-B-en2sPr.d.mts.map → bnpl-shared-BQwCBD45.d.mts.map} +1 -1
  13. package/dist/{bnpl-shared-CEAXTL3Q.mjs → bnpl-shared-DGs1YzS9.mjs} +2 -2
  14. package/dist/{bnpl-shared-CEAXTL3Q.mjs.map → bnpl-shared-DGs1YzS9.mjs.map} +1 -1
  15. package/dist/cdn/paymentkit.js +67 -12
  16. package/dist/cdn/paymentkit.js.map +2 -2
  17. package/dist/cdn/paymentkit.min.js +5 -5
  18. package/dist/cdn/paymentkit.min.js.map +3 -3
  19. package/dist/{connect-card-Cra_F1cC.d.mts → connect-card-CZhzK_Tp.d.mts} +1 -1
  20. package/dist/{connect-card-Cra_F1cC.d.mts.map → connect-card-CZhzK_Tp.d.mts.map} +1 -1
  21. package/dist/{connect-card-D3Je4V7p.mjs → connect-card-kXLdSNTL.mjs} +2 -2
  22. package/dist/{connect-card-D3Je4V7p.mjs.map → connect-card-kXLdSNTL.mjs.map} +1 -1
  23. package/dist/{connect-tunnel-x-BhVAej5Q.mjs → connect-tunnel-x-5XOct5Tm.mjs} +2 -2
  24. package/dist/{connect-tunnel-x-BhVAej5Q.mjs.map → connect-tunnel-x-5XOct5Tm.mjs.map} +1 -1
  25. package/dist/{connect-tunnel-x-Wh-JG1O5.d.mts → connect-tunnel-x-BKtMfoGh.d.mts} +1 -1
  26. package/dist/{connect-tunnel-x-Wh-JG1O5.d.mts.map → connect-tunnel-x-BKtMfoGh.d.mts.map} +1 -1
  27. package/dist/index.d.mts +3 -3
  28. package/dist/index.mjs +5 -334
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/{next-action-handlers-BZs04hYb.mjs → next-action-handlers-CLOt1wzO.mjs} +1 -1
  31. package/dist/{next-action-handlers-BZs04hYb.mjs.map → next-action-handlers-CLOt1wzO.mjs.map} +1 -1
  32. package/dist/payment-methods/affirm.d.mts +4 -4
  33. package/dist/payment-methods/affirm.mjs +2 -2
  34. package/dist/payment-methods/afterpay.d.mts +4 -4
  35. package/dist/payment-methods/afterpay.mjs +2 -2
  36. package/dist/payment-methods/airwallex-apple-pay-adapter.d.mts +1 -1
  37. package/dist/payment-methods/airwallex-apple-pay-adapter.mjs +1 -1
  38. package/dist/payment-methods/airwallex-google-pay-adapter.d.mts +1 -1
  39. package/dist/payment-methods/airwallex-google-pay-adapter.mjs +1 -1
  40. package/dist/payment-methods/apple-pay.d.mts +5 -5
  41. package/dist/payment-methods/apple-pay.mjs +4 -4
  42. package/dist/payment-methods/bnpl-shared.d.mts +4 -4
  43. package/dist/payment-methods/bnpl-shared.mjs +2 -2
  44. package/dist/payment-methods/card.d.mts +3 -3
  45. package/dist/payment-methods/card.d.mts.map +1 -1
  46. package/dist/payment-methods/card.mjs +77 -18
  47. package/dist/payment-methods/card.mjs.map +1 -1
  48. package/dist/payment-methods/google-pay.d.mts +5 -5
  49. package/dist/payment-methods/google-pay.mjs +4 -4
  50. package/dist/payment-methods/klarna.d.mts +4 -4
  51. package/dist/payment-methods/klarna.mjs +2 -2
  52. package/dist/payment-methods/next-action-handlers.mjs +1 -1
  53. package/dist/payment-methods/paypal.d.mts +3 -3
  54. package/dist/payment-methods/paypal.mjs +1 -1
  55. package/dist/payment-methods/stripe-apple-pay-adapter.d.mts +1 -1
  56. package/dist/payment-methods/stripe-apple-pay-adapter.mjs +1 -1
  57. package/dist/payment-methods/stripe-google-pay-adapter.d.mts +1 -1
  58. package/dist/payment-methods/stripe-google-pay-adapter.mjs +1 -1
  59. package/dist/payment-methods/vgs-collect-loader.mjs +1 -1
  60. package/dist/penpal/connect-card.d.mts +1 -1
  61. package/dist/penpal/connect-card.mjs +2 -2
  62. package/dist/penpal/connect-tunnel-x.d.mts +1 -1
  63. package/dist/penpal/connect-tunnel-x.mjs +2 -2
  64. package/dist/{penpal-BFKeZTVz.mjs → penpal-CBrj43M5.mjs} +1 -1
  65. package/dist/{penpal-BFKeZTVz.mjs.map → penpal-CBrj43M5.mjs.map} +1 -1
  66. package/dist/{stripe-apple-pay-adapter-BLRjqgDf.mjs → stripe-apple-pay-adapter-7rF6xRIG.mjs} +1 -1
  67. package/dist/{stripe-apple-pay-adapter-BLRjqgDf.mjs.map → stripe-apple-pay-adapter-7rF6xRIG.mjs.map} +1 -1
  68. package/dist/{stripe-apple-pay-adapter-DcuGlQqQ.d.mts → stripe-apple-pay-adapter-D2OJRlAl.d.mts} +1 -1
  69. package/dist/{stripe-apple-pay-adapter-DcuGlQqQ.d.mts.map → stripe-apple-pay-adapter-D2OJRlAl.d.mts.map} +1 -1
  70. package/dist/{stripe-google-pay-adapter-BlQ2jVpE.d.mts → stripe-google-pay-adapter-B330fRiH.d.mts} +1 -1
  71. package/dist/{stripe-google-pay-adapter-BlQ2jVpE.d.mts.map → stripe-google-pay-adapter-B330fRiH.d.mts.map} +1 -1
  72. package/dist/{stripe-google-pay-adapter-CIkgjhw8.mjs → stripe-google-pay-adapter-B346KXt4.mjs} +1 -1
  73. package/dist/{stripe-google-pay-adapter-CIkgjhw8.mjs.map → stripe-google-pay-adapter-B346KXt4.mjs.map} +1 -1
  74. package/dist/{types-CQ8xbgoh.d.mts → types-B3mjYfOm.d.mts} +3 -3
  75. package/dist/{types-CQ8xbgoh.d.mts.map → types-B3mjYfOm.d.mts.map} +1 -1
  76. package/dist/{utils-B70Y8YcZ.mjs → utils-Dc6zwOe1.mjs} +1 -1
  77. package/dist/{utils-B70Y8YcZ.mjs.map → utils-Dc6zwOe1.mjs.map} +1 -1
  78. package/dist/{vgs-collect-loader-l5_Pnmhz.mjs → vgs-collect-loader-CTLSv4qv.mjs} +1 -1
  79. package/dist/{vgs-collect-loader-l5_Pnmhz.mjs.map → vgs-collect-loader-CTLSv4qv.mjs.map} +1 -1
  80. package/package.json +2 -2
@@ -1,7 +1,7 @@
1
- import { r as PaymentMethod } from "../types-CQ8xbgoh.mjs";
2
- import "../connect-card-Cra_F1cC.mjs";
3
- import "../connect-tunnel-x-Wh-JG1O5.mjs";
4
- import { n as BnplCustomerInfo, s as BnplSubmitOptions, t as BnplCheckoutResponse } from "../bnpl-shared-B-en2sPr.mjs";
1
+ import { r as PaymentMethod } from "../types-B3mjYfOm.mjs";
2
+ import "../connect-card-CZhzK_Tp.mjs";
3
+ import "../connect-tunnel-x-BKtMfoGh.mjs";
4
+ import { n as BnplCustomerInfo, s as BnplSubmitOptions, t as BnplCheckoutResponse } from "../bnpl-shared-BQwCBD45.mjs";
5
5
 
6
6
  //#region src/payment-methods/klarna.d.ts
7
7
  type KlarnaCustomerInfo = BnplCustomerInfo;
@@ -1,5 +1,5 @@
1
- import "../utils-B70Y8YcZ.mjs";
2
- import { t as createBnplPaymentMethod } from "../bnpl-shared-CEAXTL3Q.mjs";
1
+ import "../utils-Dc6zwOe1.mjs";
2
+ import { t as createBnplPaymentMethod } from "../bnpl-shared-DGs1YzS9.mjs";
3
3
 
4
4
  //#region src/payment-methods/klarna.ts
5
5
  const KlarnaPaymentMethod = createBnplPaymentMethod({
@@ -1,3 +1,3 @@
1
- import { t as handleNextAction } from "../next-action-handlers-BZs04hYb.mjs";
1
+ import { t as handleNextAction } from "../next-action-handlers-CLOt1wzO.mjs";
2
2
 
3
3
  export { handleNextAction };
@@ -1,6 +1,6 @@
1
- import { r as PaymentMethod } from "../types-CQ8xbgoh.mjs";
2
- import "../connect-card-Cra_F1cC.mjs";
3
- import "../connect-tunnel-x-Wh-JG1O5.mjs";
1
+ import { r as PaymentMethod } from "../types-B3mjYfOm.mjs";
2
+ import "../connect-card-CZhzK_Tp.mjs";
3
+ import "../connect-tunnel-x-BKtMfoGh.mjs";
4
4
 
5
5
  //#region src/payment-methods/paypal.d.ts
6
6
  type PayPalCustomerInfo = {
@@ -1,4 +1,4 @@
1
- import { i as definePaymentMethod, n as collectFraudMetadata, o as getOrCreateCheckoutRequestId } from "../utils-B70Y8YcZ.mjs";
1
+ import { i as definePaymentMethod, n as collectFraudMetadata, o as getOrCreateCheckoutRequestId } from "../utils-Dc6zwOe1.mjs";
2
2
 
3
3
  //#region src/payment-methods/paypal.ts
4
4
  const defSubmitPayment = (states) => {
@@ -1,2 +1,2 @@
1
- import { a as StripeApplePayAdapter, i as ShowApplePaySheetResult, n as ApplePayPaymentRequestConfig, r as ConfirmResult, t as ApplePayMockScenario } from "../stripe-apple-pay-adapter-DcuGlQqQ.mjs";
1
+ import { a as StripeApplePayAdapter, i as ShowApplePaySheetResult, n as ApplePayPaymentRequestConfig, r as ConfirmResult, t as ApplePayMockScenario } from "../stripe-apple-pay-adapter-D2OJRlAl.mjs";
2
2
  export { ApplePayMockScenario, ApplePayPaymentRequestConfig, ConfirmResult, ShowApplePaySheetResult, StripeApplePayAdapter };
@@ -1,3 +1,3 @@
1
- import { n as StripeApplePayAdapter, t as ApplePayMockScenario } from "../stripe-apple-pay-adapter-BLRjqgDf.mjs";
1
+ import { n as StripeApplePayAdapter, t as ApplePayMockScenario } from "../stripe-apple-pay-adapter-7rF6xRIG.mjs";
2
2
 
3
3
  export { ApplePayMockScenario, StripeApplePayAdapter };
@@ -1,2 +1,2 @@
1
- import { a as StripeGooglePayAdapter, i as ShowPaymentSheetResult, n as GooglePayMockScenario, r as PaymentRequestConfig, t as ConfirmResult } from "../stripe-google-pay-adapter-BlQ2jVpE.mjs";
1
+ import { a as StripeGooglePayAdapter, i as ShowPaymentSheetResult, n as GooglePayMockScenario, r as PaymentRequestConfig, t as ConfirmResult } from "../stripe-google-pay-adapter-B330fRiH.mjs";
2
2
  export { ConfirmResult, GooglePayMockScenario, PaymentRequestConfig, ShowPaymentSheetResult, StripeGooglePayAdapter };
@@ -1,3 +1,3 @@
1
- import { n as StripeGooglePayAdapter, t as GooglePayMockScenario } from "../stripe-google-pay-adapter-CIkgjhw8.mjs";
1
+ import { n as StripeGooglePayAdapter, t as GooglePayMockScenario } from "../stripe-google-pay-adapter-B346KXt4.mjs";
2
2
 
3
3
  export { GooglePayMockScenario, StripeGooglePayAdapter };
@@ -1,3 +1,3 @@
1
- import { n as initVgsCollect, r as loadVgsCollectScript, t as createVgsCardFields } from "../vgs-collect-loader-l5_Pnmhz.mjs";
1
+ import { n as initVgsCollect, r as loadVgsCollectScript, t as createVgsCardFields } from "../vgs-collect-loader-CTLSv4qv.mjs";
2
2
 
3
3
  export { createVgsCardFields, initVgsCollect, loadVgsCollectScript };
@@ -1,2 +1,2 @@
1
- import { a as ParentConnection, i as IFrameConnection, n as CardInputType, o as connectToCardIframe, r as CheckoutResponse, s as connectToCardParent, t as CardErrorCode } from "../connect-card-Cra_F1cC.mjs";
1
+ import { a as ParentConnection, i as IFrameConnection, n as CardInputType, o as connectToCardIframe, r as CheckoutResponse, s as connectToCardParent, t as CardErrorCode } from "../connect-card-CZhzK_Tp.mjs";
2
2
  export { CardErrorCode, CardInputType, CheckoutResponse, IFrameConnection, ParentConnection, connectToCardIframe, connectToCardParent };
@@ -1,4 +1,4 @@
1
- import "../penpal-BFKeZTVz.mjs";
2
- import { n as connectToCardParent, t as connectToCardIframe } from "../connect-card-D3Je4V7p.mjs";
1
+ import "../penpal-CBrj43M5.mjs";
2
+ import { n as connectToCardParent, t as connectToCardIframe } from "../connect-card-kXLdSNTL.mjs";
3
3
 
4
4
  export { connectToCardIframe, connectToCardParent };
@@ -1,2 +1,2 @@
1
- import { a as connectToTunnelXParent, i as connectToTunnelXIframe, n as TunnelXManager, r as TunnelXParentConnection, t as TunnelXIFrameConnection } from "../connect-tunnel-x-Wh-JG1O5.mjs";
1
+ import { a as connectToTunnelXParent, i as connectToTunnelXIframe, n as TunnelXManager, r as TunnelXParentConnection, t as TunnelXIFrameConnection } from "../connect-tunnel-x-BKtMfoGh.mjs";
2
2
  export { TunnelXIFrameConnection, TunnelXManager, TunnelXParentConnection, connectToTunnelXIframe, connectToTunnelXParent };
@@ -1,4 +1,4 @@
1
- import "../penpal-BFKeZTVz.mjs";
2
- import { n as connectToTunnelXIframe, r as connectToTunnelXParent, t as TunnelXManager } from "../connect-tunnel-x-BhVAej5Q.mjs";
1
+ import "../penpal-CBrj43M5.mjs";
2
+ import { n as connectToTunnelXIframe, r as connectToTunnelXParent, t as TunnelXManager } from "../connect-tunnel-x-5XOct5Tm.mjs";
3
3
 
4
4
  export { TunnelXManager, connectToTunnelXIframe, connectToTunnelXParent };
@@ -13,4 +13,4 @@ const connectToWindow = ({ window, methods }) => {
13
13
 
14
14
  //#endregion
15
15
  export { connectToWindow as t };
16
- //# sourceMappingURL=penpal-BFKeZTVz.mjs.map
16
+ //# sourceMappingURL=penpal-CBrj43M5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"penpal-BFKeZTVz.mjs","names":[],"sources":["../src/penpal/index.ts"],"sourcesContent":["import { connect, type Methods, WindowMessenger } from \"penpal\";\n\ntype Options<TMethods> = {\n window: Window;\n methods: TMethods;\n};\n\nexport const connectToWindow = <TMethods extends Methods, TExposedMethods extends Methods = Methods>({\n window,\n methods,\n}: Options<TExposedMethods>) => {\n const messenger = new WindowMessenger({\n remoteWindow: window,\n // Allow all origins since the iframe is loaded from a trusted source (baseUrl)\n // The security boundary is the checkout_token, not the origin\n allowedOrigins: [\"*\"],\n });\n return connect<TMethods>({ methods, messenger });\n};\n"],"mappings":";;;AAOA,MAAa,mBAAwF,EACnG,QACA,cAC8B;AAO9B,QAAO,QAAkB;EAAE;EAAS,WANlB,IAAI,gBAAgB;GACpC,cAAc;GAGd,gBAAgB,CAAC,IAAI;GACtB,CAAC;EAC6C,CAAC"}
1
+ {"version":3,"file":"penpal-CBrj43M5.mjs","names":[],"sources":["../src/penpal/index.ts"],"sourcesContent":["import { connect, type Methods, WindowMessenger } from \"penpal\";\n\ntype Options<TMethods> = {\n window: Window;\n methods: TMethods;\n};\n\nexport const connectToWindow = <TMethods extends Methods, TExposedMethods extends Methods = Methods>({\n window,\n methods,\n}: Options<TExposedMethods>) => {\n const messenger = new WindowMessenger({\n remoteWindow: window,\n // Allow all origins since the iframe is loaded from a trusted source (baseUrl)\n // The security boundary is the checkout_token, not the origin\n allowedOrigins: [\"*\"],\n });\n return connect<TMethods>({ methods, messenger });\n};\n"],"mappings":";;;AAOA,MAAa,mBAAwF,EACnG,QACA,cAC8B;AAO9B,QAAO,QAAkB;EAAE;EAAS,WANlB,IAAI,gBAAgB;GACpC,cAAc;GAGd,gBAAgB,CAAC,IAAI;GACtB,CAAC;EAC6C,CAAC"}
@@ -310,4 +310,4 @@ var StripeApplePayAdapter = class {
310
310
 
311
311
  //#endregion
312
312
  export { StripeApplePayAdapter as n, ApplePayMockScenario as t };
313
- //# sourceMappingURL=stripe-apple-pay-adapter-BLRjqgDf.mjs.map
313
+ //# sourceMappingURL=stripe-apple-pay-adapter-7rF6xRIG.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"stripe-apple-pay-adapter-BLRjqgDf.mjs","names":[],"sources":["../src/payment-methods/stripe-apple-pay-adapter.ts"],"sourcesContent":["/// <reference types=\"@types/applepayjs\" />\nimport type { PaymentRequest, PaymentRequestPaymentMethodEvent, Stripe, StripeConstructor } from \"@stripe/stripe-js\";\n\n// Stripe.js must be loaded via script tag for PCI compliance\ndeclare global {\n interface Window {\n Stripe?: StripeConstructor;\n ApplePaySession?: typeof ApplePaySession;\n }\n}\n\nexport interface ApplePayPaymentRequestConfig {\n country: string;\n currency: string;\n total: { label: string; amount: number }; // Amount in cents (atomic units)\n supportedNetworks?: string[];\n merchantCapabilities?: string[];\n}\n\nexport type ShowApplePaySheetResult =\n | {\n success: true;\n paymentMethodId: string;\n paymentMethodEvent: PaymentRequestPaymentMethodEvent;\n billingDetails?: {\n email?: string;\n name?: string;\n address?: {\n city?: string | null;\n country?: string | null;\n line1?: string | null;\n line2?: string | null;\n postal_code?: string | null;\n state?: string | null;\n } | null;\n };\n }\n | { success: false; cancelled: true }\n | { success: false; error: string };\n\nexport type ConfirmResult = { success: true } | { success: false; error: string };\n\nexport enum ApplePayMockScenario {\n None = \"none\",\n Success = \"success\",\n Cancelled = \"cancelled\",\n}\n\n/**\n * Stripe Apple Pay Adapter using Stripe's PaymentRequest API.\n *\n * This uses Stripe's PaymentRequest API instead of the native ApplePaySession API.\n * The key benefit is that Stripe handles merchant validation automatically,\n * which is required for Apple Pay to work correctly.\n *\n * IMPORTANT: To comply with browser security requirements, Apple Pay must be shown\n * synchronously from a user click. The flow is:\n *\n * 1. Call preparePaymentRequest() BEFORE user clicks (e.g., when page loads)\n * - This creates the PaymentRequest and calls canMakePayment()\n * 2. On user click, call showPreparedPaymentSheet()\n * - This calls show() on the pre-created PaymentRequest (no async!)\n * 3. Handle the paymentmethod event and call complete()\n */\nexport class StripeApplePayAdapter {\n private stripe: Stripe | null = null;\n private mockScenario: ApplePayMockScenario;\n private preparedPaymentRequest: PaymentRequest | null = null;\n\n constructor(mockScenario?: ApplePayMockScenario) {\n this.mockScenario = mockScenario ?? ApplePayMockScenario.None;\n }\n\n initialize(publishableKey: string): boolean {\n switch (this.mockScenario) {\n case ApplePayMockScenario.None: {\n console.log(\"[ApplePay] initialize called\");\n if (!window.Stripe) {\n console.log(\"[ApplePay] Stripe.js not loaded\");\n return false;\n }\n this.stripe = window.Stripe(publishableKey);\n const success = this.stripe !== null;\n console.log(\"[ApplePay] initialize result:\", success);\n return success;\n }\n case ApplePayMockScenario.Success:\n case ApplePayMockScenario.Cancelled: {\n console.log(\"[MockApplePay] initialize called\");\n console.log(\"[MockApplePay] initialize result:\", true);\n return true;\n }\n }\n }\n\n /**\n * Check if Apple Pay is available on this device/browser.\n * Uses Stripe's PaymentRequest.canMakePayment() which is more reliable\n * than checking ApplePaySession directly.\n */\n static isAvailable(): boolean {\n // Basic check - ApplePaySession must exist (Safari on iOS/macOS)\n if (typeof window === \"undefined\" || !window.ApplePaySession) {\n console.log(\"[ApplePay] ApplePaySession not available\");\n return false;\n }\n\n // Check if device supports Apple Pay\n const canMakePayments = window.ApplePaySession.canMakePayments();\n console.log(\"[ApplePay] canMakePayments:\", canMakePayments);\n return canMakePayments;\n }\n\n /**\n * Check availability using Stripe's PaymentRequest API.\n * This is more accurate as it checks Stripe's configuration too.\n */\n async canMakePayment(): Promise<{ applePay: boolean; googlePay: boolean } | null> {\n if (!this.stripe) {\n console.log(\"[ApplePay] Stripe not initialized\");\n return null;\n }\n\n // Create a temporary payment request to check availability\n const pr = this.stripe.paymentRequest({\n country: \"US\",\n currency: \"usd\",\n total: { label: \"Check\", amount: 100 },\n });\n\n const result = await pr.canMakePayment();\n console.log(\"[ApplePay] canMakePayment result:\", result);\n\n if (!result) {\n return null;\n }\n\n // Map Stripe's result to our expected format\n return {\n applePay: result.applePay ?? false,\n googlePay: result.googlePay ?? false,\n };\n }\n\n /**\n * Prepare a PaymentRequest for later use. Call this BEFORE the user clicks.\n * This creates the PaymentRequest and calls canMakePayment() to validate.\n *\n * @returns Promise with success status and whether Apple Pay is available\n */\n async preparePaymentRequest(config: ApplePayPaymentRequestConfig): Promise<{\n success: boolean;\n applePay?: boolean;\n googlePay?: boolean;\n error?: string;\n }> {\n if (this.mockScenario !== ApplePayMockScenario.None) {\n console.log(\"[MockApplePay] preparePaymentRequest called\");\n this.preparedConfig = config;\n return { success: true, applePay: true, googlePay: false };\n }\n\n console.log(\"[ApplePay] preparePaymentRequest called\", config);\n\n if (!this.stripe) {\n return { success: false, error: \"Stripe not initialized\" };\n }\n\n // Create the PaymentRequest\n const paymentRequest = this.stripe.paymentRequest({\n country: config.country,\n currency: config.currency.toLowerCase(),\n total: {\n label: config.total.label,\n amount: config.total.amount,\n },\n requestPayerName: true,\n requestPayerEmail: true,\n });\n\n // Check availability - this MUST be called before show()\n const canMakePaymentResult = await paymentRequest.canMakePayment();\n console.log(\"[ApplePay] preparePaymentRequest canMakePayment:\", canMakePaymentResult);\n\n if (!canMakePaymentResult) {\n return {\n success: false,\n error: \"Payment methods not available on this device/browser\",\n applePay: false,\n googlePay: false,\n };\n }\n\n // Store the prepared PaymentRequest for later use\n this.preparedPaymentRequest = paymentRequest;\n this.preparedConfig = config;\n\n return {\n success: true,\n applePay: canMakePaymentResult.applePay ?? false,\n googlePay: canMakePaymentResult.googlePay ?? false,\n };\n }\n\n /**\n * Check if a PaymentRequest has been prepared and is ready to show.\n */\n isPrepared(): boolean {\n return this.preparedPaymentRequest !== null || this.mockScenario !== ApplePayMockScenario.None;\n }\n\n /**\n * Clear the prepared PaymentRequest.\n */\n clearPrepared(): void {\n this.preparedPaymentRequest = null;\n this.preparedConfig = null;\n }\n\n /**\n * Show the prepared Apple Pay payment sheet.\n * MUST be called synchronously from a user click handler.\n * Call preparePaymentRequest() before the click to set up the PaymentRequest.\n */\n showPreparedPaymentSheet(): Promise<ShowApplePaySheetResult> {\n switch (this.mockScenario) {\n case ApplePayMockScenario.None: {\n console.log(\"[ApplePay] showPreparedPaymentSheet called\");\n\n if (!this.preparedPaymentRequest) {\n console.error(\"[ApplePay] No prepared PaymentRequest! Call preparePaymentRequest() first.\");\n return Promise.resolve({\n success: false,\n error: \"PaymentRequest not prepared. Call preparePaymentRequest() before showing the sheet.\",\n });\n }\n\n const paymentRequest = this.preparedPaymentRequest;\n\n // Return a promise that resolves when the user completes or cancels\n return new Promise((resolve) => {\n // Handle successful payment method creation\n paymentRequest.on(\"paymentmethod\", (evt: PaymentRequestPaymentMethodEvent) => {\n console.log(\"[ApplePay] paymentmethod event received\", {\n paymentMethodId: evt.paymentMethod.id,\n payerEmail: evt.payerEmail,\n payerName: evt.payerName,\n });\n\n // Clear the prepared request after use\n this.preparedPaymentRequest = null;\n\n resolve({\n success: true,\n paymentMethodId: evt.paymentMethod.id,\n paymentMethodEvent: evt,\n billingDetails: {\n email: evt.payerEmail ?? undefined,\n name: evt.payerName ?? undefined,\n address: evt.paymentMethod.billing_details?.address ?? undefined,\n },\n });\n });\n\n // Handle cancellation\n paymentRequest.on(\"cancel\", () => {\n console.log(\"[ApplePay] cancel event - user cancelled\");\n // Clear the prepared request after cancellation\n this.preparedPaymentRequest = null;\n resolve({ success: false, cancelled: true });\n });\n\n // Show the payment sheet immediately (no async operations before this!)\n console.log(\"[ApplePay] showing payment sheet\");\n paymentRequest.show();\n });\n }\n\n case ApplePayMockScenario.Success: {\n console.log(\"[MockApplePay] showPreparedPaymentSheet: success\");\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n success: true,\n paymentMethodId: \"pm_mock_apple_pay_test\",\n paymentMethodEvent: {\n complete: (status: string) => console.log(`[MockApplePay] complete: ${status}`),\n paymentMethod: {\n id: \"pm_mock_apple_pay_test\",\n object: \"payment_method\",\n type: \"card\",\n card: {\n brand: \"visa\",\n last4: \"4242\",\n exp_month: 12,\n exp_year: 2030,\n },\n billing_details: {\n email: \"test@example.com\",\n name: \"Test User\",\n },\n },\n payerEmail: \"test@example.com\",\n payerName: \"Test User\",\n } as unknown as PaymentRequestPaymentMethodEvent,\n billingDetails: {\n email: \"test@example.com\",\n name: \"Test User\",\n },\n });\n }, 500);\n });\n }\n\n case ApplePayMockScenario.Cancelled: {\n console.log(\"[MockApplePay] showPreparedPaymentSheet: cancelled\");\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({ success: false, cancelled: true });\n }, 500);\n });\n }\n }\n }\n\n /**\n * @deprecated Use preparePaymentRequest() + showPreparedPaymentSheet() instead.\n * This method creates a new PaymentRequest and shows it, which doesn't work\n * with browser security requirements (show() must be called synchronously).\n */\n async showPaymentSheet(config: ApplePayPaymentRequestConfig): Promise<ShowApplePaySheetResult> {\n console.warn(\n \"[ApplePay] showPaymentSheet is deprecated. Use preparePaymentRequest() + showPreparedPaymentSheet() instead.\",\n );\n\n // Try to prepare and show in one go (will likely fail due to user gesture requirement)\n const prepareResult = await this.preparePaymentRequest(config);\n if (!prepareResult.success) {\n return { success: false, error: prepareResult.error ?? \"Failed to prepare payment request\" };\n }\n\n return this.showPreparedPaymentSheet();\n }\n\n /**\n * Complete the payment flow in the Apple Pay sheet.\n * Call this after confirming the payment on the server.\n *\n * @param evt - The PaymentRequestPaymentMethodEvent from showPaymentSheet\n * @param status - 'success' or 'fail'\n */\n completePayment(evt: PaymentRequestPaymentMethodEvent, status: \"success\" | \"fail\"): void {\n console.log(\"[ApplePay] completePayment:\", status);\n evt.complete(status);\n }\n\n /**\n * Confirm PaymentIntent with the PaymentMethod.\n * This is called after showPaymentSheet to finalize the payment.\n *\n * @deprecated - Server-side confirmation is preferred. The backend should\n * call stripe.PaymentIntent.confirm() with the payment_method_id.\n */\n async confirmPaymentIntent(clientSecret: string, paymentMethodId: string): Promise<ConfirmResult> {\n switch (this.mockScenario) {\n case ApplePayMockScenario.None: {\n console.log(\"[ApplePay] confirmPaymentIntent called\", {\n clientSecret: `${clientSecret.slice(0, 20)}...`,\n paymentMethodId,\n });\n if (!this.stripe) {\n console.log(\"[ApplePay] confirmPaymentIntent: Stripe not initialized\");\n return { success: false, error: \"Stripe not initialized\" };\n }\n\n const { error } = await this.stripe.confirmCardPayment(clientSecret, {\n payment_method: paymentMethodId,\n });\n\n if (error) {\n console.log(\"[ApplePay] confirmPaymentIntent error:\", error);\n return { success: false, error: error.message ?? \"Payment failed\" };\n }\n\n console.log(\"[ApplePay] confirmPaymentIntent success\");\n return { success: true };\n }\n case ApplePayMockScenario.Success: {\n console.log(\"[MockApplePay] confirmPaymentIntent called\", { clientSecret, paymentMethodId });\n return { success: true };\n }\n case ApplePayMockScenario.Cancelled: {\n throw new Error(\"confirmPaymentIntent should not be called when scenario is Cancelled\");\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stripe-apple-pay-adapter-7rF6xRIG.mjs","names":[],"sources":["../src/payment-methods/stripe-apple-pay-adapter.ts"],"sourcesContent":["/// <reference types=\"@types/applepayjs\" />\nimport type { PaymentRequest, PaymentRequestPaymentMethodEvent, Stripe, StripeConstructor } from \"@stripe/stripe-js\";\n\n// Stripe.js must be loaded via script tag for PCI compliance\ndeclare global {\n interface Window {\n Stripe?: StripeConstructor;\n ApplePaySession?: typeof ApplePaySession;\n }\n}\n\nexport interface ApplePayPaymentRequestConfig {\n country: string;\n currency: string;\n total: { label: string; amount: number }; // Amount in cents (atomic units)\n supportedNetworks?: string[];\n merchantCapabilities?: string[];\n}\n\nexport type ShowApplePaySheetResult =\n | {\n success: true;\n paymentMethodId: string;\n paymentMethodEvent: PaymentRequestPaymentMethodEvent;\n billingDetails?: {\n email?: string;\n name?: string;\n address?: {\n city?: string | null;\n country?: string | null;\n line1?: string | null;\n line2?: string | null;\n postal_code?: string | null;\n state?: string | null;\n } | null;\n };\n }\n | { success: false; cancelled: true }\n | { success: false; error: string };\n\nexport type ConfirmResult = { success: true } | { success: false; error: string };\n\nexport enum ApplePayMockScenario {\n None = \"none\",\n Success = \"success\",\n Cancelled = \"cancelled\",\n}\n\n/**\n * Stripe Apple Pay Adapter using Stripe's PaymentRequest API.\n *\n * This uses Stripe's PaymentRequest API instead of the native ApplePaySession API.\n * The key benefit is that Stripe handles merchant validation automatically,\n * which is required for Apple Pay to work correctly.\n *\n * IMPORTANT: To comply with browser security requirements, Apple Pay must be shown\n * synchronously from a user click. The flow is:\n *\n * 1. Call preparePaymentRequest() BEFORE user clicks (e.g., when page loads)\n * - This creates the PaymentRequest and calls canMakePayment()\n * 2. On user click, call showPreparedPaymentSheet()\n * - This calls show() on the pre-created PaymentRequest (no async!)\n * 3. Handle the paymentmethod event and call complete()\n */\nexport class StripeApplePayAdapter {\n private stripe: Stripe | null = null;\n private mockScenario: ApplePayMockScenario;\n private preparedPaymentRequest: PaymentRequest | null = null;\n\n constructor(mockScenario?: ApplePayMockScenario) {\n this.mockScenario = mockScenario ?? ApplePayMockScenario.None;\n }\n\n initialize(publishableKey: string): boolean {\n switch (this.mockScenario) {\n case ApplePayMockScenario.None: {\n console.log(\"[ApplePay] initialize called\");\n if (!window.Stripe) {\n console.log(\"[ApplePay] Stripe.js not loaded\");\n return false;\n }\n this.stripe = window.Stripe(publishableKey);\n const success = this.stripe !== null;\n console.log(\"[ApplePay] initialize result:\", success);\n return success;\n }\n case ApplePayMockScenario.Success:\n case ApplePayMockScenario.Cancelled: {\n console.log(\"[MockApplePay] initialize called\");\n console.log(\"[MockApplePay] initialize result:\", true);\n return true;\n }\n }\n }\n\n /**\n * Check if Apple Pay is available on this device/browser.\n * Uses Stripe's PaymentRequest.canMakePayment() which is more reliable\n * than checking ApplePaySession directly.\n */\n static isAvailable(): boolean {\n // Basic check - ApplePaySession must exist (Safari on iOS/macOS)\n if (typeof window === \"undefined\" || !window.ApplePaySession) {\n console.log(\"[ApplePay] ApplePaySession not available\");\n return false;\n }\n\n // Check if device supports Apple Pay\n const canMakePayments = window.ApplePaySession.canMakePayments();\n console.log(\"[ApplePay] canMakePayments:\", canMakePayments);\n return canMakePayments;\n }\n\n /**\n * Check availability using Stripe's PaymentRequest API.\n * This is more accurate as it checks Stripe's configuration too.\n */\n async canMakePayment(): Promise<{ applePay: boolean; googlePay: boolean } | null> {\n if (!this.stripe) {\n console.log(\"[ApplePay] Stripe not initialized\");\n return null;\n }\n\n // Create a temporary payment request to check availability\n const pr = this.stripe.paymentRequest({\n country: \"US\",\n currency: \"usd\",\n total: { label: \"Check\", amount: 100 },\n });\n\n const result = await pr.canMakePayment();\n console.log(\"[ApplePay] canMakePayment result:\", result);\n\n if (!result) {\n return null;\n }\n\n // Map Stripe's result to our expected format\n return {\n applePay: result.applePay ?? false,\n googlePay: result.googlePay ?? false,\n };\n }\n\n /**\n * Prepare a PaymentRequest for later use. Call this BEFORE the user clicks.\n * This creates the PaymentRequest and calls canMakePayment() to validate.\n *\n * @returns Promise with success status and whether Apple Pay is available\n */\n async preparePaymentRequest(config: ApplePayPaymentRequestConfig): Promise<{\n success: boolean;\n applePay?: boolean;\n googlePay?: boolean;\n error?: string;\n }> {\n if (this.mockScenario !== ApplePayMockScenario.None) {\n console.log(\"[MockApplePay] preparePaymentRequest called\");\n this.preparedConfig = config;\n return { success: true, applePay: true, googlePay: false };\n }\n\n console.log(\"[ApplePay] preparePaymentRequest called\", config);\n\n if (!this.stripe) {\n return { success: false, error: \"Stripe not initialized\" };\n }\n\n // Create the PaymentRequest\n const paymentRequest = this.stripe.paymentRequest({\n country: config.country,\n currency: config.currency.toLowerCase(),\n total: {\n label: config.total.label,\n amount: config.total.amount,\n },\n requestPayerName: true,\n requestPayerEmail: true,\n });\n\n // Check availability - this MUST be called before show()\n const canMakePaymentResult = await paymentRequest.canMakePayment();\n console.log(\"[ApplePay] preparePaymentRequest canMakePayment:\", canMakePaymentResult);\n\n if (!canMakePaymentResult) {\n return {\n success: false,\n error: \"Payment methods not available on this device/browser\",\n applePay: false,\n googlePay: false,\n };\n }\n\n // Store the prepared PaymentRequest for later use\n this.preparedPaymentRequest = paymentRequest;\n this.preparedConfig = config;\n\n return {\n success: true,\n applePay: canMakePaymentResult.applePay ?? false,\n googlePay: canMakePaymentResult.googlePay ?? false,\n };\n }\n\n /**\n * Check if a PaymentRequest has been prepared and is ready to show.\n */\n isPrepared(): boolean {\n return this.preparedPaymentRequest !== null || this.mockScenario !== ApplePayMockScenario.None;\n }\n\n /**\n * Clear the prepared PaymentRequest.\n */\n clearPrepared(): void {\n this.preparedPaymentRequest = null;\n this.preparedConfig = null;\n }\n\n /**\n * Show the prepared Apple Pay payment sheet.\n * MUST be called synchronously from a user click handler.\n * Call preparePaymentRequest() before the click to set up the PaymentRequest.\n */\n showPreparedPaymentSheet(): Promise<ShowApplePaySheetResult> {\n switch (this.mockScenario) {\n case ApplePayMockScenario.None: {\n console.log(\"[ApplePay] showPreparedPaymentSheet called\");\n\n if (!this.preparedPaymentRequest) {\n console.error(\"[ApplePay] No prepared PaymentRequest! Call preparePaymentRequest() first.\");\n return Promise.resolve({\n success: false,\n error: \"PaymentRequest not prepared. Call preparePaymentRequest() before showing the sheet.\",\n });\n }\n\n const paymentRequest = this.preparedPaymentRequest;\n\n // Return a promise that resolves when the user completes or cancels\n return new Promise((resolve) => {\n // Handle successful payment method creation\n paymentRequest.on(\"paymentmethod\", (evt: PaymentRequestPaymentMethodEvent) => {\n console.log(\"[ApplePay] paymentmethod event received\", {\n paymentMethodId: evt.paymentMethod.id,\n payerEmail: evt.payerEmail,\n payerName: evt.payerName,\n });\n\n // Clear the prepared request after use\n this.preparedPaymentRequest = null;\n\n resolve({\n success: true,\n paymentMethodId: evt.paymentMethod.id,\n paymentMethodEvent: evt,\n billingDetails: {\n email: evt.payerEmail ?? undefined,\n name: evt.payerName ?? undefined,\n address: evt.paymentMethod.billing_details?.address ?? undefined,\n },\n });\n });\n\n // Handle cancellation\n paymentRequest.on(\"cancel\", () => {\n console.log(\"[ApplePay] cancel event - user cancelled\");\n // Clear the prepared request after cancellation\n this.preparedPaymentRequest = null;\n resolve({ success: false, cancelled: true });\n });\n\n // Show the payment sheet immediately (no async operations before this!)\n console.log(\"[ApplePay] showing payment sheet\");\n paymentRequest.show();\n });\n }\n\n case ApplePayMockScenario.Success: {\n console.log(\"[MockApplePay] showPreparedPaymentSheet: success\");\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n success: true,\n paymentMethodId: \"pm_mock_apple_pay_test\",\n paymentMethodEvent: {\n complete: (status: string) => console.log(`[MockApplePay] complete: ${status}`),\n paymentMethod: {\n id: \"pm_mock_apple_pay_test\",\n object: \"payment_method\",\n type: \"card\",\n card: {\n brand: \"visa\",\n last4: \"4242\",\n exp_month: 12,\n exp_year: 2030,\n },\n billing_details: {\n email: \"test@example.com\",\n name: \"Test User\",\n },\n },\n payerEmail: \"test@example.com\",\n payerName: \"Test User\",\n } as unknown as PaymentRequestPaymentMethodEvent,\n billingDetails: {\n email: \"test@example.com\",\n name: \"Test User\",\n },\n });\n }, 500);\n });\n }\n\n case ApplePayMockScenario.Cancelled: {\n console.log(\"[MockApplePay] showPreparedPaymentSheet: cancelled\");\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({ success: false, cancelled: true });\n }, 500);\n });\n }\n }\n }\n\n /**\n * @deprecated Use preparePaymentRequest() + showPreparedPaymentSheet() instead.\n * This method creates a new PaymentRequest and shows it, which doesn't work\n * with browser security requirements (show() must be called synchronously).\n */\n async showPaymentSheet(config: ApplePayPaymentRequestConfig): Promise<ShowApplePaySheetResult> {\n console.warn(\n \"[ApplePay] showPaymentSheet is deprecated. Use preparePaymentRequest() + showPreparedPaymentSheet() instead.\",\n );\n\n // Try to prepare and show in one go (will likely fail due to user gesture requirement)\n const prepareResult = await this.preparePaymentRequest(config);\n if (!prepareResult.success) {\n return { success: false, error: prepareResult.error ?? \"Failed to prepare payment request\" };\n }\n\n return this.showPreparedPaymentSheet();\n }\n\n /**\n * Complete the payment flow in the Apple Pay sheet.\n * Call this after confirming the payment on the server.\n *\n * @param evt - The PaymentRequestPaymentMethodEvent from showPaymentSheet\n * @param status - 'success' or 'fail'\n */\n completePayment(evt: PaymentRequestPaymentMethodEvent, status: \"success\" | \"fail\"): void {\n console.log(\"[ApplePay] completePayment:\", status);\n evt.complete(status);\n }\n\n /**\n * Confirm PaymentIntent with the PaymentMethod.\n * This is called after showPaymentSheet to finalize the payment.\n *\n * @deprecated - Server-side confirmation is preferred. The backend should\n * call stripe.PaymentIntent.confirm() with the payment_method_id.\n */\n async confirmPaymentIntent(clientSecret: string, paymentMethodId: string): Promise<ConfirmResult> {\n switch (this.mockScenario) {\n case ApplePayMockScenario.None: {\n console.log(\"[ApplePay] confirmPaymentIntent called\", {\n clientSecret: `${clientSecret.slice(0, 20)}...`,\n paymentMethodId,\n });\n if (!this.stripe) {\n console.log(\"[ApplePay] confirmPaymentIntent: Stripe not initialized\");\n return { success: false, error: \"Stripe not initialized\" };\n }\n\n const { error } = await this.stripe.confirmCardPayment(clientSecret, {\n payment_method: paymentMethodId,\n });\n\n if (error) {\n console.log(\"[ApplePay] confirmPaymentIntent error:\", error);\n return { success: false, error: error.message ?? \"Payment failed\" };\n }\n\n console.log(\"[ApplePay] confirmPaymentIntent success\");\n return { success: true };\n }\n case ApplePayMockScenario.Success: {\n console.log(\"[MockApplePay] confirmPaymentIntent called\", { clientSecret, paymentMethodId });\n return { success: true };\n }\n case ApplePayMockScenario.Cancelled: {\n throw new Error(\"confirmPaymentIntent should not be called when scenario is Cancelled\");\n }\n }\n }\n}\n"],"mappings":";AA0CA,IAAY,wEAAL;AACL;AACA;AACA;;;;;;;;;;;;;;;;;;;AAmBF,IAAa,wBAAb,MAAmC;CACjC,AAAQ,SAAwB;CAChC,AAAQ;CACR,AAAQ,yBAAgD;CAExD,YAAY,cAAqC;AAC/C,OAAK,eAAe,gBAAgB,qBAAqB;;CAG3D,WAAW,gBAAiC;AAC1C,UAAQ,KAAK,cAAb;GACE,KAAK,qBAAqB,MAAM;AAC9B,YAAQ,IAAI,+BAA+B;AAC3C,QAAI,CAAC,OAAO,QAAQ;AAClB,aAAQ,IAAI,kCAAkC;AAC9C,YAAO;;AAET,SAAK,SAAS,OAAO,OAAO,eAAe;IAC3C,MAAM,UAAU,KAAK,WAAW;AAChC,YAAQ,IAAI,iCAAiC,QAAQ;AACrD,WAAO;;GAET,KAAK,qBAAqB;GAC1B,KAAK,qBAAqB;AACxB,YAAQ,IAAI,mCAAmC;AAC/C,YAAQ,IAAI,qCAAqC,KAAK;AACtD,WAAO;;;;;;;;CAUb,OAAO,cAAuB;AAE5B,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,iBAAiB;AAC5D,WAAQ,IAAI,2CAA2C;AACvD,UAAO;;EAIT,MAAM,kBAAkB,OAAO,gBAAgB,iBAAiB;AAChE,UAAQ,IAAI,+BAA+B,gBAAgB;AAC3D,SAAO;;;;;;CAOT,MAAM,iBAA4E;AAChF,MAAI,CAAC,KAAK,QAAQ;AAChB,WAAQ,IAAI,oCAAoC;AAChD,UAAO;;EAUT,MAAM,SAAS,MANJ,KAAK,OAAO,eAAe;GACpC,SAAS;GACT,UAAU;GACV,OAAO;IAAE,OAAO;IAAS,QAAQ;IAAK;GACvC,CAAC,CAEsB,gBAAgB;AACxC,UAAQ,IAAI,qCAAqC,OAAO;AAExD,MAAI,CAAC,OACH,QAAO;AAIT,SAAO;GACL,UAAU,OAAO,YAAY;GAC7B,WAAW,OAAO,aAAa;GAChC;;;;;;;;CASH,MAAM,sBAAsB,QAKzB;AACD,MAAI,KAAK,iBAAiB,qBAAqB,MAAM;AACnD,WAAQ,IAAI,8CAA8C;AAC1D,QAAK,iBAAiB;AACtB,UAAO;IAAE,SAAS;IAAM,UAAU;IAAM,WAAW;IAAO;;AAG5D,UAAQ,IAAI,2CAA2C,OAAO;AAE9D,MAAI,CAAC,KAAK,OACR,QAAO;GAAE,SAAS;GAAO,OAAO;GAA0B;EAI5D,MAAM,iBAAiB,KAAK,OAAO,eAAe;GAChD,SAAS,OAAO;GAChB,UAAU,OAAO,SAAS,aAAa;GACvC,OAAO;IACL,OAAO,OAAO,MAAM;IACpB,QAAQ,OAAO,MAAM;IACtB;GACD,kBAAkB;GAClB,mBAAmB;GACpB,CAAC;EAGF,MAAM,uBAAuB,MAAM,eAAe,gBAAgB;AAClE,UAAQ,IAAI,oDAAoD,qBAAqB;AAErF,MAAI,CAAC,qBACH,QAAO;GACL,SAAS;GACT,OAAO;GACP,UAAU;GACV,WAAW;GACZ;AAIH,OAAK,yBAAyB;AAC9B,OAAK,iBAAiB;AAEtB,SAAO;GACL,SAAS;GACT,UAAU,qBAAqB,YAAY;GAC3C,WAAW,qBAAqB,aAAa;GAC9C;;;;;CAMH,aAAsB;AACpB,SAAO,KAAK,2BAA2B,QAAQ,KAAK,iBAAiB,qBAAqB;;;;;CAM5F,gBAAsB;AACpB,OAAK,yBAAyB;AAC9B,OAAK,iBAAiB;;;;;;;CAQxB,2BAA6D;AAC3D,UAAQ,KAAK,cAAb;GACE,KAAK,qBAAqB,MAAM;AAC9B,YAAQ,IAAI,6CAA6C;AAEzD,QAAI,CAAC,KAAK,wBAAwB;AAChC,aAAQ,MAAM,6EAA6E;AAC3F,YAAO,QAAQ,QAAQ;MACrB,SAAS;MACT,OAAO;MACR,CAAC;;IAGJ,MAAM,iBAAiB,KAAK;AAG5B,WAAO,IAAI,SAAS,YAAY;AAE9B,oBAAe,GAAG,kBAAkB,QAA0C;AAC5E,cAAQ,IAAI,2CAA2C;OACrD,iBAAiB,IAAI,cAAc;OACnC,YAAY,IAAI;OAChB,WAAW,IAAI;OAChB,CAAC;AAGF,WAAK,yBAAyB;AAE9B,cAAQ;OACN,SAAS;OACT,iBAAiB,IAAI,cAAc;OACnC,oBAAoB;OACpB,gBAAgB;QACd,OAAO,IAAI,cAAc;QACzB,MAAM,IAAI,aAAa;QACvB,SAAS,IAAI,cAAc,iBAAiB,WAAW;QACxD;OACF,CAAC;OACF;AAGF,oBAAe,GAAG,gBAAgB;AAChC,cAAQ,IAAI,2CAA2C;AAEvD,WAAK,yBAAyB;AAC9B,cAAQ;OAAE,SAAS;OAAO,WAAW;OAAM,CAAC;OAC5C;AAGF,aAAQ,IAAI,mCAAmC;AAC/C,oBAAe,MAAM;MACrB;;GAGJ,KAAK,qBAAqB;AACxB,YAAQ,IAAI,mDAAmD;AAC/D,WAAO,IAAI,SAAS,YAAY;AAC9B,sBAAiB;AACf,cAAQ;OACN,SAAS;OACT,iBAAiB;OACjB,oBAAoB;QAClB,WAAW,WAAmB,QAAQ,IAAI,4BAA4B,SAAS;QAC/E,eAAe;SACb,IAAI;SACJ,QAAQ;SACR,MAAM;SACN,MAAM;UACJ,OAAO;UACP,OAAO;UACP,WAAW;UACX,UAAU;UACX;SACD,iBAAiB;UACf,OAAO;UACP,MAAM;UACP;SACF;QACD,YAAY;QACZ,WAAW;QACZ;OACD,gBAAgB;QACd,OAAO;QACP,MAAM;QACP;OACF,CAAC;QACD,IAAI;MACP;GAGJ,KAAK,qBAAqB;AACxB,YAAQ,IAAI,qDAAqD;AACjE,WAAO,IAAI,SAAS,YAAY;AAC9B,sBAAiB;AACf,cAAQ;OAAE,SAAS;OAAO,WAAW;OAAM,CAAC;QAC3C,IAAI;MACP;;;;;;;;CAUR,MAAM,iBAAiB,QAAwE;AAC7F,UAAQ,KACN,+GACD;EAGD,MAAM,gBAAgB,MAAM,KAAK,sBAAsB,OAAO;AAC9D,MAAI,CAAC,cAAc,QACjB,QAAO;GAAE,SAAS;GAAO,OAAO,cAAc,SAAS;GAAqC;AAG9F,SAAO,KAAK,0BAA0B;;;;;;;;;CAUxC,gBAAgB,KAAuC,QAAkC;AACvF,UAAQ,IAAI,+BAA+B,OAAO;AAClD,MAAI,SAAS,OAAO;;;;;;;;;CAUtB,MAAM,qBAAqB,cAAsB,iBAAiD;AAChG,UAAQ,KAAK,cAAb;GACE,KAAK,qBAAqB,MAAM;AAC9B,YAAQ,IAAI,0CAA0C;KACpD,cAAc,GAAG,aAAa,MAAM,GAAG,GAAG,CAAC;KAC3C;KACD,CAAC;AACF,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAQ,IAAI,0DAA0D;AACtE,YAAO;MAAE,SAAS;MAAO,OAAO;MAA0B;;IAG5D,MAAM,EAAE,UAAU,MAAM,KAAK,OAAO,mBAAmB,cAAc,EACnE,gBAAgB,iBACjB,CAAC;AAEF,QAAI,OAAO;AACT,aAAQ,IAAI,0CAA0C,MAAM;AAC5D,YAAO;MAAE,SAAS;MAAO,OAAO,MAAM,WAAW;MAAkB;;AAGrE,YAAQ,IAAI,0CAA0C;AACtD,WAAO,EAAE,SAAS,MAAM;;GAE1B,KAAK,qBAAqB;AACxB,YAAQ,IAAI,8CAA8C;KAAE;KAAc;KAAiB,CAAC;AAC5F,WAAO,EAAE,SAAS,MAAM;GAE1B,KAAK,qBAAqB,UACxB,OAAM,IAAI,MAAM,uEAAuE"}
@@ -138,4 +138,4 @@ declare class StripeApplePayAdapter {
138
138
  }
139
139
  //#endregion
140
140
  export { StripeApplePayAdapter as a, ShowApplePaySheetResult as i, ApplePayPaymentRequestConfig as n, ConfirmResult as r, ApplePayMockScenario as t };
141
- //# sourceMappingURL=stripe-apple-pay-adapter-DcuGlQqQ.d.mts.map
141
+ //# sourceMappingURL=stripe-apple-pay-adapter-D2OJRlAl.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stripe-apple-pay-adapter-DcuGlQqQ.d.mts","names":[],"sources":["../src/payment-methods/stripe-apple-pay-adapter.ts"],"sourcesContent":[],"mappings":";;;;;IACqH,MAAA,CAAA,EAKxG,iBALwG;IAAA,eAAA,CAAA,EAAA,OAMxF,eANwF;;;AAMzE,UAI3B,4BAAA,CAJ2B;EAI3B,OAAA,EAAA,MAAA;EAQL,QAAA,EAAA,MAAA;EAqBA,KAAA,EAAA;IAEA,KAAA,EAAA,MAAA;IAsBC,MAAA,EAAA,MAAA;EAKgB,CAAA;EAgDH,iBAAA,CAAA,EAAA,MAAA,EAAA;EAiCY,oBAAA,CAAA,EAAA,MAAA,EAAA;;AA0EA,KA7M1B,uBAAA,GA6M0B;EAAR,OAAA,EAAA,IAAA;EA0GG,eAAA,EAAA,MAAA;EAAuC,kBAAA,EAnT9C,gCAmT8C;EAAR,cAAA,CAAA,EAAA;IAqBzC,KAAA,CAAA,EAAA,MAAA;IAY8D,IAAA,CAAA,EAAA,MAAA;IAAR,OAAA,CAAA,EAAA;MAAO,IAAA,CAAA,EAAA,MAAA,GAAA,IAAA;;;;;;;;;;;;;;;KAnUxE,aAAA;;;;;;aAEA,oBAAA;;;;;;;;;;;;;;;;;;;;;cAsBC,qBAAA;;;;6BAKgB;;;;;;;;;;;;oBAgDH;;;;;;;;;;gCAiCY,+BAA+B;;;;;;;;;;;;;;;;;;;8BA0EvC,QAAQ;;;;;;2BA0GL,+BAA+B,QAAQ;;;;;;;;uBAqBjD;;;;;;;;uEAYsD,QAAQ"}
1
+ {"version":3,"file":"stripe-apple-pay-adapter-D2OJRlAl.d.mts","names":[],"sources":["../src/payment-methods/stripe-apple-pay-adapter.ts"],"sourcesContent":[],"mappings":";;;;;IACqH,MAAA,CAAA,EAKxG,iBALwG;IAAA,eAAA,CAAA,EAAA,OAMxF,eANwF;;;AAMzE,UAI3B,4BAAA,CAJ2B;EAI3B,OAAA,EAAA,MAAA;EAQL,QAAA,EAAA,MAAA;EAqBA,KAAA,EAAA;IAEA,KAAA,EAAA,MAAA;IAsBC,MAAA,EAAA,MAAA;EAKgB,CAAA;EAgDH,iBAAA,CAAA,EAAA,MAAA,EAAA;EAiCY,oBAAA,CAAA,EAAA,MAAA,EAAA;;AA0EA,KA7M1B,uBAAA,GA6M0B;EAAR,OAAA,EAAA,IAAA;EA0GG,eAAA,EAAA,MAAA;EAAuC,kBAAA,EAnT9C,gCAmT8C;EAAR,cAAA,CAAA,EAAA;IAqBzC,KAAA,CAAA,EAAA,MAAA;IAY8D,IAAA,CAAA,EAAA,MAAA;IAAR,OAAA,CAAA,EAAA;MAAO,IAAA,CAAA,EAAA,MAAA,GAAA,IAAA;;;;;;;;;;;;;;;KAnUxE,aAAA;;;;;;aAEA,oBAAA;;;;;;;;;;;;;;;;;;;;;cAsBC,qBAAA;;;;6BAKgB;;;;;;;;;;;;oBAgDH;;;;;;;;;;gCAiCY,+BAA+B;;;;;;;;;;;;;;;;;;;8BA0EvC,QAAQ;;;;;;2BA0GL,+BAA+B,QAAQ;;;;;;;;uBAqBjD;;;;;;;;uEAYsD,QAAQ"}
@@ -52,4 +52,4 @@ declare class StripeGooglePayAdapter {
52
52
  }
53
53
  //#endregion
54
54
  export { StripeGooglePayAdapter as a, ShowPaymentSheetResult as i, GooglePayMockScenario as n, PaymentRequestConfig as r, ConfirmResult as t };
55
- //# sourceMappingURL=stripe-google-pay-adapter-BlQ2jVpE.d.mts.map
55
+ //# sourceMappingURL=stripe-google-pay-adapter-B330fRiH.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stripe-google-pay-adapter-BlQ2jVpE.d.mts","names":[],"sources":["../src/payment-methods/stripe-google-pay-adapter.ts"],"sourcesContent":[],"mappings":";;;;;IAAqH,MAAA,CAAA,EAKxG,iBALwG;EAAA;;AAKvF,UAIb,oBAAA,CAJa;EAAA,OAAA,EAAA,MAAA;EAIb,QAAA,EAAA,MAAA;EAQL,KAAA,EAAA;IAUA,KAAA,EAAA,MAAa;IAEb,MAAA,EAAA,MAAA;EAMC,CAAA;EAKgB,gBAAA,EAAA,OAAA;EA0BE,iBAAA,EAAA,OAAA;;AAyCK,KA1FxB,sBAAA,GA0FwB;EAAR,OAAA,EAAA,IAAA;EAwDqD,eAAA,EAAA,MAAA;EAAR,UAAA,CAAA,EAAA,MAAA;EAAO,QAAA,EAAA,CAAA,MAAA,EAAA,SAAA,GAAA,MAAA,EAAA,GAAA,IAAA;;;;;;;;KAxIpE,aAAA;;;;;;aAEA,qBAAA;;;;;cAMC,sBAAA;;;;6BAKgB;;+BA0BE;oBAmBL;sBAsBE,QAAQ;mEAwDqC,QAAQ"}
1
+ {"version":3,"file":"stripe-google-pay-adapter-B330fRiH.d.mts","names":[],"sources":["../src/payment-methods/stripe-google-pay-adapter.ts"],"sourcesContent":[],"mappings":";;;;;IAAqH,MAAA,CAAA,EAKxG,iBALwG;EAAA;;AAKvF,UAIb,oBAAA,CAJa;EAAA,OAAA,EAAA,MAAA;EAIb,QAAA,EAAA,MAAA;EAQL,KAAA,EAAA;IAUA,KAAA,EAAA,MAAa;IAEb,MAAA,EAAA,MAAA;EAMC,CAAA;EAKgB,gBAAA,EAAA,OAAA;EA0BE,iBAAA,EAAA,OAAA;;AAyCK,KA1FxB,sBAAA,GA0FwB;EAAR,OAAA,EAAA,IAAA;EAwDqD,eAAA,EAAA,MAAA;EAAR,UAAA,CAAA,EAAA,MAAA;EAAO,QAAA,EAAA,CAAA,MAAA,EAAA,SAAA,GAAA,MAAA,EAAA,GAAA,IAAA;;;;;;;;KAxIpE,aAAA;;;;;;aAEA,qBAAA;;;;;cAMC,sBAAA;;;;6BAKgB;;+BA0BE;oBAmBL;sBAsBE,QAAQ;mEAwDqC,QAAQ"}
@@ -165,4 +165,4 @@ var StripeGooglePayAdapter = class {
165
165
 
166
166
  //#endregion
167
167
  export { StripeGooglePayAdapter as n, GooglePayMockScenario as t };
168
- //# sourceMappingURL=stripe-google-pay-adapter-CIkgjhw8.mjs.map
168
+ //# sourceMappingURL=stripe-google-pay-adapter-B346KXt4.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"stripe-google-pay-adapter-CIkgjhw8.mjs","names":[],"sources":["../src/payment-methods/stripe-google-pay-adapter.ts"],"sourcesContent":["import type { PaymentRequest, PaymentRequestPaymentMethodEvent, Stripe, StripeConstructor } from \"@stripe/stripe-js\";\n\n// Stripe.js must be loaded via script tag for PCI compliance\ndeclare global {\n interface Window {\n Stripe?: StripeConstructor;\n }\n}\n\nexport interface PaymentRequestConfig {\n country: string;\n currency: string;\n total: { label: string; amount: number };\n requestPayerName: boolean;\n requestPayerEmail: boolean;\n}\n\nexport type ShowPaymentSheetResult =\n | {\n success: true;\n paymentMethodId: string;\n payerEmail?: string;\n complete: (status: \"success\" | \"fail\") => void;\n }\n | { success: false; cancelled: true }\n | { success: false; error: string };\n\nexport type ConfirmResult = { success: true } | { success: false; error: string };\n\nexport enum GooglePayMockScenario {\n None = \"none\",\n Success = \"success\",\n Cancelled = \"cancelled\",\n}\n\nexport class StripeGooglePayAdapter {\n private stripe: Stripe | null = null;\n private paymentRequest: PaymentRequest | null = null;\n private mockScenario: GooglePayMockScenario;\n\n constructor(mockScenario?: GooglePayMockScenario) {\n this.mockScenario = mockScenario ?? GooglePayMockScenario.None;\n }\n\n initialize(publishableKey: string): boolean {\n switch (this.mockScenario) {\n case GooglePayMockScenario.None: {\n console.log(\"[GooglePay] initialize called\");\n if (!window.Stripe) {\n console.log(\"[GooglePay] Stripe.js not loaded\");\n return false;\n }\n this.stripe = window.Stripe(publishableKey);\n const success = this.stripe !== null;\n console.log(\"[GooglePay] initialize result:\", success);\n return success;\n }\n case GooglePayMockScenario.Success:\n case GooglePayMockScenario.Cancelled: {\n console.log(\"[MockGooglePay] initialize called\");\n console.log(\"[MockGooglePay] initialize result:\", true);\n return true;\n }\n }\n }\n\n createPaymentRequest(config: PaymentRequestConfig): void {\n switch (this.mockScenario) {\n case GooglePayMockScenario.None: {\n console.log(\"[GooglePay] createPaymentRequest called\", config);\n if (!this.stripe) {\n throw new Error(\"Stripe not initialized\");\n }\n this.paymentRequest = this.stripe.paymentRequest(config);\n console.log(\"[GooglePay] paymentRequest created\");\n return;\n }\n case GooglePayMockScenario.Success:\n case GooglePayMockScenario.Cancelled: {\n console.log(\"[MockGooglePay] createPaymentRequest called\", config);\n return;\n }\n }\n }\n\n async canMakePayment(): Promise<boolean> {\n switch (this.mockScenario) {\n case GooglePayMockScenario.None: {\n console.log(\"[GooglePay] canMakePayment called\");\n if (!this.paymentRequest) {\n console.log(\"[GooglePay] canMakePayment: no paymentRequest\");\n return false;\n }\n const result = await this.paymentRequest.canMakePayment();\n const isAvailable = result?.googlePay ?? false;\n console.log(\"[GooglePay] canMakePayment result:\", { result, isAvailable });\n return isAvailable;\n }\n case GooglePayMockScenario.Success:\n case GooglePayMockScenario.Cancelled: {\n console.log(\"[MockGooglePay] canMakePayment called\");\n console.log(\"[MockGooglePay] canMakePayment result:\", { result: { googlePay: true }, isAvailable: true });\n return true;\n }\n }\n }\n\n async showPaymentSheet(): Promise<ShowPaymentSheetResult> {\n switch (this.mockScenario) {\n case GooglePayMockScenario.None: {\n console.log(\"[GooglePay] showPaymentSheet called\");\n if (!this.paymentRequest) {\n console.log(\"[GooglePay] showPaymentSheet: no paymentRequest\");\n return { success: false, error: \"Payment request not created\" };\n }\n\n return new Promise((resolve) => {\n // biome-ignore lint/style/noNonNullAssertion: checked above\n this.paymentRequest!.on(\"paymentmethod\", (event: PaymentRequestPaymentMethodEvent) => {\n console.log(\"[GooglePay] showPaymentSheet: paymentmethod event\", {\n paymentMethodId: event.paymentMethod.id,\n payerEmail: event.payerEmail,\n });\n resolve({\n success: true,\n paymentMethodId: event.paymentMethod.id,\n payerEmail: event.payerEmail ?? undefined,\n complete: (status) => {\n console.log(\"[GooglePay] complete called:\", status);\n event.complete(status);\n },\n });\n });\n\n // biome-ignore lint/style/noNonNullAssertion: checked above\n this.paymentRequest!.on(\"cancel\", () => {\n console.log(\"[GooglePay] showPaymentSheet: cancelled by user\");\n resolve({ success: false, cancelled: true });\n });\n\n console.log(\"[GooglePay] showing payment sheet...\");\n // biome-ignore lint/style/noNonNullAssertion: checked above\n this.paymentRequest!.show();\n });\n }\n case GooglePayMockScenario.Success: {\n console.log(\"[MockGooglePay] showPaymentSheet: success\");\n await new Promise((resolve) => setTimeout(resolve, 500));\n return {\n success: true,\n paymentMethodId: \"pm_mock_123456789\",\n payerEmail: \"mock@example.com\",\n complete: (status) => console.log(`[MockGooglePay] complete: ${status}`),\n };\n }\n case GooglePayMockScenario.Cancelled: {\n console.log(\"[MockGooglePay] showPaymentSheet: cancelled\");\n await new Promise((resolve) => setTimeout(resolve, 500));\n return { success: false, cancelled: true };\n }\n }\n }\n\n async confirmCardSetup(clientSecret: string, paymentMethodId: string): Promise<ConfirmResult> {\n switch (this.mockScenario) {\n case GooglePayMockScenario.None: {\n console.log(\"[GooglePay] confirmCardSetup called\", {\n clientSecret: `${clientSecret.slice(0, 20)}...`,\n paymentMethodId,\n });\n if (!this.stripe) {\n console.log(\"[GooglePay] confirmCardSetup: Stripe not initialized\");\n return { success: false, error: \"Stripe not initialized\" };\n }\n\n const { error } = await this.stripe.confirmCardSetup(clientSecret, {\n payment_method: paymentMethodId,\n });\n\n if (error) {\n console.log(\"[GooglePay] confirmCardSetup error:\", error);\n return { success: false, error: error.message ?? \"Card setup failed\" };\n }\n\n console.log(\"[GooglePay] confirmCardSetup success\");\n return { success: true };\n }\n case GooglePayMockScenario.Success: {\n console.log(\"[MockGooglePay] confirmCardSetup called\", { clientSecret, paymentMethodId });\n return { success: true };\n }\n case GooglePayMockScenario.Cancelled: {\n throw new Error(\"confirmCardSetup should not be called when scenario is Cancelled\");\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stripe-google-pay-adapter-B346KXt4.mjs","names":[],"sources":["../src/payment-methods/stripe-google-pay-adapter.ts"],"sourcesContent":["import type { PaymentRequest, PaymentRequestPaymentMethodEvent, Stripe, StripeConstructor } from \"@stripe/stripe-js\";\n\n// Stripe.js must be loaded via script tag for PCI compliance\ndeclare global {\n interface Window {\n Stripe?: StripeConstructor;\n }\n}\n\nexport interface PaymentRequestConfig {\n country: string;\n currency: string;\n total: { label: string; amount: number };\n requestPayerName: boolean;\n requestPayerEmail: boolean;\n}\n\nexport type ShowPaymentSheetResult =\n | {\n success: true;\n paymentMethodId: string;\n payerEmail?: string;\n complete: (status: \"success\" | \"fail\") => void;\n }\n | { success: false; cancelled: true }\n | { success: false; error: string };\n\nexport type ConfirmResult = { success: true } | { success: false; error: string };\n\nexport enum GooglePayMockScenario {\n None = \"none\",\n Success = \"success\",\n Cancelled = \"cancelled\",\n}\n\nexport class StripeGooglePayAdapter {\n private stripe: Stripe | null = null;\n private paymentRequest: PaymentRequest | null = null;\n private mockScenario: GooglePayMockScenario;\n\n constructor(mockScenario?: GooglePayMockScenario) {\n this.mockScenario = mockScenario ?? GooglePayMockScenario.None;\n }\n\n initialize(publishableKey: string): boolean {\n switch (this.mockScenario) {\n case GooglePayMockScenario.None: {\n console.log(\"[GooglePay] initialize called\");\n if (!window.Stripe) {\n console.log(\"[GooglePay] Stripe.js not loaded\");\n return false;\n }\n this.stripe = window.Stripe(publishableKey);\n const success = this.stripe !== null;\n console.log(\"[GooglePay] initialize result:\", success);\n return success;\n }\n case GooglePayMockScenario.Success:\n case GooglePayMockScenario.Cancelled: {\n console.log(\"[MockGooglePay] initialize called\");\n console.log(\"[MockGooglePay] initialize result:\", true);\n return true;\n }\n }\n }\n\n createPaymentRequest(config: PaymentRequestConfig): void {\n switch (this.mockScenario) {\n case GooglePayMockScenario.None: {\n console.log(\"[GooglePay] createPaymentRequest called\", config);\n if (!this.stripe) {\n throw new Error(\"Stripe not initialized\");\n }\n this.paymentRequest = this.stripe.paymentRequest(config);\n console.log(\"[GooglePay] paymentRequest created\");\n return;\n }\n case GooglePayMockScenario.Success:\n case GooglePayMockScenario.Cancelled: {\n console.log(\"[MockGooglePay] createPaymentRequest called\", config);\n return;\n }\n }\n }\n\n async canMakePayment(): Promise<boolean> {\n switch (this.mockScenario) {\n case GooglePayMockScenario.None: {\n console.log(\"[GooglePay] canMakePayment called\");\n if (!this.paymentRequest) {\n console.log(\"[GooglePay] canMakePayment: no paymentRequest\");\n return false;\n }\n const result = await this.paymentRequest.canMakePayment();\n const isAvailable = result?.googlePay ?? false;\n console.log(\"[GooglePay] canMakePayment result:\", { result, isAvailable });\n return isAvailable;\n }\n case GooglePayMockScenario.Success:\n case GooglePayMockScenario.Cancelled: {\n console.log(\"[MockGooglePay] canMakePayment called\");\n console.log(\"[MockGooglePay] canMakePayment result:\", { result: { googlePay: true }, isAvailable: true });\n return true;\n }\n }\n }\n\n async showPaymentSheet(): Promise<ShowPaymentSheetResult> {\n switch (this.mockScenario) {\n case GooglePayMockScenario.None: {\n console.log(\"[GooglePay] showPaymentSheet called\");\n if (!this.paymentRequest) {\n console.log(\"[GooglePay] showPaymentSheet: no paymentRequest\");\n return { success: false, error: \"Payment request not created\" };\n }\n\n return new Promise((resolve) => {\n // biome-ignore lint/style/noNonNullAssertion: checked above\n this.paymentRequest!.on(\"paymentmethod\", (event: PaymentRequestPaymentMethodEvent) => {\n console.log(\"[GooglePay] showPaymentSheet: paymentmethod event\", {\n paymentMethodId: event.paymentMethod.id,\n payerEmail: event.payerEmail,\n });\n resolve({\n success: true,\n paymentMethodId: event.paymentMethod.id,\n payerEmail: event.payerEmail ?? undefined,\n complete: (status) => {\n console.log(\"[GooglePay] complete called:\", status);\n event.complete(status);\n },\n });\n });\n\n // biome-ignore lint/style/noNonNullAssertion: checked above\n this.paymentRequest!.on(\"cancel\", () => {\n console.log(\"[GooglePay] showPaymentSheet: cancelled by user\");\n resolve({ success: false, cancelled: true });\n });\n\n console.log(\"[GooglePay] showing payment sheet...\");\n // biome-ignore lint/style/noNonNullAssertion: checked above\n this.paymentRequest!.show();\n });\n }\n case GooglePayMockScenario.Success: {\n console.log(\"[MockGooglePay] showPaymentSheet: success\");\n await new Promise((resolve) => setTimeout(resolve, 500));\n return {\n success: true,\n paymentMethodId: \"pm_mock_123456789\",\n payerEmail: \"mock@example.com\",\n complete: (status) => console.log(`[MockGooglePay] complete: ${status}`),\n };\n }\n case GooglePayMockScenario.Cancelled: {\n console.log(\"[MockGooglePay] showPaymentSheet: cancelled\");\n await new Promise((resolve) => setTimeout(resolve, 500));\n return { success: false, cancelled: true };\n }\n }\n }\n\n async confirmCardSetup(clientSecret: string, paymentMethodId: string): Promise<ConfirmResult> {\n switch (this.mockScenario) {\n case GooglePayMockScenario.None: {\n console.log(\"[GooglePay] confirmCardSetup called\", {\n clientSecret: `${clientSecret.slice(0, 20)}...`,\n paymentMethodId,\n });\n if (!this.stripe) {\n console.log(\"[GooglePay] confirmCardSetup: Stripe not initialized\");\n return { success: false, error: \"Stripe not initialized\" };\n }\n\n const { error } = await this.stripe.confirmCardSetup(clientSecret, {\n payment_method: paymentMethodId,\n });\n\n if (error) {\n console.log(\"[GooglePay] confirmCardSetup error:\", error);\n return { success: false, error: error.message ?? \"Card setup failed\" };\n }\n\n console.log(\"[GooglePay] confirmCardSetup success\");\n return { success: true };\n }\n case GooglePayMockScenario.Success: {\n console.log(\"[MockGooglePay] confirmCardSetup called\", { clientSecret, paymentMethodId });\n return { success: true };\n }\n case GooglePayMockScenario.Cancelled: {\n throw new Error(\"confirmCardSetup should not be called when scenario is Cancelled\");\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { t as CardErrorCode } from "./connect-card-Cra_F1cC.mjs";
2
- import { t as TunnelXIFrameConnection } from "./connect-tunnel-x-Wh-JG1O5.mjs";
1
+ import { t as CardErrorCode } from "./connect-card-CZhzK_Tp.mjs";
2
+ import { t as TunnelXIFrameConnection } from "./connect-tunnel-x-BKtMfoGh.mjs";
3
3
 
4
4
  //#region src/analytics/checkout-timing.d.ts
5
5
 
@@ -147,4 +147,4 @@ type PaymentMethod<TExternalFuncs = unknown, TName = string> = (paymentKitStates
147
147
  type ExternalFuncsMapByPm<T extends readonly PaymentMethod<unknown>[]> = { [K in T[number] as ReturnType<K>["name"]]: ReturnType<K>["externalFuncs"] };
148
148
  //#endregion
149
149
  export { PaymentKitFields as n, PaymentMethod as r, PaymentKit as t };
150
- //# sourceMappingURL=types-CQ8xbgoh.d.mts.map
150
+ //# sourceMappingURL=types-B3mjYfOm.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types-CQ8xbgoh.d.mts","names":[],"sources":["../src/analytics/checkout-timing.ts","../src/types.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"types-B3mjYfOm.d.mts","names":[],"sources":["../src/analytics/checkout-timing.ts","../src/types.ts"],"sourcesContent":[],"mappings":"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"}
@@ -108,4 +108,4 @@ function collectFraudMetadata() {
108
108
 
109
109
  //#endregion
110
110
  export { validateFormFields as a, definePaymentMethod as i, collectFraudMetadata as n, getOrCreateCheckoutRequestId as o, createCheckoutIFrame as r, withRequestId as s, $ as t };
111
- //# sourceMappingURL=utils-B70Y8YcZ.mjs.map
111
+ //# sourceMappingURL=utils-Dc6zwOe1.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils-B70Y8YcZ.mjs","names":["ENV_TO_SLUG: Record<string, string>"],"sources":["../src/utils/checkout-request-id.ts","../src/utils/validate-form-fields.ts","../src/utils/index.ts"],"sourcesContent":["import { nanoid } from \"nanoid\";\n\n/**\n * Maps PaymentKit environment to request ID env slug.\n * This must match the backend's env slug format.\n */\nconst ENV_TO_SLUG: Record<string, string> = {\n local: \"dev\",\n tunnel: \"dev\",\n sandbox: \"stg\",\n production: \"prod\",\n};\n\n// Window key for storing the request ID across PaymentKit instantiations\nconst WINDOW_KEY = \"__paymentKitRequestId__\";\n\n/**\n * Generates a checkout request ID for correlating all API calls within a checkout session.\n *\n * Format: pk_{env}_{nanoid(12)}\n * - pk = PaymentKit.js (client-generated)\n * - env = dev, stg, or prod\n * - nanoid(12) = 12 character random string\n *\n * Example: pk_stg_a1b2c3d4e5f6\n */\nexport function generateCheckoutRequestId(environment: string): string {\n const envSlug = ENV_TO_SLUG[environment] || \"dev\";\n const randomPart = nanoid(12);\n return `pk_${envSlug}_${randomPart}`;\n}\n\n/**\n * Gets or creates a checkout request ID, storing it in window for idempotency.\n *\n * This ensures the same request ID is used across:\n * - Multiple PaymentKit instantiations on the same page\n * - All analytics events and API calls within a checkout session\n *\n * The ID is generated once on first call and reused thereafter.\n */\nexport function getOrCreateCheckoutRequestId(environment: string): string {\n if (typeof window !== \"undefined\" && window[WINDOW_KEY]) {\n return window[WINDOW_KEY] as string;\n }\n\n const requestId = generateCheckoutRequestId(environment);\n\n if (typeof window !== \"undefined\") {\n (window as Record<string, unknown>)[WINDOW_KEY] = requestId;\n }\n\n return requestId;\n}\n\n/**\n * Creates RequestOptions with the x-request-id header set.\n */\nexport function withRequestId(checkoutRequestId: string) {\n return {\n headers: {\n \"x-request-id\": checkoutRequestId,\n },\n };\n}\n","import * as v from \"valibot\";\nimport type { FormErrorCodes, PaymentKitErrors, PaymentKitFields } from \"../types\";\n\ntype Options = {\n optionalZipCode?: boolean;\n};\n\nexport const validateFormFields = async (fields: PaymentKitFields, options: Options = {}) => {\n const schema = v.object({\n customer_name: v.pipe(\n v.string(\"required\"),\n v.nonEmpty(\"required\"),\n v.minLength(4, \"invalid\"),\n v.maxLength(40, \"invalid\"),\n ),\n customer_email: v.pipe(v.string(\"required\"), v.nonEmpty(\"required\"), v.email(\"invalid\")),\n customer_country: v.pipe(v.string(\"required\"), v.nonEmpty(\"required\")),\n customer_zip_code: options.optionalZipCode\n ? v.pipe(v.string(\"required\"))\n : v.pipe(v.string(\"required\"), v.nonEmpty(\"required\")),\n });\n\n const result = v.safeParse(schema, fields);\n\n if (result.issues) {\n const errors = result.issues.reduce((errors, issue) => {\n const field = v.getDotPath(issue) as keyof PaymentKitErrors;\n\n errors[field] = issue.kind === \"schema\" ? \"required\" : (issue.message as FormErrorCodes);\n return errors;\n }, {} as PaymentKitErrors);\n return { isSuccess: false, errors };\n }\n\n return { isSuccess: true };\n};\n","import type { PaymentMethod } from \"../types\";\n\nexport { generateCheckoutRequestId, getOrCreateCheckoutRequestId, withRequestId } from \"./checkout-request-id\";\nexport { validateFormFields } from \"./validate-form-fields\";\n\nexport const $ = (selector: string) => {\n const ele = document.querySelector(selector);\n if (!ele) {\n throw new Error(`Cannot find element with selector: ${selector}`);\n }\n return ele;\n};\n\nexport const definePaymentMethod = <TExternalFuncs, TName extends string>(\n paymentMethod: PaymentMethod<TExternalFuncs, TName>,\n) => paymentMethod;\n\nexport const createCheckoutIFrame = (type: string, baseUrl: string, params?: Record<string, string>) => {\n const iframe = document.createElement(\"iframe\");\n\n const searchParams = new URLSearchParams(params);\n const searchParamsStr = searchParams.toString();\n\n iframe.src = `${baseUrl}/embeds/v1/${type}${searchParamsStr ? `?${searchParamsStr}` : \"\"}`;\n\n Object.assign(iframe.style, { width: \"100%\", height: \"100%\", border: \"none\" });\n\n return iframe;\n};\n\n/**\n * Collects browser and client information for fraud detection.\n */\nexport function collectFraudMetadata() {\n return {\n ipAddress: undefined, // IP address should be collected server-side\n browserInfo: {\n userAgent: navigator.userAgent,\n language: navigator.language,\n screenHeight: window.screen.height,\n screenWidth: window.screen.width,\n colorDepth: window.screen.colorDepth,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n },\n processorFraudInfo: undefined,\n };\n}\n\ntype AddressInput = {\n line1?: string;\n line2?: string;\n city?: string;\n state?: string;\n zip_code?: string;\n country?: string;\n};\n\ntype AddressOutput = {\n line1?: string;\n line2?: string;\n city?: string;\n state?: string;\n zipCode?: string;\n country?: string;\n};\n\n/**\n * Maps address fields from snake_case to camelCase format.\n */\nexport function mapAddress(address?: AddressInput): AddressOutput | undefined {\n if (!address) return undefined;\n\n return {\n line1: address.line1,\n line2: address.line2,\n city: address.city,\n state: address.state,\n zipCode: address.zip_code,\n country: address.country,\n };\n}\n"],"mappings":";;;;;;;;AAMA,MAAMA,cAAsC;CAC1C,OAAO;CACP,QAAQ;CACR,SAAS;CACT,YAAY;CACb;AAGD,MAAM,aAAa;;;;;;;;;;;AAYnB,SAAgB,0BAA0B,aAA6B;AAGrE,QAAO,MAFS,YAAY,gBAAgB,MAEvB,GADF,OAAO,GAAG;;;;;;;;;;;AAa/B,SAAgB,6BAA6B,aAA6B;AACxE,KAAI,OAAO,WAAW,eAAe,OAAO,YAC1C,QAAO,OAAO;CAGhB,MAAM,YAAY,0BAA0B,YAAY;AAExD,KAAI,OAAO,WAAW,YACpB,CAAC,OAAmC,cAAc;AAGpD,QAAO;;;;;AAMT,SAAgB,cAAc,mBAA2B;AACvD,QAAO,EACL,SAAS,EACP,gBAAgB,mBACjB,EACF;;;;;ACxDH,MAAa,qBAAqB,OAAO,QAA0B,UAAmB,EAAE,KAAK;CAC3F,MAAM,SAAS,EAAE,OAAO;EACtB,eAAe,EAAE,KACf,EAAE,OAAO,WAAW,EACpB,EAAE,SAAS,WAAW,EACtB,EAAE,UAAU,GAAG,UAAU,EACzB,EAAE,UAAU,IAAI,UAAU,CAC3B;EACD,gBAAgB,EAAE,KAAK,EAAE,OAAO,WAAW,EAAE,EAAE,SAAS,WAAW,EAAE,EAAE,MAAM,UAAU,CAAC;EACxF,kBAAkB,EAAE,KAAK,EAAE,OAAO,WAAW,EAAE,EAAE,SAAS,WAAW,CAAC;EACtE,mBAAmB,QAAQ,kBACvB,EAAE,KAAK,EAAE,OAAO,WAAW,CAAC,GAC5B,EAAE,KAAK,EAAE,OAAO,WAAW,EAAE,EAAE,SAAS,WAAW,CAAC;EACzD,CAAC;CAEF,MAAM,SAAS,EAAE,UAAU,QAAQ,OAAO;AAE1C,KAAI,OAAO,OAOT,QAAO;EAAE,WAAW;EAAO,QANZ,OAAO,OAAO,QAAQ,QAAQ,UAAU;GACrD,MAAM,QAAQ,EAAE,WAAW,MAAM;AAEjC,UAAO,SAAS,MAAM,SAAS,WAAW,aAAc,MAAM;AAC9D,UAAO;KACN,EAAE,CAAqB;EACS;AAGrC,QAAO,EAAE,WAAW,MAAM;;;;;AC7B5B,MAAa,KAAK,aAAqB;CACrC,MAAM,MAAM,SAAS,cAAc,SAAS;AAC5C,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,sCAAsC,WAAW;AAEnE,QAAO;;AAGT,MAAa,uBACX,kBACG;AAEL,MAAa,wBAAwB,MAAc,SAAiB,WAAoC;CACtG,MAAM,SAAS,SAAS,cAAc,SAAS;CAG/C,MAAM,kBADe,IAAI,gBAAgB,OAAO,CACX,UAAU;AAE/C,QAAO,MAAM,GAAG,QAAQ,aAAa,OAAO,kBAAkB,IAAI,oBAAoB;AAEtF,QAAO,OAAO,OAAO,OAAO;EAAE,OAAO;EAAQ,QAAQ;EAAQ,QAAQ;EAAQ,CAAC;AAE9E,QAAO;;;;;AAMT,SAAgB,uBAAuB;AACrC,QAAO;EACL,WAAW;EACX,aAAa;GACX,WAAW,UAAU;GACrB,UAAU,UAAU;GACpB,cAAc,OAAO,OAAO;GAC5B,aAAa,OAAO,OAAO;GAC3B,YAAY,OAAO,OAAO;GAC1B,UAAU,KAAK,gBAAgB,CAAC,iBAAiB,CAAC;GACnD;EACD,oBAAoB;EACrB"}
1
+ {"version":3,"file":"utils-Dc6zwOe1.mjs","names":["ENV_TO_SLUG: Record<string, string>"],"sources":["../src/utils/checkout-request-id.ts","../src/utils/validate-form-fields.ts","../src/utils/index.ts"],"sourcesContent":["import { nanoid } from \"nanoid\";\n\n/**\n * Maps PaymentKit environment to request ID env slug.\n * This must match the backend's env slug format.\n */\nconst ENV_TO_SLUG: Record<string, string> = {\n local: \"dev\",\n tunnel: \"dev\",\n sandbox: \"stg\",\n production: \"prod\",\n};\n\n// Window key for storing the request ID across PaymentKit instantiations\nconst WINDOW_KEY = \"__paymentKitRequestId__\";\n\n/**\n * Generates a checkout request ID for correlating all API calls within a checkout session.\n *\n * Format: pk_{env}_{nanoid(12)}\n * - pk = PaymentKit.js (client-generated)\n * - env = dev, stg, or prod\n * - nanoid(12) = 12 character random string\n *\n * Example: pk_stg_a1b2c3d4e5f6\n */\nexport function generateCheckoutRequestId(environment: string): string {\n const envSlug = ENV_TO_SLUG[environment] || \"dev\";\n const randomPart = nanoid(12);\n return `pk_${envSlug}_${randomPart}`;\n}\n\n/**\n * Gets or creates a checkout request ID, storing it in window for idempotency.\n *\n * This ensures the same request ID is used across:\n * - Multiple PaymentKit instantiations on the same page\n * - All analytics events and API calls within a checkout session\n *\n * The ID is generated once on first call and reused thereafter.\n */\nexport function getOrCreateCheckoutRequestId(environment: string): string {\n if (typeof window !== \"undefined\" && window[WINDOW_KEY]) {\n return window[WINDOW_KEY] as string;\n }\n\n const requestId = generateCheckoutRequestId(environment);\n\n if (typeof window !== \"undefined\") {\n (window as Record<string, unknown>)[WINDOW_KEY] = requestId;\n }\n\n return requestId;\n}\n\n/**\n * Creates RequestOptions with the x-request-id header set.\n */\nexport function withRequestId(checkoutRequestId: string) {\n return {\n headers: {\n \"x-request-id\": checkoutRequestId,\n },\n };\n}\n","import * as v from \"valibot\";\nimport type { FormErrorCodes, PaymentKitErrors, PaymentKitFields } from \"../types\";\n\ntype Options = {\n optionalZipCode?: boolean;\n};\n\nexport const validateFormFields = async (fields: PaymentKitFields, options: Options = {}) => {\n const schema = v.object({\n customer_name: v.pipe(\n v.string(\"required\"),\n v.nonEmpty(\"required\"),\n v.minLength(4, \"invalid\"),\n v.maxLength(40, \"invalid\"),\n ),\n customer_email: v.pipe(v.string(\"required\"), v.nonEmpty(\"required\"), v.email(\"invalid\")),\n customer_country: v.pipe(v.string(\"required\"), v.nonEmpty(\"required\")),\n customer_zip_code: options.optionalZipCode\n ? v.pipe(v.string(\"required\"))\n : v.pipe(v.string(\"required\"), v.nonEmpty(\"required\")),\n });\n\n const result = v.safeParse(schema, fields);\n\n if (result.issues) {\n const errors = result.issues.reduce((errors, issue) => {\n const field = v.getDotPath(issue) as keyof PaymentKitErrors;\n\n errors[field] = issue.kind === \"schema\" ? \"required\" : (issue.message as FormErrorCodes);\n return errors;\n }, {} as PaymentKitErrors);\n return { isSuccess: false, errors };\n }\n\n return { isSuccess: true };\n};\n","import type { PaymentMethod } from \"../types\";\n\nexport { generateCheckoutRequestId, getOrCreateCheckoutRequestId, withRequestId } from \"./checkout-request-id\";\nexport { validateFormFields } from \"./validate-form-fields\";\n\nexport const $ = (selector: string) => {\n const ele = document.querySelector(selector);\n if (!ele) {\n throw new Error(`Cannot find element with selector: ${selector}`);\n }\n return ele;\n};\n\nexport const definePaymentMethod = <TExternalFuncs, TName extends string>(\n paymentMethod: PaymentMethod<TExternalFuncs, TName>,\n) => paymentMethod;\n\nexport const createCheckoutIFrame = (type: string, baseUrl: string, params?: Record<string, string>) => {\n const iframe = document.createElement(\"iframe\");\n\n const searchParams = new URLSearchParams(params);\n const searchParamsStr = searchParams.toString();\n\n iframe.src = `${baseUrl}/embeds/v1/${type}${searchParamsStr ? `?${searchParamsStr}` : \"\"}`;\n\n Object.assign(iframe.style, { width: \"100%\", height: \"100%\", border: \"none\" });\n\n return iframe;\n};\n\n/**\n * Collects browser and client information for fraud detection.\n */\nexport function collectFraudMetadata() {\n return {\n ipAddress: undefined, // IP address should be collected server-side\n browserInfo: {\n userAgent: navigator.userAgent,\n language: navigator.language,\n screenHeight: window.screen.height,\n screenWidth: window.screen.width,\n colorDepth: window.screen.colorDepth,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n },\n processorFraudInfo: undefined,\n };\n}\n\ntype AddressInput = {\n line1?: string;\n line2?: string;\n city?: string;\n state?: string;\n zip_code?: string;\n country?: string;\n};\n\ntype AddressOutput = {\n line1?: string;\n line2?: string;\n city?: string;\n state?: string;\n zipCode?: string;\n country?: string;\n};\n\n/**\n * Maps address fields from snake_case to camelCase format.\n */\nexport function mapAddress(address?: AddressInput): AddressOutput | undefined {\n if (!address) return undefined;\n\n return {\n line1: address.line1,\n line2: address.line2,\n city: address.city,\n state: address.state,\n zipCode: address.zip_code,\n country: address.country,\n };\n}\n"],"mappings":";;;;;;;;AAMA,MAAMA,cAAsC;CAC1C,OAAO;CACP,QAAQ;CACR,SAAS;CACT,YAAY;CACb;AAGD,MAAM,aAAa;;;;;;;;;;;AAYnB,SAAgB,0BAA0B,aAA6B;AAGrE,QAAO,MAFS,YAAY,gBAAgB,MAEvB,GADF,OAAO,GAAG;;;;;;;;;;;AAa/B,SAAgB,6BAA6B,aAA6B;AACxE,KAAI,OAAO,WAAW,eAAe,OAAO,YAC1C,QAAO,OAAO;CAGhB,MAAM,YAAY,0BAA0B,YAAY;AAExD,KAAI,OAAO,WAAW,YACpB,CAAC,OAAmC,cAAc;AAGpD,QAAO;;;;;AAMT,SAAgB,cAAc,mBAA2B;AACvD,QAAO,EACL,SAAS,EACP,gBAAgB,mBACjB,EACF;;;;;ACxDH,MAAa,qBAAqB,OAAO,QAA0B,UAAmB,EAAE,KAAK;CAC3F,MAAM,SAAS,EAAE,OAAO;EACtB,eAAe,EAAE,KACf,EAAE,OAAO,WAAW,EACpB,EAAE,SAAS,WAAW,EACtB,EAAE,UAAU,GAAG,UAAU,EACzB,EAAE,UAAU,IAAI,UAAU,CAC3B;EACD,gBAAgB,EAAE,KAAK,EAAE,OAAO,WAAW,EAAE,EAAE,SAAS,WAAW,EAAE,EAAE,MAAM,UAAU,CAAC;EACxF,kBAAkB,EAAE,KAAK,EAAE,OAAO,WAAW,EAAE,EAAE,SAAS,WAAW,CAAC;EACtE,mBAAmB,QAAQ,kBACvB,EAAE,KAAK,EAAE,OAAO,WAAW,CAAC,GAC5B,EAAE,KAAK,EAAE,OAAO,WAAW,EAAE,EAAE,SAAS,WAAW,CAAC;EACzD,CAAC;CAEF,MAAM,SAAS,EAAE,UAAU,QAAQ,OAAO;AAE1C,KAAI,OAAO,OAOT,QAAO;EAAE,WAAW;EAAO,QANZ,OAAO,OAAO,QAAQ,QAAQ,UAAU;GACrD,MAAM,QAAQ,EAAE,WAAW,MAAM;AAEjC,UAAO,SAAS,MAAM,SAAS,WAAW,aAAc,MAAM;AAC9D,UAAO;KACN,EAAE,CAAqB;EACS;AAGrC,QAAO,EAAE,WAAW,MAAM;;;;;AC7B5B,MAAa,KAAK,aAAqB;CACrC,MAAM,MAAM,SAAS,cAAc,SAAS;AAC5C,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,sCAAsC,WAAW;AAEnE,QAAO;;AAGT,MAAa,uBACX,kBACG;AAEL,MAAa,wBAAwB,MAAc,SAAiB,WAAoC;CACtG,MAAM,SAAS,SAAS,cAAc,SAAS;CAG/C,MAAM,kBADe,IAAI,gBAAgB,OAAO,CACX,UAAU;AAE/C,QAAO,MAAM,GAAG,QAAQ,aAAa,OAAO,kBAAkB,IAAI,oBAAoB;AAEtF,QAAO,OAAO,OAAO,OAAO;EAAE,OAAO;EAAQ,QAAQ;EAAQ,QAAQ;EAAQ,CAAC;AAE9E,QAAO;;;;;AAMT,SAAgB,uBAAuB;AACrC,QAAO;EACL,WAAW;EACX,aAAa;GACX,WAAW,UAAU;GACrB,UAAU,UAAU;GACpB,cAAc,OAAO,OAAO;GAC5B,aAAa,OAAO,OAAO;GAC3B,YAAY,OAAO,OAAO;GAC1B,UAAU,KAAK,gBAAgB,CAAC,iBAAiB,CAAC;GACnD;EACD,oBAAoB;EACrB"}
@@ -154,4 +154,4 @@ function createVgsCardFields(form, mountPoints, css, onFocusChangeCallbacks, pla
154
154
 
155
155
  //#endregion
156
156
  export { initVgsCollect as n, loadVgsCollectScript as r, createVgsCardFields as t };
157
- //# sourceMappingURL=vgs-collect-loader-l5_Pnmhz.mjs.map
157
+ //# sourceMappingURL=vgs-collect-loader-CTLSv4qv.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"vgs-collect-loader-l5_Pnmhz.mjs","names":["loadPromise: Promise<void> | null","observers: MutationObserver[]","containers: Element[]","fieldMap: [VGSCollectField, string][]"],"sources":["../src/payment-methods/vgs-collect-loader.ts"],"sourcesContent":["const VGS_COLLECT_CDN = \"https://js.verygoodvault.com/vgs-collect/3.2.1/vgs-collect.js\";\n\nlet loadPromise: Promise<void> | null = null;\n\n/**\n * Loads VGS Collect JS from CDN. Idempotent — subsequent calls return the same promise.\n */\nexport function loadVgsCollectScript(): Promise<void> {\n if (loadPromise) {\n console.log(\"[PaymentKit] VGS Collect CDN load already in progress — reusing promise\");\n return loadPromise;\n }\n\n loadPromise = new Promise<void>((resolve, reject) => {\n if (typeof window !== \"undefined\" && window.VGSCollect) {\n console.log(\"[PaymentKit] VGS Collect JS already available on window\");\n resolve();\n return;\n }\n\n console.log(`[PaymentKit] Loading VGS Collect JS from CDN: ${VGS_COLLECT_CDN}`);\n const script = document.createElement(\"script\");\n script.src = VGS_COLLECT_CDN;\n script.async = true;\n script.onload = () => {\n console.log(\"[PaymentKit] VGS Collect JS loaded successfully from CDN\");\n resolve();\n };\n script.onerror = () => {\n console.error(`[PaymentKit] Failed to load VGS Collect JS from CDN: ${VGS_COLLECT_CDN}`);\n loadPromise = null;\n reject(new Error(\"Failed to load VGS Collect JS\"));\n };\n document.head.appendChild(script);\n });\n\n return loadPromise;\n}\n\n/**\n * Initializes a VGS Collect form instance.\n */\nexport function initVgsCollect(vaultId: string, environment: string): VGSCollectForm {\n if (!window.VGSCollect) {\n throw new Error(\"VGS Collect JS not loaded. Call loadVgsCollectScript() first.\");\n }\n return window.VGSCollect.create(vaultId, environment, () => {});\n}\n\n/**\n * Creates and mounts VGS Collect card fields using CMP-specific field methods.\n *\n * Uses cardNumberField(), cardExpirationDateField(), cardCVCField() which are\n * required for the CMP createCard() flow. After mounting, call form.createCard()\n * to create a card in the VGS vault, which returns aliases for PAN and CVC.\n *\n * @param form - VGS Collect form instance\n * @param mountPoints - CSS selectors for PAN, expiry, and CVC containers\n * @param css - Optional CSS to apply to VGS Collect iframe fields\n */\nexport function createVgsCardFields(\n form: VGSCollectForm,\n mountPoints: { pan: string; exp: string; cvc: string },\n css?: Record<string, string>,\n onFocusChangeCallbacks?: Partial<Record<string, (isFocused: boolean) => void>>,\n placeholders?: Partial<Record<string, string>>,\n): () => void {\n // Read container padding so the VGS input content matches the merchant's\n // visual intent. The iframe uses absolute positioning (inset: 0) to fill\n // the full container, so the input needs its own padding for alignment.\n const sampleContainer = document.querySelector(mountPoints.pan) as HTMLElement | null;\n const containerPadding = sampleContainer ? getComputedStyle(sampleContainer).padding : undefined;\n\n const baseCss = css ?? {\n \"font-size\": \"1rem\",\n color: \"#18181b\",\n \"font-family\": \"ui-sans-serif, system-ui, sans-serif\",\n };\n\n const fieldCss = {\n ...baseCss,\n height: \"100%\",\n \"box-sizing\": \"border-box\",\n ...(containerPadding && containerPadding !== \"0px\" ? { padding: containerPadding } : {}),\n };\n\n // Remove stale iframes from previous VGS form mounts to prevent overlap.\n // VGS's form.unmount() does not remove iframes from the DOM.\n // IMPORTANT: This must run BEFORE VGS field methods below, because VGS may\n // insert new iframes synchronously — removing after would destroy fresh iframes.\n for (const selector of [mountPoints.pan, mountPoints.exp, mountPoints.cvc]) {\n const container = document.querySelector(selector);\n if (!container) continue;\n const staleIframes = container.querySelectorAll(\"iframe\");\n for (const iframe of staleIframes) {\n iframe.remove();\n }\n }\n\n const panField = form.cardNumberField(mountPoints.pan, {\n placeholder: placeholders?.card_pan ?? \"Card number\",\n validations: [\"required\", \"validCardNumber\"],\n css: fieldCss,\n });\n\n const expField = form.field(mountPoints.exp, {\n type: \"card-expiration-date\",\n name: \"exp-date\",\n placeholder: placeholders?.card_exp ?? \"MM / YY\",\n yearLength: 2,\n serializers: [{ name: \"separate\", options: { monthName: \"month\", yearName: \"year\" } }],\n validations: [\"required\", \"validCardExpirationDate\"],\n css: fieldCss,\n });\n\n const cvcField = form.cardCVCField(mountPoints.cvc, {\n placeholder: placeholders?.card_cvc ?? \"123\",\n validations: [\"required\", \"validCardSecurityCode\"],\n css: fieldCss,\n });\n\n // Track observers for cleanup\n const observers: MutationObserver[] = [];\n const containers: Element[] = [];\n\n // VGS Collect doesn't set width/height on its iframes, so they may not\n // fill the merchant's container. Force them to stretch like direct-mode iframes.\n // Iframes may be inserted asynchronously, so use MutationObserver as a fallback.\n for (const selector of [mountPoints.pan, mountPoints.exp, mountPoints.cvc]) {\n const container = document.querySelector(selector);\n if (!container) continue;\n containers.push(container);\n\n const styleIframe = (iframe: HTMLIFrameElement) => {\n // Use absolute positioning so the iframe covers the full container\n // including any padding the merchant's CSS applies.\n const containerEl = container as HTMLElement;\n if (getComputedStyle(containerEl).position === \"static\") {\n containerEl.style.position = \"relative\";\n }\n iframe.style.position = \"absolute\";\n iframe.style.inset = \"0\";\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n iframe.style.border = \"none\";\n };\n\n // Always set up a MutationObserver to catch asynchronously inserted iframes.\n // VGS inserts iframes after field creation, so we need the observer even if\n // no iframe exists yet.\n const observer = new MutationObserver(() => {\n const iframe = container.querySelector(\"iframe\") as HTMLIFrameElement | null;\n if (iframe && iframe.style.position !== \"absolute\") {\n styleIframe(iframe);\n }\n });\n observer.observe(container, { childList: true, subtree: true });\n observers.push(observer);\n\n // Style any iframe VGS may have inserted synchronously during field creation.\n // The MutationObserver only fires on future mutations, so this handles the\n // case where VGS inserts the iframe before the observer is attached.\n const existing = container.querySelector(\"iframe\") as HTMLIFrameElement | null;\n if (existing && existing.style.position !== \"absolute\") {\n styleIframe(existing);\n }\n }\n\n if (onFocusChangeCallbacks) {\n const fieldMap: [VGSCollectField, string][] = [\n [panField, \"card_pan\"],\n [expField, \"card_exp\"],\n [cvcField, \"card_cvc\"],\n ];\n for (const [field, key] of fieldMap) {\n const cb = onFocusChangeCallbacks[key];\n if (cb) {\n field.on(\"focus\", () => cb(true));\n field.on(\"blur\", () => cb(false));\n }\n }\n }\n\n // Return cleanup function to disconnect observers and remove iframes\n return () => {\n for (const observer of observers) {\n observer.disconnect();\n }\n for (const container of containers) {\n const iframes = container.querySelectorAll(\"iframe\");\n for (const iframe of iframes) {\n iframe.remove();\n }\n }\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vgs-collect-loader-CTLSv4qv.mjs","names":["loadPromise: Promise<void> | null","observers: MutationObserver[]","containers: Element[]","fieldMap: [VGSCollectField, string][]"],"sources":["../src/payment-methods/vgs-collect-loader.ts"],"sourcesContent":["const VGS_COLLECT_CDN = \"https://js.verygoodvault.com/vgs-collect/3.2.1/vgs-collect.js\";\n\nlet loadPromise: Promise<void> | null = null;\n\n/**\n * Loads VGS Collect JS from CDN. Idempotent — subsequent calls return the same promise.\n */\nexport function loadVgsCollectScript(): Promise<void> {\n if (loadPromise) {\n console.log(\"[PaymentKit] VGS Collect CDN load already in progress — reusing promise\");\n return loadPromise;\n }\n\n loadPromise = new Promise<void>((resolve, reject) => {\n if (typeof window !== \"undefined\" && window.VGSCollect) {\n console.log(\"[PaymentKit] VGS Collect JS already available on window\");\n resolve();\n return;\n }\n\n console.log(`[PaymentKit] Loading VGS Collect JS from CDN: ${VGS_COLLECT_CDN}`);\n const script = document.createElement(\"script\");\n script.src = VGS_COLLECT_CDN;\n script.async = true;\n script.onload = () => {\n console.log(\"[PaymentKit] VGS Collect JS loaded successfully from CDN\");\n resolve();\n };\n script.onerror = () => {\n console.error(`[PaymentKit] Failed to load VGS Collect JS from CDN: ${VGS_COLLECT_CDN}`);\n loadPromise = null;\n reject(new Error(\"Failed to load VGS Collect JS\"));\n };\n document.head.appendChild(script);\n });\n\n return loadPromise;\n}\n\n/**\n * Initializes a VGS Collect form instance.\n */\nexport function initVgsCollect(vaultId: string, environment: string): VGSCollectForm {\n if (!window.VGSCollect) {\n throw new Error(\"VGS Collect JS not loaded. Call loadVgsCollectScript() first.\");\n }\n return window.VGSCollect.create(vaultId, environment, () => {});\n}\n\n/**\n * Creates and mounts VGS Collect card fields using CMP-specific field methods.\n *\n * Uses cardNumberField(), cardExpirationDateField(), cardCVCField() which are\n * required for the CMP createCard() flow. After mounting, call form.createCard()\n * to create a card in the VGS vault, which returns aliases for PAN and CVC.\n *\n * @param form - VGS Collect form instance\n * @param mountPoints - CSS selectors for PAN, expiry, and CVC containers\n * @param css - Optional CSS to apply to VGS Collect iframe fields\n */\nexport function createVgsCardFields(\n form: VGSCollectForm,\n mountPoints: { pan: string; exp: string; cvc: string },\n css?: Record<string, string>,\n onFocusChangeCallbacks?: Partial<Record<string, (isFocused: boolean) => void>>,\n placeholders?: Partial<Record<string, string>>,\n): () => void {\n // Read container padding so the VGS input content matches the merchant's\n // visual intent. The iframe uses absolute positioning (inset: 0) to fill\n // the full container, so the input needs its own padding for alignment.\n const sampleContainer = document.querySelector(mountPoints.pan) as HTMLElement | null;\n const containerPadding = sampleContainer ? getComputedStyle(sampleContainer).padding : undefined;\n\n const baseCss = css ?? {\n \"font-size\": \"1rem\",\n color: \"#18181b\",\n \"font-family\": \"ui-sans-serif, system-ui, sans-serif\",\n };\n\n const fieldCss = {\n ...baseCss,\n height: \"100%\",\n \"box-sizing\": \"border-box\",\n ...(containerPadding && containerPadding !== \"0px\" ? { padding: containerPadding } : {}),\n };\n\n // Remove stale iframes from previous VGS form mounts to prevent overlap.\n // VGS's form.unmount() does not remove iframes from the DOM.\n // IMPORTANT: This must run BEFORE VGS field methods below, because VGS may\n // insert new iframes synchronously — removing after would destroy fresh iframes.\n for (const selector of [mountPoints.pan, mountPoints.exp, mountPoints.cvc]) {\n const container = document.querySelector(selector);\n if (!container) continue;\n const staleIframes = container.querySelectorAll(\"iframe\");\n for (const iframe of staleIframes) {\n iframe.remove();\n }\n }\n\n const panField = form.cardNumberField(mountPoints.pan, {\n placeholder: placeholders?.card_pan ?? \"Card number\",\n validations: [\"required\", \"validCardNumber\"],\n css: fieldCss,\n });\n\n const expField = form.field(mountPoints.exp, {\n type: \"card-expiration-date\",\n name: \"exp-date\",\n placeholder: placeholders?.card_exp ?? \"MM / YY\",\n yearLength: 2,\n serializers: [{ name: \"separate\", options: { monthName: \"month\", yearName: \"year\" } }],\n validations: [\"required\", \"validCardExpirationDate\"],\n css: fieldCss,\n });\n\n const cvcField = form.cardCVCField(mountPoints.cvc, {\n placeholder: placeholders?.card_cvc ?? \"123\",\n validations: [\"required\", \"validCardSecurityCode\"],\n css: fieldCss,\n });\n\n // Track observers for cleanup\n const observers: MutationObserver[] = [];\n const containers: Element[] = [];\n\n // VGS Collect doesn't set width/height on its iframes, so they may not\n // fill the merchant's container. Force them to stretch like direct-mode iframes.\n // Iframes may be inserted asynchronously, so use MutationObserver as a fallback.\n for (const selector of [mountPoints.pan, mountPoints.exp, mountPoints.cvc]) {\n const container = document.querySelector(selector);\n if (!container) continue;\n containers.push(container);\n\n const styleIframe = (iframe: HTMLIFrameElement) => {\n // Use absolute positioning so the iframe covers the full container\n // including any padding the merchant's CSS applies.\n const containerEl = container as HTMLElement;\n if (getComputedStyle(containerEl).position === \"static\") {\n containerEl.style.position = \"relative\";\n }\n iframe.style.position = \"absolute\";\n iframe.style.inset = \"0\";\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n iframe.style.border = \"none\";\n };\n\n // Always set up a MutationObserver to catch asynchronously inserted iframes.\n // VGS inserts iframes after field creation, so we need the observer even if\n // no iframe exists yet.\n const observer = new MutationObserver(() => {\n const iframe = container.querySelector(\"iframe\") as HTMLIFrameElement | null;\n if (iframe && iframe.style.position !== \"absolute\") {\n styleIframe(iframe);\n }\n });\n observer.observe(container, { childList: true, subtree: true });\n observers.push(observer);\n\n // Style any iframe VGS may have inserted synchronously during field creation.\n // The MutationObserver only fires on future mutations, so this handles the\n // case where VGS inserts the iframe before the observer is attached.\n const existing = container.querySelector(\"iframe\") as HTMLIFrameElement | null;\n if (existing && existing.style.position !== \"absolute\") {\n styleIframe(existing);\n }\n }\n\n if (onFocusChangeCallbacks) {\n const fieldMap: [VGSCollectField, string][] = [\n [panField, \"card_pan\"],\n [expField, \"card_exp\"],\n [cvcField, \"card_cvc\"],\n ];\n for (const [field, key] of fieldMap) {\n const cb = onFocusChangeCallbacks[key];\n if (cb) {\n field.on(\"focus\", () => cb(true));\n field.on(\"blur\", () => cb(false));\n }\n }\n }\n\n // Return cleanup function to disconnect observers and remove iframes\n return () => {\n for (const observer of observers) {\n observer.disconnect();\n }\n for (const container of containers) {\n const iframes = container.querySelectorAll(\"iframe\");\n for (const iframe of iframes) {\n iframe.remove();\n }\n }\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payment-kit-js/vanilla",
3
- "version": "0.5.15",
3
+ "version": "0.5.16",
4
4
  "main": "./dist/index.mjs",
5
5
  "types": "./dist/index.d.mts",
6
6
  "module": "./dist/index.mjs",
@@ -52,5 +52,5 @@
52
52
  "tsdown": "^0.15.10",
53
53
  "typescript": "^5.9.3"
54
54
  },
55
- "stableVersion": "0.5.15"
55
+ "stableVersion": "0.5.16"
56
56
  }