@crediblemark/buayar 0.6.1 → 0.7.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/index.mjs CHANGED
@@ -2468,6 +2468,29 @@ function verifySnapWebhookSignature(headers, body, clientSecret, endpointUrl = "
2468
2468
  );
2469
2469
  return safeCompare(incoming, computed);
2470
2470
  }
2471
+ function snapErrorHint(message, code) {
2472
+ const m = (message || "").toLowerCase();
2473
+ const c = (code || "").toLowerCase();
2474
+ if (m.includes("unknown client") || c.includes("4017300") || c.includes("4017400")) {
2475
+ return "Client ID tidak dikenali DOKU. Pastikan clientId benar & kanal SNAP aktif untuk akun ini.";
2476
+ }
2477
+ if (m.includes("signature") || c.startsWith("401")) {
2478
+ return "Signature ditolak DOKU. Pastikan (a) Merchant Public Key yang di-upload sesuai dengan private key yang dipakai, dan (b) Get Token memakai timestamp UTC (Z).";
2479
+ }
2480
+ if (m.includes("bin") || m.includes("not configured") && m.includes("identifier")) {
2481
+ return "Akun belum punya BIN/partnerServiceId VA yang aktif. Sediakan nilai di config.extra.partnerServiceId (atau DOKU_PARTNER_SERVICE_ID) setelah di-assign di dashboard/sales.";
2482
+ }
2483
+ if (m.includes("merchantid") || m.includes("merchant id")) {
2484
+ return "QRIS/e-Wallet butuh merchantId. Isi config.extra.merchantId (atau DOKU_MERCHANT_ID) dari dashboard.";
2485
+ }
2486
+ if (m.includes("partner service id") || m.includes("partnerServiceId")) {
2487
+ return "partnerServiceId tidak valid. Harus 8 karakter left-padded (BIN/company code DOKU).";
2488
+ }
2489
+ if (m.includes("customer no") || m.includes("customerno")) {
2490
+ return "customerNo tidak valid (maks 20 digit unik). Cek config.extra.customerNo.";
2491
+ }
2492
+ return void 0;
2493
+ }
2471
2494
 
2472
2495
  // src/clients/snap.ts
2473
2496
  var SnapClient = class {
@@ -2524,7 +2547,16 @@ var SnapClient = class {
2524
2547
  } catch {
2525
2548
  }
2526
2549
  if (!response.ok || !data?.accessToken) {
2527
- throw new Error(data?.responseMessage || data?.message || `DOKU SNAP get-token failed: HTTP ${response.status} - ${text}`);
2550
+ const baseMessage = data?.responseMessage || data?.message || `DOKU SNAP get-token failed: HTTP ${response.status}`;
2551
+ const hint = snapErrorHint(baseMessage, data?.responseCode);
2552
+ const err = new SnapApiError(`${baseMessage}${data?.responseCode ? ` (${data.responseCode})` : ""}${hint ? ` \u2014 ${hint}` : ""}`, {
2553
+ status: response.status,
2554
+ code: data?.responseCode,
2555
+ raw: data,
2556
+ endpoint,
2557
+ method: "POST"
2558
+ });
2559
+ throw err;
2528
2560
  }
2529
2561
  if (!clientSecret) {
2530
2562
  }
@@ -2585,12 +2617,37 @@ var SnapClient = class {
2585
2617
  } catch {
2586
2618
  }
2587
2619
  if (!response.ok) {
2588
- const err = data?.responseMessage || data?.error?.message || data?.message || `HTTP ${response.status}`;
2589
- throw new Error(`${err}${data?.responseCode ? ` (${data.responseCode})` : ""}`);
2620
+ const baseMessage = data?.responseMessage || data?.error?.message || data?.message || `HTTP ${response.status}`;
2621
+ const hint = snapErrorHint(baseMessage, data?.responseCode);
2622
+ const message = `${baseMessage}${data?.responseCode ? ` (${data.responseCode})` : ""}${hint ? ` \u2014 ${hint}` : ""}`;
2623
+ const err = new SnapApiError(message, {
2624
+ status: response.status,
2625
+ code: data?.responseCode,
2626
+ raw: data,
2627
+ endpoint,
2628
+ method
2629
+ });
2630
+ throw err;
2590
2631
  }
2591
2632
  return data;
2592
2633
  }
2593
2634
  };
2635
+ var SnapApiError = class extends Error {
2636
+ status;
2637
+ responseCode;
2638
+ raw;
2639
+ endpoint;
2640
+ method;
2641
+ constructor(message, opts) {
2642
+ super(message);
2643
+ this.name = "SnapApiError";
2644
+ this.status = opts.status;
2645
+ this.responseCode = opts.code;
2646
+ this.raw = opts.raw;
2647
+ this.endpoint = opts.endpoint;
2648
+ this.method = opts.method;
2649
+ }
2650
+ };
2594
2651
 
2595
2652
  // src/providers/doku/provider.ts
2596
2653
  var DokuProvider = class extends BasePaymentProvider {
@@ -2867,8 +2924,8 @@ var DokuProvider = class extends BasePaymentProvider {
2867
2924
  provider: "doku",
2868
2925
  orderId,
2869
2926
  amount: integerAmount,
2870
- rawResponse: null,
2871
- error: e.message || "Failed to make SNAP request to DOKU API"
2927
+ rawResponse: e?.raw ?? e?.rawResponse ?? null,
2928
+ error: e?.message || "Failed to make SNAP request to DOKU API"
2872
2929
  };
2873
2930
  }
2874
2931
  }
@@ -2878,8 +2935,9 @@ var DokuProvider = class extends BasePaymentProvider {
2878
2935
  const method = String(params.paymentMethod || "").toLowerCase();
2879
2936
  const bankKey = method.replace(/_va$/, "");
2880
2937
  const channel = config.extra?.vaChannel || bankMap[bankKey] || `VIRTUAL_ACCOUNT_${bankKey.toUpperCase()}`;
2881
- const partnerServiceId = (config.extra?.partnerServiceId || "").replace(/\s/g, "");
2882
- const customerNo = (config.extra?.customerNo || "").slice(0, 20) || String(Date.now()).slice(-12);
2938
+ const rawPartnerServiceId = (config.extra?.partnerServiceId || "").replace(/\s/g, "");
2939
+ const partnerServiceId = rawPartnerServiceId.padStart(8, " ").slice(0, 8);
2940
+ const customerNo = (config.extra?.customerNo || "").replace(/\s/g, "").slice(0, 20) || String(Date.now()).slice(-12);
2883
2941
  const virtualAccountNo = (partnerServiceId + customerNo).slice(0, 28);
2884
2942
  const reusable = config.extra?.reusableStatus === true;
2885
2943
  const currency = params.currency || "IDR";
@@ -2908,6 +2966,7 @@ var DokuProvider = class extends BasePaymentProvider {
2908
2966
  return {
2909
2967
  success: true,
2910
2968
  provider: "doku",
2969
+ mode: "va",
2911
2970
  orderId: vaData.trxId || orderId,
2912
2971
  amount: Number(vaData.totalAmount?.value || amount) || Math.round(amount),
2913
2972
  reference: vaData.virtualAccountNo || orderId,
@@ -2943,6 +3002,7 @@ var DokuProvider = class extends BasePaymentProvider {
2943
3002
  return {
2944
3003
  success: true,
2945
3004
  provider: "doku",
3005
+ mode: "qris",
2946
3006
  orderId: data.partnerReferenceNo || orderId,
2947
3007
  amount: Number(data.amount?.value || amount) || Math.round(amount),
2948
3008
  reference: data.referenceNo || orderId,
@@ -2988,10 +3048,12 @@ var DokuProvider = class extends BasePaymentProvider {
2988
3048
  return {
2989
3049
  success: true,
2990
3050
  provider: "doku",
3051
+ mode: "ewallet",
2991
3052
  orderId: data.partnerReferenceNo || orderId,
2992
3053
  amount: Number(data.amount?.value || amount) || Math.round(amount),
2993
3054
  reference: data.partnerReferenceNo || orderId,
2994
3055
  paymentUrl: data.webRedirectUrl || data.paymentUrl,
3056
+ checkoutUrl: data.webRedirectUrl || data.paymentUrl,
2995
3057
  rawResponse: data
2996
3058
  };
2997
3059
  }
@@ -9416,170 +9478,316 @@ var PaymentManager = class {
9416
9478
  };
9417
9479
  var paymentManager = new PaymentManager();
9418
9480
 
9481
+ // src/core/providerRegistry.ts
9482
+ var ProviderRegistry = class {
9483
+ descriptors = /* @__PURE__ */ new Map();
9484
+ constructor(initial) {
9485
+ for (const d of initial || []) this.register(d);
9486
+ }
9487
+ register(desc) {
9488
+ this.descriptors.set(desc.name.toLowerCase().trim(), desc);
9489
+ }
9490
+ unregister(name) {
9491
+ return this.descriptors.delete(name.toLowerCase().trim());
9492
+ }
9493
+ has(name) {
9494
+ return this.descriptors.has(name.toLowerCase().trim());
9495
+ }
9496
+ get(name) {
9497
+ return this.descriptors.get(name.toLowerCase().trim());
9498
+ }
9499
+ names() {
9500
+ return [...this.descriptors.keys()];
9501
+ }
9502
+ /**
9503
+ * Autodetect provider aktif dari variabel lingkungan.
9504
+ * Mengembalikan nama provider yang kredensial .env-nya terisi penuh,
9505
+ * atau undefined jika tidak ada / ambigu.
9506
+ */
9507
+ detectFromEnv(env) {
9508
+ const present = [];
9509
+ for (const [name, desc] of this.descriptors) {
9510
+ const filled = desc.envKeys.filter((k) => {
9511
+ const v = env[k];
9512
+ return typeof v === "string" && v.trim().length > 0;
9513
+ });
9514
+ if (filled.length > 0) present.push({ name, count: filled.length });
9515
+ }
9516
+ if (present.length === 0) return void 0;
9517
+ present.sort((a, b) => b.count - a.count);
9518
+ const top = present[0];
9519
+ const ties = present.filter((p) => p.count === top.count);
9520
+ return ties.length === 1 ? top.name : void 0;
9521
+ }
9522
+ /**
9523
+ * Autodetect provider dari struktur payload webhook.
9524
+ * Mengembalikan nama provider jika dikenali, else undefined.
9525
+ */
9526
+ detectFromWebhook(payload) {
9527
+ if (!payload) return void 0;
9528
+ const p = payload;
9529
+ if (p.signature_key && p.transaction_status) return "midtrans";
9530
+ if (p.merchantCode && p.merchantOrderId && p.resultCode) return "duitku";
9531
+ if (p.trx_id && (p.sid || p.reference_id || p.via)) return "ipaymu";
9532
+ if (p.service?.id || p.order?.invoice_number && p.transaction?.status) return "doku";
9533
+ if (p.bill_no && (p.payment_status_code !== void 0 || p.payment_status_desc)) return "faspay";
9534
+ if (p.merchant_id && p.order_id && p.payment_status) return "finpay";
9535
+ if (p.tXid && p.merchantToken && (p.referenceNo || p.amt)) return "nicepay";
9536
+ if (p.partner_tx_id || p.partner_trx_id) return "oy";
9537
+ if (p.merchant_id && p.order_id && p.signature) return "prismalink";
9538
+ if (p.object === "event" || p.type && p.data?.object && p.api_version) return "stripe";
9539
+ if (p.event && p.payload?.payment?.entity) return "razorpay";
9540
+ if (p.external_id || p.event?.startsWith("payment.") || p.event?.startsWith("qr.") || p.data?.reference_id) return "xendit";
9541
+ if (p.event_type && p.resource && (p.event_type.startsWith("PAYMENT.") || p.event_type.startsWith("CHECKOUT.ORDER."))) return "paypal";
9542
+ if (p.notificationItems || p.merchantAccountCode && p.pspReference && p.eventCode) return "adyen";
9543
+ if (p.type && p.data?._links && (p.type.startsWith("payment_") || p.type.startsWith("refund_"))) return "checkoutcom";
9544
+ if (p.type && p.data?.object?.status && p.merchant_id) return "square";
9545
+ if (p.order && p.order?.status && p.order?.extOrderId) return "payu";
9546
+ if (p.kind && p.subject?.transaction) return "braintree";
9547
+ if (p.HASH && p.REFNOEXT && p.IPN_PID) return "twocheckout";
9548
+ return void 0;
9549
+ }
9550
+ };
9551
+ var ENV_KEYS = {
9552
+ midtrans: ["MIDTRANS_SERVER_KEY", "MIDTRANS_CLIENT_KEY"],
9553
+ duitku: ["DUITKU_API_KEY", "DUITKU_MERCHANT_CODE"],
9554
+ ipaymu: ["IPAYMU_API_KEY", "IPAYMU_VA"],
9555
+ xendit: ["XENDIT_SECRET_KEY", "XENDIT_WEBHOOK_TOKEN"],
9556
+ doku: ["DOKU_CLIENT_ID", "DOKU_SECRET_KEY"],
9557
+ prismalink: ["PRISMALINK_MERCHANT_ID", "PRISMALINK_SECRET_KEY"],
9558
+ faspay: ["FASPAY_MERCHANT_ID", "FASPAY_USER_ID", "FASPAY_PASSWORD"],
9559
+ finpay: ["FINPAY_MERCHANT_ID", "FINPAY_MERCHANT_KEY"],
9560
+ nicepay: ["NICEPAY_IMID", "NICEPAY_KEY"],
9561
+ oy: ["OY_USERNAME", "OY_API_KEY"],
9562
+ stripe: ["STRIPE_SECRET_KEY", "STRIPE_PUBLIC_KEY", "STRIPE_WEBHOOK_SECRET"],
9563
+ paypal: ["PAYPAL_CLIENT_ID", "PAYPAL_CLIENT_SECRET", "PAYPAL_WEBHOOK_ID"],
9564
+ adyen: ["ADYEN_API_KEY", "ADYEN_MERCHANT_ACCOUNT", "ADYEN_HMAC_KEY"],
9565
+ checkoutcom: ["CHECKOUTCOM_SECRET_KEY", "CHECKOUTCOM_PUBLIC_KEY", "CHECKOUTCOM_WEBHOOK_SECRET"],
9566
+ razorpay: ["RAZORPAY_KEY_ID", "RAZORPAY_KEY_SECRET", "RAZORPAY_WEBHOOK_SECRET"],
9567
+ square: ["SQUARE_ACCESS_TOKEN", "SQUARE_LOCATION_ID", "SQUARE_WEBHOOK_SIGNATURE_KEY"],
9568
+ payu: ["PAYU_POS_ID", "PAYU_MD5_KEY"],
9569
+ braintree: ["BRAINTREE_MERCHANT_ID", "BRAINTREE_PUBLIC_KEY", "BRAINTREE_PRIVATE_KEY"],
9570
+ twocheckout: ["TWOCHECKOUT_MERCHANT_CODE", "TWOCHECKOUT_SECRET_KEY", "TWOCHECKOUT_SECRET_WORD"]
9571
+ };
9572
+ var WORKING_METHODS = {
9573
+ midtrans: Object.keys(CANONICAL_TO_MIDTRANS),
9574
+ duitku: Object.keys(CANONICAL_TO_DUITKU),
9575
+ ipaymu: Object.keys(CANONICAL_TO_IPAYMU),
9576
+ xendit: Object.keys(CANONICAL_TO_XENDIT),
9577
+ doku: Object.keys(CANONICAL_TO_DOKU),
9578
+ prismalink: Object.keys(CANONICAL_TO_PRISMALINK),
9579
+ faspay: Object.keys(CANONICAL_TO_FASPAY),
9580
+ finpay: Object.keys(CANONICAL_TO_FINPAY),
9581
+ nicepay: Object.keys(CANONICAL_TO_NICEPAY),
9582
+ oy: Object.keys(CANONICAL_TO_OY),
9583
+ stripe: Object.keys(CANONICAL_TO_STRIPE),
9584
+ paypal: ["credit_card", "paylater", "paypal", "bank_transfer"],
9585
+ adyen: ["credit_card", "paypal", "qris", "apple_pay", "google_pay", "klarna", "sepa"],
9586
+ checkoutcom: ["credit_card", "paypal", "apple_pay", "google_pay", "klarna", "sofort", "bank_transfer"],
9587
+ razorpay: ["credit_card", "wallet", "upi", "netbanking", "emi", "bank_transfer"],
9588
+ square: ["credit_card", "apple_pay", "google_pay", "afterpay", "cash_app"],
9589
+ payu: ["credit_card", "bank_transfer", "apple_pay", "google_pay", "blik", "installment"],
9590
+ braintree: ["credit_card", "paypal", "apple_pay", "google_pay", "venmo"],
9591
+ twocheckout: ["credit_card", "paypal", "paylater", "wire_transfer"]
9592
+ };
9593
+ var OPERATIONS = {
9594
+ midtrans: { refund: true, checkBalance: true, disburse: false },
9595
+ duitku: { refund: false, checkBalance: true, disburse: true },
9596
+ ipaymu: { refund: false, checkBalance: true, disburse: false },
9597
+ xendit: { refund: false, checkBalance: true, disburse: true },
9598
+ doku: { refund: false, checkBalance: false, disburse: false },
9599
+ prismalink: { refund: false, checkBalance: false, disburse: false },
9600
+ faspay: { refund: false, checkBalance: false, disburse: false },
9601
+ finpay: { refund: false, checkBalance: false, disburse: false },
9602
+ nicepay: { refund: false, checkBalance: false, disburse: false },
9603
+ oy: { refund: false, checkBalance: true, disburse: true },
9604
+ stripe: { refund: true, checkBalance: true, disburse: false },
9605
+ paypal: { refund: true, checkBalance: true, disburse: false },
9606
+ adyen: { refund: true, checkBalance: false, disburse: false },
9607
+ checkoutcom: { refund: true, checkBalance: true, disburse: false },
9608
+ razorpay: { refund: true, checkBalance: true, disburse: false },
9609
+ square: { refund: true, checkBalance: true, disburse: false },
9610
+ payu: { refund: true, checkBalance: false, disburse: false },
9611
+ braintree: { refund: true, checkBalance: false, disburse: false },
9612
+ twocheckout: { refund: true, checkBalance: false, disburse: false }
9613
+ };
9614
+ function buildDefaultDescriptors() {
9615
+ return Object.keys(ENV_KEYS).map((name) => ({
9616
+ name,
9617
+ envKeys: ENV_KEYS[name],
9618
+ methods: WORKING_METHODS[name] || [],
9619
+ operations: OPERATIONS[name] || { refund: false, checkBalance: false, disburse: false }
9620
+ }));
9621
+ }
9622
+ var providerRegistry = new ProviderRegistry(buildDefaultDescriptors());
9623
+
9419
9624
  // src/core/config.ts
9625
+ var UNIVERSAL = {
9626
+ apiKey: ["BUAYAR_API_KEY", "BUAYAR_SERVER_KEY", "PG_API_KEY", "PAYMENT_API_KEY"],
9627
+ clientKey: ["BUAYAR_CLIENT_KEY", "PG_CLIENT_KEY"],
9628
+ merchantCode: ["BUAYAR_MERCHANT_CODE", "PG_MERCHANT_CODE", "PAYMENT_MERCHANT_CODE"],
9629
+ merchantId: ["BUAYAR_MERCHANT_ID", "PG_MERCHANT_ID"],
9630
+ secretKey: ["BUAYAR_SECRET_KEY", "PG_SECRET_KEY", "SECRET_KEY"],
9631
+ serverKey: ["BUAYAR_SERVER_KEY", "PG_SECRET_KEY"],
9632
+ projectId: ["BUAYAR_PROJECT_ID", "PG_PROJECT_ID", "PROJECT_ID"]
9633
+ };
9634
+ var SPECIFIC = {
9635
+ midtrans: {
9636
+ apiKey: ["MIDTRANS_SERVER_KEY"],
9637
+ clientKey: ["MIDTRANS_CLIENT_KEY"],
9638
+ merchantId: ["MIDTRANS_MERCHANT_ID"]
9639
+ },
9640
+ duitku: {
9641
+ apiKey: ["DUITKU_API_KEY"],
9642
+ merchantCode: ["DUITKU_MERCHANT_CODE"]
9643
+ },
9644
+ ipaymu: {
9645
+ apiKey: ["IPAYMU_API_KEY"],
9646
+ merchantCode: ["IPAYMU_VA", "IPAYMU_MERCHANT_CODE"]
9647
+ },
9648
+ xendit: {
9649
+ apiKey: ["XENDIT_SECRET_KEY", "XENDIT_API_KEY"]
9650
+ },
9651
+ doku: {
9652
+ apiKey: ["DOKU_SECRET_KEY", "DOKU_API_KEY"],
9653
+ clientKey: ["DOKU_CLIENT_ID"],
9654
+ merchantCode: ["DOKU_CLIENT_ID", "DOKU_MERCHANT_ID"],
9655
+ merchantId: ["DOKU_MERCHANT_ID"]
9656
+ },
9657
+ prismalink: {
9658
+ apiKey: ["PRISMALINK_SECRET_KEY", "PRISMALINK_API_KEY"],
9659
+ merchantCode: ["PRISMALINK_MERCHANT_ID"],
9660
+ merchantId: ["PRISMALINK_MERCHANT_ID"]
9661
+ },
9662
+ faspay: {
9663
+ apiKey: ["FASPAY_PASSWORD", "FASPAY_API_KEY"],
9664
+ clientKey: ["FASPAY_USER_ID"],
9665
+ merchantCode: ["FASPAY_MERCHANT_ID"],
9666
+ merchantId: ["FASPAY_MERCHANT_ID"]
9667
+ },
9668
+ finpay: {
9669
+ apiKey: ["FINPAY_MERCHANT_KEY", "FINPAY_SECRET_KEY", "FINPAY_API_KEY"],
9670
+ merchantCode: ["FINPAY_MERCHANT_ID"],
9671
+ merchantId: ["FINPAY_MERCHANT_ID"]
9672
+ },
9673
+ nicepay: {
9674
+ apiKey: ["NICEPAY_KEY", "NICEPAY_SECRET_KEY", "NICEPAY_API_KEY"],
9675
+ merchantCode: ["NICEPAY_IMID", "NICEPAY_MERCHANT_ID"],
9676
+ merchantId: ["NICEPAY_IMID"]
9677
+ },
9678
+ oy: {
9679
+ apiKey: ["OY_API_KEY"],
9680
+ clientKey: ["OY_USERNAME"],
9681
+ merchantCode: ["OY_USERNAME"]
9682
+ },
9683
+ stripe: {
9684
+ apiKey: ["STRIPE_SECRET_KEY", "STRIPE_KEY"],
9685
+ clientKey: ["STRIPE_PUBLIC_KEY", "STRIPE_PUBLISHABLE_KEY"]
9686
+ },
9687
+ paypal: {
9688
+ apiKey: ["PAYPAL_CLIENT_SECRET"],
9689
+ clientKey: ["PAYPAL_CLIENT_ID"],
9690
+ merchantCode: ["PAYPAL_CLIENT_ID"]
9691
+ },
9692
+ adyen: {
9693
+ apiKey: ["ADYEN_API_KEY"],
9694
+ clientKey: ["ADYEN_CLIENT_KEY"],
9695
+ merchantCode: ["ADYEN_MERCHANT_ACCOUNT"],
9696
+ merchantId: ["ADYEN_MERCHANT_ACCOUNT"]
9697
+ },
9698
+ checkoutcom: {
9699
+ apiKey: ["CHECKOUTCOM_SECRET_KEY"],
9700
+ clientKey: ["CHECKOUTCOM_PUBLIC_KEY"]
9701
+ },
9702
+ razorpay: {
9703
+ apiKey: ["RAZORPAY_KEY_SECRET"],
9704
+ clientKey: ["RAZORPAY_KEY_ID"],
9705
+ merchantCode: ["RAZORPAY_KEY_ID"]
9706
+ },
9707
+ square: {
9708
+ apiKey: ["SQUARE_ACCESS_TOKEN"],
9709
+ clientKey: ["SQUARE_APPLICATION_ID"],
9710
+ merchantCode: ["SQUARE_APPLICATION_ID"],
9711
+ projectId: ["SQUARE_LOCATION_ID"]
9712
+ },
9713
+ payu: {
9714
+ apiKey: ["PAYU_MD5_KEY"],
9715
+ clientKey: ["PAYU_POS_ID"],
9716
+ merchantCode: ["PAYU_POS_ID"],
9717
+ merchantId: ["PAYU_POS_ID"]
9718
+ },
9719
+ braintree: {
9720
+ apiKey: ["BRAINTREE_PRIVATE_KEY"],
9721
+ clientKey: ["BRAINTREE_PUBLIC_KEY"],
9722
+ merchantCode: ["BRAINTREE_MERCHANT_ID"],
9723
+ merchantId: ["BRAINTREE_MERCHANT_ID"]
9724
+ },
9725
+ twocheckout: {
9726
+ apiKey: ["TWOCHECKOUT_SECRET_KEY"],
9727
+ merchantCode: ["TWOCHECKOUT_MERCHANT_CODE"],
9728
+ merchantId: ["TWOCHECKOUT_MERCHANT_CODE"]
9729
+ }
9730
+ };
9731
+ function firstDefined(env, keys) {
9732
+ for (const k of keys) {
9733
+ const v = env[k];
9734
+ if (typeof v === "string" && v.trim().length > 0) return v.trim();
9735
+ }
9736
+ return void 0;
9737
+ }
9738
+ function resolveSandbox(env, provider) {
9739
+ const universal = firstDefined(env, ["BUAYAR_SANDBOX", "PG_SANDBOX", "PAYMENT_SANDBOX"]);
9740
+ if (universal !== void 0) return universal === "true" || universal === "1";
9741
+ const specificMap = {
9742
+ midtrans: ["MIDTRANS_IS_PRODUCTION"],
9743
+ duitku: ["DUITKU_SANDBOX"],
9744
+ ipaymu: ["IPAYMU_SANDBOX"],
9745
+ doku: ["DOKU_SANDBOX"],
9746
+ prismalink: ["PRISMALINK_SANDBOX"],
9747
+ faspay: ["FASPAY_SANDBOX"],
9748
+ finpay: ["FINPAY_SANDBOX"],
9749
+ nicepay: ["NICEPAY_SANDBOX"],
9750
+ oy: ["OY_SANDBOX"],
9751
+ stripe: ["STRIPE_SANDBOX"],
9752
+ paypal: ["PAYPAL_SANDBOX"],
9753
+ adyen: ["ADYEN_SANDBOX"],
9754
+ checkoutcom: ["CHECKOUTCOM_SANDBOX"],
9755
+ razorpay: ["RAZORPAY_SANDBOX"],
9756
+ square: ["SQUARE_SANDBOX"],
9757
+ payu: ["PAYU_SANDBOX"],
9758
+ braintree: ["BRAINTREE_SANDBOX"],
9759
+ twocheckout: ["TWOCHECKOUT_SANDBOX"],
9760
+ xendit: ["XENDIT_SANDBOX"]
9761
+ };
9762
+ const specific = firstDefined(env, specificMap[provider]);
9763
+ if (specific !== void 0) {
9764
+ if (provider === "midtrans") return specific !== "true" && specific !== "1";
9765
+ return specific === "true" || specific === "1";
9766
+ }
9767
+ return env.NODE_ENV !== "production";
9768
+ }
9420
9769
  function resolveConfigFromEnv(customConfig) {
9421
9770
  const env = typeof process !== "undefined" && process?.env ? process.env : {};
9422
- const provider = (customConfig?.provider || env.PROVIDER_PG || env.PG_PROVIDER || env.BUAYAR_PROVIDER || env.PAYMENT_PROVIDER || "midtrans").toLowerCase().trim();
9423
- let sandbox;
9424
- if (customConfig?.sandbox !== void 0) {
9425
- sandbox = customConfig.sandbox;
9426
- } else if (env.BUAYAR_SANDBOX !== void 0) {
9427
- sandbox = env.BUAYAR_SANDBOX === "true" || env.BUAYAR_SANDBOX === "1";
9428
- } else if (env.PG_SANDBOX !== void 0) {
9429
- sandbox = env.PG_SANDBOX === "true" || env.PG_SANDBOX === "1";
9430
- } else if (env.PAYMENT_SANDBOX !== void 0) {
9431
- sandbox = env.PAYMENT_SANDBOX === "true" || env.PAYMENT_SANDBOX === "1";
9432
- } else if (env.MIDTRANS_IS_PRODUCTION !== void 0) {
9433
- sandbox = env.MIDTRANS_IS_PRODUCTION !== "true" && env.MIDTRANS_IS_PRODUCTION !== "1";
9434
- } else if (env.DUITKU_SANDBOX !== void 0) {
9435
- sandbox = env.DUITKU_SANDBOX === "true" || env.DUITKU_SANDBOX === "1";
9436
- } else if (env.IPAYMU_SANDBOX !== void 0) {
9437
- sandbox = env.IPAYMU_SANDBOX === "true" || env.IPAYMU_SANDBOX === "1";
9438
- } else if (env.DOKU_SANDBOX !== void 0) {
9439
- sandbox = env.DOKU_SANDBOX === "true" || env.DOKU_SANDBOX === "1";
9440
- } else if (env.PRISMALINK_SANDBOX !== void 0) {
9441
- sandbox = env.PRISMALINK_SANDBOX === "true" || env.PRISMALINK_SANDBOX === "1";
9442
- } else if (env.FASPAY_SANDBOX !== void 0) {
9443
- sandbox = env.FASPAY_SANDBOX === "true" || env.FASPAY_SANDBOX === "1";
9444
- } else if (env.FINPAY_SANDBOX !== void 0) {
9445
- sandbox = env.FINPAY_SANDBOX === "true" || env.FINPAY_SANDBOX === "1";
9446
- } else if (env.NICEPAY_SANDBOX !== void 0) {
9447
- sandbox = env.NICEPAY_SANDBOX === "true" || env.NICEPAY_SANDBOX === "1";
9448
- } else if (env.OY_SANDBOX !== void 0) {
9449
- sandbox = env.OY_SANDBOX === "true" || env.OY_SANDBOX === "1";
9450
- } else if (env.STRIPE_SANDBOX !== void 0) {
9451
- sandbox = env.STRIPE_SANDBOX === "true" || env.STRIPE_SANDBOX === "1";
9452
- } else if (env.PAYPAL_SANDBOX !== void 0) {
9453
- sandbox = env.PAYPAL_SANDBOX === "true" || env.PAYPAL_SANDBOX === "1";
9454
- } else if (env.ADYEN_SANDBOX !== void 0) {
9455
- sandbox = env.ADYEN_SANDBOX === "true" || env.ADYEN_SANDBOX === "1";
9456
- } else if (env.CHECKOUTCOM_SANDBOX !== void 0) {
9457
- sandbox = env.CHECKOUTCOM_SANDBOX === "true" || env.CHECKOUTCOM_SANDBOX === "1";
9458
- } else if (env.RAZORPAY_SANDBOX !== void 0) {
9459
- sandbox = env.RAZORPAY_SANDBOX === "true" || env.RAZORPAY_SANDBOX === "1";
9460
- } else if (env.SQUARE_SANDBOX !== void 0) {
9461
- sandbox = env.SQUARE_SANDBOX === "true" || env.SQUARE_SANDBOX === "1";
9462
- } else if (env.PAYU_SANDBOX !== void 0) {
9463
- sandbox = env.PAYU_SANDBOX === "true" || env.PAYU_SANDBOX === "1";
9464
- } else if (env.BRAINTREE_SANDBOX !== void 0) {
9465
- sandbox = env.BRAINTREE_SANDBOX === "true" || env.BRAINTREE_SANDBOX === "1";
9466
- } else if (env.TWOCHECKOUT_SANDBOX !== void 0) {
9467
- sandbox = env.TWOCHECKOUT_SANDBOX === "true" || env.TWOCHECKOUT_SANDBOX === "1";
9468
- } else {
9469
- sandbox = env.NODE_ENV !== "production";
9470
- }
9471
- let apiKey = customConfig?.apiKey || customConfig?.serverKey || customConfig?.secretKey;
9472
- if (!apiKey) {
9473
- if (provider === "midtrans") {
9474
- apiKey = env.MIDTRANS_SERVER_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY || env.BUAYAR_SERVER_KEY;
9475
- } else if (provider === "duitku") {
9476
- apiKey = env.DUITKU_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9477
- } else if (provider === "ipaymu") {
9478
- apiKey = env.IPAYMU_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9479
- } else if (provider === "xendit") {
9480
- apiKey = env.XENDIT_SECRET_KEY || env.XENDIT_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9481
- } else if (provider === "doku") {
9482
- apiKey = env.DOKU_SECRET_KEY || env.DOKU_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9483
- } else if (provider === "prismalink") {
9484
- apiKey = env.PRISMALINK_SECRET_KEY || env.PRISMALINK_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9485
- } else if (provider === "faspay") {
9486
- apiKey = env.FASPAY_PASSWORD || env.FASPAY_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9487
- } else if (provider === "finpay") {
9488
- apiKey = env.FINPAY_MERCHANT_KEY || env.FINPAY_SECRET_KEY || env.FINPAY_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9489
- } else if (provider === "nicepay") {
9490
- apiKey = env.NICEPAY_KEY || env.NICEPAY_MERCHANT_KEY || env.NICEPAY_SECRET_KEY || env.NICEPAY_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9491
- } else if (provider === "oy" || provider === "oyindonesia") {
9492
- apiKey = env.OY_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9493
- } else if (provider === "stripe") {
9494
- apiKey = env.STRIPE_SECRET_KEY || env.STRIPE_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9495
- } else if (provider === "paypal") {
9496
- apiKey = env.PAYPAL_CLIENT_SECRET || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9497
- } else if (provider === "adyen") {
9498
- apiKey = env.ADYEN_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9499
- } else if (provider === "checkoutcom") {
9500
- apiKey = env.CHECKOUTCOM_SECRET_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9501
- } else if (provider === "razorpay") {
9502
- apiKey = env.RAZORPAY_KEY_SECRET || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9503
- } else if (provider === "square") {
9504
- apiKey = env.SQUARE_ACCESS_TOKEN || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9505
- } else if (provider === "payu") {
9506
- apiKey = env.PAYU_MD5_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9507
- } else if (provider === "braintree") {
9508
- apiKey = env.BRAINTREE_PRIVATE_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9509
- } else if (provider === "twocheckout" || provider === "2checkout") {
9510
- apiKey = env.TWOCHECKOUT_SECRET_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9511
- } else {
9512
- apiKey = env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY || env.PG_SECRET_KEY || env.BUAYAR_SECRET_KEY;
9513
- }
9514
- }
9515
- let merchantCode = customConfig?.merchantCode;
9516
- let clientKey = customConfig?.clientKey;
9517
- let merchantId = customConfig?.merchantId;
9518
- if (provider === "midtrans") {
9519
- clientKey = clientKey || env.MIDTRANS_CLIENT_KEY || env.BUAYAR_CLIENT_KEY || env.PG_CLIENT_KEY;
9520
- merchantId = merchantId || env.MIDTRANS_MERCHANT_ID || env.BUAYAR_MERCHANT_ID || env.PG_MERCHANT_ID;
9521
- merchantCode = merchantCode || clientKey || merchantId || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE;
9522
- } else if (provider === "duitku") {
9523
- merchantCode = merchantCode || env.DUITKU_MERCHANT_CODE || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9524
- } else if (provider === "ipaymu") {
9525
- merchantCode = merchantCode || env.IPAYMU_VA || env.IPAYMU_MERCHANT_CODE || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9526
- } else if (provider === "doku") {
9527
- merchantCode = merchantCode || env.DOKU_CLIENT_ID || env.DOKU_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9528
- clientKey = clientKey || customConfig?.merchantCode || env.DOKU_CLIENT_ID || env.BUAYAR_CLIENT_KEY;
9529
- } else if (provider === "prismalink") {
9530
- merchantCode = merchantCode || env.PRISMALINK_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9531
- merchantId = merchantId || env.PRISMALINK_MERCHANT_ID || env.BUAYAR_MERCHANT_ID;
9532
- } else if (provider === "faspay") {
9533
- merchantCode = merchantCode || env.FASPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9534
- merchantId = merchantId || env.FASPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_ID;
9535
- clientKey = clientKey || env.FASPAY_USER_ID || env.BUAYAR_CLIENT_KEY;
9536
- } else if (provider === "finpay") {
9537
- merchantCode = merchantCode || env.FINPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9538
- merchantId = merchantId || env.FINPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_ID;
9539
- } else if (provider === "nicepay") {
9540
- merchantCode = merchantCode || env.NICEPAY_IMID || env.NICEPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9541
- merchantId = merchantId || env.NICEPAY_IMID || env.BUAYAR_MERCHANT_ID;
9542
- } else if (provider === "oy" || provider === "oyindonesia") {
9543
- merchantCode = merchantCode || env.OY_USERNAME || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9544
- clientKey = clientKey || customConfig?.merchantCode || env.OY_USERNAME || env.BUAYAR_CLIENT_KEY;
9545
- } else if (provider === "stripe") {
9546
- clientKey = clientKey || env.STRIPE_PUBLIC_KEY || env.STRIPE_PUBLISHABLE_KEY || env.BUAYAR_CLIENT_KEY || env.BUAYAR_PUBLIC_KEY;
9547
- merchantCode = merchantCode || clientKey || "stripe";
9548
- } else if (provider === "paypal") {
9549
- clientKey = clientKey || env.PAYPAL_CLIENT_ID || env.BUAYAR_CLIENT_KEY;
9550
- merchantCode = merchantCode || env.PAYPAL_CLIENT_ID || env.BUAYAR_MERCHANT_CODE;
9551
- } else if (provider === "adyen") {
9552
- clientKey = clientKey || env.ADYEN_CLIENT_KEY || env.BUAYAR_CLIENT_KEY;
9553
- merchantCode = merchantCode || env.ADYEN_MERCHANT_ACCOUNT || env.BUAYAR_MERCHANT_CODE;
9554
- merchantId = merchantId || env.ADYEN_MERCHANT_ACCOUNT || env.BUAYAR_MERCHANT_ID;
9555
- } else if (provider === "checkoutcom") {
9556
- clientKey = clientKey || env.CHECKOUTCOM_PUBLIC_KEY || env.BUAYAR_CLIENT_KEY;
9557
- merchantCode = merchantCode || env.BUAYAR_MERCHANT_CODE;
9558
- } else if (provider === "razorpay") {
9559
- clientKey = clientKey || env.RAZORPAY_KEY_ID || env.BUAYAR_CLIENT_KEY;
9560
- merchantCode = merchantCode || env.RAZORPAY_KEY_ID || env.BUAYAR_MERCHANT_CODE;
9561
- } else if (provider === "square") {
9562
- clientKey = clientKey || env.SQUARE_APPLICATION_ID || env.BUAYAR_CLIENT_KEY;
9563
- merchantCode = merchantCode || env.SQUARE_APPLICATION_ID || env.BUAYAR_MERCHANT_CODE;
9564
- } else if (provider === "payu") {
9565
- merchantCode = merchantCode || env.PAYU_POS_ID || env.BUAYAR_MERCHANT_CODE;
9566
- merchantId = merchantId || env.PAYU_POS_ID;
9567
- } else if (provider === "braintree") {
9568
- clientKey = clientKey || env.BRAINTREE_PUBLIC_KEY || env.BUAYAR_CLIENT_KEY;
9569
- merchantCode = merchantCode || env.BRAINTREE_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE;
9570
- merchantId = merchantId || env.BRAINTREE_MERCHANT_ID;
9571
- } else if (provider === "twocheckout" || provider === "2checkout") {
9572
- merchantCode = merchantCode || env.TWOCHECKOUT_MERCHANT_CODE || env.BUAYAR_MERCHANT_CODE;
9573
- merchantId = merchantId || env.TWOCHECKOUT_MERCHANT_CODE;
9574
- } else {
9575
- merchantCode = merchantCode || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9576
- }
9577
- const projectId = customConfig?.projectId || env.BUAYAR_PROJECT_ID || env.PG_PROJECT_ID || env.PROJECT_ID || env.SQUARE_LOCATION_ID;
9578
- const publicKey = customConfig?.publicKey || env.BUAYAR_PUBLIC_KEY || env.PG_PUBLIC_KEY || env.PUBLIC_KEY || env.STRIPE_PUBLIC_KEY || env.STRIPE_PUBLISHABLE_KEY || env.CHECKOUTCOM_PUBLIC_KEY;
9579
- const privateKey = customConfig?.privateKey || env.BUAYAR_PRIVATE_KEY || env.PG_PRIVATE_KEY || env.PRIVATE_KEY || env.BRAINTREE_PRIVATE_KEY;
9580
- const secretKey = customConfig?.secretKey || customConfig?.apiKey || customConfig?.serverKey || env.BUAYAR_SECRET_KEY || env.PG_SECRET_KEY || env.SECRET_KEY || env.XENDIT_SECRET_KEY || env.DOKU_SECRET_KEY || env.PRISMALINK_SECRET_KEY || env.FASPAY_PASSWORD || env.FINPAY_MERCHANT_KEY || env.NICEPAY_KEY || env.OY_API_KEY || env.STRIPE_SECRET_KEY || env.PAYPAL_CLIENT_SECRET || env.CHECKOUTCOM_SECRET_KEY || env.RAZORPAY_KEY_SECRET || env.SQUARE_ACCESS_TOKEN || env.BRAINTREE_PRIVATE_KEY || env.TWOCHECKOUT_SECRET_KEY;
9771
+ const explicit = (customConfig?.provider || env.PROVIDER_PG || env.PG_PROVIDER || env.BUAYAR_PROVIDER || env.PAYMENT_PROVIDER || "").toLowerCase().trim();
9772
+ let provider = explicit || providerRegistry.detectFromEnv(env) || "midtrans";
9773
+ provider = provider.replace("oyindonesia", "oy").replace("2checkout", "twocheckout");
9774
+ const sandbox = customConfig?.sandbox ?? resolveSandbox(env, provider);
9775
+ const spec = SPECIFIC[provider] || {};
9776
+ const cfg = {};
9777
+ const fields = ["apiKey", "clientKey", "merchantCode", "merchantId", "secretKey", "serverKey", "projectId"];
9778
+ for (const f of fields) {
9779
+ const universalKeys = UNIVERSAL[f] || [];
9780
+ const specificKeys = spec[f] || [];
9781
+ const universal = firstDefined(env, universalKeys);
9782
+ const specific = firstDefined(env, specificKeys);
9783
+ const value = universal || specific;
9784
+ const explicitValue = customConfig?.[f] || customConfig && (f === "apiKey" ? customConfig.secretKey || customConfig.serverKey : void 0);
9785
+ cfg[f] = explicitValue || value || "";
9786
+ }
9581
9787
  const callbackUrl = customConfig?.callbackUrl || env.BUAYAR_CALLBACK_URL || env.PG_CALLBACK_URL || env.PAYMENT_CALLBACK_URL;
9582
9788
  const returnUrl = customConfig?.returnUrl || env.BUAYAR_RETURN_URL || env.PG_RETURN_URL || env.PAYMENT_RETURN_URL;
9789
+ const publicKey = customConfig?.publicKey || firstDefined(env, ["BUAYAR_PUBLIC_KEY", "PG_PUBLIC_KEY", "PUBLIC_KEY"]) || cfg.clientKey;
9790
+ const privateKey = customConfig?.privateKey || firstDefined(env, ["BUAYAR_PRIVATE_KEY", "PG_PRIVATE_KEY", "PRIVATE_KEY"]) || (provider === "braintree" ? cfg.apiKey : void 0);
9583
9791
  const extra = {
9584
9792
  webhookToken: env.XENDIT_WEBHOOK_TOKEN || env.BUAYAR_WEBHOOK_TOKEN,
9585
9793
  webhookSecret: env.STRIPE_WEBHOOK_SECRET || env.CHECKOUTCOM_WEBHOOK_SECRET || env.RAZORPAY_WEBHOOK_SECRET || env.BUAYAR_WEBHOOK_SECRET,
@@ -9600,15 +9808,16 @@ function resolveConfigFromEnv(customConfig) {
9600
9808
  secretWord: env.TWOCHECKOUT_SECRET_WORD,
9601
9809
  ...customConfig?.extra
9602
9810
  };
9811
+ const apiKey = cfg.apiKey || cfg.secretKey || cfg.serverKey;
9603
9812
  return {
9604
- provider: provider === "oyindonesia" ? "oy" : provider === "2checkout" ? "twocheckout" : provider,
9605
- apiKey: apiKey || "",
9813
+ provider,
9814
+ apiKey,
9606
9815
  serverKey: apiKey || "",
9607
- secretKey: secretKey || apiKey || "",
9608
- merchantCode: merchantCode || "",
9609
- clientKey: clientKey || "",
9610
- merchantId: merchantId || "",
9611
- projectId,
9816
+ secretKey: apiKey || "",
9817
+ merchantCode: cfg.merchantCode || "",
9818
+ clientKey: cfg.clientKey || "",
9819
+ merchantId: cfg.merchantId || "",
9820
+ projectId: cfg.projectId || "",
9612
9821
  publicKey,
9613
9822
  privateKey,
9614
9823
  sandbox,
@@ -9622,8 +9831,10 @@ function resolveConfigFromEnv(customConfig) {
9622
9831
  var Buayar = class {
9623
9832
  manager;
9624
9833
  config;
9625
- constructor(config, manager) {
9834
+ registry;
9835
+ constructor(config, manager, registry) {
9626
9836
  this.manager = manager || paymentManager;
9837
+ this.registry = registry || providerRegistry;
9627
9838
  this.config = resolveConfigFromEnv(config);
9628
9839
  }
9629
9840
  /**
@@ -9656,6 +9867,62 @@ var Buayar = class {
9656
9867
  getProvider(name) {
9657
9868
  return this.manager.getProvider(name || this.provider);
9658
9869
  }
9870
+ /**
9871
+ * Daftar nama provider yang terdaftar (bawaan + kustom).
9872
+ */
9873
+ listProviders() {
9874
+ return this.registry.names();
9875
+ }
9876
+ /**
9877
+ * Registrasi metadata provider kustom untuk deteksi & capability.
9878
+ * Contoh: buayar.registerProviderDescriptor({ name, envKeys, methods, operations })
9879
+ */
9880
+ registerProviderDescriptor(desc) {
9881
+ this.registry.register(desc);
9882
+ }
9883
+ /**
9884
+ * Cek capability (metode + operasi) provider tertentu — atau provider aktif bila kosong.
9885
+ * Jawab pertanyaan "provider ini dukung apa?" secara runtime, tanpa bongkar dokumen.
9886
+ */
9887
+ getCapabilities(name) {
9888
+ const n = name || this.provider;
9889
+ const desc = this.registry.get(n);
9890
+ if (!desc) return void 0;
9891
+ return { methods: desc.methods, operations: desc.operations };
9892
+ }
9893
+ /**
9894
+ * Deteksi nama provider dari struktur payload webhook.
9895
+ */
9896
+ detectProviderFromPayload(payload) {
9897
+ return this.registry.detectFromWebhook(payload);
9898
+ }
9899
+ /**
9900
+ * Deteksi nama provider aktif dari variabel lingkungan (kredensial yang terisi).
9901
+ */
9902
+ detectProviderFromEnv(env) {
9903
+ return this.registry.detectFromEnv(env || process.env);
9904
+ }
9905
+ /**
9906
+ * Logika "bisa pakai X dengan provider Y?" — helper untuk portabilitas.
9907
+ */
9908
+ supports(name, operation) {
9909
+ const desc = this.registry.get(name);
9910
+ return desc ? desc.operations[operation] : false;
9911
+ }
9912
+ /**
9913
+ * Daftar metode pembayaran yang benar2 tersedia untuk provider aktif.
9914
+ */
9915
+ getSupportedMethods(name) {
9916
+ const n = name || this.provider;
9917
+ return this.registry.get(n)?.methods || [];
9918
+ }
9919
+ /**
9920
+ * Iterasi CEPAT: apakah provider aktif mendukung method kanonik tertentu?
9921
+ */
9922
+ supportsMethod(method, name) {
9923
+ const n = name || this.provider;
9924
+ return this.registry.get(n)?.methods.includes(method) ?? false;
9925
+ }
9659
9926
  /**
9660
9927
  * Buat transaksi pembayaran baru (Mendukung Semi dan Full Integrasi)
9661
9928
  */
@@ -9730,47 +9997,8 @@ var Buayar = class {
9730
9997
  }
9731
9998
  }
9732
9999
  let providerName = configOverride?.provider || this.provider;
9733
- if (payload) {
9734
- if (payload.signature_key && payload.transaction_status) {
9735
- providerName = "midtrans";
9736
- } else if (payload.merchantCode && payload.merchantOrderId && payload.resultCode) {
9737
- providerName = "duitku";
9738
- } else if (payload.trx_id && (payload.sid || payload.reference_id || payload.via)) {
9739
- providerName = "ipaymu";
9740
- } else if (payload.service?.id || payload.order?.invoice_number && payload.transaction?.status) {
9741
- providerName = "doku";
9742
- } else if (payload.bill_no && (payload.payment_status_code !== void 0 || payload.payment_status_desc)) {
9743
- providerName = "faspay";
9744
- } else if (payload.merchant_id && payload.order_id && payload.payment_status) {
9745
- providerName = "finpay";
9746
- } else if (payload.tXid && payload.merchantToken && (payload.referenceNo || payload.amt)) {
9747
- providerName = "nicepay";
9748
- } else if (payload.partner_tx_id || payload.partner_trx_id) {
9749
- providerName = "oy";
9750
- } else if (payload.merchant_id && payload.order_id && payload.signature) {
9751
- providerName = "prismalink";
9752
- } else if (payload.object === "event" || payload.type && payload.data?.object && payload.api_version) {
9753
- providerName = "stripe";
9754
- } else if (payload.event && payload.payload?.payment?.entity) {
9755
- providerName = "razorpay";
9756
- } else if (payload.external_id || payload.event?.startsWith("payment.") || payload.event?.startsWith("qr.") || payload.data?.reference_id) {
9757
- providerName = "xendit";
9758
- } else if (payload.event_type && payload.resource && (payload.event_type.startsWith("PAYMENT.") || payload.event_type.startsWith("CHECKOUT.ORDER."))) {
9759
- providerName = "paypal";
9760
- } else if (payload.notificationItems || payload.merchantAccountCode && payload.pspReference && payload.eventCode) {
9761
- providerName = "adyen";
9762
- } else if (payload.type && payload.data?._links && (payload.type.startsWith("payment_") || payload.type.startsWith("refund_"))) {
9763
- providerName = "checkoutcom";
9764
- } else if (payload.type && payload.data?.object?.status && payload.merchant_id) {
9765
- providerName = "square";
9766
- } else if (payload.order && payload.order?.status && payload.order?.extOrderId) {
9767
- providerName = "payu";
9768
- } else if (payload.kind && payload.subject?.transaction) {
9769
- providerName = "braintree";
9770
- } else if (payload.HASH && payload.REFNOEXT && payload.IPN_PID) {
9771
- providerName = "twocheckout";
9772
- }
9773
- }
10000
+ const detected = this.registry.detectFromWebhook(payload);
10001
+ if (detected) providerName = detected;
9774
10002
  return this.manager.verifyCallback(providerName, payload, mergedConfig);
9775
10003
  }
9776
10004
  async handleWebhook(payload, headers, configOverride) {
@@ -9911,8 +10139,10 @@ export {
9911
10139
  PayuProvider,
9912
10140
  PrismalinkClient,
9913
10141
  PrismalinkProvider,
10142
+ ProviderRegistry,
9914
10143
  RazorpayClient,
9915
10144
  RazorpayProvider,
10145
+ SnapApiError,
9916
10146
  SnapClient,
9917
10147
  SquareClient,
9918
10148
  SquareProvider,
@@ -9925,6 +10155,7 @@ export {
9925
10155
  buayar,
9926
10156
  buildBraintreeBasicAuth,
9927
10157
  buildCoreChargePayload,
10158
+ buildDefaultDescriptors,
9928
10159
  buildPaypalBasicAuth,
9929
10160
  buildPayuBasicAuth,
9930
10161
  buildRazorpayBasicAuth,
@@ -9949,6 +10180,7 @@ export {
9949
10180
  minifyJson,
9950
10181
  parseCoreChargeResponse,
9951
10182
  paymentManager,
10183
+ providerRegistry,
9952
10184
  resolveConfigFromEnv,
9953
10185
  safeCompare,
9954
10186
  serializePaypalParams,
@@ -9956,6 +10188,7 @@ export {
9956
10188
  sha256,
9957
10189
  sha256Hex,
9958
10190
  sha512,
10191
+ snapErrorHint,
9959
10192
  snapExternalId,
9960
10193
  snapTimestamp,
9961
10194
  snapUtcTimestamp,