@starfish-codes/hellgate 3.10.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.
@@ -1,6 +1,6 @@
1
1
  import { CompleteActionResult, HellgateSession } from '../session';
2
2
  import { Coordinator } from '../coordinator';
3
- import { CreateCardFieldsOptions, CreateCardFormOptions, PaymentAdditionalData, RefreshSecurityCodeSessionStateDTO, TokenizeCardSessionStateDTO, TokenizedData } from './typings';
3
+ import { CreateCardFieldsOptions, CreateCardFormOptions, PaymentAdditionalData, RefreshSecurityCodeSessionStateDTO, TokenLifecycleMode, TokenizeCardSessionStateDTO, TokenizedData } from './typings';
4
4
  import { CardElement, CardExpirationDateElement, CardNumberElement, CardVerificationCodeElement, TextElement } from './ui/elements';
5
5
  import { CardElementBase } from './ui/elements/base-element';
6
6
  import { CardExpirationMonthElement } from './ui/elements/card-expiration-month';
@@ -56,6 +56,8 @@ export declare class HellgateCardHandler {
56
56
  updateFormState(): void;
57
57
  private createFieldDefaultState;
58
58
  private serializeAdditionalData;
59
+ private resolveLifecycleFields;
60
+ getLifecycle(): TokenLifecycleMode;
59
61
  private getSessionSchemes;
60
62
  private getCardDataValidationError;
61
63
  }
@@ -35,9 +35,10 @@ export type PaymentAdditionalData<FieldValue = AdditionalDataValue> = {
35
35
  country?: FieldValue;
36
36
  };
37
37
  /**
38
- * Token lifecycle intent. When `true` (the SDK default), the resulting PCI
39
- * token is ephemeral and cleaned up after a short TTL. When `false`, the
40
- * token is persistent. Use `false` only on cardholder consent.
38
+ * Token lifecycle intent. When `true`, the resulting PCI token is
39
+ * ephemeral and cleaned up after a short TTL. When `false`, the token is
40
+ * persistent; use `false` only on cardholder consent. When omitted the SDK
41
+ * sends no lifecycle intent and the server decides.
41
42
  */
42
43
  ephemeral?: boolean;
43
44
  /**
@@ -66,12 +67,14 @@ export type TokenizeCardActionDTO = {
66
67
  result: TokenizedData;
67
68
  };
68
69
  export type HellgateCardScheme = 'visa' | 'mastercard' | 'americanexpress' | 'discover' | 'dinersclub' | 'jcb' | 'unionpay';
70
+ export type TokenLifecycleMode = 'user_choice' | 'ephemeral_only' | 'persistent_only';
69
71
  export type TokenizeCardConfig = {
70
72
  provider: 'guardian';
71
73
  api_key: string;
72
74
  base_url: string;
73
75
  jwk: JWK;
74
76
  allowed_schemes?: HellgateCardScheme[];
77
+ lifecycle?: TokenLifecycleMode;
75
78
  };
76
79
  export type TokenizeCardSessionStateDTO = {
77
80
  next_action: 'tokenize_card';
@@ -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,7 +1,7 @@
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) {
@@ -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,
@@ -202,18 +202,18 @@ class k {
202
202
  function p() {
203
203
  return document.body;
204
204
  }
205
- const g = {
205
+ const y = {
206
206
  base: {
207
207
  ":disabled": {
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.10.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,13 +283,13 @@ 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
294
  const r = (n) => {
295
295
  var a;
@@ -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 [
@@ -587,7 +587,7 @@ class w {
587
587
  const n = h({
588
588
  disabled: !1,
589
589
  autocomplete: "on",
590
- style: { ...g }
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;
@@ -615,7 +615,7 @@ class w {
615
615
  const n = {
616
616
  disabled: !1,
617
617
  autocomplete: "on",
618
- style: { ...g }
618
+ style: { ...y }
619
619
  }, a = b("text", {
620
620
  ...h(n, { ...r })
621
621
  });
@@ -704,7 +704,7 @@ class w {
704
704
  const t = {
705
705
  disabled: this.cvcOnlyEnabled,
706
706
  autocomplete: "on",
707
- style: { ...g }
707
+ style: { ...y }
708
708
  }, { cardNumber: r = {}, securityCode: n = {}, ...a } = e, s = b("cardNumber", {
709
709
  ...h(t, {
710
710
  ...a,
@@ -810,7 +810,7 @@ class w {
810
810
  };
811
811
  }
812
812
  serializeAdditionalData({ cardholder_name: e, billing_address: t = {}, ephemeral: r, expiration_date: n }) {
813
- const a = C({
813
+ return S({
814
814
  cardholder_name: m(e),
815
815
  billing_address: {
816
816
  line1: m(t.line1),
@@ -818,9 +818,26 @@ class w {
818
818
  line3: m(t.line3),
819
819
  city: m(t.city),
820
820
  postal_code: m(t.postal_code)
821
- }
821
+ },
822
+ ...this.resolveLifecycleFields(r, n)
822
823
  });
823
- return typeof r == "boolean" && (a.ephemeral = r), typeof n == "string" && (a.expiration_date = n), a;
824
+ }
825
+ resolveLifecycleFields(e, t) {
826
+ switch (this.getLifecycle()) {
827
+ case "ephemeral_only":
828
+ return { ephemeral: !0 };
829
+ case "persistent_only":
830
+ return { ephemeral: !1 };
831
+ case "user_choice":
832
+ return {
833
+ ephemeral: typeof e == "boolean" ? e : void 0,
834
+ expiration_date: typeof t == "string" ? t : void 0
835
+ };
836
+ }
837
+ }
838
+ getLifecycle() {
839
+ var e, t;
840
+ 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";
824
841
  }
825
842
  getSessionSchemes() {
826
843
  var t, r;
@@ -828,7 +845,7 @@ class w {
828
845
  return;
829
846
  const e = (t = this.session.state) == null ? void 0 : t.data;
830
847
  if ((r = e == null ? void 0 : e.allowed_schemes) != null && r.length)
831
- return X(e.allowed_schemes);
848
+ return J(e.allowed_schemes);
832
849
  }
833
850
  getCardDataValidationError() {
834
851
  if (!this.state.complete)
@@ -846,7 +863,7 @@ function m(i) {
846
863
  function x(i, e) {
847
864
  return i === void 0 ? e : i.length === 0 ? [] : e != null && e.length ? e.filter((t) => i.includes(t)) : i;
848
865
  }
849
- const J = "v3.10.0";
866
+ const C = "v3.12.0";
850
867
  class Q {
851
868
  constructor() {
852
869
  if (Object.defineProperty(this, "iframe", {
@@ -875,7 +892,7 @@ class Q {
875
892
  });
876
893
  const s = document.createElement("div");
877
894
  s.setAttribute("style", "position:absolute;width:0;height:0;overflow:hidden;"), s.setAttribute("data-hg-coordinator", ""), document.body.appendChild(s);
878
- 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)}`;
879
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) {
880
897
  a(new Error("Failed to create coordinator iframe"));
881
898
  return;
@@ -896,7 +913,7 @@ class Q {
896
913
  a(new Error("Coordinator iframe failed to load"));
897
914
  });
898
915
  }))
899
- }), this.iframeBaseUrl = S(J), !this.iframeBaseUrl)
916
+ }), this.iframeBaseUrl = j(C), !this.iframeBaseUrl)
900
917
  throw new Error("IFRAME_BASE_URL not found");
901
918
  }
902
919
  /**
@@ -923,8 +940,9 @@ class Q {
923
940
  this.iframe = null, e == null || e.remove();
924
941
  }
925
942
  }
926
- class Z {
927
- 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 } = {}) {
928
946
  Object.defineProperty(this, "abortCtrl", {
929
947
  enumerable: !0,
930
948
  configurable: !0,
@@ -935,10 +953,16 @@ class Z {
935
953
  configurable: !0,
936
954
  writable: !0,
937
955
  value: void 0
938
- }), 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})`;
939
962
  }
940
963
  getSession(e) {
941
964
  return fetch(`${this.baseUrl}/sessions/${e}`, {
965
+ headers: this.traceHeaders(),
942
966
  signal: this.abortCtrl.signal
943
967
  }).then((t) => E(t));
944
968
  }
@@ -946,7 +970,8 @@ class Z {
946
970
  return fetch(`${this.baseUrl}/sessions/${e}/complete-action`, {
947
971
  method: "POST",
948
972
  headers: {
949
- "Content-Type": "application/json"
973
+ "Content-Type": "application/json",
974
+ ...this.traceHeaders()
950
975
  },
951
976
  mode: "cors",
952
977
  body: JSON.stringify(t),
@@ -956,9 +981,24 @@ class Z {
956
981
  cancelAll() {
957
982
  this.abortCtrl.abort();
958
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
+ }
959
995
  }
960
- const ee = 2e3;
961
- 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 {
962
1002
  constructor(e, t) {
963
1003
  Object.defineProperty(this, "id", {
964
1004
  enumerable: !0,
@@ -1013,7 +1053,7 @@ class te {
1013
1053
  writable: !0,
1014
1054
  value: (r) => {
1015
1055
  var n;
1016
- return ((n = this.state) == null ? void 0 : n.next_action) === null ? (r(y(this.state)), () => {
1056
+ return ((n = this.state) == null ? void 0 : n.next_action) === null ? (r(g(this.state)), () => {
1017
1057
  }) : (this.onCloseHandlers.push(r), () => this.onCloseHandlers = this.onCloseHandlers.filter((a) => a !== r));
1018
1058
  }
1019
1059
  }), Object.defineProperty(this, "completeAction", {
@@ -1024,9 +1064,9 @@ class te {
1024
1064
  const n = this.state;
1025
1065
  return new Promise((a, s) => {
1026
1066
  const o = this.onStateChange((l) => {
1027
- l.next_action !== (n == null ? void 0 : n.next_action) && l.next_action === null && (a(y(l)), o());
1067
+ l.next_action !== (n == null ? void 0 : n.next_action) && l.next_action === null && (a(g(l)), o());
1028
1068
  });
1029
- 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)));
1030
1070
  });
1031
1071
  }
1032
1072
  }), Object.defineProperty(this, "completeSession", {
@@ -1062,24 +1102,24 @@ class te {
1062
1102
  case "wait": {
1063
1103
  window.clearTimeout(this.pollingTimer), this.pollingTimer = window.setTimeout(() => this.updateSessionState(t).catch((n) => {
1064
1104
  n instanceof Response && n.status === 404 && (t == null || t(new Error(`Session ${this.id} has expired`)));
1065
- }), ee);
1105
+ }), ie);
1066
1106
  break;
1067
1107
  }
1068
1108
  }
1069
- e.next_action !== ((r = this.state) == null ? void 0 : r.next_action) && this.stateChangeHandlers.forEach((n) => n(e)), e.next_action === null && this.completeSession(y(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;
1070
1110
  }
1071
1111
  }
1072
- async function re(i) {
1112
+ async function ae(i) {
1073
1113
  return !i.ok && i.status >= 400 && i.status <= 500 ? i.json() : i;
1074
1114
  }
1075
- function y(i) {
1115
+ function g(i) {
1076
1116
  const e = { ...i };
1077
1117
  return delete e.next_action, e;
1078
1118
  }
1079
- const ie = {
1119
+ const se = {
1080
1120
  base_url: "https://api.hellgate.io"
1081
1121
  };
1082
- class N {
1122
+ class k {
1083
1123
  constructor(e, t, r) {
1084
1124
  Object.defineProperty(this, "session", {
1085
1125
  enumerable: !0,
@@ -1117,16 +1157,16 @@ class N {
1117
1157
  }
1118
1158
  static async init(e, t = {}) {
1119
1159
  const { session: r, coordinator: n, cardHandler: a, handler3DS: s } = await this.initHandlers(e, t);
1120
- return new N(r, n, {
1160
+ return new k(r, n, {
1121
1161
  CARD: a,
1122
1162
  "3DS": s
1123
1163
  });
1124
1164
  }
1125
1165
  static async initHandlers(e, t) {
1126
1166
  const r = {
1127
- ...ie,
1167
+ ...se,
1128
1168
  ...t
1129
- }, n = new Z(r.base_url, r.abortCtrl), a = new te(e, n), s = new Q();
1169
+ }, n = new te(r.base_url, r.abortCtrl), a = new ne(e, n), s = new Q();
1130
1170
  s.onMessage("coordinator:session_state_change", (c) => {
1131
1171
  c.state.next_action !== "wait" && a.newStateHandle(c.state);
1132
1172
  }), await s.init(e, r.base_url, r.abortCtrl);
@@ -1137,7 +1177,7 @@ class N {
1137
1177
  return w.init(e, t);
1138
1178
  }
1139
1179
  static create3DSHandler(e, t) {
1140
- return new k(e, {
1180
+ return new R(e, {
1141
1181
  domContainer: t.challenge_3ds_container,
1142
1182
  labelText: t.challenge_3ds_label_text
1143
1183
  });
@@ -1145,17 +1185,17 @@ class N {
1145
1185
  }
1146
1186
  globalThis.HellgateSDK && (globalThis.Hellgate = globalThis.HellgateSDK.Hellgate, delete globalThis.HellgateSDK);
1147
1187
  export {
1148
- q as CardElement,
1149
- z as CardExpirationDateElement,
1150
- Y as CardNumberElement,
1188
+ K as CardElement,
1189
+ B as CardExpirationDateElement,
1190
+ q as CardNumberElement,
1151
1191
  G as CardVerificationCodeElement,
1152
- N as Hellgate,
1153
- k as Hellgate3DSHandler,
1192
+ k as Hellgate,
1193
+ R as Hellgate3DSHandler,
1154
1194
  w as HellgateCardHandler,
1155
- K as TextElement,
1195
+ W as TextElement,
1156
1196
  b as createElement,
1157
- L as extractCardNumberValue,
1158
- M as extractExpiryDateValue,
1159
- B as putCardNumberValue,
1160
- I as putExpiryDateValue
1197
+ N as extractCardNumberValue,
1198
+ I as extractExpiryDateValue,
1199
+ Y as putCardNumberValue,
1200
+ L as putExpiryDateValue
1161
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 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 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 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(()=>{}),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.10.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=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 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 y{static async init(e,t){return new y(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,z=f("cardExpirationMonth",{...b(t,{...a,...h})}),B=f("cardExpirationYear",{...b(t,{...a,...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,{...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}){const a=p({cardholder_name:g(e),billing_address:{line1:g(t.line1),line2:g(t.line2),line3:g(t.line3),city:g(t.city),postal_code:g(t.postal_code)}});return typeof r=="boolean"&&(a.ephemeral=r),typeof n=="string"&&(a.expiration_date=n),a}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 g(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.10.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)}`;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(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 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()}}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,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 ie(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`)))}),te);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 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(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={...ae,...t},n=new ee(r.base_url,r.abortCtrl),a=new re(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 y.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=y,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.10.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.1.3",
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",
@@ -73,12 +73,12 @@
73
73
  "tailwindcss": "^3.4.1",
74
74
  "tailwindcss-animate": "^1.0.7",
75
75
  "typescript": "^5.4.2",
76
- "vite": "^6.4.2",
76
+ "vite": "^6.4.3",
77
77
  "vite-plugin-checker": "^0.9.3",
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.1.3",
81
+ "vitest": "^4.1.11",
82
82
  "vitest-fetch-mock": "^0.2.2",
83
83
  "webdriverio": "^9.12.7"
84
84
  },
@@ -109,4 +109,4 @@
109
109
  "path": "./node_modules/cz-conventional-changelog"
110
110
  }
111
111
  }
112
- }
112
+ }
@@ -1,2 +0,0 @@
1
- import { BTTokenizeData } from './typings';
2
- export declare const BT_TOKENIZE_PARAMS: BTTokenizeData;
@@ -1,2 +0,0 @@
1
- export * from './constants';
2
- export * from './typings';
@@ -1 +0,0 @@
1
- export type BTTokenizeData = Record<string, unknown>;