payweave 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +272 -0
  3. package/dist/_tsup-dts-rollup.d.ts +19470 -0
  4. package/dist/chunk-4R5OGOCC.js +94 -0
  5. package/dist/chunk-4R5OGOCC.js.map +1 -0
  6. package/dist/chunk-535Q3GUN.js +175 -0
  7. package/dist/chunk-535Q3GUN.js.map +1 -0
  8. package/dist/chunk-67NRYGRC.js +192 -0
  9. package/dist/chunk-67NRYGRC.js.map +1 -0
  10. package/dist/chunk-CGQ73I4I.js +568 -0
  11. package/dist/chunk-CGQ73I4I.js.map +1 -0
  12. package/dist/chunk-CJEYDHY6.js +18 -0
  13. package/dist/chunk-CJEYDHY6.js.map +1 -0
  14. package/dist/chunk-CR63JAAS.js +3 -0
  15. package/dist/chunk-CR63JAAS.js.map +1 -0
  16. package/dist/chunk-E633MKVX.js +1507 -0
  17. package/dist/chunk-E633MKVX.js.map +1 -0
  18. package/dist/chunk-FBPOCXRZ.js +1135 -0
  19. package/dist/chunk-FBPOCXRZ.js.map +1 -0
  20. package/dist/chunk-HTRGMZFH.js +267 -0
  21. package/dist/chunk-HTRGMZFH.js.map +1 -0
  22. package/dist/chunk-IUVGM3K7.js +765 -0
  23. package/dist/chunk-IUVGM3K7.js.map +1 -0
  24. package/dist/chunk-JD4OZHRI.js +326 -0
  25. package/dist/chunk-JD4OZHRI.js.map +1 -0
  26. package/dist/chunk-NV3MZF7L.js +139 -0
  27. package/dist/chunk-NV3MZF7L.js.map +1 -0
  28. package/dist/chunk-NXQBP35U.js +13 -0
  29. package/dist/chunk-NXQBP35U.js.map +1 -0
  30. package/dist/chunk-QJHXDZYC.js +412 -0
  31. package/dist/chunk-QJHXDZYC.js.map +1 -0
  32. package/dist/chunk-TWZK62TZ.js +83 -0
  33. package/dist/chunk-TWZK62TZ.js.map +1 -0
  34. package/dist/cli/index.js +35381 -0
  35. package/dist/core/index.d.ts +85 -0
  36. package/dist/core/index.js +6 -0
  37. package/dist/core/index.js.map +1 -0
  38. package/dist/db/drizzle/index.d.ts +6 -0
  39. package/dist/db/drizzle/index.js +1532 -0
  40. package/dist/db/drizzle/index.js.map +1 -0
  41. package/dist/db/index.d.ts +43 -0
  42. package/dist/db/index.js +3 -0
  43. package/dist/db/index.js.map +1 -0
  44. package/dist/db/mongodb/index.d.ts +3 -0
  45. package/dist/db/mongodb/index.js +934 -0
  46. package/dist/db/mongodb/index.js.map +1 -0
  47. package/dist/db/mysql/index.d.ts +1 -0
  48. package/dist/db/mysql/index.js +12 -0
  49. package/dist/db/mysql/index.js.map +1 -0
  50. package/dist/db/postgres/index.d.ts +5 -0
  51. package/dist/db/postgres/index.js +791 -0
  52. package/dist/db/postgres/index.js.map +1 -0
  53. package/dist/db/prisma/index.d.ts +1 -0
  54. package/dist/db/prisma/index.js +12 -0
  55. package/dist/db/prisma/index.js.map +1 -0
  56. package/dist/db/sqlite/index.d.ts +5 -0
  57. package/dist/db/sqlite/index.js +750 -0
  58. package/dist/db/sqlite/index.js.map +1 -0
  59. package/dist/express/index.d.ts +1 -0
  60. package/dist/express/index.js +3 -0
  61. package/dist/express/index.js.map +1 -0
  62. package/dist/fastify/index.d.ts +1 -0
  63. package/dist/fastify/index.js +3 -0
  64. package/dist/fastify/index.js.map +1 -0
  65. package/dist/flutterwave/index.d.ts +27 -0
  66. package/dist/flutterwave/index.js +9 -0
  67. package/dist/flutterwave/index.js.map +1 -0
  68. package/dist/index.d.ts +85 -0
  69. package/dist/index.js +3677 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/next/index.d.ts +1 -0
  72. package/dist/next/index.js +3 -0
  73. package/dist/next/index.js.map +1 -0
  74. package/dist/paystack/index.d.ts +33 -0
  75. package/dist/paystack/index.js +9 -0
  76. package/dist/paystack/index.js.map +1 -0
  77. package/dist/products/index.d.ts +22 -0
  78. package/dist/products/index.js +7 -0
  79. package/dist/products/index.js.map +1 -0
  80. package/dist/testing/index.d.ts +11 -0
  81. package/dist/testing/index.js +69 -0
  82. package/dist/testing/index.js.map +1 -0
  83. package/dist/unified/index.d.ts +41 -0
  84. package/dist/unified/index.js +6 -0
  85. package/dist/unified/index.js.map +1 -0
  86. package/dist/webhooks/index.d.ts +8 -0
  87. package/dist/webhooks/index.js +8 -0
  88. package/dist/webhooks/index.js.map +1 -0
  89. package/package.json +164 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/flutterwave/v3/shared.ts","../src/flutterwave/v3/schemas/payments.ts","../src/flutterwave/v3/resources/payments.ts","../src/flutterwave/v3/schemas/transactions.ts","../src/flutterwave/v3/resources/transactions.ts","../src/flutterwave/v3/schemas/banks.ts","../src/flutterwave/v3/resources/banks.ts","../src/flutterwave/v3/schemas/refunds.ts","../src/flutterwave/v3/resources/refunds.ts","../src/flutterwave/v3/encrypt.ts","../src/flutterwave/v3/schemas/charges.ts","../src/flutterwave/v3/resources/charges.ts","../src/flutterwave/v3/schemas/transfers.ts","../src/flutterwave/v3/resources/transfers.ts","../src/flutterwave/v3/resources/beneficiaries.ts","../src/flutterwave/client.ts"],"names":["z"],"mappings":"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","file":"chunk-FBPOCXRZ.js","sourcesContent":["/**\n * Shared Flutterwave **v3** schema primitives (envelope, pagination, metadata,\n * request-parse helper). Version-isolated per AGENTS.md §11 / TDD §11: these are\n * NEVER shared with v4 — v4 uses a different envelope + pagination shape.\n *\n * Flutterwave v3 wraps every response in\n * `{ status: \"success\" | \"error\", message: string, data: ... }`\n * where `status` is a STRING (provider-reference §5.5 — do NOT reuse Paystack's\n * boolean-`status` envelope here). Response schemas are LOOSE\n * ({@link https://zod.dev | zod `looseObject`}) so unknown provider fields pass\n * straight through — drift is logged by the HttpClient, never thrown.\n */\nimport { z } from \"zod\";\nimport { PayweaveValidationError } from \"../../core/errors\";\n\n/**\n * Parse request input with a Zod schema, converting a {@link z.ZodError} into a\n * {@link PayweaveValidationError} so public methods only ever throw a\n * `PayweaveError` subclass. Runs BEFORE any network call.\n */\nexport function parseRequest<S extends z.ZodType>(schema: S, input: unknown): z.infer<S> {\n try {\n return schema.parse(input) as z.infer<S>;\n } catch (err) {\n if (err instanceof z.ZodError) {\n const detail = err.issues\n .map((i) => `${i.path.join(\".\") || \"(root)\"}: ${i.message}`)\n .join(\"; \");\n throw new PayweaveValidationError(`flutterwave request validation failed — ${detail}`, {\n provider: \"flutterwave\",\n cause: err,\n });\n }\n throw err;\n }\n}\n\n/**\n * Wrap a `data` schema in Flutterwave v3's standard response envelope.\n * `status` is the STRING `\"success\"`/`\"error\"` (quirk §5.5) — not a boolean.\n */\nexport const flwEnvelope = <T extends z.ZodTypeAny>(\n data: T,\n): z.ZodType<{ status: string; message: string; data: z.infer<T> }> =>\n z.looseObject({\n status: z.string(),\n message: z.string(),\n data,\n }) as unknown as z.ZodType<{ status: string; message: string; data: z.infer<T> }>;\n\n/**\n * Flutterwave v3 pagination block. List endpoints return\n * `meta: { page_info: { total, current_page, total_pages } }`\n * (provider-reference §1). Loose + string|number tolerant by response policy.\n */\nexport const pageInfo = z.looseObject({\n total: z.union([z.number(), z.string()]).optional(),\n current_page: z.union([z.number(), z.string()]).optional(),\n total_pages: z.union([z.number(), z.string()]).optional(),\n});\nexport type PageInfo = z.infer<typeof pageInfo>;\n\n/** The `meta` block on a v3 list response. */\nexport const listMeta = z.looseObject({\n page_info: pageInfo.optional(),\n});\nexport type ListMeta = z.infer<typeof listMeta>;\n\n/** Envelope for v3 list endpoints: `data` is an array plus a `meta.page_info`. */\nexport const flwListEnvelope = <T extends z.ZodTypeAny>(\n item: T,\n): z.ZodType<{\n status: string;\n message: string;\n data: z.infer<T>[];\n meta?: ListMeta;\n}> =>\n z.looseObject({\n status: z.string(),\n message: z.string(),\n data: z.array(item),\n meta: listMeta.optional(),\n }) as unknown as z.ZodType<{\n status: string;\n message: string;\n data: z.infer<T>[];\n meta?: ListMeta;\n }>;\n\n/**\n * Flutterwave `meta` on a request is free-form merchant metadata (an object of\n * custom key/values). The SDK always sends an object.\n */\nexport const metaSchema = z.record(z.string(), z.unknown());\n\n/** Coerce a possibly-string pagination number to a number (or undefined). */\nexport function metaNumber(value: number | string | undefined): number | undefined {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.trim() !== \"\") {\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\n","/**\n * Zod schemas for the Flutterwave v3 Standard Payments module. Request fields\n * are sourced verbatim from the official v3 reference (version selector pinned\n * to v3.0.0):\n * - Create payment (Standard): https://developer.flutterwave.com/v3.0.0/reference/standard\n *\n * Amounts are in MAJOR units (naira) — Surface A passes them through unchanged\n * (provider-reference §1); the unified layer owns minor↔major conversion later.\n */\nimport { z } from \"zod\";\nimport { metaSchema } from \"../shared\";\n\n/** Customer block on a Standard payment. `email` is required by Flutterwave. */\nexport const paymentCustomer = z.object({\n email: z.string(),\n name: z.string().optional(),\n phonenumber: z.string().optional(),\n});\n\n/** Checkout customizations (branding on the hosted page). */\nexport const paymentCustomizations = z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n logo: z.string().optional(),\n});\n\n/** A subaccount split entry. Shape kept loose beyond the documented keys. */\nexport const paymentSubaccount = z.looseObject({\n id: z.string(),\n transaction_split_ratio: z.number().optional(),\n transaction_charge_type: z.string().optional(),\n transaction_charge: z.number().optional(),\n});\n\n/** POST /payments — request (Standard hosted checkout). */\nexport const createPaymentReq = z.object({\n /** Your unique transaction reference. Required. */\n tx_ref: z.string(),\n /** Amount in MAJOR units (e.g. 5000 = ₦5,000). Passed through unchanged. */\n amount: z.union([z.number(), z.string()]),\n /** ISO currency, e.g. \"NGN\". Defaults to NGN on Flutterwave's side if omitted. */\n currency: z.string().optional(),\n /** URL Flutterwave redirects to after payment. */\n redirect_url: z.string().optional(),\n customer: paymentCustomer,\n /** Comma-separated payment methods, e.g. \"card,banktransfer,ussd\". */\n payment_options: z.string().optional(),\n customizations: paymentCustomizations.optional(),\n /** Existing payment-plan id to subscribe the customer to. */\n payment_plan: z.union([z.string(), z.number()]).optional(),\n subaccounts: z.array(paymentSubaccount).optional(),\n meta: metaSchema.optional(),\n /** Checkout session lifetime in minutes. */\n session_duration: z.number().optional(),\n /** Max number of retries allowed on the checkout. */\n max_retry_attempt: z.number().optional(),\n});\nexport type CreatePaymentReq = z.input<typeof createPaymentReq>;\n\n/**\n * POST /payments — response data. The hosted checkout URL lives at `data.link`.\n * Loose: only the stable documented field is pinned.\n */\nexport const paymentInitData = z.looseObject({\n link: z.string(),\n});\n","/**\n * Flutterwave v3 Standard Payments resource (Surface A). Validates input with a\n * request schema (throws {@link PayweaveValidationError} before the network\n * call) and passes a loose response schema to the HttpClient (drift logged,\n * never thrown). Amounts are MAJOR units (naira), passed through unchanged.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/standard\n */\nimport type { HttpClient } from \"../../../core/http\";\nimport { parseRequest, flwEnvelope } from \"../shared\";\nimport {\n createPaymentReq,\n paymentInitData,\n type CreatePaymentReq,\n} from \"../schemas/payments\";\n\nconst paymentInitRes = flwEnvelope(paymentInitData);\n\nexport class Payments {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a Standard payment and get a hosted checkout link. `amount` is in\n * MAJOR units (e.g. `5000` = ₦5,000) and is sent to Flutterwave unchanged\n * (Surface A). The checkout URL is returned at `data.link`.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/standard\n *\n * @example\n * const res = await fw.flutterwave.payments.create({\n * tx_ref: \"pwv_tx_001\",\n * amount: 5000, // ₦5,000 in major units\n * currency: \"NGN\",\n * redirect_url: \"https://example.com/callback\",\n * customer: { email: \"buyer@example.com\" },\n * });\n * console.log(res.data.link);\n */\n async create(input: CreatePaymentReq) {\n const body = parseRequest(createPaymentReq, input);\n return this.http.request({\n method: \"POST\",\n path: \"/payments\",\n body,\n schema: paymentInitRes,\n });\n }\n}\n","/**\n * Zod schemas for the Flutterwave v3 Transactions module. Request fields sourced\n * verbatim from the official v3 reference (version selector pinned to v3.0.0):\n * - Verify by id: https://developer.flutterwave.com/v3.0.0/reference/verify-transaction\n * - Verify by reference: https://developer.flutterwave.com/v3.0.0/reference/verify-transaction-by-tx_ref\n * - List: https://developer.flutterwave.com/v3.0.0/reference/list-transactions\n * - Fees: https://developer.flutterwave.com/v3.0.0/reference/get-transaction-fees\n *\n * Amounts are MAJOR units and pass through unchanged (Surface A).\n */\nimport { z } from \"zod\";\n\n/**\n * A Flutterwave v3 transaction object (verify/list). Loose: only the stable,\n * documented top-level fields are named; everything else passes through.\n */\nexport const transaction = z.looseObject({\n id: z.number(),\n tx_ref: z.string().nullable().optional(),\n flw_ref: z.string().nullable().optional(),\n device_fingerprint: z.string().nullable().optional(),\n amount: z.number().optional(),\n currency: z.string().optional(),\n charged_amount: z.number().optional(),\n app_fee: z.number().optional(),\n merchant_fee: z.number().optional(),\n processor_response: z.string().nullable().optional(),\n auth_model: z.string().nullable().optional(),\n ip: z.string().nullable().optional(),\n narration: z.string().nullable().optional(),\n /** Flutterwave transaction status, e.g. \"successful\" | \"failed\" | \"pending\". */\n status: z.string().optional(),\n payment_type: z.string().nullable().optional(),\n created_at: z.string().optional(),\n account_id: z.number().optional(),\n amount_settled: z.number().optional(),\n customer: z.looseObject({}).optional(),\n card: z.looseObject({}).optional(),\n meta: z.unknown().optional(),\n});\n\n/** GET /transactions — query params. */\nexport const listQuery = z.object({\n from: z.string().optional(),\n to: z.string().optional(),\n page: z.number().int().positive().optional(),\n customer_email: z.string().optional(),\n status: z.string().optional(),\n tx_ref: z.string().optional(),\n currency: z.string().optional(),\n amount: z.union([z.number(), z.string()]).optional(),\n});\nexport type ListQuery = z.input<typeof listQuery>;\n\n/** GET /transactions/fee — query params. `amount` is MAJOR units. */\nexport const feesQuery = z.object({\n amount: z.union([z.number(), z.string()]),\n currency: z.string().optional(),\n /** e.g. \"card\", \"account\", \"ussd\" — the charge type the fee is quoted for. */\n ptype: z.string().optional(),\n});\nexport type FeesQuery = z.input<typeof feesQuery>;\n\n/** GET /transactions/fee — response data (loose). */\nexport const feeData = z.looseObject({\n charge_amount: z.number().optional(),\n fee: z.number().optional(),\n merchant_fee: z.number().optional(),\n flutterwave_fee: z.number().optional(),\n stamp_duty_fee: z.number().optional(),\n currency: z.string().optional(),\n});\n","/**\n * Flutterwave v3 Transactions resource (Surface A). Verify by numeric id vs by\n * `tx_ref` are SEPARATE endpoints (provider-reference §5.2). Amounts are MAJOR\n * units, passed through unchanged.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/verify-transaction\n */\nimport { z } from \"zod\";\nimport type { HttpClient } from \"../../../core/http\";\nimport { parseRequest, flwEnvelope, flwListEnvelope, metaNumber } from \"../shared\";\nimport {\n feeData,\n feesQuery,\n listQuery,\n transaction,\n type FeesQuery,\n type ListQuery,\n} from \"../schemas/transactions\";\n\nconst transactionRes = flwEnvelope(transaction);\nconst transactionListRes = flwListEnvelope(transaction);\nconst feeRes = flwEnvelope(feeData);\n\nexport class Transactions {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Verify a transaction by its numeric Flutterwave id (NOT `tx_ref` — use\n * {@link verifyByReference} for that). A 404 for an unknown id surfaces as\n * {@link PayweaveNotFoundError}.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/verify-transaction\n *\n * @example\n * const res = await fw.flutterwave.transactions.verify(288200108);\n * if (res.data.status === \"successful\") { }\n */\n async verify(id: number | string) {\n return this.http.request({\n method: \"GET\",\n path: `/transactions/${encodeURIComponent(String(id))}/verify`,\n schema: transactionRes,\n });\n }\n\n /**\n * Verify a transaction by your `tx_ref` (the reference you supplied at\n * checkout). This is a distinct endpoint from verify-by-id.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/verify-transaction-by-tx_ref\n *\n * @example\n * const res = await fw.flutterwave.transactions.verifyByReference(\"pwv_tx_001\");\n */\n async verifyByReference(txRef: string) {\n const tx_ref = parseRequest(z.string().min(1), txRef);\n return this.http.request({\n method: \"GET\",\n path: \"/transactions/verify_by_reference\",\n query: { tx_ref },\n schema: transactionRes,\n });\n }\n\n /**\n * List transactions on the account.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/list-transactions\n *\n * @example\n * const page = await fw.flutterwave.transactions.list({ status: \"successful\" });\n */\n async list(query: ListQuery = {}) {\n const q = parseRequest(listQuery, query);\n return this.http.request({\n method: \"GET\",\n path: \"/transactions\",\n query: q,\n schema: transactionListRes,\n });\n }\n\n /**\n * Async iterator over ALL transactions matching `query`, transparently walking\n * every page via `meta.page_info.total_pages`.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/list-transactions\n *\n * @example\n * for await (const tx of fw.flutterwave.transactions.iterate({ status: \"successful\" })) {\n * console.log(tx.id);\n * }\n */\n async *iterate(query: ListQuery = {}) {\n const base = parseRequest(listQuery, query);\n let page = base.page ?? 1;\n for (;;) {\n const res = await this.http.request({\n method: \"GET\",\n path: \"/transactions\",\n query: { ...base, page },\n schema: transactionListRes,\n });\n for (const tx of res.data) yield tx;\n const totalPages = metaNumber(res.meta?.page_info?.total_pages);\n if (totalPages !== undefined) {\n if (page >= totalPages) return;\n } else if (res.data.length === 0) {\n return;\n }\n page += 1;\n }\n }\n\n /**\n * Get the fee Flutterwave would charge for an amount. `amount` is MAJOR units.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/get-transaction-fees\n *\n * @example\n * const res = await fw.flutterwave.transactions.fees({ amount: 5000, currency: \"NGN\" });\n */\n async fees(query: FeesQuery) {\n const q = parseRequest(feesQuery, query);\n return this.http.request({\n method: \"GET\",\n path: \"/transactions/fee\",\n query: q,\n schema: feeRes,\n });\n }\n}\n","/**\n * Zod schemas for the Flutterwave v3 Banks + account-resolution module. Fields\n * sourced verbatim from the official v3 reference (version selector v3.0.0):\n * - Banks by country: https://developer.flutterwave.com/v3.0.0/reference/get-all-banks\n * - Bank branches: https://developer.flutterwave.com/v3.0.0/reference/get-bank-branches\n * - Resolve account: https://developer.flutterwave.com/v3.0.0/reference/resolve-account-details\n */\nimport { z } from \"zod\";\n\n/** A bank object as returned by `GET /banks/:country` (loose). */\nexport const bank = z.looseObject({\n id: z.number().optional(),\n code: z.string().optional(),\n name: z.string().optional(),\n});\n\n/** A bank branch as returned by `GET /banks/:id/branches` (loose). */\nexport const bankBranch = z.looseObject({\n id: z.number().optional(),\n branch_code: z.string().optional(),\n branch_name: z.string().optional(),\n swift_code: z.string().nullable().optional(),\n bic: z.string().nullable().optional(),\n bank_id: z.number().optional(),\n});\n\n/** POST /accounts/resolve — request body. */\nexport const resolveAccountReq = z.object({\n account_number: z.string(),\n /** The bank code (from `GET /banks/:country`). */\n account_bank: z.string(),\n});\nexport type ResolveAccountReq = z.input<typeof resolveAccountReq>;\n\n/** POST /accounts/resolve — response data (loose). */\nexport const resolvedAccount = z.looseObject({\n account_number: z.string().optional(),\n account_name: z.string().optional(),\n});\n","/**\n * Flutterwave v3 Banks + account-resolution resource (Surface A). Feeds the\n * unified banks layer later.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/get-all-banks\n */\nimport { z } from \"zod\";\nimport type { HttpClient } from \"../../../core/http\";\nimport { parseRequest, flwEnvelope } from \"../shared\";\nimport {\n bank,\n bankBranch,\n resolveAccountReq,\n resolvedAccount,\n type ResolveAccountReq,\n} from \"../schemas/banks\";\n\nconst bankListRes = flwEnvelope(z.array(bank));\nconst branchListRes = flwEnvelope(z.array(bankBranch));\nconst resolveRes = flwEnvelope(resolvedAccount);\n\nexport class Banks {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List the banks Flutterwave supports for a country (ISO-2 code, e.g. \"NG\").\n * `data` is a flat array (no pagination on this endpoint).\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/get-all-banks\n *\n * @example\n * const res = await fw.flutterwave.banks.list(\"NG\");\n * console.log(res.data[0].code);\n */\n async list(country: string) {\n const value = parseRequest(z.string().min(1), country);\n return this.http.request({\n method: \"GET\",\n path: `/banks/${encodeURIComponent(value)}`,\n schema: bankListRes,\n });\n }\n\n /**\n * List branches for a bank by its Flutterwave bank id.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/get-bank-branches\n *\n * @example\n * const res = await fw.flutterwave.banks.branches(280);\n */\n async branches(bankId: number | string) {\n return this.http.request({\n method: \"GET\",\n path: `/banks/${encodeURIComponent(String(bankId))}/branches`,\n schema: branchListRes,\n });\n }\n\n /**\n * Resolve a bank account number to its account holder name.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/resolve-account-details\n *\n * @example\n * const res = await fw.flutterwave.banks.resolveAccount({\n * account_number: \"0690000040\",\n * account_bank: \"044\",\n * });\n * console.log(res.data.account_name);\n */\n async resolveAccount(input: ResolveAccountReq) {\n const body = parseRequest(resolveAccountReq, input);\n return this.http.request({\n method: \"POST\",\n path: \"/accounts/resolve\",\n body,\n schema: resolveRes,\n });\n }\n}\n","/**\n * Zod schemas for the Flutterwave v3 Refunds module. Fields sourced verbatim\n * from the official v3 reference (version selector v3.0.0):\n * - Create refund: https://developer.flutterwave.com/v3.0.0/reference/refund-a-transaction\n * - List refunds: https://developer.flutterwave.com/v3.0.0/reference/get-all-refunds\n * - Fetch refund: https://developer.flutterwave.com/v3.0.0/reference/get-a-refund\n *\n * Amounts are MAJOR units (Surface A) and pass through unchanged.\n */\nimport { z } from \"zod\";\n\n/** POST /transactions/:id/refund — request body. Omit `amount` to refund fully. */\nexport const createRefundReq = z.object({\n /** Amount to refund in MAJOR units. Omit for a full refund. */\n amount: z.union([z.number(), z.string()]).optional(),\n});\nexport type CreateRefundReq = z.input<typeof createRefundReq>;\n\n/** GET /refunds — query params. */\nexport const listRefundsQuery = z.object({\n from: z.string().optional(),\n to: z.string().optional(),\n page: z.number().int().positive().optional(),\n status: z.string().optional(),\n});\nexport type ListRefundsQuery = z.input<typeof listRefundsQuery>;\n\n/** A refund object (loose). */\nexport const refund = z.looseObject({\n id: z.number().optional(),\n account_id: z.number().optional(),\n tx_id: z.number().optional(),\n flw_ref: z.string().nullable().optional(),\n amount_refunded: z.number().optional(),\n status: z.string().optional(),\n destination: z.string().nullable().optional(),\n meta: z.unknown().optional(),\n created_at: z.string().optional(),\n});\n","/**\n * Flutterwave v3 Refunds resource (Surface A). A refund is created against a\n * transaction id (`POST /transactions/:id/refund`); listing/fetching use the\n * top-level `/refunds` collection. Amounts are MAJOR units, passed through.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/refund-a-transaction\n */\nimport type { HttpClient } from \"../../../core/http\";\nimport { parseRequest, flwEnvelope, flwListEnvelope, metaNumber } from \"../shared\";\nimport {\n createRefundReq,\n listRefundsQuery,\n refund,\n type CreateRefundReq,\n type ListRefundsQuery,\n} from \"../schemas/refunds\";\n\nconst refundRes = flwEnvelope(refund);\nconst refundListRes = flwListEnvelope(refund);\n\nexport class Refunds {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Refund a transaction by its numeric id. Omit `amount` to refund in full;\n * `amount` (when given) is MAJOR units, passed through unchanged.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/refund-a-transaction\n *\n * @example\n * const res = await fw.flutterwave.refunds.create(288200108, { amount: 1000 });\n */\n async create(transactionId: number | string, input: CreateRefundReq = {}) {\n const body = parseRequest(createRefundReq, input);\n return this.http.request({\n method: \"POST\",\n path: `/transactions/${encodeURIComponent(String(transactionId))}/refund`,\n body,\n schema: refundRes,\n });\n }\n\n /**\n * List refunds on the account.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/get-all-refunds\n *\n * @example\n * const page = await fw.flutterwave.refunds.list({ status: \"completed\" });\n */\n async list(query: ListRefundsQuery = {}) {\n const q = parseRequest(listRefundsQuery, query);\n return this.http.request({\n method: \"GET\",\n path: \"/refunds\",\n query: q,\n schema: refundListRes,\n });\n }\n\n /**\n * Async iterator over ALL refunds matching `query`, walking every page via\n * `meta.page_info.total_pages`.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/get-all-refunds\n *\n * @example\n * for await (const r of fw.flutterwave.refunds.iterate()) console.log(r.id);\n */\n async *iterate(query: ListRefundsQuery = {}) {\n const base = parseRequest(listRefundsQuery, query);\n let page = base.page ?? 1;\n for (;;) {\n const res = await this.http.request({\n method: \"GET\",\n path: \"/refunds\",\n query: { ...base, page },\n schema: refundListRes,\n });\n for (const r of res.data) yield r;\n const totalPages = metaNumber(res.meta?.page_info?.total_pages);\n if (totalPages !== undefined) {\n if (page >= totalPages) return;\n } else if (res.data.length === 0) {\n return;\n }\n page += 1;\n }\n }\n\n /**\n * Fetch a single refund by its id.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/get-a-refund\n *\n * @example\n * const res = await fw.flutterwave.refunds.fetch(15221);\n */\n async fetch(refundId: number | string) {\n return this.http.request({\n method: \"GET\",\n path: `/refunds/${encodeURIComponent(String(refundId))}`,\n schema: refundRes,\n });\n }\n}\n","/**\n * Flutterwave **v3** card-payload encryption (TDD §11, provider-reference §5.3).\n *\n * Card charges (`POST /charges?type=card`) require the JSON payload to be\n * encrypted with the account's **Encryption Key** using 3DES-EDE3 in ECB mode,\n * base64-encoded, and sent as `{ client: <ciphertext> }`. This module is the\n * SINGLE place that touches plaintext card data — isolate it, never log the\n * plaintext, and never widen its surface.\n *\n * Algorithm: `des-ede3` (Triple DES, EDE3, ECB — no IV), PKCS#7 padding (Node's\n * default), base64 output. The Encryption Key from the Flutterwave dashboard is\n * a 24-character string used directly as the 24-byte key.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/docs/integration-guides/encryption\n */\nimport { createCipheriv, createDecipheriv } from \"node:crypto\";\nimport { PayweaveConfigError } from \"../../core/errors\";\n\n/**\n * Encrypt a card-charge payload with the Flutterwave v3 Encryption Key.\n *\n * @param encryptionKey - The 24-char dashboard Encryption Key (NOT the secret\n * API key). 3DES-EDE3 requires a 24-byte key.\n * @param payload - The plaintext charge object (card number, cvv, expiry, …).\n * @returns The base64 ciphertext to send as `{ client: <ciphertext> }`.\n *\n * ⚠️ Never log `payload` or its stringified form — it carries raw PAN/CVV.\n */\nexport function encryptCharge(encryptionKey: string, payload: unknown): string {\n const key = toKey(encryptionKey);\n const plaintext = JSON.stringify(payload);\n // ECB mode uses no IV — pass `null`. Node applies PKCS#7 padding by default.\n const cipher = createCipheriv(\"des-ede3\", key, null);\n const encrypted = Buffer.concat([cipher.update(plaintext, \"utf8\"), cipher.final()]);\n return encrypted.toString(\"base64\");\n}\n\n/**\n * Decrypt a Flutterwave v3 ciphertext back to its JSON payload. Provided so the\n * encrypt step can be round-trip unit-tested; not used on the request path.\n */\nexport function decryptCharge(encryptionKey: string, ciphertext: string): unknown {\n const key = toKey(encryptionKey);\n const decipher = createDecipheriv(\"des-ede3\", key, null);\n const decrypted = Buffer.concat([\n decipher.update(Buffer.from(ciphertext, \"base64\")),\n decipher.final(),\n ]);\n return JSON.parse(decrypted.toString(\"utf8\")) as unknown;\n}\n\n/**\n * Coerce the dashboard Encryption Key to the 24-byte buffer `des-ede3` needs.\n * A 24-char ASCII key maps 1:1 to 24 bytes. Reject an obviously-wrong length\n * with a config error rather than letting `node:crypto` throw an opaque one.\n */\nfunction toKey(encryptionKey: string): Buffer {\n const key = Buffer.from(encryptionKey, \"utf8\");\n if (key.length !== 24) {\n throw new PayweaveConfigError(\n \"Flutterwave v3 encryptionKey must be the 24-character dashboard Encryption Key (3DES needs a 24-byte key).\",\n { provider: \"flutterwave\" },\n );\n }\n return key;\n}\n","/**\n * Zod schemas for the Flutterwave v3 direct-charge module (`POST /charges` with\n * a `?type=` selector) plus `POST /validate-charge`. Fields sourced verbatim\n * from the official v3 reference (version selector v3.0.0):\n * - Card charge: https://developer.flutterwave.com/v3.0.0/reference/initiate-a-card-charge\n * - Bank transfer: https://developer.flutterwave.com/v3.0.0/reference/initiate-a-bank-transfer-charge\n * - USSD: https://developer.flutterwave.com/v3.0.0/reference/initiate-a-ussd-charge\n * - NG account debit: https://developer.flutterwave.com/v3.0.0/reference/initiate-a-nigeria-bank-account-charge\n * - Validate charge: https://developer.flutterwave.com/v3.0.0/reference/validate-a-charge\n *\n * Amounts are MAJOR units (Surface A). The card payload is encrypted (3DES) and\n * sent as `{ client }` — see `../encrypt`; plaintext is NEVER logged.\n */\nimport { z } from \"zod\";\nimport { metaSchema } from \"../shared\";\n\n/**\n * Card-charge plaintext payload (encrypted before it leaves the process). Card\n * PAN/CVV/expiry live here — this object must never be logged.\n */\nexport const cardChargeReq = z.object({\n card_number: z.string(),\n cvv: z.string(),\n expiry_month: z.string(),\n expiry_year: z.string(),\n currency: z.string(),\n /** Amount in MAJOR units. Passed through unchanged. */\n amount: z.union([z.number(), z.string()]),\n email: z.string(),\n tx_ref: z.string(),\n fullname: z.string().optional(),\n phone_number: z.string().optional(),\n /** Required only for the AVS/NoAuth authorization flows. */\n redirect_url: z.string().optional(),\n /** 3DS / AVS / PIN authorization sub-object (validated loosely). */\n authorization: z.looseObject({}).optional(),\n preauthorize: z.boolean().optional(),\n meta: metaSchema.optional(),\n});\nexport type CardChargeReq = z.input<typeof cardChargeReq>;\n\n/** POST /charges?type=bank_transfer — request body. */\nexport const bankTransferChargeReq = z.object({\n tx_ref: z.string(),\n amount: z.union([z.number(), z.string()]),\n email: z.string(),\n currency: z.string().optional(),\n fullname: z.string().optional(),\n phone_number: z.string().optional(),\n /** Whether the generated account/number is reusable (permanent). */\n is_permanent: z.boolean().optional(),\n narration: z.string().optional(),\n meta: metaSchema.optional(),\n});\nexport type BankTransferChargeReq = z.input<typeof bankTransferChargeReq>;\n\n/** POST /charges?type=ussd — request body. */\nexport const ussdChargeReq = z.object({\n tx_ref: z.string(),\n /** Bank code for the USSD-supported bank, e.g. \"057\". */\n account_bank: z.string(),\n amount: z.union([z.number(), z.string()]),\n email: z.string(),\n currency: z.string().optional(),\n fullname: z.string().optional(),\n phone_number: z.string().optional(),\n meta: metaSchema.optional(),\n});\nexport type UssdChargeReq = z.input<typeof ussdChargeReq>;\n\n/** POST /charges?type=debit_ng_account — request body. */\nexport const ngAccountChargeReq = z.object({\n tx_ref: z.string(),\n amount: z.union([z.number(), z.string()]),\n account_bank: z.string(),\n account_number: z.string(),\n email: z.string(),\n currency: z.string().optional(),\n fullname: z.string().optional(),\n phone_number: z.string().optional(),\n /** BVN — required by some banks for the NG account-debit flow. */\n bvn: z.string().optional(),\n meta: metaSchema.optional(),\n});\nexport type NgAccountChargeReq = z.input<typeof ngAccountChargeReq>;\n\n/**\n * POST /validate-charge — request body (OTP/PIN follow-up). `type` names the\n * charge method being validated, e.g. \"card\" | \"account\" | \"ussd\".\n */\nexport const validateChargeReq = z.object({\n otp: z.string(),\n /** The transaction's `flw_ref` from the initial charge response. */\n flw_ref: z.string(),\n type: z.string().optional(),\n});\nexport type ValidateChargeReq = z.input<typeof validateChargeReq>;\n\n/** A charge/validate response `data` object (loose — mirrors a transaction). */\nexport const chargeData = z.looseObject({\n id: z.number().optional(),\n tx_ref: z.string().nullable().optional(),\n flw_ref: z.string().nullable().optional(),\n amount: z.number().optional(),\n currency: z.string().optional(),\n status: z.string().optional(),\n payment_type: z.string().nullable().optional(),\n processor_response: z.string().nullable().optional(),\n auth_model: z.string().nullable().optional(),\n created_at: z.string().optional(),\n customer: z.looseObject({}).optional(),\n meta: z.unknown().optional(),\n});\n","/**\n * Flutterwave v3 direct-charge resource (Surface A): card (3DES-encrypted),\n * bank transfer, USSD, NG account debit, and the OTP/PIN `validate-charge`\n * follow-up. All go to `POST /charges?type=...` except validate.\n *\n * The card path encrypts its plaintext payload via `../encrypt` and sends only\n * `{ client }`. Plaintext card data NEVER touches the logger (the HttpClient\n * only sees the ciphertext).\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/initiate-a-card-charge\n */\nimport type { HttpClient } from \"../../../core/http\";\nimport { PayweaveConfigError } from \"../../../core/errors\";\nimport { encryptCharge } from \"../encrypt\";\nimport { parseRequest, flwEnvelope } from \"../shared\";\nimport {\n bankTransferChargeReq,\n cardChargeReq,\n chargeData,\n ngAccountChargeReq,\n ussdChargeReq,\n validateChargeReq,\n type BankTransferChargeReq,\n type CardChargeReq,\n type NgAccountChargeReq,\n type UssdChargeReq,\n type ValidateChargeReq,\n} from \"../schemas/charges\";\n\nconst chargeRes = flwEnvelope(chargeData);\n\n/** Per-call overrides for a card charge. */\nexport interface CardChargeOptions {\n /**\n * The dashboard Encryption Key to use for this charge. Overrides the key\n * threaded via the client. Required when the client wasn't given one.\n */\n encryptionKey?: string;\n}\n\nexport class Charges {\n /**\n * @param http - Shared HTTP client.\n * @param encryptionKey - The account Encryption Key (from resolved config).\n * May be `undefined` if not configured; `card()` then requires a per-call\n * `encryptionKey` override or throws {@link PayweaveConfigError}.\n */\n constructor(\n private readonly http: HttpClient,\n private readonly encryptionKey?: string,\n ) {}\n\n /**\n * Charge a card. The payload is 3DES-EDE3-ECB encrypted with the account\n * Encryption Key and sent as `{ client }` (provider-reference §5.3). `amount`\n * is MAJOR units, passed through unchanged. A successful charge that needs\n * OTP/PIN returns a `flw_ref` — pass it to {@link validate}.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/initiate-a-card-charge\n *\n * @example\n * const res = await fw.flutterwave.charges.card({\n * card_number: \"5531886652142950\", cvv: \"564\",\n * expiry_month: \"09\", expiry_year: \"32\", currency: \"NGN\",\n * amount: 1000, email: \"buyer@example.com\", tx_ref: \"pwv_tx_001\",\n * });\n */\n async card(input: CardChargeReq, opts: CardChargeOptions = {}) {\n const payload = parseRequest(cardChargeReq, input);\n const key = opts.encryptionKey ?? this.encryptionKey;\n if (!key) {\n throw new PayweaveConfigError(\n \"Flutterwave card charge requires an Encryption Key. Set `encryptionKey` in the SDK config or pass it as the second argument.\",\n { provider: \"flutterwave\" },\n );\n }\n // Encrypt in-process; only the ciphertext leaves here → plaintext is never logged.\n const client = encryptCharge(key, payload);\n return this.http.request({\n method: \"POST\",\n path: \"/charges\",\n query: { type: \"card\" },\n body: { client },\n schema: chargeRes,\n });\n }\n\n /**\n * Initiate a bank-transfer (pay-with-transfer) charge. `amount` is MAJOR units.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/initiate-a-bank-transfer-charge\n *\n * @example\n * const res = await fw.flutterwave.charges.bankTransfer({\n * tx_ref: \"pwv_tx_002\", amount: 5000, email: \"buyer@example.com\", currency: \"NGN\",\n * });\n */\n async bankTransfer(input: BankTransferChargeReq) {\n const body = parseRequest(bankTransferChargeReq, input);\n return this.http.request({\n method: \"POST\",\n path: \"/charges\",\n query: { type: \"bank_transfer\" },\n body,\n schema: chargeRes,\n });\n }\n\n /**\n * Initiate a USSD charge. `amount` is MAJOR units.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/initiate-a-ussd-charge\n *\n * @example\n * const res = await fw.flutterwave.charges.ussd({\n * tx_ref: \"pwv_tx_003\", account_bank: \"057\", amount: 1000,\n * email: \"buyer@example.com\", currency: \"NGN\",\n * });\n */\n async ussd(input: UssdChargeReq) {\n const body = parseRequest(ussdChargeReq, input);\n return this.http.request({\n method: \"POST\",\n path: \"/charges\",\n query: { type: \"ussd\" },\n body,\n schema: chargeRes,\n });\n }\n\n /**\n * Initiate a Nigeria bank-account debit charge. `amount` is MAJOR units.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/initiate-a-nigeria-bank-account-charge\n *\n * @example\n * const res = await fw.flutterwave.charges.ngAccount({\n * tx_ref: \"pwv_tx_004\", account_bank: \"044\", account_number: \"0690000031\",\n * amount: 1000, email: \"buyer@example.com\", currency: \"NGN\",\n * });\n */\n async ngAccount(input: NgAccountChargeReq) {\n const body = parseRequest(ngAccountChargeReq, input);\n return this.http.request({\n method: \"POST\",\n path: \"/charges\",\n query: { type: \"debit_ng_account\" },\n body,\n schema: chargeRes,\n });\n }\n\n /**\n * Validate a charge with the OTP/PIN the customer received.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/validate-a-charge\n *\n * @example\n * const res = await fw.flutterwave.charges.validate({\n * otp: \"12345\", flw_ref: \"FLW-MOCK-abc\", type: \"card\",\n * });\n */\n async validate(input: ValidateChargeReq) {\n const body = parseRequest(validateChargeReq, input);\n return this.http.request({\n method: \"POST\",\n path: \"/validate-charge\",\n body,\n schema: chargeRes,\n });\n }\n}\n","/**\n * Zod schemas for the Flutterwave v3 Transfers + Beneficiaries modules. Fields\n * sourced verbatim from the official v3 reference (version selector v3.0.0):\n * - Create transfer: https://developer.flutterwave.com/v3.0.0/reference/create-a-transfer\n * - List transfers: https://developer.flutterwave.com/v3.0.0/reference/list-all-transfers\n * - Fetch transfer: https://developer.flutterwave.com/v3.0.0/reference/get-a-transfer\n * - Transfer fee: https://developer.flutterwave.com/v3.0.0/reference/get-transfer-fee\n * - Create beneficiary: https://developer.flutterwave.com/v3.0.0/reference/create-a-transfer-beneficiary\n * - List beneficiaries: https://developer.flutterwave.com/v3.0.0/reference/list-all-transfer-beneficiaries\n * - Fetch beneficiary: https://developer.flutterwave.com/v3.0.0/reference/fetch-a-transfer-beneficiary\n *\n * Amounts are MAJOR units (Surface A) and pass through unchanged.\n */\nimport { z } from \"zod\";\nimport { metaSchema } from \"../shared\";\n\n/** POST /transfers — request body. */\nexport const createTransferReq = z.object({\n /** Recipient bank code. */\n account_bank: z.string(),\n account_number: z.string(),\n /** Amount in MAJOR units. Passed through unchanged. */\n amount: z.union([z.number(), z.string()]),\n currency: z.string().optional(),\n narration: z.string().optional(),\n /** Your unique transfer reference. */\n reference: z.string().optional(),\n callback_url: z.string().optional(),\n /** Currency to debit the balance in (for cross-currency transfers). */\n debit_currency: z.string().optional(),\n beneficiary_name: z.string().optional(),\n /** Saved beneficiary id to transfer to instead of raw account details. */\n beneficiary: z.number().optional(),\n meta: metaSchema.optional(),\n});\nexport type CreateTransferReq = z.input<typeof createTransferReq>;\n\n/** GET /transfers — query params. */\nexport const listTransfersQuery = z.object({\n page: z.number().int().positive().optional(),\n status: z.string().optional(),\n});\nexport type ListTransfersQuery = z.input<typeof listTransfersQuery>;\n\n/** GET /transfers/fee — query params. `amount` is MAJOR units. */\nexport const transferFeeQuery = z.object({\n amount: z.union([z.number(), z.string()]),\n currency: z.string().optional(),\n /** Fee category, e.g. \"account\" | \"mobilemoney\". */\n type: z.string().optional(),\n});\nexport type TransferFeeQuery = z.input<typeof transferFeeQuery>;\n\n/** A transfer object (loose). */\nexport const transfer = z.looseObject({\n id: z.number().optional(),\n account_number: z.string().optional(),\n bank_code: z.string().optional(),\n full_name: z.string().optional(),\n created_at: z.string().optional(),\n currency: z.string().optional(),\n amount: z.number().optional(),\n fee: z.number().optional(),\n status: z.string().optional(),\n reference: z.string().nullable().optional(),\n narration: z.string().nullable().optional(),\n complete_message: z.string().nullable().optional(),\n bank_name: z.string().optional(),\n});\n\n/** A transfer-fee object (loose). */\nexport const transferFee = z.looseObject({\n currency: z.string().optional(),\n fee_type: z.string().optional(),\n fee: z.number().optional(),\n});\n\n/** POST /beneficiaries — request body. */\nexport const createBeneficiaryReq = z.object({\n account_bank: z.string(),\n account_number: z.string(),\n beneficiary_name: z.string().optional(),\n currency: z.string().optional(),\n bank_name: z.string().optional(),\n});\nexport type CreateBeneficiaryReq = z.input<typeof createBeneficiaryReq>;\n\n/** GET /beneficiaries — query params. */\nexport const listBeneficiariesQuery = z.object({\n page: z.number().int().positive().optional(),\n});\nexport type ListBeneficiariesQuery = z.input<typeof listBeneficiariesQuery>;\n\n/** A beneficiary object (loose). */\nexport const beneficiary = z.looseObject({\n id: z.number().optional(),\n account_number: z.string().optional(),\n account_name: z.string().optional(),\n bank_name: z.string().optional(),\n bank_code: z.string().optional(),\n full_name: z.string().optional(),\n created_at: z.string().optional(),\n});\n","/**\n * Flutterwave v3 Transfers resource (Surface A): create, list/iterate, fetch,\n * and fee lookup. Amounts are MAJOR units, passed through unchanged.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/create-a-transfer\n */\nimport type { HttpClient } from \"../../../core/http\";\nimport { parseRequest, flwEnvelope, flwListEnvelope, metaNumber } from \"../shared\";\nimport {\n createTransferReq,\n listTransfersQuery,\n transfer,\n transferFee,\n transferFeeQuery,\n type CreateTransferReq,\n type ListTransfersQuery,\n type TransferFeeQuery,\n} from \"../schemas/transfers\";\n\nconst transferRes = flwEnvelope(transfer);\nconst transferListRes = flwListEnvelope(transfer);\nconst transferFeeRes = flwEnvelope(transferFee.array());\n\nexport class Transfers {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Initiate a transfer (payout) to a bank account. `amount` is MAJOR units,\n * passed through unchanged.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/create-a-transfer\n *\n * @example\n * const res = await fw.flutterwave.transfers.create({\n * account_bank: \"044\", account_number: \"0690000040\",\n * amount: 5000, currency: \"NGN\", narration: \"Payout\",\n * });\n */\n async create(input: CreateTransferReq) {\n const body = parseRequest(createTransferReq, input);\n return this.http.request({\n method: \"POST\",\n path: \"/transfers\",\n body,\n schema: transferRes,\n });\n }\n\n /**\n * List transfers on the account.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/list-all-transfers\n *\n * @example\n * const page = await fw.flutterwave.transfers.list({ status: \"SUCCESSFUL\" });\n */\n async list(query: ListTransfersQuery = {}) {\n const q = parseRequest(listTransfersQuery, query);\n return this.http.request({\n method: \"GET\",\n path: \"/transfers\",\n query: q,\n schema: transferListRes,\n });\n }\n\n /**\n * Async iterator over ALL transfers matching `query`, walking every page via\n * `meta.page_info.total_pages`.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/list-all-transfers\n *\n * @example\n * for await (const t of fw.flutterwave.transfers.iterate()) console.log(t.id);\n */\n async *iterate(query: ListTransfersQuery = {}) {\n const base = parseRequest(listTransfersQuery, query);\n let page = base.page ?? 1;\n for (;;) {\n const res = await this.http.request({\n method: \"GET\",\n path: \"/transfers\",\n query: { ...base, page },\n schema: transferListRes,\n });\n for (const t of res.data) yield t;\n const totalPages = metaNumber(res.meta?.page_info?.total_pages);\n if (totalPages !== undefined) {\n if (page >= totalPages) return;\n } else if (res.data.length === 0) {\n return;\n }\n page += 1;\n }\n }\n\n /**\n * Fetch a single transfer by its id.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/get-a-transfer\n *\n * @example\n * const res = await fw.flutterwave.transfers.fetch(27494);\n */\n async fetch(id: number | string) {\n return this.http.request({\n method: \"GET\",\n path: `/transfers/${encodeURIComponent(String(id))}`,\n schema: transferRes,\n });\n }\n\n /**\n * Get the fee Flutterwave charges for a transfer of `amount` MAJOR units.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/get-transfer-fee\n *\n * @example\n * const res = await fw.flutterwave.transfers.fees({ amount: 5000, currency: \"NGN\" });\n */\n async fees(query: TransferFeeQuery) {\n const q = parseRequest(transferFeeQuery, query);\n return this.http.request({\n method: \"GET\",\n path: \"/transfers/fee\",\n query: q,\n schema: transferFeeRes,\n });\n }\n}\n","/**\n * Flutterwave v3 Transfer Beneficiaries resource (Surface A): create,\n * list/iterate, fetch. Beneficiaries are saved payout destinations reusable via\n * `transfers.create({ beneficiary })`.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/create-a-transfer-beneficiary\n */\nimport type { HttpClient } from \"../../../core/http\";\nimport { parseRequest, flwEnvelope, flwListEnvelope, metaNumber } from \"../shared\";\nimport {\n beneficiary,\n createBeneficiaryReq,\n listBeneficiariesQuery,\n type CreateBeneficiaryReq,\n type ListBeneficiariesQuery,\n} from \"../schemas/transfers\";\n\nconst beneficiaryRes = flwEnvelope(beneficiary);\nconst beneficiaryListRes = flwListEnvelope(beneficiary);\n\nexport class Beneficiaries {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Save a transfer beneficiary.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/create-a-transfer-beneficiary\n *\n * @example\n * const res = await fw.flutterwave.beneficiaries.create({\n * account_bank: \"044\", account_number: \"0690000040\", beneficiary_name: \"Jane Doe\",\n * });\n */\n async create(input: CreateBeneficiaryReq) {\n const body = parseRequest(createBeneficiaryReq, input);\n return this.http.request({\n method: \"POST\",\n path: \"/beneficiaries\",\n body,\n schema: beneficiaryRes,\n });\n }\n\n /**\n * List saved beneficiaries.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/list-all-transfer-beneficiaries\n *\n * @example\n * const page = await fw.flutterwave.beneficiaries.list();\n */\n async list(query: ListBeneficiariesQuery = {}) {\n const q = parseRequest(listBeneficiariesQuery, query);\n return this.http.request({\n method: \"GET\",\n path: \"/beneficiaries\",\n query: q,\n schema: beneficiaryListRes,\n });\n }\n\n /**\n * Async iterator over ALL beneficiaries, walking every page via\n * `meta.page_info.total_pages`.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/list-all-transfer-beneficiaries\n *\n * @example\n * for await (const b of fw.flutterwave.beneficiaries.iterate()) console.log(b.id);\n */\n async *iterate(query: ListBeneficiariesQuery = {}) {\n const base = parseRequest(listBeneficiariesQuery, query);\n let page = base.page ?? 1;\n for (;;) {\n const res = await this.http.request({\n method: \"GET\",\n path: \"/beneficiaries\",\n query: { ...base, page },\n schema: beneficiaryListRes,\n });\n for (const b of res.data) yield b;\n const totalPages = metaNumber(res.meta?.page_info?.total_pages);\n if (totalPages !== undefined) {\n if (page >= totalPages) return;\n } else if (res.data.length === 0) {\n return;\n }\n page += 1;\n }\n }\n\n /**\n * Fetch a single beneficiary by its id.\n *\n * Docs: https://developer.flutterwave.com/v3.0.0/reference/fetch-a-transfer-beneficiary\n *\n * @example\n * const res = await fw.flutterwave.beneficiaries.fetch(5307);\n */\n async fetch(id: number | string) {\n return this.http.request({\n method: \"GET\",\n path: `/beneficiaries/${encodeURIComponent(String(id))}`,\n schema: beneficiaryRes,\n });\n }\n}\n","/**\n * FlutterwaveClient — Surface A. Holds the shared {@link HttpClient} and the\n * active `version`, and mounts the version-isolated resource surface (TDD §11:\n * v3 and v4 schemas are NEVER shared). Wave 3 mounts the **v3** resources; v4 is\n * a later wave. The provider-narrowing facade wires `sdk.flutterwave` from these\n * public fields.\n */\nimport { HttpClient, bearer, oauthClientCredentials } from \"../core/http\";\nimport { defineProvider, readHeader, type ProviderAdapter } from \"../core/provider\";\nimport {\n FLW_V3_BASE_URL,\n FLW_V4_BASE_URL,\n FLW_V4_SANDBOX_URL,\n flutterwaveProviderConfigSchema,\n inferEnvironment as inferEnvironmentFromKey,\n type ResolvedProviderConfig,\n} from \"../core/config\";\nimport { PayweaveConfigError } from \"../core/errors\";\nimport { verifyFlutterwaveV3 } from \"../webhooks/flutterwave\";\nimport { verifyFlutterwaveV4 } from \"../webhooks/flutterwave-v4\";\nimport { toUnifiedEventType } from \"../unified/mappings\";\nimport { Payments } from \"./v3/resources/payments\";\nimport { Transactions } from \"./v3/resources/transactions\";\nimport { Banks } from \"./v3/resources/banks\";\nimport { Refunds } from \"./v3/resources/refunds\";\nimport { Charges } from \"./v3/resources/charges\";\nimport { Transfers } from \"./v3/resources/transfers\";\nimport { Beneficiaries } from \"./v3/resources/beneficiaries\";\n\nexport class FlutterwaveClient {\n /**\n * Shared HTTP client. Resource classes receive THIS instance:\n * `new Payments(this.http)`.\n */\n readonly http: HttpClient;\n\n /** Configured API generation — decides which resource surface is mounted. */\n readonly version: \"v3\" | \"v4\";\n\n // ── v3 resources (mounted when version === \"v3\") ─────────────────────────────\n /** Standard Payments: hosted checkout link (`data.link`). */\n readonly payments!: Payments;\n /** Transactions: verify by id / by tx_ref, list/iterate, fees. */\n readonly transactions!: Transactions;\n /** Banks + account resolution: list banks by country, branches, resolve. */\n readonly banks!: Banks;\n /** Refunds: create, list/iterate, fetch. */\n readonly refunds!: Refunds;\n /** Direct charges: card (3DES), bank transfer, USSD, NG account, validate. */\n readonly charges!: Charges;\n /** Transfers: create, list/iterate, fetch, fees. */\n readonly transfers!: Transfers;\n /** Transfer beneficiaries: create, list/iterate, fetch. */\n readonly beneficiaries!: Beneficiaries;\n\n /**\n * @param http - Shared HTTP client every resource is built on.\n * @param version - `\"v3\"` mounts the v3 surface; `\"v4\"` is a later wave.\n * @param encryptionKey - The v3 dashboard Encryption Key (from resolved\n * config), consumed by `charges.card`. Optional so the facade can construct\n * the client without it; card charges then require a per-call override.\n */\n constructor(http: HttpClient, version: \"v3\" | \"v4\", encryptionKey?: string) {\n this.http = http;\n this.version = version;\n\n // ── resources wired here in Wave 3 ─────────────────────────────────────\n // Version-isolated: mount v3 resources when version === \"v3\";\n // v4 resources land in a later wave (branch intentionally left empty).\n if (version === \"v3\") {\n this.payments = new Payments(this.http);\n this.transactions = new Transactions(this.http);\n this.banks = new Banks(this.http);\n this.refunds = new Refunds(this.http);\n this.charges = new Charges(this.http, encryptionKey);\n this.transfers = new Transfers(this.http);\n this.beneficiaries = new Beneficiaries(this.http);\n }\n }\n}\n\n// ── Provider adapter contract v2 (PW-608, providers.md §4) ──────────────────\n// One adapter DEFINITION parameterized by `version` (AGENTS.md §11: v3/v4 stay\n// isolated inside one adapter, never sharing schemas/webhook schemes) — additive\n// metadata alongside the direct wiring in `src/index.ts` (unchanged). `unified`/\n// `billing` are intentionally left unset for the same reason as the Paystack\n// adapter: the real unified ops (`unified/flutterwave.ts`'s\n// `createFlutterwaveUnified`) are HttpClient-bound factories with nowhere to\n// live on a static descriptor; billing is an unimplemented PW-803/804 placeholder.\n\nfunction flutterwaveHttp(cfg: ResolvedProviderConfig): HttpClient {\n if (cfg.version === \"v4\") {\n if (!cfg.clientId || !cfg.clientSecret || !cfg.tokenUrl) {\n throw new PayweaveConfigError(\n \"Flutterwave v4 requires clientId, clientSecret, and a token URL.\",\n { provider: \"flutterwave\" },\n );\n }\n return new HttpClient({\n baseUrl: cfg.baseUrl,\n auth: oauthClientCredentials({\n clientId: cfg.clientId,\n clientSecret: cfg.clientSecret,\n tokenUrl: cfg.tokenUrl,\n ...(cfg.fetch ? { fetch: cfg.fetch } : {}),\n ...(cfg.logger ? { logger: cfg.logger } : {}),\n }),\n provider: \"flutterwave\",\n version: \"v4\",\n timeoutMs: cfg.timeoutMs,\n maxRetries: cfg.maxRetries,\n fetch: cfg.fetch,\n logger: cfg.logger,\n });\n }\n if (!cfg.secretKey) {\n throw new PayweaveConfigError(\"Missing secret key for flutterwave.\", { provider: \"flutterwave\" });\n }\n return new HttpClient({\n baseUrl: cfg.baseUrl,\n auth: bearer(cfg.secretKey),\n provider: \"flutterwave\",\n version: \"v3\",\n timeoutMs: cfg.timeoutMs,\n maxRetries: cfg.maxRetries,\n fetch: cfg.fetch,\n logger: cfg.logger,\n });\n}\n\ntype AdapterWebhooks = ProviderAdapter[\"webhooks\"];\n\nfunction flutterwaveWebhooks(version: \"v3\" | \"v4\"): AdapterWebhooks {\n if (version === \"v4\") {\n return {\n signatureHeader: \"flutterwave-signature\",\n verify: ({ rawBody, headers, secret }) =>\n verifyFlutterwaveV4(rawBody, readHeader(headers, \"flutterwave-signature\"), secret),\n parse: (rawBody) => {\n const root = JSON.parse(rawBody) as Record<string, unknown>;\n return {\n type: typeof root.type === \"string\" ? root.type : \"unknown\",\n data: root.data,\n raw: root,\n ...(typeof root.id === \"string\" ? { id: root.id } : {}),\n };\n },\n toUnified: (e) => ({\n provider: \"flutterwave\",\n type: e.type,\n unifiedType: toUnifiedEventType(\"flutterwave\", \"v4\", e.type, e.data),\n data: e.data,\n raw: e.raw,\n }),\n };\n }\n return {\n signatureHeader: \"verif-hash\",\n verify: ({ headers, secret }) => verifyFlutterwaveV3(readHeader(headers, \"verif-hash\"), secret),\n parse: (rawBody) => {\n const root = JSON.parse(rawBody) as Record<string, unknown>;\n return {\n type: typeof root.event === \"string\" ? root.event : \"unknown\",\n data: root.data,\n raw: root,\n };\n },\n toUnified: (e) => ({\n provider: \"flutterwave\",\n type: e.type,\n unifiedType: toUnifiedEventType(\"flutterwave\", \"v3\", e.type, e.data),\n data: e.data,\n raw: e.raw,\n }),\n };\n}\n\n/**\n * Build the Flutterwave v2 adapter descriptor for a given API generation.\n * `version` defaults to `\"v3\"` (the dashboard default, `core/config.ts` rule 6).\n */\nexport function createFlutterwaveAdapter(version: \"v3\" | \"v4\" = \"v3\"): ProviderAdapter {\n return defineProvider({\n id: \"flutterwave\",\n configKey: \"flutterwave\",\n configSchema: flutterwaveProviderConfigSchema,\n environments:\n version === \"v4\"\n ? { test: { baseUrl: FLW_V4_SANDBOX_URL }, live: { baseUrl: FLW_V4_BASE_URL } }\n : // v3: one host for both — environment is key-derived, not host-derived.\n { test: { baseUrl: FLW_V3_BASE_URL }, live: { baseUrl: FLW_V3_BASE_URL } },\n inferEnvironment: (secretKey) => {\n // v4's environment is explicit (never key-inferred) — \"no opinion\".\n if (version === \"v4\") return null;\n try {\n return inferEnvironmentFromKey(\"flutterwave\", secretKey);\n } catch {\n return null;\n }\n },\n createHttp: flutterwaveHttp,\n webhooks: flutterwaveWebhooks(version),\n });\n}\n\n/** The dashboard-default (v3) Flutterwave adapter descriptor. */\nexport const flutterwaveAdapter: ProviderAdapter = createFlutterwaveAdapter(\"v3\");\n"]}
@@ -0,0 +1,267 @@
1
+ // src/core/redact.ts
2
+ var REDACTED = "[REDACTED]";
3
+ var SENSITIVE_KEY_PATTERNS = [
4
+ /authorization/i,
5
+ /secret/i,
6
+ /key/i,
7
+ // secretKey, encryptionKey, apiKey, publicKey, api_key, ...
8
+ /token/i,
9
+ // access_token, refresh_token — v4 OAuth tokens
10
+ /authorization_code/i,
11
+ /card[_-]?number/i,
12
+ /^pan$/i,
13
+ /cvv|cvc|cvn/i,
14
+ /^expiry/i,
15
+ // expiry, expiryMonth, expiry_year, expiryDate
16
+ /^exp[_-]?(month|year)$/i,
17
+ /^pin$/i,
18
+ /password/i,
19
+ // A bare `connectionString`/`connection_string`/`DATABASE_URL`
20
+ // key holding a postgres:// URL isn't caught by any pattern above (no
21
+ // "secret"/"key"/"token" substring) — the VALUE pattern below also scrubs
22
+ // it wherever it appears, but masking the whole field by NAME too means a
23
+ // driver that logs `{ connectionString }` verbatim (no embedded credential
24
+ // syntax matched by the value pattern, e.g. a bare host with no user:pass)
25
+ // still never survives.
26
+ /^(?:database_url|connection_?string)$/i
27
+ ];
28
+ var SENSITIVE_VALUE_PATTERNS = [
29
+ /sk_(test|live)_[A-Za-z0-9]+/gi,
30
+ // Paystack secret keys
31
+ /FLWSECK(_TEST)?-[A-Za-z0-9-]+/gi,
32
+ // Flutterwave v3 secret keys
33
+ /Bearer\s+[A-Za-z0-9._-]+/gi,
34
+ // Authorization: Bearer <token>
35
+ // Postgres connection strings: `postgresAdapter`
36
+ // accepts a `postgres://`/`postgresql://` URL that typically embeds
37
+ // `user:password@host` credentials — mask the ENTIRE matched URL (not just
38
+ // the credential segment), per the module's fail-safe posture, wherever it
39
+ // appears (error messages, nested config objects, logger events). Matches
40
+ // up to the first whitespace/quote so an embedded URL inside a longer
41
+ // sentence or a quoted JSON value is bounded correctly. (`mysql://` for
42
+ // the last SQL adapter is not yet covered by a dedicated value pattern here.)
43
+ /postgres(?:ql)?:\/\/[^\s"'`]+/gi,
44
+ // MongoDB connection strings: `mongodb://` and
45
+ // `mongodb+srv://` URIs carry credentials in the `user[:pass]@host` userinfo
46
+ // segment — the `@` delimiter is unambiguous (MongoDB's own connection
47
+ // string spec never uses `@` for anything else), so ANY `mongodb(+srv)://`
48
+ // URL containing one is credential-bearing and the WHOLE match is masked
49
+ // (fail-safe posture — never just the password segment) up to the next
50
+ // whitespace/quote/angle-bracket boundary. A bare `mongodb://host:port/db`
51
+ // with no userinfo carries no secret and is deliberately left alone.
52
+ /mongodb(?:\+srv)?:\/\/[^\s"'<>]*@[^\s"'<>]+/gi
53
+ ];
54
+ function isSensitiveKey(key) {
55
+ return SENSITIVE_KEY_PATTERNS.some((re) => re.test(key));
56
+ }
57
+ function scrubString(value) {
58
+ let out = value;
59
+ for (const re of SENSITIVE_VALUE_PATTERNS) {
60
+ out = out.replace(re, REDACTED);
61
+ }
62
+ return out;
63
+ }
64
+ function redact(value) {
65
+ return redactInner(value, /* @__PURE__ */ new WeakSet());
66
+ }
67
+ function redactInner(value, seen) {
68
+ if (value === null || value === void 0) return value;
69
+ if (typeof value === "string") return scrubString(value);
70
+ if (typeof value === "number" || typeof value === "boolean") return value;
71
+ if (typeof value === "bigint") return value.toString();
72
+ if (typeof value === "function" || typeof value === "symbol") return void 0;
73
+ if (typeof Headers !== "undefined" && value instanceof Headers) {
74
+ const obj = {};
75
+ value.forEach((v, k) => {
76
+ obj[k] = isSensitiveKey(k) ? REDACTED : scrubString(v);
77
+ });
78
+ return obj;
79
+ }
80
+ if (value instanceof Map) {
81
+ const obj = {};
82
+ for (const [k, v] of value.entries()) {
83
+ const key = String(k);
84
+ obj[key] = isSensitiveKey(key) ? REDACTED : redactInner(v, seen);
85
+ }
86
+ return obj;
87
+ }
88
+ if (Array.isArray(value)) {
89
+ if (seen.has(value)) return "[Circular]";
90
+ seen.add(value);
91
+ const out = value.map((v) => redactInner(v, seen));
92
+ seen.delete(value);
93
+ return out;
94
+ }
95
+ if (typeof value === "object") {
96
+ if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {
97
+ return "[binary]";
98
+ }
99
+ if (seen.has(value)) return "[Circular]";
100
+ seen.add(value);
101
+ const out = {};
102
+ for (const [k, v] of Object.entries(value)) {
103
+ out[k] = isSensitiveKey(k) ? REDACTED : redactInner(v, seen);
104
+ }
105
+ seen.delete(value);
106
+ return out;
107
+ }
108
+ return void 0;
109
+ }
110
+
111
+ // src/core/errors.ts
112
+ var PayweaveError = class extends Error {
113
+ provider;
114
+ httpStatus;
115
+ providerCode;
116
+ providerMessage;
117
+ requestId;
118
+ raw;
119
+ isRetryable;
120
+ constructor(message, options = {}) {
121
+ super(message, options.cause !== void 0 ? { cause: options.cause } : void 0);
122
+ this.name = "PayweaveError";
123
+ this.provider = options.provider ?? "unknown";
124
+ this.httpStatus = options.httpStatus;
125
+ this.providerCode = options.providerCode;
126
+ this.providerMessage = options.providerMessage;
127
+ this.requestId = options.requestId;
128
+ this.raw = options.raw;
129
+ this.isRetryable = options.isRetryable ?? false;
130
+ if (typeof Error.captureStackTrace === "function") {
131
+ Error.captureStackTrace(this, new.target);
132
+ }
133
+ }
134
+ /** Serialization that is always safe to log — `raw` is redacted. */
135
+ toJSON() {
136
+ return {
137
+ name: this.name,
138
+ message: this.message,
139
+ provider: this.provider,
140
+ httpStatus: this.httpStatus,
141
+ providerCode: this.providerCode,
142
+ providerMessage: this.providerMessage,
143
+ requestId: this.requestId,
144
+ isRetryable: this.isRetryable,
145
+ raw: redact(this.raw)
146
+ };
147
+ }
148
+ };
149
+ var PayweaveConfigError = class extends PayweaveError {
150
+ constructor(message, options = {}) {
151
+ super(message, { isRetryable: false, ...options });
152
+ this.name = "PayweaveConfigError";
153
+ }
154
+ };
155
+ var PayweaveAuthError = class extends PayweaveError {
156
+ constructor(message, options = {}) {
157
+ super(message, { isRetryable: false, ...options });
158
+ this.name = "PayweaveAuthError";
159
+ }
160
+ };
161
+ var PayweaveValidationError = class extends PayweaveError {
162
+ constructor(message, options = {}) {
163
+ super(message, { isRetryable: false, ...options });
164
+ this.name = "PayweaveValidationError";
165
+ }
166
+ };
167
+ var PayweaveNotFoundError = class extends PayweaveError {
168
+ constructor(message, options = {}) {
169
+ super(message, { isRetryable: false, ...options });
170
+ this.name = "PayweaveNotFoundError";
171
+ }
172
+ };
173
+ var PayweaveRateLimitError = class extends PayweaveError {
174
+ retryAfterMs;
175
+ constructor(message, options = {}) {
176
+ const { retryAfterMs, ...rest } = options;
177
+ super(message, { isRetryable: true, ...rest });
178
+ this.name = "PayweaveRateLimitError";
179
+ this.retryAfterMs = retryAfterMs;
180
+ }
181
+ toJSON() {
182
+ return { ...super.toJSON(), retryAfterMs: this.retryAfterMs };
183
+ }
184
+ };
185
+ var PayweaveProviderError = class extends PayweaveError {
186
+ constructor(message, options = {}) {
187
+ super(message, { isRetryable: true, ...options });
188
+ this.name = "PayweaveProviderError";
189
+ }
190
+ };
191
+ var PayweaveNetworkError = class extends PayweaveError {
192
+ constructor(message, options = {}) {
193
+ super(message, { ...options, isRetryable: true });
194
+ this.name = "PayweaveNetworkError";
195
+ }
196
+ };
197
+ var PayweaveWebhookVerificationError = class extends PayweaveError {
198
+ constructor(message, options = {}) {
199
+ super(message, { isRetryable: false, ...options });
200
+ this.name = "PayweaveWebhookVerificationError";
201
+ }
202
+ };
203
+ function extractBody(body) {
204
+ if (body === null || typeof body !== "object") {
205
+ return { providerMessage: void 0, providerCode: void 0, requestId: void 0 };
206
+ }
207
+ const rec = body;
208
+ if (rec.error !== null && typeof rec.error === "object" && !Array.isArray(rec.error)) {
209
+ return extractBody(rec.error);
210
+ }
211
+ const message = typeof rec.message === "string" ? rec.message : void 0;
212
+ const codeRaw = rec.code ?? rec.errorCode ?? rec.error_code ?? rec.type;
213
+ const code = typeof codeRaw === "string" ? codeRaw : typeof codeRaw === "number" ? String(codeRaw) : void 0;
214
+ const idRaw = rec.requestId ?? rec.request_id ?? rec.reference;
215
+ const requestId = typeof idRaw === "string" ? idRaw : void 0;
216
+ return { providerMessage: message, providerCode: code, requestId };
217
+ }
218
+ function mapHttpError(provider, status, body, extra = {}) {
219
+ const { providerMessage, providerCode, requestId } = extractBody(body);
220
+ const base = {
221
+ provider,
222
+ httpStatus: status,
223
+ providerCode,
224
+ providerMessage,
225
+ requestId: extra.requestId ?? requestId,
226
+ raw: body
227
+ };
228
+ const summary = providerMessage ? `: ${providerMessage}` : "";
229
+ if (status === 401 || status === 403) {
230
+ return new PayweaveAuthError(
231
+ `${provider} authentication failed (${status})${summary}`,
232
+ base
233
+ );
234
+ }
235
+ if (status === 400 || status === 422) {
236
+ return new PayweaveValidationError(
237
+ `${provider} rejected the request (${status})${summary}`,
238
+ base
239
+ );
240
+ }
241
+ if (status === 402) {
242
+ return new PayweaveProviderError(`${provider} payment failed (402)${summary}`, {
243
+ ...base,
244
+ isRetryable: false
245
+ });
246
+ }
247
+ if (status === 404) {
248
+ return new PayweaveNotFoundError(`${provider} resource not found (404)${summary}`, base);
249
+ }
250
+ if (status === 429) {
251
+ return new PayweaveRateLimitError(
252
+ `${provider} rate limit exceeded (429)${summary}`,
253
+ extra.retryAfterMs !== void 0 ? { ...base, retryAfterMs: extra.retryAfterMs } : base
254
+ );
255
+ }
256
+ if (status >= 500) {
257
+ return new PayweaveProviderError(`${provider} server error (${status})${summary}`, base);
258
+ }
259
+ return new PayweaveProviderError(
260
+ `${provider} returned an unexpected status (${status})${summary}`,
261
+ { ...base, isRetryable: false }
262
+ );
263
+ }
264
+
265
+ export { PayweaveAuthError, PayweaveConfigError, PayweaveError, PayweaveNetworkError, PayweaveNotFoundError, PayweaveProviderError, PayweaveRateLimitError, PayweaveValidationError, PayweaveWebhookVerificationError, REDACTED, mapHttpError, redact };
266
+ //# sourceMappingURL=chunk-HTRGMZFH.js.map
267
+ //# sourceMappingURL=chunk-HTRGMZFH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/redact.ts","../src/core/errors.ts"],"names":[],"mappings":"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","file":"chunk-HTRGMZFH.js","sourcesContent":["/**\n * Secret redaction. Every value that could reach a log\n * sink or an error's `toJSON()` is passed through {@link redact} first. Fails\n * safe: on any doubt, mask. This is a security-critical module — the redaction\n * unit tests are release-blocking (no `sk_`, `FLWSECK`, `Authorization` bearer\n * material, or PAN may survive serialization).\n */\n\n/** Replacement token substituted for any masked value. */\nexport const REDACTED = \"[REDACTED]\";\n\n/**\n * Key names (matched case-insensitively) whose VALUES must always be masked.\n * Covers auth headers, every `*secret*`/`*key*`/`*token*` field, and the card\n * data enumerated in the security checklist (PAN, CVV, expiry, PIN).\n */\nconst SENSITIVE_KEY_PATTERNS: readonly RegExp[] = [\n /authorization/i,\n /secret/i,\n /key/i, // secretKey, encryptionKey, apiKey, publicKey, api_key, ...\n /token/i, // access_token, refresh_token — v4 OAuth tokens\n /authorization_code/i,\n /card[_-]?number/i,\n /^pan$/i,\n /cvv|cvc|cvn/i,\n /^expiry/i, // expiry, expiryMonth, expiry_year, expiryDate\n /^exp[_-]?(month|year)$/i,\n /^pin$/i,\n /password/i,\n // A bare `connectionString`/`connection_string`/`DATABASE_URL`\n // key holding a postgres:// URL isn't caught by any pattern above (no\n // \"secret\"/\"key\"/\"token\" substring) — the VALUE pattern below also scrubs\n // it wherever it appears, but masking the whole field by NAME too means a\n // driver that logs `{ connectionString }` verbatim (no embedded credential\n // syntax matched by the value pattern, e.g. a bare host with no user:pass)\n // still never survives.\n /^(?:database_url|connection_?string)$/i,\n];\n\n/**\n * Substrings that betray secret material even under an innocently-named key.\n * Belt-and-braces value scrub so a mislabelled field can never leak a live key.\n */\nconst SENSITIVE_VALUE_PATTERNS: readonly RegExp[] = [\n /sk_(test|live)_[A-Za-z0-9]+/gi, // Paystack secret keys\n /FLWSECK(_TEST)?-[A-Za-z0-9-]+/gi, // Flutterwave v3 secret keys\n /Bearer\\s+[A-Za-z0-9._-]+/gi, // Authorization: Bearer <token>\n // Postgres connection strings: `postgresAdapter`\n // accepts a `postgres://`/`postgresql://` URL that typically embeds\n // `user:password@host` credentials — mask the ENTIRE matched URL (not just\n // the credential segment), per the module's fail-safe posture, wherever it\n // appears (error messages, nested config objects, logger events). Matches\n // up to the first whitespace/quote so an embedded URL inside a longer\n // sentence or a quoted JSON value is bounded correctly. (`mysql://` for\n // the last SQL adapter is not yet covered by a dedicated value pattern here.)\n /postgres(?:ql)?:\\/\\/[^\\s\"'`]+/gi,\n // MongoDB connection strings: `mongodb://` and\n // `mongodb+srv://` URIs carry credentials in the `user[:pass]@host` userinfo\n // segment — the `@` delimiter is unambiguous (MongoDB's own connection\n // string spec never uses `@` for anything else), so ANY `mongodb(+srv)://`\n // URL containing one is credential-bearing and the WHOLE match is masked\n // (fail-safe posture — never just the password segment) up to the next\n // whitespace/quote/angle-bracket boundary. A bare `mongodb://host:port/db`\n // with no userinfo carries no secret and is deliberately left alone.\n /mongodb(?:\\+srv)?:\\/\\/[^\\s\"'<>]*@[^\\s\"'<>]+/gi,\n];\n\nfunction isSensitiveKey(key: string): boolean {\n return SENSITIVE_KEY_PATTERNS.some((re) => re.test(key));\n}\n\nfunction scrubString(value: string): string {\n let out = value;\n for (const re of SENSITIVE_VALUE_PATTERNS) {\n out = out.replace(re, REDACTED);\n }\n return out;\n}\n\n/**\n * Deep-clone `value`, masking any sensitive key's value and scrubbing secret\n * material from strings. Handles plain objects, arrays, `Headers`, `Map`, and\n * cyclic references. Non-plain objects (Error, Date, etc.) are stringified\n * defensively rather than walked.\n *\n * @param value - Arbitrary, untrusted data (request/response body, headers).\n * @returns A redacted structural copy safe to serialize and log.\n */\nexport function redact(value: unknown): unknown {\n return redactInner(value, new WeakSet());\n}\n\nfunction redactInner(value: unknown, seen: WeakSet<object>): unknown {\n if (value === null || value === undefined) return value;\n\n if (typeof value === \"string\") return scrubString(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") return value;\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"function\" || typeof value === \"symbol\") return undefined;\n\n // Web Headers → plain object (so header keys are subject to masking).\n if (typeof Headers !== \"undefined\" && value instanceof Headers) {\n const obj: Record<string, unknown> = {};\n value.forEach((v, k) => {\n obj[k] = isSensitiveKey(k) ? REDACTED : scrubString(v);\n });\n return obj;\n }\n\n if (value instanceof Map) {\n const obj: Record<string, unknown> = {};\n for (const [k, v] of value.entries()) {\n const key = String(k);\n obj[key] = isSensitiveKey(key) ? REDACTED : redactInner(v, seen);\n }\n return obj;\n }\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n const out = value.map((v) => redactInner(v, seen));\n seen.delete(value);\n return out;\n }\n\n if (typeof value === \"object\") {\n // Uint8Array / Buffer and other binary — never inspect contents.\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {\n return \"[binary]\";\n }\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = isSensitiveKey(k) ? REDACTED : redactInner(v, seen);\n }\n seen.delete(value);\n return out;\n }\n\n return undefined;\n}\n","/**\n * Error taxonomy (PRD §6.3, TDD §6.3). One base class + eight subclasses; a\n * single {@link mapHttpError} converts an HTTP status + body into the right\n * class. `toJSON()` is always safe to log — `raw` is passed through `redact()`.\n * Public SDK methods MUST only ever throw a {@link PayweaveError} subclass.\n */\nimport { redact } from \"./redact\";\n\n/**\n * Providers the SDK targets. `\"unknown\"` covers pre-classification failures.\n * Stripe joined the set in the v1 pivot (docs/v1/providers.md, PW-501) — its\n * config/env-inference lands first; the full client surface follows in EPIC 6.\n */\nexport type PayweaveProvider = \"paystack\" | \"flutterwave\" | \"stripe\";\n\n/**\n * Common shape carried by every Payweave error. Optional fields explicitly\n * include `undefined` so they can be built from possibly-undefined values under\n * `exactOptionalPropertyTypes`.\n */\nexport interface PayweaveErrorOptions {\n provider?: PayweaveProvider | \"unknown\" | undefined;\n httpStatus?: number | undefined;\n providerCode?: string | undefined;\n providerMessage?: string | undefined;\n requestId?: string | undefined;\n raw?: unknown;\n isRetryable?: boolean | undefined;\n cause?: unknown;\n}\n\n/**\n * Base class for every error the SDK throws. Never thrown directly for HTTP\n * failures — use {@link mapHttpError} — but usable for bespoke conditions.\n */\nexport class PayweaveError extends Error {\n readonly provider: PayweaveProvider | \"unknown\";\n readonly httpStatus: number | undefined;\n readonly providerCode: string | undefined;\n readonly providerMessage: string | undefined;\n readonly requestId: string | undefined;\n readonly raw: unknown;\n readonly isRetryable: boolean;\n\n constructor(message: string, options: PayweaveErrorOptions = {}) {\n super(message, options.cause !== undefined ? { cause: options.cause } : undefined);\n this.name = \"PayweaveError\";\n this.provider = options.provider ?? \"unknown\";\n this.httpStatus = options.httpStatus;\n this.providerCode = options.providerCode;\n this.providerMessage = options.providerMessage;\n this.requestId = options.requestId;\n this.raw = options.raw;\n this.isRetryable = options.isRetryable ?? false;\n // Cleaner stack traces on V8.\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, new.target);\n }\n }\n\n /** Serialization that is always safe to log — `raw` is redacted. */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n provider: this.provider,\n httpStatus: this.httpStatus,\n providerCode: this.providerCode,\n providerMessage: this.providerMessage,\n requestId: this.requestId,\n isRetryable: this.isRetryable,\n raw: redact(this.raw),\n };\n }\n}\n\n/** Bad/missing keys, provider mismatch, env conflict — thrown synchronously. */\nexport class PayweaveConfigError extends PayweaveError {\n constructor(message: string, options: PayweaveErrorOptions = {}) {\n super(message, { isRetryable: false, ...options });\n this.name = \"PayweaveConfigError\";\n }\n}\n\n/** 401 / invalid credentials. Not retryable. */\nexport class PayweaveAuthError extends PayweaveError {\n constructor(message: string, options: PayweaveErrorOptions = {}) {\n super(message, { isRetryable: false, ...options });\n this.name = \"PayweaveAuthError\";\n }\n}\n\n/** 400/422 or a local Zod validation failure before sending. Not retryable. */\nexport class PayweaveValidationError extends PayweaveError {\n constructor(message: string, options: PayweaveErrorOptions = {}) {\n super(message, { isRetryable: false, ...options });\n this.name = \"PayweaveValidationError\";\n }\n}\n\n/** 404 — unknown reference, recipient, resource. Not retryable. */\nexport class PayweaveNotFoundError extends PayweaveError {\n constructor(message: string, options: PayweaveErrorOptions = {}) {\n super(message, { isRetryable: false, ...options });\n this.name = \"PayweaveNotFoundError\";\n }\n}\n\n/** 429 — exposes `retryAfterMs` when the provider sent a `Retry-After`. */\nexport class PayweaveRateLimitError extends PayweaveError {\n readonly retryAfterMs: number | undefined;\n constructor(\n message: string,\n options: PayweaveErrorOptions & { retryAfterMs?: number } = {},\n ) {\n const { retryAfterMs, ...rest } = options;\n super(message, { isRetryable: true, ...rest });\n this.name = \"PayweaveRateLimitError\";\n this.retryAfterMs = retryAfterMs;\n }\n\n override toJSON(): Record<string, unknown> {\n return { ...super.toJSON(), retryAfterMs: this.retryAfterMs };\n }\n}\n\n/** 5xx or a provider-reported processing failure. Retryable. */\nexport class PayweaveProviderError extends PayweaveError {\n constructor(message: string, options: PayweaveErrorOptions = {}) {\n super(message, { isRetryable: true, ...options });\n this.name = \"PayweaveProviderError\";\n }\n}\n\n/** Timeout / DNS / connection reset. Always retryable (`isRetryable = true`). */\nexport class PayweaveNetworkError extends PayweaveError {\n constructor(message: string, options: PayweaveErrorOptions = {}) {\n super(message, { ...options, isRetryable: true });\n this.name = \"PayweaveNetworkError\";\n }\n}\n\n/** Signature mismatch / malformed webhook. Fails closed. Not retryable. */\nexport class PayweaveWebhookVerificationError extends PayweaveError {\n constructor(message: string, options: PayweaveErrorOptions = {}) {\n super(message, { isRetryable: false, ...options });\n this.name = \"PayweaveWebhookVerificationError\";\n }\n}\n\n/** Fields pulled defensively out of a provider error envelope. */\ninterface ExtractedBody {\n providerMessage: string | undefined;\n providerCode: string | undefined;\n requestId: string | undefined;\n}\n\nfunction extractBody(body: unknown): ExtractedBody {\n if (body === null || typeof body !== \"object\") {\n return { providerMessage: undefined, providerCode: undefined, requestId: undefined };\n }\n const rec = body as Record<string, unknown>;\n // Stripe nests its envelope one level down: `{ error: { type, code, message,\n // param, ... } }` (https://docs.stripe.com/api/errors — verified 2026-07-12).\n // Descend so the inner message/code surface exactly like a flat envelope\n // (`code` first, falling back to `type`, via the shared logic below).\n if (rec.error !== null && typeof rec.error === \"object\" && !Array.isArray(rec.error)) {\n return extractBody(rec.error);\n }\n const message = typeof rec.message === \"string\" ? rec.message : undefined;\n const codeRaw = rec.code ?? rec.errorCode ?? rec.error_code ?? rec.type;\n const code =\n typeof codeRaw === \"string\"\n ? codeRaw\n : typeof codeRaw === \"number\"\n ? String(codeRaw)\n : undefined;\n const idRaw = rec.requestId ?? rec.request_id ?? rec.reference;\n const requestId = typeof idRaw === \"string\" ? idRaw : undefined;\n return { providerMessage: message, providerCode: code, requestId };\n}\n\n/** Extra signals the HTTP layer already parsed (headers) and can pass down. */\nexport interface MapHttpErrorExtra {\n retryAfterMs?: number;\n requestId?: string;\n}\n\n/**\n * The single status → error-class mapping used everywhere. No\n * per-resource error mapping is permitted. `body` is the parsed provider\n * envelope (or `undefined`); `extra` carries header-derived signals.\n *\n * - 401 → {@link PayweaveAuthError}\n * - 400 / 422 → {@link PayweaveValidationError}\n * - 402 → {@link PayweaveProviderError}, NOT retryable (Stripe `card_error`)\n * - 404 → {@link PayweaveNotFoundError}\n * - 429 → {@link PayweaveRateLimitError} (with `retryAfterMs`)\n * - 5xx → {@link PayweaveProviderError} (retryable)\n * - everything else → {@link PayweaveProviderError}\n */\nexport function mapHttpError(\n provider: PayweaveProvider,\n status: number,\n body: unknown,\n extra: MapHttpErrorExtra = {},\n): PayweaveError {\n const { providerMessage, providerCode, requestId } = extractBody(body);\n const base: PayweaveErrorOptions = {\n provider,\n httpStatus: status,\n providerCode,\n providerMessage,\n requestId: extra.requestId ?? requestId,\n raw: body,\n };\n const summary = providerMessage ? `: ${providerMessage}` : \"\";\n\n if (status === 401 || status === 403) {\n return new PayweaveAuthError(\n `${provider} authentication failed (${status})${summary}`,\n base,\n );\n }\n if (status === 400 || status === 422) {\n return new PayweaveValidationError(\n `${provider} rejected the request (${status})${summary}`,\n base,\n );\n }\n if (status === 402) {\n // Stripe: a failed charge (`card_error` — declines etc.). The provider\n // reported a processing failure, so this is a PayweaveProviderError with\n // `providerCode` (e.g. `card_declined`), but NOT retryable — re-sending a\n // declined charge must be an explicit caller decision.\n return new PayweaveProviderError(`${provider} payment failed (402)${summary}`, {\n ...base,\n isRetryable: false,\n });\n }\n if (status === 404) {\n return new PayweaveNotFoundError(`${provider} resource not found (404)${summary}`, base);\n }\n if (status === 429) {\n return new PayweaveRateLimitError(\n `${provider} rate limit exceeded (429)${summary}`,\n extra.retryAfterMs !== undefined ? { ...base, retryAfterMs: extra.retryAfterMs } : base,\n );\n }\n if (status >= 500) {\n return new PayweaveProviderError(`${provider} server error (${status})${summary}`, base);\n }\n return new PayweaveProviderError(\n `${provider} returned an unexpected status (${status})${summary}`,\n { ...base, isRetryable: false },\n );\n}\n"]}