@crediblemark/buayar 0.6.2 → 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
  }
@@ -2909,6 +2966,7 @@ var DokuProvider = class extends BasePaymentProvider {
2909
2966
  return {
2910
2967
  success: true,
2911
2968
  provider: "doku",
2969
+ mode: "va",
2912
2970
  orderId: vaData.trxId || orderId,
2913
2971
  amount: Number(vaData.totalAmount?.value || amount) || Math.round(amount),
2914
2972
  reference: vaData.virtualAccountNo || orderId,
@@ -2944,6 +3002,7 @@ var DokuProvider = class extends BasePaymentProvider {
2944
3002
  return {
2945
3003
  success: true,
2946
3004
  provider: "doku",
3005
+ mode: "qris",
2947
3006
  orderId: data.partnerReferenceNo || orderId,
2948
3007
  amount: Number(data.amount?.value || amount) || Math.round(amount),
2949
3008
  reference: data.referenceNo || orderId,
@@ -2989,10 +3048,12 @@ var DokuProvider = class extends BasePaymentProvider {
2989
3048
  return {
2990
3049
  success: true,
2991
3050
  provider: "doku",
3051
+ mode: "ewallet",
2992
3052
  orderId: data.partnerReferenceNo || orderId,
2993
3053
  amount: Number(data.amount?.value || amount) || Math.round(amount),
2994
3054
  reference: data.partnerReferenceNo || orderId,
2995
3055
  paymentUrl: data.webRedirectUrl || data.paymentUrl,
3056
+ checkoutUrl: data.webRedirectUrl || data.paymentUrl,
2996
3057
  rawResponse: data
2997
3058
  };
2998
3059
  }
@@ -9417,170 +9478,316 @@ var PaymentManager = class {
9417
9478
  };
9418
9479
  var paymentManager = new PaymentManager();
9419
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
+
9420
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
+ }
9421
9769
  function resolveConfigFromEnv(customConfig) {
9422
9770
  const env = typeof process !== "undefined" && process?.env ? process.env : {};
9423
- const provider = (customConfig?.provider || env.PROVIDER_PG || env.PG_PROVIDER || env.BUAYAR_PROVIDER || env.PAYMENT_PROVIDER || "midtrans").toLowerCase().trim();
9424
- let sandbox;
9425
- if (customConfig?.sandbox !== void 0) {
9426
- sandbox = customConfig.sandbox;
9427
- } else if (env.BUAYAR_SANDBOX !== void 0) {
9428
- sandbox = env.BUAYAR_SANDBOX === "true" || env.BUAYAR_SANDBOX === "1";
9429
- } else if (env.PG_SANDBOX !== void 0) {
9430
- sandbox = env.PG_SANDBOX === "true" || env.PG_SANDBOX === "1";
9431
- } else if (env.PAYMENT_SANDBOX !== void 0) {
9432
- sandbox = env.PAYMENT_SANDBOX === "true" || env.PAYMENT_SANDBOX === "1";
9433
- } else if (env.MIDTRANS_IS_PRODUCTION !== void 0) {
9434
- sandbox = env.MIDTRANS_IS_PRODUCTION !== "true" && env.MIDTRANS_IS_PRODUCTION !== "1";
9435
- } else if (env.DUITKU_SANDBOX !== void 0) {
9436
- sandbox = env.DUITKU_SANDBOX === "true" || env.DUITKU_SANDBOX === "1";
9437
- } else if (env.IPAYMU_SANDBOX !== void 0) {
9438
- sandbox = env.IPAYMU_SANDBOX === "true" || env.IPAYMU_SANDBOX === "1";
9439
- } else if (env.DOKU_SANDBOX !== void 0) {
9440
- sandbox = env.DOKU_SANDBOX === "true" || env.DOKU_SANDBOX === "1";
9441
- } else if (env.PRISMALINK_SANDBOX !== void 0) {
9442
- sandbox = env.PRISMALINK_SANDBOX === "true" || env.PRISMALINK_SANDBOX === "1";
9443
- } else if (env.FASPAY_SANDBOX !== void 0) {
9444
- sandbox = env.FASPAY_SANDBOX === "true" || env.FASPAY_SANDBOX === "1";
9445
- } else if (env.FINPAY_SANDBOX !== void 0) {
9446
- sandbox = env.FINPAY_SANDBOX === "true" || env.FINPAY_SANDBOX === "1";
9447
- } else if (env.NICEPAY_SANDBOX !== void 0) {
9448
- sandbox = env.NICEPAY_SANDBOX === "true" || env.NICEPAY_SANDBOX === "1";
9449
- } else if (env.OY_SANDBOX !== void 0) {
9450
- sandbox = env.OY_SANDBOX === "true" || env.OY_SANDBOX === "1";
9451
- } else if (env.STRIPE_SANDBOX !== void 0) {
9452
- sandbox = env.STRIPE_SANDBOX === "true" || env.STRIPE_SANDBOX === "1";
9453
- } else if (env.PAYPAL_SANDBOX !== void 0) {
9454
- sandbox = env.PAYPAL_SANDBOX === "true" || env.PAYPAL_SANDBOX === "1";
9455
- } else if (env.ADYEN_SANDBOX !== void 0) {
9456
- sandbox = env.ADYEN_SANDBOX === "true" || env.ADYEN_SANDBOX === "1";
9457
- } else if (env.CHECKOUTCOM_SANDBOX !== void 0) {
9458
- sandbox = env.CHECKOUTCOM_SANDBOX === "true" || env.CHECKOUTCOM_SANDBOX === "1";
9459
- } else if (env.RAZORPAY_SANDBOX !== void 0) {
9460
- sandbox = env.RAZORPAY_SANDBOX === "true" || env.RAZORPAY_SANDBOX === "1";
9461
- } else if (env.SQUARE_SANDBOX !== void 0) {
9462
- sandbox = env.SQUARE_SANDBOX === "true" || env.SQUARE_SANDBOX === "1";
9463
- } else if (env.PAYU_SANDBOX !== void 0) {
9464
- sandbox = env.PAYU_SANDBOX === "true" || env.PAYU_SANDBOX === "1";
9465
- } else if (env.BRAINTREE_SANDBOX !== void 0) {
9466
- sandbox = env.BRAINTREE_SANDBOX === "true" || env.BRAINTREE_SANDBOX === "1";
9467
- } else if (env.TWOCHECKOUT_SANDBOX !== void 0) {
9468
- sandbox = env.TWOCHECKOUT_SANDBOX === "true" || env.TWOCHECKOUT_SANDBOX === "1";
9469
- } else {
9470
- sandbox = env.NODE_ENV !== "production";
9471
- }
9472
- let apiKey = customConfig?.apiKey || customConfig?.serverKey || customConfig?.secretKey;
9473
- if (!apiKey) {
9474
- if (provider === "midtrans") {
9475
- apiKey = env.MIDTRANS_SERVER_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY || env.BUAYAR_SERVER_KEY;
9476
- } else if (provider === "duitku") {
9477
- apiKey = env.DUITKU_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9478
- } else if (provider === "ipaymu") {
9479
- apiKey = env.IPAYMU_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9480
- } else if (provider === "xendit") {
9481
- apiKey = env.XENDIT_SECRET_KEY || env.XENDIT_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9482
- } else if (provider === "doku") {
9483
- apiKey = env.DOKU_SECRET_KEY || env.DOKU_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9484
- } else if (provider === "prismalink") {
9485
- apiKey = env.PRISMALINK_SECRET_KEY || env.PRISMALINK_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9486
- } else if (provider === "faspay") {
9487
- apiKey = env.FASPAY_PASSWORD || env.FASPAY_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9488
- } else if (provider === "finpay") {
9489
- 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;
9490
- } else if (provider === "nicepay") {
9491
- 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;
9492
- } else if (provider === "oy" || provider === "oyindonesia") {
9493
- apiKey = env.OY_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9494
- } else if (provider === "stripe") {
9495
- apiKey = env.STRIPE_SECRET_KEY || env.STRIPE_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9496
- } else if (provider === "paypal") {
9497
- apiKey = env.PAYPAL_CLIENT_SECRET || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9498
- } else if (provider === "adyen") {
9499
- apiKey = env.ADYEN_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9500
- } else if (provider === "checkoutcom") {
9501
- apiKey = env.CHECKOUTCOM_SECRET_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9502
- } else if (provider === "razorpay") {
9503
- apiKey = env.RAZORPAY_KEY_SECRET || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9504
- } else if (provider === "square") {
9505
- apiKey = env.SQUARE_ACCESS_TOKEN || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9506
- } else if (provider === "payu") {
9507
- apiKey = env.PAYU_MD5_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9508
- } else if (provider === "braintree") {
9509
- apiKey = env.BRAINTREE_PRIVATE_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9510
- } else if (provider === "twocheckout" || provider === "2checkout") {
9511
- apiKey = env.TWOCHECKOUT_SECRET_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9512
- } else {
9513
- apiKey = env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY || env.PG_SECRET_KEY || env.BUAYAR_SECRET_KEY;
9514
- }
9515
- }
9516
- let merchantCode = customConfig?.merchantCode;
9517
- let clientKey = customConfig?.clientKey;
9518
- let merchantId = customConfig?.merchantId;
9519
- if (provider === "midtrans") {
9520
- clientKey = clientKey || env.MIDTRANS_CLIENT_KEY || env.BUAYAR_CLIENT_KEY || env.PG_CLIENT_KEY;
9521
- merchantId = merchantId || env.MIDTRANS_MERCHANT_ID || env.BUAYAR_MERCHANT_ID || env.PG_MERCHANT_ID;
9522
- merchantCode = merchantCode || clientKey || merchantId || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE;
9523
- } else if (provider === "duitku") {
9524
- merchantCode = merchantCode || env.DUITKU_MERCHANT_CODE || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9525
- } else if (provider === "ipaymu") {
9526
- merchantCode = merchantCode || env.IPAYMU_VA || env.IPAYMU_MERCHANT_CODE || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9527
- } else if (provider === "doku") {
9528
- merchantCode = merchantCode || env.DOKU_CLIENT_ID || env.DOKU_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9529
- clientKey = clientKey || customConfig?.merchantCode || env.DOKU_CLIENT_ID || env.BUAYAR_CLIENT_KEY;
9530
- } else if (provider === "prismalink") {
9531
- merchantCode = merchantCode || env.PRISMALINK_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9532
- merchantId = merchantId || env.PRISMALINK_MERCHANT_ID || env.BUAYAR_MERCHANT_ID;
9533
- } else if (provider === "faspay") {
9534
- merchantCode = merchantCode || env.FASPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9535
- merchantId = merchantId || env.FASPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_ID;
9536
- clientKey = clientKey || env.FASPAY_USER_ID || env.BUAYAR_CLIENT_KEY;
9537
- } else if (provider === "finpay") {
9538
- merchantCode = merchantCode || env.FINPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9539
- merchantId = merchantId || env.FINPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_ID;
9540
- } else if (provider === "nicepay") {
9541
- merchantCode = merchantCode || env.NICEPAY_IMID || env.NICEPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9542
- merchantId = merchantId || env.NICEPAY_IMID || env.BUAYAR_MERCHANT_ID;
9543
- } else if (provider === "oy" || provider === "oyindonesia") {
9544
- merchantCode = merchantCode || env.OY_USERNAME || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9545
- clientKey = clientKey || customConfig?.merchantCode || env.OY_USERNAME || env.BUAYAR_CLIENT_KEY;
9546
- } else if (provider === "stripe") {
9547
- clientKey = clientKey || env.STRIPE_PUBLIC_KEY || env.STRIPE_PUBLISHABLE_KEY || env.BUAYAR_CLIENT_KEY || env.BUAYAR_PUBLIC_KEY;
9548
- merchantCode = merchantCode || clientKey || "stripe";
9549
- } else if (provider === "paypal") {
9550
- clientKey = clientKey || env.PAYPAL_CLIENT_ID || env.BUAYAR_CLIENT_KEY;
9551
- merchantCode = merchantCode || env.PAYPAL_CLIENT_ID || env.BUAYAR_MERCHANT_CODE;
9552
- } else if (provider === "adyen") {
9553
- clientKey = clientKey || env.ADYEN_CLIENT_KEY || env.BUAYAR_CLIENT_KEY;
9554
- merchantCode = merchantCode || env.ADYEN_MERCHANT_ACCOUNT || env.BUAYAR_MERCHANT_CODE;
9555
- merchantId = merchantId || env.ADYEN_MERCHANT_ACCOUNT || env.BUAYAR_MERCHANT_ID;
9556
- } else if (provider === "checkoutcom") {
9557
- clientKey = clientKey || env.CHECKOUTCOM_PUBLIC_KEY || env.BUAYAR_CLIENT_KEY;
9558
- merchantCode = merchantCode || env.BUAYAR_MERCHANT_CODE;
9559
- } else if (provider === "razorpay") {
9560
- clientKey = clientKey || env.RAZORPAY_KEY_ID || env.BUAYAR_CLIENT_KEY;
9561
- merchantCode = merchantCode || env.RAZORPAY_KEY_ID || env.BUAYAR_MERCHANT_CODE;
9562
- } else if (provider === "square") {
9563
- clientKey = clientKey || env.SQUARE_APPLICATION_ID || env.BUAYAR_CLIENT_KEY;
9564
- merchantCode = merchantCode || env.SQUARE_APPLICATION_ID || env.BUAYAR_MERCHANT_CODE;
9565
- } else if (provider === "payu") {
9566
- merchantCode = merchantCode || env.PAYU_POS_ID || env.BUAYAR_MERCHANT_CODE;
9567
- merchantId = merchantId || env.PAYU_POS_ID;
9568
- } else if (provider === "braintree") {
9569
- clientKey = clientKey || env.BRAINTREE_PUBLIC_KEY || env.BUAYAR_CLIENT_KEY;
9570
- merchantCode = merchantCode || env.BRAINTREE_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE;
9571
- merchantId = merchantId || env.BRAINTREE_MERCHANT_ID;
9572
- } else if (provider === "twocheckout" || provider === "2checkout") {
9573
- merchantCode = merchantCode || env.TWOCHECKOUT_MERCHANT_CODE || env.BUAYAR_MERCHANT_CODE;
9574
- merchantId = merchantId || env.TWOCHECKOUT_MERCHANT_CODE;
9575
- } else {
9576
- merchantCode = merchantCode || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9577
- }
9578
- const projectId = customConfig?.projectId || env.BUAYAR_PROJECT_ID || env.PG_PROJECT_ID || env.PROJECT_ID || env.SQUARE_LOCATION_ID;
9579
- 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;
9580
- const privateKey = customConfig?.privateKey || env.BUAYAR_PRIVATE_KEY || env.PG_PRIVATE_KEY || env.PRIVATE_KEY || env.BRAINTREE_PRIVATE_KEY;
9581
- 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
+ }
9582
9787
  const callbackUrl = customConfig?.callbackUrl || env.BUAYAR_CALLBACK_URL || env.PG_CALLBACK_URL || env.PAYMENT_CALLBACK_URL;
9583
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);
9584
9791
  const extra = {
9585
9792
  webhookToken: env.XENDIT_WEBHOOK_TOKEN || env.BUAYAR_WEBHOOK_TOKEN,
9586
9793
  webhookSecret: env.STRIPE_WEBHOOK_SECRET || env.CHECKOUTCOM_WEBHOOK_SECRET || env.RAZORPAY_WEBHOOK_SECRET || env.BUAYAR_WEBHOOK_SECRET,
@@ -9601,15 +9808,16 @@ function resolveConfigFromEnv(customConfig) {
9601
9808
  secretWord: env.TWOCHECKOUT_SECRET_WORD,
9602
9809
  ...customConfig?.extra
9603
9810
  };
9811
+ const apiKey = cfg.apiKey || cfg.secretKey || cfg.serverKey;
9604
9812
  return {
9605
- provider: provider === "oyindonesia" ? "oy" : provider === "2checkout" ? "twocheckout" : provider,
9606
- apiKey: apiKey || "",
9813
+ provider,
9814
+ apiKey,
9607
9815
  serverKey: apiKey || "",
9608
- secretKey: secretKey || apiKey || "",
9609
- merchantCode: merchantCode || "",
9610
- clientKey: clientKey || "",
9611
- merchantId: merchantId || "",
9612
- projectId,
9816
+ secretKey: apiKey || "",
9817
+ merchantCode: cfg.merchantCode || "",
9818
+ clientKey: cfg.clientKey || "",
9819
+ merchantId: cfg.merchantId || "",
9820
+ projectId: cfg.projectId || "",
9613
9821
  publicKey,
9614
9822
  privateKey,
9615
9823
  sandbox,
@@ -9623,8 +9831,10 @@ function resolveConfigFromEnv(customConfig) {
9623
9831
  var Buayar = class {
9624
9832
  manager;
9625
9833
  config;
9626
- constructor(config, manager) {
9834
+ registry;
9835
+ constructor(config, manager, registry) {
9627
9836
  this.manager = manager || paymentManager;
9837
+ this.registry = registry || providerRegistry;
9628
9838
  this.config = resolveConfigFromEnv(config);
9629
9839
  }
9630
9840
  /**
@@ -9657,6 +9867,62 @@ var Buayar = class {
9657
9867
  getProvider(name) {
9658
9868
  return this.manager.getProvider(name || this.provider);
9659
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
+ }
9660
9926
  /**
9661
9927
  * Buat transaksi pembayaran baru (Mendukung Semi dan Full Integrasi)
9662
9928
  */
@@ -9731,47 +9997,8 @@ var Buayar = class {
9731
9997
  }
9732
9998
  }
9733
9999
  let providerName = configOverride?.provider || this.provider;
9734
- if (payload) {
9735
- if (payload.signature_key && payload.transaction_status) {
9736
- providerName = "midtrans";
9737
- } else if (payload.merchantCode && payload.merchantOrderId && payload.resultCode) {
9738
- providerName = "duitku";
9739
- } else if (payload.trx_id && (payload.sid || payload.reference_id || payload.via)) {
9740
- providerName = "ipaymu";
9741
- } else if (payload.service?.id || payload.order?.invoice_number && payload.transaction?.status) {
9742
- providerName = "doku";
9743
- } else if (payload.bill_no && (payload.payment_status_code !== void 0 || payload.payment_status_desc)) {
9744
- providerName = "faspay";
9745
- } else if (payload.merchant_id && payload.order_id && payload.payment_status) {
9746
- providerName = "finpay";
9747
- } else if (payload.tXid && payload.merchantToken && (payload.referenceNo || payload.amt)) {
9748
- providerName = "nicepay";
9749
- } else if (payload.partner_tx_id || payload.partner_trx_id) {
9750
- providerName = "oy";
9751
- } else if (payload.merchant_id && payload.order_id && payload.signature) {
9752
- providerName = "prismalink";
9753
- } else if (payload.object === "event" || payload.type && payload.data?.object && payload.api_version) {
9754
- providerName = "stripe";
9755
- } else if (payload.event && payload.payload?.payment?.entity) {
9756
- providerName = "razorpay";
9757
- } else if (payload.external_id || payload.event?.startsWith("payment.") || payload.event?.startsWith("qr.") || payload.data?.reference_id) {
9758
- providerName = "xendit";
9759
- } else if (payload.event_type && payload.resource && (payload.event_type.startsWith("PAYMENT.") || payload.event_type.startsWith("CHECKOUT.ORDER."))) {
9760
- providerName = "paypal";
9761
- } else if (payload.notificationItems || payload.merchantAccountCode && payload.pspReference && payload.eventCode) {
9762
- providerName = "adyen";
9763
- } else if (payload.type && payload.data?._links && (payload.type.startsWith("payment_") || payload.type.startsWith("refund_"))) {
9764
- providerName = "checkoutcom";
9765
- } else if (payload.type && payload.data?.object?.status && payload.merchant_id) {
9766
- providerName = "square";
9767
- } else if (payload.order && payload.order?.status && payload.order?.extOrderId) {
9768
- providerName = "payu";
9769
- } else if (payload.kind && payload.subject?.transaction) {
9770
- providerName = "braintree";
9771
- } else if (payload.HASH && payload.REFNOEXT && payload.IPN_PID) {
9772
- providerName = "twocheckout";
9773
- }
9774
- }
10000
+ const detected = this.registry.detectFromWebhook(payload);
10001
+ if (detected) providerName = detected;
9775
10002
  return this.manager.verifyCallback(providerName, payload, mergedConfig);
9776
10003
  }
9777
10004
  async handleWebhook(payload, headers, configOverride) {
@@ -9912,8 +10139,10 @@ export {
9912
10139
  PayuProvider,
9913
10140
  PrismalinkClient,
9914
10141
  PrismalinkProvider,
10142
+ ProviderRegistry,
9915
10143
  RazorpayClient,
9916
10144
  RazorpayProvider,
10145
+ SnapApiError,
9917
10146
  SnapClient,
9918
10147
  SquareClient,
9919
10148
  SquareProvider,
@@ -9926,6 +10155,7 @@ export {
9926
10155
  buayar,
9927
10156
  buildBraintreeBasicAuth,
9928
10157
  buildCoreChargePayload,
10158
+ buildDefaultDescriptors,
9929
10159
  buildPaypalBasicAuth,
9930
10160
  buildPayuBasicAuth,
9931
10161
  buildRazorpayBasicAuth,
@@ -9950,6 +10180,7 @@ export {
9950
10180
  minifyJson,
9951
10181
  parseCoreChargeResponse,
9952
10182
  paymentManager,
10183
+ providerRegistry,
9953
10184
  resolveConfigFromEnv,
9954
10185
  safeCompare,
9955
10186
  serializePaypalParams,
@@ -9957,6 +10188,7 @@ export {
9957
10188
  sha256,
9958
10189
  sha256Hex,
9959
10190
  sha512,
10191
+ snapErrorHint,
9960
10192
  snapExternalId,
9961
10193
  snapTimestamp,
9962
10194
  snapUtcTimestamp,