@starfish-codes/hellgate 3.10.0 → 3.11.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';
@@ -6,9 +6,9 @@ function C(i) {
6
6
  }
7
7
  function h(i, e) {
8
8
  const t = { ...i, ...e }, r = Object.keys(t);
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));
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));
12
12
  }
13
13
  return t;
14
14
  }
@@ -104,14 +104,14 @@ class k {
104
104
  configurable: !0,
105
105
  writable: !0,
106
106
  value: (r) => {
107
- var n, a;
107
+ var a, n;
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
- (n = this.onStartHandler) == null || n.call(this), this.disposeCheck3DSIframe(), this.startChallenge(r.data.challenge_url, r.data.result_mon_url);
114
+ (a = this.onStartHandler) == null || a.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(), (a = this.onFinishHandler) == null || a.call(this);
122
+ this.dispose(), (n = this.onFinishHandler) == null || n.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 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 });
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 });
139
139
  };
140
- window.addEventListener("message", a), this.check3dsIframeDisposers.push(() => window.removeEventListener("message", a), () => n.remove());
140
+ window.addEventListener("message", n), this.check3dsIframeDisposers.push(() => window.removeEventListener("message", n), () => a.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 a = r.querySelector(`#mon_${this.iframeId}`);
145
- a && this.disposers.push(() => a.remove());
144
+ const n = r.querySelector(`#mon_${this.iframeId}`);
145
+ n && this.disposers.push(() => n.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(), 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)
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)
156
156
  throw new Error("3DS Challenge Iframe initialization failed");
157
157
  this.disposers.push(() => {
158
- a.remove(), s == null || s.remove();
158
+ n.remove(), s == null || s.remove();
159
159
  });
160
160
  const o = new Promise((c) => {
161
161
  const d = (u) => {
162
- u.source !== a.contentWindow || u.data.event !== "AuthResultReady" || c({
162
+ u.source !== n.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((a) => a(e));
188
- const n = this.startAuthResultPolling(t, (a) => {
189
- a.event === "AuthResultReady" && (this.session.completeAction({
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({
190
190
  action: "3ds_challenge_decoupled",
191
- result: { ...a, event: a.event }
192
- }), n());
191
+ result: { ...n, event: n.event }
192
+ }), a());
193
193
  });
194
194
  }
195
195
  startAuthResultPolling(e, t) {
@@ -202,7 +202,7 @@ 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"
@@ -213,7 +213,7 @@ 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 j = (i) => i != null, $ = "v3.11.0";
217
217
  class f {
218
218
  constructor(e) {
219
219
  if (Object.defineProperty(this, "options", {
@@ -291,13 +291,13 @@ class f {
291
291
  if (!t)
292
292
  throw new Error(`${R}: ${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 = (n) => {
295
- var a;
296
- n.source !== ((a = this.iframe) == null ? void 0 : a.contentWindow) || n.data.element !== this.type || this.emitEvent(n.data);
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);
297
297
  };
298
- return window.addEventListener("message", r), new Promise((n) => {
299
- this.on("ready", (a) => {
300
- this.key = a.key, this.update(this.options), n();
298
+ return window.addEventListener("message", r), new Promise((a) => {
299
+ this.on("ready", (n) => {
300
+ this.key = n.key, this.update(this.options), a();
301
301
  });
302
302
  });
303
303
  }
@@ -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 n = h({
587
+ const a = 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;
594
- n.cvcOnly = !0, n.value = {
594
+ a.cvcOnly = !0, a.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
- n.schemes = x(this.getSessionSchemes(), n.schemes);
604
- const a = b("card", n);
603
+ a.schemes = x(this.getSessionSchemes(), a.schemes);
604
+ const n = b("card", a);
605
605
  return this.cardElements.card = {
606
- element: a,
606
+ element: n,
607
607
  state: this.createFieldDefaultState()
608
- }, this.addElementStateListener("card"), a;
608
+ }, this.addElementStateListener("card"), n;
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 n = {
615
+ const a = {
616
616
  disabled: !1,
617
617
  autocomplete: "on",
618
- style: { ...g }
619
- }, a = b("text", {
620
- ...h(n, { ...r })
618
+ style: { ...y }
619
+ }, n = b("text", {
620
+ ...h(a, { ...r })
621
621
  });
622
- return this.textElements.push(a), a;
622
+ return this.textElements.push(n), n;
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 a, s;
630
- if (((a = this.session.state) == null ? void 0 : a.next_action) !== "tokenize_card")
629
+ var n, s;
630
+ if (((n = this.session.state) == null ? void 0 : n.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 n = this.getCardDataValidationError();
633
- if (n)
634
- throw n;
632
+ const a = this.getCardDataValidationError();
633
+ if (a)
634
+ throw a;
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 n = this.getCardDataValidationError();
680
- if (n)
681
- throw n;
679
+ const a = this.getCardDataValidationError();
680
+ if (a)
681
+ throw a;
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((a, s) => {
689
+ }), new Promise((n, s) => {
690
690
  this.coordinator.onMessage("card:process:response", (o) => {
691
- o.result && o.success ? a(o.result) : s(new Error(o.error));
691
+ o.result && o.success ? n(o.result) : s(new Error(o.error));
692
692
  });
693
693
  });
694
- } catch (a) {
695
- throw this.disableFormElements(!1), a;
694
+ } catch (n) {
695
+ throw this.disableFormElements(!1), n;
696
696
  }
697
697
  }
698
698
  }), this.cvcOnlyEnabled = this.session.isNextAction("refresh_security_code");
@@ -704,13 +704,13 @@ class w {
704
704
  const t = {
705
705
  disabled: this.cvcOnlyEnabled,
706
706
  autocomplete: "on",
707
- style: { ...g }
708
- }, { cardNumber: r = {}, securityCode: n = {}, ...a } = e, s = b("cardNumber", {
707
+ style: { ...y }
708
+ }, { cardNumber: r = {}, securityCode: a = {}, ...n } = e, s = b("cardNumber", {
709
709
  ...h(t, {
710
- ...a,
710
+ ...n,
711
711
  ...r,
712
712
  cvcOnly: this.cvcOnlyEnabled,
713
- schemes: x(this.getSessionSchemes(), r.schemes ?? a.schemes),
713
+ schemes: x(this.getSessionSchemes(), r.schemes ?? n.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
- ...a,
723
- ...n
722
+ ...n,
723
+ ...a
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
- ...a,
741
+ ...n,
742
742
  ...d
743
743
  })
744
744
  }), v = b("cardExpirationYear", {
745
745
  ...h(t, {
746
- ...a,
746
+ ...n,
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
- ...a,
760
+ ...n,
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: n }) {
813
- const a = C({
812
+ serializeAdditionalData({ cardholder_name: e, billing_address: t = {}, ephemeral: r, expiration_date: a }) {
813
+ return C({
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, a)
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;
@@ -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 J = "v3.11.0";
850
867
  class Q {
851
868
  constructor() {
852
869
  if (Object.defineProperty(this, "iframe", {
@@ -868,32 +885,32 @@ class Q {
868
885
  enumerable: !0,
869
886
  configurable: !0,
870
887
  writable: !0,
871
- value: async (e, t, r) => (window.fetchMocker = { a: 1 }, new Promise((n, a) => {
888
+ value: async (e, t, r) => (window.fetchMocker = { a: 1 }, new Promise((a, n) => {
872
889
  r == null || r.signal.addEventListener("abort", () => {
873
890
  const l = new Error("Coordinator init aborted");
874
- l.name = "AbortError", a(l), this.dispose();
891
+ l.name = "AbortError", n(l), this.dispose();
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
895
  const o = `${this.iframeBaseUrl}?type=coordinator&sessionId=${e}&apiBaseUrl=${t}&origin=${encodeURIComponent(location.origin)}`;
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
- a(new Error("Failed to create coordinator iframe"));
897
+ n(new Error("Failed to create coordinator iframe"));
881
898
  return;
882
899
  }
883
900
  this.messageHandler = (l) => {
884
901
  var c, d, u;
885
902
  if (l.source === ((c = this.iframe) == null ? void 0 : c.contentWindow)) {
886
903
  if (((d = l.data) == null ? void 0 : d.type) === "coordinator:ready") {
887
- n();
904
+ a();
888
905
  return;
889
906
  }
890
907
  if (((u = l.data) == null ? void 0 : u.type) === "coordinator:error") {
891
- a(l.data.error);
908
+ n(l.data.error);
892
909
  return;
893
910
  }
894
911
  }
895
912
  }, window.addEventListener("message", this.messageHandler), this.iframe.addEventListener("error", () => {
896
- a(new Error("Coordinator iframe failed to load"));
913
+ n(new Error("Coordinator iframe failed to load"));
897
914
  });
898
915
  }))
899
916
  }), this.iframeBaseUrl = S(J), !this.iframeBaseUrl)
@@ -909,8 +926,8 @@ class Q {
909
926
  }
910
927
  onMessage(e, t) {
911
928
  window.addEventListener("message", (r) => {
912
- var n, a;
913
- r.source === ((n = this.iframe) == null ? void 0 : n.contentWindow) && ((a = r.data) == null ? void 0 : a.type) === e && t(r.data);
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);
914
931
  });
915
932
  }
916
933
  /**
@@ -994,37 +1011,37 @@ class te {
994
1011
  enumerable: !0,
995
1012
  configurable: !0,
996
1013
  writable: !0,
997
- value: async () => new Promise((r, n) => {
998
- const a = this.onStateChange((s) => {
999
- s.next_action !== "wait" && (r(s), a());
1014
+ value: async () => new Promise((r, a) => {
1015
+ const n = this.onStateChange((s) => {
1016
+ s.next_action !== "wait" && (r(s), n());
1000
1017
  });
1001
1018
  this.updateSessionState().catch((s) => {
1002
- s instanceof Response && s.status === 404 && n(new Error(`Session ${this.id} doesn't exist or has expired`)), n(s);
1019
+ s instanceof Response && s.status === 404 && a(new Error(`Session ${this.id} doesn't exist or has expired`)), a(s);
1003
1020
  });
1004
1021
  })
1005
1022
  }), Object.defineProperty(this, "onStateChange", {
1006
1023
  enumerable: !0,
1007
1024
  configurable: !0,
1008
1025
  writable: !0,
1009
- value: (r) => (this.stateChangeHandlers.push(r), this.state && r(this.state), () => this.stateChangeHandlers = this.stateChangeHandlers.filter((n) => n !== r))
1026
+ value: (r) => (this.stateChangeHandlers.push(r), this.state && r(this.state), () => this.stateChangeHandlers = this.stateChangeHandlers.filter((a) => a !== r))
1010
1027
  }), Object.defineProperty(this, "onClose", {
1011
1028
  enumerable: !0,
1012
1029
  configurable: !0,
1013
1030
  writable: !0,
1014
1031
  value: (r) => {
1015
- var n;
1016
- return ((n = this.state) == null ? void 0 : n.next_action) === null ? (r(y(this.state)), () => {
1017
- }) : (this.onCloseHandlers.push(r), () => this.onCloseHandlers = this.onCloseHandlers.filter((a) => a !== 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));
1018
1035
  }
1019
1036
  }), Object.defineProperty(this, "completeAction", {
1020
1037
  enumerable: !0,
1021
1038
  configurable: !0,
1022
1039
  writable: !0,
1023
1040
  value: async (r) => {
1024
- const n = this.state;
1025
- return new Promise((a, s) => {
1041
+ const a = this.state;
1042
+ return new Promise((n, s) => {
1026
1043
  const o = this.onStateChange((l) => {
1027
- l.next_action !== (n == null ? void 0 : n.next_action) && l.next_action === null && (a(y(l)), o());
1044
+ l.next_action !== (a == null ? void 0 : a.next_action) && l.next_action === null && (n(g(l)), o());
1028
1045
  });
1029
1046
  this.api.completeAction(this.id, r).then((l) => this.newStateHandle(l, s)).catch(async (l) => s(await re(l)));
1030
1047
  });
@@ -1034,7 +1051,7 @@ class te {
1034
1051
  configurable: !0,
1035
1052
  writable: !0,
1036
1053
  value: (r) => {
1037
- this.onCloseHandlers.forEach((n) => n(r)), this.stop();
1054
+ this.onCloseHandlers.forEach((a) => a(r)), this.stop();
1038
1055
  }
1039
1056
  }), Object.defineProperty(this, "dispose", {
1040
1057
  enumerable: !0,
@@ -1060,19 +1077,19 @@ class te {
1060
1077
  var r;
1061
1078
  switch (!e.next_action && e.status && (e.next_action = null), e.next_action) {
1062
1079
  case "wait": {
1063
- window.clearTimeout(this.pollingTimer), this.pollingTimer = window.setTimeout(() => this.updateSessionState(t).catch((n) => {
1064
- n instanceof Response && n.status === 404 && (t == null || t(new Error(`Session ${this.id} has expired`)));
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`)));
1065
1082
  }), ee);
1066
1083
  break;
1067
1084
  }
1068
1085
  }
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;
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;
1070
1087
  }
1071
1088
  }
1072
1089
  async function re(i) {
1073
1090
  return !i.ok && i.status >= 400 && i.status <= 500 ? i.json() : i;
1074
1091
  }
1075
- function y(i) {
1092
+ function g(i) {
1076
1093
  const e = { ...i };
1077
1094
  return delete e.next_action, e;
1078
1095
  }
@@ -1101,14 +1118,14 @@ class N {
1101
1118
  configurable: !0,
1102
1119
  writable: !0,
1103
1120
  value: () => {
1104
- this.session.dispose(), this.coordinator.dispose(), Object.values(this.paymentFlowHandlers).forEach((n) => n == null ? void 0 : n.dispose());
1121
+ this.session.dispose(), this.coordinator.dispose(), Object.values(this.paymentFlowHandlers).forEach((a) => a == null ? void 0 : a.dispose());
1105
1122
  }
1106
1123
  }), Object.defineProperty(this, "onSessionComplete", {
1107
1124
  enumerable: !0,
1108
1125
  configurable: !0,
1109
1126
  writable: !0,
1110
- value: (n) => {
1111
- this.session.onClose(n);
1127
+ value: (a) => {
1128
+ this.session.onClose(a);
1112
1129
  }
1113
1130
  });
1114
1131
  }
@@ -1116,9 +1133,9 @@ class N {
1116
1133
  return this.paymentFlowHandlers[e];
1117
1134
  }
1118
1135
  static async init(e, t = {}) {
1119
- const { session: r, coordinator: n, cardHandler: a, handler3DS: s } = await this.initHandlers(e, t);
1120
- return new N(r, n, {
1121
- CARD: a,
1136
+ const { session: r, coordinator: a, cardHandler: n, handler3DS: s } = await this.initHandlers(e, t);
1137
+ return new N(r, a, {
1138
+ CARD: n,
1122
1139
  "3DS": s
1123
1140
  });
1124
1141
  }
@@ -1126,12 +1143,12 @@ class N {
1126
1143
  const r = {
1127
1144
  ...ie,
1128
1145
  ...t
1129
- }, n = new Z(r.base_url, r.abortCtrl), a = new te(e, n), s = new Q();
1146
+ }, a = new Z(r.base_url, r.abortCtrl), n = new te(e, a), s = new Q();
1130
1147
  s.onMessage("coordinator:session_state_change", (c) => {
1131
- c.state.next_action !== "wait" && a.newStateHandle(c.state);
1148
+ c.state.next_action !== "wait" && n.newStateHandle(c.state);
1132
1149
  }), await s.init(e, r.base_url, r.abortCtrl);
1133
- const o = a.isNextAction("tokenize_card") || a.isNextAction("refresh_security_code") ? await this.createCardHandler(a, s) : void 0, l = this.create3DSHandler(a, t);
1134
- return { session: a, coordinator: s, cardHandler: o, handler3DS: l };
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 };
1135
1152
  }
1136
1153
  static createCardHandler(e, t) {
1137
1154
  return w.init(e, t);
@@ -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 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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starfish-codes/hellgate",
3
- "version": "3.10.0",
3
+ "version": "3.11.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": {
6
6
  "name": "Starfish GmbH & Co. KG",
@@ -45,7 +45,7 @@
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",
48
+ "@vitest/browser": "^3.2.5",
49
49
  "@vitest/coverage-istanbul": "^3.1.3",
50
50
  "@vitest/ui": "^3.1.3",
51
51
  "autoprefixer": "^10.4.18",
@@ -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": "^3.2.6",
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>;