@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.js CHANGED
@@ -76,8 +76,10 @@ __export(index_exports, {
76
76
  PayuProvider: () => PayuProvider,
77
77
  PrismalinkClient: () => PrismalinkClient,
78
78
  PrismalinkProvider: () => PrismalinkProvider,
79
+ ProviderRegistry: () => ProviderRegistry,
79
80
  RazorpayClient: () => RazorpayClient,
80
81
  RazorpayProvider: () => RazorpayProvider,
82
+ SnapApiError: () => SnapApiError,
81
83
  SnapClient: () => SnapClient,
82
84
  SquareClient: () => SquareClient,
83
85
  SquareProvider: () => SquareProvider,
@@ -90,6 +92,7 @@ __export(index_exports, {
90
92
  buayar: () => buayar,
91
93
  buildBraintreeBasicAuth: () => buildBraintreeBasicAuth,
92
94
  buildCoreChargePayload: () => buildCoreChargePayload,
95
+ buildDefaultDescriptors: () => buildDefaultDescriptors,
93
96
  buildPaypalBasicAuth: () => buildPaypalBasicAuth,
94
97
  buildPayuBasicAuth: () => buildPayuBasicAuth,
95
98
  buildRazorpayBasicAuth: () => buildRazorpayBasicAuth,
@@ -114,6 +117,7 @@ __export(index_exports, {
114
117
  minifyJson: () => minifyJson,
115
118
  parseCoreChargeResponse: () => parseCoreChargeResponse,
116
119
  paymentManager: () => paymentManager,
120
+ providerRegistry: () => providerRegistry,
117
121
  resolveConfigFromEnv: () => resolveConfigFromEnv,
118
122
  safeCompare: () => safeCompare,
119
123
  serializePaypalParams: () => serializePaypalParams,
@@ -121,6 +125,7 @@ __export(index_exports, {
121
125
  sha256: () => sha256,
122
126
  sha256Hex: () => sha256Hex,
123
127
  sha512: () => sha512,
128
+ snapErrorHint: () => snapErrorHint,
124
129
  snapExternalId: () => snapExternalId,
125
130
  snapTimestamp: () => snapTimestamp,
126
131
  snapUtcTimestamp: () => snapUtcTimestamp,
@@ -2627,6 +2632,29 @@ function verifySnapWebhookSignature(headers, body, clientSecret, endpointUrl = "
2627
2632
  );
2628
2633
  return safeCompare(incoming, computed);
2629
2634
  }
2635
+ function snapErrorHint(message, code) {
2636
+ const m = (message || "").toLowerCase();
2637
+ const c = (code || "").toLowerCase();
2638
+ if (m.includes("unknown client") || c.includes("4017300") || c.includes("4017400")) {
2639
+ return "Client ID tidak dikenali DOKU. Pastikan clientId benar & kanal SNAP aktif untuk akun ini.";
2640
+ }
2641
+ if (m.includes("signature") || c.startsWith("401")) {
2642
+ 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).";
2643
+ }
2644
+ if (m.includes("bin") || m.includes("not configured") && m.includes("identifier")) {
2645
+ 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.";
2646
+ }
2647
+ if (m.includes("merchantid") || m.includes("merchant id")) {
2648
+ return "QRIS/e-Wallet butuh merchantId. Isi config.extra.merchantId (atau DOKU_MERCHANT_ID) dari dashboard.";
2649
+ }
2650
+ if (m.includes("partner service id") || m.includes("partnerServiceId")) {
2651
+ return "partnerServiceId tidak valid. Harus 8 karakter left-padded (BIN/company code DOKU).";
2652
+ }
2653
+ if (m.includes("customer no") || m.includes("customerno")) {
2654
+ return "customerNo tidak valid (maks 20 digit unik). Cek config.extra.customerNo.";
2655
+ }
2656
+ return void 0;
2657
+ }
2630
2658
 
2631
2659
  // src/clients/snap.ts
2632
2660
  var SnapClient = class {
@@ -2683,7 +2711,16 @@ var SnapClient = class {
2683
2711
  } catch {
2684
2712
  }
2685
2713
  if (!response.ok || !data?.accessToken) {
2686
- throw new Error(data?.responseMessage || data?.message || `DOKU SNAP get-token failed: HTTP ${response.status} - ${text}`);
2714
+ const baseMessage = data?.responseMessage || data?.message || `DOKU SNAP get-token failed: HTTP ${response.status}`;
2715
+ const hint = snapErrorHint(baseMessage, data?.responseCode);
2716
+ const err = new SnapApiError(`${baseMessage}${data?.responseCode ? ` (${data.responseCode})` : ""}${hint ? ` \u2014 ${hint}` : ""}`, {
2717
+ status: response.status,
2718
+ code: data?.responseCode,
2719
+ raw: data,
2720
+ endpoint,
2721
+ method: "POST"
2722
+ });
2723
+ throw err;
2687
2724
  }
2688
2725
  if (!clientSecret) {
2689
2726
  }
@@ -2744,12 +2781,37 @@ var SnapClient = class {
2744
2781
  } catch {
2745
2782
  }
2746
2783
  if (!response.ok) {
2747
- const err = data?.responseMessage || data?.error?.message || data?.message || `HTTP ${response.status}`;
2748
- throw new Error(`${err}${data?.responseCode ? ` (${data.responseCode})` : ""}`);
2784
+ const baseMessage = data?.responseMessage || data?.error?.message || data?.message || `HTTP ${response.status}`;
2785
+ const hint = snapErrorHint(baseMessage, data?.responseCode);
2786
+ const message = `${baseMessage}${data?.responseCode ? ` (${data.responseCode})` : ""}${hint ? ` \u2014 ${hint}` : ""}`;
2787
+ const err = new SnapApiError(message, {
2788
+ status: response.status,
2789
+ code: data?.responseCode,
2790
+ raw: data,
2791
+ endpoint,
2792
+ method
2793
+ });
2794
+ throw err;
2749
2795
  }
2750
2796
  return data;
2751
2797
  }
2752
2798
  };
2799
+ var SnapApiError = class extends Error {
2800
+ status;
2801
+ responseCode;
2802
+ raw;
2803
+ endpoint;
2804
+ method;
2805
+ constructor(message, opts) {
2806
+ super(message);
2807
+ this.name = "SnapApiError";
2808
+ this.status = opts.status;
2809
+ this.responseCode = opts.code;
2810
+ this.raw = opts.raw;
2811
+ this.endpoint = opts.endpoint;
2812
+ this.method = opts.method;
2813
+ }
2814
+ };
2753
2815
 
2754
2816
  // src/providers/doku/provider.ts
2755
2817
  var DokuProvider = class extends BasePaymentProvider {
@@ -3026,8 +3088,8 @@ var DokuProvider = class extends BasePaymentProvider {
3026
3088
  provider: "doku",
3027
3089
  orderId,
3028
3090
  amount: integerAmount,
3029
- rawResponse: null,
3030
- error: e.message || "Failed to make SNAP request to DOKU API"
3091
+ rawResponse: e?.raw ?? e?.rawResponse ?? null,
3092
+ error: e?.message || "Failed to make SNAP request to DOKU API"
3031
3093
  };
3032
3094
  }
3033
3095
  }
@@ -3068,6 +3130,7 @@ var DokuProvider = class extends BasePaymentProvider {
3068
3130
  return {
3069
3131
  success: true,
3070
3132
  provider: "doku",
3133
+ mode: "va",
3071
3134
  orderId: vaData.trxId || orderId,
3072
3135
  amount: Number(vaData.totalAmount?.value || amount) || Math.round(amount),
3073
3136
  reference: vaData.virtualAccountNo || orderId,
@@ -3103,6 +3166,7 @@ var DokuProvider = class extends BasePaymentProvider {
3103
3166
  return {
3104
3167
  success: true,
3105
3168
  provider: "doku",
3169
+ mode: "qris",
3106
3170
  orderId: data.partnerReferenceNo || orderId,
3107
3171
  amount: Number(data.amount?.value || amount) || Math.round(amount),
3108
3172
  reference: data.referenceNo || orderId,
@@ -3148,10 +3212,12 @@ var DokuProvider = class extends BasePaymentProvider {
3148
3212
  return {
3149
3213
  success: true,
3150
3214
  provider: "doku",
3215
+ mode: "ewallet",
3151
3216
  orderId: data.partnerReferenceNo || orderId,
3152
3217
  amount: Number(data.amount?.value || amount) || Math.round(amount),
3153
3218
  reference: data.partnerReferenceNo || orderId,
3154
3219
  paymentUrl: data.webRedirectUrl || data.paymentUrl,
3220
+ checkoutUrl: data.webRedirectUrl || data.paymentUrl,
3155
3221
  rawResponse: data
3156
3222
  };
3157
3223
  }
@@ -9576,170 +9642,316 @@ var PaymentManager = class {
9576
9642
  };
9577
9643
  var paymentManager = new PaymentManager();
9578
9644
 
9645
+ // src/core/providerRegistry.ts
9646
+ var ProviderRegistry = class {
9647
+ descriptors = /* @__PURE__ */ new Map();
9648
+ constructor(initial) {
9649
+ for (const d of initial || []) this.register(d);
9650
+ }
9651
+ register(desc) {
9652
+ this.descriptors.set(desc.name.toLowerCase().trim(), desc);
9653
+ }
9654
+ unregister(name) {
9655
+ return this.descriptors.delete(name.toLowerCase().trim());
9656
+ }
9657
+ has(name) {
9658
+ return this.descriptors.has(name.toLowerCase().trim());
9659
+ }
9660
+ get(name) {
9661
+ return this.descriptors.get(name.toLowerCase().trim());
9662
+ }
9663
+ names() {
9664
+ return [...this.descriptors.keys()];
9665
+ }
9666
+ /**
9667
+ * Autodetect provider aktif dari variabel lingkungan.
9668
+ * Mengembalikan nama provider yang kredensial .env-nya terisi penuh,
9669
+ * atau undefined jika tidak ada / ambigu.
9670
+ */
9671
+ detectFromEnv(env) {
9672
+ const present = [];
9673
+ for (const [name, desc] of this.descriptors) {
9674
+ const filled = desc.envKeys.filter((k) => {
9675
+ const v = env[k];
9676
+ return typeof v === "string" && v.trim().length > 0;
9677
+ });
9678
+ if (filled.length > 0) present.push({ name, count: filled.length });
9679
+ }
9680
+ if (present.length === 0) return void 0;
9681
+ present.sort((a, b) => b.count - a.count);
9682
+ const top = present[0];
9683
+ const ties = present.filter((p) => p.count === top.count);
9684
+ return ties.length === 1 ? top.name : void 0;
9685
+ }
9686
+ /**
9687
+ * Autodetect provider dari struktur payload webhook.
9688
+ * Mengembalikan nama provider jika dikenali, else undefined.
9689
+ */
9690
+ detectFromWebhook(payload) {
9691
+ if (!payload) return void 0;
9692
+ const p = payload;
9693
+ if (p.signature_key && p.transaction_status) return "midtrans";
9694
+ if (p.merchantCode && p.merchantOrderId && p.resultCode) return "duitku";
9695
+ if (p.trx_id && (p.sid || p.reference_id || p.via)) return "ipaymu";
9696
+ if (p.service?.id || p.order?.invoice_number && p.transaction?.status) return "doku";
9697
+ if (p.bill_no && (p.payment_status_code !== void 0 || p.payment_status_desc)) return "faspay";
9698
+ if (p.merchant_id && p.order_id && p.payment_status) return "finpay";
9699
+ if (p.tXid && p.merchantToken && (p.referenceNo || p.amt)) return "nicepay";
9700
+ if (p.partner_tx_id || p.partner_trx_id) return "oy";
9701
+ if (p.merchant_id && p.order_id && p.signature) return "prismalink";
9702
+ if (p.object === "event" || p.type && p.data?.object && p.api_version) return "stripe";
9703
+ if (p.event && p.payload?.payment?.entity) return "razorpay";
9704
+ if (p.external_id || p.event?.startsWith("payment.") || p.event?.startsWith("qr.") || p.data?.reference_id) return "xendit";
9705
+ if (p.event_type && p.resource && (p.event_type.startsWith("PAYMENT.") || p.event_type.startsWith("CHECKOUT.ORDER."))) return "paypal";
9706
+ if (p.notificationItems || p.merchantAccountCode && p.pspReference && p.eventCode) return "adyen";
9707
+ if (p.type && p.data?._links && (p.type.startsWith("payment_") || p.type.startsWith("refund_"))) return "checkoutcom";
9708
+ if (p.type && p.data?.object?.status && p.merchant_id) return "square";
9709
+ if (p.order && p.order?.status && p.order?.extOrderId) return "payu";
9710
+ if (p.kind && p.subject?.transaction) return "braintree";
9711
+ if (p.HASH && p.REFNOEXT && p.IPN_PID) return "twocheckout";
9712
+ return void 0;
9713
+ }
9714
+ };
9715
+ var ENV_KEYS = {
9716
+ midtrans: ["MIDTRANS_SERVER_KEY", "MIDTRANS_CLIENT_KEY"],
9717
+ duitku: ["DUITKU_API_KEY", "DUITKU_MERCHANT_CODE"],
9718
+ ipaymu: ["IPAYMU_API_KEY", "IPAYMU_VA"],
9719
+ xendit: ["XENDIT_SECRET_KEY", "XENDIT_WEBHOOK_TOKEN"],
9720
+ doku: ["DOKU_CLIENT_ID", "DOKU_SECRET_KEY"],
9721
+ prismalink: ["PRISMALINK_MERCHANT_ID", "PRISMALINK_SECRET_KEY"],
9722
+ faspay: ["FASPAY_MERCHANT_ID", "FASPAY_USER_ID", "FASPAY_PASSWORD"],
9723
+ finpay: ["FINPAY_MERCHANT_ID", "FINPAY_MERCHANT_KEY"],
9724
+ nicepay: ["NICEPAY_IMID", "NICEPAY_KEY"],
9725
+ oy: ["OY_USERNAME", "OY_API_KEY"],
9726
+ stripe: ["STRIPE_SECRET_KEY", "STRIPE_PUBLIC_KEY", "STRIPE_WEBHOOK_SECRET"],
9727
+ paypal: ["PAYPAL_CLIENT_ID", "PAYPAL_CLIENT_SECRET", "PAYPAL_WEBHOOK_ID"],
9728
+ adyen: ["ADYEN_API_KEY", "ADYEN_MERCHANT_ACCOUNT", "ADYEN_HMAC_KEY"],
9729
+ checkoutcom: ["CHECKOUTCOM_SECRET_KEY", "CHECKOUTCOM_PUBLIC_KEY", "CHECKOUTCOM_WEBHOOK_SECRET"],
9730
+ razorpay: ["RAZORPAY_KEY_ID", "RAZORPAY_KEY_SECRET", "RAZORPAY_WEBHOOK_SECRET"],
9731
+ square: ["SQUARE_ACCESS_TOKEN", "SQUARE_LOCATION_ID", "SQUARE_WEBHOOK_SIGNATURE_KEY"],
9732
+ payu: ["PAYU_POS_ID", "PAYU_MD5_KEY"],
9733
+ braintree: ["BRAINTREE_MERCHANT_ID", "BRAINTREE_PUBLIC_KEY", "BRAINTREE_PRIVATE_KEY"],
9734
+ twocheckout: ["TWOCHECKOUT_MERCHANT_CODE", "TWOCHECKOUT_SECRET_KEY", "TWOCHECKOUT_SECRET_WORD"]
9735
+ };
9736
+ var WORKING_METHODS = {
9737
+ midtrans: Object.keys(CANONICAL_TO_MIDTRANS),
9738
+ duitku: Object.keys(CANONICAL_TO_DUITKU),
9739
+ ipaymu: Object.keys(CANONICAL_TO_IPAYMU),
9740
+ xendit: Object.keys(CANONICAL_TO_XENDIT),
9741
+ doku: Object.keys(CANONICAL_TO_DOKU),
9742
+ prismalink: Object.keys(CANONICAL_TO_PRISMALINK),
9743
+ faspay: Object.keys(CANONICAL_TO_FASPAY),
9744
+ finpay: Object.keys(CANONICAL_TO_FINPAY),
9745
+ nicepay: Object.keys(CANONICAL_TO_NICEPAY),
9746
+ oy: Object.keys(CANONICAL_TO_OY),
9747
+ stripe: Object.keys(CANONICAL_TO_STRIPE),
9748
+ paypal: ["credit_card", "paylater", "paypal", "bank_transfer"],
9749
+ adyen: ["credit_card", "paypal", "qris", "apple_pay", "google_pay", "klarna", "sepa"],
9750
+ checkoutcom: ["credit_card", "paypal", "apple_pay", "google_pay", "klarna", "sofort", "bank_transfer"],
9751
+ razorpay: ["credit_card", "wallet", "upi", "netbanking", "emi", "bank_transfer"],
9752
+ square: ["credit_card", "apple_pay", "google_pay", "afterpay", "cash_app"],
9753
+ payu: ["credit_card", "bank_transfer", "apple_pay", "google_pay", "blik", "installment"],
9754
+ braintree: ["credit_card", "paypal", "apple_pay", "google_pay", "venmo"],
9755
+ twocheckout: ["credit_card", "paypal", "paylater", "wire_transfer"]
9756
+ };
9757
+ var OPERATIONS = {
9758
+ midtrans: { refund: true, checkBalance: true, disburse: false },
9759
+ duitku: { refund: false, checkBalance: true, disburse: true },
9760
+ ipaymu: { refund: false, checkBalance: true, disburse: false },
9761
+ xendit: { refund: false, checkBalance: true, disburse: true },
9762
+ doku: { refund: false, checkBalance: false, disburse: false },
9763
+ prismalink: { refund: false, checkBalance: false, disburse: false },
9764
+ faspay: { refund: false, checkBalance: false, disburse: false },
9765
+ finpay: { refund: false, checkBalance: false, disburse: false },
9766
+ nicepay: { refund: false, checkBalance: false, disburse: false },
9767
+ oy: { refund: false, checkBalance: true, disburse: true },
9768
+ stripe: { refund: true, checkBalance: true, disburse: false },
9769
+ paypal: { refund: true, checkBalance: true, disburse: false },
9770
+ adyen: { refund: true, checkBalance: false, disburse: false },
9771
+ checkoutcom: { refund: true, checkBalance: true, disburse: false },
9772
+ razorpay: { refund: true, checkBalance: true, disburse: false },
9773
+ square: { refund: true, checkBalance: true, disburse: false },
9774
+ payu: { refund: true, checkBalance: false, disburse: false },
9775
+ braintree: { refund: true, checkBalance: false, disburse: false },
9776
+ twocheckout: { refund: true, checkBalance: false, disburse: false }
9777
+ };
9778
+ function buildDefaultDescriptors() {
9779
+ return Object.keys(ENV_KEYS).map((name) => ({
9780
+ name,
9781
+ envKeys: ENV_KEYS[name],
9782
+ methods: WORKING_METHODS[name] || [],
9783
+ operations: OPERATIONS[name] || { refund: false, checkBalance: false, disburse: false }
9784
+ }));
9785
+ }
9786
+ var providerRegistry = new ProviderRegistry(buildDefaultDescriptors());
9787
+
9579
9788
  // src/core/config.ts
9789
+ var UNIVERSAL = {
9790
+ apiKey: ["BUAYAR_API_KEY", "BUAYAR_SERVER_KEY", "PG_API_KEY", "PAYMENT_API_KEY"],
9791
+ clientKey: ["BUAYAR_CLIENT_KEY", "PG_CLIENT_KEY"],
9792
+ merchantCode: ["BUAYAR_MERCHANT_CODE", "PG_MERCHANT_CODE", "PAYMENT_MERCHANT_CODE"],
9793
+ merchantId: ["BUAYAR_MERCHANT_ID", "PG_MERCHANT_ID"],
9794
+ secretKey: ["BUAYAR_SECRET_KEY", "PG_SECRET_KEY", "SECRET_KEY"],
9795
+ serverKey: ["BUAYAR_SERVER_KEY", "PG_SECRET_KEY"],
9796
+ projectId: ["BUAYAR_PROJECT_ID", "PG_PROJECT_ID", "PROJECT_ID"]
9797
+ };
9798
+ var SPECIFIC = {
9799
+ midtrans: {
9800
+ apiKey: ["MIDTRANS_SERVER_KEY"],
9801
+ clientKey: ["MIDTRANS_CLIENT_KEY"],
9802
+ merchantId: ["MIDTRANS_MERCHANT_ID"]
9803
+ },
9804
+ duitku: {
9805
+ apiKey: ["DUITKU_API_KEY"],
9806
+ merchantCode: ["DUITKU_MERCHANT_CODE"]
9807
+ },
9808
+ ipaymu: {
9809
+ apiKey: ["IPAYMU_API_KEY"],
9810
+ merchantCode: ["IPAYMU_VA", "IPAYMU_MERCHANT_CODE"]
9811
+ },
9812
+ xendit: {
9813
+ apiKey: ["XENDIT_SECRET_KEY", "XENDIT_API_KEY"]
9814
+ },
9815
+ doku: {
9816
+ apiKey: ["DOKU_SECRET_KEY", "DOKU_API_KEY"],
9817
+ clientKey: ["DOKU_CLIENT_ID"],
9818
+ merchantCode: ["DOKU_CLIENT_ID", "DOKU_MERCHANT_ID"],
9819
+ merchantId: ["DOKU_MERCHANT_ID"]
9820
+ },
9821
+ prismalink: {
9822
+ apiKey: ["PRISMALINK_SECRET_KEY", "PRISMALINK_API_KEY"],
9823
+ merchantCode: ["PRISMALINK_MERCHANT_ID"],
9824
+ merchantId: ["PRISMALINK_MERCHANT_ID"]
9825
+ },
9826
+ faspay: {
9827
+ apiKey: ["FASPAY_PASSWORD", "FASPAY_API_KEY"],
9828
+ clientKey: ["FASPAY_USER_ID"],
9829
+ merchantCode: ["FASPAY_MERCHANT_ID"],
9830
+ merchantId: ["FASPAY_MERCHANT_ID"]
9831
+ },
9832
+ finpay: {
9833
+ apiKey: ["FINPAY_MERCHANT_KEY", "FINPAY_SECRET_KEY", "FINPAY_API_KEY"],
9834
+ merchantCode: ["FINPAY_MERCHANT_ID"],
9835
+ merchantId: ["FINPAY_MERCHANT_ID"]
9836
+ },
9837
+ nicepay: {
9838
+ apiKey: ["NICEPAY_KEY", "NICEPAY_SECRET_KEY", "NICEPAY_API_KEY"],
9839
+ merchantCode: ["NICEPAY_IMID", "NICEPAY_MERCHANT_ID"],
9840
+ merchantId: ["NICEPAY_IMID"]
9841
+ },
9842
+ oy: {
9843
+ apiKey: ["OY_API_KEY"],
9844
+ clientKey: ["OY_USERNAME"],
9845
+ merchantCode: ["OY_USERNAME"]
9846
+ },
9847
+ stripe: {
9848
+ apiKey: ["STRIPE_SECRET_KEY", "STRIPE_KEY"],
9849
+ clientKey: ["STRIPE_PUBLIC_KEY", "STRIPE_PUBLISHABLE_KEY"]
9850
+ },
9851
+ paypal: {
9852
+ apiKey: ["PAYPAL_CLIENT_SECRET"],
9853
+ clientKey: ["PAYPAL_CLIENT_ID"],
9854
+ merchantCode: ["PAYPAL_CLIENT_ID"]
9855
+ },
9856
+ adyen: {
9857
+ apiKey: ["ADYEN_API_KEY"],
9858
+ clientKey: ["ADYEN_CLIENT_KEY"],
9859
+ merchantCode: ["ADYEN_MERCHANT_ACCOUNT"],
9860
+ merchantId: ["ADYEN_MERCHANT_ACCOUNT"]
9861
+ },
9862
+ checkoutcom: {
9863
+ apiKey: ["CHECKOUTCOM_SECRET_KEY"],
9864
+ clientKey: ["CHECKOUTCOM_PUBLIC_KEY"]
9865
+ },
9866
+ razorpay: {
9867
+ apiKey: ["RAZORPAY_KEY_SECRET"],
9868
+ clientKey: ["RAZORPAY_KEY_ID"],
9869
+ merchantCode: ["RAZORPAY_KEY_ID"]
9870
+ },
9871
+ square: {
9872
+ apiKey: ["SQUARE_ACCESS_TOKEN"],
9873
+ clientKey: ["SQUARE_APPLICATION_ID"],
9874
+ merchantCode: ["SQUARE_APPLICATION_ID"],
9875
+ projectId: ["SQUARE_LOCATION_ID"]
9876
+ },
9877
+ payu: {
9878
+ apiKey: ["PAYU_MD5_KEY"],
9879
+ clientKey: ["PAYU_POS_ID"],
9880
+ merchantCode: ["PAYU_POS_ID"],
9881
+ merchantId: ["PAYU_POS_ID"]
9882
+ },
9883
+ braintree: {
9884
+ apiKey: ["BRAINTREE_PRIVATE_KEY"],
9885
+ clientKey: ["BRAINTREE_PUBLIC_KEY"],
9886
+ merchantCode: ["BRAINTREE_MERCHANT_ID"],
9887
+ merchantId: ["BRAINTREE_MERCHANT_ID"]
9888
+ },
9889
+ twocheckout: {
9890
+ apiKey: ["TWOCHECKOUT_SECRET_KEY"],
9891
+ merchantCode: ["TWOCHECKOUT_MERCHANT_CODE"],
9892
+ merchantId: ["TWOCHECKOUT_MERCHANT_CODE"]
9893
+ }
9894
+ };
9895
+ function firstDefined(env, keys) {
9896
+ for (const k of keys) {
9897
+ const v = env[k];
9898
+ if (typeof v === "string" && v.trim().length > 0) return v.trim();
9899
+ }
9900
+ return void 0;
9901
+ }
9902
+ function resolveSandbox(env, provider) {
9903
+ const universal = firstDefined(env, ["BUAYAR_SANDBOX", "PG_SANDBOX", "PAYMENT_SANDBOX"]);
9904
+ if (universal !== void 0) return universal === "true" || universal === "1";
9905
+ const specificMap = {
9906
+ midtrans: ["MIDTRANS_IS_PRODUCTION"],
9907
+ duitku: ["DUITKU_SANDBOX"],
9908
+ ipaymu: ["IPAYMU_SANDBOX"],
9909
+ doku: ["DOKU_SANDBOX"],
9910
+ prismalink: ["PRISMALINK_SANDBOX"],
9911
+ faspay: ["FASPAY_SANDBOX"],
9912
+ finpay: ["FINPAY_SANDBOX"],
9913
+ nicepay: ["NICEPAY_SANDBOX"],
9914
+ oy: ["OY_SANDBOX"],
9915
+ stripe: ["STRIPE_SANDBOX"],
9916
+ paypal: ["PAYPAL_SANDBOX"],
9917
+ adyen: ["ADYEN_SANDBOX"],
9918
+ checkoutcom: ["CHECKOUTCOM_SANDBOX"],
9919
+ razorpay: ["RAZORPAY_SANDBOX"],
9920
+ square: ["SQUARE_SANDBOX"],
9921
+ payu: ["PAYU_SANDBOX"],
9922
+ braintree: ["BRAINTREE_SANDBOX"],
9923
+ twocheckout: ["TWOCHECKOUT_SANDBOX"],
9924
+ xendit: ["XENDIT_SANDBOX"]
9925
+ };
9926
+ const specific = firstDefined(env, specificMap[provider]);
9927
+ if (specific !== void 0) {
9928
+ if (provider === "midtrans") return specific !== "true" && specific !== "1";
9929
+ return specific === "true" || specific === "1";
9930
+ }
9931
+ return env.NODE_ENV !== "production";
9932
+ }
9580
9933
  function resolveConfigFromEnv(customConfig) {
9581
9934
  const env = typeof process !== "undefined" && process?.env ? process.env : {};
9582
- const provider = (customConfig?.provider || env.PROVIDER_PG || env.PG_PROVIDER || env.BUAYAR_PROVIDER || env.PAYMENT_PROVIDER || "midtrans").toLowerCase().trim();
9583
- let sandbox;
9584
- if (customConfig?.sandbox !== void 0) {
9585
- sandbox = customConfig.sandbox;
9586
- } else if (env.BUAYAR_SANDBOX !== void 0) {
9587
- sandbox = env.BUAYAR_SANDBOX === "true" || env.BUAYAR_SANDBOX === "1";
9588
- } else if (env.PG_SANDBOX !== void 0) {
9589
- sandbox = env.PG_SANDBOX === "true" || env.PG_SANDBOX === "1";
9590
- } else if (env.PAYMENT_SANDBOX !== void 0) {
9591
- sandbox = env.PAYMENT_SANDBOX === "true" || env.PAYMENT_SANDBOX === "1";
9592
- } else if (env.MIDTRANS_IS_PRODUCTION !== void 0) {
9593
- sandbox = env.MIDTRANS_IS_PRODUCTION !== "true" && env.MIDTRANS_IS_PRODUCTION !== "1";
9594
- } else if (env.DUITKU_SANDBOX !== void 0) {
9595
- sandbox = env.DUITKU_SANDBOX === "true" || env.DUITKU_SANDBOX === "1";
9596
- } else if (env.IPAYMU_SANDBOX !== void 0) {
9597
- sandbox = env.IPAYMU_SANDBOX === "true" || env.IPAYMU_SANDBOX === "1";
9598
- } else if (env.DOKU_SANDBOX !== void 0) {
9599
- sandbox = env.DOKU_SANDBOX === "true" || env.DOKU_SANDBOX === "1";
9600
- } else if (env.PRISMALINK_SANDBOX !== void 0) {
9601
- sandbox = env.PRISMALINK_SANDBOX === "true" || env.PRISMALINK_SANDBOX === "1";
9602
- } else if (env.FASPAY_SANDBOX !== void 0) {
9603
- sandbox = env.FASPAY_SANDBOX === "true" || env.FASPAY_SANDBOX === "1";
9604
- } else if (env.FINPAY_SANDBOX !== void 0) {
9605
- sandbox = env.FINPAY_SANDBOX === "true" || env.FINPAY_SANDBOX === "1";
9606
- } else if (env.NICEPAY_SANDBOX !== void 0) {
9607
- sandbox = env.NICEPAY_SANDBOX === "true" || env.NICEPAY_SANDBOX === "1";
9608
- } else if (env.OY_SANDBOX !== void 0) {
9609
- sandbox = env.OY_SANDBOX === "true" || env.OY_SANDBOX === "1";
9610
- } else if (env.STRIPE_SANDBOX !== void 0) {
9611
- sandbox = env.STRIPE_SANDBOX === "true" || env.STRIPE_SANDBOX === "1";
9612
- } else if (env.PAYPAL_SANDBOX !== void 0) {
9613
- sandbox = env.PAYPAL_SANDBOX === "true" || env.PAYPAL_SANDBOX === "1";
9614
- } else if (env.ADYEN_SANDBOX !== void 0) {
9615
- sandbox = env.ADYEN_SANDBOX === "true" || env.ADYEN_SANDBOX === "1";
9616
- } else if (env.CHECKOUTCOM_SANDBOX !== void 0) {
9617
- sandbox = env.CHECKOUTCOM_SANDBOX === "true" || env.CHECKOUTCOM_SANDBOX === "1";
9618
- } else if (env.RAZORPAY_SANDBOX !== void 0) {
9619
- sandbox = env.RAZORPAY_SANDBOX === "true" || env.RAZORPAY_SANDBOX === "1";
9620
- } else if (env.SQUARE_SANDBOX !== void 0) {
9621
- sandbox = env.SQUARE_SANDBOX === "true" || env.SQUARE_SANDBOX === "1";
9622
- } else if (env.PAYU_SANDBOX !== void 0) {
9623
- sandbox = env.PAYU_SANDBOX === "true" || env.PAYU_SANDBOX === "1";
9624
- } else if (env.BRAINTREE_SANDBOX !== void 0) {
9625
- sandbox = env.BRAINTREE_SANDBOX === "true" || env.BRAINTREE_SANDBOX === "1";
9626
- } else if (env.TWOCHECKOUT_SANDBOX !== void 0) {
9627
- sandbox = env.TWOCHECKOUT_SANDBOX === "true" || env.TWOCHECKOUT_SANDBOX === "1";
9628
- } else {
9629
- sandbox = env.NODE_ENV !== "production";
9630
- }
9631
- let apiKey = customConfig?.apiKey || customConfig?.serverKey || customConfig?.secretKey;
9632
- if (!apiKey) {
9633
- if (provider === "midtrans") {
9634
- apiKey = env.MIDTRANS_SERVER_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY || env.BUAYAR_SERVER_KEY;
9635
- } else if (provider === "duitku") {
9636
- apiKey = env.DUITKU_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9637
- } else if (provider === "ipaymu") {
9638
- apiKey = env.IPAYMU_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9639
- } else if (provider === "xendit") {
9640
- apiKey = env.XENDIT_SECRET_KEY || env.XENDIT_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9641
- } else if (provider === "doku") {
9642
- apiKey = env.DOKU_SECRET_KEY || env.DOKU_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9643
- } else if (provider === "prismalink") {
9644
- apiKey = env.PRISMALINK_SECRET_KEY || env.PRISMALINK_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9645
- } else if (provider === "faspay") {
9646
- apiKey = env.FASPAY_PASSWORD || env.FASPAY_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9647
- } else if (provider === "finpay") {
9648
- 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;
9649
- } else if (provider === "nicepay") {
9650
- 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;
9651
- } else if (provider === "oy" || provider === "oyindonesia") {
9652
- apiKey = env.OY_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9653
- } else if (provider === "stripe") {
9654
- apiKey = env.STRIPE_SECRET_KEY || env.STRIPE_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9655
- } else if (provider === "paypal") {
9656
- apiKey = env.PAYPAL_CLIENT_SECRET || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9657
- } else if (provider === "adyen") {
9658
- apiKey = env.ADYEN_API_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9659
- } else if (provider === "checkoutcom") {
9660
- apiKey = env.CHECKOUTCOM_SECRET_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9661
- } else if (provider === "razorpay") {
9662
- apiKey = env.RAZORPAY_KEY_SECRET || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9663
- } else if (provider === "square") {
9664
- apiKey = env.SQUARE_ACCESS_TOKEN || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9665
- } else if (provider === "payu") {
9666
- apiKey = env.PAYU_MD5_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9667
- } else if (provider === "braintree") {
9668
- apiKey = env.BRAINTREE_PRIVATE_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9669
- } else if (provider === "twocheckout" || provider === "2checkout") {
9670
- apiKey = env.TWOCHECKOUT_SECRET_KEY || env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY;
9671
- } else {
9672
- apiKey = env.BUAYAR_API_KEY || env.PG_API_KEY || env.PAYMENT_API_KEY || env.PG_SECRET_KEY || env.BUAYAR_SECRET_KEY;
9673
- }
9674
- }
9675
- let merchantCode = customConfig?.merchantCode;
9676
- let clientKey = customConfig?.clientKey;
9677
- let merchantId = customConfig?.merchantId;
9678
- if (provider === "midtrans") {
9679
- clientKey = clientKey || env.MIDTRANS_CLIENT_KEY || env.BUAYAR_CLIENT_KEY || env.PG_CLIENT_KEY;
9680
- merchantId = merchantId || env.MIDTRANS_MERCHANT_ID || env.BUAYAR_MERCHANT_ID || env.PG_MERCHANT_ID;
9681
- merchantCode = merchantCode || clientKey || merchantId || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE;
9682
- } else if (provider === "duitku") {
9683
- merchantCode = merchantCode || env.DUITKU_MERCHANT_CODE || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9684
- } else if (provider === "ipaymu") {
9685
- merchantCode = merchantCode || env.IPAYMU_VA || env.IPAYMU_MERCHANT_CODE || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9686
- } else if (provider === "doku") {
9687
- merchantCode = merchantCode || env.DOKU_CLIENT_ID || env.DOKU_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9688
- clientKey = clientKey || customConfig?.merchantCode || env.DOKU_CLIENT_ID || env.BUAYAR_CLIENT_KEY;
9689
- } else if (provider === "prismalink") {
9690
- merchantCode = merchantCode || env.PRISMALINK_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9691
- merchantId = merchantId || env.PRISMALINK_MERCHANT_ID || env.BUAYAR_MERCHANT_ID;
9692
- } else if (provider === "faspay") {
9693
- merchantCode = merchantCode || env.FASPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9694
- merchantId = merchantId || env.FASPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_ID;
9695
- clientKey = clientKey || env.FASPAY_USER_ID || env.BUAYAR_CLIENT_KEY;
9696
- } else if (provider === "finpay") {
9697
- merchantCode = merchantCode || env.FINPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9698
- merchantId = merchantId || env.FINPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_ID;
9699
- } else if (provider === "nicepay") {
9700
- merchantCode = merchantCode || env.NICEPAY_IMID || env.NICEPAY_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9701
- merchantId = merchantId || env.NICEPAY_IMID || env.BUAYAR_MERCHANT_ID;
9702
- } else if (provider === "oy" || provider === "oyindonesia") {
9703
- merchantCode = merchantCode || env.OY_USERNAME || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9704
- clientKey = clientKey || customConfig?.merchantCode || env.OY_USERNAME || env.BUAYAR_CLIENT_KEY;
9705
- } else if (provider === "stripe") {
9706
- clientKey = clientKey || env.STRIPE_PUBLIC_KEY || env.STRIPE_PUBLISHABLE_KEY || env.BUAYAR_CLIENT_KEY || env.BUAYAR_PUBLIC_KEY;
9707
- merchantCode = merchantCode || clientKey || "stripe";
9708
- } else if (provider === "paypal") {
9709
- clientKey = clientKey || env.PAYPAL_CLIENT_ID || env.BUAYAR_CLIENT_KEY;
9710
- merchantCode = merchantCode || env.PAYPAL_CLIENT_ID || env.BUAYAR_MERCHANT_CODE;
9711
- } else if (provider === "adyen") {
9712
- clientKey = clientKey || env.ADYEN_CLIENT_KEY || env.BUAYAR_CLIENT_KEY;
9713
- merchantCode = merchantCode || env.ADYEN_MERCHANT_ACCOUNT || env.BUAYAR_MERCHANT_CODE;
9714
- merchantId = merchantId || env.ADYEN_MERCHANT_ACCOUNT || env.BUAYAR_MERCHANT_ID;
9715
- } else if (provider === "checkoutcom") {
9716
- clientKey = clientKey || env.CHECKOUTCOM_PUBLIC_KEY || env.BUAYAR_CLIENT_KEY;
9717
- merchantCode = merchantCode || env.BUAYAR_MERCHANT_CODE;
9718
- } else if (provider === "razorpay") {
9719
- clientKey = clientKey || env.RAZORPAY_KEY_ID || env.BUAYAR_CLIENT_KEY;
9720
- merchantCode = merchantCode || env.RAZORPAY_KEY_ID || env.BUAYAR_MERCHANT_CODE;
9721
- } else if (provider === "square") {
9722
- clientKey = clientKey || env.SQUARE_APPLICATION_ID || env.BUAYAR_CLIENT_KEY;
9723
- merchantCode = merchantCode || env.SQUARE_APPLICATION_ID || env.BUAYAR_MERCHANT_CODE;
9724
- } else if (provider === "payu") {
9725
- merchantCode = merchantCode || env.PAYU_POS_ID || env.BUAYAR_MERCHANT_CODE;
9726
- merchantId = merchantId || env.PAYU_POS_ID;
9727
- } else if (provider === "braintree") {
9728
- clientKey = clientKey || env.BRAINTREE_PUBLIC_KEY || env.BUAYAR_CLIENT_KEY;
9729
- merchantCode = merchantCode || env.BRAINTREE_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE;
9730
- merchantId = merchantId || env.BRAINTREE_MERCHANT_ID;
9731
- } else if (provider === "twocheckout" || provider === "2checkout") {
9732
- merchantCode = merchantCode || env.TWOCHECKOUT_MERCHANT_CODE || env.BUAYAR_MERCHANT_CODE;
9733
- merchantId = merchantId || env.TWOCHECKOUT_MERCHANT_CODE;
9734
- } else {
9735
- merchantCode = merchantCode || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
9736
- }
9737
- const projectId = customConfig?.projectId || env.BUAYAR_PROJECT_ID || env.PG_PROJECT_ID || env.PROJECT_ID || env.SQUARE_LOCATION_ID;
9738
- 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;
9739
- const privateKey = customConfig?.privateKey || env.BUAYAR_PRIVATE_KEY || env.PG_PRIVATE_KEY || env.PRIVATE_KEY || env.BRAINTREE_PRIVATE_KEY;
9740
- 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;
9935
+ const explicit = (customConfig?.provider || env.PROVIDER_PG || env.PG_PROVIDER || env.BUAYAR_PROVIDER || env.PAYMENT_PROVIDER || "").toLowerCase().trim();
9936
+ let provider = explicit || providerRegistry.detectFromEnv(env) || "midtrans";
9937
+ provider = provider.replace("oyindonesia", "oy").replace("2checkout", "twocheckout");
9938
+ const sandbox = customConfig?.sandbox ?? resolveSandbox(env, provider);
9939
+ const spec = SPECIFIC[provider] || {};
9940
+ const cfg = {};
9941
+ const fields = ["apiKey", "clientKey", "merchantCode", "merchantId", "secretKey", "serverKey", "projectId"];
9942
+ for (const f of fields) {
9943
+ const universalKeys = UNIVERSAL[f] || [];
9944
+ const specificKeys = spec[f] || [];
9945
+ const universal = firstDefined(env, universalKeys);
9946
+ const specific = firstDefined(env, specificKeys);
9947
+ const value = universal || specific;
9948
+ const explicitValue = customConfig?.[f] || customConfig && (f === "apiKey" ? customConfig.secretKey || customConfig.serverKey : void 0);
9949
+ cfg[f] = explicitValue || value || "";
9950
+ }
9741
9951
  const callbackUrl = customConfig?.callbackUrl || env.BUAYAR_CALLBACK_URL || env.PG_CALLBACK_URL || env.PAYMENT_CALLBACK_URL;
9742
9952
  const returnUrl = customConfig?.returnUrl || env.BUAYAR_RETURN_URL || env.PG_RETURN_URL || env.PAYMENT_RETURN_URL;
9953
+ const publicKey = customConfig?.publicKey || firstDefined(env, ["BUAYAR_PUBLIC_KEY", "PG_PUBLIC_KEY", "PUBLIC_KEY"]) || cfg.clientKey;
9954
+ const privateKey = customConfig?.privateKey || firstDefined(env, ["BUAYAR_PRIVATE_KEY", "PG_PRIVATE_KEY", "PRIVATE_KEY"]) || (provider === "braintree" ? cfg.apiKey : void 0);
9743
9955
  const extra = {
9744
9956
  webhookToken: env.XENDIT_WEBHOOK_TOKEN || env.BUAYAR_WEBHOOK_TOKEN,
9745
9957
  webhookSecret: env.STRIPE_WEBHOOK_SECRET || env.CHECKOUTCOM_WEBHOOK_SECRET || env.RAZORPAY_WEBHOOK_SECRET || env.BUAYAR_WEBHOOK_SECRET,
@@ -9760,15 +9972,16 @@ function resolveConfigFromEnv(customConfig) {
9760
9972
  secretWord: env.TWOCHECKOUT_SECRET_WORD,
9761
9973
  ...customConfig?.extra
9762
9974
  };
9975
+ const apiKey = cfg.apiKey || cfg.secretKey || cfg.serverKey;
9763
9976
  return {
9764
- provider: provider === "oyindonesia" ? "oy" : provider === "2checkout" ? "twocheckout" : provider,
9765
- apiKey: apiKey || "",
9977
+ provider,
9978
+ apiKey,
9766
9979
  serverKey: apiKey || "",
9767
- secretKey: secretKey || apiKey || "",
9768
- merchantCode: merchantCode || "",
9769
- clientKey: clientKey || "",
9770
- merchantId: merchantId || "",
9771
- projectId,
9980
+ secretKey: apiKey || "",
9981
+ merchantCode: cfg.merchantCode || "",
9982
+ clientKey: cfg.clientKey || "",
9983
+ merchantId: cfg.merchantId || "",
9984
+ projectId: cfg.projectId || "",
9772
9985
  publicKey,
9773
9986
  privateKey,
9774
9987
  sandbox,
@@ -9782,8 +9995,10 @@ function resolveConfigFromEnv(customConfig) {
9782
9995
  var Buayar = class {
9783
9996
  manager;
9784
9997
  config;
9785
- constructor(config, manager) {
9998
+ registry;
9999
+ constructor(config, manager, registry) {
9786
10000
  this.manager = manager || paymentManager;
10001
+ this.registry = registry || providerRegistry;
9787
10002
  this.config = resolveConfigFromEnv(config);
9788
10003
  }
9789
10004
  /**
@@ -9816,6 +10031,62 @@ var Buayar = class {
9816
10031
  getProvider(name) {
9817
10032
  return this.manager.getProvider(name || this.provider);
9818
10033
  }
10034
+ /**
10035
+ * Daftar nama provider yang terdaftar (bawaan + kustom).
10036
+ */
10037
+ listProviders() {
10038
+ return this.registry.names();
10039
+ }
10040
+ /**
10041
+ * Registrasi metadata provider kustom untuk deteksi & capability.
10042
+ * Contoh: buayar.registerProviderDescriptor({ name, envKeys, methods, operations })
10043
+ */
10044
+ registerProviderDescriptor(desc) {
10045
+ this.registry.register(desc);
10046
+ }
10047
+ /**
10048
+ * Cek capability (metode + operasi) provider tertentu — atau provider aktif bila kosong.
10049
+ * Jawab pertanyaan "provider ini dukung apa?" secara runtime, tanpa bongkar dokumen.
10050
+ */
10051
+ getCapabilities(name) {
10052
+ const n = name || this.provider;
10053
+ const desc = this.registry.get(n);
10054
+ if (!desc) return void 0;
10055
+ return { methods: desc.methods, operations: desc.operations };
10056
+ }
10057
+ /**
10058
+ * Deteksi nama provider dari struktur payload webhook.
10059
+ */
10060
+ detectProviderFromPayload(payload) {
10061
+ return this.registry.detectFromWebhook(payload);
10062
+ }
10063
+ /**
10064
+ * Deteksi nama provider aktif dari variabel lingkungan (kredensial yang terisi).
10065
+ */
10066
+ detectProviderFromEnv(env) {
10067
+ return this.registry.detectFromEnv(env || process.env);
10068
+ }
10069
+ /**
10070
+ * Logika "bisa pakai X dengan provider Y?" — helper untuk portabilitas.
10071
+ */
10072
+ supports(name, operation) {
10073
+ const desc = this.registry.get(name);
10074
+ return desc ? desc.operations[operation] : false;
10075
+ }
10076
+ /**
10077
+ * Daftar metode pembayaran yang benar2 tersedia untuk provider aktif.
10078
+ */
10079
+ getSupportedMethods(name) {
10080
+ const n = name || this.provider;
10081
+ return this.registry.get(n)?.methods || [];
10082
+ }
10083
+ /**
10084
+ * Iterasi CEPAT: apakah provider aktif mendukung method kanonik tertentu?
10085
+ */
10086
+ supportsMethod(method, name) {
10087
+ const n = name || this.provider;
10088
+ return this.registry.get(n)?.methods.includes(method) ?? false;
10089
+ }
9819
10090
  /**
9820
10091
  * Buat transaksi pembayaran baru (Mendukung Semi dan Full Integrasi)
9821
10092
  */
@@ -9890,47 +10161,8 @@ var Buayar = class {
9890
10161
  }
9891
10162
  }
9892
10163
  let providerName = configOverride?.provider || this.provider;
9893
- if (payload) {
9894
- if (payload.signature_key && payload.transaction_status) {
9895
- providerName = "midtrans";
9896
- } else if (payload.merchantCode && payload.merchantOrderId && payload.resultCode) {
9897
- providerName = "duitku";
9898
- } else if (payload.trx_id && (payload.sid || payload.reference_id || payload.via)) {
9899
- providerName = "ipaymu";
9900
- } else if (payload.service?.id || payload.order?.invoice_number && payload.transaction?.status) {
9901
- providerName = "doku";
9902
- } else if (payload.bill_no && (payload.payment_status_code !== void 0 || payload.payment_status_desc)) {
9903
- providerName = "faspay";
9904
- } else if (payload.merchant_id && payload.order_id && payload.payment_status) {
9905
- providerName = "finpay";
9906
- } else if (payload.tXid && payload.merchantToken && (payload.referenceNo || payload.amt)) {
9907
- providerName = "nicepay";
9908
- } else if (payload.partner_tx_id || payload.partner_trx_id) {
9909
- providerName = "oy";
9910
- } else if (payload.merchant_id && payload.order_id && payload.signature) {
9911
- providerName = "prismalink";
9912
- } else if (payload.object === "event" || payload.type && payload.data?.object && payload.api_version) {
9913
- providerName = "stripe";
9914
- } else if (payload.event && payload.payload?.payment?.entity) {
9915
- providerName = "razorpay";
9916
- } else if (payload.external_id || payload.event?.startsWith("payment.") || payload.event?.startsWith("qr.") || payload.data?.reference_id) {
9917
- providerName = "xendit";
9918
- } else if (payload.event_type && payload.resource && (payload.event_type.startsWith("PAYMENT.") || payload.event_type.startsWith("CHECKOUT.ORDER."))) {
9919
- providerName = "paypal";
9920
- } else if (payload.notificationItems || payload.merchantAccountCode && payload.pspReference && payload.eventCode) {
9921
- providerName = "adyen";
9922
- } else if (payload.type && payload.data?._links && (payload.type.startsWith("payment_") || payload.type.startsWith("refund_"))) {
9923
- providerName = "checkoutcom";
9924
- } else if (payload.type && payload.data?.object?.status && payload.merchant_id) {
9925
- providerName = "square";
9926
- } else if (payload.order && payload.order?.status && payload.order?.extOrderId) {
9927
- providerName = "payu";
9928
- } else if (payload.kind && payload.subject?.transaction) {
9929
- providerName = "braintree";
9930
- } else if (payload.HASH && payload.REFNOEXT && payload.IPN_PID) {
9931
- providerName = "twocheckout";
9932
- }
9933
- }
10164
+ const detected = this.registry.detectFromWebhook(payload);
10165
+ if (detected) providerName = detected;
9934
10166
  return this.manager.verifyCallback(providerName, payload, mergedConfig);
9935
10167
  }
9936
10168
  async handleWebhook(payload, headers, configOverride) {
@@ -10072,8 +10304,10 @@ var buayar = new Buayar();
10072
10304
  PayuProvider,
10073
10305
  PrismalinkClient,
10074
10306
  PrismalinkProvider,
10307
+ ProviderRegistry,
10075
10308
  RazorpayClient,
10076
10309
  RazorpayProvider,
10310
+ SnapApiError,
10077
10311
  SnapClient,
10078
10312
  SquareClient,
10079
10313
  SquareProvider,
@@ -10086,6 +10320,7 @@ var buayar = new Buayar();
10086
10320
  buayar,
10087
10321
  buildBraintreeBasicAuth,
10088
10322
  buildCoreChargePayload,
10323
+ buildDefaultDescriptors,
10089
10324
  buildPaypalBasicAuth,
10090
10325
  buildPayuBasicAuth,
10091
10326
  buildRazorpayBasicAuth,
@@ -10110,6 +10345,7 @@ var buayar = new Buayar();
10110
10345
  minifyJson,
10111
10346
  parseCoreChargeResponse,
10112
10347
  paymentManager,
10348
+ providerRegistry,
10113
10349
  resolveConfigFromEnv,
10114
10350
  safeCompare,
10115
10351
  serializePaypalParams,
@@ -10117,6 +10353,7 @@ var buayar = new Buayar();
10117
10353
  sha256,
10118
10354
  sha256Hex,
10119
10355
  sha512,
10356
+ snapErrorHint,
10120
10357
  snapExternalId,
10121
10358
  snapTimestamp,
10122
10359
  snapUtcTimestamp,