@paypercut/checkout-js 1.0.5 → 1.0.7
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.
- package/README.md +149 -13
- package/dist/index.cjs +39 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +19 -10
- package/dist/index.mjs +40 -16
- package/dist/index.mjs.map +1 -1
- package/dist/paypercut-checkout.iife.min.js +1 -1
- package/dist/paypercut-checkout.iife.min.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -54,12 +54,12 @@ pnpm add @paypercut/checkout-js
|
|
|
54
54
|
|
|
55
55
|
```html
|
|
56
56
|
<!-- jsDelivr (recommended with SRI) -->
|
|
57
|
-
<script src="https://cdn.jsdelivr.net/npm/@paypercut/checkout-js@1.0.
|
|
57
|
+
<script src="https://cdn.jsdelivr.net/npm/@paypercut/checkout-js@1.0.7/dist/paypercut-checkout.iife.min.js"
|
|
58
58
|
integrity="sha384-..."
|
|
59
59
|
crossorigin="anonymous"></script>
|
|
60
60
|
|
|
61
61
|
<!-- or UNPKG -->
|
|
62
|
-
<script src="https://unpkg.com/@paypercut/checkout-js@1.0.
|
|
62
|
+
<script src="https://unpkg.com/@paypercut/checkout-js@1.0.7/dist/paypercut-checkout.iife.min.js"></script>
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
---
|
|
@@ -203,7 +203,143 @@ Subscribe to events using the `on()` method:
|
|
|
203
203
|
|-------|-------------|---------|
|
|
204
204
|
| `loaded` | Checkout iframe has finished loading | `void` |
|
|
205
205
|
| `success` | Payment completed successfully | `void` |
|
|
206
|
-
| `error` |
|
|
206
|
+
| `error` | Terminal failure (tokenize, confirm, or 3DS) | `ApiErrorPayload` |
|
|
207
|
+
| `expired` | Checkout session expired | `void` |
|
|
208
|
+
| `threeds_started` | 3DS challenge flow started; SDK modal opened | `object` (flow context) |
|
|
209
|
+
| `threeds_complete` | 3DS challenge completed | `object` (auth result context) |
|
|
210
|
+
| `threeds_canceled` | 3DS challenge canceled by user | `object` (flow context) |
|
|
211
|
+
| `threeds_error` | 3DS challenge error | `ApiErrorPayload` (if provided) or `object` |
|
|
212
|
+
|
|
213
|
+
### 3DS Events (enum usage recommended)
|
|
214
|
+
|
|
215
|
+
You can subscribe using string event names or the SdkEvent enum:
|
|
216
|
+
|
|
217
|
+
```ts
|
|
218
|
+
import { PaypercutCheckout, SdkEvent } from '@paypercut/checkout-js';
|
|
219
|
+
|
|
220
|
+
const checkout = PaypercutCheckout({ id: 'CHK_12345', containerId: '#checkout' });
|
|
221
|
+
|
|
222
|
+
checkout.on(SdkEvent.ThreeDSStarted, (ctx) => {
|
|
223
|
+
// e.g., show your own UI indicator or log ctx
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
checkout.on(SdkEvent.ThreeDSComplete, (payload) => {
|
|
227
|
+
// 3DS completed successfully; Hosted Checkout will continue the flow
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
checkout.on(SdkEvent.ThreeDSCanceled, (payload) => {
|
|
231
|
+
// User canceled the 3DS challenge
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
checkout.on(SdkEvent.ThreeDSError, (err) => {
|
|
235
|
+
// Normalized ApiErrorPayload when available; fallback may be a raw object
|
|
236
|
+
console.error('3DS error:', err);
|
|
237
|
+
});
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Payload notes:
|
|
241
|
+
- `error`: the SDK forwards a normalized `ApiErrorPayload` when provided by Hosted Checkout.
|
|
242
|
+
- `threeds_error`: forwards `payload.error` when available; otherwise the raw message data.
|
|
243
|
+
- `threeds_*` non-error events: payload is forwarded as-is from Hosted Checkout (shape may evolve).
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
### Core events (loaded, success, error, expired)
|
|
247
|
+
|
|
248
|
+
Using enums:
|
|
249
|
+
|
|
250
|
+
```ts
|
|
251
|
+
import { PaypercutCheckout, SdkEvent } from '@paypercut/checkout-js';
|
|
252
|
+
|
|
253
|
+
const checkout = PaypercutCheckout({ id: 'CHK_12345', containerId: '#checkout' });
|
|
254
|
+
|
|
255
|
+
checkout.on(SdkEvent.Loaded, () => {
|
|
256
|
+
console.log('Checkout loaded');
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
checkout.on(SdkEvent.Success, () => {
|
|
260
|
+
console.log('Payment successful');
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
checkout.on(SdkEvent.Error, (err) => {
|
|
264
|
+
// err: ApiErrorPayload
|
|
265
|
+
console.error('Payment error:', err.code, err.message);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
checkout.on(SdkEvent.Expired, () => {
|
|
269
|
+
console.warn('Checkout session expired');
|
|
270
|
+
});
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Or with string event names:
|
|
274
|
+
|
|
275
|
+
```ts
|
|
276
|
+
checkout.on('loaded', () => {});
|
|
277
|
+
checkout.on('success', () => {});
|
|
278
|
+
checkout.on('error', (err) => {});
|
|
279
|
+
checkout.on('expired', () => {});
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
## Types
|
|
284
|
+
|
|
285
|
+
### ApiErrorPayload (example shape)
|
|
286
|
+
|
|
287
|
+
Example only; all fields are optional and additional passthrough properties may be present.
|
|
288
|
+
|
|
289
|
+
```ts
|
|
290
|
+
// Example shape for values received in `checkout.on('error', (err))`
|
|
291
|
+
type ApiErrorPayload = {
|
|
292
|
+
code?:
|
|
293
|
+
| 'threeds_error'
|
|
294
|
+
| 'threeds_authentication_failed'
|
|
295
|
+
| 'threeds_canceled'
|
|
296
|
+
| 'card_declined'
|
|
297
|
+
| 'authentication_failed'
|
|
298
|
+
| 'session_expired'
|
|
299
|
+
| string;
|
|
300
|
+
type?: 'card_error' | string;
|
|
301
|
+
message?: string;
|
|
302
|
+
status?: number; // HTTP-like status if available
|
|
303
|
+
decline_code?: string; // Optional decline reason
|
|
304
|
+
// ...other passthrough fields may be included by the server
|
|
305
|
+
};
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### 3DS payloads (representative samples)
|
|
309
|
+
|
|
310
|
+
The SDK forwards whatever Hosted Checkout sends for 3DS events. Shapes may evolve.
|
|
311
|
+
|
|
312
|
+
```ts
|
|
313
|
+
// threeds_started
|
|
314
|
+
{
|
|
315
|
+
type: 'THREEDS_START_FLOW',
|
|
316
|
+
checkoutId: 'CHK_12345',
|
|
317
|
+
// additional context as provided by Hosted Checkout (e.g., method, acsUrl)
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// threeds_complete
|
|
321
|
+
{
|
|
322
|
+
type: 'THREEDS_COMPLETE',
|
|
323
|
+
checkoutId: 'CHK_12345',
|
|
324
|
+
// authentication result context (e.g., status: 'Y' | 'A' | 'C' | 'D')
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// threeds_canceled
|
|
328
|
+
{
|
|
329
|
+
type: 'THREEDS_CANCELED',
|
|
330
|
+
checkoutId: 'CHK_12345',
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// threeds_error (non-terminal)
|
|
334
|
+
// Note: terminal failures will also be emitted on `error` with ApiErrorPayload
|
|
335
|
+
{
|
|
336
|
+
type: 'THREEDS_ERROR',
|
|
337
|
+
checkoutId: 'CHK_12345',
|
|
338
|
+
error?: ApiErrorPayload,
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Tip: Prefer subscribing with the SdkEvent enum for stronger typing.
|
|
207
343
|
|
|
208
344
|
|
|
209
345
|
## Usage Examples
|
|
@@ -218,16 +354,16 @@ Subscribe to events using the `on()` method:
|
|
|
218
354
|
</head>
|
|
219
355
|
<body>
|
|
220
356
|
<div id="checkout"></div>
|
|
221
|
-
|
|
222
|
-
<script src="https://cdn.jsdelivr.net/npm/@paypercut/checkout-js@1.0.
|
|
357
|
+
|
|
358
|
+
<script src="https://cdn.jsdelivr.net/npm/@paypercut/checkout-js@1.0.7/dist/paypercut-checkout.iife.min.js"></script>
|
|
223
359
|
<script>
|
|
224
360
|
const checkout = PaypercutCheckout({
|
|
225
361
|
id: 'CHK_12345',
|
|
226
362
|
containerId: '#checkout'
|
|
227
363
|
});
|
|
228
364
|
|
|
229
|
-
checkout.on('success', function(
|
|
230
|
-
alert('Payment successful!
|
|
365
|
+
checkout.on('success', function() {
|
|
366
|
+
alert('Payment successful!');
|
|
231
367
|
});
|
|
232
368
|
|
|
233
369
|
checkout.on('error', function(error) {
|
|
@@ -250,8 +386,8 @@ const checkout = PaypercutCheckout({
|
|
|
250
386
|
containerId: '#checkout'
|
|
251
387
|
});
|
|
252
388
|
|
|
253
|
-
checkout.on('success', (
|
|
254
|
-
console.log('Payment successful
|
|
389
|
+
checkout.on('success', () => {
|
|
390
|
+
console.log('Payment successful');
|
|
255
391
|
// Redirect to success page
|
|
256
392
|
window.location.href = '/success';
|
|
257
393
|
});
|
|
@@ -289,9 +425,9 @@ export function CheckoutComponent({ checkoutId }: { checkoutId: string }) {
|
|
|
289
425
|
console.log('Checkout loaded');
|
|
290
426
|
});
|
|
291
427
|
|
|
292
|
-
checkout.on('success', (
|
|
428
|
+
checkout.on('success', () => {
|
|
293
429
|
setStatus('success');
|
|
294
|
-
console.log('Payment successful
|
|
430
|
+
console.log('Payment successful');
|
|
295
431
|
});
|
|
296
432
|
|
|
297
433
|
checkout.on('error', (error) => {
|
|
@@ -342,8 +478,8 @@ export function ModalCheckout({ checkoutId, onClose }: { checkoutId: string; onC
|
|
|
342
478
|
setIsLoading(false);
|
|
343
479
|
});
|
|
344
480
|
|
|
345
|
-
checkout.on('success', (
|
|
346
|
-
console.log('Payment successful
|
|
481
|
+
checkout.on('success', () => {
|
|
482
|
+
console.log('Payment successful');
|
|
347
483
|
onClose();
|
|
348
484
|
});
|
|
349
485
|
|
package/dist/index.cjs
CHANGED
|
@@ -84,7 +84,7 @@ class Emitter {
|
|
|
84
84
|
* Production configuration (for merchants)
|
|
85
85
|
*/
|
|
86
86
|
const productionConfig = {
|
|
87
|
-
version: "1.0.
|
|
87
|
+
version: "1.0.7",
|
|
88
88
|
defaultCheckoutOrigin: 'https://buy.paypercut.io',
|
|
89
89
|
allowedOrigins: [
|
|
90
90
|
'https://buy.paypercut.io',
|
|
@@ -178,12 +178,8 @@ function normalizeLocale(locale) {
|
|
|
178
178
|
*/
|
|
179
179
|
exports.UIMode = void 0;
|
|
180
180
|
(function (UIMode) {
|
|
181
|
-
/** Custom UI mode - merchant provides their own submit button */
|
|
182
|
-
UIMode["CUSTOM"] = "custom";
|
|
183
181
|
/** Embedded mode - checkout embedded in merchant page */
|
|
184
182
|
UIMode["EMBEDDED"] = "embedded";
|
|
185
|
-
/** Hosted mode - full-page checkout experience */
|
|
186
|
-
UIMode["HOSTED"] = "hosted";
|
|
187
183
|
})(exports.UIMode || (exports.UIMode = {}));
|
|
188
184
|
/**
|
|
189
185
|
* Type guard for UIMode
|
|
@@ -269,6 +265,20 @@ function validateUIMode(mode) {
|
|
|
269
265
|
console.warn(`[PaypercutCheckout] Invalid ui_mode: "${mode}". Valid options: ${Object.values(exports.UIMode).join(', ')}`);
|
|
270
266
|
return undefined;
|
|
271
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* Preferred enum for SDK event names (use instead of hardcoded strings)
|
|
270
|
+
*/
|
|
271
|
+
exports.SdkEvent = void 0;
|
|
272
|
+
(function (SdkEvent) {
|
|
273
|
+
SdkEvent["Loaded"] = "loaded";
|
|
274
|
+
SdkEvent["Success"] = "success";
|
|
275
|
+
SdkEvent["Error"] = "error";
|
|
276
|
+
SdkEvent["Expired"] = "expired";
|
|
277
|
+
SdkEvent["ThreeDSComplete"] = "threeds_complete";
|
|
278
|
+
SdkEvent["ThreeDSError"] = "threeds_error";
|
|
279
|
+
SdkEvent["ThreeDSCanceled"] = "threeds_canceled";
|
|
280
|
+
SdkEvent["ThreeDSStarted"] = "threeds_started";
|
|
281
|
+
})(exports.SdkEvent || (exports.SdkEvent = {}));
|
|
272
282
|
|
|
273
283
|
/**
|
|
274
284
|
* Internal implementation of CheckoutInstance
|
|
@@ -298,11 +308,11 @@ class CheckoutImpl {
|
|
|
298
308
|
const normalizedLocale = normalizeLocale(this.options.locale);
|
|
299
309
|
url.searchParams.set('locale', normalizedLocale);
|
|
300
310
|
}
|
|
301
|
-
// Add ui_mode parameter
|
|
302
|
-
|
|
303
|
-
const
|
|
304
|
-
if (
|
|
305
|
-
url.searchParams.set('ui_mode',
|
|
311
|
+
// Add ui_mode parameter (default to 'embedded')
|
|
312
|
+
{
|
|
313
|
+
const selected = validateUIMode(this.options.ui_mode ?? exports.UIMode.EMBEDDED);
|
|
314
|
+
if (selected) {
|
|
315
|
+
url.searchParams.set('ui_mode', selected);
|
|
306
316
|
}
|
|
307
317
|
}
|
|
308
318
|
// Add payment_methods parameters (repeated for each method)
|
|
@@ -360,28 +370,39 @@ class CheckoutImpl {
|
|
|
360
370
|
// Handle specific events
|
|
361
371
|
switch (data.type) {
|
|
362
372
|
case 'CHECKOUT_LOADED':
|
|
363
|
-
this.emitter.emit(
|
|
373
|
+
this.emitter.emit(exports.SdkEvent.Loaded);
|
|
364
374
|
break;
|
|
365
375
|
case 'CHECKOUT_SUCCESS':
|
|
366
|
-
this.emitter.emit(
|
|
376
|
+
this.emitter.emit(exports.SdkEvent.Success);
|
|
367
377
|
break;
|
|
368
378
|
case 'CHECKOUT_ERROR':
|
|
369
|
-
|
|
379
|
+
// Forward error payload (if provided) to SDK consumers
|
|
380
|
+
this.emitter.emit(exports.SdkEvent.Error, (data && data.error) ?? data);
|
|
370
381
|
break;
|
|
371
382
|
case 'CHECKOUT_EXPIRED':
|
|
372
|
-
this.emitter.emit(
|
|
383
|
+
this.emitter.emit(exports.SdkEvent.Expired);
|
|
373
384
|
break;
|
|
374
385
|
case 'THREEDS_START_FLOW':
|
|
375
386
|
this.show3DSModal(data);
|
|
387
|
+
this.emitter.emit(exports.SdkEvent.ThreeDSStarted);
|
|
376
388
|
break;
|
|
377
389
|
case 'THREEDS_READY':
|
|
378
390
|
this.handle3DSReady();
|
|
379
391
|
break;
|
|
380
392
|
case 'THREEDS_COMPLETE':
|
|
381
|
-
|
|
393
|
+
this.postToIframe(data);
|
|
394
|
+
this.close3DSModal();
|
|
395
|
+
this.emitter.emit(exports.SdkEvent.ThreeDSComplete);
|
|
396
|
+
break;
|
|
397
|
+
case 'THREEDS_CANCELED':
|
|
398
|
+
this.postToIframe(data);
|
|
399
|
+
this.close3DSModal();
|
|
400
|
+
this.emitter.emit(exports.SdkEvent.ThreeDSCanceled);
|
|
401
|
+
break;
|
|
382
402
|
case 'THREEDS_ERROR':
|
|
383
403
|
this.postToIframe(data);
|
|
384
404
|
this.close3DSModal();
|
|
405
|
+
this.emitter.emit(exports.SdkEvent.ThreeDSError, data.error);
|
|
385
406
|
break;
|
|
386
407
|
}
|
|
387
408
|
}
|
|
@@ -400,6 +421,9 @@ class CheckoutImpl {
|
|
|
400
421
|
this.iframe.src = this.buildSrc();
|
|
401
422
|
this.iframe.allow = 'payment *; clipboard-write';
|
|
402
423
|
this.iframe.setAttribute('frameborder', '0');
|
|
424
|
+
// Allow Payment Request API inside iframe and necessary sandbox permissions for wallets
|
|
425
|
+
this.iframe.setAttribute('allowpaymentrequest', 'true');
|
|
426
|
+
this.iframe.setAttribute('sandbox', 'allow-scripts allow-forms allow-same-origin allow-popups allow-popups-to-escape-sandbox');
|
|
403
427
|
// Apply default styles - just construct URL and assign to iframe
|
|
404
428
|
Object.assign(this.iframe.style, {
|
|
405
429
|
width: '100%',
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/utils/emitter.ts","../src/config.ts","../src/types/locales.ts","../src/types/checkout.ts","../src/index.ts"],"sourcesContent":["/**\n * Simple event emitter for handling checkout events\n * Supports subscribing, unsubscribing, and emitting events\n */\nexport class Emitter<T extends string = string> {\n private handlers = new Map<T, Set<Function>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n on(event: T, handler: Function): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n /**\n * Subscribe to an event that auto-unsubscribes after first emission\n *\n * Common use case: waiting for 'loaded' event or handling first 'success'.\n * Without this helper, developers would need to manually unsubscribe inside\n * their handler, which is error-prone and leads to memory leaks if forgotten.\n *\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n once(event: T, handler: Function): () => void {\n const wrappedHandler = (...args: any[]) => {\n handler(...args);\n this.off(event, wrappedHandler);\n };\n return this.on(event, wrappedHandler);\n }\n\n /**\n * Unsubscribe from an event\n * @param event - Event name to stop listening to\n * @param handler - Callback function to remove\n */\n off(event: T, handler: Function): void {\n this.handlers.get(event)?.delete(handler);\n }\n\n /**\n * Emit an event with optional arguments\n * @param event - Event name to emit\n * @param args - Arguments to pass to event handlers\n */\n emit(event: T, ...args: any[]): void {\n this.handlers.get(event)?.forEach(h => {\n try {\n h(...args);\n } catch (err) {\n console.error(`[Emitter] Error in ${event} handler:`, err);\n }\n });\n }\n\n /**\n * Clear all event handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n","/**\n * Build-time configuration\n * \n * This file is processed at build time with different values for:\n * - Production build (for merchants)\n * - Internal build (for team development)\n */\n\n/**\n * Build mode - replaced at build time\n */\ndeclare const __BUILD_MODE__: 'production' | 'internal';\n\n/**\n * SDK version - replaced at build time\n */\ndeclare const __VERSION__: string;\n\n/**\n * Configuration interface\n */\nexport interface BuildConfig {\n /** SDK version */\n version: string;\n \n /** Build mode */\n mode: 'production' | 'internal';\n \n /** Default checkout origin (production URL) */\n defaultCheckoutOrigin: string;\n \n /** Allowed origins for postMessage validation */\n allowedOrigins: string[];\n \n /** Whether hostedCheckoutUrl override is allowed */\n allowOriginOverride: boolean;\n}\n\n/**\n * Production configuration (for merchants)\n */\nconst productionConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'production',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n ],\n allowOriginOverride: false\n};\n\n/**\n * Internal configuration (for team development)\n */\nconst internalConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'internal',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n 'http://localhost:3000',\n 'http://localhost:3001',\n 'http://127.0.0.1:3000',\n 'http://127.0.0.1:3001'\n ],\n allowOriginOverride: true\n};\n\n/**\n * Active configuration (selected at build time)\n */\nexport const config: BuildConfig = __BUILD_MODE__ === 'internal' \n ? internalConfig \n : productionConfig;\n\n/**\n * Helper to check if origin is allowed\n */\nexport function isOriginAllowed(origin: string): boolean {\n return config.allowedOrigins.includes(origin);\n}\n\n/**\n * Get the checkout origin (with optional override for internal builds)\n */\nexport function getCheckoutOrigin(override?: string): string {\n // Only allow override in internal builds\n if (override && config.allowOriginOverride) {\n return override;\n }\n \n return config.defaultCheckoutOrigin;\n}\n\n","/**\n * Supported locales for Paypercut Checkout\n * \n * @remarks\n * Single source of truth for all supported locale codes.\n * \n * Supported languages:\n * - Bulgarian: 'bg', 'bg-BG'\n * - English: 'en', 'en-GB'\n * - Greek: 'el', 'el-GR'\n * - Romanian: 'ro', 'ro-RO'\n * - Croatian: 'hr', 'hr-HR'\n * - Polish: 'pl', 'pl-PL'\n * - Czech: 'cs', 'cs-CZ'\n * - Slovenian: 'sl', 'sl-SI'\n * - Slovak: 'sk', 'sk-SK'\n * \n * @example\n * ```typescript\n * const checkout = PaypercutCheckout({\n * locale: 'bg' // or 'bg-BG', 'en', 'en-GB', etc.\n * });\n * ```\n */\nexport const LOCALES = [\n 'bg', 'bg-BG',\n 'en', 'en-GB',\n 'el', 'el-GR',\n 'ro', 'ro-RO',\n 'hr', 'hr-HR',\n 'pl', 'pl-PL',\n 'cs', 'cs-CZ',\n 'sl', 'sl-SI',\n 'sk', 'sk-SK',\n] as const;\n\n/**\n * Locale type - union of all supported locale codes plus 'auto'\n * @example\n * ```typescript\n * const locale: Locale = 'bg';\n * const autoLocale: Locale = 'auto';\n * ```\n */\nexport type Locale = typeof LOCALES[number] | 'auto';\n\n/**\n * Fast runtime check using Set for O(1) lookup\n * @internal\n */\nconst LOCALE_SET: ReadonlySet<string> = new Set(LOCALES);\n\n/**\n * Normalize and validate locale\n * \n * @param locale - Locale code to normalize\n * @returns Normalized locale code or 'en' as fallback\n * \n * @remarks\n * - 'auto' or empty → 'en'\n * - Unsupported locale → 'en' with console warning\n * - Supported locale → original value\n * \n * @example\n * ```typescript\n * normalizeLocale('auto') // → 'en'\n * normalizeLocale('bg') // → 'bg'\n * normalizeLocale('de') // → 'en' (with warning)\n * ```\n */\nexport function normalizeLocale(locale: string | Locale): typeof LOCALES[number] | 'en' {\n if (!locale || locale === 'auto') return 'en';\n if (LOCALE_SET.has(locale)) return locale as typeof LOCALES[number];\n console.warn(`[PaypercutCheckout] Locale \"${locale}\" is not supported. Falling back to \"en\".`);\n return 'en';\n}\n\n","import { Locale } from './locales';\n\n/**\n * UI mode for checkout\n */\nexport enum UIMode {\n /** Custom UI mode - merchant provides their own submit button */\n CUSTOM = 'custom',\n /** Embedded mode - checkout embedded in merchant page */\n EMBEDDED = 'embedded',\n /** Hosted mode - full-page checkout experience */\n HOSTED = 'hosted',\n}\n\n/**\n * Type guard for UIMode\n */\nexport function isValidUIMode(value: string): value is UIMode {\n return Object.values(UIMode).includes(value as UIMode);\n}\n\n/**\n * Payment method types\n */\nexport enum PaymentMethod {\n /** Card payment (credit/debit) */\n CARD = 'card',\n}\n\n/**\n * Type guard for PaymentMethod\n */\nexport function isValidPaymentMethod(value: string): value is PaymentMethod {\n return Object.values(PaymentMethod).includes(value as PaymentMethod);\n}\n\n/**\n * Wallet options for digital wallets\n */\nexport enum WalletOption {\n /** Apple Pay */\n APPLE_PAY = 'apple_pay',\n /** Google Pay */\n GOOGLE_PAY = 'google_pay',\n}\n\n/**\n * Type guard for WalletOption\n */\nexport function isValidWalletOption(value: string): value is WalletOption {\n return Object.values(WalletOption).includes(value as WalletOption);\n}\n\n/**\n * Validate payment methods array\n */\nexport function validatePaymentMethods(methods: string[]): PaymentMethod[] {\n const validated: PaymentMethod[] = [];\n\n for (const method of methods) {\n if (isValidPaymentMethod(method)) {\n validated.push(method as PaymentMethod);\n } else {\n console.warn(`[PaypercutCheckout] Invalid payment method: \"${method}\". Skipping.`);\n }\n }\n\n // Default to card if no valid methods\n if (validated.length === 0) {\n console.warn('[PaypercutCheckout] No valid payment methods provided. Defaulting to \"card\".');\n validated.push(PaymentMethod.CARD);\n }\n\n return validated;\n}\n\n/**\n * Validate wallet options array\n */\nexport function validateWalletOptions(options: string[]): WalletOption[] {\n const validated: WalletOption[] = [];\n\n for (const option of options) {\n if (isValidWalletOption(option)) {\n validated.push(option as WalletOption);\n } else {\n console.warn(`[PaypercutCheckout] Invalid wallet option: \"${option}\". Skipping.`);\n }\n }\n\n return validated;\n}\n\n/**\n * Validate UI mode\n */\nexport function validateUIMode(mode: string | undefined): UIMode | undefined {\n if (!mode) {\n return undefined;\n }\n\n if (isValidUIMode(mode)) {\n return mode as UIMode;\n }\n\n console.warn(\n `[PaypercutCheckout] Invalid ui_mode: \"${mode}\". Valid options: ${Object.values(UIMode).join(', ')}`,\n );\n return undefined;\n}\n\n/**\n * Configuration options for PaypercutCheckout\n */\nexport interface PaypercutCheckoutOptions {\n /** Checkout session identifier (e.g., 'CHK_12345') */\n id: string;\n\n /** CSS selector or HTMLElement where iframe mounts (required) */\n containerId: string | HTMLElement;\n\n /**\n * Optional: Custom hosted checkout URL (only available in internal builds)\n * Production builds will ignore this option for security\n */\n hostedCheckoutUrl?: string;\n\n /**\n * Optional: Locale for checkout UI\n * @default 'en'\n */\n locale?: Locale | string;\n\n /**\n * Optional: UI mode for checkout\n */\n ui_mode?: UIMode | `${UIMode}`;\n\n /**\n * Optional: Payment methods to enable\n * @default ['card']\n */\n payment_methods?: (PaymentMethod | `${PaymentMethod}`)[];\n\n /**\n * Optional: Digital wallet options\n * Can include both or just one\n */\n wallet_options?: (WalletOption | `${WalletOption}`)[];\n\n /**\n * Optional: Show only the payment form without header/footer\n * @default false\n */\n form_only?: boolean;\n\n /**\n * Optional: Appearance options\n */\n appearance?: {\n preset?: 'inline' | 'modal';\n theme?: 'light' | 'dark' | 'none' | 'flat';\n variables: {};\n rules: {};\n labels: 'floating' | 'above' | 'none';\n };\n}\n\n/**\n * Event names that can be emitted by the checkout\n */\nexport type EventName =\n | 'loaded' // iframe finished loading\n | 'success' // payment successful\n | 'error' // payment or system error\n | 'expired'; // checkout expired or already paid\n\n/**\n * Checkout instance interface\n */\nexport interface CheckoutInstance {\n /** Mount and render the iframe into the container */\n render(): void;\n\n /** Submit payment - sends message to hosted checkout to confirm payment */\n submit(): void;\n\n /** Destroy instance and cleanup all listeners */\n destroy(): void;\n\n /** Subscribe to events. Returns unsubscribe function */\n on(event: EventName, handler: (...args: any[]) => void): () => void;\n\n /** Subscribe to event that auto-unsubscribes after first emission */\n once(event: EventName, handler: (...args: any[]) => void): () => void;\n\n /** Unsubscribe from events */\n off(event: EventName, handler: (...args: any[]) => void): void;\n\n /** Check if checkout is currently mounted */\n isMounted(): boolean;\n}\n\n/**\n * PaypercutCheckout static interface (callable and constructable)\n */\nexport interface PaypercutCheckoutStatic {\n /** Callable factory function */\n (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** Constructor support */\n new (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** SDK version */\n version: string;\n}\n","import { Emitter } from './utils/emitter';\nimport { config, isOriginAllowed, getCheckoutOrigin } from './config';\n\nimport {\n PaypercutCheckoutOptions,\n CheckoutInstance,\n PaypercutCheckoutStatic,\n EventName,\n validatePaymentMethods,\n validateWalletOptions,\n validateUIMode,\n} from './types';\nimport { normalizeLocale } from './types';\n\n// Re-export types and enums for consumers\nexport type { PaypercutCheckoutOptions, CheckoutInstance, PaypercutCheckoutStatic, EventName };\n\nexport { UIMode, PaymentMethod, WalletOption } from './types/checkout';\n\nexport type { Locale } from './types/locales';\nexport { LOCALES } from './types/locales';\n\n/**\n * Internal implementation of CheckoutInstance\n */\nclass CheckoutImpl implements CheckoutInstance {\n private emitter = new Emitter<EventName>();\n private mounted = false;\n private destroyed = false;\n private iframe: HTMLIFrameElement | null = null;\n private messageHandler: (evt: MessageEvent) => void;\n\n // 3DS Modal state\n private threeDSModal: HTMLDivElement | null = null;\n private threeDSIframe: HTMLIFrameElement | null = null;\n\n constructor(private options: PaypercutCheckoutOptions) {\n // Bind message handler\n this.messageHandler = this.onMessage.bind(this);\n window.addEventListener('message', this.messageHandler);\n }\n\n /**\n * Build the iframe source URL with query parameters\n */\n private buildSrc(): string {\n const baseUrl = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n const url = new URL(`/c/${this.options.id}`, baseUrl);\n\n // Add locale parameter\n if (this.options.locale) {\n const normalizedLocale = normalizeLocale(this.options.locale);\n url.searchParams.set('locale', normalizedLocale);\n }\n\n // Add ui_mode parameter\n if (this.options.ui_mode) {\n const validatedUIMode = validateUIMode(this.options.ui_mode);\n if (validatedUIMode) {\n url.searchParams.set('ui_mode', validatedUIMode);\n }\n }\n\n // Add payment_methods parameters (repeated for each method)\n if (this.options.payment_methods && this.options.payment_methods.length > 0) {\n const validatedMethods = validatePaymentMethods(this.options.payment_methods as string[]);\n validatedMethods.forEach((method) => {\n url.searchParams.append('payment_methods', method);\n });\n }\n\n // Add wallet_options parameters (repeated for each wallet)\n if (this.options.wallet_options && this.options.wallet_options.length > 0) {\n const validatedWallets = validateWalletOptions(this.options.wallet_options as string[]);\n validatedWallets.forEach((wallet) => {\n url.searchParams.append('wallet_options', wallet);\n });\n }\n\n if (this.options.appearance?.preset) {\n url.searchParams.set('preset', this.options.appearance.preset);\n }\n\n if (this.options.form_only !== undefined) {\n url.searchParams.set('form_only', String(this.options.form_only));\n }\n\n return url.toString();\n }\n\n /**\n * Get the container element from selector or HTMLElement\n */\n private getContainer(): HTMLElement {\n const container =\n typeof this.options.containerId === 'string'\n ? document.querySelector(this.options.containerId)\n : this.options.containerId;\n\n if (!container) {\n throw new Error(`Container not found: ${this.options.containerId}`);\n }\n\n return container as HTMLElement;\n }\n\n /**\n * Handle incoming postMessage events from iframe\n */\n private onMessage(evt: MessageEvent): void {\n // Validate origin against allowed origins (build-time whitelist)\n if (!isOriginAllowed(evt.origin)) {\n return;\n }\n\n // Validate structure\n const data = evt.data;\n if (!data || typeof data !== 'object' || !('type' in data)) {\n return;\n }\n\n // Filter messages by checkout session ID to prevent cross-instance message handling\n // This ensures each checkout instance only processes its own messages\n if (data.checkoutId && data.checkoutId !== this.options.id) {\n return; // Message is for a different checkout instance\n }\n\n // Handle specific events\n switch (data.type) {\n case 'CHECKOUT_LOADED':\n this.emitter.emit('loaded');\n break;\n case 'CHECKOUT_SUCCESS':\n this.emitter.emit('success');\n break;\n case 'CHECKOUT_ERROR':\n this.emitter.emit('error');\n break;\n case 'CHECKOUT_EXPIRED':\n this.emitter.emit('expired');\n break;\n case 'THREEDS_START_FLOW':\n this.show3DSModal(data);\n break;\n case 'THREEDS_READY':\n this.handle3DSReady();\n break;\n case 'THREEDS_COMPLETE':\n case 'THREEDS_CANCELLED':\n case 'THREEDS_ERROR':\n this.postToIframe(data);\n this.close3DSModal();\n break;\n }\n }\n\n /**\n * Render the checkout iframe into the container\n */\n render(): void {\n if (this.mounted) {\n return;\n }\n\n try {\n const container = this.getContainer();\n\n // Create iframe\n this.iframe = document.createElement('iframe');\n this.iframe.id = 'paypercut-checkout-iframe';\n this.iframe.src = this.buildSrc();\n this.iframe.allow = 'payment *; clipboard-write';\n this.iframe.setAttribute('frameborder', '0');\n\n // Apply default styles - just construct URL and assign to iframe\n Object.assign(this.iframe.style, {\n width: '100%',\n height: '100%',\n border: 'none',\n display: 'block',\n });\n\n // Listen for iframe load event (fallback)\n // This ensures 'loaded' event is always emitted even if hosted checkout\n // doesn't send CHECKOUT_LOADED message\n /*this.iframe.addEventListener('load', () => {\n this.emitter.emit('loaded');\n });*/\n\n container.appendChild(this.iframe);\n this.mounted = true;\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to render:', err);\n throw err;\n }\n }\n\n /**\n * Submit payment - sends message to hosted checkout to confirm payment\n */\n submit(): void {\n if (!this.mounted) {\n return;\n }\n\n try {\n this.postToIframe({\n type: 'START_PROCESSING',\n checkoutId: this.options.id,\n });\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to submit payment:', err);\n throw err;\n }\n }\n\n /**\n * Send message to hosted/embedded checkout iframe - used for submit payment and communicating 3DS events\n */\n private postToIframe(message: any): void {\n if (!this.iframe?.contentWindow) {\n console.error('[PaypercutCheckout] Cannot post message: iframe not mounted');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.iframe.contentWindow.postMessage(message, checkoutOrigin);\n }\n\n /**\n * Show 3DS modal with challenge/decoupled flow\n */\n private show3DSModal(data: {\n sessionId: string;\n step: 'challenge' | 'decoupled_waiting';\n challengeUrl?: string;\n acsTransactionId?: string;\n threeDSVersion?: string;\n cardBrand?: string;\n }): void {\n\n // Create modal backdrop\n this.threeDSModal = document.createElement('div');\n this.threeDSModal.id = 'paypercut-3ds-modal';\n Object.assign(this.threeDSModal.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n // backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '999999',\n });\n\n // Create container for iframe + close button\n const modalContainer = document.createElement('div');\n Object.assign(modalContainer.style, {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '#ffffff',\n borderRadius: '24px',\n });\n\n // Create iframe for 3DS page\n this.threeDSIframe = document.createElement('iframe');\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n\n // Build URL: baseUrl/c/{checkoutId}/threeds with query params\n const threeDSUrl = new URL(`/c/${this.options.id}/threeds`, checkoutOrigin);\n threeDSUrl.searchParams.set('sessionId', data.sessionId);\n threeDSUrl.searchParams.set('step', data.step);\n\n if (data.challengeUrl) {\n threeDSUrl.searchParams.set('challengeUrl', data.challengeUrl);\n }\n if (data.acsTransactionId) {\n threeDSUrl.searchParams.set('acsTransactionId', data.acsTransactionId);\n }\n if (data.threeDSVersion) {\n threeDSUrl.searchParams.set('threeDSVersion', data.threeDSVersion);\n }\n\n this.threeDSIframe.src = threeDSUrl.toString();\n this.threeDSIframe.allow = 'payment *';\n this.threeDSIframe.setAttribute('frameborder', '0');\n\n // Responsive modal sizing (60% of viewport, min 400px, max 800px width / 600px height)\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const modalWidth = Math.min(Math.max(viewportWidth * 0.6, 400), 800);\n const modalHeight = Math.min(Math.max(viewportHeight * 0.6, 400), 600);\n\n Object.assign(this.threeDSIframe.style, {\n width: `${modalWidth}px`,\n height: `${modalHeight}px`,\n border: 'none',\n borderRadius: '24px',\n backgroundColor: 'white',\n overflow: 'auto',\n });\n\n // Append iframe\n modalContainer.appendChild(this.threeDSIframe);\n\n // Append container to modal backdrop\n this.threeDSModal.appendChild(modalContainer);\n document.body.appendChild(this.threeDSModal);\n\n // Store 3DS data for later use\n (this as any).pending3DSData = data;\n }\n\n /**\n * Handle THREEDS_READY message - send THREEDS_INIT with challenge data\n */\n private handle3DSReady(): void {\n const data = (this as any).pending3DSData;\n if (!data || !this.threeDSIframe?.contentWindow) {\n console.error('[PaypercutCheckout] No pending 3DS data or iframe not ready');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.threeDSIframe.contentWindow.postMessage(\n {\n type: 'THREEDS_INIT',\n checkoutId: this.options.id,\n },\n checkoutOrigin,\n );\n }\n\n /**\n * Close 3DS modal and cleanup\n */\n private close3DSModal(): void {\n if (this.threeDSModal) {\n this.threeDSModal.remove();\n this.threeDSModal = null;\n }\n\n this.threeDSIframe = null;\n delete (this as any).pending3DSData;\n }\n\n /**\n * Destroy the checkout instance and cleanup (idempotent)\n */\n destroy(): void {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n // Remove iframe from DOM\n if (this.iframe) {\n try {\n this.iframe.remove();\n this.iframe = null;\n } catch (err) {\n console.error('[PaypercutCheckout] Error removing iframe:', err);\n }\n }\n\n // Cleanup 3DS modal if open\n this.close3DSModal();\n\n // Only set mounted = false after successful DOM removal\n this.mounted = false;\n this.destroyed = true;\n\n // Cleanup event listeners\n window.removeEventListener('message', this.messageHandler);\n this.emitter.clear();\n }\n\n /**\n * Subscribe to an event\n */\n on(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.on(event, handler);\n }\n\n /**\n * Subscribe to event that auto-unsubscribes after first emission\n */\n once(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.once(event, handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: EventName, handler: (...args: any[]) => void): void {\n this.emitter.off(event, handler);\n }\n\n /**\n * Check if checkout is currently mounted\n */\n isMounted(): boolean {\n return this.mounted;\n }\n}\n\n/**\n * Factory function that works both as callable and constructable.\n * Always returns a new CheckoutImpl instance - no prototype manipulation needed.\n */\nconst PaypercutCheckout: PaypercutCheckoutStatic = function (\n this: unknown,\n options: PaypercutCheckoutOptions,\n): CheckoutInstance {\n // Always return a new instance, regardless of how it's called\n return new CheckoutImpl(options);\n} as unknown as PaypercutCheckoutStatic;\n\n// Add static version property\n(PaypercutCheckout as any).version = config.version;\n\n// Export as default and named\nexport default PaypercutCheckout;\nexport { PaypercutCheckout };\n"],"names":["UIMode","PaymentMethod","WalletOption"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/emitter.ts","../src/config.ts","../src/types/locales.ts","../src/types/checkout.ts","../src/index.ts"],"sourcesContent":["/**\n * Simple event emitter for handling checkout events\n * Supports subscribing, unsubscribing, and emitting events\n */\nexport class Emitter<T extends string = string> {\n private handlers = new Map<T, Set<Function>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n on(event: T, handler: Function): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n /**\n * Subscribe to an event that auto-unsubscribes after first emission\n *\n * Common use case: waiting for 'loaded' event or handling first 'success'.\n * Without this helper, developers would need to manually unsubscribe inside\n * their handler, which is error-prone and leads to memory leaks if forgotten.\n *\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n once(event: T, handler: Function): () => void {\n const wrappedHandler = (...args: any[]) => {\n handler(...args);\n this.off(event, wrappedHandler);\n };\n return this.on(event, wrappedHandler);\n }\n\n /**\n * Unsubscribe from an event\n * @param event - Event name to stop listening to\n * @param handler - Callback function to remove\n */\n off(event: T, handler: Function): void {\n this.handlers.get(event)?.delete(handler);\n }\n\n /**\n * Emit an event with optional arguments\n * @param event - Event name to emit\n * @param args - Arguments to pass to event handlers\n */\n emit(event: T, ...args: any[]): void {\n this.handlers.get(event)?.forEach(h => {\n try {\n h(...args);\n } catch (err) {\n console.error(`[Emitter] Error in ${event} handler:`, err);\n }\n });\n }\n\n /**\n * Clear all event handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n","/**\n * Build-time configuration\n * \n * This file is processed at build time with different values for:\n * - Production build (for merchants)\n * - Internal build (for team development)\n */\n\n/**\n * Build mode - replaced at build time\n */\ndeclare const __BUILD_MODE__: 'production' | 'internal';\n\n/**\n * SDK version - replaced at build time\n */\ndeclare const __VERSION__: string;\n\n/**\n * Configuration interface\n */\nexport interface BuildConfig {\n /** SDK version */\n version: string;\n \n /** Build mode */\n mode: 'production' | 'internal';\n \n /** Default checkout origin (production URL) */\n defaultCheckoutOrigin: string;\n \n /** Allowed origins for postMessage validation */\n allowedOrigins: string[];\n \n /** Whether hostedCheckoutUrl override is allowed */\n allowOriginOverride: boolean;\n}\n\n/**\n * Production configuration (for merchants)\n */\nconst productionConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'production',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n ],\n allowOriginOverride: false\n};\n\n/**\n * Internal configuration (for team development)\n */\nconst internalConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'internal',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n 'http://localhost:3000',\n 'http://localhost:3001',\n 'http://127.0.0.1:3000',\n 'http://127.0.0.1:3001'\n ],\n allowOriginOverride: true\n};\n\n/**\n * Active configuration (selected at build time)\n */\nexport const config: BuildConfig = __BUILD_MODE__ === 'internal' \n ? internalConfig \n : productionConfig;\n\n/**\n * Helper to check if origin is allowed\n */\nexport function isOriginAllowed(origin: string): boolean {\n return config.allowedOrigins.includes(origin);\n}\n\n/**\n * Get the checkout origin (with optional override for internal builds)\n */\nexport function getCheckoutOrigin(override?: string): string {\n // Only allow override in internal builds\n if (override && config.allowOriginOverride) {\n return override;\n }\n \n return config.defaultCheckoutOrigin;\n}\n\n","/**\n * Supported locales for Paypercut Checkout\n * \n * @remarks\n * Single source of truth for all supported locale codes.\n * \n * Supported languages:\n * - Bulgarian: 'bg', 'bg-BG'\n * - English: 'en', 'en-GB'\n * - Greek: 'el', 'el-GR'\n * - Romanian: 'ro', 'ro-RO'\n * - Croatian: 'hr', 'hr-HR'\n * - Polish: 'pl', 'pl-PL'\n * - Czech: 'cs', 'cs-CZ'\n * - Slovenian: 'sl', 'sl-SI'\n * - Slovak: 'sk', 'sk-SK'\n * \n * @example\n * ```typescript\n * const checkout = PaypercutCheckout({\n * locale: 'bg' // or 'bg-BG', 'en', 'en-GB', etc.\n * });\n * ```\n */\nexport const LOCALES = [\n 'bg', 'bg-BG',\n 'en', 'en-GB',\n 'el', 'el-GR',\n 'ro', 'ro-RO',\n 'hr', 'hr-HR',\n 'pl', 'pl-PL',\n 'cs', 'cs-CZ',\n 'sl', 'sl-SI',\n 'sk', 'sk-SK',\n] as const;\n\n/**\n * Locale type - union of all supported locale codes plus 'auto'\n * @example\n * ```typescript\n * const locale: Locale = 'bg';\n * const autoLocale: Locale = 'auto';\n * ```\n */\nexport type Locale = typeof LOCALES[number] | 'auto';\n\n/**\n * Fast runtime check using Set for O(1) lookup\n * @internal\n */\nconst LOCALE_SET: ReadonlySet<string> = new Set(LOCALES);\n\n/**\n * Normalize and validate locale\n * \n * @param locale - Locale code to normalize\n * @returns Normalized locale code or 'en' as fallback\n * \n * @remarks\n * - 'auto' or empty → 'en'\n * - Unsupported locale → 'en' with console warning\n * - Supported locale → original value\n * \n * @example\n * ```typescript\n * normalizeLocale('auto') // → 'en'\n * normalizeLocale('bg') // → 'bg'\n * normalizeLocale('de') // → 'en' (with warning)\n * ```\n */\nexport function normalizeLocale(locale: string | Locale): typeof LOCALES[number] | 'en' {\n if (!locale || locale === 'auto') return 'en';\n if (LOCALE_SET.has(locale)) return locale as typeof LOCALES[number];\n console.warn(`[PaypercutCheckout] Locale \"${locale}\" is not supported. Falling back to \"en\".`);\n return 'en';\n}\n\n","import { Locale } from './locales';\n\n/**\n * UI mode for checkout\n */\nexport enum UIMode {\n /** Embedded mode - checkout embedded in merchant page */\n EMBEDDED = 'embedded',\n}\n\n/**\n * Type guard for UIMode\n */\nexport function isValidUIMode(value: string): value is UIMode {\n return Object.values(UIMode).includes(value as UIMode);\n}\n\n/**\n * Payment method types\n */\nexport enum PaymentMethod {\n /** Card payment (credit/debit) */\n CARD = 'card',\n}\n\n/**\n * Type guard for PaymentMethod\n */\nexport function isValidPaymentMethod(value: string): value is PaymentMethod {\n return Object.values(PaymentMethod).includes(value as PaymentMethod);\n}\n\n/**\n * Wallet options for digital wallets\n */\nexport enum WalletOption {\n /** Apple Pay */\n APPLE_PAY = 'apple_pay',\n /** Google Pay */\n GOOGLE_PAY = 'google_pay',\n}\n\n/**\n * Type guard for WalletOption\n */\nexport function isValidWalletOption(value: string): value is WalletOption {\n return Object.values(WalletOption).includes(value as WalletOption);\n}\n\n/**\n * Validate payment methods array\n */\nexport function validatePaymentMethods(methods: string[]): PaymentMethod[] {\n const validated: PaymentMethod[] = [];\n\n for (const method of methods) {\n if (isValidPaymentMethod(method)) {\n validated.push(method as PaymentMethod);\n } else {\n console.warn(`[PaypercutCheckout] Invalid payment method: \"${method}\". Skipping.`);\n }\n }\n\n // Default to card if no valid methods\n if (validated.length === 0) {\n console.warn('[PaypercutCheckout] No valid payment methods provided. Defaulting to \"card\".');\n validated.push(PaymentMethod.CARD);\n }\n\n return validated;\n}\n\n/**\n * Validate wallet options array\n */\nexport function validateWalletOptions(options: string[]): WalletOption[] {\n const validated: WalletOption[] = [];\n\n for (const option of options) {\n if (isValidWalletOption(option)) {\n validated.push(option as WalletOption);\n } else {\n console.warn(`[PaypercutCheckout] Invalid wallet option: \"${option}\". Skipping.`);\n }\n }\n\n return validated;\n}\n\n/**\n * Validate UI mode\n */\nexport function validateUIMode(mode: string | undefined): UIMode | undefined {\n if (!mode) {\n return undefined;\n }\n\n if (isValidUIMode(mode)) {\n return mode as UIMode;\n }\n\n console.warn(\n `[PaypercutCheckout] Invalid ui_mode: \"${mode}\". Valid options: ${Object.values(UIMode).join(', ')}`,\n );\n return undefined;\n}\n\n/**\n * Configuration options for PaypercutCheckout\n */\nexport interface PaypercutCheckoutOptions {\n /** Checkout session identifier (e.g., 'CHK_12345') */\n id: string;\n\n /** CSS selector or HTMLElement where iframe mounts (required) */\n containerId: string | HTMLElement;\n\n /**\n * Optional: Custom hosted checkout URL (only available in internal builds)\n * Production builds will ignore this option for security\n */\n hostedCheckoutUrl?: string;\n\n /**\n * Optional: Locale for checkout UI\n * @default 'en'\n */\n locale?: Locale | string;\n\n /**\n * Optional: UI mode for checkout\n */\n ui_mode?: UIMode | `${UIMode}`;\n\n /**\n * Optional: Payment methods to enable\n * @default ['card']\n */\n payment_methods?: (PaymentMethod | `${PaymentMethod}`)[];\n\n /**\n * Optional: Digital wallet options\n * Can include both or just one\n */\n wallet_options?: (WalletOption | `${WalletOption}`)[];\n\n /**\n * Optional: Show only the payment form without header/footer\n * @default false\n */\n form_only?: boolean;\n\n /**\n * Optional: Appearance options\n */\n appearance?: {\n preset?: 'inline' | 'modal';\n theme?: 'light' | 'dark' | 'none' | 'flat';\n variables: {};\n rules: {};\n labels: 'floating' | 'above' | 'none';\n };\n}\n\n/**\n * Event names that can be emitted by the checkout\n */\nexport type EventName =\n | 'loaded' // iframe finished loading\n | 'success' // payment successful\n | 'error' // payment or system error\n | 'expired' // checkout expired or already paid\n | 'threeds_complete' // checkout paid successfully\n | 'threeds_error' // checkout threeds error\n | 'threeds_canceled' // checkout threeds canceled\n | 'threeds_started'; // checkout threeds started\n\n/**\n * Preferred enum for SDK event names (use instead of hardcoded strings)\n */\nexport enum SdkEvent {\n Loaded = 'loaded',\n Success = 'success',\n Error = 'error',\n Expired = 'expired',\n ThreeDSComplete = 'threeds_complete',\n ThreeDSError = 'threeds_error',\n ThreeDSCanceled = 'threeds_canceled',\n ThreeDSStarted = 'threeds_started',\n}\n\n/**\n * Checkout instance interface\n */\nexport interface CheckoutInstance {\n /** Mount and render the iframe into the container */\n render(): void;\n\n /** Submit payment - sends message to hosted checkout to confirm payment */\n submit(): void;\n\n /** Destroy instance and cleanup all listeners */\n destroy(): void;\n\n /** Subscribe to events. Returns unsubscribe function */\n on(event: EventName | SdkEvent, handler: (...args: any[]) => void): () => void;\n\n /** Subscribe to event that auto-unsubscribes after first emission */\n once(event: EventName | SdkEvent, handler: (...args: any[]) => void): () => void;\n\n /** Unsubscribe from events */\n off(event: EventName | SdkEvent, handler: (...args: any[]) => void): void;\n\n /** Check if checkout is currently mounted */\n isMounted(): boolean;\n}\n\n/**\n * PaypercutCheckout static interface (callable and constructable)\n */\nexport interface PaypercutCheckoutStatic {\n /** Callable factory function */\n (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** Constructor support */\n new (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** SDK version */\n version: string;\n}\n","import { Emitter } from './utils/emitter';\nimport { config, isOriginAllowed, getCheckoutOrigin } from './config';\n\nimport {\n PaypercutCheckoutOptions,\n CheckoutInstance,\n PaypercutCheckoutStatic,\n EventName,\n SdkEvent,\n validatePaymentMethods,\n validateWalletOptions,\n validateUIMode,\n UIMode,\n} from './types';\nimport { normalizeLocale } from './types';\n\n// Re-export types and enums for consumers\nexport type { PaypercutCheckoutOptions, CheckoutInstance, PaypercutCheckoutStatic, EventName };\n\nexport { UIMode, PaymentMethod, WalletOption } from './types/checkout';\n\n\n// Re-export SDK event enums for consumers\nexport { SdkEvent } from './types/checkout';\n\nexport type { Locale } from './types/locales';\nexport { LOCALES } from './types/locales';\n\n/**\n * Internal implementation of CheckoutInstance\n */\nclass CheckoutImpl implements CheckoutInstance {\n private emitter = new Emitter<EventName>();\n private mounted = false;\n private destroyed = false;\n private iframe: HTMLIFrameElement | null = null;\n private messageHandler: (evt: MessageEvent) => void;\n\n // 3DS Modal state\n private threeDSModal: HTMLDivElement | null = null;\n private threeDSIframe: HTMLIFrameElement | null = null;\n\n constructor(private options: PaypercutCheckoutOptions) {\n // Bind message handler\n this.messageHandler = this.onMessage.bind(this);\n window.addEventListener('message', this.messageHandler);\n }\n\n /**\n * Build the iframe source URL with query parameters\n */\n private buildSrc(): string {\n const baseUrl = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n const url = new URL(`/c/${this.options.id}`, baseUrl);\n\n // Add locale parameter\n if (this.options.locale) {\n const normalizedLocale = normalizeLocale(this.options.locale);\n url.searchParams.set('locale', normalizedLocale);\n }\n\n // Add ui_mode parameter (default to 'embedded')\n {\n const selected = validateUIMode(this.options.ui_mode ?? UIMode.EMBEDDED);\n if (selected) {\n url.searchParams.set('ui_mode', selected);\n }\n }\n\n // Add payment_methods parameters (repeated for each method)\n if (this.options.payment_methods && this.options.payment_methods.length > 0) {\n const validatedMethods = validatePaymentMethods(this.options.payment_methods as string[]);\n validatedMethods.forEach((method) => {\n url.searchParams.append('payment_methods', method);\n });\n }\n\n // Add wallet_options parameters (repeated for each wallet)\n if (this.options.wallet_options && this.options.wallet_options.length > 0) {\n const validatedWallets = validateWalletOptions(this.options.wallet_options as string[]);\n validatedWallets.forEach((wallet) => {\n url.searchParams.append('wallet_options', wallet);\n });\n }\n\n if (this.options.appearance?.preset) {\n url.searchParams.set('preset', this.options.appearance.preset);\n }\n\n if (this.options.form_only !== undefined) {\n url.searchParams.set('form_only', String(this.options.form_only));\n }\n\n return url.toString();\n }\n\n /**\n * Get the container element from selector or HTMLElement\n */\n private getContainer(): HTMLElement {\n const container =\n typeof this.options.containerId === 'string'\n ? document.querySelector(this.options.containerId)\n : this.options.containerId;\n\n if (!container) {\n throw new Error(`Container not found: ${this.options.containerId}`);\n }\n\n return container as HTMLElement;\n }\n\n /**\n * Handle incoming postMessage events from iframe\n */\n private onMessage(evt: MessageEvent): void {\n // Validate origin against allowed origins (build-time whitelist)\n if (!isOriginAllowed(evt.origin)) {\n return;\n }\n\n // Validate structure\n const data = evt.data;\n if (!data || typeof data !== 'object' || !('type' in data)) {\n return;\n }\n\n // Filter messages by checkout session ID to prevent cross-instance message handling\n // This ensures each checkout instance only processes its own messages\n if (data.checkoutId && data.checkoutId !== this.options.id) {\n return; // Message is for a different checkout instance\n }\n\n // Handle specific events\n switch (data.type) {\n case 'CHECKOUT_LOADED':\n this.emitter.emit(SdkEvent.Loaded);\n break;\n case 'CHECKOUT_SUCCESS':\n this.emitter.emit(SdkEvent.Success);\n break;\n case 'CHECKOUT_ERROR':\n // Forward error payload (if provided) to SDK consumers\n this.emitter.emit(SdkEvent.Error, (data && (data as any).error) ?? data);\n break;\n case 'CHECKOUT_EXPIRED':\n this.emitter.emit(SdkEvent.Expired);\n break;\n case 'THREEDS_START_FLOW':\n this.show3DSModal(data);\n this.emitter.emit(SdkEvent.ThreeDSStarted);\n break;\n case 'THREEDS_READY':\n this.handle3DSReady();\n break;\n case 'THREEDS_COMPLETE':\n this.postToIframe(data);\n this.close3DSModal();\n this.emitter.emit(SdkEvent.ThreeDSComplete);\n break;\n case 'THREEDS_CANCELED':\n this.postToIframe(data);\n this.close3DSModal();\n this.emitter.emit(SdkEvent.ThreeDSCanceled);\n break;\n case 'THREEDS_ERROR':\n this.postToIframe(data);\n this.close3DSModal();\n this.emitter.emit(SdkEvent.ThreeDSError, data.error);\n break;\n }\n }\n\n /**\n * Render the checkout iframe into the container\n */\n render(): void {\n if (this.mounted) {\n return;\n }\n\n try {\n const container = this.getContainer();\n\n // Create iframe\n this.iframe = document.createElement('iframe');\n this.iframe.id = 'paypercut-checkout-iframe';\n this.iframe.src = this.buildSrc();\n this.iframe.allow = 'payment *; clipboard-write';\n this.iframe.setAttribute('frameborder', '0');\n // Allow Payment Request API inside iframe and necessary sandbox permissions for wallets\n this.iframe.setAttribute('allowpaymentrequest', 'true');\n this.iframe.setAttribute(\n 'sandbox',\n 'allow-scripts allow-forms allow-same-origin allow-popups allow-popups-to-escape-sandbox',\n );\n\n\n // Apply default styles - just construct URL and assign to iframe\n Object.assign(this.iframe.style, {\n width: '100%',\n height: '100%',\n border: 'none',\n display: 'block',\n });\n\n // Listen for iframe load event (fallback)\n // This ensures 'loaded' event is always emitted even if hosted checkout\n // doesn't send CHECKOUT_LOADED message\n /*this.iframe.addEventListener('load', () => {\n this.emitter.emit('loaded');\n });*/\n\n container.appendChild(this.iframe);\n this.mounted = true;\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to render:', err);\n throw err;\n }\n }\n\n /**\n * Submit payment - sends message to hosted checkout to confirm payment\n */\n submit(): void {\n if (!this.mounted) {\n return;\n }\n\n try {\n this.postToIframe({\n type: 'START_PROCESSING',\n checkoutId: this.options.id,\n });\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to submit payment:', err);\n throw err;\n }\n }\n\n /**\n * Send message to hosted/embedded checkout iframe - used for submit payment and communicating 3DS events\n */\n private postToIframe(message: any): void {\n if (!this.iframe?.contentWindow) {\n console.error('[PaypercutCheckout] Cannot post message: iframe not mounted');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.iframe.contentWindow.postMessage(message, checkoutOrigin);\n }\n\n /**\n * Show 3DS modal with challenge/decoupled flow\n */\n private show3DSModal(data: {\n sessionId: string;\n step: 'challenge' | 'decoupled_waiting';\n challengeUrl?: string;\n acsTransactionId?: string;\n threeDSVersion?: string;\n cardBrand?: string;\n }): void {\n\n // Create modal backdrop\n this.threeDSModal = document.createElement('div');\n this.threeDSModal.id = 'paypercut-3ds-modal';\n Object.assign(this.threeDSModal.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n // backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '999999',\n });\n\n // Create container for iframe + close button\n const modalContainer = document.createElement('div');\n Object.assign(modalContainer.style, {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '#ffffff',\n borderRadius: '24px',\n });\n\n // Create iframe for 3DS page\n this.threeDSIframe = document.createElement('iframe');\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n\n // Build URL: baseUrl/c/{checkoutId}/threeds with query params\n const threeDSUrl = new URL(`/c/${this.options.id}/threeds`, checkoutOrigin);\n threeDSUrl.searchParams.set('sessionId', data.sessionId);\n threeDSUrl.searchParams.set('step', data.step);\n\n if (data.challengeUrl) {\n threeDSUrl.searchParams.set('challengeUrl', data.challengeUrl);\n }\n if (data.acsTransactionId) {\n threeDSUrl.searchParams.set('acsTransactionId', data.acsTransactionId);\n }\n if (data.threeDSVersion) {\n threeDSUrl.searchParams.set('threeDSVersion', data.threeDSVersion);\n }\n\n this.threeDSIframe.src = threeDSUrl.toString();\n this.threeDSIframe.allow = 'payment *';\n this.threeDSIframe.setAttribute('frameborder', '0');\n\n // Responsive modal sizing (60% of viewport, min 400px, max 800px width / 600px height)\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const modalWidth = Math.min(Math.max(viewportWidth * 0.6, 400), 800);\n const modalHeight = Math.min(Math.max(viewportHeight * 0.6, 400), 600);\n\n Object.assign(this.threeDSIframe.style, {\n width: `${modalWidth}px`,\n height: `${modalHeight}px`,\n border: 'none',\n borderRadius: '24px',\n backgroundColor: 'white',\n overflow: 'auto',\n });\n\n // Append iframe\n modalContainer.appendChild(this.threeDSIframe);\n\n // Append container to modal backdrop\n this.threeDSModal.appendChild(modalContainer);\n document.body.appendChild(this.threeDSModal);\n\n // Store 3DS data for later use\n (this as any).pending3DSData = data;\n }\n\n /**\n * Handle THREEDS_READY message - send THREEDS_INIT with challenge data\n */\n private handle3DSReady(): void {\n const data = (this as any).pending3DSData;\n if (!data || !this.threeDSIframe?.contentWindow) {\n console.error('[PaypercutCheckout] No pending 3DS data or iframe not ready');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.threeDSIframe.contentWindow.postMessage(\n {\n type: 'THREEDS_INIT',\n checkoutId: this.options.id,\n },\n checkoutOrigin,\n );\n }\n\n /**\n * Close 3DS modal and cleanup\n */\n private close3DSModal(): void {\n if (this.threeDSModal) {\n this.threeDSModal.remove();\n this.threeDSModal = null;\n }\n\n this.threeDSIframe = null;\n delete (this as any).pending3DSData;\n }\n\n /**\n * Destroy the checkout instance and cleanup (idempotent)\n */\n destroy(): void {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n // Remove iframe from DOM\n if (this.iframe) {\n try {\n this.iframe.remove();\n this.iframe = null;\n } catch (err) {\n console.error('[PaypercutCheckout] Error removing iframe:', err);\n }\n }\n\n // Cleanup 3DS modal if open\n this.close3DSModal();\n\n // Only set mounted = false after successful DOM removal\n this.mounted = false;\n this.destroyed = true;\n\n // Cleanup event listeners\n window.removeEventListener('message', this.messageHandler);\n this.emitter.clear();\n }\n\n /**\n * Subscribe to an event\n */\n on(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.on(event, handler);\n }\n\n /**\n * Subscribe to event that auto-unsubscribes after first emission\n */\n once(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.once(event, handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: EventName, handler: (...args: any[]) => void): void {\n this.emitter.off(event, handler);\n }\n\n /**\n * Check if checkout is currently mounted\n */\n isMounted(): boolean {\n return this.mounted;\n }\n}\n\n/**\n * Factory function that works both as callable and constructable.\n * Always returns a new CheckoutImpl instance - no prototype manipulation needed.\n */\nconst PaypercutCheckout: PaypercutCheckoutStatic = function (\n this: unknown,\n options: PaypercutCheckoutOptions,\n): CheckoutInstance {\n // Always return a new instance, regardless of how it's called\n return new CheckoutImpl(options);\n} as unknown as PaypercutCheckoutStatic;\n\n// Add static version property\n(PaypercutCheckout as any).version = config.version;\n\n// Export as default and named\nexport default PaypercutCheckout;\nexport { PaypercutCheckout };\n"],"names":["UIMode","PaymentMethod","WalletOption","SdkEvent"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -37,12 +37,8 @@ type Locale = typeof LOCALES[number] | 'auto';
|
|
|
37
37
|
* UI mode for checkout
|
|
38
38
|
*/
|
|
39
39
|
declare enum UIMode {
|
|
40
|
-
/** Custom UI mode - merchant provides their own submit button */
|
|
41
|
-
CUSTOM = "custom",
|
|
42
40
|
/** Embedded mode - checkout embedded in merchant page */
|
|
43
|
-
EMBEDDED = "embedded"
|
|
44
|
-
/** Hosted mode - full-page checkout experience */
|
|
45
|
-
HOSTED = "hosted"
|
|
41
|
+
EMBEDDED = "embedded"
|
|
46
42
|
}
|
|
47
43
|
/**
|
|
48
44
|
* Payment method types
|
|
@@ -111,7 +107,20 @@ interface PaypercutCheckoutOptions {
|
|
|
111
107
|
/**
|
|
112
108
|
* Event names that can be emitted by the checkout
|
|
113
109
|
*/
|
|
114
|
-
type EventName = 'loaded' | 'success' | 'error' | 'expired';
|
|
110
|
+
type EventName = 'loaded' | 'success' | 'error' | 'expired' | 'threeds_complete' | 'threeds_error' | 'threeds_canceled' | 'threeds_started';
|
|
111
|
+
/**
|
|
112
|
+
* Preferred enum for SDK event names (use instead of hardcoded strings)
|
|
113
|
+
*/
|
|
114
|
+
declare enum SdkEvent {
|
|
115
|
+
Loaded = "loaded",
|
|
116
|
+
Success = "success",
|
|
117
|
+
Error = "error",
|
|
118
|
+
Expired = "expired",
|
|
119
|
+
ThreeDSComplete = "threeds_complete",
|
|
120
|
+
ThreeDSError = "threeds_error",
|
|
121
|
+
ThreeDSCanceled = "threeds_canceled",
|
|
122
|
+
ThreeDSStarted = "threeds_started"
|
|
123
|
+
}
|
|
115
124
|
/**
|
|
116
125
|
* Checkout instance interface
|
|
117
126
|
*/
|
|
@@ -123,11 +132,11 @@ interface CheckoutInstance {
|
|
|
123
132
|
/** Destroy instance and cleanup all listeners */
|
|
124
133
|
destroy(): void;
|
|
125
134
|
/** Subscribe to events. Returns unsubscribe function */
|
|
126
|
-
on(event: EventName, handler: (...args: any[]) => void): () => void;
|
|
135
|
+
on(event: EventName | SdkEvent, handler: (...args: any[]) => void): () => void;
|
|
127
136
|
/** Subscribe to event that auto-unsubscribes after first emission */
|
|
128
|
-
once(event: EventName, handler: (...args: any[]) => void): () => void;
|
|
137
|
+
once(event: EventName | SdkEvent, handler: (...args: any[]) => void): () => void;
|
|
129
138
|
/** Unsubscribe from events */
|
|
130
|
-
off(event: EventName, handler: (...args: any[]) => void): void;
|
|
139
|
+
off(event: EventName | SdkEvent, handler: (...args: any[]) => void): void;
|
|
131
140
|
/** Check if checkout is currently mounted */
|
|
132
141
|
isMounted(): boolean;
|
|
133
142
|
}
|
|
@@ -149,5 +158,5 @@ interface PaypercutCheckoutStatic {
|
|
|
149
158
|
*/
|
|
150
159
|
declare const PaypercutCheckout: PaypercutCheckoutStatic;
|
|
151
160
|
|
|
152
|
-
export { LOCALES, PaymentMethod, PaypercutCheckout, UIMode, WalletOption, PaypercutCheckout as default };
|
|
161
|
+
export { LOCALES, PaymentMethod, PaypercutCheckout, SdkEvent, UIMode, WalletOption, PaypercutCheckout as default };
|
|
153
162
|
export type { CheckoutInstance, EventName, Locale, PaypercutCheckoutOptions, PaypercutCheckoutStatic };
|
package/dist/index.mjs
CHANGED
|
@@ -80,7 +80,7 @@ class Emitter {
|
|
|
80
80
|
* Production configuration (for merchants)
|
|
81
81
|
*/
|
|
82
82
|
const productionConfig = {
|
|
83
|
-
version: "1.0.
|
|
83
|
+
version: "1.0.7",
|
|
84
84
|
defaultCheckoutOrigin: 'https://buy.paypercut.io',
|
|
85
85
|
allowedOrigins: [
|
|
86
86
|
'https://buy.paypercut.io',
|
|
@@ -174,12 +174,8 @@ function normalizeLocale(locale) {
|
|
|
174
174
|
*/
|
|
175
175
|
var UIMode;
|
|
176
176
|
(function (UIMode) {
|
|
177
|
-
/** Custom UI mode - merchant provides their own submit button */
|
|
178
|
-
UIMode["CUSTOM"] = "custom";
|
|
179
177
|
/** Embedded mode - checkout embedded in merchant page */
|
|
180
178
|
UIMode["EMBEDDED"] = "embedded";
|
|
181
|
-
/** Hosted mode - full-page checkout experience */
|
|
182
|
-
UIMode["HOSTED"] = "hosted";
|
|
183
179
|
})(UIMode || (UIMode = {}));
|
|
184
180
|
/**
|
|
185
181
|
* Type guard for UIMode
|
|
@@ -265,6 +261,20 @@ function validateUIMode(mode) {
|
|
|
265
261
|
console.warn(`[PaypercutCheckout] Invalid ui_mode: "${mode}". Valid options: ${Object.values(UIMode).join(', ')}`);
|
|
266
262
|
return undefined;
|
|
267
263
|
}
|
|
264
|
+
/**
|
|
265
|
+
* Preferred enum for SDK event names (use instead of hardcoded strings)
|
|
266
|
+
*/
|
|
267
|
+
var SdkEvent;
|
|
268
|
+
(function (SdkEvent) {
|
|
269
|
+
SdkEvent["Loaded"] = "loaded";
|
|
270
|
+
SdkEvent["Success"] = "success";
|
|
271
|
+
SdkEvent["Error"] = "error";
|
|
272
|
+
SdkEvent["Expired"] = "expired";
|
|
273
|
+
SdkEvent["ThreeDSComplete"] = "threeds_complete";
|
|
274
|
+
SdkEvent["ThreeDSError"] = "threeds_error";
|
|
275
|
+
SdkEvent["ThreeDSCanceled"] = "threeds_canceled";
|
|
276
|
+
SdkEvent["ThreeDSStarted"] = "threeds_started";
|
|
277
|
+
})(SdkEvent || (SdkEvent = {}));
|
|
268
278
|
|
|
269
279
|
/**
|
|
270
280
|
* Internal implementation of CheckoutInstance
|
|
@@ -294,11 +304,11 @@ class CheckoutImpl {
|
|
|
294
304
|
const normalizedLocale = normalizeLocale(this.options.locale);
|
|
295
305
|
url.searchParams.set('locale', normalizedLocale);
|
|
296
306
|
}
|
|
297
|
-
// Add ui_mode parameter
|
|
298
|
-
|
|
299
|
-
const
|
|
300
|
-
if (
|
|
301
|
-
url.searchParams.set('ui_mode',
|
|
307
|
+
// Add ui_mode parameter (default to 'embedded')
|
|
308
|
+
{
|
|
309
|
+
const selected = validateUIMode(this.options.ui_mode ?? UIMode.EMBEDDED);
|
|
310
|
+
if (selected) {
|
|
311
|
+
url.searchParams.set('ui_mode', selected);
|
|
302
312
|
}
|
|
303
313
|
}
|
|
304
314
|
// Add payment_methods parameters (repeated for each method)
|
|
@@ -356,28 +366,39 @@ class CheckoutImpl {
|
|
|
356
366
|
// Handle specific events
|
|
357
367
|
switch (data.type) {
|
|
358
368
|
case 'CHECKOUT_LOADED':
|
|
359
|
-
this.emitter.emit(
|
|
369
|
+
this.emitter.emit(SdkEvent.Loaded);
|
|
360
370
|
break;
|
|
361
371
|
case 'CHECKOUT_SUCCESS':
|
|
362
|
-
this.emitter.emit(
|
|
372
|
+
this.emitter.emit(SdkEvent.Success);
|
|
363
373
|
break;
|
|
364
374
|
case 'CHECKOUT_ERROR':
|
|
365
|
-
|
|
375
|
+
// Forward error payload (if provided) to SDK consumers
|
|
376
|
+
this.emitter.emit(SdkEvent.Error, (data && data.error) ?? data);
|
|
366
377
|
break;
|
|
367
378
|
case 'CHECKOUT_EXPIRED':
|
|
368
|
-
this.emitter.emit(
|
|
379
|
+
this.emitter.emit(SdkEvent.Expired);
|
|
369
380
|
break;
|
|
370
381
|
case 'THREEDS_START_FLOW':
|
|
371
382
|
this.show3DSModal(data);
|
|
383
|
+
this.emitter.emit(SdkEvent.ThreeDSStarted);
|
|
372
384
|
break;
|
|
373
385
|
case 'THREEDS_READY':
|
|
374
386
|
this.handle3DSReady();
|
|
375
387
|
break;
|
|
376
388
|
case 'THREEDS_COMPLETE':
|
|
377
|
-
|
|
389
|
+
this.postToIframe(data);
|
|
390
|
+
this.close3DSModal();
|
|
391
|
+
this.emitter.emit(SdkEvent.ThreeDSComplete);
|
|
392
|
+
break;
|
|
393
|
+
case 'THREEDS_CANCELED':
|
|
394
|
+
this.postToIframe(data);
|
|
395
|
+
this.close3DSModal();
|
|
396
|
+
this.emitter.emit(SdkEvent.ThreeDSCanceled);
|
|
397
|
+
break;
|
|
378
398
|
case 'THREEDS_ERROR':
|
|
379
399
|
this.postToIframe(data);
|
|
380
400
|
this.close3DSModal();
|
|
401
|
+
this.emitter.emit(SdkEvent.ThreeDSError, data.error);
|
|
381
402
|
break;
|
|
382
403
|
}
|
|
383
404
|
}
|
|
@@ -396,6 +417,9 @@ class CheckoutImpl {
|
|
|
396
417
|
this.iframe.src = this.buildSrc();
|
|
397
418
|
this.iframe.allow = 'payment *; clipboard-write';
|
|
398
419
|
this.iframe.setAttribute('frameborder', '0');
|
|
420
|
+
// Allow Payment Request API inside iframe and necessary sandbox permissions for wallets
|
|
421
|
+
this.iframe.setAttribute('allowpaymentrequest', 'true');
|
|
422
|
+
this.iframe.setAttribute('sandbox', 'allow-scripts allow-forms allow-same-origin allow-popups allow-popups-to-escape-sandbox');
|
|
399
423
|
// Apply default styles - just construct URL and assign to iframe
|
|
400
424
|
Object.assign(this.iframe.style, {
|
|
401
425
|
width: '100%',
|
|
@@ -603,5 +627,5 @@ const PaypercutCheckout = function (options) {
|
|
|
603
627
|
// Add static version property
|
|
604
628
|
PaypercutCheckout.version = config.version;
|
|
605
629
|
|
|
606
|
-
export { LOCALES, PaymentMethod, PaypercutCheckout, UIMode, WalletOption, PaypercutCheckout as default };
|
|
630
|
+
export { LOCALES, PaymentMethod, PaypercutCheckout, SdkEvent, UIMode, WalletOption, PaypercutCheckout as default };
|
|
607
631
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/utils/emitter.ts","../src/config.ts","../src/types/locales.ts","../src/types/checkout.ts","../src/index.ts"],"sourcesContent":["/**\n * Simple event emitter for handling checkout events\n * Supports subscribing, unsubscribing, and emitting events\n */\nexport class Emitter<T extends string = string> {\n private handlers = new Map<T, Set<Function>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n on(event: T, handler: Function): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n /**\n * Subscribe to an event that auto-unsubscribes after first emission\n *\n * Common use case: waiting for 'loaded' event or handling first 'success'.\n * Without this helper, developers would need to manually unsubscribe inside\n * their handler, which is error-prone and leads to memory leaks if forgotten.\n *\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n once(event: T, handler: Function): () => void {\n const wrappedHandler = (...args: any[]) => {\n handler(...args);\n this.off(event, wrappedHandler);\n };\n return this.on(event, wrappedHandler);\n }\n\n /**\n * Unsubscribe from an event\n * @param event - Event name to stop listening to\n * @param handler - Callback function to remove\n */\n off(event: T, handler: Function): void {\n this.handlers.get(event)?.delete(handler);\n }\n\n /**\n * Emit an event with optional arguments\n * @param event - Event name to emit\n * @param args - Arguments to pass to event handlers\n */\n emit(event: T, ...args: any[]): void {\n this.handlers.get(event)?.forEach(h => {\n try {\n h(...args);\n } catch (err) {\n console.error(`[Emitter] Error in ${event} handler:`, err);\n }\n });\n }\n\n /**\n * Clear all event handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n","/**\n * Build-time configuration\n * \n * This file is processed at build time with different values for:\n * - Production build (for merchants)\n * - Internal build (for team development)\n */\n\n/**\n * Build mode - replaced at build time\n */\ndeclare const __BUILD_MODE__: 'production' | 'internal';\n\n/**\n * SDK version - replaced at build time\n */\ndeclare const __VERSION__: string;\n\n/**\n * Configuration interface\n */\nexport interface BuildConfig {\n /** SDK version */\n version: string;\n \n /** Build mode */\n mode: 'production' | 'internal';\n \n /** Default checkout origin (production URL) */\n defaultCheckoutOrigin: string;\n \n /** Allowed origins for postMessage validation */\n allowedOrigins: string[];\n \n /** Whether hostedCheckoutUrl override is allowed */\n allowOriginOverride: boolean;\n}\n\n/**\n * Production configuration (for merchants)\n */\nconst productionConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'production',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n ],\n allowOriginOverride: false\n};\n\n/**\n * Internal configuration (for team development)\n */\nconst internalConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'internal',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n 'http://localhost:3000',\n 'http://localhost:3001',\n 'http://127.0.0.1:3000',\n 'http://127.0.0.1:3001'\n ],\n allowOriginOverride: true\n};\n\n/**\n * Active configuration (selected at build time)\n */\nexport const config: BuildConfig = __BUILD_MODE__ === 'internal' \n ? internalConfig \n : productionConfig;\n\n/**\n * Helper to check if origin is allowed\n */\nexport function isOriginAllowed(origin: string): boolean {\n return config.allowedOrigins.includes(origin);\n}\n\n/**\n * Get the checkout origin (with optional override for internal builds)\n */\nexport function getCheckoutOrigin(override?: string): string {\n // Only allow override in internal builds\n if (override && config.allowOriginOverride) {\n return override;\n }\n \n return config.defaultCheckoutOrigin;\n}\n\n","/**\n * Supported locales for Paypercut Checkout\n * \n * @remarks\n * Single source of truth for all supported locale codes.\n * \n * Supported languages:\n * - Bulgarian: 'bg', 'bg-BG'\n * - English: 'en', 'en-GB'\n * - Greek: 'el', 'el-GR'\n * - Romanian: 'ro', 'ro-RO'\n * - Croatian: 'hr', 'hr-HR'\n * - Polish: 'pl', 'pl-PL'\n * - Czech: 'cs', 'cs-CZ'\n * - Slovenian: 'sl', 'sl-SI'\n * - Slovak: 'sk', 'sk-SK'\n * \n * @example\n * ```typescript\n * const checkout = PaypercutCheckout({\n * locale: 'bg' // or 'bg-BG', 'en', 'en-GB', etc.\n * });\n * ```\n */\nexport const LOCALES = [\n 'bg', 'bg-BG',\n 'en', 'en-GB',\n 'el', 'el-GR',\n 'ro', 'ro-RO',\n 'hr', 'hr-HR',\n 'pl', 'pl-PL',\n 'cs', 'cs-CZ',\n 'sl', 'sl-SI',\n 'sk', 'sk-SK',\n] as const;\n\n/**\n * Locale type - union of all supported locale codes plus 'auto'\n * @example\n * ```typescript\n * const locale: Locale = 'bg';\n * const autoLocale: Locale = 'auto';\n * ```\n */\nexport type Locale = typeof LOCALES[number] | 'auto';\n\n/**\n * Fast runtime check using Set for O(1) lookup\n * @internal\n */\nconst LOCALE_SET: ReadonlySet<string> = new Set(LOCALES);\n\n/**\n * Normalize and validate locale\n * \n * @param locale - Locale code to normalize\n * @returns Normalized locale code or 'en' as fallback\n * \n * @remarks\n * - 'auto' or empty → 'en'\n * - Unsupported locale → 'en' with console warning\n * - Supported locale → original value\n * \n * @example\n * ```typescript\n * normalizeLocale('auto') // → 'en'\n * normalizeLocale('bg') // → 'bg'\n * normalizeLocale('de') // → 'en' (with warning)\n * ```\n */\nexport function normalizeLocale(locale: string | Locale): typeof LOCALES[number] | 'en' {\n if (!locale || locale === 'auto') return 'en';\n if (LOCALE_SET.has(locale)) return locale as typeof LOCALES[number];\n console.warn(`[PaypercutCheckout] Locale \"${locale}\" is not supported. Falling back to \"en\".`);\n return 'en';\n}\n\n","import { Locale } from './locales';\n\n/**\n * UI mode for checkout\n */\nexport enum UIMode {\n /** Custom UI mode - merchant provides their own submit button */\n CUSTOM = 'custom',\n /** Embedded mode - checkout embedded in merchant page */\n EMBEDDED = 'embedded',\n /** Hosted mode - full-page checkout experience */\n HOSTED = 'hosted',\n}\n\n/**\n * Type guard for UIMode\n */\nexport function isValidUIMode(value: string): value is UIMode {\n return Object.values(UIMode).includes(value as UIMode);\n}\n\n/**\n * Payment method types\n */\nexport enum PaymentMethod {\n /** Card payment (credit/debit) */\n CARD = 'card',\n}\n\n/**\n * Type guard for PaymentMethod\n */\nexport function isValidPaymentMethod(value: string): value is PaymentMethod {\n return Object.values(PaymentMethod).includes(value as PaymentMethod);\n}\n\n/**\n * Wallet options for digital wallets\n */\nexport enum WalletOption {\n /** Apple Pay */\n APPLE_PAY = 'apple_pay',\n /** Google Pay */\n GOOGLE_PAY = 'google_pay',\n}\n\n/**\n * Type guard for WalletOption\n */\nexport function isValidWalletOption(value: string): value is WalletOption {\n return Object.values(WalletOption).includes(value as WalletOption);\n}\n\n/**\n * Validate payment methods array\n */\nexport function validatePaymentMethods(methods: string[]): PaymentMethod[] {\n const validated: PaymentMethod[] = [];\n\n for (const method of methods) {\n if (isValidPaymentMethod(method)) {\n validated.push(method as PaymentMethod);\n } else {\n console.warn(`[PaypercutCheckout] Invalid payment method: \"${method}\". Skipping.`);\n }\n }\n\n // Default to card if no valid methods\n if (validated.length === 0) {\n console.warn('[PaypercutCheckout] No valid payment methods provided. Defaulting to \"card\".');\n validated.push(PaymentMethod.CARD);\n }\n\n return validated;\n}\n\n/**\n * Validate wallet options array\n */\nexport function validateWalletOptions(options: string[]): WalletOption[] {\n const validated: WalletOption[] = [];\n\n for (const option of options) {\n if (isValidWalletOption(option)) {\n validated.push(option as WalletOption);\n } else {\n console.warn(`[PaypercutCheckout] Invalid wallet option: \"${option}\". Skipping.`);\n }\n }\n\n return validated;\n}\n\n/**\n * Validate UI mode\n */\nexport function validateUIMode(mode: string | undefined): UIMode | undefined {\n if (!mode) {\n return undefined;\n }\n\n if (isValidUIMode(mode)) {\n return mode as UIMode;\n }\n\n console.warn(\n `[PaypercutCheckout] Invalid ui_mode: \"${mode}\". Valid options: ${Object.values(UIMode).join(', ')}`,\n );\n return undefined;\n}\n\n/**\n * Configuration options for PaypercutCheckout\n */\nexport interface PaypercutCheckoutOptions {\n /** Checkout session identifier (e.g., 'CHK_12345') */\n id: string;\n\n /** CSS selector or HTMLElement where iframe mounts (required) */\n containerId: string | HTMLElement;\n\n /**\n * Optional: Custom hosted checkout URL (only available in internal builds)\n * Production builds will ignore this option for security\n */\n hostedCheckoutUrl?: string;\n\n /**\n * Optional: Locale for checkout UI\n * @default 'en'\n */\n locale?: Locale | string;\n\n /**\n * Optional: UI mode for checkout\n */\n ui_mode?: UIMode | `${UIMode}`;\n\n /**\n * Optional: Payment methods to enable\n * @default ['card']\n */\n payment_methods?: (PaymentMethod | `${PaymentMethod}`)[];\n\n /**\n * Optional: Digital wallet options\n * Can include both or just one\n */\n wallet_options?: (WalletOption | `${WalletOption}`)[];\n\n /**\n * Optional: Show only the payment form without header/footer\n * @default false\n */\n form_only?: boolean;\n\n /**\n * Optional: Appearance options\n */\n appearance?: {\n preset?: 'inline' | 'modal';\n theme?: 'light' | 'dark' | 'none' | 'flat';\n variables: {};\n rules: {};\n labels: 'floating' | 'above' | 'none';\n };\n}\n\n/**\n * Event names that can be emitted by the checkout\n */\nexport type EventName =\n | 'loaded' // iframe finished loading\n | 'success' // payment successful\n | 'error' // payment or system error\n | 'expired'; // checkout expired or already paid\n\n/**\n * Checkout instance interface\n */\nexport interface CheckoutInstance {\n /** Mount and render the iframe into the container */\n render(): void;\n\n /** Submit payment - sends message to hosted checkout to confirm payment */\n submit(): void;\n\n /** Destroy instance and cleanup all listeners */\n destroy(): void;\n\n /** Subscribe to events. Returns unsubscribe function */\n on(event: EventName, handler: (...args: any[]) => void): () => void;\n\n /** Subscribe to event that auto-unsubscribes after first emission */\n once(event: EventName, handler: (...args: any[]) => void): () => void;\n\n /** Unsubscribe from events */\n off(event: EventName, handler: (...args: any[]) => void): void;\n\n /** Check if checkout is currently mounted */\n isMounted(): boolean;\n}\n\n/**\n * PaypercutCheckout static interface (callable and constructable)\n */\nexport interface PaypercutCheckoutStatic {\n /** Callable factory function */\n (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** Constructor support */\n new (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** SDK version */\n version: string;\n}\n","import { Emitter } from './utils/emitter';\nimport { config, isOriginAllowed, getCheckoutOrigin } from './config';\n\nimport {\n PaypercutCheckoutOptions,\n CheckoutInstance,\n PaypercutCheckoutStatic,\n EventName,\n validatePaymentMethods,\n validateWalletOptions,\n validateUIMode,\n} from './types';\nimport { normalizeLocale } from './types';\n\n// Re-export types and enums for consumers\nexport type { PaypercutCheckoutOptions, CheckoutInstance, PaypercutCheckoutStatic, EventName };\n\nexport { UIMode, PaymentMethod, WalletOption } from './types/checkout';\n\nexport type { Locale } from './types/locales';\nexport { LOCALES } from './types/locales';\n\n/**\n * Internal implementation of CheckoutInstance\n */\nclass CheckoutImpl implements CheckoutInstance {\n private emitter = new Emitter<EventName>();\n private mounted = false;\n private destroyed = false;\n private iframe: HTMLIFrameElement | null = null;\n private messageHandler: (evt: MessageEvent) => void;\n\n // 3DS Modal state\n private threeDSModal: HTMLDivElement | null = null;\n private threeDSIframe: HTMLIFrameElement | null = null;\n\n constructor(private options: PaypercutCheckoutOptions) {\n // Bind message handler\n this.messageHandler = this.onMessage.bind(this);\n window.addEventListener('message', this.messageHandler);\n }\n\n /**\n * Build the iframe source URL with query parameters\n */\n private buildSrc(): string {\n const baseUrl = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n const url = new URL(`/c/${this.options.id}`, baseUrl);\n\n // Add locale parameter\n if (this.options.locale) {\n const normalizedLocale = normalizeLocale(this.options.locale);\n url.searchParams.set('locale', normalizedLocale);\n }\n\n // Add ui_mode parameter\n if (this.options.ui_mode) {\n const validatedUIMode = validateUIMode(this.options.ui_mode);\n if (validatedUIMode) {\n url.searchParams.set('ui_mode', validatedUIMode);\n }\n }\n\n // Add payment_methods parameters (repeated for each method)\n if (this.options.payment_methods && this.options.payment_methods.length > 0) {\n const validatedMethods = validatePaymentMethods(this.options.payment_methods as string[]);\n validatedMethods.forEach((method) => {\n url.searchParams.append('payment_methods', method);\n });\n }\n\n // Add wallet_options parameters (repeated for each wallet)\n if (this.options.wallet_options && this.options.wallet_options.length > 0) {\n const validatedWallets = validateWalletOptions(this.options.wallet_options as string[]);\n validatedWallets.forEach((wallet) => {\n url.searchParams.append('wallet_options', wallet);\n });\n }\n\n if (this.options.appearance?.preset) {\n url.searchParams.set('preset', this.options.appearance.preset);\n }\n\n if (this.options.form_only !== undefined) {\n url.searchParams.set('form_only', String(this.options.form_only));\n }\n\n return url.toString();\n }\n\n /**\n * Get the container element from selector or HTMLElement\n */\n private getContainer(): HTMLElement {\n const container =\n typeof this.options.containerId === 'string'\n ? document.querySelector(this.options.containerId)\n : this.options.containerId;\n\n if (!container) {\n throw new Error(`Container not found: ${this.options.containerId}`);\n }\n\n return container as HTMLElement;\n }\n\n /**\n * Handle incoming postMessage events from iframe\n */\n private onMessage(evt: MessageEvent): void {\n // Validate origin against allowed origins (build-time whitelist)\n if (!isOriginAllowed(evt.origin)) {\n return;\n }\n\n // Validate structure\n const data = evt.data;\n if (!data || typeof data !== 'object' || !('type' in data)) {\n return;\n }\n\n // Filter messages by checkout session ID to prevent cross-instance message handling\n // This ensures each checkout instance only processes its own messages\n if (data.checkoutId && data.checkoutId !== this.options.id) {\n return; // Message is for a different checkout instance\n }\n\n // Handle specific events\n switch (data.type) {\n case 'CHECKOUT_LOADED':\n this.emitter.emit('loaded');\n break;\n case 'CHECKOUT_SUCCESS':\n this.emitter.emit('success');\n break;\n case 'CHECKOUT_ERROR':\n this.emitter.emit('error');\n break;\n case 'CHECKOUT_EXPIRED':\n this.emitter.emit('expired');\n break;\n case 'THREEDS_START_FLOW':\n this.show3DSModal(data);\n break;\n case 'THREEDS_READY':\n this.handle3DSReady();\n break;\n case 'THREEDS_COMPLETE':\n case 'THREEDS_CANCELLED':\n case 'THREEDS_ERROR':\n this.postToIframe(data);\n this.close3DSModal();\n break;\n }\n }\n\n /**\n * Render the checkout iframe into the container\n */\n render(): void {\n if (this.mounted) {\n return;\n }\n\n try {\n const container = this.getContainer();\n\n // Create iframe\n this.iframe = document.createElement('iframe');\n this.iframe.id = 'paypercut-checkout-iframe';\n this.iframe.src = this.buildSrc();\n this.iframe.allow = 'payment *; clipboard-write';\n this.iframe.setAttribute('frameborder', '0');\n\n // Apply default styles - just construct URL and assign to iframe\n Object.assign(this.iframe.style, {\n width: '100%',\n height: '100%',\n border: 'none',\n display: 'block',\n });\n\n // Listen for iframe load event (fallback)\n // This ensures 'loaded' event is always emitted even if hosted checkout\n // doesn't send CHECKOUT_LOADED message\n /*this.iframe.addEventListener('load', () => {\n this.emitter.emit('loaded');\n });*/\n\n container.appendChild(this.iframe);\n this.mounted = true;\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to render:', err);\n throw err;\n }\n }\n\n /**\n * Submit payment - sends message to hosted checkout to confirm payment\n */\n submit(): void {\n if (!this.mounted) {\n return;\n }\n\n try {\n this.postToIframe({\n type: 'START_PROCESSING',\n checkoutId: this.options.id,\n });\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to submit payment:', err);\n throw err;\n }\n }\n\n /**\n * Send message to hosted/embedded checkout iframe - used for submit payment and communicating 3DS events\n */\n private postToIframe(message: any): void {\n if (!this.iframe?.contentWindow) {\n console.error('[PaypercutCheckout] Cannot post message: iframe not mounted');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.iframe.contentWindow.postMessage(message, checkoutOrigin);\n }\n\n /**\n * Show 3DS modal with challenge/decoupled flow\n */\n private show3DSModal(data: {\n sessionId: string;\n step: 'challenge' | 'decoupled_waiting';\n challengeUrl?: string;\n acsTransactionId?: string;\n threeDSVersion?: string;\n cardBrand?: string;\n }): void {\n\n // Create modal backdrop\n this.threeDSModal = document.createElement('div');\n this.threeDSModal.id = 'paypercut-3ds-modal';\n Object.assign(this.threeDSModal.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n // backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '999999',\n });\n\n // Create container for iframe + close button\n const modalContainer = document.createElement('div');\n Object.assign(modalContainer.style, {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '#ffffff',\n borderRadius: '24px',\n });\n\n // Create iframe for 3DS page\n this.threeDSIframe = document.createElement('iframe');\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n\n // Build URL: baseUrl/c/{checkoutId}/threeds with query params\n const threeDSUrl = new URL(`/c/${this.options.id}/threeds`, checkoutOrigin);\n threeDSUrl.searchParams.set('sessionId', data.sessionId);\n threeDSUrl.searchParams.set('step', data.step);\n\n if (data.challengeUrl) {\n threeDSUrl.searchParams.set('challengeUrl', data.challengeUrl);\n }\n if (data.acsTransactionId) {\n threeDSUrl.searchParams.set('acsTransactionId', data.acsTransactionId);\n }\n if (data.threeDSVersion) {\n threeDSUrl.searchParams.set('threeDSVersion', data.threeDSVersion);\n }\n\n this.threeDSIframe.src = threeDSUrl.toString();\n this.threeDSIframe.allow = 'payment *';\n this.threeDSIframe.setAttribute('frameborder', '0');\n\n // Responsive modal sizing (60% of viewport, min 400px, max 800px width / 600px height)\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const modalWidth = Math.min(Math.max(viewportWidth * 0.6, 400), 800);\n const modalHeight = Math.min(Math.max(viewportHeight * 0.6, 400), 600);\n\n Object.assign(this.threeDSIframe.style, {\n width: `${modalWidth}px`,\n height: `${modalHeight}px`,\n border: 'none',\n borderRadius: '24px',\n backgroundColor: 'white',\n overflow: 'auto',\n });\n\n // Append iframe\n modalContainer.appendChild(this.threeDSIframe);\n\n // Append container to modal backdrop\n this.threeDSModal.appendChild(modalContainer);\n document.body.appendChild(this.threeDSModal);\n\n // Store 3DS data for later use\n (this as any).pending3DSData = data;\n }\n\n /**\n * Handle THREEDS_READY message - send THREEDS_INIT with challenge data\n */\n private handle3DSReady(): void {\n const data = (this as any).pending3DSData;\n if (!data || !this.threeDSIframe?.contentWindow) {\n console.error('[PaypercutCheckout] No pending 3DS data or iframe not ready');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.threeDSIframe.contentWindow.postMessage(\n {\n type: 'THREEDS_INIT',\n checkoutId: this.options.id,\n },\n checkoutOrigin,\n );\n }\n\n /**\n * Close 3DS modal and cleanup\n */\n private close3DSModal(): void {\n if (this.threeDSModal) {\n this.threeDSModal.remove();\n this.threeDSModal = null;\n }\n\n this.threeDSIframe = null;\n delete (this as any).pending3DSData;\n }\n\n /**\n * Destroy the checkout instance and cleanup (idempotent)\n */\n destroy(): void {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n // Remove iframe from DOM\n if (this.iframe) {\n try {\n this.iframe.remove();\n this.iframe = null;\n } catch (err) {\n console.error('[PaypercutCheckout] Error removing iframe:', err);\n }\n }\n\n // Cleanup 3DS modal if open\n this.close3DSModal();\n\n // Only set mounted = false after successful DOM removal\n this.mounted = false;\n this.destroyed = true;\n\n // Cleanup event listeners\n window.removeEventListener('message', this.messageHandler);\n this.emitter.clear();\n }\n\n /**\n * Subscribe to an event\n */\n on(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.on(event, handler);\n }\n\n /**\n * Subscribe to event that auto-unsubscribes after first emission\n */\n once(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.once(event, handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: EventName, handler: (...args: any[]) => void): void {\n this.emitter.off(event, handler);\n }\n\n /**\n * Check if checkout is currently mounted\n */\n isMounted(): boolean {\n return this.mounted;\n }\n}\n\n/**\n * Factory function that works both as callable and constructable.\n * Always returns a new CheckoutImpl instance - no prototype manipulation needed.\n */\nconst PaypercutCheckout: PaypercutCheckoutStatic = function (\n this: unknown,\n options: PaypercutCheckoutOptions,\n): CheckoutInstance {\n // Always return a new instance, regardless of how it's called\n return new CheckoutImpl(options);\n} as unknown as PaypercutCheckoutStatic;\n\n// Add static version property\n(PaypercutCheckout as any).version = config.version;\n\n// Export as default and named\nexport default PaypercutCheckout;\nexport { PaypercutCheckout };\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/utils/emitter.ts","../src/config.ts","../src/types/locales.ts","../src/types/checkout.ts","../src/index.ts"],"sourcesContent":["/**\n * Simple event emitter for handling checkout events\n * Supports subscribing, unsubscribing, and emitting events\n */\nexport class Emitter<T extends string = string> {\n private handlers = new Map<T, Set<Function>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n on(event: T, handler: Function): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n /**\n * Subscribe to an event that auto-unsubscribes after first emission\n *\n * Common use case: waiting for 'loaded' event or handling first 'success'.\n * Without this helper, developers would need to manually unsubscribe inside\n * their handler, which is error-prone and leads to memory leaks if forgotten.\n *\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n once(event: T, handler: Function): () => void {\n const wrappedHandler = (...args: any[]) => {\n handler(...args);\n this.off(event, wrappedHandler);\n };\n return this.on(event, wrappedHandler);\n }\n\n /**\n * Unsubscribe from an event\n * @param event - Event name to stop listening to\n * @param handler - Callback function to remove\n */\n off(event: T, handler: Function): void {\n this.handlers.get(event)?.delete(handler);\n }\n\n /**\n * Emit an event with optional arguments\n * @param event - Event name to emit\n * @param args - Arguments to pass to event handlers\n */\n emit(event: T, ...args: any[]): void {\n this.handlers.get(event)?.forEach(h => {\n try {\n h(...args);\n } catch (err) {\n console.error(`[Emitter] Error in ${event} handler:`, err);\n }\n });\n }\n\n /**\n * Clear all event handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n","/**\n * Build-time configuration\n * \n * This file is processed at build time with different values for:\n * - Production build (for merchants)\n * - Internal build (for team development)\n */\n\n/**\n * Build mode - replaced at build time\n */\ndeclare const __BUILD_MODE__: 'production' | 'internal';\n\n/**\n * SDK version - replaced at build time\n */\ndeclare const __VERSION__: string;\n\n/**\n * Configuration interface\n */\nexport interface BuildConfig {\n /** SDK version */\n version: string;\n \n /** Build mode */\n mode: 'production' | 'internal';\n \n /** Default checkout origin (production URL) */\n defaultCheckoutOrigin: string;\n \n /** Allowed origins for postMessage validation */\n allowedOrigins: string[];\n \n /** Whether hostedCheckoutUrl override is allowed */\n allowOriginOverride: boolean;\n}\n\n/**\n * Production configuration (for merchants)\n */\nconst productionConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'production',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n ],\n allowOriginOverride: false\n};\n\n/**\n * Internal configuration (for team development)\n */\nconst internalConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'internal',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n 'http://localhost:3000',\n 'http://localhost:3001',\n 'http://127.0.0.1:3000',\n 'http://127.0.0.1:3001'\n ],\n allowOriginOverride: true\n};\n\n/**\n * Active configuration (selected at build time)\n */\nexport const config: BuildConfig = __BUILD_MODE__ === 'internal' \n ? internalConfig \n : productionConfig;\n\n/**\n * Helper to check if origin is allowed\n */\nexport function isOriginAllowed(origin: string): boolean {\n return config.allowedOrigins.includes(origin);\n}\n\n/**\n * Get the checkout origin (with optional override for internal builds)\n */\nexport function getCheckoutOrigin(override?: string): string {\n // Only allow override in internal builds\n if (override && config.allowOriginOverride) {\n return override;\n }\n \n return config.defaultCheckoutOrigin;\n}\n\n","/**\n * Supported locales for Paypercut Checkout\n * \n * @remarks\n * Single source of truth for all supported locale codes.\n * \n * Supported languages:\n * - Bulgarian: 'bg', 'bg-BG'\n * - English: 'en', 'en-GB'\n * - Greek: 'el', 'el-GR'\n * - Romanian: 'ro', 'ro-RO'\n * - Croatian: 'hr', 'hr-HR'\n * - Polish: 'pl', 'pl-PL'\n * - Czech: 'cs', 'cs-CZ'\n * - Slovenian: 'sl', 'sl-SI'\n * - Slovak: 'sk', 'sk-SK'\n * \n * @example\n * ```typescript\n * const checkout = PaypercutCheckout({\n * locale: 'bg' // or 'bg-BG', 'en', 'en-GB', etc.\n * });\n * ```\n */\nexport const LOCALES = [\n 'bg', 'bg-BG',\n 'en', 'en-GB',\n 'el', 'el-GR',\n 'ro', 'ro-RO',\n 'hr', 'hr-HR',\n 'pl', 'pl-PL',\n 'cs', 'cs-CZ',\n 'sl', 'sl-SI',\n 'sk', 'sk-SK',\n] as const;\n\n/**\n * Locale type - union of all supported locale codes plus 'auto'\n * @example\n * ```typescript\n * const locale: Locale = 'bg';\n * const autoLocale: Locale = 'auto';\n * ```\n */\nexport type Locale = typeof LOCALES[number] | 'auto';\n\n/**\n * Fast runtime check using Set for O(1) lookup\n * @internal\n */\nconst LOCALE_SET: ReadonlySet<string> = new Set(LOCALES);\n\n/**\n * Normalize and validate locale\n * \n * @param locale - Locale code to normalize\n * @returns Normalized locale code or 'en' as fallback\n * \n * @remarks\n * - 'auto' or empty → 'en'\n * - Unsupported locale → 'en' with console warning\n * - Supported locale → original value\n * \n * @example\n * ```typescript\n * normalizeLocale('auto') // → 'en'\n * normalizeLocale('bg') // → 'bg'\n * normalizeLocale('de') // → 'en' (with warning)\n * ```\n */\nexport function normalizeLocale(locale: string | Locale): typeof LOCALES[number] | 'en' {\n if (!locale || locale === 'auto') return 'en';\n if (LOCALE_SET.has(locale)) return locale as typeof LOCALES[number];\n console.warn(`[PaypercutCheckout] Locale \"${locale}\" is not supported. Falling back to \"en\".`);\n return 'en';\n}\n\n","import { Locale } from './locales';\n\n/**\n * UI mode for checkout\n */\nexport enum UIMode {\n /** Embedded mode - checkout embedded in merchant page */\n EMBEDDED = 'embedded',\n}\n\n/**\n * Type guard for UIMode\n */\nexport function isValidUIMode(value: string): value is UIMode {\n return Object.values(UIMode).includes(value as UIMode);\n}\n\n/**\n * Payment method types\n */\nexport enum PaymentMethod {\n /** Card payment (credit/debit) */\n CARD = 'card',\n}\n\n/**\n * Type guard for PaymentMethod\n */\nexport function isValidPaymentMethod(value: string): value is PaymentMethod {\n return Object.values(PaymentMethod).includes(value as PaymentMethod);\n}\n\n/**\n * Wallet options for digital wallets\n */\nexport enum WalletOption {\n /** Apple Pay */\n APPLE_PAY = 'apple_pay',\n /** Google Pay */\n GOOGLE_PAY = 'google_pay',\n}\n\n/**\n * Type guard for WalletOption\n */\nexport function isValidWalletOption(value: string): value is WalletOption {\n return Object.values(WalletOption).includes(value as WalletOption);\n}\n\n/**\n * Validate payment methods array\n */\nexport function validatePaymentMethods(methods: string[]): PaymentMethod[] {\n const validated: PaymentMethod[] = [];\n\n for (const method of methods) {\n if (isValidPaymentMethod(method)) {\n validated.push(method as PaymentMethod);\n } else {\n console.warn(`[PaypercutCheckout] Invalid payment method: \"${method}\". Skipping.`);\n }\n }\n\n // Default to card if no valid methods\n if (validated.length === 0) {\n console.warn('[PaypercutCheckout] No valid payment methods provided. Defaulting to \"card\".');\n validated.push(PaymentMethod.CARD);\n }\n\n return validated;\n}\n\n/**\n * Validate wallet options array\n */\nexport function validateWalletOptions(options: string[]): WalletOption[] {\n const validated: WalletOption[] = [];\n\n for (const option of options) {\n if (isValidWalletOption(option)) {\n validated.push(option as WalletOption);\n } else {\n console.warn(`[PaypercutCheckout] Invalid wallet option: \"${option}\". Skipping.`);\n }\n }\n\n return validated;\n}\n\n/**\n * Validate UI mode\n */\nexport function validateUIMode(mode: string | undefined): UIMode | undefined {\n if (!mode) {\n return undefined;\n }\n\n if (isValidUIMode(mode)) {\n return mode as UIMode;\n }\n\n console.warn(\n `[PaypercutCheckout] Invalid ui_mode: \"${mode}\". Valid options: ${Object.values(UIMode).join(', ')}`,\n );\n return undefined;\n}\n\n/**\n * Configuration options for PaypercutCheckout\n */\nexport interface PaypercutCheckoutOptions {\n /** Checkout session identifier (e.g., 'CHK_12345') */\n id: string;\n\n /** CSS selector or HTMLElement where iframe mounts (required) */\n containerId: string | HTMLElement;\n\n /**\n * Optional: Custom hosted checkout URL (only available in internal builds)\n * Production builds will ignore this option for security\n */\n hostedCheckoutUrl?: string;\n\n /**\n * Optional: Locale for checkout UI\n * @default 'en'\n */\n locale?: Locale | string;\n\n /**\n * Optional: UI mode for checkout\n */\n ui_mode?: UIMode | `${UIMode}`;\n\n /**\n * Optional: Payment methods to enable\n * @default ['card']\n */\n payment_methods?: (PaymentMethod | `${PaymentMethod}`)[];\n\n /**\n * Optional: Digital wallet options\n * Can include both or just one\n */\n wallet_options?: (WalletOption | `${WalletOption}`)[];\n\n /**\n * Optional: Show only the payment form without header/footer\n * @default false\n */\n form_only?: boolean;\n\n /**\n * Optional: Appearance options\n */\n appearance?: {\n preset?: 'inline' | 'modal';\n theme?: 'light' | 'dark' | 'none' | 'flat';\n variables: {};\n rules: {};\n labels: 'floating' | 'above' | 'none';\n };\n}\n\n/**\n * Event names that can be emitted by the checkout\n */\nexport type EventName =\n | 'loaded' // iframe finished loading\n | 'success' // payment successful\n | 'error' // payment or system error\n | 'expired' // checkout expired or already paid\n | 'threeds_complete' // checkout paid successfully\n | 'threeds_error' // checkout threeds error\n | 'threeds_canceled' // checkout threeds canceled\n | 'threeds_started'; // checkout threeds started\n\n/**\n * Preferred enum for SDK event names (use instead of hardcoded strings)\n */\nexport enum SdkEvent {\n Loaded = 'loaded',\n Success = 'success',\n Error = 'error',\n Expired = 'expired',\n ThreeDSComplete = 'threeds_complete',\n ThreeDSError = 'threeds_error',\n ThreeDSCanceled = 'threeds_canceled',\n ThreeDSStarted = 'threeds_started',\n}\n\n/**\n * Checkout instance interface\n */\nexport interface CheckoutInstance {\n /** Mount and render the iframe into the container */\n render(): void;\n\n /** Submit payment - sends message to hosted checkout to confirm payment */\n submit(): void;\n\n /** Destroy instance and cleanup all listeners */\n destroy(): void;\n\n /** Subscribe to events. Returns unsubscribe function */\n on(event: EventName | SdkEvent, handler: (...args: any[]) => void): () => void;\n\n /** Subscribe to event that auto-unsubscribes after first emission */\n once(event: EventName | SdkEvent, handler: (...args: any[]) => void): () => void;\n\n /** Unsubscribe from events */\n off(event: EventName | SdkEvent, handler: (...args: any[]) => void): void;\n\n /** Check if checkout is currently mounted */\n isMounted(): boolean;\n}\n\n/**\n * PaypercutCheckout static interface (callable and constructable)\n */\nexport interface PaypercutCheckoutStatic {\n /** Callable factory function */\n (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** Constructor support */\n new (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** SDK version */\n version: string;\n}\n","import { Emitter } from './utils/emitter';\nimport { config, isOriginAllowed, getCheckoutOrigin } from './config';\n\nimport {\n PaypercutCheckoutOptions,\n CheckoutInstance,\n PaypercutCheckoutStatic,\n EventName,\n SdkEvent,\n validatePaymentMethods,\n validateWalletOptions,\n validateUIMode,\n UIMode,\n} from './types';\nimport { normalizeLocale } from './types';\n\n// Re-export types and enums for consumers\nexport type { PaypercutCheckoutOptions, CheckoutInstance, PaypercutCheckoutStatic, EventName };\n\nexport { UIMode, PaymentMethod, WalletOption } from './types/checkout';\n\n\n// Re-export SDK event enums for consumers\nexport { SdkEvent } from './types/checkout';\n\nexport type { Locale } from './types/locales';\nexport { LOCALES } from './types/locales';\n\n/**\n * Internal implementation of CheckoutInstance\n */\nclass CheckoutImpl implements CheckoutInstance {\n private emitter = new Emitter<EventName>();\n private mounted = false;\n private destroyed = false;\n private iframe: HTMLIFrameElement | null = null;\n private messageHandler: (evt: MessageEvent) => void;\n\n // 3DS Modal state\n private threeDSModal: HTMLDivElement | null = null;\n private threeDSIframe: HTMLIFrameElement | null = null;\n\n constructor(private options: PaypercutCheckoutOptions) {\n // Bind message handler\n this.messageHandler = this.onMessage.bind(this);\n window.addEventListener('message', this.messageHandler);\n }\n\n /**\n * Build the iframe source URL with query parameters\n */\n private buildSrc(): string {\n const baseUrl = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n const url = new URL(`/c/${this.options.id}`, baseUrl);\n\n // Add locale parameter\n if (this.options.locale) {\n const normalizedLocale = normalizeLocale(this.options.locale);\n url.searchParams.set('locale', normalizedLocale);\n }\n\n // Add ui_mode parameter (default to 'embedded')\n {\n const selected = validateUIMode(this.options.ui_mode ?? UIMode.EMBEDDED);\n if (selected) {\n url.searchParams.set('ui_mode', selected);\n }\n }\n\n // Add payment_methods parameters (repeated for each method)\n if (this.options.payment_methods && this.options.payment_methods.length > 0) {\n const validatedMethods = validatePaymentMethods(this.options.payment_methods as string[]);\n validatedMethods.forEach((method) => {\n url.searchParams.append('payment_methods', method);\n });\n }\n\n // Add wallet_options parameters (repeated for each wallet)\n if (this.options.wallet_options && this.options.wallet_options.length > 0) {\n const validatedWallets = validateWalletOptions(this.options.wallet_options as string[]);\n validatedWallets.forEach((wallet) => {\n url.searchParams.append('wallet_options', wallet);\n });\n }\n\n if (this.options.appearance?.preset) {\n url.searchParams.set('preset', this.options.appearance.preset);\n }\n\n if (this.options.form_only !== undefined) {\n url.searchParams.set('form_only', String(this.options.form_only));\n }\n\n return url.toString();\n }\n\n /**\n * Get the container element from selector or HTMLElement\n */\n private getContainer(): HTMLElement {\n const container =\n typeof this.options.containerId === 'string'\n ? document.querySelector(this.options.containerId)\n : this.options.containerId;\n\n if (!container) {\n throw new Error(`Container not found: ${this.options.containerId}`);\n }\n\n return container as HTMLElement;\n }\n\n /**\n * Handle incoming postMessage events from iframe\n */\n private onMessage(evt: MessageEvent): void {\n // Validate origin against allowed origins (build-time whitelist)\n if (!isOriginAllowed(evt.origin)) {\n return;\n }\n\n // Validate structure\n const data = evt.data;\n if (!data || typeof data !== 'object' || !('type' in data)) {\n return;\n }\n\n // Filter messages by checkout session ID to prevent cross-instance message handling\n // This ensures each checkout instance only processes its own messages\n if (data.checkoutId && data.checkoutId !== this.options.id) {\n return; // Message is for a different checkout instance\n }\n\n // Handle specific events\n switch (data.type) {\n case 'CHECKOUT_LOADED':\n this.emitter.emit(SdkEvent.Loaded);\n break;\n case 'CHECKOUT_SUCCESS':\n this.emitter.emit(SdkEvent.Success);\n break;\n case 'CHECKOUT_ERROR':\n // Forward error payload (if provided) to SDK consumers\n this.emitter.emit(SdkEvent.Error, (data && (data as any).error) ?? data);\n break;\n case 'CHECKOUT_EXPIRED':\n this.emitter.emit(SdkEvent.Expired);\n break;\n case 'THREEDS_START_FLOW':\n this.show3DSModal(data);\n this.emitter.emit(SdkEvent.ThreeDSStarted);\n break;\n case 'THREEDS_READY':\n this.handle3DSReady();\n break;\n case 'THREEDS_COMPLETE':\n this.postToIframe(data);\n this.close3DSModal();\n this.emitter.emit(SdkEvent.ThreeDSComplete);\n break;\n case 'THREEDS_CANCELED':\n this.postToIframe(data);\n this.close3DSModal();\n this.emitter.emit(SdkEvent.ThreeDSCanceled);\n break;\n case 'THREEDS_ERROR':\n this.postToIframe(data);\n this.close3DSModal();\n this.emitter.emit(SdkEvent.ThreeDSError, data.error);\n break;\n }\n }\n\n /**\n * Render the checkout iframe into the container\n */\n render(): void {\n if (this.mounted) {\n return;\n }\n\n try {\n const container = this.getContainer();\n\n // Create iframe\n this.iframe = document.createElement('iframe');\n this.iframe.id = 'paypercut-checkout-iframe';\n this.iframe.src = this.buildSrc();\n this.iframe.allow = 'payment *; clipboard-write';\n this.iframe.setAttribute('frameborder', '0');\n // Allow Payment Request API inside iframe and necessary sandbox permissions for wallets\n this.iframe.setAttribute('allowpaymentrequest', 'true');\n this.iframe.setAttribute(\n 'sandbox',\n 'allow-scripts allow-forms allow-same-origin allow-popups allow-popups-to-escape-sandbox',\n );\n\n\n // Apply default styles - just construct URL and assign to iframe\n Object.assign(this.iframe.style, {\n width: '100%',\n height: '100%',\n border: 'none',\n display: 'block',\n });\n\n // Listen for iframe load event (fallback)\n // This ensures 'loaded' event is always emitted even if hosted checkout\n // doesn't send CHECKOUT_LOADED message\n /*this.iframe.addEventListener('load', () => {\n this.emitter.emit('loaded');\n });*/\n\n container.appendChild(this.iframe);\n this.mounted = true;\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to render:', err);\n throw err;\n }\n }\n\n /**\n * Submit payment - sends message to hosted checkout to confirm payment\n */\n submit(): void {\n if (!this.mounted) {\n return;\n }\n\n try {\n this.postToIframe({\n type: 'START_PROCESSING',\n checkoutId: this.options.id,\n });\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to submit payment:', err);\n throw err;\n }\n }\n\n /**\n * Send message to hosted/embedded checkout iframe - used for submit payment and communicating 3DS events\n */\n private postToIframe(message: any): void {\n if (!this.iframe?.contentWindow) {\n console.error('[PaypercutCheckout] Cannot post message: iframe not mounted');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.iframe.contentWindow.postMessage(message, checkoutOrigin);\n }\n\n /**\n * Show 3DS modal with challenge/decoupled flow\n */\n private show3DSModal(data: {\n sessionId: string;\n step: 'challenge' | 'decoupled_waiting';\n challengeUrl?: string;\n acsTransactionId?: string;\n threeDSVersion?: string;\n cardBrand?: string;\n }): void {\n\n // Create modal backdrop\n this.threeDSModal = document.createElement('div');\n this.threeDSModal.id = 'paypercut-3ds-modal';\n Object.assign(this.threeDSModal.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n // backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '999999',\n });\n\n // Create container for iframe + close button\n const modalContainer = document.createElement('div');\n Object.assign(modalContainer.style, {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '#ffffff',\n borderRadius: '24px',\n });\n\n // Create iframe for 3DS page\n this.threeDSIframe = document.createElement('iframe');\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n\n // Build URL: baseUrl/c/{checkoutId}/threeds with query params\n const threeDSUrl = new URL(`/c/${this.options.id}/threeds`, checkoutOrigin);\n threeDSUrl.searchParams.set('sessionId', data.sessionId);\n threeDSUrl.searchParams.set('step', data.step);\n\n if (data.challengeUrl) {\n threeDSUrl.searchParams.set('challengeUrl', data.challengeUrl);\n }\n if (data.acsTransactionId) {\n threeDSUrl.searchParams.set('acsTransactionId', data.acsTransactionId);\n }\n if (data.threeDSVersion) {\n threeDSUrl.searchParams.set('threeDSVersion', data.threeDSVersion);\n }\n\n this.threeDSIframe.src = threeDSUrl.toString();\n this.threeDSIframe.allow = 'payment *';\n this.threeDSIframe.setAttribute('frameborder', '0');\n\n // Responsive modal sizing (60% of viewport, min 400px, max 800px width / 600px height)\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const modalWidth = Math.min(Math.max(viewportWidth * 0.6, 400), 800);\n const modalHeight = Math.min(Math.max(viewportHeight * 0.6, 400), 600);\n\n Object.assign(this.threeDSIframe.style, {\n width: `${modalWidth}px`,\n height: `${modalHeight}px`,\n border: 'none',\n borderRadius: '24px',\n backgroundColor: 'white',\n overflow: 'auto',\n });\n\n // Append iframe\n modalContainer.appendChild(this.threeDSIframe);\n\n // Append container to modal backdrop\n this.threeDSModal.appendChild(modalContainer);\n document.body.appendChild(this.threeDSModal);\n\n // Store 3DS data for later use\n (this as any).pending3DSData = data;\n }\n\n /**\n * Handle THREEDS_READY message - send THREEDS_INIT with challenge data\n */\n private handle3DSReady(): void {\n const data = (this as any).pending3DSData;\n if (!data || !this.threeDSIframe?.contentWindow) {\n console.error('[PaypercutCheckout] No pending 3DS data or iframe not ready');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.threeDSIframe.contentWindow.postMessage(\n {\n type: 'THREEDS_INIT',\n checkoutId: this.options.id,\n },\n checkoutOrigin,\n );\n }\n\n /**\n * Close 3DS modal and cleanup\n */\n private close3DSModal(): void {\n if (this.threeDSModal) {\n this.threeDSModal.remove();\n this.threeDSModal = null;\n }\n\n this.threeDSIframe = null;\n delete (this as any).pending3DSData;\n }\n\n /**\n * Destroy the checkout instance and cleanup (idempotent)\n */\n destroy(): void {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n // Remove iframe from DOM\n if (this.iframe) {\n try {\n this.iframe.remove();\n this.iframe = null;\n } catch (err) {\n console.error('[PaypercutCheckout] Error removing iframe:', err);\n }\n }\n\n // Cleanup 3DS modal if open\n this.close3DSModal();\n\n // Only set mounted = false after successful DOM removal\n this.mounted = false;\n this.destroyed = true;\n\n // Cleanup event listeners\n window.removeEventListener('message', this.messageHandler);\n this.emitter.clear();\n }\n\n /**\n * Subscribe to an event\n */\n on(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.on(event, handler);\n }\n\n /**\n * Subscribe to event that auto-unsubscribes after first emission\n */\n once(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.once(event, handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: EventName, handler: (...args: any[]) => void): void {\n this.emitter.off(event, handler);\n }\n\n /**\n * Check if checkout is currently mounted\n */\n isMounted(): boolean {\n return this.mounted;\n }\n}\n\n/**\n * Factory function that works both as callable and constructable.\n * Always returns a new CheckoutImpl instance - no prototype manipulation needed.\n */\nconst PaypercutCheckout: PaypercutCheckoutStatic = function (\n this: unknown,\n options: PaypercutCheckoutOptions,\n): CheckoutInstance {\n // Always return a new instance, regardless of how it's called\n return new CheckoutImpl(options);\n} as unknown as PaypercutCheckoutStatic;\n\n// Add static version property\n(PaypercutCheckout as any).version = config.version;\n\n// Export as default and named\nexport default PaypercutCheckout;\nexport { PaypercutCheckout };\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var PaypercutCheckout=function(){"use strict";class e{constructor(){this.handlers=new Map}on(e,t){return this.handlers.has(e)||this.handlers.set(e,new Set),this.handlers.get(e).add(t),()=>this.off(e,t)}once(e,t){const
|
|
1
|
+
var PaypercutCheckout=function(){"use strict";class e{constructor(){this.handlers=new Map}on(e,t){return this.handlers.has(e)||this.handlers.set(e,new Set),this.handlers.get(e).add(t),()=>this.off(e,t)}once(e,t){const s=(...o)=>{t(...o),this.off(e,s)};return this.on(e,s)}off(e,t){this.handlers.get(e)?.delete(t)}emit(e,...t){this.handlers.get(e)?.forEach(s=>{try{s(...t)}catch(t){console.error(`[Emitter] Error in ${e} handler:`,t)}})}clear(){this.handlers.clear()}}const t={version:"1.0.7",defaultCheckoutOrigin:"https://buy.paypercut.io",allowedOrigins:["https://buy.paypercut.io"]};function s(e){return t.defaultCheckoutOrigin}const o=new Set(["bg","bg-BG","en","en-GB","el","el-GR","ro","ro-RO","hr","hr-HR","pl","pl-PL","cs","cs-CZ","sl","sl-SI","sk","sk-SK"]);var r,i,n,a;function h(e){return Object.values(i).includes(e)}function c(e){return Object.values(n).includes(e)}function d(e){var t;if(e)return t=e,Object.values(r).includes(t)?e:void console.warn(`[PaypercutCheckout] Invalid ui_mode: "${e}". Valid options: ${Object.values(r).join(", ")}`)}!function(e){e.EMBEDDED="embedded"}(r||(r={})),function(e){e.CARD="card"}(i||(i={})),function(e){e.APPLE_PAY="apple_pay",e.GOOGLE_PAY="google_pay"}(n||(n={})),function(e){e.Loaded="loaded",e.Success="success",e.Error="error",e.Expired="expired",e.ThreeDSComplete="threeds_complete",e.ThreeDSError="threeds_error",e.ThreeDSCanceled="threeds_canceled",e.ThreeDSStarted="threeds_started"}(a||(a={}));class l{constructor(t){this.options=t,this.emitter=new e,this.mounted=!1,this.destroyed=!1,this.iframe=null,this.threeDSModal=null,this.threeDSIframe=null,this.messageHandler=this.onMessage.bind(this),window.addEventListener("message",this.messageHandler)}buildSrc(){const e=s(this.options.hostedCheckoutUrl),t=new URL(`/c/${this.options.id}`,e);if(this.options.locale){const e=(n=this.options.locale)&&"auto"!==n?o.has(n)?n:(console.warn(`[PaypercutCheckout] Locale "${n}" is not supported. Falling back to "en".`),"en"):"en";t.searchParams.set("locale",e)}var n;{const e=d(this.options.ui_mode??r.EMBEDDED);e&&t.searchParams.set("ui_mode",e)}if(this.options.payment_methods&&this.options.payment_methods.length>0){(function(e){const t=[];for(const s of e)h(s)?t.push(s):console.warn(`[PaypercutCheckout] Invalid payment method: "${s}". Skipping.`);return 0===t.length&&(console.warn('[PaypercutCheckout] No valid payment methods provided. Defaulting to "card".'),t.push(i.CARD)),t})(this.options.payment_methods).forEach(e=>{t.searchParams.append("payment_methods",e)})}if(this.options.wallet_options&&this.options.wallet_options.length>0){(function(e){const t=[];for(const s of e)c(s)?t.push(s):console.warn(`[PaypercutCheckout] Invalid wallet option: "${s}". Skipping.`);return t})(this.options.wallet_options).forEach(e=>{t.searchParams.append("wallet_options",e)})}return this.options.appearance?.preset&&t.searchParams.set("preset",this.options.appearance.preset),void 0!==this.options.form_only&&t.searchParams.set("form_only",String(this.options.form_only)),t.toString()}getContainer(){const e="string"==typeof this.options.containerId?document.querySelector(this.options.containerId):this.options.containerId;if(!e)throw new Error(`Container not found: ${this.options.containerId}`);return e}onMessage(e){if(s=e.origin,!t.allowedOrigins.includes(s))return;var s;const o=e.data;if(o&&"object"==typeof o&&"type"in o&&(!o.checkoutId||o.checkoutId===this.options.id))switch(o.type){case"CHECKOUT_LOADED":this.emitter.emit(a.Loaded);break;case"CHECKOUT_SUCCESS":this.emitter.emit(a.Success);break;case"CHECKOUT_ERROR":this.emitter.emit(a.Error,(o&&o.error)??o);break;case"CHECKOUT_EXPIRED":this.emitter.emit(a.Expired);break;case"THREEDS_START_FLOW":this.show3DSModal(o),this.emitter.emit(a.ThreeDSStarted);break;case"THREEDS_READY":this.handle3DSReady();break;case"THREEDS_COMPLETE":this.postToIframe(o),this.close3DSModal(),this.emitter.emit(a.ThreeDSComplete);break;case"THREEDS_CANCELED":this.postToIframe(o),this.close3DSModal(),this.emitter.emit(a.ThreeDSCanceled);break;case"THREEDS_ERROR":this.postToIframe(o),this.close3DSModal(),this.emitter.emit(a.ThreeDSError,o.error)}}render(){if(!this.mounted)try{const e=this.getContainer();this.iframe=document.createElement("iframe"),this.iframe.id="paypercut-checkout-iframe",this.iframe.src=this.buildSrc(),this.iframe.allow="payment *; clipboard-write",this.iframe.setAttribute("frameborder","0"),this.iframe.setAttribute("allowpaymentrequest","true"),this.iframe.setAttribute("sandbox","allow-scripts allow-forms allow-same-origin allow-popups allow-popups-to-escape-sandbox"),Object.assign(this.iframe.style,{width:"100%",height:"100%",border:"none",display:"block"}),e.appendChild(this.iframe),this.mounted=!0}catch(e){throw console.error("[PaypercutCheckout] Failed to render:",e),e}}submit(){if(this.mounted)try{this.postToIframe({type:"START_PROCESSING",checkoutId:this.options.id})}catch(e){throw console.error("[PaypercutCheckout] Failed to submit payment:",e),e}}postToIframe(e){if(!this.iframe?.contentWindow)return void console.error("[PaypercutCheckout] Cannot post message: iframe not mounted");const t=s(this.options.hostedCheckoutUrl);this.iframe.contentWindow.postMessage(e,t)}show3DSModal(e){this.threeDSModal=document.createElement("div"),this.threeDSModal.id="paypercut-3ds-modal",Object.assign(this.threeDSModal.style,{position:"fixed",top:"0",left:"0",width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"999999"});const t=document.createElement("div");Object.assign(t.style,{position:"relative",display:"flex",flexDirection:"column",backgroundColor:"#ffffff",borderRadius:"24px"}),this.threeDSIframe=document.createElement("iframe");const o=s(this.options.hostedCheckoutUrl),r=new URL(`/c/${this.options.id}/threeds`,o);r.searchParams.set("sessionId",e.sessionId),r.searchParams.set("step",e.step),e.challengeUrl&&r.searchParams.set("challengeUrl",e.challengeUrl),e.acsTransactionId&&r.searchParams.set("acsTransactionId",e.acsTransactionId),e.threeDSVersion&&r.searchParams.set("threeDSVersion",e.threeDSVersion),this.threeDSIframe.src=r.toString(),this.threeDSIframe.allow="payment *",this.threeDSIframe.setAttribute("frameborder","0");const i=window.innerWidth,n=window.innerHeight,a=Math.min(Math.max(.6*i,400),800),h=Math.min(Math.max(.6*n,400),600);Object.assign(this.threeDSIframe.style,{width:`${a}px`,height:`${h}px`,border:"none",borderRadius:"24px",backgroundColor:"white",overflow:"auto"}),t.appendChild(this.threeDSIframe),this.threeDSModal.appendChild(t),document.body.appendChild(this.threeDSModal),this.pending3DSData=e}handle3DSReady(){if(!this.pending3DSData||!this.threeDSIframe?.contentWindow)return void console.error("[PaypercutCheckout] No pending 3DS data or iframe not ready");const e=s(this.options.hostedCheckoutUrl);this.threeDSIframe.contentWindow.postMessage({type:"THREEDS_INIT",checkoutId:this.options.id},e)}close3DSModal(){this.threeDSModal&&(this.threeDSModal.remove(),this.threeDSModal=null),this.threeDSIframe=null,delete this.pending3DSData}destroy(){if(!this.destroyed){if(this.iframe)try{this.iframe.remove(),this.iframe=null}catch(e){console.error("[PaypercutCheckout] Error removing iframe:",e)}this.close3DSModal(),this.mounted=!1,this.destroyed=!0,window.removeEventListener("message",this.messageHandler),this.emitter.clear()}}on(e,t){return this.emitter.on(e,t)}once(e,t){return this.emitter.once(e,t)}off(e,t){this.emitter.off(e,t)}isMounted(){return this.mounted}}const p=function(e){return new l(e)};return p.version=t.version,p}();
|
|
2
2
|
//# sourceMappingURL=paypercut-checkout.iife.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paypercut-checkout.iife.min.js","sources":["../src/utils/emitter.ts","../src/config.ts","../src/types/locales.ts","../src/types/checkout.ts","../src/index.ts"],"sourcesContent":["/**\n * Simple event emitter for handling checkout events\n * Supports subscribing, unsubscribing, and emitting events\n */\nexport class Emitter<T extends string = string> {\n private handlers = new Map<T, Set<Function>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n on(event: T, handler: Function): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n /**\n * Subscribe to an event that auto-unsubscribes after first emission\n *\n * Common use case: waiting for 'loaded' event or handling first 'success'.\n * Without this helper, developers would need to manually unsubscribe inside\n * their handler, which is error-prone and leads to memory leaks if forgotten.\n *\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n once(event: T, handler: Function): () => void {\n const wrappedHandler = (...args: any[]) => {\n handler(...args);\n this.off(event, wrappedHandler);\n };\n return this.on(event, wrappedHandler);\n }\n\n /**\n * Unsubscribe from an event\n * @param event - Event name to stop listening to\n * @param handler - Callback function to remove\n */\n off(event: T, handler: Function): void {\n this.handlers.get(event)?.delete(handler);\n }\n\n /**\n * Emit an event with optional arguments\n * @param event - Event name to emit\n * @param args - Arguments to pass to event handlers\n */\n emit(event: T, ...args: any[]): void {\n this.handlers.get(event)?.forEach(h => {\n try {\n h(...args);\n } catch (err) {\n console.error(`[Emitter] Error in ${event} handler:`, err);\n }\n });\n }\n\n /**\n * Clear all event handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n","/**\n * Build-time configuration\n * \n * This file is processed at build time with different values for:\n * - Production build (for merchants)\n * - Internal build (for team development)\n */\n\n/**\n * Build mode - replaced at build time\n */\ndeclare const __BUILD_MODE__: 'production' | 'internal';\n\n/**\n * SDK version - replaced at build time\n */\ndeclare const __VERSION__: string;\n\n/**\n * Configuration interface\n */\nexport interface BuildConfig {\n /** SDK version */\n version: string;\n \n /** Build mode */\n mode: 'production' | 'internal';\n \n /** Default checkout origin (production URL) */\n defaultCheckoutOrigin: string;\n \n /** Allowed origins for postMessage validation */\n allowedOrigins: string[];\n \n /** Whether hostedCheckoutUrl override is allowed */\n allowOriginOverride: boolean;\n}\n\n/**\n * Production configuration (for merchants)\n */\nconst productionConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'production',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n ],\n allowOriginOverride: false\n};\n\n/**\n * Internal configuration (for team development)\n */\nconst internalConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'internal',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n 'http://localhost:3000',\n 'http://localhost:3001',\n 'http://127.0.0.1:3000',\n 'http://127.0.0.1:3001'\n ],\n allowOriginOverride: true\n};\n\n/**\n * Active configuration (selected at build time)\n */\nexport const config: BuildConfig = __BUILD_MODE__ === 'internal' \n ? internalConfig \n : productionConfig;\n\n/**\n * Helper to check if origin is allowed\n */\nexport function isOriginAllowed(origin: string): boolean {\n return config.allowedOrigins.includes(origin);\n}\n\n/**\n * Get the checkout origin (with optional override for internal builds)\n */\nexport function getCheckoutOrigin(override?: string): string {\n // Only allow override in internal builds\n if (override && config.allowOriginOverride) {\n return override;\n }\n \n return config.defaultCheckoutOrigin;\n}\n\n","/**\n * Supported locales for Paypercut Checkout\n * \n * @remarks\n * Single source of truth for all supported locale codes.\n * \n * Supported languages:\n * - Bulgarian: 'bg', 'bg-BG'\n * - English: 'en', 'en-GB'\n * - Greek: 'el', 'el-GR'\n * - Romanian: 'ro', 'ro-RO'\n * - Croatian: 'hr', 'hr-HR'\n * - Polish: 'pl', 'pl-PL'\n * - Czech: 'cs', 'cs-CZ'\n * - Slovenian: 'sl', 'sl-SI'\n * - Slovak: 'sk', 'sk-SK'\n * \n * @example\n * ```typescript\n * const checkout = PaypercutCheckout({\n * locale: 'bg' // or 'bg-BG', 'en', 'en-GB', etc.\n * });\n * ```\n */\nexport const LOCALES = [\n 'bg', 'bg-BG',\n 'en', 'en-GB',\n 'el', 'el-GR',\n 'ro', 'ro-RO',\n 'hr', 'hr-HR',\n 'pl', 'pl-PL',\n 'cs', 'cs-CZ',\n 'sl', 'sl-SI',\n 'sk', 'sk-SK',\n] as const;\n\n/**\n * Locale type - union of all supported locale codes plus 'auto'\n * @example\n * ```typescript\n * const locale: Locale = 'bg';\n * const autoLocale: Locale = 'auto';\n * ```\n */\nexport type Locale = typeof LOCALES[number] | 'auto';\n\n/**\n * Fast runtime check using Set for O(1) lookup\n * @internal\n */\nconst LOCALE_SET: ReadonlySet<string> = new Set(LOCALES);\n\n/**\n * Normalize and validate locale\n * \n * @param locale - Locale code to normalize\n * @returns Normalized locale code or 'en' as fallback\n * \n * @remarks\n * - 'auto' or empty → 'en'\n * - Unsupported locale → 'en' with console warning\n * - Supported locale → original value\n * \n * @example\n * ```typescript\n * normalizeLocale('auto') // → 'en'\n * normalizeLocale('bg') // → 'bg'\n * normalizeLocale('de') // → 'en' (with warning)\n * ```\n */\nexport function normalizeLocale(locale: string | Locale): typeof LOCALES[number] | 'en' {\n if (!locale || locale === 'auto') return 'en';\n if (LOCALE_SET.has(locale)) return locale as typeof LOCALES[number];\n console.warn(`[PaypercutCheckout] Locale \"${locale}\" is not supported. Falling back to \"en\".`);\n return 'en';\n}\n\n","import { Locale } from './locales';\n\n/**\n * UI mode for checkout\n */\nexport enum UIMode {\n /** Custom UI mode - merchant provides their own submit button */\n CUSTOM = 'custom',\n /** Embedded mode - checkout embedded in merchant page */\n EMBEDDED = 'embedded',\n /** Hosted mode - full-page checkout experience */\n HOSTED = 'hosted',\n}\n\n/**\n * Type guard for UIMode\n */\nexport function isValidUIMode(value: string): value is UIMode {\n return Object.values(UIMode).includes(value as UIMode);\n}\n\n/**\n * Payment method types\n */\nexport enum PaymentMethod {\n /** Card payment (credit/debit) */\n CARD = 'card',\n}\n\n/**\n * Type guard for PaymentMethod\n */\nexport function isValidPaymentMethod(value: string): value is PaymentMethod {\n return Object.values(PaymentMethod).includes(value as PaymentMethod);\n}\n\n/**\n * Wallet options for digital wallets\n */\nexport enum WalletOption {\n /** Apple Pay */\n APPLE_PAY = 'apple_pay',\n /** Google Pay */\n GOOGLE_PAY = 'google_pay',\n}\n\n/**\n * Type guard for WalletOption\n */\nexport function isValidWalletOption(value: string): value is WalletOption {\n return Object.values(WalletOption).includes(value as WalletOption);\n}\n\n/**\n * Validate payment methods array\n */\nexport function validatePaymentMethods(methods: string[]): PaymentMethod[] {\n const validated: PaymentMethod[] = [];\n\n for (const method of methods) {\n if (isValidPaymentMethod(method)) {\n validated.push(method as PaymentMethod);\n } else {\n console.warn(`[PaypercutCheckout] Invalid payment method: \"${method}\". Skipping.`);\n }\n }\n\n // Default to card if no valid methods\n if (validated.length === 0) {\n console.warn('[PaypercutCheckout] No valid payment methods provided. Defaulting to \"card\".');\n validated.push(PaymentMethod.CARD);\n }\n\n return validated;\n}\n\n/**\n * Validate wallet options array\n */\nexport function validateWalletOptions(options: string[]): WalletOption[] {\n const validated: WalletOption[] = [];\n\n for (const option of options) {\n if (isValidWalletOption(option)) {\n validated.push(option as WalletOption);\n } else {\n console.warn(`[PaypercutCheckout] Invalid wallet option: \"${option}\". Skipping.`);\n }\n }\n\n return validated;\n}\n\n/**\n * Validate UI mode\n */\nexport function validateUIMode(mode: string | undefined): UIMode | undefined {\n if (!mode) {\n return undefined;\n }\n\n if (isValidUIMode(mode)) {\n return mode as UIMode;\n }\n\n console.warn(\n `[PaypercutCheckout] Invalid ui_mode: \"${mode}\". Valid options: ${Object.values(UIMode).join(', ')}`,\n );\n return undefined;\n}\n\n/**\n * Configuration options for PaypercutCheckout\n */\nexport interface PaypercutCheckoutOptions {\n /** Checkout session identifier (e.g., 'CHK_12345') */\n id: string;\n\n /** CSS selector or HTMLElement where iframe mounts (required) */\n containerId: string | HTMLElement;\n\n /**\n * Optional: Custom hosted checkout URL (only available in internal builds)\n * Production builds will ignore this option for security\n */\n hostedCheckoutUrl?: string;\n\n /**\n * Optional: Locale for checkout UI\n * @default 'en'\n */\n locale?: Locale | string;\n\n /**\n * Optional: UI mode for checkout\n */\n ui_mode?: UIMode | `${UIMode}`;\n\n /**\n * Optional: Payment methods to enable\n * @default ['card']\n */\n payment_methods?: (PaymentMethod | `${PaymentMethod}`)[];\n\n /**\n * Optional: Digital wallet options\n * Can include both or just one\n */\n wallet_options?: (WalletOption | `${WalletOption}`)[];\n\n /**\n * Optional: Show only the payment form without header/footer\n * @default false\n */\n form_only?: boolean;\n\n /**\n * Optional: Appearance options\n */\n appearance?: {\n preset?: 'inline' | 'modal';\n theme?: 'light' | 'dark' | 'none' | 'flat';\n variables: {};\n rules: {};\n labels: 'floating' | 'above' | 'none';\n };\n}\n\n/**\n * Event names that can be emitted by the checkout\n */\nexport type EventName =\n | 'loaded' // iframe finished loading\n | 'success' // payment successful\n | 'error' // payment or system error\n | 'expired'; // checkout expired or already paid\n\n/**\n * Checkout instance interface\n */\nexport interface CheckoutInstance {\n /** Mount and render the iframe into the container */\n render(): void;\n\n /** Submit payment - sends message to hosted checkout to confirm payment */\n submit(): void;\n\n /** Destroy instance and cleanup all listeners */\n destroy(): void;\n\n /** Subscribe to events. Returns unsubscribe function */\n on(event: EventName, handler: (...args: any[]) => void): () => void;\n\n /** Subscribe to event that auto-unsubscribes after first emission */\n once(event: EventName, handler: (...args: any[]) => void): () => void;\n\n /** Unsubscribe from events */\n off(event: EventName, handler: (...args: any[]) => void): void;\n\n /** Check if checkout is currently mounted */\n isMounted(): boolean;\n}\n\n/**\n * PaypercutCheckout static interface (callable and constructable)\n */\nexport interface PaypercutCheckoutStatic {\n /** Callable factory function */\n (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** Constructor support */\n new (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** SDK version */\n version: string;\n}\n","import { Emitter } from './utils/emitter';\nimport { config, isOriginAllowed, getCheckoutOrigin } from './config';\n\nimport {\n PaypercutCheckoutOptions,\n CheckoutInstance,\n PaypercutCheckoutStatic,\n EventName,\n validatePaymentMethods,\n validateWalletOptions,\n validateUIMode,\n} from './types';\nimport { normalizeLocale } from './types';\n\n// Re-export types and enums for consumers\nexport type { PaypercutCheckoutOptions, CheckoutInstance, PaypercutCheckoutStatic, EventName };\n\nexport { UIMode, PaymentMethod, WalletOption } from './types/checkout';\n\nexport type { Locale } from './types/locales';\nexport { LOCALES } from './types/locales';\n\n/**\n * Internal implementation of CheckoutInstance\n */\nclass CheckoutImpl implements CheckoutInstance {\n private emitter = new Emitter<EventName>();\n private mounted = false;\n private destroyed = false;\n private iframe: HTMLIFrameElement | null = null;\n private messageHandler: (evt: MessageEvent) => void;\n\n // 3DS Modal state\n private threeDSModal: HTMLDivElement | null = null;\n private threeDSIframe: HTMLIFrameElement | null = null;\n\n constructor(private options: PaypercutCheckoutOptions) {\n // Bind message handler\n this.messageHandler = this.onMessage.bind(this);\n window.addEventListener('message', this.messageHandler);\n }\n\n /**\n * Build the iframe source URL with query parameters\n */\n private buildSrc(): string {\n const baseUrl = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n const url = new URL(`/c/${this.options.id}`, baseUrl);\n\n // Add locale parameter\n if (this.options.locale) {\n const normalizedLocale = normalizeLocale(this.options.locale);\n url.searchParams.set('locale', normalizedLocale);\n }\n\n // Add ui_mode parameter\n if (this.options.ui_mode) {\n const validatedUIMode = validateUIMode(this.options.ui_mode);\n if (validatedUIMode) {\n url.searchParams.set('ui_mode', validatedUIMode);\n }\n }\n\n // Add payment_methods parameters (repeated for each method)\n if (this.options.payment_methods && this.options.payment_methods.length > 0) {\n const validatedMethods = validatePaymentMethods(this.options.payment_methods as string[]);\n validatedMethods.forEach((method) => {\n url.searchParams.append('payment_methods', method);\n });\n }\n\n // Add wallet_options parameters (repeated for each wallet)\n if (this.options.wallet_options && this.options.wallet_options.length > 0) {\n const validatedWallets = validateWalletOptions(this.options.wallet_options as string[]);\n validatedWallets.forEach((wallet) => {\n url.searchParams.append('wallet_options', wallet);\n });\n }\n\n if (this.options.appearance?.preset) {\n url.searchParams.set('preset', this.options.appearance.preset);\n }\n\n if (this.options.form_only !== undefined) {\n url.searchParams.set('form_only', String(this.options.form_only));\n }\n\n return url.toString();\n }\n\n /**\n * Get the container element from selector or HTMLElement\n */\n private getContainer(): HTMLElement {\n const container =\n typeof this.options.containerId === 'string'\n ? document.querySelector(this.options.containerId)\n : this.options.containerId;\n\n if (!container) {\n throw new Error(`Container not found: ${this.options.containerId}`);\n }\n\n return container as HTMLElement;\n }\n\n /**\n * Handle incoming postMessage events from iframe\n */\n private onMessage(evt: MessageEvent): void {\n // Validate origin against allowed origins (build-time whitelist)\n if (!isOriginAllowed(evt.origin)) {\n return;\n }\n\n // Validate structure\n const data = evt.data;\n if (!data || typeof data !== 'object' || !('type' in data)) {\n return;\n }\n\n // Filter messages by checkout session ID to prevent cross-instance message handling\n // This ensures each checkout instance only processes its own messages\n if (data.checkoutId && data.checkoutId !== this.options.id) {\n return; // Message is for a different checkout instance\n }\n\n // Handle specific events\n switch (data.type) {\n case 'CHECKOUT_LOADED':\n this.emitter.emit('loaded');\n break;\n case 'CHECKOUT_SUCCESS':\n this.emitter.emit('success');\n break;\n case 'CHECKOUT_ERROR':\n this.emitter.emit('error');\n break;\n case 'CHECKOUT_EXPIRED':\n this.emitter.emit('expired');\n break;\n case 'THREEDS_START_FLOW':\n this.show3DSModal(data);\n break;\n case 'THREEDS_READY':\n this.handle3DSReady();\n break;\n case 'THREEDS_COMPLETE':\n case 'THREEDS_CANCELLED':\n case 'THREEDS_ERROR':\n this.postToIframe(data);\n this.close3DSModal();\n break;\n }\n }\n\n /**\n * Render the checkout iframe into the container\n */\n render(): void {\n if (this.mounted) {\n return;\n }\n\n try {\n const container = this.getContainer();\n\n // Create iframe\n this.iframe = document.createElement('iframe');\n this.iframe.id = 'paypercut-checkout-iframe';\n this.iframe.src = this.buildSrc();\n this.iframe.allow = 'payment *; clipboard-write';\n this.iframe.setAttribute('frameborder', '0');\n\n // Apply default styles - just construct URL and assign to iframe\n Object.assign(this.iframe.style, {\n width: '100%',\n height: '100%',\n border: 'none',\n display: 'block',\n });\n\n // Listen for iframe load event (fallback)\n // This ensures 'loaded' event is always emitted even if hosted checkout\n // doesn't send CHECKOUT_LOADED message\n /*this.iframe.addEventListener('load', () => {\n this.emitter.emit('loaded');\n });*/\n\n container.appendChild(this.iframe);\n this.mounted = true;\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to render:', err);\n throw err;\n }\n }\n\n /**\n * Submit payment - sends message to hosted checkout to confirm payment\n */\n submit(): void {\n if (!this.mounted) {\n return;\n }\n\n try {\n this.postToIframe({\n type: 'START_PROCESSING',\n checkoutId: this.options.id,\n });\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to submit payment:', err);\n throw err;\n }\n }\n\n /**\n * Send message to hosted/embedded checkout iframe - used for submit payment and communicating 3DS events\n */\n private postToIframe(message: any): void {\n if (!this.iframe?.contentWindow) {\n console.error('[PaypercutCheckout] Cannot post message: iframe not mounted');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.iframe.contentWindow.postMessage(message, checkoutOrigin);\n }\n\n /**\n * Show 3DS modal with challenge/decoupled flow\n */\n private show3DSModal(data: {\n sessionId: string;\n step: 'challenge' | 'decoupled_waiting';\n challengeUrl?: string;\n acsTransactionId?: string;\n threeDSVersion?: string;\n cardBrand?: string;\n }): void {\n\n // Create modal backdrop\n this.threeDSModal = document.createElement('div');\n this.threeDSModal.id = 'paypercut-3ds-modal';\n Object.assign(this.threeDSModal.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n // backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '999999',\n });\n\n // Create container for iframe + close button\n const modalContainer = document.createElement('div');\n Object.assign(modalContainer.style, {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '#ffffff',\n borderRadius: '24px',\n });\n\n // Create iframe for 3DS page\n this.threeDSIframe = document.createElement('iframe');\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n\n // Build URL: baseUrl/c/{checkoutId}/threeds with query params\n const threeDSUrl = new URL(`/c/${this.options.id}/threeds`, checkoutOrigin);\n threeDSUrl.searchParams.set('sessionId', data.sessionId);\n threeDSUrl.searchParams.set('step', data.step);\n\n if (data.challengeUrl) {\n threeDSUrl.searchParams.set('challengeUrl', data.challengeUrl);\n }\n if (data.acsTransactionId) {\n threeDSUrl.searchParams.set('acsTransactionId', data.acsTransactionId);\n }\n if (data.threeDSVersion) {\n threeDSUrl.searchParams.set('threeDSVersion', data.threeDSVersion);\n }\n\n this.threeDSIframe.src = threeDSUrl.toString();\n this.threeDSIframe.allow = 'payment *';\n this.threeDSIframe.setAttribute('frameborder', '0');\n\n // Responsive modal sizing (60% of viewport, min 400px, max 800px width / 600px height)\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const modalWidth = Math.min(Math.max(viewportWidth * 0.6, 400), 800);\n const modalHeight = Math.min(Math.max(viewportHeight * 0.6, 400), 600);\n\n Object.assign(this.threeDSIframe.style, {\n width: `${modalWidth}px`,\n height: `${modalHeight}px`,\n border: 'none',\n borderRadius: '24px',\n backgroundColor: 'white',\n overflow: 'auto',\n });\n\n // Append iframe\n modalContainer.appendChild(this.threeDSIframe);\n\n // Append container to modal backdrop\n this.threeDSModal.appendChild(modalContainer);\n document.body.appendChild(this.threeDSModal);\n\n // Store 3DS data for later use\n (this as any).pending3DSData = data;\n }\n\n /**\n * Handle THREEDS_READY message - send THREEDS_INIT with challenge data\n */\n private handle3DSReady(): void {\n const data = (this as any).pending3DSData;\n if (!data || !this.threeDSIframe?.contentWindow) {\n console.error('[PaypercutCheckout] No pending 3DS data or iframe not ready');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.threeDSIframe.contentWindow.postMessage(\n {\n type: 'THREEDS_INIT',\n checkoutId: this.options.id,\n },\n checkoutOrigin,\n );\n }\n\n /**\n * Close 3DS modal and cleanup\n */\n private close3DSModal(): void {\n if (this.threeDSModal) {\n this.threeDSModal.remove();\n this.threeDSModal = null;\n }\n\n this.threeDSIframe = null;\n delete (this as any).pending3DSData;\n }\n\n /**\n * Destroy the checkout instance and cleanup (idempotent)\n */\n destroy(): void {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n // Remove iframe from DOM\n if (this.iframe) {\n try {\n this.iframe.remove();\n this.iframe = null;\n } catch (err) {\n console.error('[PaypercutCheckout] Error removing iframe:', err);\n }\n }\n\n // Cleanup 3DS modal if open\n this.close3DSModal();\n\n // Only set mounted = false after successful DOM removal\n this.mounted = false;\n this.destroyed = true;\n\n // Cleanup event listeners\n window.removeEventListener('message', this.messageHandler);\n this.emitter.clear();\n }\n\n /**\n * Subscribe to an event\n */\n on(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.on(event, handler);\n }\n\n /**\n * Subscribe to event that auto-unsubscribes after first emission\n */\n once(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.once(event, handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: EventName, handler: (...args: any[]) => void): void {\n this.emitter.off(event, handler);\n }\n\n /**\n * Check if checkout is currently mounted\n */\n isMounted(): boolean {\n return this.mounted;\n }\n}\n\n/**\n * Factory function that works both as callable and constructable.\n * Always returns a new CheckoutImpl instance - no prototype manipulation needed.\n */\nconst PaypercutCheckout: PaypercutCheckoutStatic = function (\n this: unknown,\n options: PaypercutCheckoutOptions,\n): CheckoutInstance {\n // Always return a new instance, regardless of how it's called\n return new CheckoutImpl(options);\n} as unknown as PaypercutCheckoutStatic;\n\n// Add static version property\n(PaypercutCheckout as any).version = config.version;\n\n// Export as default and named\nexport default PaypercutCheckout;\nexport { PaypercutCheckout };\n"],"names":["Emitter","constructor","this","handlers","Map","on","event","handler","has","set","Set","get","add","off","once","wrappedHandler","args","delete","emit","forEach","h","err","console","error","clear","config","version","defaultCheckoutOrigin","allowedOrigins","getCheckoutOrigin","override","LOCALE_SET","UIMode","PaymentMethod","WalletOption","isValidPaymentMethod","value","Object","values","includes","isValidWalletOption","validateUIMode","mode","warn","join","CheckoutImpl","options","emitter","mounted","destroyed","iframe","threeDSModal","threeDSIframe","messageHandler","onMessage","bind","window","addEventListener","buildSrc","baseUrl","hostedCheckoutUrl","url","URL","id","locale","normalizedLocale","searchParams","ui_mode","validatedUIMode","payment_methods","length","methods","validated","method","push","CARD","validatePaymentMethods","append","wallet_options","option","validateWalletOptions","wallet","appearance","preset","undefined","form_only","String","toString","getContainer","container","containerId","document","querySelector","Error","evt","origin","data","checkoutId","type","show3DSModal","handle3DSReady","postToIframe","close3DSModal","render","createElement","src","allow","setAttribute","assign","style","width","height","border","display","appendChild","submit","message","contentWindow","checkoutOrigin","postMessage","position","top","left","alignItems","justifyContent","zIndex","modalContainer","flexDirection","backgroundColor","borderRadius","threeDSUrl","sessionId","step","challengeUrl","acsTransactionId","threeDSVersion","viewportWidth","innerWidth","viewportHeight","innerHeight","modalWidth","Math","min","max","modalHeight","overflow","body","pending3DSData","remove","destroy","removeEventListener","isMounted","PaypercutCheckout"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paypercut-checkout.iife.min.js","sources":["../src/utils/emitter.ts","../src/config.ts","../src/types/locales.ts","../src/types/checkout.ts","../src/index.ts"],"sourcesContent":["/**\n * Simple event emitter for handling checkout events\n * Supports subscribing, unsubscribing, and emitting events\n */\nexport class Emitter<T extends string = string> {\n private handlers = new Map<T, Set<Function>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n on(event: T, handler: Function): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n /**\n * Subscribe to an event that auto-unsubscribes after first emission\n *\n * Common use case: waiting for 'loaded' event or handling first 'success'.\n * Without this helper, developers would need to manually unsubscribe inside\n * their handler, which is error-prone and leads to memory leaks if forgotten.\n *\n * @param event - Event name to listen to\n * @param handler - Callback function to execute when event is emitted\n * @returns Unsubscribe function\n */\n once(event: T, handler: Function): () => void {\n const wrappedHandler = (...args: any[]) => {\n handler(...args);\n this.off(event, wrappedHandler);\n };\n return this.on(event, wrappedHandler);\n }\n\n /**\n * Unsubscribe from an event\n * @param event - Event name to stop listening to\n * @param handler - Callback function to remove\n */\n off(event: T, handler: Function): void {\n this.handlers.get(event)?.delete(handler);\n }\n\n /**\n * Emit an event with optional arguments\n * @param event - Event name to emit\n * @param args - Arguments to pass to event handlers\n */\n emit(event: T, ...args: any[]): void {\n this.handlers.get(event)?.forEach(h => {\n try {\n h(...args);\n } catch (err) {\n console.error(`[Emitter] Error in ${event} handler:`, err);\n }\n });\n }\n\n /**\n * Clear all event handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n","/**\n * Build-time configuration\n * \n * This file is processed at build time with different values for:\n * - Production build (for merchants)\n * - Internal build (for team development)\n */\n\n/**\n * Build mode - replaced at build time\n */\ndeclare const __BUILD_MODE__: 'production' | 'internal';\n\n/**\n * SDK version - replaced at build time\n */\ndeclare const __VERSION__: string;\n\n/**\n * Configuration interface\n */\nexport interface BuildConfig {\n /** SDK version */\n version: string;\n \n /** Build mode */\n mode: 'production' | 'internal';\n \n /** Default checkout origin (production URL) */\n defaultCheckoutOrigin: string;\n \n /** Allowed origins for postMessage validation */\n allowedOrigins: string[];\n \n /** Whether hostedCheckoutUrl override is allowed */\n allowOriginOverride: boolean;\n}\n\n/**\n * Production configuration (for merchants)\n */\nconst productionConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'production',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n ],\n allowOriginOverride: false\n};\n\n/**\n * Internal configuration (for team development)\n */\nconst internalConfig: BuildConfig = {\n version: __VERSION__,\n mode: 'internal',\n defaultCheckoutOrigin: 'https://buy.paypercut.io',\n allowedOrigins: [\n 'https://buy.paypercut.io',\n 'http://localhost:3000',\n 'http://localhost:3001',\n 'http://127.0.0.1:3000',\n 'http://127.0.0.1:3001'\n ],\n allowOriginOverride: true\n};\n\n/**\n * Active configuration (selected at build time)\n */\nexport const config: BuildConfig = __BUILD_MODE__ === 'internal' \n ? internalConfig \n : productionConfig;\n\n/**\n * Helper to check if origin is allowed\n */\nexport function isOriginAllowed(origin: string): boolean {\n return config.allowedOrigins.includes(origin);\n}\n\n/**\n * Get the checkout origin (with optional override for internal builds)\n */\nexport function getCheckoutOrigin(override?: string): string {\n // Only allow override in internal builds\n if (override && config.allowOriginOverride) {\n return override;\n }\n \n return config.defaultCheckoutOrigin;\n}\n\n","/**\n * Supported locales for Paypercut Checkout\n * \n * @remarks\n * Single source of truth for all supported locale codes.\n * \n * Supported languages:\n * - Bulgarian: 'bg', 'bg-BG'\n * - English: 'en', 'en-GB'\n * - Greek: 'el', 'el-GR'\n * - Romanian: 'ro', 'ro-RO'\n * - Croatian: 'hr', 'hr-HR'\n * - Polish: 'pl', 'pl-PL'\n * - Czech: 'cs', 'cs-CZ'\n * - Slovenian: 'sl', 'sl-SI'\n * - Slovak: 'sk', 'sk-SK'\n * \n * @example\n * ```typescript\n * const checkout = PaypercutCheckout({\n * locale: 'bg' // or 'bg-BG', 'en', 'en-GB', etc.\n * });\n * ```\n */\nexport const LOCALES = [\n 'bg', 'bg-BG',\n 'en', 'en-GB',\n 'el', 'el-GR',\n 'ro', 'ro-RO',\n 'hr', 'hr-HR',\n 'pl', 'pl-PL',\n 'cs', 'cs-CZ',\n 'sl', 'sl-SI',\n 'sk', 'sk-SK',\n] as const;\n\n/**\n * Locale type - union of all supported locale codes plus 'auto'\n * @example\n * ```typescript\n * const locale: Locale = 'bg';\n * const autoLocale: Locale = 'auto';\n * ```\n */\nexport type Locale = typeof LOCALES[number] | 'auto';\n\n/**\n * Fast runtime check using Set for O(1) lookup\n * @internal\n */\nconst LOCALE_SET: ReadonlySet<string> = new Set(LOCALES);\n\n/**\n * Normalize and validate locale\n * \n * @param locale - Locale code to normalize\n * @returns Normalized locale code or 'en' as fallback\n * \n * @remarks\n * - 'auto' or empty → 'en'\n * - Unsupported locale → 'en' with console warning\n * - Supported locale → original value\n * \n * @example\n * ```typescript\n * normalizeLocale('auto') // → 'en'\n * normalizeLocale('bg') // → 'bg'\n * normalizeLocale('de') // → 'en' (with warning)\n * ```\n */\nexport function normalizeLocale(locale: string | Locale): typeof LOCALES[number] | 'en' {\n if (!locale || locale === 'auto') return 'en';\n if (LOCALE_SET.has(locale)) return locale as typeof LOCALES[number];\n console.warn(`[PaypercutCheckout] Locale \"${locale}\" is not supported. Falling back to \"en\".`);\n return 'en';\n}\n\n","import { Locale } from './locales';\n\n/**\n * UI mode for checkout\n */\nexport enum UIMode {\n /** Embedded mode - checkout embedded in merchant page */\n EMBEDDED = 'embedded',\n}\n\n/**\n * Type guard for UIMode\n */\nexport function isValidUIMode(value: string): value is UIMode {\n return Object.values(UIMode).includes(value as UIMode);\n}\n\n/**\n * Payment method types\n */\nexport enum PaymentMethod {\n /** Card payment (credit/debit) */\n CARD = 'card',\n}\n\n/**\n * Type guard for PaymentMethod\n */\nexport function isValidPaymentMethod(value: string): value is PaymentMethod {\n return Object.values(PaymentMethod).includes(value as PaymentMethod);\n}\n\n/**\n * Wallet options for digital wallets\n */\nexport enum WalletOption {\n /** Apple Pay */\n APPLE_PAY = 'apple_pay',\n /** Google Pay */\n GOOGLE_PAY = 'google_pay',\n}\n\n/**\n * Type guard for WalletOption\n */\nexport function isValidWalletOption(value: string): value is WalletOption {\n return Object.values(WalletOption).includes(value as WalletOption);\n}\n\n/**\n * Validate payment methods array\n */\nexport function validatePaymentMethods(methods: string[]): PaymentMethod[] {\n const validated: PaymentMethod[] = [];\n\n for (const method of methods) {\n if (isValidPaymentMethod(method)) {\n validated.push(method as PaymentMethod);\n } else {\n console.warn(`[PaypercutCheckout] Invalid payment method: \"${method}\". Skipping.`);\n }\n }\n\n // Default to card if no valid methods\n if (validated.length === 0) {\n console.warn('[PaypercutCheckout] No valid payment methods provided. Defaulting to \"card\".');\n validated.push(PaymentMethod.CARD);\n }\n\n return validated;\n}\n\n/**\n * Validate wallet options array\n */\nexport function validateWalletOptions(options: string[]): WalletOption[] {\n const validated: WalletOption[] = [];\n\n for (const option of options) {\n if (isValidWalletOption(option)) {\n validated.push(option as WalletOption);\n } else {\n console.warn(`[PaypercutCheckout] Invalid wallet option: \"${option}\". Skipping.`);\n }\n }\n\n return validated;\n}\n\n/**\n * Validate UI mode\n */\nexport function validateUIMode(mode: string | undefined): UIMode | undefined {\n if (!mode) {\n return undefined;\n }\n\n if (isValidUIMode(mode)) {\n return mode as UIMode;\n }\n\n console.warn(\n `[PaypercutCheckout] Invalid ui_mode: \"${mode}\". Valid options: ${Object.values(UIMode).join(', ')}`,\n );\n return undefined;\n}\n\n/**\n * Configuration options for PaypercutCheckout\n */\nexport interface PaypercutCheckoutOptions {\n /** Checkout session identifier (e.g., 'CHK_12345') */\n id: string;\n\n /** CSS selector or HTMLElement where iframe mounts (required) */\n containerId: string | HTMLElement;\n\n /**\n * Optional: Custom hosted checkout URL (only available in internal builds)\n * Production builds will ignore this option for security\n */\n hostedCheckoutUrl?: string;\n\n /**\n * Optional: Locale for checkout UI\n * @default 'en'\n */\n locale?: Locale | string;\n\n /**\n * Optional: UI mode for checkout\n */\n ui_mode?: UIMode | `${UIMode}`;\n\n /**\n * Optional: Payment methods to enable\n * @default ['card']\n */\n payment_methods?: (PaymentMethod | `${PaymentMethod}`)[];\n\n /**\n * Optional: Digital wallet options\n * Can include both or just one\n */\n wallet_options?: (WalletOption | `${WalletOption}`)[];\n\n /**\n * Optional: Show only the payment form without header/footer\n * @default false\n */\n form_only?: boolean;\n\n /**\n * Optional: Appearance options\n */\n appearance?: {\n preset?: 'inline' | 'modal';\n theme?: 'light' | 'dark' | 'none' | 'flat';\n variables: {};\n rules: {};\n labels: 'floating' | 'above' | 'none';\n };\n}\n\n/**\n * Event names that can be emitted by the checkout\n */\nexport type EventName =\n | 'loaded' // iframe finished loading\n | 'success' // payment successful\n | 'error' // payment or system error\n | 'expired' // checkout expired or already paid\n | 'threeds_complete' // checkout paid successfully\n | 'threeds_error' // checkout threeds error\n | 'threeds_canceled' // checkout threeds canceled\n | 'threeds_started'; // checkout threeds started\n\n/**\n * Preferred enum for SDK event names (use instead of hardcoded strings)\n */\nexport enum SdkEvent {\n Loaded = 'loaded',\n Success = 'success',\n Error = 'error',\n Expired = 'expired',\n ThreeDSComplete = 'threeds_complete',\n ThreeDSError = 'threeds_error',\n ThreeDSCanceled = 'threeds_canceled',\n ThreeDSStarted = 'threeds_started',\n}\n\n/**\n * Checkout instance interface\n */\nexport interface CheckoutInstance {\n /** Mount and render the iframe into the container */\n render(): void;\n\n /** Submit payment - sends message to hosted checkout to confirm payment */\n submit(): void;\n\n /** Destroy instance and cleanup all listeners */\n destroy(): void;\n\n /** Subscribe to events. Returns unsubscribe function */\n on(event: EventName | SdkEvent, handler: (...args: any[]) => void): () => void;\n\n /** Subscribe to event that auto-unsubscribes after first emission */\n once(event: EventName | SdkEvent, handler: (...args: any[]) => void): () => void;\n\n /** Unsubscribe from events */\n off(event: EventName | SdkEvent, handler: (...args: any[]) => void): void;\n\n /** Check if checkout is currently mounted */\n isMounted(): boolean;\n}\n\n/**\n * PaypercutCheckout static interface (callable and constructable)\n */\nexport interface PaypercutCheckoutStatic {\n /** Callable factory function */\n (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** Constructor support */\n new (options: PaypercutCheckoutOptions): CheckoutInstance;\n\n /** SDK version */\n version: string;\n}\n","import { Emitter } from './utils/emitter';\nimport { config, isOriginAllowed, getCheckoutOrigin } from './config';\n\nimport {\n PaypercutCheckoutOptions,\n CheckoutInstance,\n PaypercutCheckoutStatic,\n EventName,\n SdkEvent,\n validatePaymentMethods,\n validateWalletOptions,\n validateUIMode,\n UIMode,\n} from './types';\nimport { normalizeLocale } from './types';\n\n// Re-export types and enums for consumers\nexport type { PaypercutCheckoutOptions, CheckoutInstance, PaypercutCheckoutStatic, EventName };\n\nexport { UIMode, PaymentMethod, WalletOption } from './types/checkout';\n\n\n// Re-export SDK event enums for consumers\nexport { SdkEvent } from './types/checkout';\n\nexport type { Locale } from './types/locales';\nexport { LOCALES } from './types/locales';\n\n/**\n * Internal implementation of CheckoutInstance\n */\nclass CheckoutImpl implements CheckoutInstance {\n private emitter = new Emitter<EventName>();\n private mounted = false;\n private destroyed = false;\n private iframe: HTMLIFrameElement | null = null;\n private messageHandler: (evt: MessageEvent) => void;\n\n // 3DS Modal state\n private threeDSModal: HTMLDivElement | null = null;\n private threeDSIframe: HTMLIFrameElement | null = null;\n\n constructor(private options: PaypercutCheckoutOptions) {\n // Bind message handler\n this.messageHandler = this.onMessage.bind(this);\n window.addEventListener('message', this.messageHandler);\n }\n\n /**\n * Build the iframe source URL with query parameters\n */\n private buildSrc(): string {\n const baseUrl = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n const url = new URL(`/c/${this.options.id}`, baseUrl);\n\n // Add locale parameter\n if (this.options.locale) {\n const normalizedLocale = normalizeLocale(this.options.locale);\n url.searchParams.set('locale', normalizedLocale);\n }\n\n // Add ui_mode parameter (default to 'embedded')\n {\n const selected = validateUIMode(this.options.ui_mode ?? UIMode.EMBEDDED);\n if (selected) {\n url.searchParams.set('ui_mode', selected);\n }\n }\n\n // Add payment_methods parameters (repeated for each method)\n if (this.options.payment_methods && this.options.payment_methods.length > 0) {\n const validatedMethods = validatePaymentMethods(this.options.payment_methods as string[]);\n validatedMethods.forEach((method) => {\n url.searchParams.append('payment_methods', method);\n });\n }\n\n // Add wallet_options parameters (repeated for each wallet)\n if (this.options.wallet_options && this.options.wallet_options.length > 0) {\n const validatedWallets = validateWalletOptions(this.options.wallet_options as string[]);\n validatedWallets.forEach((wallet) => {\n url.searchParams.append('wallet_options', wallet);\n });\n }\n\n if (this.options.appearance?.preset) {\n url.searchParams.set('preset', this.options.appearance.preset);\n }\n\n if (this.options.form_only !== undefined) {\n url.searchParams.set('form_only', String(this.options.form_only));\n }\n\n return url.toString();\n }\n\n /**\n * Get the container element from selector or HTMLElement\n */\n private getContainer(): HTMLElement {\n const container =\n typeof this.options.containerId === 'string'\n ? document.querySelector(this.options.containerId)\n : this.options.containerId;\n\n if (!container) {\n throw new Error(`Container not found: ${this.options.containerId}`);\n }\n\n return container as HTMLElement;\n }\n\n /**\n * Handle incoming postMessage events from iframe\n */\n private onMessage(evt: MessageEvent): void {\n // Validate origin against allowed origins (build-time whitelist)\n if (!isOriginAllowed(evt.origin)) {\n return;\n }\n\n // Validate structure\n const data = evt.data;\n if (!data || typeof data !== 'object' || !('type' in data)) {\n return;\n }\n\n // Filter messages by checkout session ID to prevent cross-instance message handling\n // This ensures each checkout instance only processes its own messages\n if (data.checkoutId && data.checkoutId !== this.options.id) {\n return; // Message is for a different checkout instance\n }\n\n // Handle specific events\n switch (data.type) {\n case 'CHECKOUT_LOADED':\n this.emitter.emit(SdkEvent.Loaded);\n break;\n case 'CHECKOUT_SUCCESS':\n this.emitter.emit(SdkEvent.Success);\n break;\n case 'CHECKOUT_ERROR':\n // Forward error payload (if provided) to SDK consumers\n this.emitter.emit(SdkEvent.Error, (data && (data as any).error) ?? data);\n break;\n case 'CHECKOUT_EXPIRED':\n this.emitter.emit(SdkEvent.Expired);\n break;\n case 'THREEDS_START_FLOW':\n this.show3DSModal(data);\n this.emitter.emit(SdkEvent.ThreeDSStarted);\n break;\n case 'THREEDS_READY':\n this.handle3DSReady();\n break;\n case 'THREEDS_COMPLETE':\n this.postToIframe(data);\n this.close3DSModal();\n this.emitter.emit(SdkEvent.ThreeDSComplete);\n break;\n case 'THREEDS_CANCELED':\n this.postToIframe(data);\n this.close3DSModal();\n this.emitter.emit(SdkEvent.ThreeDSCanceled);\n break;\n case 'THREEDS_ERROR':\n this.postToIframe(data);\n this.close3DSModal();\n this.emitter.emit(SdkEvent.ThreeDSError, data.error);\n break;\n }\n }\n\n /**\n * Render the checkout iframe into the container\n */\n render(): void {\n if (this.mounted) {\n return;\n }\n\n try {\n const container = this.getContainer();\n\n // Create iframe\n this.iframe = document.createElement('iframe');\n this.iframe.id = 'paypercut-checkout-iframe';\n this.iframe.src = this.buildSrc();\n this.iframe.allow = 'payment *; clipboard-write';\n this.iframe.setAttribute('frameborder', '0');\n // Allow Payment Request API inside iframe and necessary sandbox permissions for wallets\n this.iframe.setAttribute('allowpaymentrequest', 'true');\n this.iframe.setAttribute(\n 'sandbox',\n 'allow-scripts allow-forms allow-same-origin allow-popups allow-popups-to-escape-sandbox',\n );\n\n\n // Apply default styles - just construct URL and assign to iframe\n Object.assign(this.iframe.style, {\n width: '100%',\n height: '100%',\n border: 'none',\n display: 'block',\n });\n\n // Listen for iframe load event (fallback)\n // This ensures 'loaded' event is always emitted even if hosted checkout\n // doesn't send CHECKOUT_LOADED message\n /*this.iframe.addEventListener('load', () => {\n this.emitter.emit('loaded');\n });*/\n\n container.appendChild(this.iframe);\n this.mounted = true;\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to render:', err);\n throw err;\n }\n }\n\n /**\n * Submit payment - sends message to hosted checkout to confirm payment\n */\n submit(): void {\n if (!this.mounted) {\n return;\n }\n\n try {\n this.postToIframe({\n type: 'START_PROCESSING',\n checkoutId: this.options.id,\n });\n } catch (err) {\n console.error('[PaypercutCheckout] Failed to submit payment:', err);\n throw err;\n }\n }\n\n /**\n * Send message to hosted/embedded checkout iframe - used for submit payment and communicating 3DS events\n */\n private postToIframe(message: any): void {\n if (!this.iframe?.contentWindow) {\n console.error('[PaypercutCheckout] Cannot post message: iframe not mounted');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.iframe.contentWindow.postMessage(message, checkoutOrigin);\n }\n\n /**\n * Show 3DS modal with challenge/decoupled flow\n */\n private show3DSModal(data: {\n sessionId: string;\n step: 'challenge' | 'decoupled_waiting';\n challengeUrl?: string;\n acsTransactionId?: string;\n threeDSVersion?: string;\n cardBrand?: string;\n }): void {\n\n // Create modal backdrop\n this.threeDSModal = document.createElement('div');\n this.threeDSModal.id = 'paypercut-3ds-modal';\n Object.assign(this.threeDSModal.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n // backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '999999',\n });\n\n // Create container for iframe + close button\n const modalContainer = document.createElement('div');\n Object.assign(modalContainer.style, {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '#ffffff',\n borderRadius: '24px',\n });\n\n // Create iframe for 3DS page\n this.threeDSIframe = document.createElement('iframe');\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n\n // Build URL: baseUrl/c/{checkoutId}/threeds with query params\n const threeDSUrl = new URL(`/c/${this.options.id}/threeds`, checkoutOrigin);\n threeDSUrl.searchParams.set('sessionId', data.sessionId);\n threeDSUrl.searchParams.set('step', data.step);\n\n if (data.challengeUrl) {\n threeDSUrl.searchParams.set('challengeUrl', data.challengeUrl);\n }\n if (data.acsTransactionId) {\n threeDSUrl.searchParams.set('acsTransactionId', data.acsTransactionId);\n }\n if (data.threeDSVersion) {\n threeDSUrl.searchParams.set('threeDSVersion', data.threeDSVersion);\n }\n\n this.threeDSIframe.src = threeDSUrl.toString();\n this.threeDSIframe.allow = 'payment *';\n this.threeDSIframe.setAttribute('frameborder', '0');\n\n // Responsive modal sizing (60% of viewport, min 400px, max 800px width / 600px height)\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const modalWidth = Math.min(Math.max(viewportWidth * 0.6, 400), 800);\n const modalHeight = Math.min(Math.max(viewportHeight * 0.6, 400), 600);\n\n Object.assign(this.threeDSIframe.style, {\n width: `${modalWidth}px`,\n height: `${modalHeight}px`,\n border: 'none',\n borderRadius: '24px',\n backgroundColor: 'white',\n overflow: 'auto',\n });\n\n // Append iframe\n modalContainer.appendChild(this.threeDSIframe);\n\n // Append container to modal backdrop\n this.threeDSModal.appendChild(modalContainer);\n document.body.appendChild(this.threeDSModal);\n\n // Store 3DS data for later use\n (this as any).pending3DSData = data;\n }\n\n /**\n * Handle THREEDS_READY message - send THREEDS_INIT with challenge data\n */\n private handle3DSReady(): void {\n const data = (this as any).pending3DSData;\n if (!data || !this.threeDSIframe?.contentWindow) {\n console.error('[PaypercutCheckout] No pending 3DS data or iframe not ready');\n return;\n }\n\n const checkoutOrigin = getCheckoutOrigin(this.options.hostedCheckoutUrl);\n this.threeDSIframe.contentWindow.postMessage(\n {\n type: 'THREEDS_INIT',\n checkoutId: this.options.id,\n },\n checkoutOrigin,\n );\n }\n\n /**\n * Close 3DS modal and cleanup\n */\n private close3DSModal(): void {\n if (this.threeDSModal) {\n this.threeDSModal.remove();\n this.threeDSModal = null;\n }\n\n this.threeDSIframe = null;\n delete (this as any).pending3DSData;\n }\n\n /**\n * Destroy the checkout instance and cleanup (idempotent)\n */\n destroy(): void {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n // Remove iframe from DOM\n if (this.iframe) {\n try {\n this.iframe.remove();\n this.iframe = null;\n } catch (err) {\n console.error('[PaypercutCheckout] Error removing iframe:', err);\n }\n }\n\n // Cleanup 3DS modal if open\n this.close3DSModal();\n\n // Only set mounted = false after successful DOM removal\n this.mounted = false;\n this.destroyed = true;\n\n // Cleanup event listeners\n window.removeEventListener('message', this.messageHandler);\n this.emitter.clear();\n }\n\n /**\n * Subscribe to an event\n */\n on(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.on(event, handler);\n }\n\n /**\n * Subscribe to event that auto-unsubscribes after first emission\n */\n once(event: EventName, handler: (...args: any[]) => void): () => void {\n return this.emitter.once(event, handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: EventName, handler: (...args: any[]) => void): void {\n this.emitter.off(event, handler);\n }\n\n /**\n * Check if checkout is currently mounted\n */\n isMounted(): boolean {\n return this.mounted;\n }\n}\n\n/**\n * Factory function that works both as callable and constructable.\n * Always returns a new CheckoutImpl instance - no prototype manipulation needed.\n */\nconst PaypercutCheckout: PaypercutCheckoutStatic = function (\n this: unknown,\n options: PaypercutCheckoutOptions,\n): CheckoutInstance {\n // Always return a new instance, regardless of how it's called\n return new CheckoutImpl(options);\n} as unknown as PaypercutCheckoutStatic;\n\n// Add static version property\n(PaypercutCheckout as any).version = config.version;\n\n// Export as default and named\nexport default PaypercutCheckout;\nexport { PaypercutCheckout };\n"],"names":["Emitter","constructor","this","handlers","Map","on","event","handler","has","set","Set","get","add","off","once","wrappedHandler","args","delete","emit","forEach","h","err","console","error","clear","config","version","defaultCheckoutOrigin","allowedOrigins","getCheckoutOrigin","override","LOCALE_SET","UIMode","PaymentMethod","WalletOption","SdkEvent","isValidPaymentMethod","value","Object","values","includes","isValidWalletOption","validateUIMode","mode","warn","join","CheckoutImpl","options","emitter","mounted","destroyed","iframe","threeDSModal","threeDSIframe","messageHandler","onMessage","bind","window","addEventListener","buildSrc","baseUrl","hostedCheckoutUrl","url","URL","id","locale","normalizedLocale","searchParams","selected","ui_mode","EMBEDDED","payment_methods","length","methods","validated","method","push","CARD","validatePaymentMethods","append","wallet_options","option","validateWalletOptions","wallet","appearance","preset","undefined","form_only","String","toString","getContainer","container","containerId","document","querySelector","Error","evt","origin","data","checkoutId","type","Loaded","Success","Expired","show3DSModal","ThreeDSStarted","handle3DSReady","postToIframe","close3DSModal","ThreeDSComplete","ThreeDSCanceled","ThreeDSError","render","createElement","src","allow","setAttribute","assign","style","width","height","border","display","appendChild","submit","message","contentWindow","checkoutOrigin","postMessage","position","top","left","alignItems","justifyContent","zIndex","modalContainer","flexDirection","backgroundColor","borderRadius","threeDSUrl","sessionId","step","challengeUrl","acsTransactionId","threeDSVersion","viewportWidth","innerWidth","viewportHeight","innerHeight","modalWidth","Math","min","max","modalHeight","overflow","body","pending3DSData","remove","destroy","removeEventListener","isMounted","PaypercutCheckout"],"mappings":"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"}
|