@starfish-codes/hellgate 3.11.0 → 3.12.0

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.
@@ -14,6 +14,7 @@ export declare abstract class IframeCardElementBase implements BaseElement<Eleme
14
14
  abstract readonly type: ElementType;
15
15
  protected abstract options: ElementBaseOptions;
16
16
  protected abstract inputMaskOptions: FactoryArg;
17
+ protected readonly inputMode?: 'numeric';
17
18
  protected inputMask?: InputMask<FactoryArg>;
18
19
  protected id: string;
19
20
  cardType?: CreditCardType;
@@ -3,6 +3,7 @@ import { ElementBaseOptions, ElementMetadata, ElementType, ITextElement } from '
3
3
  import { IframeCardElementBase } from './base-element';
4
4
  export declare class IframeCardExpirationDate extends IframeCardElementBase implements ITextElement {
5
5
  readonly type: ElementType;
6
+ protected readonly inputMode = "numeric";
6
7
  protected options: ElementBaseOptions;
7
8
  compiledMask?: Masked;
8
9
  protected inputMaskOptions: FactoryArg;
@@ -3,6 +3,7 @@ import { ElementBaseOptions, ElementMetadata, ElementType, ITextElement } from '
3
3
  import { IframeCardElementBase } from './base-element';
4
4
  export declare class IframeCardExpirationMonth extends IframeCardElementBase implements ITextElement {
5
5
  readonly type: ElementType;
6
+ protected readonly inputMode = "numeric";
6
7
  protected options: ElementBaseOptions;
7
8
  compiledMask?: Masked;
8
9
  protected inputMaskOptions: FactoryArg;
@@ -3,6 +3,7 @@ import { ElementBaseOptions, ElementMetadata, ElementType, ITextElement } from '
3
3
  import { IframeCardElementBase } from './base-element';
4
4
  export declare class IframeCardExpirationYear extends IframeCardElementBase implements ITextElement {
5
5
  readonly type: ElementType;
6
+ protected readonly inputMode = "numeric";
6
7
  protected options: ElementBaseOptions;
7
8
  protected inputMaskOptions: FactoryArg;
8
9
  protected validate(masked: Masked): ElementMetadata;
@@ -4,6 +4,7 @@ import { IframeCardElementBase } from './base-element';
4
4
  export type IconPosition = 'left' | 'right' | 'none';
5
5
  export declare class IframeCardNumber extends IframeCardElementBase implements ITextElement {
6
6
  readonly type: ElementType;
7
+ protected readonly inputMode = "numeric";
7
8
  protected options: ElementBaseOptions;
8
9
  protected inputMaskOptions: FactoryArg;
9
10
  update(options: ElementBaseOptions): Promise<void>;
@@ -3,6 +3,7 @@ import { ElementBaseOptions, ElementType, ITextElement } from '../../typings';
3
3
  import { IframeCardElementBase } from './base-element';
4
4
  export declare class IframeCardVerificationCode extends IframeCardElementBase implements ITextElement {
5
5
  readonly type: ElementType;
6
+ protected readonly inputMode = "numeric";
6
7
  protected options: ElementBaseOptions;
7
8
  protected inputMaskOptions: FactoryArg;
8
9
  }
@@ -15,7 +15,7 @@ export declare class IframeCoordinator {
15
15
  private cardHandlerCoordinator;
16
16
  private session;
17
17
  private channel;
18
- constructor(sessionId: string, apiBaseUrl: string, parentOrigin: string);
18
+ constructor(sessionId: string, apiBaseUrl: string, parentOrigin: string, sdkVersion?: string);
19
19
  init: () => Promise<void>;
20
20
  private setupChannelListener;
21
21
  /**
@@ -1 +1 @@
1
- export declare function initCoordinatorIframe(sessionId: string, apiBaseUrl: string, origin: string): void;
1
+ export declare function initCoordinatorIframe(sessionId: string, apiBaseUrl: string, origin: string, sdkVersion?: string): void;
@@ -1,14 +1,14 @@
1
- function C(i) {
1
+ function S(i) {
2
2
  return Array.isArray(i) ? i.filter(Boolean) : Object.fromEntries(Object.entries(i).map(([e, t]) => [
3
3
  e,
4
- typeof t == "object" && t && !Array.isArray(t) ? C(t) : t
4
+ typeof t == "object" && t && !Array.isArray(t) ? S(t) : t
5
5
  ]).filter(([e, t]) => typeof t == "object" && t && !Array.isArray(t) ? !!Object.keys(t).length : t != null && t != null));
6
6
  }
7
7
  function h(i, e) {
8
8
  const t = { ...i, ...e }, r = Object.keys(t);
9
- for (const a of r) {
10
- const n = i[a], s = e[a];
11
- typeof n == "object" && !Array.isArray(n) && n && typeof s == "object" && !Array.isArray(s) && s && (t[a] = h(n, s));
9
+ for (const n of r) {
10
+ const a = i[n], s = e[n];
11
+ typeof a == "object" && !Array.isArray(a) && a && typeof s == "object" && !Array.isArray(s) && s && (t[n] = h(a, s));
12
12
  }
13
13
  return t;
14
14
  }
@@ -17,11 +17,11 @@ function E(i) {
17
17
  throw i;
18
18
  return i.json();
19
19
  }
20
- function S(i) {
20
+ function j(i) {
21
21
  return `https://${window.HG_IFRAME_HOST ?? "sdk.hellgate.io"}/web/${i}/iframe/`;
22
22
  }
23
23
  const F = 2e3;
24
- class k {
24
+ class R {
25
25
  constructor(e, t) {
26
26
  Object.defineProperty(this, "session", {
27
27
  enumerable: !0,
@@ -104,14 +104,14 @@ class k {
104
104
  configurable: !0,
105
105
  writable: !0,
106
106
  value: (r) => {
107
- var a, n;
107
+ var n, a;
108
108
  switch (r.next_action) {
109
109
  case "3ds_check": {
110
110
  this.initCheck3DSIframes(r.data.threeds_server_callback_url, r.data.mon_url);
111
111
  break;
112
112
  }
113
113
  case "3ds_challenge": {
114
- (a = this.onStartHandler) == null || a.call(this), this.disposeCheck3DSIframe(), this.startChallenge(r.data.challenge_url, r.data.result_mon_url);
114
+ (n = this.onStartHandler) == null || n.call(this), this.disposeCheck3DSIframe(), this.startChallenge(r.data.challenge_url, r.data.result_mon_url);
115
115
  break;
116
116
  }
117
117
  case "3ds_challenge_decoupled": {
@@ -119,7 +119,7 @@ class k {
119
119
  break;
120
120
  }
121
121
  case null: {
122
- this.dispose(), (n = this.onFinishHandler) == null || n.call(this);
122
+ this.dispose(), (a = this.onFinishHandler) == null || a.call(this);
123
123
  break;
124
124
  }
125
125
  }
@@ -132,34 +132,34 @@ class k {
132
132
  initCheck3DSIframes(e, t) {
133
133
  const r = p();
134
134
  r.insertAdjacentHTML("beforeend", `<iframe id="check_3ds_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${e}"></iframe>`);
135
- const a = r.querySelector(`#check_3ds_${this.iframeId}`);
136
- if (a) {
137
- const n = (s) => {
138
- s.source === a.contentWindow && this.session.completeAction({ action: "3ds_check", result: s.data });
135
+ const n = r.querySelector(`#check_3ds_${this.iframeId}`);
136
+ if (n) {
137
+ const a = (s) => {
138
+ s.source === n.contentWindow && this.session.completeAction({ action: "3ds_check", result: s.data });
139
139
  };
140
- window.addEventListener("message", n), this.check3dsIframeDisposers.push(() => window.removeEventListener("message", n), () => a.remove());
140
+ window.addEventListener("message", a), this.check3dsIframeDisposers.push(() => window.removeEventListener("message", a), () => n.remove());
141
141
  }
142
142
  if (t) {
143
143
  r.insertAdjacentHTML("beforeend", `<iframe id="mon_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${t}"></iframe>`);
144
- const n = r.querySelector(`#mon_${this.iframeId}`);
145
- n && this.disposers.push(() => n.remove());
144
+ const a = r.querySelector(`#mon_${this.iframeId}`);
145
+ a && this.disposers.push(() => a.remove());
146
146
  }
147
147
  }
148
148
  disposeCheck3DSIframe() {
149
149
  this.check3dsIframeDisposers.forEach((e) => e()), this.check3dsIframeDisposers = [];
150
150
  }
151
151
  startChallenge(e, t) {
152
- const r = p(), a = `<div style="display: flex; flex-direction: column; gap: 10px; align-items: center; ${this.domContainer === r ? 'border:0; max-width: 800px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width:100% " ' : 'border:0;" width="100%" height="100%"'}><iframe id="cha_${this.iframeId}" src="${e}" width="100%" height="500"></iframe>${this.labelText ? '<span id="tds_label_text" style="font-size: large;">' + this.labelText + "</span>" : ""}<div>`;
153
- this.domContainer.insertAdjacentHTML("beforeend", this.domContainer === r ? `<div id="cha_${this.iframeId}_wrap" style="background: #fff; position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 10000;">${a}</div>` : a);
154
- const n = this.domContainer.querySelector(`#cha_${this.iframeId}`), s = this.domContainer.querySelector(`#cha_${this.iframeId}_wrap`);
155
- if (!n)
152
+ const r = p(), n = `<div style="display: flex; flex-direction: column; gap: 10px; align-items: center; ${this.domContainer === r ? 'border:0; max-width: 800px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width:100% " ' : 'border:0;" width="100%" height="100%"'}><iframe id="cha_${this.iframeId}" src="${e}" width="100%" height="500"></iframe>${this.labelText ? '<span id="tds_label_text" style="font-size: large;">' + this.labelText + "</span>" : ""}<div>`;
153
+ this.domContainer.insertAdjacentHTML("beforeend", this.domContainer === r ? `<div id="cha_${this.iframeId}_wrap" style="background: #fff; position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 10000;">${n}</div>` : n);
154
+ const a = this.domContainer.querySelector(`#cha_${this.iframeId}`), s = this.domContainer.querySelector(`#cha_${this.iframeId}_wrap`);
155
+ if (!a)
156
156
  throw new Error("3DS Challenge Iframe initialization failed");
157
157
  this.disposers.push(() => {
158
- n.remove(), s == null || s.remove();
158
+ a.remove(), s == null || s.remove();
159
159
  });
160
160
  const o = new Promise((c) => {
161
161
  const d = (u) => {
162
- u.source !== n.contentWindow || u.data.event !== "AuthResultReady" || c({
162
+ u.source !== a.contentWindow || u.data.event !== "AuthResultReady" || c({
163
163
  ...u.data,
164
164
  requestor_trans_id: u.data.requestor_trans_id ?? u.data.requestorTransId,
165
165
  // TODO: remove this field after the backend is updated
@@ -184,12 +184,12 @@ class k {
184
184
  });
185
185
  }
186
186
  startDecoupledAuth(e, t, r) {
187
- this.transactionId || (this.transactionId = r), this.decoupledAuthHandlers.forEach((n) => n(e));
188
- const a = this.startAuthResultPolling(t, (n) => {
189
- n.event === "AuthResultReady" && (this.session.completeAction({
187
+ this.transactionId || (this.transactionId = r), this.decoupledAuthHandlers.forEach((a) => a(e));
188
+ const n = this.startAuthResultPolling(t, (a) => {
189
+ a.event === "AuthResultReady" && (this.session.completeAction({
190
190
  action: "3ds_challenge_decoupled",
191
- result: { ...n, event: n.event }
192
- }), a());
191
+ result: { ...a, event: a.event }
192
+ }), n());
193
193
  });
194
194
  }
195
195
  startAuthResultPolling(e, t) {
@@ -208,12 +208,12 @@ const y = {
208
208
  backgroundColor: "transparent"
209
209
  }
210
210
  }
211
- }, R = "DOM Element was not found";
211
+ }, $ = "DOM Element was not found";
212
212
  var O;
213
213
  (function(i) {
214
214
  i.NOT_COMPLETE = "NOT_COMPLETE", i.SCHEME_NOT_SUPPORTED = "SCHEME_NOT_SUPPORTED", i.LUHN_CHECK_FAILED = "LUHN_CHECK_FAILED", i.INVALID_EXPIRY_DATE = "INVALID_EXPIRY_DATE";
215
215
  })(O || (O = {}));
216
- const j = (i) => i != null, $ = "v3.11.0";
216
+ const A = (i) => i != null, U = "v3.12.0";
217
217
  class f {
218
218
  constructor(e) {
219
219
  if (Object.defineProperty(this, "options", {
@@ -246,7 +246,7 @@ class f {
246
246
  configurable: !0,
247
247
  writable: !0,
248
248
  value: async ({ ...t }) => {
249
- this.iframe && j(t.height) && (this.iframe.height = t.height), this.iframePostMessage({
249
+ this.iframe && A(t.height) && (this.iframe.height = t.height), this.iframePostMessage({
250
250
  type: "update",
251
251
  data: {
252
252
  ...t,
@@ -283,21 +283,21 @@ class f {
283
283
  var t;
284
284
  (t = this.iframe) == null || t.remove(), this.iframe = null;
285
285
  }
286
- }), this.IFRAME_BASE_URL = S($), !this.IFRAME_BASE_URL)
286
+ }), this.IFRAME_BASE_URL = j(U), !this.IFRAME_BASE_URL)
287
287
  throw new Error("IFRAME_BASE_URL not found");
288
288
  }
289
289
  mount(e) {
290
290
  const t = typeof e == "string" ? document.querySelector(e) : e;
291
291
  if (!t)
292
- throw new Error(`${R}: ${e}`);
292
+ throw new Error(`${$}: ${e}`);
293
293
  t.innerHTML = `<iframe width="100%" height="29" src="${this.IFRAME_BASE_URL}?field=${this.type}&origin=${location.origin}"></iframe>`, this.iframe = t.querySelector("iframe");
294
- const r = (a) => {
295
- var n;
296
- a.source !== ((n = this.iframe) == null ? void 0 : n.contentWindow) || a.data.element !== this.type || this.emitEvent(a.data);
294
+ const r = (n) => {
295
+ var a;
296
+ n.source !== ((a = this.iframe) == null ? void 0 : a.contentWindow) || n.data.element !== this.type || this.emitEvent(n.data);
297
297
  };
298
- return window.addEventListener("message", r), new Promise((a) => {
299
- this.on("ready", (n) => {
300
- this.key = n.key, this.update(this.options), a();
298
+ return window.addEventListener("message", r), new Promise((n) => {
299
+ this.on("ready", (a) => {
300
+ this.key = a.key, this.update(this.options), n();
301
301
  });
302
302
  });
303
303
  }
@@ -315,7 +315,7 @@ class f {
315
315
  (r = (t = this.iframe) == null ? void 0 : t.contentWindow) == null || r.postMessage(e, this.IFRAME_BASE_URL);
316
316
  }
317
317
  }
318
- class U extends f {
318
+ class V extends f {
319
319
  constructor() {
320
320
  super(...arguments), Object.defineProperty(this, "type", {
321
321
  enumerable: !0,
@@ -326,22 +326,22 @@ class U extends f {
326
326
  enumerable: !0,
327
327
  configurable: !0,
328
328
  writable: !0,
329
- value: A
329
+ value: H
330
330
  }), Object.defineProperty(this, "putValue", {
331
331
  enumerable: !0,
332
332
  configurable: !0,
333
333
  writable: !0,
334
- value: H
334
+ value: D
335
335
  });
336
336
  }
337
337
  }
338
- function A(i) {
338
+ function H(i) {
339
339
  return i ? Number(i) : null;
340
340
  }
341
- function H(i) {
341
+ function D(i) {
342
342
  return i ? i < 10 ? `0${i}` : String(i) : null;
343
343
  }
344
- class V extends f {
344
+ class z extends f {
345
345
  constructor() {
346
346
  super(...arguments), Object.defineProperty(this, "type", {
347
347
  enumerable: !0,
@@ -352,38 +352,38 @@ class V extends f {
352
352
  enumerable: !0,
353
353
  configurable: !0,
354
354
  writable: !0,
355
- value: D
355
+ value: T
356
356
  }), Object.defineProperty(this, "putValue", {
357
357
  enumerable: !0,
358
358
  configurable: !0,
359
359
  writable: !0,
360
- value: T
360
+ value: M
361
361
  });
362
362
  }
363
363
  }
364
- function D(i) {
364
+ function T(i) {
365
365
  if (!i)
366
366
  return null;
367
367
  const e = Number(i);
368
368
  return e > 10 ? +`20${e}` : null;
369
369
  }
370
- function T(i) {
370
+ function M(i) {
371
371
  return i ? i >= 100 ? String(i).slice(-2) : String(i) : null;
372
372
  }
373
- function M(i) {
373
+ function I(i) {
374
374
  const [e = null, t = null] = (i ?? "").split("/").map((r) => r.trim());
375
375
  return {
376
- month: A(e),
377
- year: D(t)
376
+ month: H(e),
377
+ year: T(t)
378
378
  };
379
379
  }
380
- function I(i) {
380
+ function L(i) {
381
381
  if (!i)
382
382
  return null;
383
383
  const { month: e, year: t } = i;
384
- return [H(e), T(t)].filter(j).join(" / ");
384
+ return [D(e), M(t)].filter(A).join(" / ");
385
385
  }
386
- class z extends f {
386
+ class B extends f {
387
387
  constructor() {
388
388
  super(...arguments), Object.defineProperty(this, "type", {
389
389
  enumerable: !0,
@@ -394,22 +394,22 @@ class z extends f {
394
394
  enumerable: !0,
395
395
  configurable: !0,
396
396
  writable: !0,
397
- value: M
397
+ value: I
398
398
  }), Object.defineProperty(this, "putValue", {
399
399
  enumerable: !0,
400
400
  configurable: !0,
401
401
  writable: !0,
402
- value: I
402
+ value: L
403
403
  });
404
404
  }
405
405
  }
406
- function L(i) {
406
+ function N(i) {
407
407
  return (i == null ? void 0 : i.replaceAll(" ", "")) ?? null;
408
408
  }
409
- function B(i) {
409
+ function Y(i) {
410
410
  return i;
411
411
  }
412
- class Y extends f {
412
+ class q extends f {
413
413
  constructor() {
414
414
  super(...arguments), Object.defineProperty(this, "type", {
415
415
  enumerable: !0,
@@ -420,16 +420,16 @@ class Y extends f {
420
420
  enumerable: !0,
421
421
  configurable: !0,
422
422
  writable: !0,
423
- value: L
423
+ value: N
424
424
  }), Object.defineProperty(this, "putValue", {
425
425
  enumerable: !0,
426
426
  configurable: !0,
427
427
  writable: !0,
428
- value: B
428
+ value: Y
429
429
  });
430
430
  }
431
431
  }
432
- class q extends f {
432
+ class K extends f {
433
433
  constructor() {
434
434
  super(...arguments), Object.defineProperty(this, "type", {
435
435
  enumerable: !0,
@@ -441,8 +441,8 @@ class q extends f {
441
441
  configurable: !0,
442
442
  writable: !0,
443
443
  value: (e) => e ? {
444
- number: e.cardNumber ? L(e.cardNumber) : null,
445
- expiry_date: e.cardExpirationDate ? M(e.cardExpirationDate) : null,
444
+ number: e.cardNumber ? N(e.cardNumber) : null,
445
+ expiry_date: e.cardExpirationDate ? I(e.cardExpirationDate) : null,
446
446
  cvc: e.cardVerificationCode ?? null
447
447
  } : null
448
448
  }), Object.defineProperty(this, "putValue", {
@@ -451,7 +451,7 @@ class q extends f {
451
451
  writable: !0,
452
452
  value: (e) => e ? {
453
453
  cardNumber: e.number ? e.number : null,
454
- cardExpirationDate: e.expiry_date ? I(e.expiry_date) : null,
454
+ cardExpirationDate: e.expiry_date ? L(e.expiry_date) : null,
455
455
  cardVerificationCode: e.cvc ?? null
456
456
  } : null
457
457
  });
@@ -477,7 +477,7 @@ class G extends f {
477
477
  });
478
478
  }
479
479
  }
480
- class K extends f {
480
+ class W extends f {
481
481
  constructor() {
482
482
  super(...arguments), Object.defineProperty(this, "type", {
483
483
  enumerable: !0,
@@ -500,24 +500,24 @@ class K extends f {
500
500
  function b(i, e) {
501
501
  switch (i) {
502
502
  case "card":
503
- return new q(e);
503
+ return new K(e);
504
504
  case "cardNumber":
505
- return new Y(e);
505
+ return new q(e);
506
506
  case "cardExpirationDate":
507
- return new z(e);
507
+ return new B(e);
508
508
  case "cardExpirationMonth":
509
- return new U(e);
510
- case "cardExpirationYear":
511
509
  return new V(e);
510
+ case "cardExpirationYear":
511
+ return new z(e);
512
512
  case "cardVerificationCode":
513
513
  return new G(e);
514
514
  case "text":
515
- return new K(e);
515
+ return new W(e);
516
516
  default:
517
517
  ASSERT_EXHAUSTIVE(i);
518
518
  }
519
519
  }
520
- const W = {
520
+ const X = {
521
521
  visa: "visa",
522
522
  mastercard: "mastercard",
523
523
  americanexpress: "american-express",
@@ -526,8 +526,8 @@ const W = {
526
526
  jcb: "jcb",
527
527
  unionpay: "unionpay"
528
528
  };
529
- function X(i) {
530
- return i.map((e) => W[e]).filter(Boolean);
529
+ function J(i) {
530
+ return i.map((e) => X[e]).filter(Boolean);
531
531
  }
532
532
  function P(i) {
533
533
  return [
@@ -584,14 +584,14 @@ class w {
584
584
  var s;
585
585
  if (this.hasFormElements())
586
586
  throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");
587
- const a = h({
587
+ const n = h({
588
588
  disabled: !1,
589
589
  autocomplete: "on",
590
590
  style: { ...y }
591
591
  }, r);
592
592
  if (this.session.isNextAction("refresh_security_code") && ((s = this.session.state) != null && s.data)) {
593
593
  const o = this.session.state.data;
594
- a.cvcOnly = !0, a.value = {
594
+ n.cvcOnly = !0, n.value = {
595
595
  number: P(o),
596
596
  expiry_date: {
597
597
  month: (o == null ? void 0 : o.expiry_month) ?? null,
@@ -600,38 +600,38 @@ class w {
600
600
  cvc: null
601
601
  };
602
602
  }
603
- a.schemes = x(this.getSessionSchemes(), a.schemes);
604
- const n = b("card", a);
603
+ n.schemes = x(this.getSessionSchemes(), n.schemes);
604
+ const a = b("card", n);
605
605
  return this.cardElements.card = {
606
- element: n,
606
+ element: a,
607
607
  state: this.createFieldDefaultState()
608
- }, this.addElementStateListener("card"), n;
608
+ }, this.addElementStateListener("card"), a;
609
609
  }
610
610
  }), Object.defineProperty(this, "createTextField", {
611
611
  enumerable: !0,
612
612
  configurable: !0,
613
613
  writable: !0,
614
614
  value: (r = {}) => {
615
- const a = {
615
+ const n = {
616
616
  disabled: !1,
617
617
  autocomplete: "on",
618
618
  style: { ...y }
619
- }, n = b("text", {
620
- ...h(a, { ...r })
619
+ }, a = b("text", {
620
+ ...h(n, { ...r })
621
621
  });
622
- return this.textElements.push(n), n;
622
+ return this.textElements.push(a), a;
623
623
  }
624
624
  }), Object.defineProperty(this, "tokenize", {
625
625
  enumerable: !0,
626
626
  configurable: !0,
627
627
  writable: !0,
628
628
  value: async (r) => {
629
- var n, s;
630
- if (((n = this.session.state) == null ? void 0 : n.next_action) !== "tokenize_card")
629
+ var a, s;
630
+ if (((a = this.session.state) == null ? void 0 : a.next_action) !== "tokenize_card")
631
631
  throw new Error(`The session's next_action='${(s = this.session.state) == null ? void 0 : s.next_action}'. tokenize() is available only if next_action='tokenize_card'`);
632
- const a = this.getCardDataValidationError();
633
- if (a)
634
- throw a;
632
+ const n = this.getCardDataValidationError();
633
+ if (n)
634
+ throw n;
635
635
  return this.coordinator.postMessage({
636
636
  type: "card:tokenize",
637
637
  additionalData: this.serializeAdditionalData(r)
@@ -676,9 +676,9 @@ class w {
676
676
  value: async (r = {}) => {
677
677
  if (!this.hasFormElements())
678
678
  throw new Error("Card form must be initialized and completed before processing");
679
- const a = this.getCardDataValidationError();
680
- if (a)
681
- throw a;
679
+ const n = this.getCardDataValidationError();
680
+ if (n)
681
+ throw n;
682
682
  if (this.session.isNextAction("refresh_security_code"))
683
683
  return this.refreshSecurityCode();
684
684
  this.disableFormElements(!0);
@@ -686,13 +686,13 @@ class w {
686
686
  return this.coordinator.postMessage({
687
687
  type: "card:process",
688
688
  additionalData: this.serializeAdditionalData(r)
689
- }), new Promise((n, s) => {
689
+ }), new Promise((a, s) => {
690
690
  this.coordinator.onMessage("card:process:response", (o) => {
691
- o.result && o.success ? n(o.result) : s(new Error(o.error));
691
+ o.result && o.success ? a(o.result) : s(new Error(o.error));
692
692
  });
693
693
  });
694
- } catch (n) {
695
- throw this.disableFormElements(!1), n;
694
+ } catch (a) {
695
+ throw this.disableFormElements(!1), a;
696
696
  }
697
697
  }
698
698
  }), this.cvcOnlyEnabled = this.session.isNextAction("refresh_security_code");
@@ -705,12 +705,12 @@ class w {
705
705
  disabled: this.cvcOnlyEnabled,
706
706
  autocomplete: "on",
707
707
  style: { ...y }
708
- }, { cardNumber: r = {}, securityCode: a = {}, ...n } = e, s = b("cardNumber", {
708
+ }, { cardNumber: r = {}, securityCode: n = {}, ...a } = e, s = b("cardNumber", {
709
709
  ...h(t, {
710
- ...n,
710
+ ...a,
711
711
  ...r,
712
712
  cvcOnly: this.cvcOnlyEnabled,
713
- schemes: x(this.getSessionSchemes(), r.schemes ?? n.schemes),
713
+ schemes: x(this.getSessionSchemes(), r.schemes ?? a.schemes),
714
714
  value: this.session.isNextAction("refresh_security_code") && ((l = this.session.state) != null && l.data) ? P(this.session.state.data) : null
715
715
  })
716
716
  }), o = b("cardVerificationCode", {
@@ -719,8 +719,8 @@ class w {
719
719
  disabled: !1,
720
720
  autofocus: this.cvcOnlyEnabled
721
721
  }, {
722
- ...n,
723
- ...a
722
+ ...a,
723
+ ...n
724
724
  })
725
725
  });
726
726
  if (s.on("change", (d) => {
@@ -738,12 +738,12 @@ class w {
738
738
  }, this.addElementStateListener("cardNumber"), this.addElementStateListener("cardVerificationCode"), e.expiryDateElement === "separate") {
739
739
  const { expiryMonth: d = {}, expiryYear: u = {} } = e, _ = b("cardExpirationMonth", {
740
740
  ...h(t, {
741
- ...n,
741
+ ...a,
742
742
  ...d
743
743
  })
744
744
  }), v = b("cardExpirationYear", {
745
745
  ...h(t, {
746
- ...n,
746
+ ...a,
747
747
  ...u
748
748
  })
749
749
  });
@@ -757,7 +757,7 @@ class w {
757
757
  } else {
758
758
  const { expiryDate: d = {} } = e, u = b("cardExpirationDate", {
759
759
  ...h(t, {
760
- ...n,
760
+ ...a,
761
761
  ...d,
762
762
  value: this.session.isNextAction("refresh_security_code") && ((c = this.session.state) != null && c.data) ? {
763
763
  month: this.session.state.data.expiry_month,
@@ -809,8 +809,8 @@ class w {
809
809
  valid: !1
810
810
  };
811
811
  }
812
- serializeAdditionalData({ cardholder_name: e, billing_address: t = {}, ephemeral: r, expiration_date: a }) {
813
- return C({
812
+ serializeAdditionalData({ cardholder_name: e, billing_address: t = {}, ephemeral: r, expiration_date: n }) {
813
+ return S({
814
814
  cardholder_name: m(e),
815
815
  billing_address: {
816
816
  line1: m(t.line1),
@@ -819,7 +819,7 @@ class w {
819
819
  city: m(t.city),
820
820
  postal_code: m(t.postal_code)
821
821
  },
822
- ...this.resolveLifecycleFields(r, a)
822
+ ...this.resolveLifecycleFields(r, n)
823
823
  });
824
824
  }
825
825
  resolveLifecycleFields(e, t) {
@@ -845,7 +845,7 @@ class w {
845
845
  return;
846
846
  const e = (t = this.session.state) == null ? void 0 : t.data;
847
847
  if ((r = e == null ? void 0 : e.allowed_schemes) != null && r.length)
848
- return X(e.allowed_schemes);
848
+ return J(e.allowed_schemes);
849
849
  }
850
850
  getCardDataValidationError() {
851
851
  if (!this.state.complete)
@@ -863,7 +863,7 @@ function m(i) {
863
863
  function x(i, e) {
864
864
  return i === void 0 ? e : i.length === 0 ? [] : e != null && e.length ? e.filter((t) => i.includes(t)) : i;
865
865
  }
866
- const J = "v3.11.0";
866
+ const C = "v3.12.0";
867
867
  class Q {
868
868
  constructor() {
869
869
  if (Object.defineProperty(this, "iframe", {
@@ -885,35 +885,35 @@ class Q {
885
885
  enumerable: !0,
886
886
  configurable: !0,
887
887
  writable: !0,
888
- value: async (e, t, r) => (window.fetchMocker = { a: 1 }, new Promise((a, n) => {
888
+ value: async (e, t, r) => (window.fetchMocker = { a: 1 }, new Promise((n, a) => {
889
889
  r == null || r.signal.addEventListener("abort", () => {
890
890
  const l = new Error("Coordinator init aborted");
891
- l.name = "AbortError", n(l), this.dispose();
891
+ l.name = "AbortError", a(l), this.dispose();
892
892
  });
893
893
  const s = document.createElement("div");
894
894
  s.setAttribute("style", "position:absolute;width:0;height:0;overflow:hidden;"), s.setAttribute("data-hg-coordinator", ""), document.body.appendChild(s);
895
- const o = `${this.iframeBaseUrl}?type=coordinator&sessionId=${e}&apiBaseUrl=${t}&origin=${encodeURIComponent(location.origin)}`;
895
+ const o = `${this.iframeBaseUrl}?type=coordinator&sessionId=${e}&apiBaseUrl=${t}&origin=${encodeURIComponent(location.origin)}&sdkVersion=${encodeURIComponent(C)}`;
896
896
  if (s.innerHTML = `<iframe src="${o}" width="0" height="0" style="border:none;" tabindex="-1" aria-hidden="true"></iframe>`, this.iframe = s.querySelector("iframe"), !this.iframe) {
897
- n(new Error("Failed to create coordinator iframe"));
897
+ a(new Error("Failed to create coordinator iframe"));
898
898
  return;
899
899
  }
900
900
  this.messageHandler = (l) => {
901
901
  var c, d, u;
902
902
  if (l.source === ((c = this.iframe) == null ? void 0 : c.contentWindow)) {
903
903
  if (((d = l.data) == null ? void 0 : d.type) === "coordinator:ready") {
904
- a();
904
+ n();
905
905
  return;
906
906
  }
907
907
  if (((u = l.data) == null ? void 0 : u.type) === "coordinator:error") {
908
- n(l.data.error);
908
+ a(l.data.error);
909
909
  return;
910
910
  }
911
911
  }
912
912
  }, window.addEventListener("message", this.messageHandler), this.iframe.addEventListener("error", () => {
913
- n(new Error("Coordinator iframe failed to load"));
913
+ a(new Error("Coordinator iframe failed to load"));
914
914
  });
915
915
  }))
916
- }), this.iframeBaseUrl = S(J), !this.iframeBaseUrl)
916
+ }), this.iframeBaseUrl = j(C), !this.iframeBaseUrl)
917
917
  throw new Error("IFRAME_BASE_URL not found");
918
918
  }
919
919
  /**
@@ -926,8 +926,8 @@ class Q {
926
926
  }
927
927
  onMessage(e, t) {
928
928
  window.addEventListener("message", (r) => {
929
- var a, n;
930
- r.source === ((a = this.iframe) == null ? void 0 : a.contentWindow) && ((n = r.data) == null ? void 0 : n.type) === e && t(r.data);
929
+ var n, a;
930
+ r.source === ((n = this.iframe) == null ? void 0 : n.contentWindow) && ((a = r.data) == null ? void 0 : a.type) === e && t(r.data);
931
931
  });
932
932
  }
933
933
  /**
@@ -940,8 +940,9 @@ class Q {
940
940
  this.iframe = null, e == null || e.remove();
941
941
  }
942
942
  }
943
- class Z {
944
- constructor(e = "https://api.hellgate.io", t = new AbortController()) {
943
+ const Z = "hellgate-web-sdk", ee = "v3.12.0";
944
+ class te {
945
+ constructor(e = "https://api.hellgate.io", t = new AbortController(), { context: r = "window", version: n = ee } = {}) {
945
946
  Object.defineProperty(this, "abortCtrl", {
946
947
  enumerable: !0,
947
948
  configurable: !0,
@@ -952,10 +953,16 @@ class Z {
952
953
  configurable: !0,
953
954
  writable: !0,
954
955
  value: void 0
955
- }), this.baseUrl = e.endsWith("/") ? e.substring(0, e.length - 1) : e;
956
+ }), Object.defineProperty(this, "clientId", {
957
+ enumerable: !0,
958
+ configurable: !0,
959
+ writable: !0,
960
+ value: void 0
961
+ }), this.baseUrl = e.endsWith("/") ? e.substring(0, e.length - 1) : e, this.clientId = `${Z}/${n || "unknown"} (${r})`;
956
962
  }
957
963
  getSession(e) {
958
964
  return fetch(`${this.baseUrl}/sessions/${e}`, {
965
+ headers: this.traceHeaders(),
959
966
  signal: this.abortCtrl.signal
960
967
  }).then((t) => E(t));
961
968
  }
@@ -963,7 +970,8 @@ class Z {
963
970
  return fetch(`${this.baseUrl}/sessions/${e}/complete-action`, {
964
971
  method: "POST",
965
972
  headers: {
966
- "Content-Type": "application/json"
973
+ "Content-Type": "application/json",
974
+ ...this.traceHeaders()
967
975
  },
968
976
  mode: "cors",
969
977
  body: JSON.stringify(t),
@@ -973,9 +981,24 @@ class Z {
973
981
  cancelAll() {
974
982
  this.abortCtrl.abort();
975
983
  }
984
+ /**
985
+ * Traceability headers sent on every backend call: which SDK build and
986
+ * execution context made the request, plus a per-request id to correlate
987
+ * a single failing call with the backend logs.
988
+ */
989
+ traceHeaders() {
990
+ return {
991
+ "x-hellgate-client": this.clientId,
992
+ "x-request-id": re()
993
+ };
994
+ }
976
995
  }
977
- const ee = 2e3;
978
- class te {
996
+ function re() {
997
+ var i;
998
+ return ((i = crypto.randomUUID) == null ? void 0 : i.call(crypto)) ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
999
+ }
1000
+ const ie = 2e3;
1001
+ class ne {
979
1002
  constructor(e, t) {
980
1003
  Object.defineProperty(this, "id", {
981
1004
  enumerable: !0,
@@ -1011,39 +1034,39 @@ class te {
1011
1034
  enumerable: !0,
1012
1035
  configurable: !0,
1013
1036
  writable: !0,
1014
- value: async () => new Promise((r, a) => {
1015
- const n = this.onStateChange((s) => {
1016
- s.next_action !== "wait" && (r(s), n());
1037
+ value: async () => new Promise((r, n) => {
1038
+ const a = this.onStateChange((s) => {
1039
+ s.next_action !== "wait" && (r(s), a());
1017
1040
  });
1018
1041
  this.updateSessionState().catch((s) => {
1019
- s instanceof Response && s.status === 404 && a(new Error(`Session ${this.id} doesn't exist or has expired`)), a(s);
1042
+ s instanceof Response && s.status === 404 && n(new Error(`Session ${this.id} doesn't exist or has expired`)), n(s);
1020
1043
  });
1021
1044
  })
1022
1045
  }), Object.defineProperty(this, "onStateChange", {
1023
1046
  enumerable: !0,
1024
1047
  configurable: !0,
1025
1048
  writable: !0,
1026
- value: (r) => (this.stateChangeHandlers.push(r), this.state && r(this.state), () => this.stateChangeHandlers = this.stateChangeHandlers.filter((a) => a !== r))
1049
+ value: (r) => (this.stateChangeHandlers.push(r), this.state && r(this.state), () => this.stateChangeHandlers = this.stateChangeHandlers.filter((n) => n !== r))
1027
1050
  }), Object.defineProperty(this, "onClose", {
1028
1051
  enumerable: !0,
1029
1052
  configurable: !0,
1030
1053
  writable: !0,
1031
1054
  value: (r) => {
1032
- var a;
1033
- return ((a = this.state) == null ? void 0 : a.next_action) === null ? (r(g(this.state)), () => {
1034
- }) : (this.onCloseHandlers.push(r), () => this.onCloseHandlers = this.onCloseHandlers.filter((n) => n !== r));
1055
+ var n;
1056
+ return ((n = this.state) == null ? void 0 : n.next_action) === null ? (r(g(this.state)), () => {
1057
+ }) : (this.onCloseHandlers.push(r), () => this.onCloseHandlers = this.onCloseHandlers.filter((a) => a !== r));
1035
1058
  }
1036
1059
  }), Object.defineProperty(this, "completeAction", {
1037
1060
  enumerable: !0,
1038
1061
  configurable: !0,
1039
1062
  writable: !0,
1040
1063
  value: async (r) => {
1041
- const a = this.state;
1042
- return new Promise((n, s) => {
1064
+ const n = this.state;
1065
+ return new Promise((a, s) => {
1043
1066
  const o = this.onStateChange((l) => {
1044
- l.next_action !== (a == null ? void 0 : a.next_action) && l.next_action === null && (n(g(l)), o());
1067
+ l.next_action !== (n == null ? void 0 : n.next_action) && l.next_action === null && (a(g(l)), o());
1045
1068
  });
1046
- this.api.completeAction(this.id, r).then((l) => this.newStateHandle(l, s)).catch(async (l) => s(await re(l)));
1069
+ this.api.completeAction(this.id, r).then((l) => this.newStateHandle(l, s)).catch(async (l) => s(await ae(l)));
1047
1070
  });
1048
1071
  }
1049
1072
  }), Object.defineProperty(this, "completeSession", {
@@ -1051,7 +1074,7 @@ class te {
1051
1074
  configurable: !0,
1052
1075
  writable: !0,
1053
1076
  value: (r) => {
1054
- this.onCloseHandlers.forEach((a) => a(r)), this.stop();
1077
+ this.onCloseHandlers.forEach((n) => n(r)), this.stop();
1055
1078
  }
1056
1079
  }), Object.defineProperty(this, "dispose", {
1057
1080
  enumerable: !0,
@@ -1077,26 +1100,26 @@ class te {
1077
1100
  var r;
1078
1101
  switch (!e.next_action && e.status && (e.next_action = null), e.next_action) {
1079
1102
  case "wait": {
1080
- window.clearTimeout(this.pollingTimer), this.pollingTimer = window.setTimeout(() => this.updateSessionState(t).catch((a) => {
1081
- a instanceof Response && a.status === 404 && (t == null || t(new Error(`Session ${this.id} has expired`)));
1082
- }), ee);
1103
+ window.clearTimeout(this.pollingTimer), this.pollingTimer = window.setTimeout(() => this.updateSessionState(t).catch((n) => {
1104
+ n instanceof Response && n.status === 404 && (t == null || t(new Error(`Session ${this.id} has expired`)));
1105
+ }), ie);
1083
1106
  break;
1084
1107
  }
1085
1108
  }
1086
- e.next_action !== ((r = this.state) == null ? void 0 : r.next_action) && this.stateChangeHandlers.forEach((a) => a(e)), e.next_action === null && this.completeSession(g(e)), this.state = e;
1109
+ e.next_action !== ((r = this.state) == null ? void 0 : r.next_action) && this.stateChangeHandlers.forEach((n) => n(e)), e.next_action === null && this.completeSession(g(e)), this.state = e;
1087
1110
  }
1088
1111
  }
1089
- async function re(i) {
1112
+ async function ae(i) {
1090
1113
  return !i.ok && i.status >= 400 && i.status <= 500 ? i.json() : i;
1091
1114
  }
1092
1115
  function g(i) {
1093
1116
  const e = { ...i };
1094
1117
  return delete e.next_action, e;
1095
1118
  }
1096
- const ie = {
1119
+ const se = {
1097
1120
  base_url: "https://api.hellgate.io"
1098
1121
  };
1099
- class N {
1122
+ class k {
1100
1123
  constructor(e, t, r) {
1101
1124
  Object.defineProperty(this, "session", {
1102
1125
  enumerable: !0,
@@ -1118,14 +1141,14 @@ class N {
1118
1141
  configurable: !0,
1119
1142
  writable: !0,
1120
1143
  value: () => {
1121
- this.session.dispose(), this.coordinator.dispose(), Object.values(this.paymentFlowHandlers).forEach((a) => a == null ? void 0 : a.dispose());
1144
+ this.session.dispose(), this.coordinator.dispose(), Object.values(this.paymentFlowHandlers).forEach((n) => n == null ? void 0 : n.dispose());
1122
1145
  }
1123
1146
  }), Object.defineProperty(this, "onSessionComplete", {
1124
1147
  enumerable: !0,
1125
1148
  configurable: !0,
1126
1149
  writable: !0,
1127
- value: (a) => {
1128
- this.session.onClose(a);
1150
+ value: (n) => {
1151
+ this.session.onClose(n);
1129
1152
  }
1130
1153
  });
1131
1154
  }
@@ -1133,28 +1156,28 @@ class N {
1133
1156
  return this.paymentFlowHandlers[e];
1134
1157
  }
1135
1158
  static async init(e, t = {}) {
1136
- const { session: r, coordinator: a, cardHandler: n, handler3DS: s } = await this.initHandlers(e, t);
1137
- return new N(r, a, {
1138
- CARD: n,
1159
+ const { session: r, coordinator: n, cardHandler: a, handler3DS: s } = await this.initHandlers(e, t);
1160
+ return new k(r, n, {
1161
+ CARD: a,
1139
1162
  "3DS": s
1140
1163
  });
1141
1164
  }
1142
1165
  static async initHandlers(e, t) {
1143
1166
  const r = {
1144
- ...ie,
1167
+ ...se,
1145
1168
  ...t
1146
- }, a = new Z(r.base_url, r.abortCtrl), n = new te(e, a), s = new Q();
1169
+ }, n = new te(r.base_url, r.abortCtrl), a = new ne(e, n), s = new Q();
1147
1170
  s.onMessage("coordinator:session_state_change", (c) => {
1148
- c.state.next_action !== "wait" && n.newStateHandle(c.state);
1171
+ c.state.next_action !== "wait" && a.newStateHandle(c.state);
1149
1172
  }), await s.init(e, r.base_url, r.abortCtrl);
1150
- const o = n.isNextAction("tokenize_card") || n.isNextAction("refresh_security_code") ? await this.createCardHandler(n, s) : void 0, l = this.create3DSHandler(n, t);
1151
- return { session: n, coordinator: s, cardHandler: o, handler3DS: l };
1173
+ const o = a.isNextAction("tokenize_card") || a.isNextAction("refresh_security_code") ? await this.createCardHandler(a, s) : void 0, l = this.create3DSHandler(a, t);
1174
+ return { session: a, coordinator: s, cardHandler: o, handler3DS: l };
1152
1175
  }
1153
1176
  static createCardHandler(e, t) {
1154
1177
  return w.init(e, t);
1155
1178
  }
1156
1179
  static create3DSHandler(e, t) {
1157
- return new k(e, {
1180
+ return new R(e, {
1158
1181
  domContainer: t.challenge_3ds_container,
1159
1182
  labelText: t.challenge_3ds_label_text
1160
1183
  });
@@ -1162,17 +1185,17 @@ class N {
1162
1185
  }
1163
1186
  globalThis.HellgateSDK && (globalThis.Hellgate = globalThis.HellgateSDK.Hellgate, delete globalThis.HellgateSDK);
1164
1187
  export {
1165
- q as CardElement,
1166
- z as CardExpirationDateElement,
1167
- Y as CardNumberElement,
1188
+ K as CardElement,
1189
+ B as CardExpirationDateElement,
1190
+ q as CardNumberElement,
1168
1191
  G as CardVerificationCodeElement,
1169
- N as Hellgate,
1170
- k as Hellgate3DSHandler,
1192
+ k as Hellgate,
1193
+ R as Hellgate3DSHandler,
1171
1194
  w as HellgateCardHandler,
1172
- K as TextElement,
1195
+ W as TextElement,
1173
1196
  b as createElement,
1174
- L as extractCardNumberValue,
1175
- M as extractExpiryDateValue,
1176
- B as putCardNumberValue,
1177
- I as putExpiryDateValue
1197
+ N as extractCardNumberValue,
1198
+ I as extractExpiryDateValue,
1199
+ Y as putCardNumberValue,
1200
+ L as putExpiryDateValue
1178
1201
  };
@@ -1 +1 @@
1
- (function(c,p){typeof exports=="object"&&typeof module<"u"?p(exports):typeof define=="function"&&define.amd?define(["exports"],p):(c=typeof globalThis<"u"?globalThis:c||self,p(c.HellgateSDK={}))})(this,function(c){"use strict";function p(i){return Array.isArray(i)?i.filter(Boolean):Object.fromEntries(Object.entries(i).map(([e,t])=>[e,typeof t=="object"&&t&&!Array.isArray(t)?p(t):t]).filter(([e,t])=>typeof t=="object"&&t&&!Array.isArray(t)?!!Object.keys(t).length:t!=null&&t!=null))}function b(i,e){const t={...i,...e},r=Object.keys(t);for(const a of r){const n=i[a],s=e[a];typeof n=="object"&&!Array.isArray(n)&&n&&typeof s=="object"&&!Array.isArray(s)&&s&&(t[a]=b(n,s))}return t}function E(i){if(!i.ok)throw i;return i.json()}function S(i){return`https://${window.HG_IFRAME_HOST??"sdk.hellgate.io"}/web/${i}/iframe/`}const Y=2e3;class j{constructor(e,t){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"iframeId",{enumerable:!0,configurable:!0,writable:!0,value:String(Math.floor(1e5+Math.random()*9e5))}),Object.defineProperty(this,"resultPollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"transactionId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"decoupledAuthHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"disposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"check3dsIframeDisposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"domContainer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"labelText",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onStartHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onFinishHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onDecoupledAuth",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.decoupledAuthHandlers.push(r)}}),Object.defineProperty(this,"onStartChallenge",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onStartHandler=r}}),Object.defineProperty(this,"onChallengeFinished",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onFinishHandler=r}}),Object.defineProperty(this,"sessionStateHandle",{enumerable:!0,configurable:!0,writable:!0,value:r=>{var a,n;switch(r.next_action){case"3ds_check":{this.initCheck3DSIframes(r.data.threeds_server_callback_url,r.data.mon_url);break}case"3ds_challenge":{(a=this.onStartHandler)==null||a.call(this),this.disposeCheck3DSIframe(),this.startChallenge(r.data.challenge_url,r.data.result_mon_url);break}case"3ds_challenge_decoupled":{this.startDecoupledAuth(r.data.cardholder_info,r.data.result_mon_url,r.data.transaction_id);break}case null:{this.dispose(),(n=this.onFinishHandler)==null||n.call(this);break}}}}),this.domContainer=t.domContainer??w(),this.disposers.push(this.session.onStateChange(this.sessionStateHandle)),this.labelText=t.labelText}dispose(){this.disposers.forEach(e=>e()),this.check3dsIframeDisposers.forEach(e=>e())}initCheck3DSIframes(e,t){const r=w();r.insertAdjacentHTML("beforeend",`<iframe id="check_3ds_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${e}"></iframe>`);const a=r.querySelector(`#check_3ds_${this.iframeId}`);if(a){const n=s=>{s.source===a.contentWindow&&this.session.completeAction({action:"3ds_check",result:s.data})};window.addEventListener("message",n),this.check3dsIframeDisposers.push(()=>window.removeEventListener("message",n),()=>a.remove())}if(t){r.insertAdjacentHTML("beforeend",`<iframe id="mon_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${t}"></iframe>`);const n=r.querySelector(`#mon_${this.iframeId}`);n&&this.disposers.push(()=>n.remove())}}disposeCheck3DSIframe(){this.check3dsIframeDisposers.forEach(e=>e()),this.check3dsIframeDisposers=[]}startChallenge(e,t){const r=w(),a=`<div style="display: flex; flex-direction: column; gap: 10px; align-items: center; ${this.domContainer===r?'border:0; max-width: 800px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width:100% " ':'border:0;" width="100%" height="100%"'}><iframe id="cha_${this.iframeId}" src="${e}" width="100%" height="500"></iframe>${this.labelText?'<span id="tds_label_text" style="font-size: large;">'+this.labelText+"</span>":""}<div>`;this.domContainer.insertAdjacentHTML("beforeend",this.domContainer===r?`<div id="cha_${this.iframeId}_wrap" style="background: #fff; position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 10000;">${a}</div>`:a);const n=this.domContainer.querySelector(`#cha_${this.iframeId}`),s=this.domContainer.querySelector(`#cha_${this.iframeId}_wrap`);if(!n)throw new Error("3DS Challenge Iframe initialization failed");this.disposers.push(()=>{n.remove(),s==null||s.remove()});const o=new Promise(d=>{const h=u=>{u.source!==n.contentWindow||u.data.event!=="AuthResultReady"||d({...u.data,requestor_trans_id:u.data.requestor_trans_id??u.data.requestorTransId,requestorTransId:void 0,param:u.data.param||void 0})};window.addEventListener("message",h),this.disposers.push(()=>window.removeEventListener("message",h))}),l=new Promise(d=>{const h=this.startAuthResultPolling(t,u=>{u.event==="AuthResultReady"&&(h(),d({requestor_trans_id:u.threeDSRequestorTransID,event:u.event}))})});Promise.any([o,l]).then(d=>{this.session.completeAction({action:"3ds_challenge",result:d})})}startDecoupledAuth(e,t,r){this.transactionId||(this.transactionId=r),this.decoupledAuthHandlers.forEach(n=>n(e));const a=this.startAuthResultPolling(t,n=>{n.event==="AuthResultReady"&&(this.session.completeAction({action:"3ds_challenge_decoupled",result:{...n,event:n.event}}),a())})}startAuthResultPolling(e,t){return window.clearTimeout(this.resultPollingTimer),this.resultPollingTimer=window.setTimeout(()=>fetch(e).then(r=>E(r)).then(r=>{this.startAuthResultPolling(e,t),t(r)}).catch(()=>{}),Y),()=>window.clearTimeout(this.resultPollingTimer)}}function w(){return document.body}const _={base:{":disabled":{backgroundColor:"transparent"}}},q="DOM Element was not found";var A;(function(i){i.NOT_COMPLETE="NOT_COMPLETE",i.SCHEME_NOT_SUPPORTED="SCHEME_NOT_SUPPORTED",i.LUHN_CHECK_FAILED="LUHN_CHECK_FAILED",i.INVALID_EXPIRY_DATE="INVALID_EXPIRY_DATE"})(A||(A={}));const H=i=>i!=null,K="v3.11.0";class m{constructor(e){if(Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"IFRAME_BASE_URL",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"subscriptions",{enumerable:!0,configurable:!0,writable:!0,value:{ready:[],blur:[],focus:[],keydown:[],change:[]}}),Object.defineProperty(this,"key",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:async({...t})=>{this.iframe&&H(t.height)&&(this.iframe.height=t.height),this.iframePostMessage({type:"update",data:{...t,value:t.value?this.putValue(t.value)??void 0:void 0}})}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"clear"})}}),Object.defineProperty(this,"focus",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"focus"})}}),Object.defineProperty(this,"blur",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"blur"})}}),Object.defineProperty(this,"unmount",{enumerable:!0,configurable:!0,writable:!0,value:()=>{var t;(t=this.iframe)==null||t.remove(),this.iframe=null}}),this.IFRAME_BASE_URL=S(K),!this.IFRAME_BASE_URL)throw new Error("IFRAME_BASE_URL not found")}mount(e){const t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`${q}: ${e}`);t.innerHTML=`<iframe width="100%" height="29" src="${this.IFRAME_BASE_URL}?field=${this.type}&origin=${location.origin}"></iframe>`,this.iframe=t.querySelector("iframe");const r=a=>{var n;a.source!==((n=this.iframe)==null?void 0:n.contentWindow)||a.data.element!==this.type||this.emitEvent(a.data)};return window.addEventListener("message",r),new Promise(a=>{this.on("ready",n=>{this.key=n.key,this.update(this.options),a()})})}on(e,t){return this.subscriptions[e].push(t),{unsubscribe:()=>this.subscriptions[e].splice(this.subscriptions[e].indexOf(t),1)}}emitEvent(e){var t;(t=this.subscriptions[e.type])==null||t.forEach(r=>r(e.data))}iframePostMessage(e){var t,r;(r=(t=this.iframe)==null?void 0:t.contentWindow)==null||r.postMessage(e,this.IFRAME_BASE_URL)}}class G extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationMonth"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:D}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:T})}}function D(i){return i?Number(i):null}function T(i){return i?i<10?`0${i}`:String(i):null}class W extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationYear"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:M}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:I})}}function M(i){if(!i)return null;const e=Number(i);return e>10?+`20${e}`:null}function I(i){return i?i>=100?String(i).slice(-2):String(i):null}function v(i){const[e=null,t=null]=(i??"").split("/").map(r=>r.trim());return{month:D(e),year:M(t)}}function O(i){if(!i)return null;const{month:e,year:t}=i;return[T(e),I(t)].filter(H).join(" / ")}class L extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationDate"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:v}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:O})}}function P(i){return(i==null?void 0:i.replaceAll(" ",""))??null}function N(i){return i}class F extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardNumber"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:P}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:N})}}class k extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"card"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{number:e.cardNumber?P(e.cardNumber):null,expiry_date:e.cardExpirationDate?v(e.cardExpirationDate):null,cvc:e.cardVerificationCode??null}:null}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{cardNumber:e.number?e.number:null,cardExpirationDate:e.expiry_date?O(e.expiry_date):null,cardVerificationCode:e.cvc??null}:null})}}class R extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardVerificationCode"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}class $ extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"text"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}function f(i,e){switch(i){case"card":return new k(e);case"cardNumber":return new F(e);case"cardExpirationDate":return new L(e);case"cardExpirationMonth":return new G(e);case"cardExpirationYear":return new W(e);case"cardVerificationCode":return new R(e);case"text":return new $(e);default:ASSERT_EXHAUSTIVE(i)}}const X={visa:"visa",mastercard:"mastercard",americanexpress:"american-express",discover:"discover",dinersclub:"diners-club",jcb:"jcb",unionpay:"unionpay"};function J(i){return i.map(e=>X[e]).filter(Boolean)}function U(i){return[i.issuer_identification_number,"".padEnd(i.account_number_length-i.issuer_identification_number.length-i.account_number_last_four.length,"*"),i.account_number_last_four].join(" ")}class g{static async init(e,t){return new g(e,t)}constructor(e,t){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"coordinator",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:this.createFieldDefaultState()}),Object.defineProperty(this,"cardElements",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"textElements",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"cvcOnlyEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"createForm",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{var s;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const a=b({disabled:!1,autocomplete:"on",style:{..._}},r);if(this.session.isNextAction("refresh_security_code")&&((s=this.session.state)!=null&&s.data)){const o=this.session.state.data;a.cvcOnly=!0,a.value={number:U(o),expiry_date:{month:(o==null?void 0:o.expiry_month)??null,year:(o==null?void 0:o.expiry_year)??null},cvc:null}}a.schemes=V(this.getSessionSchemes(),a.schemes);const n=f("card",a);return this.cardElements.card={element:n,state:this.createFieldDefaultState()},this.addElementStateListener("card"),n}}),Object.defineProperty(this,"createTextField",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{const a={disabled:!1,autocomplete:"on",style:{..._}},n=f("text",{...b(a,{...r})});return this.textElements.push(n),n}}),Object.defineProperty(this,"tokenize",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{var n,s;if(((n=this.session.state)==null?void 0:n.next_action)!=="tokenize_card")throw new Error(`The session's next_action='${(s=this.session.state)==null?void 0:s.next_action}'. tokenize() is available only if next_action='tokenize_card'`);const a=this.getCardDataValidationError();if(a)throw a;return this.coordinator.postMessage({type:"card:tokenize",additionalData:this.serializeAdditionalData(r)}),new Promise(o=>{this.coordinator.onMessage("card:tokenize:response",l=>{o(l.success?l.result:null)})})}}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.stateChangeHandlers.push(r),r(this.state)}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.clear()),this.textElements.forEach(r=>r==null?void 0:r.clear())}}),Object.defineProperty(this,"reset",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.unmount()),this.textElements.forEach(r=>r==null?void 0:r.unmount()),this.cardElements={},this.textElements=[],this.state=this.createFieldDefaultState()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.reset()}}),Object.defineProperty(this,"process",{enumerable:!0,configurable:!0,writable:!0,value:async(r={})=>{if(!this.hasFormElements())throw new Error("Card form must be initialized and completed before processing");const a=this.getCardDataValidationError();if(a)throw a;if(this.session.isNextAction("refresh_security_code"))return this.refreshSecurityCode();this.disableFormElements(!0);try{return this.coordinator.postMessage({type:"card:process",additionalData:this.serializeAdditionalData(r)}),new Promise((n,s)=>{this.coordinator.onMessage("card:process:response",o=>{o.result&&o.success?n(o.result):s(new Error(o.error))})})}catch(n){throw this.disableFormElements(!1),n}}}),this.cvcOnlyEnabled=this.session.isNextAction("refresh_security_code")}createFormFields(e={}){var l,d;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const t={disabled:this.cvcOnlyEnabled,autocomplete:"on",style:{..._}},{cardNumber:r={},securityCode:a={},...n}=e,s=f("cardNumber",{...b(t,{...n,...r,cvcOnly:this.cvcOnlyEnabled,schemes:V(this.getSessionSchemes(),r.schemes??n.schemes),value:this.session.isNextAction("refresh_security_code")&&((l=this.session.state)!=null&&l.data)?U(this.session.state.data):null})}),o=f("cardVerificationCode",{...b({...t,disabled:!1,autofocus:this.cvcOnlyEnabled},{...n,...a})});if(s.on("change",h=>{const u=h.cardBrand;o.update({cardType:u})}),this.cardElements={cardNumber:{element:s,state:this.createFieldDefaultState()},cardVerificationCode:{element:o,state:this.createFieldDefaultState()}},this.addElementStateListener("cardNumber"),this.addElementStateListener("cardVerificationCode"),e.expiryDateElement==="separate"){const{expiryMonth:h={},expiryYear:u={}}=e,z=f("cardExpirationMonth",{...b(t,{...n,...h})}),B=f("cardExpirationYear",{...b(t,{...n,...u})});return this.cardElements.cardExpirationMonth={element:z,state:this.createFieldDefaultState()},this.cardElements.cardExpirationYear={element:B,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationMonth"),this.addElementStateListener("cardExpirationYear"),{cardNumber:s,expiryMonth:z,expiryYear:B,securityCode:o}}else{const{expiryDate:h={}}=e,u=f("cardExpirationDate",{...b(t,{...n,...h,value:this.session.isNextAction("refresh_security_code")&&((d=this.session.state)!=null&&d.data)?{month:this.session.state.data.expiry_month,year:this.session.state.data.expiry_year}:null})});return this.cardElements.cardExpirationDate={element:u,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationDate"),{cardNumber:s,expiryDate:u,securityCode:o}}}async refreshSecurityCode(){return this.coordinator.postMessage({type:"card:refresh_security_code"}),new Promise((e,t)=>{this.coordinator.onMessage("card:refresh_security_code:response",r=>{r.result?e(r.result):t(new Error(r.error))})})}hasFormElements(){return!!Object.keys(this.cardElements).length}disableFormElements(e){Object.values(this.cardElements).forEach(({element:t})=>{t.update({disabled:e})})}addElementStateListener(e){const t=this.cardElements[e];t&&t.element.on("change",r=>{t.state=r,this.updateFormState()})}updateFormState(){const e=this.cvcOnlyEnabled&&this.cardElements.cardVerificationCode?[this.cardElements.cardVerificationCode]:Object.values(this.cardElements);e.length?this.state=e.reduce((t,{state:r})=>(t.valid=!!t.valid&&!!r.valid,t.complete=!!t.complete&&!!r.complete,t.empty=!!t.empty&&!!r.empty,t.error=t.error||r.error,t.errorCode=t.errorCode||r.errorCode,t),{valid:!0,complete:!0,empty:!0}):this.state=this.createFieldDefaultState(),this.stateChangeHandlers.forEach(t=>t(this.state))}createFieldDefaultState(){return{empty:!0,complete:!1,valid:!1}}serializeAdditionalData({cardholder_name:e,billing_address:t={},ephemeral:r,expiration_date:a}){return p({cardholder_name:y(e),billing_address:{line1:y(t.line1),line2:y(t.line2),line3:y(t.line3),city:y(t.city),postal_code:y(t.postal_code)},...this.resolveLifecycleFields(r,a)})}resolveLifecycleFields(e,t){switch(this.getLifecycle()){case"ephemeral_only":return{ephemeral:!0};case"persistent_only":return{ephemeral:!1};case"user_choice":return{ephemeral:typeof e=="boolean"?e:void 0,expiration_date:typeof t=="string"?t:void 0}}}getLifecycle(){var e,t;return this.session.isNextAction("tokenize_card")?((t=(e=this.session.state)==null?void 0:e.data)==null?void 0:t.lifecycle)??"user_choice":"user_choice"}getSessionSchemes(){var t,r;if(!this.session.isNextAction("tokenize_card"))return;const e=(t=this.session.state)==null?void 0:t.data;if((r=e==null?void 0:e.allowed_schemes)!=null&&r.length)return J(e.allowed_schemes)}getCardDataValidationError(){if(!this.state.complete)return new Error(this.state.error??"Card data is not complete");if(!this.state.valid)return new Error(`Card data is not valid. ${this.state.error}`)}}function y(i){if(typeof i=="string")return i;if(i!=null&&i.key)return{key:i.key}}function V(i,e){return i===void 0?e:i.length===0?[]:e!=null&&e.length?e.filter(t=>i.includes(t)):i}const Q="v3.11.0";class Z{constructor(){if(Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"iframeBaseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"messageHandler",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async(e,t,r)=>(window.fetchMocker={a:1},new Promise((a,n)=>{r==null||r.signal.addEventListener("abort",()=>{const l=new Error("Coordinator init aborted");l.name="AbortError",n(l),this.dispose()});const s=document.createElement("div");s.setAttribute("style","position:absolute;width:0;height:0;overflow:hidden;"),s.setAttribute("data-hg-coordinator",""),document.body.appendChild(s);const o=`${this.iframeBaseUrl}?type=coordinator&sessionId=${e}&apiBaseUrl=${t}&origin=${encodeURIComponent(location.origin)}`;if(s.innerHTML=`<iframe src="${o}" width="0" height="0" style="border:none;" tabindex="-1" aria-hidden="true"></iframe>`,this.iframe=s.querySelector("iframe"),!this.iframe){n(new Error("Failed to create coordinator iframe"));return}this.messageHandler=l=>{var d,h,u;if(l.source===((d=this.iframe)==null?void 0:d.contentWindow)){if(((h=l.data)==null?void 0:h.type)==="coordinator:ready"){a();return}if(((u=l.data)==null?void 0:u.type)==="coordinator:error"){n(l.data.error);return}}},window.addEventListener("message",this.messageHandler),this.iframe.addEventListener("error",()=>{n(new Error("Coordinator iframe failed to load"))})}))}),this.iframeBaseUrl=S(Q),!this.iframeBaseUrl)throw new Error("IFRAME_BASE_URL not found")}postMessage(e){var t,r;(r=(t=this.iframe)==null?void 0:t.contentWindow)==null||r.postMessage(e,this.iframeBaseUrl)}onMessage(e,t){window.addEventListener("message",r=>{var a,n;r.source===((a=this.iframe)==null?void 0:a.contentWindow)&&((n=r.data)==null?void 0:n.type)===e&&t(r.data)})}dispose(){var t;this.postMessage({type:"coordinator:dispose"}),this.messageHandler&&(window.removeEventListener("message",this.messageHandler),this.messageHandler=null);const e=(t=this.iframe)==null?void 0:t.parentElement;this.iframe=null,e==null||e.remove()}}class ee{constructor(e="https://api.hellgate.io",t=new AbortController){Object.defineProperty(this,"abortCtrl",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"baseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.baseUrl=e.endsWith("/")?e.substring(0,e.length-1):e}getSession(e){return fetch(`${this.baseUrl}/sessions/${e}`,{signal:this.abortCtrl.signal}).then(t=>E(t))}completeAction(e,t){return fetch(`${this.baseUrl}/sessions/${e}/complete-action`,{method:"POST",headers:{"Content-Type":"application/json"},mode:"cors",body:JSON.stringify(t),signal:this.abortCtrl.signal}).then(r=>E(r))}cancelAll(){this.abortCtrl.abort()}}const te=2e3;class re{constructor(e,t){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"onCloseHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"pollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async()=>new Promise((r,a)=>{const n=this.onStateChange(s=>{s.next_action!=="wait"&&(r(s),n())});this.updateSessionState().catch(s=>{s instanceof Response&&s.status===404&&a(new Error(`Session ${this.id} doesn't exist or has expired`)),a(s)})})}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>(this.stateChangeHandlers.push(r),this.state&&r(this.state),()=>this.stateChangeHandlers=this.stateChangeHandlers.filter(a=>a!==r))}),Object.defineProperty(this,"onClose",{enumerable:!0,configurable:!0,writable:!0,value:r=>{var a;return((a=this.state)==null?void 0:a.next_action)===null?(r(x(this.state)),()=>{}):(this.onCloseHandlers.push(r),()=>this.onCloseHandlers=this.onCloseHandlers.filter(n=>n!==r))}}),Object.defineProperty(this,"completeAction",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{const a=this.state;return new Promise((n,s)=>{const o=this.onStateChange(l=>{l.next_action!==(a==null?void 0:a.next_action)&&l.next_action===null&&(n(x(l)),o())});this.api.completeAction(this.id,r).then(l=>this.newStateHandle(l,s)).catch(async l=>s(await ie(l)))})}}),Object.defineProperty(this,"completeSession",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onCloseHandlers.forEach(a=>a(r)),this.stop()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.stop(),this.api.cancelAll()}})}isNextAction(e){var t;return((t=this.state)==null?void 0:t.next_action)===e}stop(){window.clearTimeout(this.pollingTimer),this.stateChangeHandlers=[],this.onCloseHandlers=[]}async updateSessionState(e){const t=await this.api.getSession(this.id);this.newStateHandle(t,e)}newStateHandle(e,t){var r;switch(!e.next_action&&e.status&&(e.next_action=null),e.next_action){case"wait":{window.clearTimeout(this.pollingTimer),this.pollingTimer=window.setTimeout(()=>this.updateSessionState(t).catch(a=>{a instanceof Response&&a.status===404&&(t==null||t(new Error(`Session ${this.id} has expired`)))}),te);break}}e.next_action!==((r=this.state)==null?void 0:r.next_action)&&this.stateChangeHandlers.forEach(a=>a(e)),e.next_action===null&&this.completeSession(x(e)),this.state=e}}async function ie(i){return!i.ok&&i.status>=400&&i.status<=500?i.json():i}function x(i){const e={...i};return delete e.next_action,e}const ae={base_url:"https://api.hellgate.io"};class C{constructor(e,t,r){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"coordinator",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"paymentFlowHandlers",{enumerable:!0,configurable:!0,writable:!0,value:r}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.session.dispose(),this.coordinator.dispose(),Object.values(this.paymentFlowHandlers).forEach(a=>a==null?void 0:a.dispose())}}),Object.defineProperty(this,"onSessionComplete",{enumerable:!0,configurable:!0,writable:!0,value:a=>{this.session.onClose(a)}})}use(e){return this.paymentFlowHandlers[e]}static async init(e,t={}){const{session:r,coordinator:a,cardHandler:n,handler3DS:s}=await this.initHandlers(e,t);return new C(r,a,{CARD:n,"3DS":s})}static async initHandlers(e,t){const r={...ae,...t},a=new ee(r.base_url,r.abortCtrl),n=new re(e,a),s=new Z;s.onMessage("coordinator:session_state_change",d=>{d.state.next_action!=="wait"&&n.newStateHandle(d.state)}),await s.init(e,r.base_url,r.abortCtrl);const o=n.isNextAction("tokenize_card")||n.isNextAction("refresh_security_code")?await this.createCardHandler(n,s):void 0,l=this.create3DSHandler(n,t);return{session:n,coordinator:s,cardHandler:o,handler3DS:l}}static createCardHandler(e,t){return g.init(e,t)}static create3DSHandler(e,t){return new j(e,{domContainer:t.challenge_3ds_container,labelText:t.challenge_3ds_label_text})}}c.CardElement=k,c.CardExpirationDateElement=L,c.CardNumberElement=F,c.CardVerificationCodeElement=R,c.Hellgate=C,c.Hellgate3DSHandler=j,c.HellgateCardHandler=g,c.TextElement=$,c.createElement=f,c.extractCardNumberValue=P,c.extractExpiryDateValue=v,c.putCardNumberValue=N,c.putExpiryDateValue=O,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});globalThis.HellgateSDK&&(globalThis.Hellgate=globalThis.HellgateSDK.Hellgate,delete globalThis.HellgateSDK);
1
+ (function(c,p){typeof exports=="object"&&typeof module<"u"?p(exports):typeof define=="function"&&define.amd?define(["exports"],p):(c=typeof globalThis<"u"?globalThis:c||self,p(c.HellgateSDK={}))})(this,function(c){"use strict";function p(i){return Array.isArray(i)?i.filter(Boolean):Object.fromEntries(Object.entries(i).map(([e,t])=>[e,typeof t=="object"&&t&&!Array.isArray(t)?p(t):t]).filter(([e,t])=>typeof t=="object"&&t&&!Array.isArray(t)?!!Object.keys(t).length:t!=null&&t!=null))}function b(i,e){const t={...i,...e},r=Object.keys(t);for(const n of r){const a=i[n],s=e[n];typeof a=="object"&&!Array.isArray(a)&&a&&typeof s=="object"&&!Array.isArray(s)&&s&&(t[n]=b(a,s))}return t}function E(i){if(!i.ok)throw i;return i.json()}function S(i){return`https://${window.HG_IFRAME_HOST??"sdk.hellgate.io"}/web/${i}/iframe/`}const q=2e3;class j{constructor(e,t){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"iframeId",{enumerable:!0,configurable:!0,writable:!0,value:String(Math.floor(1e5+Math.random()*9e5))}),Object.defineProperty(this,"resultPollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"transactionId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"decoupledAuthHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"disposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"check3dsIframeDisposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"domContainer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"labelText",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onStartHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onFinishHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onDecoupledAuth",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.decoupledAuthHandlers.push(r)}}),Object.defineProperty(this,"onStartChallenge",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onStartHandler=r}}),Object.defineProperty(this,"onChallengeFinished",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onFinishHandler=r}}),Object.defineProperty(this,"sessionStateHandle",{enumerable:!0,configurable:!0,writable:!0,value:r=>{var n,a;switch(r.next_action){case"3ds_check":{this.initCheck3DSIframes(r.data.threeds_server_callback_url,r.data.mon_url);break}case"3ds_challenge":{(n=this.onStartHandler)==null||n.call(this),this.disposeCheck3DSIframe(),this.startChallenge(r.data.challenge_url,r.data.result_mon_url);break}case"3ds_challenge_decoupled":{this.startDecoupledAuth(r.data.cardholder_info,r.data.result_mon_url,r.data.transaction_id);break}case null:{this.dispose(),(a=this.onFinishHandler)==null||a.call(this);break}}}}),this.domContainer=t.domContainer??w(),this.disposers.push(this.session.onStateChange(this.sessionStateHandle)),this.labelText=t.labelText}dispose(){this.disposers.forEach(e=>e()),this.check3dsIframeDisposers.forEach(e=>e())}initCheck3DSIframes(e,t){const r=w();r.insertAdjacentHTML("beforeend",`<iframe id="check_3ds_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${e}"></iframe>`);const n=r.querySelector(`#check_3ds_${this.iframeId}`);if(n){const a=s=>{s.source===n.contentWindow&&this.session.completeAction({action:"3ds_check",result:s.data})};window.addEventListener("message",a),this.check3dsIframeDisposers.push(()=>window.removeEventListener("message",a),()=>n.remove())}if(t){r.insertAdjacentHTML("beforeend",`<iframe id="mon_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${t}"></iframe>`);const a=r.querySelector(`#mon_${this.iframeId}`);a&&this.disposers.push(()=>a.remove())}}disposeCheck3DSIframe(){this.check3dsIframeDisposers.forEach(e=>e()),this.check3dsIframeDisposers=[]}startChallenge(e,t){const r=w(),n=`<div style="display: flex; flex-direction: column; gap: 10px; align-items: center; ${this.domContainer===r?'border:0; max-width: 800px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width:100% " ':'border:0;" width="100%" height="100%"'}><iframe id="cha_${this.iframeId}" src="${e}" width="100%" height="500"></iframe>${this.labelText?'<span id="tds_label_text" style="font-size: large;">'+this.labelText+"</span>":""}<div>`;this.domContainer.insertAdjacentHTML("beforeend",this.domContainer===r?`<div id="cha_${this.iframeId}_wrap" style="background: #fff; position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 10000;">${n}</div>`:n);const a=this.domContainer.querySelector(`#cha_${this.iframeId}`),s=this.domContainer.querySelector(`#cha_${this.iframeId}_wrap`);if(!a)throw new Error("3DS Challenge Iframe initialization failed");this.disposers.push(()=>{a.remove(),s==null||s.remove()});const o=new Promise(d=>{const h=u=>{u.source!==a.contentWindow||u.data.event!=="AuthResultReady"||d({...u.data,requestor_trans_id:u.data.requestor_trans_id??u.data.requestorTransId,requestorTransId:void 0,param:u.data.param||void 0})};window.addEventListener("message",h),this.disposers.push(()=>window.removeEventListener("message",h))}),l=new Promise(d=>{const h=this.startAuthResultPolling(t,u=>{u.event==="AuthResultReady"&&(h(),d({requestor_trans_id:u.threeDSRequestorTransID,event:u.event}))})});Promise.any([o,l]).then(d=>{this.session.completeAction({action:"3ds_challenge",result:d})})}startDecoupledAuth(e,t,r){this.transactionId||(this.transactionId=r),this.decoupledAuthHandlers.forEach(a=>a(e));const n=this.startAuthResultPolling(t,a=>{a.event==="AuthResultReady"&&(this.session.completeAction({action:"3ds_challenge_decoupled",result:{...a,event:a.event}}),n())})}startAuthResultPolling(e,t){return window.clearTimeout(this.resultPollingTimer),this.resultPollingTimer=window.setTimeout(()=>fetch(e).then(r=>E(r)).then(r=>{this.startAuthResultPolling(e,t),t(r)}).catch(()=>{}),q),()=>window.clearTimeout(this.resultPollingTimer)}}function w(){return document.body}const _={base:{":disabled":{backgroundColor:"transparent"}}},K="DOM Element was not found";var A;(function(i){i.NOT_COMPLETE="NOT_COMPLETE",i.SCHEME_NOT_SUPPORTED="SCHEME_NOT_SUPPORTED",i.LUHN_CHECK_FAILED="LUHN_CHECK_FAILED",i.INVALID_EXPIRY_DATE="INVALID_EXPIRY_DATE"})(A||(A={}));const H=i=>i!=null,G="v3.12.0";class m{constructor(e){if(Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"IFRAME_BASE_URL",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"subscriptions",{enumerable:!0,configurable:!0,writable:!0,value:{ready:[],blur:[],focus:[],keydown:[],change:[]}}),Object.defineProperty(this,"key",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:async({...t})=>{this.iframe&&H(t.height)&&(this.iframe.height=t.height),this.iframePostMessage({type:"update",data:{...t,value:t.value?this.putValue(t.value)??void 0:void 0}})}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"clear"})}}),Object.defineProperty(this,"focus",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"focus"})}}),Object.defineProperty(this,"blur",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"blur"})}}),Object.defineProperty(this,"unmount",{enumerable:!0,configurable:!0,writable:!0,value:()=>{var t;(t=this.iframe)==null||t.remove(),this.iframe=null}}),this.IFRAME_BASE_URL=S(G),!this.IFRAME_BASE_URL)throw new Error("IFRAME_BASE_URL not found")}mount(e){const t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`${K}: ${e}`);t.innerHTML=`<iframe width="100%" height="29" src="${this.IFRAME_BASE_URL}?field=${this.type}&origin=${location.origin}"></iframe>`,this.iframe=t.querySelector("iframe");const r=n=>{var a;n.source!==((a=this.iframe)==null?void 0:a.contentWindow)||n.data.element!==this.type||this.emitEvent(n.data)};return window.addEventListener("message",r),new Promise(n=>{this.on("ready",a=>{this.key=a.key,this.update(this.options),n()})})}on(e,t){return this.subscriptions[e].push(t),{unsubscribe:()=>this.subscriptions[e].splice(this.subscriptions[e].indexOf(t),1)}}emitEvent(e){var t;(t=this.subscriptions[e.type])==null||t.forEach(r=>r(e.data))}iframePostMessage(e){var t,r;(r=(t=this.iframe)==null?void 0:t.contentWindow)==null||r.postMessage(e,this.IFRAME_BASE_URL)}}class W extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationMonth"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:D}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:T})}}function D(i){return i?Number(i):null}function T(i){return i?i<10?`0${i}`:String(i):null}class X extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationYear"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:M}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:I})}}function M(i){if(!i)return null;const e=Number(i);return e>10?+`20${e}`:null}function I(i){return i?i>=100?String(i).slice(-2):String(i):null}function v(i){const[e=null,t=null]=(i??"").split("/").map(r=>r.trim());return{month:D(e),year:M(t)}}function O(i){if(!i)return null;const{month:e,year:t}=i;return[T(e),I(t)].filter(H).join(" / ")}class L extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationDate"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:v}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:O})}}function P(i){return(i==null?void 0:i.replaceAll(" ",""))??null}function N(i){return i}class k extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardNumber"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:P}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:N})}}class F extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"card"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{number:e.cardNumber?P(e.cardNumber):null,expiry_date:e.cardExpirationDate?v(e.cardExpirationDate):null,cvc:e.cardVerificationCode??null}:null}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{cardNumber:e.number?e.number:null,cardExpirationDate:e.expiry_date?O(e.expiry_date):null,cardVerificationCode:e.cvc??null}:null})}}class R extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardVerificationCode"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}class $ extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"text"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}function f(i,e){switch(i){case"card":return new F(e);case"cardNumber":return new k(e);case"cardExpirationDate":return new L(e);case"cardExpirationMonth":return new W(e);case"cardExpirationYear":return new X(e);case"cardVerificationCode":return new R(e);case"text":return new $(e);default:ASSERT_EXHAUSTIVE(i)}}const J={visa:"visa",mastercard:"mastercard",americanexpress:"american-express",discover:"discover",dinersclub:"diners-club",jcb:"jcb",unionpay:"unionpay"};function Q(i){return i.map(e=>J[e]).filter(Boolean)}function U(i){return[i.issuer_identification_number,"".padEnd(i.account_number_length-i.issuer_identification_number.length-i.account_number_last_four.length,"*"),i.account_number_last_four].join(" ")}class g{static async init(e,t){return new g(e,t)}constructor(e,t){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"coordinator",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:this.createFieldDefaultState()}),Object.defineProperty(this,"cardElements",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"textElements",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"cvcOnlyEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"createForm",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{var s;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const n=b({disabled:!1,autocomplete:"on",style:{..._}},r);if(this.session.isNextAction("refresh_security_code")&&((s=this.session.state)!=null&&s.data)){const o=this.session.state.data;n.cvcOnly=!0,n.value={number:U(o),expiry_date:{month:(o==null?void 0:o.expiry_month)??null,year:(o==null?void 0:o.expiry_year)??null},cvc:null}}n.schemes=V(this.getSessionSchemes(),n.schemes);const a=f("card",n);return this.cardElements.card={element:a,state:this.createFieldDefaultState()},this.addElementStateListener("card"),a}}),Object.defineProperty(this,"createTextField",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{const n={disabled:!1,autocomplete:"on",style:{..._}},a=f("text",{...b(n,{...r})});return this.textElements.push(a),a}}),Object.defineProperty(this,"tokenize",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{var a,s;if(((a=this.session.state)==null?void 0:a.next_action)!=="tokenize_card")throw new Error(`The session's next_action='${(s=this.session.state)==null?void 0:s.next_action}'. tokenize() is available only if next_action='tokenize_card'`);const n=this.getCardDataValidationError();if(n)throw n;return this.coordinator.postMessage({type:"card:tokenize",additionalData:this.serializeAdditionalData(r)}),new Promise(o=>{this.coordinator.onMessage("card:tokenize:response",l=>{o(l.success?l.result:null)})})}}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.stateChangeHandlers.push(r),r(this.state)}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.clear()),this.textElements.forEach(r=>r==null?void 0:r.clear())}}),Object.defineProperty(this,"reset",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.unmount()),this.textElements.forEach(r=>r==null?void 0:r.unmount()),this.cardElements={},this.textElements=[],this.state=this.createFieldDefaultState()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.reset()}}),Object.defineProperty(this,"process",{enumerable:!0,configurable:!0,writable:!0,value:async(r={})=>{if(!this.hasFormElements())throw new Error("Card form must be initialized and completed before processing");const n=this.getCardDataValidationError();if(n)throw n;if(this.session.isNextAction("refresh_security_code"))return this.refreshSecurityCode();this.disableFormElements(!0);try{return this.coordinator.postMessage({type:"card:process",additionalData:this.serializeAdditionalData(r)}),new Promise((a,s)=>{this.coordinator.onMessage("card:process:response",o=>{o.result&&o.success?a(o.result):s(new Error(o.error))})})}catch(a){throw this.disableFormElements(!1),a}}}),this.cvcOnlyEnabled=this.session.isNextAction("refresh_security_code")}createFormFields(e={}){var l,d;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const t={disabled:this.cvcOnlyEnabled,autocomplete:"on",style:{..._}},{cardNumber:r={},securityCode:n={},...a}=e,s=f("cardNumber",{...b(t,{...a,...r,cvcOnly:this.cvcOnlyEnabled,schemes:V(this.getSessionSchemes(),r.schemes??a.schemes),value:this.session.isNextAction("refresh_security_code")&&((l=this.session.state)!=null&&l.data)?U(this.session.state.data):null})}),o=f("cardVerificationCode",{...b({...t,disabled:!1,autofocus:this.cvcOnlyEnabled},{...a,...n})});if(s.on("change",h=>{const u=h.cardBrand;o.update({cardType:u})}),this.cardElements={cardNumber:{element:s,state:this.createFieldDefaultState()},cardVerificationCode:{element:o,state:this.createFieldDefaultState()}},this.addElementStateListener("cardNumber"),this.addElementStateListener("cardVerificationCode"),e.expiryDateElement==="separate"){const{expiryMonth:h={},expiryYear:u={}}=e,B=f("cardExpirationMonth",{...b(t,{...a,...h})}),Y=f("cardExpirationYear",{...b(t,{...a,...u})});return this.cardElements.cardExpirationMonth={element:B,state:this.createFieldDefaultState()},this.cardElements.cardExpirationYear={element:Y,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationMonth"),this.addElementStateListener("cardExpirationYear"),{cardNumber:s,expiryMonth:B,expiryYear:Y,securityCode:o}}else{const{expiryDate:h={}}=e,u=f("cardExpirationDate",{...b(t,{...a,...h,value:this.session.isNextAction("refresh_security_code")&&((d=this.session.state)!=null&&d.data)?{month:this.session.state.data.expiry_month,year:this.session.state.data.expiry_year}:null})});return this.cardElements.cardExpirationDate={element:u,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationDate"),{cardNumber:s,expiryDate:u,securityCode:o}}}async refreshSecurityCode(){return this.coordinator.postMessage({type:"card:refresh_security_code"}),new Promise((e,t)=>{this.coordinator.onMessage("card:refresh_security_code:response",r=>{r.result?e(r.result):t(new Error(r.error))})})}hasFormElements(){return!!Object.keys(this.cardElements).length}disableFormElements(e){Object.values(this.cardElements).forEach(({element:t})=>{t.update({disabled:e})})}addElementStateListener(e){const t=this.cardElements[e];t&&t.element.on("change",r=>{t.state=r,this.updateFormState()})}updateFormState(){const e=this.cvcOnlyEnabled&&this.cardElements.cardVerificationCode?[this.cardElements.cardVerificationCode]:Object.values(this.cardElements);e.length?this.state=e.reduce((t,{state:r})=>(t.valid=!!t.valid&&!!r.valid,t.complete=!!t.complete&&!!r.complete,t.empty=!!t.empty&&!!r.empty,t.error=t.error||r.error,t.errorCode=t.errorCode||r.errorCode,t),{valid:!0,complete:!0,empty:!0}):this.state=this.createFieldDefaultState(),this.stateChangeHandlers.forEach(t=>t(this.state))}createFieldDefaultState(){return{empty:!0,complete:!1,valid:!1}}serializeAdditionalData({cardholder_name:e,billing_address:t={},ephemeral:r,expiration_date:n}){return p({cardholder_name:y(e),billing_address:{line1:y(t.line1),line2:y(t.line2),line3:y(t.line3),city:y(t.city),postal_code:y(t.postal_code)},...this.resolveLifecycleFields(r,n)})}resolveLifecycleFields(e,t){switch(this.getLifecycle()){case"ephemeral_only":return{ephemeral:!0};case"persistent_only":return{ephemeral:!1};case"user_choice":return{ephemeral:typeof e=="boolean"?e:void 0,expiration_date:typeof t=="string"?t:void 0}}}getLifecycle(){var e,t;return this.session.isNextAction("tokenize_card")?((t=(e=this.session.state)==null?void 0:e.data)==null?void 0:t.lifecycle)??"user_choice":"user_choice"}getSessionSchemes(){var t,r;if(!this.session.isNextAction("tokenize_card"))return;const e=(t=this.session.state)==null?void 0:t.data;if((r=e==null?void 0:e.allowed_schemes)!=null&&r.length)return Q(e.allowed_schemes)}getCardDataValidationError(){if(!this.state.complete)return new Error(this.state.error??"Card data is not complete");if(!this.state.valid)return new Error(`Card data is not valid. ${this.state.error}`)}}function y(i){if(typeof i=="string")return i;if(i!=null&&i.key)return{key:i.key}}function V(i,e){return i===void 0?e:i.length===0?[]:e!=null&&e.length?e.filter(t=>i.includes(t)):i}const z="v3.12.0";class Z{constructor(){if(Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"iframeBaseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"messageHandler",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async(e,t,r)=>(window.fetchMocker={a:1},new Promise((n,a)=>{r==null||r.signal.addEventListener("abort",()=>{const l=new Error("Coordinator init aborted");l.name="AbortError",a(l),this.dispose()});const s=document.createElement("div");s.setAttribute("style","position:absolute;width:0;height:0;overflow:hidden;"),s.setAttribute("data-hg-coordinator",""),document.body.appendChild(s);const o=`${this.iframeBaseUrl}?type=coordinator&sessionId=${e}&apiBaseUrl=${t}&origin=${encodeURIComponent(location.origin)}&sdkVersion=${encodeURIComponent(z)}`;if(s.innerHTML=`<iframe src="${o}" width="0" height="0" style="border:none;" tabindex="-1" aria-hidden="true"></iframe>`,this.iframe=s.querySelector("iframe"),!this.iframe){a(new Error("Failed to create coordinator iframe"));return}this.messageHandler=l=>{var d,h,u;if(l.source===((d=this.iframe)==null?void 0:d.contentWindow)){if(((h=l.data)==null?void 0:h.type)==="coordinator:ready"){n();return}if(((u=l.data)==null?void 0:u.type)==="coordinator:error"){a(l.data.error);return}}},window.addEventListener("message",this.messageHandler),this.iframe.addEventListener("error",()=>{a(new Error("Coordinator iframe failed to load"))})}))}),this.iframeBaseUrl=S(z),!this.iframeBaseUrl)throw new Error("IFRAME_BASE_URL not found")}postMessage(e){var t,r;(r=(t=this.iframe)==null?void 0:t.contentWindow)==null||r.postMessage(e,this.iframeBaseUrl)}onMessage(e,t){window.addEventListener("message",r=>{var n,a;r.source===((n=this.iframe)==null?void 0:n.contentWindow)&&((a=r.data)==null?void 0:a.type)===e&&t(r.data)})}dispose(){var t;this.postMessage({type:"coordinator:dispose"}),this.messageHandler&&(window.removeEventListener("message",this.messageHandler),this.messageHandler=null);const e=(t=this.iframe)==null?void 0:t.parentElement;this.iframe=null,e==null||e.remove()}}const ee="hellgate-web-sdk",te="v3.12.0";class re{constructor(e="https://api.hellgate.io",t=new AbortController,{context:r="window",version:n=te}={}){Object.defineProperty(this,"abortCtrl",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"baseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clientId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.baseUrl=e.endsWith("/")?e.substring(0,e.length-1):e,this.clientId=`${ee}/${n||"unknown"} (${r})`}getSession(e){return fetch(`${this.baseUrl}/sessions/${e}`,{headers:this.traceHeaders(),signal:this.abortCtrl.signal}).then(t=>E(t))}completeAction(e,t){return fetch(`${this.baseUrl}/sessions/${e}/complete-action`,{method:"POST",headers:{"Content-Type":"application/json",...this.traceHeaders()},mode:"cors",body:JSON.stringify(t),signal:this.abortCtrl.signal}).then(r=>E(r))}cancelAll(){this.abortCtrl.abort()}traceHeaders(){return{"x-hellgate-client":this.clientId,"x-request-id":ie()}}}function ie(){var i;return((i=crypto.randomUUID)==null?void 0:i.call(crypto))??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}const ne=2e3;class ae{constructor(e,t){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"onCloseHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"pollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async()=>new Promise((r,n)=>{const a=this.onStateChange(s=>{s.next_action!=="wait"&&(r(s),a())});this.updateSessionState().catch(s=>{s instanceof Response&&s.status===404&&n(new Error(`Session ${this.id} doesn't exist or has expired`)),n(s)})})}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>(this.stateChangeHandlers.push(r),this.state&&r(this.state),()=>this.stateChangeHandlers=this.stateChangeHandlers.filter(n=>n!==r))}),Object.defineProperty(this,"onClose",{enumerable:!0,configurable:!0,writable:!0,value:r=>{var n;return((n=this.state)==null?void 0:n.next_action)===null?(r(x(this.state)),()=>{}):(this.onCloseHandlers.push(r),()=>this.onCloseHandlers=this.onCloseHandlers.filter(a=>a!==r))}}),Object.defineProperty(this,"completeAction",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{const n=this.state;return new Promise((a,s)=>{const o=this.onStateChange(l=>{l.next_action!==(n==null?void 0:n.next_action)&&l.next_action===null&&(a(x(l)),o())});this.api.completeAction(this.id,r).then(l=>this.newStateHandle(l,s)).catch(async l=>s(await se(l)))})}}),Object.defineProperty(this,"completeSession",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onCloseHandlers.forEach(n=>n(r)),this.stop()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.stop(),this.api.cancelAll()}})}isNextAction(e){var t;return((t=this.state)==null?void 0:t.next_action)===e}stop(){window.clearTimeout(this.pollingTimer),this.stateChangeHandlers=[],this.onCloseHandlers=[]}async updateSessionState(e){const t=await this.api.getSession(this.id);this.newStateHandle(t,e)}newStateHandle(e,t){var r;switch(!e.next_action&&e.status&&(e.next_action=null),e.next_action){case"wait":{window.clearTimeout(this.pollingTimer),this.pollingTimer=window.setTimeout(()=>this.updateSessionState(t).catch(n=>{n instanceof Response&&n.status===404&&(t==null||t(new Error(`Session ${this.id} has expired`)))}),ne);break}}e.next_action!==((r=this.state)==null?void 0:r.next_action)&&this.stateChangeHandlers.forEach(n=>n(e)),e.next_action===null&&this.completeSession(x(e)),this.state=e}}async function se(i){return!i.ok&&i.status>=400&&i.status<=500?i.json():i}function x(i){const e={...i};return delete e.next_action,e}const oe={base_url:"https://api.hellgate.io"};class C{constructor(e,t,r){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"coordinator",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"paymentFlowHandlers",{enumerable:!0,configurable:!0,writable:!0,value:r}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.session.dispose(),this.coordinator.dispose(),Object.values(this.paymentFlowHandlers).forEach(n=>n==null?void 0:n.dispose())}}),Object.defineProperty(this,"onSessionComplete",{enumerable:!0,configurable:!0,writable:!0,value:n=>{this.session.onClose(n)}})}use(e){return this.paymentFlowHandlers[e]}static async init(e,t={}){const{session:r,coordinator:n,cardHandler:a,handler3DS:s}=await this.initHandlers(e,t);return new C(r,n,{CARD:a,"3DS":s})}static async initHandlers(e,t){const r={...oe,...t},n=new re(r.base_url,r.abortCtrl),a=new ae(e,n),s=new Z;s.onMessage("coordinator:session_state_change",d=>{d.state.next_action!=="wait"&&a.newStateHandle(d.state)}),await s.init(e,r.base_url,r.abortCtrl);const o=a.isNextAction("tokenize_card")||a.isNextAction("refresh_security_code")?await this.createCardHandler(a,s):void 0,l=this.create3DSHandler(a,t);return{session:a,coordinator:s,cardHandler:o,handler3DS:l}}static createCardHandler(e,t){return g.init(e,t)}static create3DSHandler(e,t){return new j(e,{domContainer:t.challenge_3ds_container,labelText:t.challenge_3ds_label_text})}}c.CardElement=F,c.CardExpirationDateElement=L,c.CardNumberElement=k,c.CardVerificationCodeElement=R,c.Hellgate=C,c.Hellgate3DSHandler=j,c.HellgateCardHandler=g,c.TextElement=$,c.createElement=f,c.extractCardNumberValue=P,c.extractExpiryDateValue=v,c.putCardNumberValue=N,c.putExpiryDateValue=O,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});globalThis.HellgateSDK&&(globalThis.Hellgate=globalThis.HellgateSDK.Hellgate,delete globalThis.HellgateSDK);
@@ -1,9 +1,26 @@
1
1
  import { CompleteActionDTO, SessionStateDTO } from './typings';
2
+ /**
3
+ * Where the API call originates from. Both the merchant page and the
4
+ * coordinator iframe talk to the backend, so the context tells them apart
5
+ * in the backend logs.
6
+ */
7
+ export type ClientContext = 'window' | 'coordinator-iframe';
8
+ export type ClientInfo = {
9
+ context?: ClientContext;
10
+ version?: string;
11
+ };
2
12
  export declare class HellgateAPIClient {
3
13
  private abortCtrl;
4
14
  private baseUrl;
5
- constructor(baseUrl?: string, abortCtrl?: AbortController);
15
+ private clientId;
16
+ constructor(baseUrl?: string, abortCtrl?: AbortController, { context, version }?: ClientInfo);
6
17
  getSession(id: string): Promise<SessionStateDTO>;
7
18
  completeAction(id: string, data: CompleteActionDTO): Promise<SessionStateDTO>;
8
19
  cancelAll(): void;
20
+ /**
21
+ * Traceability headers sent on every backend call: which SDK build and
22
+ * execution context made the request, plus a per-request id to correlate
23
+ * a single failing call with the backend logs.
24
+ */
25
+ private traceHeaders;
9
26
  }
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starfish-codes/hellgate",
3
- "version": "3.11.0",
3
+ "version": "3.12.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": {
6
6
  "name": "Starfish GmbH & Co. KG",
@@ -37,7 +37,7 @@
37
37
  "@headlessui/react": "^1.7.18",
38
38
  "@rollup/plugin-typescript": "^11.1.6",
39
39
  "@semantic-release/changelog": "^6.0.3",
40
- "@semantic-release/git": "^10.0.1",
40
+ "@semantic-release/exec": "^7.1.0",
41
41
  "@tailwindcss/forms": "^0.5.7",
42
42
  "@types/inputmask": "^5.0.7",
43
43
  "@types/lodash": "^4.17.0",
@@ -45,9 +45,9 @@
45
45
  "@types/react-dom": "^18.2.22",
46
46
  "@typescript-eslint/eslint-plugin": "^7.2.0",
47
47
  "@typescript-eslint/parser": "^7.2.0",
48
- "@vitest/browser": "^3.2.5",
49
- "@vitest/coverage-istanbul": "^3.1.3",
50
- "@vitest/ui": "^3.1.3",
48
+ "@vitest/browser-playwright": "^4.1.11",
49
+ "@vitest/coverage-istanbul": "^4.1.11",
50
+ "@vitest/ui": "^4.1.11",
51
51
  "autoprefixer": "^10.4.18",
52
52
  "clsx": "^2.1.0",
53
53
  "commitizen": "^4.3.0",
@@ -61,7 +61,7 @@
61
61
  "mobx-react": "^9.1.0",
62
62
  "mobx-react-viewmodel": "^0.2.0",
63
63
  "playwright": "^1.55.1",
64
- "postcss": "^8.5.10",
64
+ "postcss": "^8.5.23",
65
65
  "postcss-nesting": "^13.0.1",
66
66
  "prettier": "^3.2.5",
67
67
  "react": "^18.2.0",
@@ -78,7 +78,7 @@
78
78
  "vite-plugin-sri3": "^1.3.0",
79
79
  "vite-plugin-svg-icons-ng": "^1.4.0",
80
80
  "vite-plugin-top-level-await": "^1.5.0",
81
- "vitest": "^3.2.6",
81
+ "vitest": "^4.1.11",
82
82
  "vitest-fetch-mock": "^0.2.2",
83
83
  "webdriverio": "^9.12.7"
84
84
  },