@obhco/pay 0.0.0-stage → 0.1.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.
Files changed (54) hide show
  1. package/README.md +203 -2
  2. package/dist/errors.d.ts +9 -0
  3. package/dist/errors.d.ts.map +1 -0
  4. package/dist/errors.js +15 -0
  5. package/dist/errors.js.map +1 -0
  6. package/dist/gateways/digipay.d.ts +36 -0
  7. package/dist/gateways/digipay.d.ts.map +1 -0
  8. package/dist/gateways/digipay.js +489 -0
  9. package/dist/gateways/digipay.js.map +1 -0
  10. package/dist/gateways/index.d.ts +5 -0
  11. package/dist/gateways/index.d.ts.map +1 -0
  12. package/dist/gateways/index.js +5 -0
  13. package/dist/gateways/index.js.map +1 -0
  14. package/dist/gateways/mellat-constants.d.ts +3 -0
  15. package/dist/gateways/mellat-constants.d.ts.map +1 -0
  16. package/dist/gateways/mellat-constants.js +3 -0
  17. package/dist/gateways/mellat-constants.js.map +1 -0
  18. package/dist/gateways/mellat.d.ts +30 -0
  19. package/dist/gateways/mellat.d.ts.map +1 -0
  20. package/dist/gateways/mellat.js +397 -0
  21. package/dist/gateways/mellat.js.map +1 -0
  22. package/dist/gateways/sadad.d.ts +43 -0
  23. package/dist/gateways/sadad.d.ts.map +1 -0
  24. package/dist/gateways/sadad.js +541 -0
  25. package/dist/gateways/sadad.js.map +1 -0
  26. package/dist/gateways/zarinpal.d.ts +21 -0
  27. package/dist/gateways/zarinpal.d.ts.map +1 -0
  28. package/dist/gateways/zarinpal.js +312 -0
  29. package/dist/gateways/zarinpal.js.map +1 -0
  30. package/dist/http.d.ts +31 -0
  31. package/dist/http.d.ts.map +1 -0
  32. package/dist/http.js +101 -0
  33. package/dist/http.js.map +1 -0
  34. package/dist/index.d.ts +14 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +8 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/pay.d.ts +114 -0
  39. package/dist/pay.d.ts.map +1 -0
  40. package/dist/pay.js +427 -0
  41. package/dist/pay.js.map +1 -0
  42. package/dist/report.d.ts +71 -0
  43. package/dist/report.d.ts.map +1 -0
  44. package/dist/report.js +106 -0
  45. package/dist/report.js.map +1 -0
  46. package/dist/store.d.ts +420 -0
  47. package/dist/store.d.ts.map +1 -0
  48. package/dist/store.js +68 -0
  49. package/dist/store.js.map +1 -0
  50. package/dist/types.d.ts +110 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +16 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +34 -4
@@ -0,0 +1,397 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { PaymentProviderError, } from "../types.js";
3
+ export const MELLAT_PROVIDER_CODE = "mellat";
4
+ export const MELLAT_PROVIDER_NAME = "Mellat (Behpardakht)";
5
+ import { MELLAT_STARTPAY_URL } from "./mellat-constants.js";
6
+ export { MELLAT_STARTPAY_URL };
7
+ const MELLAT_SOAP_URL = "https://bpm.shaparak.ir/pgwchannel/services/pgw";
8
+ const MELLAT_TIMEOUT_MS = 15_000;
9
+ /** Response codes from the Behpardakht IPG guide v1.29. */
10
+ export const MELLAT_RESULT_CODES = {
11
+ 0: { message: "Operation succeeded.", retryable: false },
12
+ 11: { message: "Card number is not valid.", retryable: false },
13
+ 12: { message: "Insufficient balance.", retryable: false },
14
+ 13: { message: "Incorrect PIN.", retryable: false },
15
+ 17: { message: "Customer cancelled the transaction.", retryable: false },
16
+ 21: { message: "Merchant is not valid.", retryable: false },
17
+ 24: { message: "Merchant credentials are not valid.", retryable: false },
18
+ 25: { message: "Amount is not valid.", retryable: false },
19
+ 31: { message: "Response is not valid.", retryable: true },
20
+ 34: { message: "Transaction failed at the issuer.", retryable: false },
21
+ 41: { message: "Duplicate order ID.", retryable: false },
22
+ 42: { message: "Sale transaction was not found.", retryable: false },
23
+ 43: { message: "Transaction was already verified.", retryable: false },
24
+ 44: { message: "Verify request was not found.", retryable: false },
25
+ 45: { message: "Transaction was already settled.", retryable: false },
26
+ 46: { message: "Transaction was not settled.", retryable: false },
27
+ 47: { message: "Settle transaction was not found.", retryable: false },
28
+ 48: { message: "Transaction was reversed.", retryable: false },
29
+ 54: { message: "Reference transaction was not found.", retryable: false },
30
+ 55: { message: "Transaction is not valid.", retryable: false },
31
+ 61: { message: "Deposit failed.", retryable: false },
32
+ 62: {
33
+ message: "Callback URL is outside the registered domain.",
34
+ retryable: false,
35
+ },
36
+ 111: { message: "Card issuer is not valid.", retryable: false },
37
+ 112: { message: "Card issuer switch error.", retryable: true },
38
+ 113: { message: "No response from the card issuer.", retryable: true },
39
+ 114: { message: "Card holder may not perform this.", retryable: false },
40
+ 415: { message: "Session has expired.", retryable: false },
41
+ 416: { message: "Error registering data.", retryable: true },
42
+ 417: { message: "Payer ID is not valid.", retryable: false },
43
+ 418: { message: "Customer data definition error.", retryable: false },
44
+ 419: { message: "Too many data entry attempts.", retryable: false },
45
+ 421: { message: "Server IP is not whitelisted.", retryable: false },
46
+ };
47
+ export function describeMellatCode(code) {
48
+ if (code !== null && code !== undefined && MELLAT_RESULT_CODES[code]) {
49
+ return MELLAT_RESULT_CODES[code].message;
50
+ }
51
+ return code !== null && code !== undefined
52
+ ? `Mellat result code ${code}`
53
+ : "Unspecified gateway response";
54
+ }
55
+ function readCredentials() {
56
+ const terminalId = process.env.BEHPARDAKHT_TERMINAL_ID?.trim();
57
+ const userName = process.env.BEHPARDAKHT_USERNAME?.trim();
58
+ const userPassword = process.env.BEHPARDAKHT_PASSWORD?.trim();
59
+ return terminalId && userName && userPassword && /^\d+$/.test(terminalId)
60
+ ? { terminalId, userName, userPassword }
61
+ : null;
62
+ }
63
+ // Behpardakht only accepts whitelisted Iranian IPs, so the SOAP calls go
64
+ // through a relay on an Iranian host (deploy/mellat-relay). The customer's
65
+ // browser still opens Behpardakht's own StartPay page.
66
+ function readSoapEndpoint() {
67
+ const relayUrl = process.env.BEHPARDAKHT_RELAY_URL?.trim();
68
+ const relaySecret = process.env.BEHPARDAKHT_RELAY_SECRET?.trim() ||
69
+ process.env.SADAD_RELAY_SECRET?.trim();
70
+ if (relayUrl && relaySecret) {
71
+ return {
72
+ url: relayUrl,
73
+ headers: { "X-Relay-Secret": relaySecret },
74
+ relayed: true,
75
+ };
76
+ }
77
+ return { url: MELLAT_SOAP_URL, headers: {}, relayed: false };
78
+ }
79
+ function maskIdentifier(value) {
80
+ const trimmed = value?.trim();
81
+ if (!trimmed) {
82
+ return null;
83
+ }
84
+ if (trimmed.length <= 4) {
85
+ return "****";
86
+ }
87
+ return `${trimmed.slice(0, 2)}${"*".repeat(Math.min(6, trimmed.length - 4))}${trimmed.slice(-2)}`;
88
+ }
89
+ export function getMellatConfigStatus() {
90
+ return {
91
+ providerCode: MELLAT_PROVIDER_CODE,
92
+ providerName: MELLAT_PROVIDER_NAME,
93
+ liveConfigured: Boolean(readCredentials()),
94
+ terminalIdMasked: maskIdentifier(process.env.BEHPARDAKHT_TERMINAL_ID),
95
+ usernameMasked: maskIdentifier(process.env.BEHPARDAKHT_USERNAME),
96
+ relayed: readSoapEndpoint().relayed,
97
+ };
98
+ }
99
+ function getCredentials() {
100
+ const credentials = readCredentials();
101
+ if (!credentials) {
102
+ throw new PaymentProviderError("MELLAT_CREDENTIALS_MISSING", "BEHPARDAKHT_TERMINAL_ID, BEHPARDAKHT_USERNAME and BEHPARDAKHT_PASSWORD are not configured in server environment variables.");
103
+ }
104
+ return credentials;
105
+ }
106
+ function escapeXml(value) {
107
+ return value
108
+ .replaceAll("&", "&amp;")
109
+ .replaceAll("<", "&lt;")
110
+ .replaceAll(">", "&gt;")
111
+ .replaceAll('"', "&quot;");
112
+ }
113
+ export function buildMellatEnvelope(operation, fields) {
114
+ const body = fields
115
+ .map(([name, value]) => `<${name}>${escapeXml(value)}</${name}>`)
116
+ .join("");
117
+ return `<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:int="http://interfaces.core.sw.bps.com/"><soapenv:Body><int:${operation}>${body}</int:${operation}></soapenv:Body></soapenv:Envelope>`;
118
+ }
119
+ /** Reads the single `<return>` string every Behpardakht operation returns. */
120
+ export function parseMellatReturn(xml) {
121
+ const match = /<return>([^<]*)<\/return>/.exec(xml);
122
+ return match?.[1] !== undefined ? match[1].trim() : null;
123
+ }
124
+ async function callMellat(operation, fields) {
125
+ const { terminalId, userName, userPassword } = getCredentials();
126
+ const endpoint = readSoapEndpoint();
127
+ const controller = new AbortController();
128
+ const timeout = setTimeout(() => controller.abort(), MELLAT_TIMEOUT_MS);
129
+ try {
130
+ const response = await fetch(endpoint.url, {
131
+ method: "POST",
132
+ headers: {
133
+ "Content-Type": "text/xml; charset=utf-8",
134
+ SOAPAction: '""',
135
+ ...endpoint.headers,
136
+ },
137
+ body: buildMellatEnvelope(operation, [
138
+ ["terminalId", terminalId],
139
+ ["userName", userName],
140
+ ["userPassword", userPassword],
141
+ ...fields,
142
+ ]),
143
+ signal: controller.signal,
144
+ });
145
+ const text = await response.text();
146
+ const result = parseMellatReturn(text);
147
+ if (result === null) {
148
+ throw new PaymentProviderError("MELLAT_INVALID_RESPONSE", `Mellat ${operation} returned no result (HTTP ${response.status}).`);
149
+ }
150
+ return result;
151
+ }
152
+ catch (error) {
153
+ if (error instanceof PaymentProviderError) {
154
+ throw error;
155
+ }
156
+ throw new PaymentProviderError("MELLAT_NETWORK_ERROR", `Could not reach Mellat ${operation}.`);
157
+ }
158
+ finally {
159
+ clearTimeout(timeout);
160
+ }
161
+ }
162
+ /** `localDate` (YYYYMMDD) and `localTime` (HHMMSS) in Tehran time. */
163
+ export function mellatLocalDateTime(now = new Date()) {
164
+ const parts = Object.fromEntries(new Intl.DateTimeFormat("en-GB", {
165
+ timeZone: "Asia/Tehran",
166
+ year: "numeric",
167
+ month: "2-digit",
168
+ day: "2-digit",
169
+ hour: "2-digit",
170
+ minute: "2-digit",
171
+ second: "2-digit",
172
+ hourCycle: "h23",
173
+ })
174
+ .formatToParts(now)
175
+ .map((part) => [part.type, part.value]));
176
+ return {
177
+ localDate: `${parts.year}${parts.month}${parts.day}`,
178
+ localTime: `${parts.hour}${parts.minute}${parts.second}`,
179
+ };
180
+ }
181
+ function readString(value) {
182
+ return value === undefined || value === null || value === ""
183
+ ? null
184
+ : String(value);
185
+ }
186
+ function readCode(value) {
187
+ const code = Number(value.split(",")[0]);
188
+ return Number.isNaN(code) ? -1 : code;
189
+ }
190
+ export const mellatPaymentAdapter = {
191
+ code: MELLAT_PROVIDER_CODE,
192
+ descriptor: {
193
+ code: MELLAT_PROVIDER_CODE,
194
+ name: MELLAT_PROVIDER_NAME,
195
+ displayName: "پرداخت با کارت بانکی (به‌پرداخت ملت)",
196
+ description: "Pays the full amount with any Shetab bank card through Bank Mellat's Behpardakht gateway.",
197
+ kind: "card",
198
+ requiresCustomerMobile: false,
199
+ minAmount: null,
200
+ },
201
+ isConfigured() {
202
+ return getMellatConfigStatus().liveConfigured;
203
+ },
204
+ async createCheckoutSession(input) {
205
+ if (input.currency !== "IRR") {
206
+ throw new PaymentProviderError("CURRENCY_NOT_SUPPORTED", "Mellat only supports IRR.");
207
+ }
208
+ if (!/^[1-9]\d{0,17}$/.test(input.amount)) {
209
+ throw new PaymentProviderError("INVALID_AMOUNT", "Mellat requires a positive whole Rial integer amount.");
210
+ }
211
+ // StartPay needs a POST with RefId, so the session carries a POST
212
+ // redirect instead of a checkout URL.
213
+ const { localDate, localTime } = mellatLocalDateTime();
214
+ const mobile = input.customerMobile?.trim();
215
+ const result = await callMellat("bpPayRequest", [
216
+ ["orderId", input.gatewayOrderId],
217
+ ["amount", input.amount],
218
+ ["localDate", localDate],
219
+ ["localTime", localTime],
220
+ ["additionalData", input.paymentReference],
221
+ [
222
+ "callBackUrl",
223
+ process.env.BEHPARDAKHT_CALLBACK_URL?.trim() || input.callbackUrl,
224
+ ],
225
+ ["payerId", "0"],
226
+ ...(mobile ? [["mobileNo", mobile.replace(/^0/, "98")]] : []),
227
+ ]);
228
+ const [rawCode, refId] = result.split(",");
229
+ const code = Number(rawCode);
230
+ if (code !== 0 || !refId) {
231
+ throw new PaymentProviderError(`MELLAT_RES_${rawCode}`, describeMellatCode(code), Number.isNaN(code) ? undefined : code);
232
+ }
233
+ return {
234
+ providerSessionId: refId.trim(),
235
+ providerReference: null,
236
+ checkoutUrl: null,
237
+ redirect: {
238
+ method: "POST",
239
+ url: MELLAT_STARTPAY_URL,
240
+ fields: { RefId: refId.trim() },
241
+ },
242
+ expiresAt: new Date(Date.now() + 15 * 60 * 1000),
243
+ resultCode: 0,
244
+ resultMessage: describeMellatCode(0),
245
+ };
246
+ },
247
+ /**
248
+ * `payload` is the callback POST: `RefId`, `ResCode`, `SaleOrderId`,
249
+ * `SaleReferenceId` and `CardHolderPan`. A successful payment is verified
250
+ * and then settled; unsettled payments are never credited by the bank.
251
+ */
252
+ async verifyPayment(input) {
253
+ const payload = input.payload ?? {};
254
+ const refId = readString(payload.RefId) ?? input.providerSessionId;
255
+ const resCode = readString(payload.ResCode);
256
+ const saleOrderId = readString(payload.SaleOrderId);
257
+ const saleReferenceId = readString(payload.SaleReferenceId);
258
+ const maskedCard = readString(payload.CardHolderPan);
259
+ const base = {
260
+ adapter: MELLAT_PROVIDER_CODE,
261
+ refId,
262
+ saleOrderId,
263
+ saleReferenceId,
264
+ };
265
+ const pending = (resultCode, resultMessage) => ({
266
+ status: "PENDING",
267
+ providerReference: saleReferenceId ?? refId ?? "",
268
+ traceNumber: null,
269
+ maskedCardNumber: maskedCard,
270
+ resultCode,
271
+ resultMessage,
272
+ verifiedAmount: null,
273
+ verifiedOrderId: null,
274
+ verifiedAt: null,
275
+ failureReason: null,
276
+ metadata: base,
277
+ });
278
+ const failed = (resultCode, reason, extra = {}) => ({
279
+ status: "FAILED",
280
+ providerReference: saleReferenceId ??
281
+ refId ??
282
+ `fail_${randomUUID().replaceAll("-", "").slice(0, 12)}`,
283
+ traceNumber: null,
284
+ maskedCardNumber: maskedCard,
285
+ resultCode,
286
+ resultMessage: reason,
287
+ verifiedAmount: null,
288
+ verifiedOrderId: saleOrderId,
289
+ verifiedAt: new Date(),
290
+ failureReason: reason,
291
+ metadata: { ...base, ...extra },
292
+ });
293
+ if (resCode === null) {
294
+ return pending(-1, "Awaiting Mellat payment result.");
295
+ }
296
+ if (resCode !== "0") {
297
+ const code = Number(resCode);
298
+ return failed(Number.isNaN(code) ? -1 : code, code === 17
299
+ ? "پرداخت توسط کاربر لغو شد."
300
+ : describeMellatCode(Number.isNaN(code) ? null : code));
301
+ }
302
+ if (!saleOrderId || !saleReferenceId || !/^\d+$/.test(saleReferenceId)) {
303
+ return failed(-1, "Mellat callback is missing SaleOrderId or SaleReferenceId.");
304
+ }
305
+ if (input.gatewayOrderId && saleOrderId !== input.gatewayOrderId) {
306
+ return failed(-1, "Mellat SaleOrderId did not match.", {
307
+ expectedOrderId: input.gatewayOrderId,
308
+ });
309
+ }
310
+ const completed = (resultCode, extra) => ({
311
+ status: "COMPLETED",
312
+ providerReference: saleReferenceId,
313
+ traceNumber: saleReferenceId,
314
+ maskedCardNumber: maskedCard,
315
+ resultCode,
316
+ resultMessage: describeMellatCode(resultCode),
317
+ // Behpardakht charges the amount registered in bpPayRequest.
318
+ verifiedAmount: input.expectedAmount ?? null,
319
+ verifiedOrderId: saleOrderId,
320
+ verifiedAt: new Date(),
321
+ failureReason: null,
322
+ metadata: { ...base, ...extra },
323
+ });
324
+ const references = [
325
+ ["orderId", saleOrderId],
326
+ ["saleOrderId", saleOrderId],
327
+ ["saleReferenceId", saleReferenceId],
328
+ ];
329
+ let verifyCode;
330
+ try {
331
+ verifyCode = readCode(await callMellat("bpVerifyRequest", references));
332
+ }
333
+ catch {
334
+ // Verify timed out or failed in transit: ask for the status instead.
335
+ try {
336
+ verifyCode = readCode(await callMellat("bpInquiryRequest", references));
337
+ }
338
+ catch {
339
+ return pending(-1, "Temporary communication failure during Mellat verify; retry pending.");
340
+ }
341
+ }
342
+ if (verifyCode !== 0 && verifyCode !== 43) {
343
+ if (MELLAT_RESULT_CODES[verifyCode]?.retryable) {
344
+ return pending(verifyCode, describeMellatCode(verifyCode));
345
+ }
346
+ return failed(verifyCode, describeMellatCode(verifyCode), {
347
+ step: "verify",
348
+ });
349
+ }
350
+ let settleCode;
351
+ try {
352
+ settleCode = readCode(await callMellat("bpSettleRequest", references));
353
+ }
354
+ catch {
355
+ // Verified but not settled: keep PENDING so a retry settles it
356
+ // (verify then answers 43).
357
+ return pending(verifyCode, "Mellat payment verified; settle failed in transit and will be retried.");
358
+ }
359
+ if (settleCode !== 0 && settleCode !== 45) {
360
+ if (MELLAT_RESULT_CODES[settleCode]?.retryable) {
361
+ return pending(settleCode, describeMellatCode(settleCode));
362
+ }
363
+ return failed(settleCode, describeMellatCode(settleCode), {
364
+ step: "settle",
365
+ });
366
+ }
367
+ return completed(settleCode, { verifyCode, settleCode });
368
+ },
369
+ parseCallback(payload) {
370
+ const refId = payload.RefId?.trim() || null;
371
+ const saleOrderId = payload.SaleOrderId?.trim() || null;
372
+ const resCode = payload.ResCode?.trim() ?? "";
373
+ const succeeded = resCode === "0";
374
+ const saleReferenceId = payload.SaleReferenceId?.trim() || null;
375
+ return {
376
+ sessionId: refId,
377
+ gatewayOrderId: saleOrderId && /^\d+$/.test(saleOrderId) ? saleOrderId : null,
378
+ outcome: succeeded ? "verify" : "failed",
379
+ resultCode: succeeded ? 0 : Number(resCode) || -1,
380
+ resultText: succeeded
381
+ ? "Mellat reported ResCode 0; awaiting verify and settle."
382
+ : resCode === "17"
383
+ ? "پرداخت توسط کاربر لغو شد."
384
+ : `پرداخت ملت ناموفق بود (کد ${resCode || "نامشخص"}).`,
385
+ providerReference: saleReferenceId,
386
+ maskedCardNumber: payload.CardHolderPan?.trim() || null,
387
+ payload: {
388
+ RefId: refId,
389
+ ResCode: resCode,
390
+ SaleOrderId: saleOrderId,
391
+ SaleReferenceId: saleReferenceId,
392
+ CardHolderPan: payload.CardHolderPan?.trim() || null,
393
+ },
394
+ };
395
+ },
396
+ };
397
+ //# sourceMappingURL=mellat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mellat.js","sourceRoot":"","sources":["../../src/gateways/mellat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type PaymentGatewayAdapter } from "../types.js";
2
+ export declare const SADAD_PROVIDER_CODE = "sadad";
3
+ export declare const SADAD_PROVIDER_NAME = "Sadad (Bank Melli Iran)";
4
+ /**
5
+ * Known Sadad IPG `PaymentRequest` and `Verify` response codes from
6
+ * Sadad Electronic Payment Company "Purchase Process Implementation Guide" v1.10.
7
+ */
8
+ export declare const SADAD_RESPONSE_CODES: Record<number, {
9
+ message: string;
10
+ retryable: boolean;
11
+ }>;
12
+ export declare function describeSadadCode(code: number | null | undefined, fallback?: string | null): string;
13
+ /**
14
+ * Encrypts plaintext using TripleDES (3DES) in ECB mode with PKCS7 padding
15
+ * and returns Base64, as required by Sadad IPG for `SignData`.
16
+ */
17
+ export declare function createSadadSignData(plaintext: string, base64TerminalKey: string): string;
18
+ export declare function decryptSadadSignData(signDataBase64: string, base64TerminalKey: string): string;
19
+ export declare function createSadadPaymentRequestSignData(input: {
20
+ terminalId: string;
21
+ orderId: string | number | bigint;
22
+ amount: string | number | bigint;
23
+ terminalKey: string;
24
+ }): string;
25
+ export declare function createSadadVerifySignData(token: string, terminalKey: string): string;
26
+ export type SadadConfigStatus = {
27
+ providerCode: typeof SADAD_PROVIDER_CODE;
28
+ providerName: typeof SADAD_PROVIDER_NAME;
29
+ baseUrl: string;
30
+ requestEndpoint: string;
31
+ purchaseEndpoint: string;
32
+ verifyEndpoint: string;
33
+ liveConfigured: boolean;
34
+ merchantId: string | null;
35
+ terminalId: string | null;
36
+ merchantIdMasked: string | null;
37
+ terminalIdMasked: string | null;
38
+ terminalKeyPrefix: string | null;
39
+ terminalKeyConfigured: boolean;
40
+ };
41
+ export declare function getSadadConfigStatus(): SadadConfigStatus;
42
+ export declare const sadadPaymentAdapter: PaymentGatewayAdapter;
43
+ //# sourceMappingURL=sadad.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sadad.d.ts","sourceRoot":"","sources":["../../src/gateways/sadad.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,qBAAqB,EAG3B,MAAM,aAAa,CAAA;AAEpB,eAAO,MAAM,mBAAmB,UAAU,CAAA;AAC1C,eAAO,MAAM,mBAAmB,4BAA4B,CAAA;AAqB5D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CACvC,MAAM,EACN;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAkIxC,CAAA;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,UAazB;AAwBD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,GACxB,MAAM,CAWR;AAED,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,GACxB,MAAM,CAWR;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACjC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,MAAM,CAGT;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,OAAO,mBAAmB,CAAA;IACxC,YAAY,EAAE,OAAO,mBAAmB,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,OAAO,CAAA;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,qBAAqB,EAAE,OAAO,CAAA;CAC/B,CAAA;AAaD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAiCxD;AAuCD,eAAO,MAAM,mBAAmB,EAAE,qBA6UjC,CAAA"}