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