@payment-kit-js/vanilla 0.4.1 → 0.5.2

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 (73) hide show
  1. package/dist/airwallex-apple-pay-adapter-BE15xREr.mjs +237 -0
  2. package/dist/airwallex-apple-pay-adapter-BE15xREr.mjs.map +1 -0
  3. package/dist/airwallex-apple-pay-adapter-I_pnNYdy.d.mts +98 -0
  4. package/dist/airwallex-apple-pay-adapter-I_pnNYdy.d.mts.map +1 -0
  5. package/dist/{airwallex-google-pay-adapter-BCmTZip5.mjs → airwallex-google-pay-adapter-CHol_8f2.mjs} +1 -1
  6. package/dist/{airwallex-google-pay-adapter-BCmTZip5.mjs.map → airwallex-google-pay-adapter-CHol_8f2.mjs.map} +1 -1
  7. package/dist/{airwallex-google-pay-adapter-Be2Af4N9.d.mts → airwallex-google-pay-adapter-CY379Rre.d.mts} +1 -1
  8. package/dist/{airwallex-google-pay-adapter-Be2Af4N9.d.mts.map → airwallex-google-pay-adapter-CY379Rre.d.mts.map} +1 -1
  9. package/dist/cdn/paymentkit.js +789 -420
  10. package/dist/cdn/paymentkit.js.map +4 -4
  11. package/dist/cdn/paymentkit.min.js +6 -6
  12. package/dist/cdn/paymentkit.min.js.map +4 -4
  13. package/dist/{connect-card-BrtCmsjz.mjs → connect-card-CMZkeppE.mjs} +1 -1
  14. package/dist/{connect-card-BrtCmsjz.mjs.map → connect-card-CMZkeppE.mjs.map} +1 -1
  15. package/dist/{connect-card-DTfXuTsW.d.mts → connect-card-Cxy51W6t.d.mts} +1 -1
  16. package/dist/{connect-card-DTfXuTsW.d.mts.map → connect-card-Cxy51W6t.d.mts.map} +1 -1
  17. package/dist/connect-tunnel-x-BhVAej5Q.mjs.map +1 -1
  18. package/dist/{connect-tunnel-x-Dxcg5Y7Y.d.mts → connect-tunnel-x-lv6Wtdme.d.mts} +6 -1
  19. package/dist/connect-tunnel-x-lv6Wtdme.d.mts.map +1 -0
  20. package/dist/index.d.mts +3 -3
  21. package/dist/index.d.mts.map +1 -1
  22. package/dist/index.mjs +76 -14
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/{next-action-handlers-BZs04hYb.mjs → next-action-handlers-CTx8tRt0.mjs} +1 -1
  25. package/dist/{next-action-handlers-BZs04hYb.mjs.map → next-action-handlers-CTx8tRt0.mjs.map} +1 -1
  26. package/dist/payment-methods/airwallex-apple-pay-adapter.d.mts +2 -0
  27. package/dist/payment-methods/airwallex-apple-pay-adapter.mjs +3 -0
  28. package/dist/payment-methods/airwallex-google-pay-adapter.d.mts +1 -1
  29. package/dist/payment-methods/airwallex-google-pay-adapter.mjs +1 -1
  30. package/dist/payment-methods/apple-pay.d.mts +37 -17
  31. package/dist/payment-methods/apple-pay.d.mts.map +1 -1
  32. package/dist/payment-methods/apple-pay.mjs +203 -37
  33. package/dist/payment-methods/apple-pay.mjs.map +1 -1
  34. package/dist/payment-methods/card.d.mts +3 -3
  35. package/dist/payment-methods/card.d.mts.map +1 -1
  36. package/dist/payment-methods/card.mjs +208 -41
  37. package/dist/payment-methods/card.mjs.map +1 -1
  38. package/dist/payment-methods/google-pay.d.mts +5 -5
  39. package/dist/payment-methods/google-pay.d.mts.map +1 -1
  40. package/dist/payment-methods/google-pay.mjs +6 -7
  41. package/dist/payment-methods/google-pay.mjs.map +1 -1
  42. package/dist/payment-methods/next-action-handlers.mjs +1 -1
  43. package/dist/payment-methods/paypal.d.mts +3 -3
  44. package/dist/payment-methods/paypal.mjs +3 -3
  45. package/dist/payment-methods/paypal.mjs.map +1 -1
  46. package/dist/payment-methods/stripe-apple-pay-adapter.d.mts +1 -1
  47. package/dist/payment-methods/stripe-apple-pay-adapter.mjs +1 -1
  48. package/dist/payment-methods/stripe-google-pay-adapter.d.mts +1 -1
  49. package/dist/payment-methods/stripe-google-pay-adapter.mjs +1 -1
  50. package/dist/payment-methods/vgs-collect-loader.d.mts +28 -0
  51. package/dist/payment-methods/vgs-collect-loader.d.mts.map +1 -0
  52. package/dist/payment-methods/vgs-collect-loader.mjs +3 -0
  53. package/dist/penpal/connect-card.d.mts +1 -1
  54. package/dist/penpal/connect-card.mjs +1 -1
  55. package/dist/penpal/connect-tunnel-x.d.mts +1 -1
  56. package/dist/{stripe-apple-pay-adapter-Bg7nCy3P.mjs → stripe-apple-pay-adapter-Cd9LVNnp.mjs} +1 -1
  57. package/dist/{stripe-apple-pay-adapter-Bg7nCy3P.mjs.map → stripe-apple-pay-adapter-Cd9LVNnp.mjs.map} +1 -1
  58. package/dist/{stripe-apple-pay-adapter-Bq3f1mqv.d.mts → stripe-apple-pay-adapter-DhpGclW9.d.mts} +1 -1
  59. package/dist/{stripe-apple-pay-adapter-Bq3f1mqv.d.mts.map → stripe-apple-pay-adapter-DhpGclW9.d.mts.map} +1 -1
  60. package/dist/{stripe-google-pay-adapter-xktEycOD.d.mts → stripe-google-pay-adapter-C3NCBSO3.d.mts} +1 -1
  61. package/dist/{stripe-google-pay-adapter-xktEycOD.d.mts.map → stripe-google-pay-adapter-C3NCBSO3.d.mts.map} +1 -1
  62. package/dist/{stripe-google-pay-adapter-DjrgDYWe.mjs → stripe-google-pay-adapter-CqcUEoM3.mjs} +1 -1
  63. package/dist/{stripe-google-pay-adapter-DjrgDYWe.mjs.map → stripe-google-pay-adapter-CqcUEoM3.mjs.map} +1 -1
  64. package/dist/{types-CPuloCtF.d.mts → types-CZk3V0Qt.d.mts} +24 -6
  65. package/dist/types-CZk3V0Qt.d.mts.map +1 -0
  66. package/dist/{utils-Dgyk7RkM.mjs → utils-B70Y8YcZ.mjs} +20 -9
  67. package/dist/utils-B70Y8YcZ.mjs.map +1 -0
  68. package/dist/vgs-collect-loader-D3_xOA-G.mjs +93 -0
  69. package/dist/vgs-collect-loader-D3_xOA-G.mjs.map +1 -0
  70. package/package.json +4 -2
  71. package/dist/connect-tunnel-x-Dxcg5Y7Y.d.mts.map +0 -1
  72. package/dist/types-CPuloCtF.d.mts.map +0 -1
  73. package/dist/utils-Dgyk7RkM.mjs.map +0 -1
@@ -1,7 +1,8 @@
1
- import { r as PaymentMethod } from "../types-CPuloCtF.mjs";
2
- import "../connect-card-DTfXuTsW.mjs";
3
- import "../connect-tunnel-x-Dxcg5Y7Y.mjs";
4
- import { t as ApplePayMockScenario } from "../stripe-apple-pay-adapter-Bq3f1mqv.mjs";
1
+ import { r as PaymentMethod } from "../types-CZk3V0Qt.mjs";
2
+ import "../connect-card-Cxy51W6t.mjs";
3
+ import "../connect-tunnel-x-lv6Wtdme.mjs";
4
+ import { a as ApplePayEncryptedToken } from "../airwallex-apple-pay-adapter-I_pnNYdy.mjs";
5
+ import { t as ApplePayMockScenario } from "../stripe-apple-pay-adapter-DhpGclW9.mjs";
5
6
 
6
7
  //#region src/payment-methods/apple-pay.d.ts
7
8
  type ApplePayCustomerInfo = {
@@ -21,18 +22,28 @@ type ApplePayStartRequest = {
21
22
  };
22
23
  };
23
24
  mock_scenario?: string;
25
+ validation_url?: string;
26
+ initiative_context?: string;
24
27
  };
25
28
  type ApplePayStartResponse = {
26
- client_secret: string;
27
- stripe_pk: string;
28
29
  checkout_attempt_id: string;
29
30
  amount: number;
30
31
  currency: string;
31
32
  country: string;
33
+ processor: "stripe" | "airwallex";
34
+ client_secret?: string;
35
+ stripe_pk?: string;
36
+ merchant_session?: {
37
+ [key: string]: unknown;
38
+ };
39
+ };
40
+ type Airwallex3dsNextAction = {
41
+ type: "airwallex_3ds";
42
+ url: string;
32
43
  };
33
44
  type ApplePayConfirmRequest = {
34
- payment_method_id: string;
35
- apple_pay_token?: ApplePayJS.ApplePayPaymentToken | {
45
+ payment_method_id?: string;
46
+ apple_pay_token?: ApplePayEncryptedToken | {
36
47
  [key: string]: unknown;
37
48
  };
38
49
  mock_scenario?: string;
@@ -40,24 +51,27 @@ type ApplePayConfirmRequest = {
40
51
  type ApplePayConfirmResponse = {
41
52
  charge_status: "success" | "fail" | "pending";
42
53
  transaction_id?: string;
43
- error_message?: string;
54
+ error_message_for_customer?: string;
55
+ error_message_for_debug?: string;
44
56
  checkout_attempt_id: string;
57
+ next_action?: Airwallex3dsNextAction;
45
58
  };
46
59
  type ApplePaySubmitOptions = {
47
60
  processorId: string;
61
+ processorType?: "stripe" | "airwallex";
48
62
  customerInfo: ApplePayCustomerInfo;
49
63
  mockScenario?: ApplePayMockScenario;
64
+ amount?: number;
65
+ currency?: string;
66
+ country: string;
67
+ merchantName?: string;
50
68
  };
51
69
  /**
52
70
  * Pre-fetch Apple Pay data and prepare the PaymentRequest.
53
71
  * Call this when the checkout page loads, NOT in the click handler.
54
- * This allows showPreparedPaymentSheet to be called synchronously on click.
55
72
  *
56
- * Flow:
57
- * 1. Call /start endpoint to get PaymentIntent details
58
- * 2. Initialize Stripe adapter
59
- * 3. Create PaymentRequest and call canMakePayment() (required by Stripe)
60
- * 4. Store everything for later use
73
+ * For Stripe: pre-fetches data and prepares PaymentRequest for immediate show.
74
+ * For Airwallex: returns success with processor="airwallex" so submit uses native ApplePaySession.
61
75
  */
62
76
  declare function prepareApplePay(apiBaseUrl: string, secureToken: string, options: ApplePaySubmitOptions, environment: string): Promise<{
63
77
  success: boolean;
@@ -72,7 +86,13 @@ declare function isApplePayPrepared(): boolean;
72
86
  * Clear prepared state (call on unmount or when checkout changes).
73
87
  */
74
88
  declare function clearPreparedApplePay(): void;
75
- declare const ApplePayPaymentMethod: PaymentMethod<{}, "apple_pay">;
89
+ declare const ApplePayPaymentMethod: PaymentMethod<{
90
+ prepareApplePay: (options: ApplePaySubmitOptions) => Promise<{
91
+ success: boolean;
92
+ error?: string;
93
+ applePay?: boolean;
94
+ }>;
95
+ }, "apple_pay">;
76
96
  //#endregion
77
- export { ApplePayConfirmRequest, ApplePayConfirmResponse, ApplePayCustomerInfo, ApplePayMockScenario, ApplePayStartRequest, ApplePayStartResponse, ApplePaySubmitOptions, clearPreparedApplePay, ApplePayPaymentMethod as default, isApplePayPrepared, prepareApplePay };
97
+ export { Airwallex3dsNextAction, ApplePayConfirmRequest, ApplePayConfirmResponse, ApplePayCustomerInfo, ApplePayMockScenario, ApplePayStartRequest, ApplePayStartResponse, ApplePaySubmitOptions, clearPreparedApplePay, ApplePayPaymentMethod as default, isApplePayPrepared, prepareApplePay };
78
98
  //# sourceMappingURL=apple-pay.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apple-pay.d.mts","names":[],"sources":["../../src/payment-methods/apple-pay.ts"],"sourcesContent":[],"mappings":";;;;;;KAKY,oBAAA;;;;KAKA,oBAAA;EALA,YAAA,EAAA,MAAA;EAKA,aAAA,EAEK,oBAAA;EASL,cAAA,EAAA;IASA,SAAA,CAAA,EAAA,MAAA;IAQA,WAAA,CAAA,EAAA;MAOA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAqB;IA8JX,CAAA;IAuEN,kBAAkB,CAAA,EAAA;MAOlB,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAqB;IAwF/B,CAAA;;;;KA5VM,qBAAA;;;;;;;;KASA,sBAAA;;oBAIQ,UAAA,CAAW;;;;;KAInB,uBAAA;;;;;;KAOA,qBAAA;;gBAEI;iBACC;;;;;;;;;;;;;iBA2JK,eAAA,mDAGX,6CAER;;;;;;;;iBAkEa,kBAAA,CAAA;;;;iBAOA,qBAAA,CAAA;cAwFV,uBAWJ"}
1
+ {"version":3,"file":"apple-pay.d.mts","names":[],"sources":["../../src/payment-methods/apple-pay.ts"],"sourcesContent":[],"mappings":";;;;;;;KAYY,oBAAA;;;;KAKA,oBAAA;EALA,YAAA,EAAA,MAAA;EAKA,aAAA,EAEK,oBAAA;EAYL,cAAA,EAAA;IAkBA,SAAA,CAAA,EAAA,MAAA;IAKA,WAAA,CAAA,EAAA;MAQA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAuB;IASvB,CAAA;IAoKU,kBAAe,CAAA,EAAA;MAwFrB,CAAA,GAAA,EAAA,MAAA,CAAkB,EAAA,OAAA;IAOlB,CAAA;EA2ZV,CAAA;EAI2B,aAAA,CAAA,EAAA,MAAA;EAAqB,cAAA,CAAA,EAAA,MAAA;EAAA,kBAAA,CAAA,EAAA,MAAA;CAJ3B;KAtsBf,qBAAA;;;;;;;;;;;;KAkBA,sBAAA;;;;KAKA,sBAAA;;oBAIQ;;;;;KAIR,uBAAA;;;;;;gBAMI;;KAGJ,qBAAA;;;gBAGI;iBACC;;;;;;;;;;;;;iBAgKK,eAAA,mDAGX,6CAER;;;;;;;;iBAmFa,kBAAA,CAAA;;;;iBAOA,qBAAA,CAAA;cA2ZV,uBAIgD;6BAArB,0BAAqB"}
@@ -1,8 +1,10 @@
1
- import { i as definePaymentMethod, n as collectFraudMetadata, o as generateCheckoutRequestId } from "../utils-Dgyk7RkM.mjs";
2
- import { n as StripeApplePayAdapter, t as ApplePayMockScenario } from "../stripe-apple-pay-adapter-Bg7nCy3P.mjs";
1
+ import { i as definePaymentMethod, n as collectFraudMetadata, o as getOrCreateCheckoutRequestId } from "../utils-B70Y8YcZ.mjs";
2
+ import { n as AirwallexApplePayMockScenario, t as AirwallexApplePayAdapter } from "../airwallex-apple-pay-adapter-BE15xREr.mjs";
3
+ import { t as handleNextAction } from "../next-action-handlers-CTx8tRt0.mjs";
4
+ import { n as StripeApplePayAdapter, t as ApplePayMockScenario } from "../stripe-apple-pay-adapter-Cd9LVNnp.mjs";
3
5
 
4
6
  //#region src/payment-methods/apple-pay.ts
5
- let preparedState = null;
7
+ let preparedStripeState = null;
6
8
  async function apiCall(url, options, checkoutRequestId) {
7
9
  const headers = new Headers(options.headers);
8
10
  if (checkoutRequestId) headers.set("x-request-id", checkoutRequestId);
@@ -23,13 +25,12 @@ async function apiCall(url, options, checkoutRequestId) {
23
25
  }
24
26
  function validateOptions(options) {
25
27
  if (!options?.processorId) return { processor_id: "Processor ID is required" };
26
- if (!options?.customerInfo?.first_name || !options?.customerInfo?.last_name) return { customer_name: "Customer first and last name are required" };
27
28
  return null;
28
29
  }
29
30
  function getMockScenarioStr(mockScenario) {
30
31
  return mockScenario && mockScenario !== ApplePayMockScenario.None ? mockScenario : void 0;
31
32
  }
32
- async function callStartEndpoint(apiBaseUrl, secureToken, options, mockScenarioStr, checkoutRequestId) {
33
+ async function callStripeStartEndpoint(apiBaseUrl, secureToken, options, mockScenarioStr, checkoutRequestId) {
33
34
  return apiCall(`${apiBaseUrl}/api/checkout/${secureToken}/apple-pay/start`, {
34
35
  method: "POST",
35
36
  headers: { "Content-Type": "application/json" },
@@ -41,12 +42,12 @@ async function callStartEndpoint(apiBaseUrl, secureToken, options, mockScenarioS
41
42
  })
42
43
  }, checkoutRequestId);
43
44
  }
44
- function initializeAdapter(stripePk, mockScenario) {
45
+ function initializeStripeAdapter(stripePk, mockScenario) {
45
46
  const adapter = new StripeApplePayAdapter(mockScenario);
46
47
  if (!adapter.initialize(stripePk)) return { error: "Stripe.js not loaded. Add <script src=\"https://js.stripe.com/v3/\"><\/script> to your page." };
47
48
  return { adapter };
48
49
  }
49
- async function callConfirmEndpoint(apiBaseUrl, secureToken, paymentMethodId, mockScenarioStr, checkoutRequestId) {
50
+ async function callStripeConfirmEndpoint(apiBaseUrl, secureToken, paymentMethodId, mockScenarioStr, checkoutRequestId) {
50
51
  const result = await apiCall(`${apiBaseUrl}/api/checkout/${secureToken}/apple-pay/confirm`, {
51
52
  method: "POST",
52
53
  headers: { "Content-Type": "application/json" },
@@ -63,41 +64,49 @@ async function callConfirmEndpoint(apiBaseUrl, secureToken, paymentMethodId, moc
63
64
  checkoutSessionId: secureToken,
64
65
  state: "checkout_succeeded"
65
66
  } };
66
- return { errors: { apple_pay: confirmData.error_message || "Payment failed" } };
67
+ return { errors: { apple_pay: confirmData.error_message_for_customer || confirmData.error_message_for_debug || "Payment failed" } };
67
68
  }
68
69
  /**
69
70
  * Pre-fetch Apple Pay data and prepare the PaymentRequest.
70
71
  * Call this when the checkout page loads, NOT in the click handler.
71
- * This allows showPreparedPaymentSheet to be called synchronously on click.
72
72
  *
73
- * Flow:
74
- * 1. Call /start endpoint to get PaymentIntent details
75
- * 2. Initialize Stripe adapter
76
- * 3. Create PaymentRequest and call canMakePayment() (required by Stripe)
77
- * 4. Store everything for later use
73
+ * For Stripe: pre-fetches data and prepares PaymentRequest for immediate show.
74
+ * For Airwallex: returns success with processor="airwallex" so submit uses native ApplePaySession.
78
75
  */
79
76
  async function prepareApplePay(apiBaseUrl, secureToken, options, environment) {
80
77
  console.log("[ApplePay] prepareApplePay called");
81
- preparedState = null;
78
+ preparedStripeState = null;
82
79
  const mockScenarioStr = getMockScenarioStr(options.mockScenario);
83
- const checkoutRequestId = generateCheckoutRequestId(environment);
84
- console.log(`[ApplePay] Generated checkout_request_id: ${checkoutRequestId}`);
85
- const startResult = await callStartEndpoint(apiBaseUrl, secureToken, options, mockScenarioStr, checkoutRequestId);
80
+ const checkoutRequestId = getOrCreateCheckoutRequestId(environment);
81
+ console.log(`[ApplePay] Using checkout_request_id: ${checkoutRequestId}`);
82
+ if (options.processorType === "airwallex") {
83
+ console.log("[ApplePay] Airwallex processor - will use native ApplePaySession on submit");
84
+ return {
85
+ success: true,
86
+ applePay: true
87
+ };
88
+ }
89
+ const startResult = await callStripeStartEndpoint(apiBaseUrl, secureToken, options, mockScenarioStr, checkoutRequestId);
86
90
  if (startResult.error || !startResult.data) return {
87
91
  success: false,
88
92
  error: startResult.error || "Failed to start Apple Pay"
89
93
  };
90
- const { adapter, error: adapterError } = initializeAdapter(startResult.data.stripe_pk, options.mockScenario);
94
+ const startData = startResult.data;
95
+ if (!startData.stripe_pk) return {
96
+ success: false,
97
+ error: "Stripe publishable key not provided"
98
+ };
99
+ const { adapter, error: adapterError } = initializeStripeAdapter(startData.stripe_pk, options.mockScenario);
91
100
  if (!adapter) return {
92
101
  success: false,
93
102
  error: adapterError
94
103
  };
95
104
  const prepareResult = await adapter.preparePaymentRequest({
96
- country: startResult.data.country,
97
- currency: startResult.data.currency.toLowerCase(),
105
+ country: startData.country,
106
+ currency: startData.currency.toLowerCase(),
98
107
  total: {
99
108
  label: "Total",
100
- amount: startResult.data.amount
109
+ amount: startData.amount
101
110
  }
102
111
  });
103
112
  if (!prepareResult.success) return {
@@ -110,13 +119,14 @@ async function prepareApplePay(apiBaseUrl, secureToken, options, environment) {
110
119
  error: "Apple Pay is not available on this device or Stripe account",
111
120
  applePay: false
112
121
  };
113
- preparedState = {
122
+ preparedStripeState = {
123
+ processor: "stripe",
114
124
  adapter,
115
- startData: startResult.data,
125
+ startData,
116
126
  mockScenarioStr,
117
127
  checkoutRequestId
118
128
  };
119
- console.log("[ApplePay] prepareApplePay success, ready for click");
129
+ console.log("[ApplePay] prepareApplePay success (Stripe), ready for click");
120
130
  return {
121
131
  success: true,
122
132
  applePay: true
@@ -126,40 +136,196 @@ async function prepareApplePay(apiBaseUrl, secureToken, options, environment) {
126
136
  * Check if Apple Pay has been prepared and is ready.
127
137
  */
128
138
  function isApplePayPrepared() {
129
- return preparedState?.adapter.isPrepared();
139
+ return preparedStripeState?.adapter.isPrepared() ?? false;
130
140
  }
131
141
  /**
132
142
  * Clear prepared state (call on unmount or when checkout changes).
133
143
  */
134
144
  function clearPreparedApplePay() {
135
- if (preparedState) preparedState.adapter.clearPrepared();
136
- preparedState = null;
145
+ if (preparedStripeState) preparedStripeState.adapter.clearPrepared();
146
+ preparedStripeState = null;
147
+ }
148
+ async function callAirwallexStartEndpoint(apiBaseUrl, secureToken, options, validationUrl, initiativeContext, mockScenarioStr, checkoutRequestId) {
149
+ return apiCall(`${apiBaseUrl}/api/checkout/${secureToken}/airwallex/apple-pay/start`, {
150
+ method: "POST",
151
+ headers: { "Content-Type": "application/json" },
152
+ body: JSON.stringify({
153
+ processor_id: options.processorId,
154
+ customer_info: options.customerInfo,
155
+ fraud_metadata: collectFraudMetadata(),
156
+ validation_url: validationUrl,
157
+ initiative_context: initiativeContext,
158
+ mock_scenario: mockScenarioStr
159
+ })
160
+ }, checkoutRequestId);
161
+ }
162
+ async function callAirwallexConfirmEndpoint(apiBaseUrl, secureToken, applePayToken, mockScenarioStr, checkoutRequestId) {
163
+ const result = await apiCall(`${apiBaseUrl}/api/checkout/${secureToken}/airwallex/apple-pay/confirm`, {
164
+ method: "POST",
165
+ headers: { "Content-Type": "application/json" },
166
+ body: JSON.stringify({
167
+ apple_pay_token: applePayToken,
168
+ mock_scenario: mockScenarioStr
169
+ })
170
+ }, checkoutRequestId);
171
+ if (result.error || !result.data) return {
172
+ charge_status: "fail",
173
+ error_message_for_debug: result.error || "Failed to confirm payment",
174
+ checkout_attempt_id: ""
175
+ };
176
+ return result.data;
177
+ }
178
+ async function callAirwallexVerifyEndpoint(apiBaseUrl, secureToken, checkoutRequestId) {
179
+ const result = await apiCall(`${apiBaseUrl}/api/checkout/${secureToken}/airwallex/apple-pay/verify`, {
180
+ method: "POST",
181
+ headers: { "Content-Type": "application/json" }
182
+ }, checkoutRequestId);
183
+ if (result.error || !result.data) return {
184
+ charge_status: "fail",
185
+ error_message_for_debug: result.error || "Failed to verify payment",
186
+ checkout_attempt_id: ""
187
+ };
188
+ return result.data;
189
+ }
190
+ function toApplePayResult(response, secureToken) {
191
+ if (response.charge_status === "success") return { data: {
192
+ id: response.transaction_id,
193
+ checkoutAttemptId: response.checkout_attempt_id,
194
+ checkoutSessionId: secureToken,
195
+ state: "checkout_succeeded"
196
+ } };
197
+ return { errors: { apple_pay: response.error_message_for_customer || response.error_message_for_debug || "Payment failed" } };
198
+ }
199
+ const MAX_USER_ACTIONS = 5;
200
+ /**
201
+ * Run the Airwallex Apple Pay flow with 3DS loop support.
202
+ *
203
+ * Flow:
204
+ * 1. Show native ApplePaySession, call /start for merchant validation
205
+ * 2. On payment authorized, call /confirm with token
206
+ * 3. If 3DS required, handle it and call /verify
207
+ * 4. Loop if more 3DS needed
208
+ */
209
+ async function runAirwallexFlow(apiBaseUrl, secureToken, options, mockScenarioStr, checkoutRequestId) {
210
+ let airwallexMockScenario = AirwallexApplePayMockScenario.None;
211
+ if (options.mockScenario === ApplePayMockScenario.Success) airwallexMockScenario = AirwallexApplePayMockScenario.Success;
212
+ else if (options.mockScenario === ApplePayMockScenario.Cancelled) airwallexMockScenario = AirwallexApplePayMockScenario.Cancelled;
213
+ const adapter = new AirwallexApplePayAdapter(airwallexMockScenario);
214
+ const config = {
215
+ amount: options.amount || 0,
216
+ currency: (options.currency || "USD").toUpperCase(),
217
+ country: options.country.toUpperCase(),
218
+ merchantName: options.merchantName || "Total"
219
+ };
220
+ if (!adapter.initialize(config)) return { errors: { apple_pay: "Apple Pay not available on this device (requires Safari)" } };
221
+ if (!await adapter.canMakePayment()) return { errors: { apple_pay: "Apple Pay not available on this device" } };
222
+ const initiativeContext = typeof window !== "undefined" ? window.location.hostname : "";
223
+ if (airwallexMockScenario !== AirwallexApplePayMockScenario.None) {
224
+ const startResult = await callAirwallexStartEndpoint(apiBaseUrl, secureToken, options, "https://mock-apple-pay-gateway.example.com/paymentservices/startSession", initiativeContext, mockScenarioStr, checkoutRequestId);
225
+ if (startResult.error || !startResult.data) return { errors: { apple_pay: startResult.error || "Failed to start mock checkout" } };
226
+ }
227
+ const paymentResult = await adapter.showPaymentSheet(async (validationUrl) => {
228
+ const startResult = await callAirwallexStartEndpoint(apiBaseUrl, secureToken, options, validationUrl, initiativeContext, mockScenarioStr, checkoutRequestId);
229
+ if (startResult.error || !startResult.data) return { error: startResult.error || "Merchant validation failed" };
230
+ if (!startResult.data.merchant_session) return { error: "No merchant session returned from server" };
231
+ return { merchantSession: startResult.data.merchant_session };
232
+ });
233
+ if (!paymentResult.success) {
234
+ if ("cancelled" in paymentResult && paymentResult.cancelled) return { errors: { apple_pay: "Apple Pay cancelled by user" } };
235
+ return { errors: { apple_pay: paymentResult.error || "Apple Pay failed" } };
236
+ }
237
+ const { token, complete } = paymentResult;
238
+ let response = await callAirwallexConfirmEndpoint(apiBaseUrl, secureToken, token, mockScenarioStr, checkoutRequestId);
239
+ let userActionCount = 0;
240
+ while (response.charge_status === "pending" && response.next_action && userActionCount < MAX_USER_ACTIONS) {
241
+ userActionCount++;
242
+ const nextAction = response.next_action;
243
+ const actionResult = await handleNextAction({
244
+ type: nextAction.type,
245
+ url: nextAction.url
246
+ });
247
+ const verifyResponse = await callAirwallexVerifyEndpoint(apiBaseUrl, secureToken, checkoutRequestId);
248
+ if (verifyResponse.charge_status === "pending" && verifyResponse.next_action) {
249
+ if (!actionResult.success) console.log("[ApplePay:Airwallex] 3DS failed but retry available, continuing loop...");
250
+ response = verifyResponse;
251
+ continue;
252
+ }
253
+ if (!actionResult.success) {
254
+ complete("fail");
255
+ return { errors: { apple_pay: verifyResponse.error_message_for_customer || verifyResponse.error_message_for_debug || actionResult.error || "3DS authentication failed" } };
256
+ }
257
+ complete(verifyResponse.charge_status === "success" ? "success" : "fail");
258
+ return toApplePayResult(verifyResponse, secureToken);
259
+ }
260
+ if (userActionCount >= MAX_USER_ACTIONS) {
261
+ complete("fail");
262
+ return { errors: { apple_pay: "Too many authentication attempts. Please try again." } };
263
+ }
264
+ complete(response.charge_status === "success" ? "success" : "fail");
265
+ return toApplePayResult(response, secureToken);
137
266
  }
138
267
  const defSubmitPayment = (states) => {
139
268
  const submitPayment = async (_fields, options) => {
140
- const { apiBaseUrl, secureToken } = states;
269
+ const { apiBaseUrl, secureToken, environment } = states;
141
270
  const applePayOptions = options;
142
271
  const validationError = validateOptions(applePayOptions);
143
272
  if (validationError) return { errors: validationError };
144
273
  try {
145
274
  const mockScenarioStr = getMockScenarioStr(applePayOptions.mockScenario);
146
- if (!preparedState || !preparedState.adapter.isPrepared()) return { errors: { apple_pay: "Apple Pay not prepared. Please wait a moment and try again, or refresh the page." } };
147
- console.log("[ApplePay] Using prepared state for immediate sheet display");
148
- const paymentResult = await preparedState.adapter.showPreparedPaymentSheet();
275
+ const checkoutRequestId = getOrCreateCheckoutRequestId(environment);
276
+ console.log(`[ApplePay] Using checkout_request_id: ${checkoutRequestId}`);
277
+ if (preparedStripeState?.adapter.isPrepared()) {
278
+ console.log("[ApplePay] Using prepared Stripe state for immediate sheet display");
279
+ const paymentResult$1 = await preparedStripeState.adapter.showPreparedPaymentSheet();
280
+ if (!paymentResult$1.success) {
281
+ clearPreparedApplePay();
282
+ if ("cancelled" in paymentResult$1 && paymentResult$1.cancelled) return { errors: { apple_pay: "Apple Pay cancelled by user" } };
283
+ return { errors: { apple_pay: "error" in paymentResult$1 ? paymentResult$1.error : "Unknown error" } };
284
+ }
285
+ const { paymentMethodId: paymentMethodId$1, paymentMethodEvent: paymentMethodEvent$1 } = paymentResult$1;
286
+ const confirmResult$1 = await callStripeConfirmEndpoint(apiBaseUrl, secureToken, paymentMethodId$1, mockScenarioStr, preparedStripeState.checkoutRequestId);
287
+ if (confirmResult$1.data) {
288
+ paymentMethodEvent$1.complete("success");
289
+ clearPreparedApplePay();
290
+ return confirmResult$1;
291
+ } else {
292
+ paymentMethodEvent$1.complete("fail");
293
+ clearPreparedApplePay();
294
+ return confirmResult$1;
295
+ }
296
+ }
297
+ if (applePayOptions.processorType === "airwallex") {
298
+ console.log("[ApplePay] Running Airwallex flow (processorType=airwallex)");
299
+ return await runAirwallexFlow(apiBaseUrl, secureToken, applePayOptions, mockScenarioStr, checkoutRequestId);
300
+ }
301
+ const startResult = await callStripeStartEndpoint(apiBaseUrl, secureToken, applePayOptions, mockScenarioStr, checkoutRequestId);
302
+ if (startResult.error || !startResult.data) return { errors: { apple_pay: startResult.error || "Failed to start Apple Pay" } };
303
+ const startData = startResult.data;
304
+ console.warn("[ApplePay] Stripe flow without prepared state - may fail due to user gesture requirements");
305
+ if (!startData.stripe_pk) return { errors: { apple_pay: "Stripe publishable key not provided" } };
306
+ const { adapter, error: adapterError } = initializeStripeAdapter(startData.stripe_pk, applePayOptions.mockScenario);
307
+ if (!adapter) return { errors: { apple_pay: adapterError || "Failed to initialize Stripe adapter" } };
308
+ const prepareResult = await adapter.preparePaymentRequest({
309
+ country: startData.country,
310
+ currency: startData.currency.toLowerCase(),
311
+ total: {
312
+ label: "Total",
313
+ amount: startData.amount
314
+ }
315
+ });
316
+ if (!prepareResult.success || !prepareResult.applePay) return { errors: { apple_pay: prepareResult.error || "Apple Pay not available" } };
317
+ const paymentResult = await adapter.showPreparedPaymentSheet();
149
318
  if (!paymentResult.success) {
150
- clearPreparedApplePay();
151
319
  if ("cancelled" in paymentResult && paymentResult.cancelled) return { errors: { apple_pay: "Apple Pay cancelled by user" } };
152
320
  return { errors: { apple_pay: "error" in paymentResult ? paymentResult.error : "Unknown error" } };
153
321
  }
154
322
  const { paymentMethodId, paymentMethodEvent } = paymentResult;
155
- const confirmResult = await callConfirmEndpoint(apiBaseUrl, secureToken, paymentMethodId, mockScenarioStr, preparedState.checkoutRequestId);
323
+ const confirmResult = await callStripeConfirmEndpoint(apiBaseUrl, secureToken, paymentMethodId, mockScenarioStr, checkoutRequestId);
156
324
  if (confirmResult.data) {
157
325
  paymentMethodEvent.complete("success");
158
- clearPreparedApplePay();
159
326
  return confirmResult;
160
327
  } else {
161
328
  paymentMethodEvent.complete("fail");
162
- clearPreparedApplePay();
163
329
  return confirmResult;
164
330
  }
165
331
  } catch (error) {
@@ -172,7 +338,7 @@ const defSubmitPayment = (states) => {
172
338
  const ApplePayPaymentMethod = definePaymentMethod((paymentKitStates) => {
173
339
  return {
174
340
  name: "apple_pay",
175
- externalFuncs: {},
341
+ externalFuncs: { prepareApplePay: (options) => prepareApplePay(paymentKitStates.apiBaseUrl, paymentKitStates.secureToken, options, paymentKitStates.environment) },
176
342
  internalFuncs: {
177
343
  submitPayment: defSubmitPayment(paymentKitStates),
178
344
  cleanup: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"apple-pay.mjs","names":["preparedState: PreparedApplePayState | null","submitPayment: TInternalFuncs[\"submitPayment\"]"],"sources":["../../src/payment-methods/apple-pay.ts"],"sourcesContent":["import type { PaymentKitErrors, PaymentKitStates, TInternalFuncs } from \"../types\";\nimport { collectFraudMetadata, definePaymentMethod, generateCheckoutRequestId } from \"../utils\";\nimport { ApplePayMockScenario, StripeApplePayAdapter } from \"./stripe-apple-pay-adapter\";\n\n// Apple Pay-specific types\nexport type ApplePayCustomerInfo = {\n first_name: string;\n last_name: string;\n};\n\nexport type ApplePayStartRequest = {\n processor_id: string;\n customer_info: ApplePayCustomerInfo;\n fraud_metadata: {\n ipAddress?: string;\n browserInfo?: { [key: string]: unknown };\n processorFraudInfo?: { [key: string]: unknown };\n };\n mock_scenario?: string;\n};\n\nexport type ApplePayStartResponse = {\n client_secret: string;\n stripe_pk: string;\n checkout_attempt_id: string;\n amount: number;\n currency: string;\n country: string;\n};\n\nexport type ApplePayConfirmRequest = {\n // New: Send Stripe PaymentMethod ID instead of raw Apple Pay token\n payment_method_id: string;\n // Legacy: Keep for backward compatibility during transition\n apple_pay_token?: ApplePayJS.ApplePayPaymentToken | { [key: string]: unknown };\n mock_scenario?: string;\n};\n\nexport type ApplePayConfirmResponse = {\n charge_status: \"success\" | \"fail\" | \"pending\";\n transaction_id?: string;\n error_message?: string;\n checkout_attempt_id: string;\n};\n\nexport type ApplePaySubmitOptions = {\n processorId: string;\n customerInfo: ApplePayCustomerInfo;\n mockScenario?: ApplePayMockScenario;\n};\n\ntype ApplePayResult =\n | { data: { [key: string]: unknown }; errors?: undefined }\n | { data?: undefined; errors: PaymentKitErrors };\n\n// =============================================================================\n// Prepared Payment State (for pre-fetching before click)\n// =============================================================================\n\ntype PreparedApplePayState = {\n adapter: StripeApplePayAdapter;\n startData: ApplePayStartResponse;\n mockScenarioStr?: string;\n checkoutRequestId: string;\n};\n\n// Global state to store prepared Apple Pay data\nlet preparedState: PreparedApplePayState | null = null;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\nasync function apiCall<T>(\n url: string,\n options: RequestInit,\n checkoutRequestId?: string,\n): Promise<{ data?: T; error?: string }> {\n // Add x-request-id header if provided\n const headers = new Headers(options.headers);\n if (checkoutRequestId) {\n headers.set(\"x-request-id\", checkoutRequestId);\n }\n\n const response = await fetch(url, { ...options, headers });\n if (!response.ok) {\n let errorMessage = `Request failed (${response.status})`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.detail || errorMessage;\n } catch {\n errorMessage = response.statusText || errorMessage;\n }\n return { error: errorMessage };\n }\n return { data: await response.json() };\n}\n\nfunction validateOptions(options: ApplePaySubmitOptions): PaymentKitErrors | null {\n if (!options?.processorId) {\n return { processor_id: \"Processor ID is required\" };\n }\n if (!options?.customerInfo?.first_name || !options?.customerInfo?.last_name) {\n return { customer_name: \"Customer first and last name are required\" };\n }\n return null;\n}\n\nfunction getMockScenarioStr(mockScenario?: ApplePayMockScenario): string | undefined {\n return mockScenario && mockScenario !== ApplePayMockScenario.None ? mockScenario : undefined;\n}\n\nasync function callStartEndpoint(\n apiBaseUrl: string,\n secureToken: string,\n options: ApplePaySubmitOptions,\n mockScenarioStr?: string,\n checkoutRequestId?: string,\n): Promise<{ data?: ApplePayStartResponse; error?: string }> {\n return apiCall<ApplePayStartResponse>(\n `${apiBaseUrl}/api/checkout/${secureToken}/apple-pay/start`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n processor_id: options.processorId,\n customer_info: options.customerInfo,\n fraud_metadata: collectFraudMetadata(),\n mock_scenario: mockScenarioStr,\n } as ApplePayStartRequest),\n },\n checkoutRequestId,\n );\n}\n\nfunction initializeAdapter(\n stripePk: string,\n mockScenario?: ApplePayMockScenario,\n): { adapter?: StripeApplePayAdapter; error?: string } {\n const adapter = new StripeApplePayAdapter(mockScenario);\n\n if (!adapter.initialize(stripePk)) {\n return { error: 'Stripe.js not loaded. Add <script src=\"https://js.stripe.com/v3/\"></script> to your page.' };\n }\n\n return { adapter };\n}\n\nasync function callConfirmEndpoint(\n apiBaseUrl: string,\n secureToken: string,\n paymentMethodId: string,\n mockScenarioStr?: string,\n checkoutRequestId?: string,\n): Promise<ApplePayResult> {\n const result = await apiCall<ApplePayConfirmResponse>(\n `${apiBaseUrl}/api/checkout/${secureToken}/apple-pay/confirm`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n payment_method_id: paymentMethodId,\n mock_scenario: mockScenarioStr,\n } as ApplePayConfirmRequest),\n },\n checkoutRequestId,\n );\n\n if (result.error || !result.data) {\n return { errors: { apple_pay: result.error || \"Failed to confirm payment\" } };\n }\n\n const confirmData = result.data;\n\n if (confirmData.charge_status === \"success\") {\n return {\n data: {\n id: confirmData.transaction_id,\n checkoutAttemptId: confirmData.checkout_attempt_id,\n checkoutSessionId: secureToken,\n state: \"checkout_succeeded\",\n },\n };\n }\n\n return { errors: { apple_pay: confirmData.error_message || \"Payment failed\" } };\n}\n\n// =============================================================================\n// Prepare Function (call BEFORE the click handler)\n// =============================================================================\n\n/**\n * Pre-fetch Apple Pay data and prepare the PaymentRequest.\n * Call this when the checkout page loads, NOT in the click handler.\n * This allows showPreparedPaymentSheet to be called synchronously on click.\n *\n * Flow:\n * 1. Call /start endpoint to get PaymentIntent details\n * 2. Initialize Stripe adapter\n * 3. Create PaymentRequest and call canMakePayment() (required by Stripe)\n * 4. Store everything for later use\n */\nexport async function prepareApplePay(\n apiBaseUrl: string,\n secureToken: string,\n options: ApplePaySubmitOptions,\n environment: string,\n): Promise<{ success: boolean; error?: string; applePay?: boolean }> {\n console.log(\"[ApplePay] prepareApplePay called\");\n\n // Clear any previous state\n preparedState = null;\n\n const mockScenarioStr = getMockScenarioStr(options.mockScenario);\n\n // Generate checkout request ID for correlating all API calls in this Apple Pay session\n const checkoutRequestId = generateCheckoutRequestId(environment);\n console.log(`[ApplePay] Generated checkout_request_id: ${checkoutRequestId}`);\n\n // Step 1: Call start endpoint to get PaymentIntent details\n const startResult = await callStartEndpoint(apiBaseUrl, secureToken, options, mockScenarioStr, checkoutRequestId);\n if (startResult.error || !startResult.data) {\n return { success: false, error: startResult.error || \"Failed to start Apple Pay\" };\n }\n\n // Step 2: Initialize Stripe adapter\n const { adapter, error: adapterError } = initializeAdapter(startResult.data.stripe_pk, options.mockScenario);\n if (!adapter) {\n return { success: false, error: adapterError };\n }\n\n // Step 3: Create PaymentRequest and call canMakePayment()\n // This is REQUIRED before calling show()\n const prepareResult = await adapter.preparePaymentRequest({\n country: startResult.data.country,\n currency: startResult.data.currency.toLowerCase(),\n total: {\n label: \"Total\",\n amount: startResult.data.amount,\n },\n });\n\n if (!prepareResult.success) {\n return {\n success: false,\n error: prepareResult.error || \"Failed to prepare payment request\",\n applePay: prepareResult.applePay,\n };\n }\n\n if (!prepareResult.applePay) {\n return {\n success: false,\n error: \"Apple Pay is not available on this device or Stripe account\",\n applePay: false,\n };\n }\n\n // Store the prepared state\n preparedState = {\n adapter,\n startData: startResult.data,\n mockScenarioStr,\n checkoutRequestId,\n };\n\n console.log(\"[ApplePay] prepareApplePay success, ready for click\");\n return { success: true, applePay: true };\n}\n\n/**\n * Check if Apple Pay has been prepared and is ready.\n */\nexport function isApplePayPrepared(): boolean {\n return preparedState?.adapter.isPrepared();\n}\n\n/**\n * Clear prepared state (call on unmount or when checkout changes).\n */\nexport function clearPreparedApplePay(): void {\n if (preparedState) {\n preparedState.adapter.clearPrepared();\n }\n preparedState = null;\n}\n\n// =============================================================================\n// Main Submit Function\n// =============================================================================\n\nconst defSubmitPayment = (states: PaymentKitStates) => {\n const submitPayment: TInternalFuncs[\"submitPayment\"] = async (_fields, options) => {\n const { apiBaseUrl, secureToken } = states;\n const applePayOptions = options as ApplePaySubmitOptions;\n\n // Validate options\n const validationError = validateOptions(applePayOptions);\n if (validationError) {\n return { errors: validationError };\n }\n\n try {\n const mockScenarioStr = getMockScenarioStr(applePayOptions.mockScenario);\n\n // Check if we have prepared state (required for proper user gesture handling)\n if (!preparedState || !preparedState.adapter.isPrepared()) {\n return {\n errors: {\n apple_pay: \"Apple Pay not prepared. Please wait a moment and try again, or refresh the page.\",\n },\n };\n }\n\n console.log(\"[ApplePay] Using prepared state for immediate sheet display\");\n\n // Show Apple Pay sheet IMMEDIATELY using the prepared PaymentRequest\n // This is called synchronously from the click handler - no async before show()!\n const paymentResultPromise = preparedState.adapter.showPreparedPaymentSheet();\n\n // Now we can await - the sheet is already showing\n const paymentResult = await paymentResultPromise;\n\n if (!paymentResult.success) {\n // Clear prepared state on failure\n clearPreparedApplePay();\n\n if (\"cancelled\" in paymentResult && paymentResult.cancelled) {\n return { errors: { apple_pay: \"Apple Pay cancelled by user\" } };\n }\n const errorMessage = \"error\" in paymentResult ? paymentResult.error : \"Unknown error\";\n return { errors: { apple_pay: errorMessage } };\n }\n\n const { paymentMethodId, paymentMethodEvent } = paymentResult;\n\n // Confirm with backend using the PaymentMethod ID\n const confirmResult = await callConfirmEndpoint(\n apiBaseUrl,\n secureToken,\n paymentMethodId,\n mockScenarioStr,\n preparedState.checkoutRequestId,\n );\n\n // Complete Apple Pay UI based on result\n if (confirmResult.data) {\n paymentMethodEvent.complete(\"success\");\n clearPreparedApplePay();\n return confirmResult;\n } else {\n paymentMethodEvent.complete(\"fail\");\n clearPreparedApplePay();\n return confirmResult;\n }\n } catch (error) {\n clearPreparedApplePay();\n return { errors: { apple_pay: `Apple Pay error: ${error}` } };\n }\n };\n\n return submitPayment;\n};\n\n// =============================================================================\n// Payment Method Definition\n// =============================================================================\n\nconst ApplePayPaymentMethod = definePaymentMethod((paymentKitStates) => {\n return {\n name: \"apple_pay\",\n externalFuncs: {},\n internalFuncs: {\n submitPayment: defSubmitPayment(paymentKitStates),\n cleanup: () => {\n clearPreparedApplePay();\n },\n },\n };\n});\n\nexport { ApplePayMockScenario };\n\nexport default ApplePayPaymentMethod;\n"],"mappings":"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"}
1
+ {"version":3,"file":"apple-pay.mjs","names":["preparedStripeState: PreparedStripeApplePayState | null","airwallexMockScenario: AirwallexApplePayMockScenario","config: AirwallexApplePayConfig","submitPayment: TInternalFuncs[\"submitPayment\"]","paymentResult","confirmResult","paymentMethodId"],"sources":["../../src/payment-methods/apple-pay.ts"],"sourcesContent":["import type { PaymentKitErrors, PaymentKitStates, TInternalFuncs } from \"../types\";\nimport { collectFraudMetadata, definePaymentMethod, getOrCreateCheckoutRequestId } from \"../utils\";\nimport {\n AirwallexApplePayAdapter,\n type AirwallexApplePayConfig,\n AirwallexApplePayMockScenario,\n type ApplePayEncryptedToken,\n} from \"./airwallex-apple-pay-adapter\";\nimport { handleNextAction } from \"./next-action-handlers\";\nimport { ApplePayMockScenario, StripeApplePayAdapter } from \"./stripe-apple-pay-adapter\";\n\n// Apple Pay-specific types\nexport type ApplePayCustomerInfo = {\n first_name: string;\n last_name: string;\n};\n\nexport type ApplePayStartRequest = {\n processor_id: string;\n customer_info: ApplePayCustomerInfo;\n fraud_metadata: {\n ipAddress?: string;\n browserInfo?: { [key: string]: unknown };\n processorFraudInfo?: { [key: string]: unknown };\n };\n mock_scenario?: string;\n // Airwallex-specific fields (sent on /start for merchant validation)\n validation_url?: string;\n initiative_context?: string;\n};\n\nexport type ApplePayStartResponse = {\n checkout_attempt_id: string;\n amount: number;\n currency: string;\n country: string;\n\n // Processor discriminator\n processor: \"stripe\" | \"airwallex\";\n\n // Stripe-specific fields (when processor=\"stripe\")\n client_secret?: string;\n stripe_pk?: string;\n\n // Airwallex-specific fields (when processor=\"airwallex\")\n merchant_session?: { [key: string]: unknown }; // Apple merchant session for completeMerchantValidation()\n};\n\n// Airwallex 3DS next action type (matches backend snake_case response)\nexport type Airwallex3dsNextAction = {\n type: \"airwallex_3ds\";\n url: string;\n};\n\nexport type ApplePayConfirmRequest = {\n // Stripe: Send PaymentMethod ID\n payment_method_id?: string;\n // Airwallex: Send encrypted Apple Pay token\n apple_pay_token?: ApplePayEncryptedToken | { [key: string]: unknown };\n mock_scenario?: string;\n};\n\nexport type ApplePayConfirmResponse = {\n charge_status: \"success\" | \"fail\" | \"pending\";\n transaction_id?: string;\n error_message_for_customer?: string;\n error_message_for_debug?: string;\n checkout_attempt_id: string;\n next_action?: Airwallex3dsNextAction; // Present when charge_status=\"pending\" for 3DS\n};\n\nexport type ApplePaySubmitOptions = {\n processorId: string;\n processorType?: \"stripe\" | \"airwallex\";\n customerInfo: ApplePayCustomerInfo;\n mockScenario?: ApplePayMockScenario;\n amount?: number; // Amount in atomic units (cents) for Apple Pay sheet display\n currency?: string; // Currency code (e.g., \"usd\")\n country: string; // Country code (e.g., \"US\") for Apple Pay sheet — required\n merchantName?: string; // Merchant display name on Apple Pay sheet\n};\n\ntype ApplePayResult =\n | { data: { [key: string]: unknown }; errors?: undefined }\n | { data?: undefined; errors: PaymentKitErrors };\n\n// =============================================================================\n// Prepared Payment State (for Stripe pre-fetching before click)\n// =============================================================================\n\ntype PreparedStripeApplePayState = {\n processor: \"stripe\";\n adapter: StripeApplePayAdapter;\n startData: ApplePayStartResponse;\n mockScenarioStr?: string;\n checkoutRequestId: string;\n};\n\n// Global state to store prepared Apple Pay data (Stripe only - Airwallex uses native session)\nlet preparedStripeState: PreparedStripeApplePayState | null = null;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\nasync function apiCall<T>(\n url: string,\n options: RequestInit,\n checkoutRequestId?: string,\n): Promise<{ data?: T; error?: string }> {\n const headers = new Headers(options.headers);\n if (checkoutRequestId) {\n headers.set(\"x-request-id\", checkoutRequestId);\n }\n\n const response = await fetch(url, { ...options, headers });\n if (!response.ok) {\n let errorMessage = `Request failed (${response.status})`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.detail || errorMessage;\n } catch {\n errorMessage = response.statusText || errorMessage;\n }\n return { error: errorMessage };\n }\n return { data: await response.json() };\n}\n\nfunction validateOptions(options: ApplePaySubmitOptions): PaymentKitErrors | null {\n if (!options?.processorId) {\n return { processor_id: \"Processor ID is required\" };\n }\n return null;\n}\n\nfunction getMockScenarioStr(mockScenario?: ApplePayMockScenario): string | undefined {\n return mockScenario && mockScenario !== ApplePayMockScenario.None ? mockScenario : undefined;\n}\n\n// =============================================================================\n// Stripe Apple Pay Flow\n// =============================================================================\n\nasync function callStripeStartEndpoint(\n apiBaseUrl: string,\n secureToken: string,\n options: ApplePaySubmitOptions,\n mockScenarioStr?: string,\n checkoutRequestId?: string,\n): Promise<{ data?: ApplePayStartResponse; error?: string }> {\n return apiCall<ApplePayStartResponse>(\n `${apiBaseUrl}/api/checkout/${secureToken}/apple-pay/start`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n processor_id: options.processorId,\n customer_info: options.customerInfo,\n fraud_metadata: collectFraudMetadata(),\n mock_scenario: mockScenarioStr,\n } as ApplePayStartRequest),\n },\n checkoutRequestId,\n );\n}\n\nfunction initializeStripeAdapter(\n stripePk: string,\n mockScenario?: ApplePayMockScenario,\n): { adapter?: StripeApplePayAdapter; error?: string } {\n const adapter = new StripeApplePayAdapter(mockScenario);\n\n if (!adapter.initialize(stripePk)) {\n return { error: 'Stripe.js not loaded. Add <script src=\"https://js.stripe.com/v3/\"></script> to your page.' };\n }\n\n return { adapter };\n}\n\nasync function callStripeConfirmEndpoint(\n apiBaseUrl: string,\n secureToken: string,\n paymentMethodId: string,\n mockScenarioStr?: string,\n checkoutRequestId?: string,\n): Promise<ApplePayResult> {\n const result = await apiCall<ApplePayConfirmResponse>(\n `${apiBaseUrl}/api/checkout/${secureToken}/apple-pay/confirm`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n payment_method_id: paymentMethodId,\n mock_scenario: mockScenarioStr,\n } as ApplePayConfirmRequest),\n },\n checkoutRequestId,\n );\n\n if (result.error || !result.data) {\n return { errors: { apple_pay: result.error || \"Failed to confirm payment\" } };\n }\n\n const confirmData = result.data;\n\n if (confirmData.charge_status === \"success\") {\n return {\n data: {\n id: confirmData.transaction_id,\n checkoutAttemptId: confirmData.checkout_attempt_id,\n checkoutSessionId: secureToken,\n state: \"checkout_succeeded\",\n },\n };\n }\n\n return {\n errors: {\n apple_pay: confirmData.error_message_for_customer || confirmData.error_message_for_debug || \"Payment failed\",\n },\n };\n}\n\n// =============================================================================\n// Prepare Function (call BEFORE the click handler)\n// =============================================================================\n\n/**\n * Pre-fetch Apple Pay data and prepare the PaymentRequest.\n * Call this when the checkout page loads, NOT in the click handler.\n *\n * For Stripe: pre-fetches data and prepares PaymentRequest for immediate show.\n * For Airwallex: returns success with processor=\"airwallex\" so submit uses native ApplePaySession.\n */\nexport async function prepareApplePay(\n apiBaseUrl: string,\n secureToken: string,\n options: ApplePaySubmitOptions,\n environment: string,\n): Promise<{ success: boolean; error?: string; applePay?: boolean }> {\n console.log(\"[ApplePay] prepareApplePay called\");\n\n // Clear any previous state\n preparedStripeState = null;\n\n const mockScenarioStr = getMockScenarioStr(options.mockScenario);\n const checkoutRequestId = getOrCreateCheckoutRequestId(environment);\n console.log(`[ApplePay] Using checkout_request_id: ${checkoutRequestId}`);\n\n // Airwallex doesn't use the prepare pattern - it uses native ApplePaySession\n // Skip the Stripe /start call entirely for Airwallex processors\n if (options.processorType === \"airwallex\") {\n console.log(\"[ApplePay] Airwallex processor - will use native ApplePaySession on submit\");\n return { success: true, applePay: true };\n }\n\n // Call Stripe start endpoint to get PaymentIntent details\n const startResult = await callStripeStartEndpoint(\n apiBaseUrl,\n secureToken,\n options,\n mockScenarioStr,\n checkoutRequestId,\n );\n if (startResult.error || !startResult.data) {\n return { success: false, error: startResult.error || \"Failed to start Apple Pay\" };\n }\n\n const startData = startResult.data;\n\n // Initialize Stripe adapter\n if (!startData.stripe_pk) {\n return { success: false, error: \"Stripe publishable key not provided\" };\n }\n\n const { adapter, error: adapterError } = initializeStripeAdapter(startData.stripe_pk, options.mockScenario);\n if (!adapter) {\n return { success: false, error: adapterError };\n }\n\n // Create PaymentRequest and call canMakePayment() (required before show())\n const prepareResult = await adapter.preparePaymentRequest({\n country: startData.country,\n currency: startData.currency.toLowerCase(),\n total: {\n label: \"Total\",\n amount: startData.amount,\n },\n });\n\n if (!prepareResult.success) {\n return {\n success: false,\n error: prepareResult.error || \"Failed to prepare payment request\",\n applePay: prepareResult.applePay,\n };\n }\n\n if (!prepareResult.applePay) {\n return {\n success: false,\n error: \"Apple Pay is not available on this device or Stripe account\",\n applePay: false,\n };\n }\n\n // Store the prepared state\n preparedStripeState = {\n processor: \"stripe\",\n adapter,\n startData,\n mockScenarioStr,\n checkoutRequestId,\n };\n\n console.log(\"[ApplePay] prepareApplePay success (Stripe), ready for click\");\n return { success: true, applePay: true };\n}\n\n/**\n * Check if Apple Pay has been prepared and is ready.\n */\nexport function isApplePayPrepared(): boolean {\n return preparedStripeState?.adapter.isPrepared() ?? false;\n}\n\n/**\n * Clear prepared state (call on unmount or when checkout changes).\n */\nexport function clearPreparedApplePay(): void {\n if (preparedStripeState) {\n preparedStripeState.adapter.clearPrepared();\n }\n preparedStripeState = null;\n}\n\n// =============================================================================\n// Airwallex Apple Pay Flow\n// =============================================================================\n\nasync function callAirwallexStartEndpoint(\n apiBaseUrl: string,\n secureToken: string,\n options: ApplePaySubmitOptions,\n validationUrl: string,\n initiativeContext: string,\n mockScenarioStr?: string,\n checkoutRequestId?: string,\n): Promise<{ data?: ApplePayStartResponse; error?: string }> {\n return apiCall<ApplePayStartResponse>(\n `${apiBaseUrl}/api/checkout/${secureToken}/airwallex/apple-pay/start`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n processor_id: options.processorId,\n customer_info: options.customerInfo,\n fraud_metadata: collectFraudMetadata(),\n validation_url: validationUrl,\n initiative_context: initiativeContext,\n mock_scenario: mockScenarioStr,\n } as ApplePayStartRequest),\n },\n checkoutRequestId,\n );\n}\n\nasync function callAirwallexConfirmEndpoint(\n apiBaseUrl: string,\n secureToken: string,\n applePayToken: ApplePayEncryptedToken,\n mockScenarioStr?: string,\n checkoutRequestId?: string,\n): Promise<ApplePayConfirmResponse> {\n const result = await apiCall<ApplePayConfirmResponse>(\n `${apiBaseUrl}/api/checkout/${secureToken}/airwallex/apple-pay/confirm`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n apple_pay_token: applePayToken,\n mock_scenario: mockScenarioStr,\n } as ApplePayConfirmRequest),\n },\n checkoutRequestId,\n );\n\n if (result.error || !result.data) {\n return {\n charge_status: \"fail\",\n error_message_for_debug: result.error || \"Failed to confirm payment\",\n checkout_attempt_id: \"\",\n };\n }\n\n return result.data;\n}\n\nasync function callAirwallexVerifyEndpoint(\n apiBaseUrl: string,\n secureToken: string,\n checkoutRequestId?: string,\n): Promise<ApplePayConfirmResponse> {\n const result = await apiCall<ApplePayConfirmResponse>(\n `${apiBaseUrl}/api/checkout/${secureToken}/airwallex/apple-pay/verify`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n },\n checkoutRequestId,\n );\n\n if (result.error || !result.data) {\n return {\n charge_status: \"fail\",\n error_message_for_debug: result.error || \"Failed to verify payment\",\n checkout_attempt_id: \"\",\n };\n }\n\n return result.data;\n}\n\nfunction toApplePayResult(response: ApplePayConfirmResponse, secureToken: string): ApplePayResult {\n if (response.charge_status === \"success\") {\n return {\n data: {\n id: response.transaction_id,\n checkoutAttemptId: response.checkout_attempt_id,\n checkoutSessionId: secureToken,\n state: \"checkout_succeeded\",\n },\n };\n }\n return {\n errors: {\n apple_pay: response.error_message_for_customer || response.error_message_for_debug || \"Payment failed\",\n },\n };\n}\n\nconst MAX_USER_ACTIONS = 5;\n\n/**\n * Run the Airwallex Apple Pay flow with 3DS loop support.\n *\n * Flow:\n * 1. Show native ApplePaySession, call /start for merchant validation\n * 2. On payment authorized, call /confirm with token\n * 3. If 3DS required, handle it and call /verify\n * 4. Loop if more 3DS needed\n */\nasync function runAirwallexFlow(\n apiBaseUrl: string,\n secureToken: string,\n options: ApplePaySubmitOptions,\n mockScenarioStr?: string,\n checkoutRequestId?: string,\n): Promise<ApplePayResult> {\n // Convert mock scenario\n let airwallexMockScenario: AirwallexApplePayMockScenario = AirwallexApplePayMockScenario.None;\n if (options.mockScenario === ApplePayMockScenario.Success) {\n airwallexMockScenario = AirwallexApplePayMockScenario.Success;\n } else if (options.mockScenario === ApplePayMockScenario.Cancelled) {\n airwallexMockScenario = AirwallexApplePayMockScenario.Cancelled;\n }\n\n // Initialize adapter\n const adapter = new AirwallexApplePayAdapter(airwallexMockScenario);\n\n const config: AirwallexApplePayConfig = {\n amount: options.amount || 0,\n currency: (options.currency || \"USD\").toUpperCase(),\n country: options.country.toUpperCase(),\n merchantName: options.merchantName || \"Total\",\n };\n\n if (!adapter.initialize(config)) {\n return { errors: { apple_pay: \"Apple Pay not available on this device (requires Safari)\" } };\n }\n\n const canPay = await adapter.canMakePayment();\n if (!canPay) {\n return { errors: { apple_pay: \"Apple Pay not available on this device\" } };\n }\n\n // Get current domain for initiative_context\n const initiativeContext = typeof window !== \"undefined\" ? window.location.hostname : \"\";\n\n // In mock mode, call /start first to create checkout attempt (mock adapter skips merchant validation)\n if (airwallexMockScenario !== AirwallexApplePayMockScenario.None) {\n const startResult = await callAirwallexStartEndpoint(\n apiBaseUrl,\n secureToken,\n options,\n \"https://mock-apple-pay-gateway.example.com/paymentservices/startSession\",\n initiativeContext,\n mockScenarioStr,\n checkoutRequestId,\n );\n if (startResult.error || !startResult.data) {\n return { errors: { apple_pay: startResult.error || \"Failed to start mock checkout\" } };\n }\n }\n\n // Show Apple Pay sheet with merchant validation callback\n const paymentResult = await adapter.showPaymentSheet(async (validationUrl: string) => {\n // Call /start endpoint for merchant validation\n const startResult = await callAirwallexStartEndpoint(\n apiBaseUrl,\n secureToken,\n options,\n validationUrl,\n initiativeContext,\n mockScenarioStr,\n checkoutRequestId,\n );\n\n if (startResult.error || !startResult.data) {\n return { error: startResult.error || \"Merchant validation failed\" };\n }\n\n if (!startResult.data.merchant_session) {\n return { error: \"No merchant session returned from server\" };\n }\n\n return { merchantSession: startResult.data.merchant_session };\n });\n\n if (!paymentResult.success) {\n if (\"cancelled\" in paymentResult && paymentResult.cancelled) {\n return { errors: { apple_pay: \"Apple Pay cancelled by user\" } };\n }\n return { errors: { apple_pay: paymentResult.error || \"Apple Pay failed\" } };\n }\n\n const { token, complete } = paymentResult;\n\n // Call /confirm with the token\n let response = await callAirwallexConfirmEndpoint(apiBaseUrl, secureToken, token, mockScenarioStr, checkoutRequestId);\n\n // Handle 3DS loop\n let userActionCount = 0;\n while (response.charge_status === \"pending\" && response.next_action && userActionCount < MAX_USER_ACTIONS) {\n userActionCount++;\n\n // Handle 3DS challenge — Airwallex3dsNextAction is structurally identical to SDK's Airwallex3dsAction\n const nextAction = response.next_action as Airwallex3dsNextAction;\n const actionResult = await handleNextAction({ type: nextAction.type, url: nextAction.url });\n\n // Call verify endpoint\n const verifyResponse = await callAirwallexVerifyEndpoint(apiBaseUrl, secureToken, checkoutRequestId);\n\n // Check if another 3DS action is required\n if (verifyResponse.charge_status === \"pending\" && verifyResponse.next_action) {\n if (!actionResult.success) {\n console.log(\"[ApplePay:Airwallex] 3DS failed but retry available, continuing loop...\");\n }\n response = verifyResponse;\n continue;\n }\n\n // No more actions - check final result\n if (!actionResult.success) {\n complete(\"fail\");\n return {\n errors: {\n apple_pay:\n verifyResponse.error_message_for_customer ||\n verifyResponse.error_message_for_debug ||\n actionResult.error ||\n \"3DS authentication failed\",\n },\n };\n }\n\n // 3DS succeeded\n complete(verifyResponse.charge_status === \"success\" ? \"success\" : \"fail\");\n return toApplePayResult(verifyResponse, secureToken);\n }\n\n // Check for max attempts exceeded\n if (userActionCount >= MAX_USER_ACTIONS) {\n complete(\"fail\");\n return { errors: { apple_pay: \"Too many authentication attempts. Please try again.\" } };\n }\n\n // No 3DS required - complete with result\n complete(response.charge_status === \"success\" ? \"success\" : \"fail\");\n return toApplePayResult(response, secureToken);\n}\n\n// =============================================================================\n// Main Submit Function\n// =============================================================================\n\nconst defSubmitPayment = (states: PaymentKitStates) => {\n const submitPayment: TInternalFuncs[\"submitPayment\"] = async (_fields, options) => {\n const { apiBaseUrl, secureToken, environment } = states;\n const applePayOptions = options as ApplePaySubmitOptions;\n\n // Validate options\n const validationError = validateOptions(applePayOptions);\n if (validationError) {\n return { errors: validationError };\n }\n\n try {\n const mockScenarioStr = getMockScenarioStr(applePayOptions.mockScenario);\n const checkoutRequestId = getOrCreateCheckoutRequestId(environment);\n console.log(`[ApplePay] Using checkout_request_id: ${checkoutRequestId}`);\n\n // Check if we have prepared Stripe state\n if (preparedStripeState?.adapter.isPrepared()) {\n console.log(\"[ApplePay] Using prepared Stripe state for immediate sheet display\");\n\n // Show Apple Pay sheet IMMEDIATELY using the prepared PaymentRequest\n const paymentResultPromise = preparedStripeState.adapter.showPreparedPaymentSheet();\n const paymentResult = await paymentResultPromise;\n\n if (!paymentResult.success) {\n clearPreparedApplePay();\n\n if (\"cancelled\" in paymentResult && paymentResult.cancelled) {\n return { errors: { apple_pay: \"Apple Pay cancelled by user\" } };\n }\n const errorMessage = \"error\" in paymentResult ? paymentResult.error : \"Unknown error\";\n return { errors: { apple_pay: errorMessage } };\n }\n\n const { paymentMethodId, paymentMethodEvent } = paymentResult;\n\n // Confirm with backend using the PaymentMethod ID\n const confirmResult = await callStripeConfirmEndpoint(\n apiBaseUrl,\n secureToken,\n paymentMethodId,\n mockScenarioStr,\n preparedStripeState.checkoutRequestId,\n );\n\n // Complete Apple Pay UI based on result\n if (confirmResult.data) {\n paymentMethodEvent.complete(\"success\");\n clearPreparedApplePay();\n return confirmResult;\n } else {\n paymentMethodEvent.complete(\"fail\");\n clearPreparedApplePay();\n return confirmResult;\n }\n }\n\n // Check if this is an Airwallex processor - route directly to Airwallex flow\n if (applePayOptions.processorType === \"airwallex\") {\n console.log(\"[ApplePay] Running Airwallex flow (processorType=airwallex)\");\n return await runAirwallexFlow(apiBaseUrl, secureToken, applePayOptions, mockScenarioStr, checkoutRequestId);\n }\n\n // No prepared state for Stripe - call start endpoint\n const startResult = await callStripeStartEndpoint(\n apiBaseUrl,\n secureToken,\n applePayOptions,\n mockScenarioStr,\n checkoutRequestId,\n );\n\n if (startResult.error || !startResult.data) {\n return { errors: { apple_pay: startResult.error || \"Failed to start Apple Pay\" } };\n }\n\n const startData = startResult.data;\n\n // Stripe flow without prepared state - this may fail due to user gesture requirements\n console.warn(\"[ApplePay] Stripe flow without prepared state - may fail due to user gesture requirements\");\n\n if (!startData.stripe_pk) {\n return { errors: { apple_pay: \"Stripe publishable key not provided\" } };\n }\n\n const { adapter, error: adapterError } = initializeStripeAdapter(\n startData.stripe_pk,\n applePayOptions.mockScenario,\n );\n if (!adapter) {\n return { errors: { apple_pay: adapterError || \"Failed to initialize Stripe adapter\" } };\n }\n\n // This will likely fail due to user gesture requirements\n const prepareResult = await adapter.preparePaymentRequest({\n country: startData.country,\n currency: startData.currency.toLowerCase(),\n total: { label: \"Total\", amount: startData.amount },\n });\n\n if (!prepareResult.success || !prepareResult.applePay) {\n return { errors: { apple_pay: prepareResult.error || \"Apple Pay not available\" } };\n }\n\n const paymentResult = await adapter.showPreparedPaymentSheet();\n\n if (!paymentResult.success) {\n if (\"cancelled\" in paymentResult && paymentResult.cancelled) {\n return { errors: { apple_pay: \"Apple Pay cancelled by user\" } };\n }\n const errorMessage = \"error\" in paymentResult ? paymentResult.error : \"Unknown error\";\n return { errors: { apple_pay: errorMessage } };\n }\n\n const { paymentMethodId, paymentMethodEvent } = paymentResult;\n\n const confirmResult = await callStripeConfirmEndpoint(\n apiBaseUrl,\n secureToken,\n paymentMethodId,\n mockScenarioStr,\n checkoutRequestId,\n );\n\n if (confirmResult.data) {\n paymentMethodEvent.complete(\"success\");\n return confirmResult;\n } else {\n paymentMethodEvent.complete(\"fail\");\n return confirmResult;\n }\n } catch (error) {\n clearPreparedApplePay();\n return { errors: { apple_pay: `Apple Pay error: ${error}` } };\n }\n };\n\n return submitPayment;\n};\n\n// =============================================================================\n// Payment Method Definition\n// =============================================================================\n\nconst ApplePayPaymentMethod = definePaymentMethod((paymentKitStates) => {\n return {\n name: \"apple_pay\",\n externalFuncs: {\n prepareApplePay: (options: ApplePaySubmitOptions) =>\n prepareApplePay(\n paymentKitStates.apiBaseUrl,\n paymentKitStates.secureToken,\n options,\n paymentKitStates.environment,\n ),\n },\n internalFuncs: {\n submitPayment: defSubmitPayment(paymentKitStates),\n cleanup: () => {\n clearPreparedApplePay();\n },\n },\n };\n});\n\nexport { ApplePayMockScenario };\n\nexport default ApplePayPaymentMethod;\n"],"mappings":";;;;;;AAmGA,IAAIA,sBAA0D;AAM9D,eAAe,QACb,KACA,SACA,mBACuC;CACvC,MAAM,UAAU,IAAI,QAAQ,QAAQ,QAAQ;AAC5C,KAAI,kBACF,SAAQ,IAAI,gBAAgB,kBAAkB;CAGhD,MAAM,WAAW,MAAM,MAAM,KAAK;EAAE,GAAG;EAAS;EAAS,CAAC;AAC1D,KAAI,CAAC,SAAS,IAAI;EAChB,IAAI,eAAe,mBAAmB,SAAS,OAAO;AACtD,MAAI;AAEF,mBADkB,MAAM,SAAS,MAAM,EACd,UAAU;UAC7B;AACN,kBAAe,SAAS,cAAc;;AAExC,SAAO,EAAE,OAAO,cAAc;;AAEhC,QAAO,EAAE,MAAM,MAAM,SAAS,MAAM,EAAE;;AAGxC,SAAS,gBAAgB,SAAyD;AAChF,KAAI,CAAC,SAAS,YACZ,QAAO,EAAE,cAAc,4BAA4B;AAErD,QAAO;;AAGT,SAAS,mBAAmB,cAAyD;AACnF,QAAO,gBAAgB,iBAAiB,qBAAqB,OAAO,eAAe;;AAOrF,eAAe,wBACb,YACA,aACA,SACA,iBACA,mBAC2D;AAC3D,QAAO,QACL,GAAG,WAAW,gBAAgB,YAAY,mBAC1C;EACE,QAAQ;EACR,SAAS,EAAE,gBAAgB,oBAAoB;EAC/C,MAAM,KAAK,UAAU;GACnB,cAAc,QAAQ;GACtB,eAAe,QAAQ;GACvB,gBAAgB,sBAAsB;GACtC,eAAe;GAChB,CAAyB;EAC3B,EACD,kBACD;;AAGH,SAAS,wBACP,UACA,cACqD;CACrD,MAAM,UAAU,IAAI,sBAAsB,aAAa;AAEvD,KAAI,CAAC,QAAQ,WAAW,SAAS,CAC/B,QAAO,EAAE,OAAO,gGAA6F;AAG/G,QAAO,EAAE,SAAS;;AAGpB,eAAe,0BACb,YACA,aACA,iBACA,iBACA,mBACyB;CACzB,MAAM,SAAS,MAAM,QACnB,GAAG,WAAW,gBAAgB,YAAY,qBAC1C;EACE,QAAQ;EACR,SAAS,EAAE,gBAAgB,oBAAoB;EAC/C,MAAM,KAAK,UAAU;GACnB,mBAAmB;GACnB,eAAe;GAChB,CAA2B;EAC7B,EACD,kBACD;AAED,KAAI,OAAO,SAAS,CAAC,OAAO,KAC1B,QAAO,EAAE,QAAQ,EAAE,WAAW,OAAO,SAAS,6BAA6B,EAAE;CAG/E,MAAM,cAAc,OAAO;AAE3B,KAAI,YAAY,kBAAkB,UAChC,QAAO,EACL,MAAM;EACJ,IAAI,YAAY;EAChB,mBAAmB,YAAY;EAC/B,mBAAmB;EACnB,OAAO;EACR,EACF;AAGH,QAAO,EACL,QAAQ,EACN,WAAW,YAAY,8BAA8B,YAAY,2BAA2B,kBAC7F,EACF;;;;;;;;;AAcH,eAAsB,gBACpB,YACA,aACA,SACA,aACmE;AACnE,SAAQ,IAAI,oCAAoC;AAGhD,uBAAsB;CAEtB,MAAM,kBAAkB,mBAAmB,QAAQ,aAAa;CAChE,MAAM,oBAAoB,6BAA6B,YAAY;AACnE,SAAQ,IAAI,yCAAyC,oBAAoB;AAIzE,KAAI,QAAQ,kBAAkB,aAAa;AACzC,UAAQ,IAAI,6EAA6E;AACzF,SAAO;GAAE,SAAS;GAAM,UAAU;GAAM;;CAI1C,MAAM,cAAc,MAAM,wBACxB,YACA,aACA,SACA,iBACA,kBACD;AACD,KAAI,YAAY,SAAS,CAAC,YAAY,KACpC,QAAO;EAAE,SAAS;EAAO,OAAO,YAAY,SAAS;EAA6B;CAGpF,MAAM,YAAY,YAAY;AAG9B,KAAI,CAAC,UAAU,UACb,QAAO;EAAE,SAAS;EAAO,OAAO;EAAuC;CAGzE,MAAM,EAAE,SAAS,OAAO,iBAAiB,wBAAwB,UAAU,WAAW,QAAQ,aAAa;AAC3G,KAAI,CAAC,QACH,QAAO;EAAE,SAAS;EAAO,OAAO;EAAc;CAIhD,MAAM,gBAAgB,MAAM,QAAQ,sBAAsB;EACxD,SAAS,UAAU;EACnB,UAAU,UAAU,SAAS,aAAa;EAC1C,OAAO;GACL,OAAO;GACP,QAAQ,UAAU;GACnB;EACF,CAAC;AAEF,KAAI,CAAC,cAAc,QACjB,QAAO;EACL,SAAS;EACT,OAAO,cAAc,SAAS;EAC9B,UAAU,cAAc;EACzB;AAGH,KAAI,CAAC,cAAc,SACjB,QAAO;EACL,SAAS;EACT,OAAO;EACP,UAAU;EACX;AAIH,uBAAsB;EACpB,WAAW;EACX;EACA;EACA;EACA;EACD;AAED,SAAQ,IAAI,+DAA+D;AAC3E,QAAO;EAAE,SAAS;EAAM,UAAU;EAAM;;;;;AAM1C,SAAgB,qBAA8B;AAC5C,QAAO,qBAAqB,QAAQ,YAAY,IAAI;;;;;AAMtD,SAAgB,wBAA8B;AAC5C,KAAI,oBACF,qBAAoB,QAAQ,eAAe;AAE7C,uBAAsB;;AAOxB,eAAe,2BACb,YACA,aACA,SACA,eACA,mBACA,iBACA,mBAC2D;AAC3D,QAAO,QACL,GAAG,WAAW,gBAAgB,YAAY,6BAC1C;EACE,QAAQ;EACR,SAAS,EAAE,gBAAgB,oBAAoB;EAC/C,MAAM,KAAK,UAAU;GACnB,cAAc,QAAQ;GACtB,eAAe,QAAQ;GACvB,gBAAgB,sBAAsB;GACtC,gBAAgB;GAChB,oBAAoB;GACpB,eAAe;GAChB,CAAyB;EAC3B,EACD,kBACD;;AAGH,eAAe,6BACb,YACA,aACA,eACA,iBACA,mBACkC;CAClC,MAAM,SAAS,MAAM,QACnB,GAAG,WAAW,gBAAgB,YAAY,+BAC1C;EACE,QAAQ;EACR,SAAS,EAAE,gBAAgB,oBAAoB;EAC/C,MAAM,KAAK,UAAU;GACnB,iBAAiB;GACjB,eAAe;GAChB,CAA2B;EAC7B,EACD,kBACD;AAED,KAAI,OAAO,SAAS,CAAC,OAAO,KAC1B,QAAO;EACL,eAAe;EACf,yBAAyB,OAAO,SAAS;EACzC,qBAAqB;EACtB;AAGH,QAAO,OAAO;;AAGhB,eAAe,4BACb,YACA,aACA,mBACkC;CAClC,MAAM,SAAS,MAAM,QACnB,GAAG,WAAW,gBAAgB,YAAY,8BAC1C;EACE,QAAQ;EACR,SAAS,EAAE,gBAAgB,oBAAoB;EAChD,EACD,kBACD;AAED,KAAI,OAAO,SAAS,CAAC,OAAO,KAC1B,QAAO;EACL,eAAe;EACf,yBAAyB,OAAO,SAAS;EACzC,qBAAqB;EACtB;AAGH,QAAO,OAAO;;AAGhB,SAAS,iBAAiB,UAAmC,aAAqC;AAChG,KAAI,SAAS,kBAAkB,UAC7B,QAAO,EACL,MAAM;EACJ,IAAI,SAAS;EACb,mBAAmB,SAAS;EAC5B,mBAAmB;EACnB,OAAO;EACR,EACF;AAEH,QAAO,EACL,QAAQ,EACN,WAAW,SAAS,8BAA8B,SAAS,2BAA2B,kBACvF,EACF;;AAGH,MAAM,mBAAmB;;;;;;;;;;AAWzB,eAAe,iBACb,YACA,aACA,SACA,iBACA,mBACyB;CAEzB,IAAIC,wBAAuD,8BAA8B;AACzF,KAAI,QAAQ,iBAAiB,qBAAqB,QAChD,yBAAwB,8BAA8B;UAC7C,QAAQ,iBAAiB,qBAAqB,UACvD,yBAAwB,8BAA8B;CAIxD,MAAM,UAAU,IAAI,yBAAyB,sBAAsB;CAEnE,MAAMC,SAAkC;EACtC,QAAQ,QAAQ,UAAU;EAC1B,WAAW,QAAQ,YAAY,OAAO,aAAa;EACnD,SAAS,QAAQ,QAAQ,aAAa;EACtC,cAAc,QAAQ,gBAAgB;EACvC;AAED,KAAI,CAAC,QAAQ,WAAW,OAAO,CAC7B,QAAO,EAAE,QAAQ,EAAE,WAAW,4DAA4D,EAAE;AAI9F,KAAI,CADW,MAAM,QAAQ,gBAAgB,CAE3C,QAAO,EAAE,QAAQ,EAAE,WAAW,0CAA0C,EAAE;CAI5E,MAAM,oBAAoB,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AAGrF,KAAI,0BAA0B,8BAA8B,MAAM;EAChE,MAAM,cAAc,MAAM,2BACxB,YACA,aACA,SACA,2EACA,mBACA,iBACA,kBACD;AACD,MAAI,YAAY,SAAS,CAAC,YAAY,KACpC,QAAO,EAAE,QAAQ,EAAE,WAAW,YAAY,SAAS,iCAAiC,EAAE;;CAK1F,MAAM,gBAAgB,MAAM,QAAQ,iBAAiB,OAAO,kBAA0B;EAEpF,MAAM,cAAc,MAAM,2BACxB,YACA,aACA,SACA,eACA,mBACA,iBACA,kBACD;AAED,MAAI,YAAY,SAAS,CAAC,YAAY,KACpC,QAAO,EAAE,OAAO,YAAY,SAAS,8BAA8B;AAGrE,MAAI,CAAC,YAAY,KAAK,iBACpB,QAAO,EAAE,OAAO,4CAA4C;AAG9D,SAAO,EAAE,iBAAiB,YAAY,KAAK,kBAAkB;GAC7D;AAEF,KAAI,CAAC,cAAc,SAAS;AAC1B,MAAI,eAAe,iBAAiB,cAAc,UAChD,QAAO,EAAE,QAAQ,EAAE,WAAW,+BAA+B,EAAE;AAEjE,SAAO,EAAE,QAAQ,EAAE,WAAW,cAAc,SAAS,oBAAoB,EAAE;;CAG7E,MAAM,EAAE,OAAO,aAAa;CAG5B,IAAI,WAAW,MAAM,6BAA6B,YAAY,aAAa,OAAO,iBAAiB,kBAAkB;CAGrH,IAAI,kBAAkB;AACtB,QAAO,SAAS,kBAAkB,aAAa,SAAS,eAAe,kBAAkB,kBAAkB;AACzG;EAGA,MAAM,aAAa,SAAS;EAC5B,MAAM,eAAe,MAAM,iBAAiB;GAAE,MAAM,WAAW;GAAM,KAAK,WAAW;GAAK,CAAC;EAG3F,MAAM,iBAAiB,MAAM,4BAA4B,YAAY,aAAa,kBAAkB;AAGpG,MAAI,eAAe,kBAAkB,aAAa,eAAe,aAAa;AAC5E,OAAI,CAAC,aAAa,QAChB,SAAQ,IAAI,0EAA0E;AAExF,cAAW;AACX;;AAIF,MAAI,CAAC,aAAa,SAAS;AACzB,YAAS,OAAO;AAChB,UAAO,EACL,QAAQ,EACN,WACE,eAAe,8BACf,eAAe,2BACf,aAAa,SACb,6BACH,EACF;;AAIH,WAAS,eAAe,kBAAkB,YAAY,YAAY,OAAO;AACzE,SAAO,iBAAiB,gBAAgB,YAAY;;AAItD,KAAI,mBAAmB,kBAAkB;AACvC,WAAS,OAAO;AAChB,SAAO,EAAE,QAAQ,EAAE,WAAW,uDAAuD,EAAE;;AAIzF,UAAS,SAAS,kBAAkB,YAAY,YAAY,OAAO;AACnE,QAAO,iBAAiB,UAAU,YAAY;;AAOhD,MAAM,oBAAoB,WAA6B;CACrD,MAAMC,gBAAiD,OAAO,SAAS,YAAY;EACjF,MAAM,EAAE,YAAY,aAAa,gBAAgB;EACjD,MAAM,kBAAkB;EAGxB,MAAM,kBAAkB,gBAAgB,gBAAgB;AACxD,MAAI,gBACF,QAAO,EAAE,QAAQ,iBAAiB;AAGpC,MAAI;GACF,MAAM,kBAAkB,mBAAmB,gBAAgB,aAAa;GACxE,MAAM,oBAAoB,6BAA6B,YAAY;AACnE,WAAQ,IAAI,yCAAyC,oBAAoB;AAGzE,OAAI,qBAAqB,QAAQ,YAAY,EAAE;AAC7C,YAAQ,IAAI,qEAAqE;IAIjF,MAAMC,kBAAgB,MADO,oBAAoB,QAAQ,0BAA0B;AAGnF,QAAI,CAACA,gBAAc,SAAS;AAC1B,4BAAuB;AAEvB,SAAI,eAAeA,mBAAiBA,gBAAc,UAChD,QAAO,EAAE,QAAQ,EAAE,WAAW,+BAA+B,EAAE;AAGjE,YAAO,EAAE,QAAQ,EAAE,WADE,WAAWA,kBAAgBA,gBAAc,QAAQ,iBAC1B,EAAE;;IAGhD,MAAM,EAAE,oCAAiB,6CAAuBA;IAGhD,MAAMC,kBAAgB,MAAM,0BAC1B,YACA,aACAC,mBACA,iBACA,oBAAoB,kBACrB;AAGD,QAAID,gBAAc,MAAM;AACtB,0BAAmB,SAAS,UAAU;AACtC,4BAAuB;AACvB,YAAOA;WACF;AACL,0BAAmB,SAAS,OAAO;AACnC,4BAAuB;AACvB,YAAOA;;;AAKX,OAAI,gBAAgB,kBAAkB,aAAa;AACjD,YAAQ,IAAI,8DAA8D;AAC1E,WAAO,MAAM,iBAAiB,YAAY,aAAa,iBAAiB,iBAAiB,kBAAkB;;GAI7G,MAAM,cAAc,MAAM,wBACxB,YACA,aACA,iBACA,iBACA,kBACD;AAED,OAAI,YAAY,SAAS,CAAC,YAAY,KACpC,QAAO,EAAE,QAAQ,EAAE,WAAW,YAAY,SAAS,6BAA6B,EAAE;GAGpF,MAAM,YAAY,YAAY;AAG9B,WAAQ,KAAK,4FAA4F;AAEzG,OAAI,CAAC,UAAU,UACb,QAAO,EAAE,QAAQ,EAAE,WAAW,uCAAuC,EAAE;GAGzE,MAAM,EAAE,SAAS,OAAO,iBAAiB,wBACvC,UAAU,WACV,gBAAgB,aACjB;AACD,OAAI,CAAC,QACH,QAAO,EAAE,QAAQ,EAAE,WAAW,gBAAgB,uCAAuC,EAAE;GAIzF,MAAM,gBAAgB,MAAM,QAAQ,sBAAsB;IACxD,SAAS,UAAU;IACnB,UAAU,UAAU,SAAS,aAAa;IAC1C,OAAO;KAAE,OAAO;KAAS,QAAQ,UAAU;KAAQ;IACpD,CAAC;AAEF,OAAI,CAAC,cAAc,WAAW,CAAC,cAAc,SAC3C,QAAO,EAAE,QAAQ,EAAE,WAAW,cAAc,SAAS,2BAA2B,EAAE;GAGpF,MAAM,gBAAgB,MAAM,QAAQ,0BAA0B;AAE9D,OAAI,CAAC,cAAc,SAAS;AAC1B,QAAI,eAAe,iBAAiB,cAAc,UAChD,QAAO,EAAE,QAAQ,EAAE,WAAW,+BAA+B,EAAE;AAGjE,WAAO,EAAE,QAAQ,EAAE,WADE,WAAW,gBAAgB,cAAc,QAAQ,iBAC1B,EAAE;;GAGhD,MAAM,EAAE,iBAAiB,uBAAuB;GAEhD,MAAM,gBAAgB,MAAM,0BAC1B,YACA,aACA,iBACA,iBACA,kBACD;AAED,OAAI,cAAc,MAAM;AACtB,uBAAmB,SAAS,UAAU;AACtC,WAAO;UACF;AACL,uBAAmB,SAAS,OAAO;AACnC,WAAO;;WAEF,OAAO;AACd,0BAAuB;AACvB,UAAO,EAAE,QAAQ,EAAE,WAAW,oBAAoB,SAAS,EAAE;;;AAIjE,QAAO;;AAOT,MAAM,wBAAwB,qBAAqB,qBAAqB;AACtE,QAAO;EACL,MAAM;EACN,eAAe,EACb,kBAAkB,YAChB,gBACE,iBAAiB,YACjB,iBAAiB,aACjB,SACA,iBAAiB,YAClB,EACJ;EACD,eAAe;GACb,eAAe,iBAAiB,iBAAiB;GACjD,eAAe;AACb,2BAAuB;;GAE1B;EACF;EACD;AAIF,wBAAe"}
@@ -1,6 +1,6 @@
1
- import { r as PaymentMethod } from "../types-CPuloCtF.mjs";
2
- import { n as CardInputType$1, o as connectToCardIframe, r as CheckoutResponse$1 } from "../connect-card-DTfXuTsW.mjs";
3
- import "../connect-tunnel-x-Dxcg5Y7Y.mjs";
1
+ import { r as PaymentMethod } from "../types-CZk3V0Qt.mjs";
2
+ import { n as CardInputType$1, o as connectToCardIframe, r as CheckoutResponse$1 } from "../connect-card-Cxy51W6t.mjs";
3
+ import "../connect-tunnel-x-lv6Wtdme.mjs";
4
4
 
5
5
  //#region src/payment-methods/card.d.ts
6
6
  type CardInputType = CardInputType$1;
@@ -1 +1 @@
1
- {"version":3,"file":"card.d.mts","names":[],"sources":["../../src/payment-methods/card.ts"],"sourcesContent":[],"mappings":";;;;;KAQY,aAAA,GAAgB;KAChB,gBAAA,GAAmB;KAwD1B,oBAAA,GAAuB,QAAQ,kBAAkB;UAC5C;AA1DV,CAAA;AACA,cAgUM,iBAhUsB,EA+DsC,aA/Db,CAAA;EAwDhD,aAAA,EAAA,CAAA,IAAA,EAOW,eAPS,EAAA,OAAA,EAOqB,oBAPrB,EAAA,GAAA;IAA6B,KAAA,EAAA,CAAA,cAAA,EAAA,MAAA,EAAA,GAAA;MAAlB,OAAA,EAAA,GAAA,GAAA,IAAA;IAAR,CAAA;EAClB,CAAA;CAAM,EAAA,MAAA,CAAA"}
1
+ {"version":3,"file":"card.d.mts","names":[],"sources":["../../src/payment-methods/card.ts"],"sourcesContent":[],"mappings":";;;;;KAQY,aAAA,GAAgB;KAChB,gBAAA,GAAmB;KA0D1B,oBAAA,GAAuB,QAAQ,kBAAkB;UAC5C;AA5DV,CAAA;AACA,cA6jBM,iBA7jBsB,EAiEsC,aAjEb,CAAA;EA0DhD,aAAA,EAAA,CAAA,IAAA,EAOW,eAPS,EAAA,OAAA,EAOqB,oBAPrB,EAAA,GAAA;IAA6B,KAAA,EAAA,CAAA,cAAA,EAAA,MAAA,EAAA,GAAA;MAAlB,OAAA,EAAA,GAAA,GAAA,IAAA;IAAR,CAAA;EAClB,CAAA;CAAM,EAAA,MAAA,CAAA"}