@nombaoss/nomba-node 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +467 -2
- package/dist/index.cjs +1557 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1365 -0
- package/dist/index.d.ts +1365 -0
- package/dist/index.js +1532 -0
- package/dist/index.js.map +1 -0
- package/package.json +74 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/auth.ts","../src/constants.ts","../src/internal/utils.ts","../src/internal/http.ts","../src/internal/pagination.ts","../src/resources/base.ts","../src/resources/accounts.ts","../src/resources/auth.ts","../src/resources/bills.ts","../src/resources/checkout.ts","../src/resources/directDebits.ts","../src/resources/globalCollection.ts","../src/resources/globalPayout.ts","../src/resources/terminals.ts","../src/resources/transactions.ts","../src/resources/transfers.ts","../src/resources/virtualAccounts.ts","../src/version.ts","../src/webhooks.ts","../src/client.ts","../src/index.ts"],"names":["SUCCESS_CODES","field"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error hierarchy.\n *\n * NombaError\n * ├── ApiError 2xx with a non-success `code`, or any HTTP error\n * │ ├── AuthenticationError 401 after the token refresh retry, or token issue failed\n * │ ├── PermissionDeniedError 403\n * │ ├── NotFoundError 404\n * │ ├── ValidationError 400, 422, and client-side validation\n * │ ├── RateLimitError 429\n * │ └── ServerError 5xx\n * ├── ConnectionError network failure\n * │ └── TimeoutError request timed out\n * ├── WebhookVerificationError webhook signature or payload rejected\n * └── ConfigurationError bad or missing client options\n *\n * Errors never carry credentials, tokens or request headers.\n */\n\n/** The idempotency reference sent with a money-moving request. */\nexport interface ErrorReference {\n /** Which request field held the reference. */\n readonly field: \"merchantTxRef\" | \"orderReference\";\n /** The value sent: yours, or the one the SDK generated. */\n readonly value: string;\n}\n\nexport class NombaError extends Error {\n /**\n * Set on errors from money-moving calls (`transfers.toBank`, `transfers.toWallet`,\n * `bills.*` purchases, `checkout.chargeSavedCard`). After a timeout or connection\n * error, requery with this reference before retrying, and retry with the same one.\n */\n readonly reference: ErrorReference | undefined;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = new.target.name;\n this.reference = undefined;\n }\n}\n\n/** Attach the idempotency reference to an error thrown by a money-moving call. */\nexport function attachErrorReference(err: unknown, reference: ErrorReference): void {\n if (err instanceof NombaError) {\n Object.defineProperty(err, \"reference\", {\n value: Object.freeze({ ...reference }),\n enumerable: true,\n writable: false,\n configurable: true,\n });\n }\n}\n\nexport class ConfigurationError extends NombaError {}\n\nexport class WebhookVerificationError extends NombaError {}\n\nexport class ConnectionError extends NombaError {\n /** HTTP method of the failed request. */\n readonly method: string | undefined;\n /** Request path, without query string. */\n readonly path: string | undefined;\n\n constructor(\n message: string,\n options: { method?: string; path?: string; cause?: unknown } = {}\n ) {\n super(message, { cause: options.cause });\n this.method = options.method;\n this.path = options.path;\n }\n}\n\nexport class TimeoutError extends ConnectionError {}\n\nexport interface ApiErrorInit {\n /** HTTP status, or `null` for client-side validation errors. */\n httpStatus: number | null;\n code?: string | undefined;\n description?: string | undefined;\n body?: unknown;\n method?: string | undefined;\n path?: string | undefined;\n}\n\nexport class ApiError extends NombaError {\n /** HTTP status of the response, or `null` when the error was raised before sending. */\n readonly httpStatus: number | null;\n /** Nomba's `code` field from the response envelope, if present. */\n readonly code: string | undefined;\n /** Nomba's `description` (human-readable message), if present. */\n readonly description: string | undefined;\n /** Parsed response body. */\n readonly body: unknown;\n /** HTTP method of the request. */\n readonly method: string | undefined;\n /** Request path, without query string. */\n readonly path: string | undefined;\n\n constructor(init: ApiErrorInit, message?: string) {\n super(message ?? ApiError.formatMessage(init));\n this.httpStatus = init.httpStatus;\n this.code = init.code;\n this.description = init.description;\n this.body = init.body;\n this.method = init.method;\n this.path = init.path;\n }\n\n /** `Nomba API error 400 (code \"400\"): <description> [POST /v2/transfers/bank]` */\n static formatMessage(init: ApiErrorInit): string {\n let msg = \"Nomba API error\";\n if (init.httpStatus !== null) msg += ` ${init.httpStatus}`;\n if (init.code !== undefined) msg += ` (code \"${init.code}\")`;\n msg += `: ${init.description ?? \"no description\"}`;\n if (init.method && init.path) msg += ` [${init.method} ${init.path}]`;\n return msg;\n }\n}\n\nexport class AuthenticationError extends ApiError {}\n\nexport class PermissionDeniedError extends ApiError {}\n\nexport class NotFoundError extends ApiError {}\n\nexport class ValidationError extends ApiError {\n /** Client-side validation error: nothing was sent. */\n static client(description: string): ValidationError {\n return new ValidationError(\n { httpStatus: null, description },\n `Nomba validation error: ${description}`\n );\n }\n}\n\nexport interface RateLimitInfo {\n /** `X-Rate-Limit-Limit`: requests allowed in the current window. */\n limit?: string | undefined;\n /** `X-Rate-Limit-Remaining`: requests left in the current window. */\n remaining?: string | undefined;\n /** `X-Rate-Limit-Window`: the window, e.g. `1s`. */\n window?: string | undefined;\n}\n\nexport class RateLimitError extends ApiError {\n /** Seconds to wait, from the `Retry-After` header, if present. */\n readonly retryAfter: number | undefined;\n /** `X-Rate-Limit-*` header values. */\n readonly rateLimit: RateLimitInfo;\n\n constructor(init: ApiErrorInit & { retryAfter?: number; rateLimit?: RateLimitInfo }) {\n super(init);\n this.retryAfter = init.retryAfter;\n this.rateLimit = init.rateLimit ?? {};\n }\n}\n\nexport class ServerError extends ApiError {}\n","import { ApiError } from \"./errors.js\";\n\n/** An access token as kept by a {@link TokenStore}. */\nexport interface Token {\n accessToken: string;\n refreshToken: string;\n /** RFC 3339 expiry time from Nomba's `expiresAt`. */\n expiresAt: string;\n}\n\n/**\n * Where the client keeps its access token. The default keeps it in memory.\n * Implement this (e.g. over Redis) so several instances share one token:\n * Nomba recommends a single authenticating instance.\n */\nexport interface TokenStore {\n get(): Token | null | Promise<Token | null>;\n set(token: Token | null): void | Promise<void>;\n}\n\n/** Default token store: one token per client, held in memory. */\nexport class InMemoryTokenStore implements TokenStore {\n #token: Token | null = null;\n\n get(): Token | null {\n return this.#token;\n }\n\n set(token: Token | null): void {\n this.#token = token;\n }\n\n toJSON(): Record<string, string> {\n return { tokenStore: \"InMemoryTokenStore\" };\n }\n\n [Symbol.for(\"nodejs.util.inspect.custom\")](): string {\n return \"InMemoryTokenStore {}\";\n }\n}\n\n/** Refresh when within this long of `expiresAt`. */\nexport const REFRESH_MARGIN_MS = 5 * 60 * 1000;\n/** Used when `expiresAt` is missing or unparseable. Nomba tokens last about 30 minutes. */\nconst FALLBACK_LIFETIME_MS = 30 * 60 * 1000;\n\nexport interface TokenResponse {\n access_token?: unknown;\n refresh_token?: unknown;\n expiresAt?: unknown;\n}\n\nexport interface TokenManagerDeps {\n store: TokenStore;\n issue(): Promise<TokenResponse>;\n refresh(refreshToken: string): Promise<TokenResponse>;\n now?: () => number;\n}\n\n/**\n * Lazily obtains tokens, refreshes them before they expire and makes sure\n * concurrent callers share a single in-flight token request.\n */\nexport class TokenManager {\n readonly #deps: TokenManagerDeps;\n #inflight: Promise<string> | null = null;\n\n constructor(deps: TokenManagerDeps) {\n this.#deps = deps;\n }\n\n #now(): number {\n return this.#deps.now ? this.#deps.now() : Date.now();\n }\n\n /** Current access token, obtaining or refreshing one if needed. */\n async getAccessToken(): Promise<string> {\n if (this.#inflight) return this.#inflight;\n const cached = await this.#deps.store.get();\n if (cached && this.#expiryMs(cached) - this.#now() > REFRESH_MARGIN_MS) {\n return cached.accessToken;\n }\n // Re-check: another caller may have started a request while we awaited the store.\n if (this.#inflight) return this.#inflight;\n this.#inflight = this.#obtain(cached).finally(() => {\n this.#inflight = null;\n });\n return this.#inflight;\n }\n\n /** Drop the cached token, but only if it is still the one that failed. */\n async invalidate(failedAccessToken: string): Promise<void> {\n const cached = await this.#deps.store.get();\n if (cached && cached.accessToken === failedAccessToken) {\n await this.#deps.store.set(null);\n }\n }\n\n async current(): Promise<Token | null> {\n return this.#deps.store.get();\n }\n\n async clear(): Promise<void> {\n await this.#deps.store.set(null);\n }\n\n async #obtain(cached: Token | null): Promise<string> {\n if (cached?.refreshToken) {\n try {\n return await this.#save(await this.#deps.refresh(cached.refreshToken));\n } catch (err) {\n const status = err instanceof ApiError ? err.httpStatus : null;\n // 429 is throttling, not a rejected refresh token: handle it like 5xx.\n const clientError =\n status !== null && status >= 400 && status < 500 && status !== 429;\n const nonSuccessCode = err instanceof ApiError && status !== null && status < 300;\n if (!clientError && !nonSuccessCode) {\n // Network/429/5xx trouble: keep using a token that has not actually expired.\n if (this.#expiryMs(cached) > this.#now()) return cached.accessToken;\n throw err;\n }\n // Refresh token rejected: fall back to a fresh issue.\n }\n }\n return this.#save(await this.#deps.issue());\n }\n\n async #save(res: TokenResponse): Promise<string> {\n const accessToken = typeof res.access_token === \"string\" ? res.access_token : \"\";\n if (!accessToken) {\n throw new ApiError(\n {\n httpStatus: 200,\n description: \"token response did not include an access_token\",\n },\n \"Nomba API error: token response did not include an access_token\"\n );\n }\n let expiresAt = typeof res.expiresAt === \"string\" ? res.expiresAt : \"\";\n if (Number.isNaN(Date.parse(expiresAt))) {\n expiresAt = new Date(this.#now() + FALLBACK_LIFETIME_MS).toISOString();\n }\n await this.#deps.store.set({\n accessToken,\n refreshToken: typeof res.refresh_token === \"string\" ? res.refresh_token : \"\",\n expiresAt,\n });\n return accessToken;\n }\n\n #expiryMs(token: Token): number {\n const t = Date.parse(token.expiresAt);\n return Number.isNaN(t) ? 0 : t;\n }\n}\n","/**\n * Transaction statuses returned in `data.status`. The SDK never throws based on\n * these: a 2xx response with a success `code` is returned as-is. See\n * https://developer.nomba.com/docs/api-basics/response-codes\n */\nexport const TransactionStatus = {\n /** Service delivered to the destination. Do not refund. */\n SUCCESS: \"SUCCESS\",\n /** Still processing. Wait for the webhook or requery. */\n PENDING_BILLING: \"PENDING_BILLING\",\n /** Still processing (v1 endpoints). Wait for the webhook or requery. */\n PROCESSING: \"PROCESSING\",\n /** Funds returned to your Nomba wallet. Refund your customer. */\n REFUND: \"REFUND\",\n /** The transaction will not proceed. Contact Nomba support. */\n CANCELLED: \"CANCELLED\",\n /** Debit failed; Nomba may retry. Wait for the webhook. */\n PAYMENT_FAILED: \"PAYMENT_FAILED\",\n /** Nomba may retry via another vendor. Wait for the webhook. */\n REVERSED_BY_VENDOR: \"REVERSED_BY_VENDOR\",\n} as const;\n\nexport type TransactionStatus =\n (typeof TransactionStatus)[keyof typeof TransactionStatus];\n\n/** Webhook `event_type` values. */\nexport const WebhookEventType = {\n PAYMENT_SUCCESS: \"payment_success\",\n PAYMENT_FAILED: \"payment_failed\",\n PAYMENT_REVERSAL: \"payment_reversal\",\n PAYOUT_SUCCESS: \"payout_success\",\n PAYOUT_FAILED: \"payout_failed\",\n PAYOUT_REFUND: \"payout_refund\",\n} as const;\n\nexport type WebhookEventType = (typeof WebhookEventType)[keyof typeof WebhookEventType];\n\n/** Envelope `code` values that mean success. */\nexport const SUCCESS_CODES = [\"00\", \"200\", \"201\"] as const;\n\nexport const BASE_URLS = {\n sandbox: \"https://sandbox.nomba.com\",\n production: \"https://api.nomba.com\",\n} as const;\n\nexport type Environment = keyof typeof BASE_URLS;\n","import { ValidationError } from \"../errors.js\";\n\nexport type QueryValue = string | number | boolean | null | undefined;\nexport type Query = Record<string, QueryValue>;\n\n/**\n * Validate and URL-encode one path segment. Rejects empty values, `.`/`..` and\n * anything containing `/`, so a caller-supplied ID can never reach another endpoint.\n */\nexport function encodePathSegment(value: unknown, name = \"path parameter\"): string {\n if (typeof value !== \"string\" && typeof value !== \"number\") {\n throw ValidationError.client(`${name} must be a non-empty string`);\n }\n const s = String(value);\n if (s.trim() === \"\") throw ValidationError.client(`${name} must not be empty`);\n if (s === \".\" || s === \"..\") throw ValidationError.client(`${name} must not be \"${s}\"`);\n if (s.includes(\"/\") || s.includes(\"\\\\\")) {\n throw ValidationError.client(`${name} must not contain \"/\" or \"\\\\\"`);\n }\n return encodeURIComponent(s);\n}\n\n/** Build `?a=1&b=true` from a record, dropping null/undefined. */\nexport function buildQuery(query: Query | undefined): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === null || value === undefined) continue;\n params.append(\n key,\n typeof value === \"boolean\" ? (value ? \"true\" : \"false\") : String(value)\n );\n }\n const s = params.toString();\n return s ? `?${s}` : \"\";\n}\n\n/** Throw a client-side ValidationError if any of `keys` is missing or empty. */\nexport function requireFields(\n obj: Record<string, unknown> | undefined,\n keys: readonly string[],\n context: string\n): void {\n for (const key of keys) {\n const v = obj?.[key];\n if (v === undefined || v === null || v === \"\") {\n throw ValidationError.client(`${context}: \"${key}\" is required`);\n }\n }\n}\n\n/** Throw unless exactly one of `keys` is set. */\nexport function requireExactlyOne(\n obj: Record<string, unknown> | undefined,\n keys: readonly string[],\n context: string\n): void {\n const set = keys.filter((k) => {\n const v = obj?.[k];\n return v !== undefined && v !== null && v !== \"\";\n });\n if (set.length !== 1) {\n throw ValidationError.client(\n `${context}: pass exactly one of ${keys.map((k) => `\"${k}\"`).join(\", \")}`\n );\n }\n}\n\nexport const MAX_PAGE_LIMIT = 50;\n\nexport function validateLimit(limit: unknown): void {\n if (limit === undefined || limit === null) return;\n if (\n typeof limit !== \"number\" ||\n !Number.isInteger(limit) ||\n limit < 1 ||\n limit > MAX_PAGE_LIMIT\n ) {\n throw ValidationError.client(\n `\"limit\" must be an integer between 1 and ${MAX_PAGE_LIMIT}`\n );\n }\n}\n\n/** Cryptographically random UUID v4, without importing node-only modules at top level. */\nexport async function randomUUID(): Promise<string> {\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (c && typeof c.randomUUID === \"function\") return c.randomUUID();\n // Node 18 without the global Web Crypto object.\n const nodeCrypto = await import(\"node:crypto\");\n return nodeCrypto.randomUUID();\n}\n\n/** Indirection so tests can skip real waits. */\nexport const timing = {\n sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n },\n};\n\nexport function isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\n/** Read an env var without assuming `process` exists (edge runtimes). */\nexport function readEnv(name: string): string | undefined {\n const proc = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process;\n const v = proc?.env?.[name];\n return v === undefined || v === \"\" ? undefined : v;\n}\n\nexport function runtimeVersion(): string {\n const proc = (globalThis as { process?: { version?: string } }).process;\n return proc?.version ? `node/${proc.version}` : \"runtime/unknown\";\n}\n","import {\n ApiError,\n type ApiErrorInit,\n attachErrorReference,\n AuthenticationError,\n ConnectionError,\n type ErrorReference,\n NotFoundError,\n PermissionDeniedError,\n RateLimitError,\n ServerError,\n TimeoutError,\n ValidationError,\n} from \"../errors.js\";\nimport type { TokenManager } from \"../auth.js\";\nimport { SUCCESS_CODES as SUCCESS_CODE_LIST } from \"../constants.js\";\nimport { buildQuery, isRecord, type Query, timing } from \"./utils.js\";\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n\nexport interface RequestOptions {\n method: HttpMethod;\n /** Path starting with `/`, already validated and encoded. */\n path: string;\n query?: Query | undefined;\n body?: unknown;\n /**\n * Token endpoint request:\n * - `\"obtain\"` (issue/refresh): sent without a bearer token, retried like a GET,\n * and any 4xx other than 429 is an AuthenticationError.\n * - `\"revoke\"`: an ordinary authenticated request.\n * Both keep `data` out of error bodies, since it may hold tokens.\n */\n token?: \"obtain\" | \"revoke\";\n /**\n * Idempotency reference of a money-moving request: added to the returned data if\n * missing, and attached to any error as `err.reference`.\n */\n reference?: ErrorReference;\n}\n\nexport interface HttpClientConfig {\n baseUrl: string;\n accountId: string;\n timeout: number;\n maxRetries: number;\n fetch: typeof fetch;\n userAgent: string;\n}\n\nconst SUCCESS_CODES: ReadonlySet<string> = new Set(SUCCESS_CODE_LIST);\nconst MAX_BACKOFF_MS = 8000;\nconst INITIAL_BACKOFF_MS = 500;\nconst MAX_RETRY_AFTER_MS = 60_000;\n\n/** Delay before retry `attempt` (0-based): 0.5 s, 1 s, 2 s … capped at 8 s, with jitter. */\nexport function backoffMs(attempt: number, random: () => number = Math.random): number {\n const base = Math.min(MAX_BACKOFF_MS, INITIAL_BACKOFF_MS * 2 ** attempt);\n // Up to 25% downward jitter so concurrent clients don't retry in lockstep.\n return Math.round(base * (1 - 0.25 * random()));\n}\n\n/** Parse `Retry-After` (seconds or HTTP date) into seconds. */\nexport function parseRetryAfter(\n value: string | null,\n now = Date.now()\n): number | undefined {\n if (value === null || value.trim() === \"\") return undefined;\n const secs = Number(value);\n if (Number.isFinite(secs)) return Math.max(0, secs);\n const date = Date.parse(value);\n if (Number.isNaN(date)) return undefined;\n return Math.max(0, Math.ceil((date - now) / 1000));\n}\n\ninterface ParsedResponse {\n status: number;\n headers: Headers;\n body: unknown;\n}\n\nexport class HttpClient {\n readonly #config: HttpClientConfig;\n #tokens: TokenManager | null = null;\n\n constructor(config: HttpClientConfig) {\n this.#config = config;\n }\n\n setTokenManager(tokens: TokenManager): void {\n this.#tokens = tokens;\n }\n\n /** Make a request and return the unwrapped `data` of a successful envelope. */\n async request<T>(opts: RequestOptions): Promise<T> {\n const { reference } = opts;\n if (!reference) return (await this.#authorized(opts)) as T;\n try {\n return withReference(await this.#authorized(opts), reference) as T;\n } catch (err) {\n // The outcome may be unknown (timeout, 5xx): the caller needs the reference to requery.\n attachErrorReference(err, reference);\n throw err;\n }\n }\n\n async #authorized(opts: RequestOptions): Promise<unknown> {\n if (opts.token === \"obtain\" || !this.#tokens) {\n return this.#send(opts, undefined);\n }\n const token = await this.#tokens.getAccessToken();\n try {\n return await this.#send(opts, token);\n } catch (err) {\n if (!(err instanceof AuthenticationError) || err.httpStatus !== 401) throw err;\n // A 401 means the request was not processed, so retrying once is safe even for POST.\n await this.#tokens.invalidate(token);\n const fresh = await this.#tokens.getAccessToken();\n return this.#send(opts, fresh);\n }\n }\n\n async #send(opts: RequestOptions, token: string | undefined): Promise<unknown> {\n const retryable = opts.method === \"GET\" || opts.token === \"obtain\";\n const maxAttempts = retryable ? this.#config.maxRetries + 1 : 1;\n const url = `${this.#config.baseUrl}${opts.path}${buildQuery(opts.query)}`;\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n accountId: this.#config.accountId,\n \"User-Agent\": this.#config.userAgent,\n };\n if (token !== undefined) headers.Authorization = `Bearer ${token}`;\n const body = opts.body === undefined ? undefined : JSON.stringify(opts.body);\n\n for (let attempt = 0; ; attempt++) {\n const isLast = attempt + 1 >= maxAttempts;\n let res: ParsedResponse;\n try {\n res = await this.#fetchOnce(url, opts.method, headers, body);\n } catch (err) {\n const wrapped =\n err instanceof TimeoutError\n ? new TimeoutError(\n `Nomba request timed out after ${this.#config.timeout} ms [${opts.method} ${opts.path}]`,\n { method: opts.method, path: opts.path }\n )\n : new ConnectionError(\n `Could not connect to Nomba [${opts.method} ${opts.path}]`,\n { method: opts.method, path: opts.path, cause: err }\n );\n if (isLast) throw wrapped;\n await timing.sleep(backoffMs(attempt));\n continue;\n }\n\n if (!isLast && (res.status === 429 || res.status >= 500)) {\n const retryAfter =\n res.status === 429\n ? parseRetryAfter(res.headers.get(\"retry-after\"))\n : undefined;\n await timing.sleep(\n retryAfter !== undefined\n ? Math.min(retryAfter * 1000, MAX_RETRY_AFTER_MS)\n : backoffMs(attempt)\n );\n continue;\n }\n return this.#unwrap(res, opts);\n }\n }\n\n async #fetchOnce(\n url: string,\n method: HttpMethod,\n headers: Record<string, string>,\n body: string | undefined\n ): Promise<ParsedResponse> {\n const controller = new AbortController();\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.#config.timeout);\n try {\n const response = await this.#config.fetch(url, {\n method,\n headers,\n body,\n signal: controller.signal,\n // Never follow redirects: the Authorization header must only go to Nomba.\n redirect: \"error\",\n });\n const text = await response.text();\n return {\n status: response.status,\n headers: response.headers,\n body: parseJson(text),\n };\n } catch (err) {\n if (timedOut) throw new TimeoutError(\"timeout\");\n throw err;\n } finally {\n clearTimeout(timer);\n }\n }\n\n #unwrap(res: ParsedResponse, opts: RequestOptions): unknown {\n const envelope = isRecord(res.body) ? res.body : undefined;\n const rawCode = envelope?.code;\n const code =\n rawCode === undefined || rawCode === null ? undefined : String(rawCode as string);\n const ok = res.status >= 200 && res.status < 300;\n const notJson = typeof res.body === \"string\";\n if (ok && !notJson && (code === undefined || SUCCESS_CODES.has(code))) {\n if (envelope && \"data\" in envelope) return envelope.data;\n return envelope ? null : (res.body ?? null);\n }\n\n const descriptionField = notJson\n ? \"response was not valid JSON\"\n : (envelope?.description ?? envelope?.message);\n const init: ApiErrorInit = {\n httpStatus: res.status,\n code,\n description:\n typeof descriptionField === \"string\" && descriptionField !== \"\"\n ? descriptionField\n : undefined,\n // Token endpoints: never keep a response body that might contain tokens.\n body: opts.token ? redactTokenBody(res.body) : res.body,\n method: opts.method,\n path: opts.path,\n };\n throw errorFor(init, res.headers, opts);\n }\n}\n\nfunction errorFor(init: ApiErrorInit, headers: Headers, opts: RequestOptions): ApiError {\n const status = init.httpStatus ?? 0;\n if (status === 429) {\n return new RateLimitError({\n ...init,\n retryAfter: parseRetryAfter(headers.get(\"retry-after\")),\n rateLimit: {\n limit: headers.get(\"x-rate-limit-limit\") ?? undefined,\n remaining: headers.get(\"x-rate-limit-remaining\") ?? undefined,\n window: headers.get(\"x-rate-limit-window\") ?? undefined,\n },\n });\n }\n if (status >= 500) return new ServerError(init);\n if (opts.token === \"obtain\") return new AuthenticationError(init);\n if (status === 401) return new AuthenticationError(init);\n if (status === 403) return new PermissionDeniedError(init);\n if (status === 404) return new NotFoundError(init);\n if (status === 400 || status === 422) return new ValidationError(init);\n return new ApiError(init);\n}\n\nfunction parseJson(text: string): unknown {\n if (text === \"\") return undefined;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\n/** Add the reference to successful data that doesn't already carry it. */\nfunction withReference(data: unknown, { field, value }: ErrorReference): unknown {\n if (data === null || data === undefined) return { [field]: value };\n if (\n isRecord(data) &&\n (data[field] === undefined || data[field] === null || data[field] === \"\")\n ) {\n return { ...data, [field]: value };\n }\n return data;\n}\n\nfunction redactTokenBody(body: unknown): unknown {\n if (!isRecord(body)) return body;\n const { data: _data, ...rest } = body;\n return rest;\n}\n","import type { CursorPage } from \"../types.js\";\n\n/**\n * Iterate every item across cursor pages. Stops when the cursor is empty or\n * absent, a page has no results, or the server repeats a cursor.\n */\nexport async function* autoPage<T>(\n fetchPage: (cursor: string | undefined) => Promise<CursorPage<T> | null | undefined>,\n startCursor?: string\n): AsyncGenerator<T, void, undefined> {\n let cursor = startCursor;\n const seen = new Set<string>();\n for (;;) {\n const page = await fetchPage(cursor);\n const results = page?.results ?? [];\n for (const item of results) yield item;\n const next = page?.cursor;\n if (!next || results.length === 0 || seen.has(next)) return;\n seen.add(next);\n cursor = next;\n }\n}\n","import type { HttpClient, RequestOptions } from \"../internal/http.js\";\nimport { encodePathSegment, randomUUID } from \"../internal/utils.js\";\nimport type { SubAccountOption } from \"../types.js\";\n\nexport interface ResourceContext {\n http: HttpClient;\n environment: \"sandbox\" | \"production\";\n}\n\nexport abstract class Resource {\n protected readonly ctx: ResourceContext;\n\n constructor(ctx: ResourceContext) {\n this.ctx = ctx;\n }\n\n protected request<T>(opts: RequestOptions): Promise<T> {\n return this.ctx.http.request<T>(opts);\n }\n\n /** `path` + `/{subAccountId}` (when given) + `suffix`. */\n protected withSubAccount(\n path: string,\n subAccountId: string | undefined,\n suffix = \"\"\n ): string {\n const sub =\n subAccountId === undefined\n ? \"\"\n : `/${encodePathSegment(subAccountId, \"subAccountId\")}`;\n return `${path}${sub}${suffix}`;\n }\n\n /**\n * Money-moving POST with a `merchantTxRef`: generate one if missing. The request\n * layer returns it on the result and attaches it to any error.\n */\n protected async withMerchantTxRef<T>(\n path: string,\n params: object,\n options: SubAccountOption = {}\n ): Promise<T & { merchantTxRef: string }> {\n const body = { ...params } as Record<string, unknown>;\n if (typeof body.merchantTxRef !== \"string\" || body.merchantTxRef === \"\") {\n body.merchantTxRef = await randomUUID();\n }\n return this.request({\n method: \"POST\",\n path: this.withSubAccount(path, options.subAccountId),\n body,\n reference: { field: \"merchantTxRef\", value: body.merchantTxRef as string },\n });\n }\n}\n\nexport const seg = encodePathSegment;\n","import { requireExactlyOne, validateLimit } from \"../internal/utils.js\";\nimport { autoPage } from \"../internal/pagination.js\";\nimport type {\n Account,\n Balance,\n CursorPage,\n GetBalanceParams,\n GetSubAccountParams,\n ListTerminalsParams,\n Terminal,\n} from \"../types.js\";\nimport { Resource } from \"./base.js\";\n\nexport class Accounts extends Resource {\n /** Parent account details. `GET /v1/accounts/parent` */\n async getParent(): Promise<Account> {\n return this.request({ method: \"GET\", path: \"/v1/accounts/parent\" });\n }\n\n /** Balance of the parent account, or of a sub account. */\n async getBalance(params: GetBalanceParams = {}): Promise<Balance> {\n return this.request({\n method: \"GET\",\n path: this.withSubAccount(\"/v1/accounts\", params.subAccountId, \"/balance\"),\n });\n }\n\n /** Sub account details by `accountId` or `accountRef` (exactly one). */\n async getSubAccount(params: GetSubAccountParams): Promise<Account> {\n requireExactlyOne(\n params as Record<string, unknown>,\n [\"accountId\", \"accountRef\"],\n \"accounts.getSubAccount\"\n );\n return this.request({\n method: \"GET\",\n path: \"/v1/accounts/sub-account-details\",\n query: { accountId: params.accountId, accountRef: params.accountRef },\n });\n }\n\n /** One page of terminals on the parent account or a sub account. */\n async listTerminals(params: ListTerminalsParams = {}): Promise<CursorPage<Terminal>> {\n const { subAccountId, ...query } = params;\n validateLimit(query.limit);\n return this.request({\n method: \"GET\",\n path: this.withSubAccount(\"/v1/accounts\", subAccountId, \"/terminals\"),\n query: { ...query },\n });\n }\n\n /** Every terminal, across pages: `for await (const t of nomba.accounts.listAllTerminals())`. */\n async *listAllTerminals(\n params: Omit<ListTerminalsParams, \"cursor\"> = {}\n ): AsyncGenerator<Terminal> {\n validateLimit(params.limit);\n yield* autoPage((cursor) => this.listTerminals({ ...params, cursor }));\n }\n}\n","import type { TokenManager } from \"../auth.js\";\nimport type { RevokeTokenResult } from \"../types.js\";\nimport { Resource, type ResourceContext } from \"./base.js\";\n\nexport class AuthResource extends Resource {\n readonly #tokens: TokenManager;\n readonly #clientId: string;\n\n constructor(ctx: ResourceContext, tokens: TokenManager, clientId: string) {\n super(ctx);\n this.#tokens = tokens;\n this.#clientId = clientId;\n }\n\n /**\n * Revoke the cached access token (`POST /v1/auth/token/revoke`) and clear the\n * token store. Does nothing and returns `null` when no token is cached.\n */\n async revoke(): Promise<RevokeTokenResult | null> {\n const token = await this.#tokens.current();\n if (!token) return null;\n try {\n return await this.request<RevokeTokenResult | null>({\n method: \"POST\",\n path: \"/v1/auth/token/revoke\",\n body: { clientId: this.#clientId, access_token: token.accessToken },\n token: \"revoke\",\n });\n } finally {\n await this.#tokens.clear();\n }\n }\n}\n","import { requireFields } from \"../internal/utils.js\";\nimport type {\n BettingProvider,\n BillPurchaseResult,\n BuyAirtimeParams,\n BuyDataParams,\n BuyElectricityParams,\n CableTvPlan,\n CableTvType,\n DataPlan,\n ElectricityCustomer,\n FundBettingParams,\n LookupBettingCustomerParams,\n LookupCableTvCustomerParams,\n LookupElectricityCustomerParams,\n PayCableTvParams,\n SubAccountOption,\n} from \"../types.js\";\nimport { Resource, seg } from \"./base.js\";\n\n/**\n * Bill payments. Purchases use the v2 endpoints, generate a `merchantTxRef` if\n * you don't pass one, and are never retried automatically.\n */\nexport class Bills extends Resource {\n async buyAirtime(\n params: BuyAirtimeParams,\n options: SubAccountOption = {}\n ): Promise<BillPurchaseResult> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"amount\", \"phoneNumber\", \"network\"],\n \"bills.buyAirtime\"\n );\n return this.withMerchantTxRef(\"/v2/bill/topup\", params, options);\n }\n\n async buyData(\n params: BuyDataParams,\n options: SubAccountOption = {}\n ): Promise<BillPurchaseResult> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"productId\", \"phoneNumber\", \"network\"],\n \"bills.buyData\"\n );\n return this.withMerchantTxRef(\"/v2/bill/data\", params, options);\n }\n\n /** Data plans for a telco (e.g. `mtn`). The telco is lowercased. */\n async listDataPlans(telco: string): Promise<DataPlan[]> {\n const t = typeof telco === \"string\" ? telco.toLowerCase() : telco;\n return this.request({ method: \"GET\", path: `/v1/bill/data-plan/${seg(t, \"telco\")}` });\n }\n\n async buyElectricity(\n params: BuyElectricityParams,\n options: SubAccountOption = {}\n ): Promise<BillPurchaseResult> {\n return this.withMerchantTxRef(\"/v2/bill/electricity\", params, options);\n }\n\n /** Electricity distribution companies (discos). */\n async listElectricityProviders(): Promise<unknown[]> {\n return this.request({ method: \"GET\", path: \"/v1/bill/electricity/discos\" });\n }\n\n async lookupElectricityCustomer(\n params: LookupElectricityCustomerParams\n ): Promise<ElectricityCustomer> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"disco\", \"customerId\"],\n \"bills.lookupElectricityCustomer\"\n );\n return this.request({\n method: \"GET\",\n path: \"/v2/bill/electricity/lookup\",\n query: { disco: params.disco, customerId: params.customerId },\n });\n }\n\n async payCableTv(\n params: PayCableTvParams,\n options: SubAccountOption = {}\n ): Promise<BillPurchaseResult> {\n return this.withMerchantTxRef(\"/v2/bill/cabletv\", params, options);\n }\n\n async listCableTvPlans(cableTvType: CableTvType): Promise<CableTvPlan[]> {\n requireFields({ cableTvType }, [\"cableTvType\"], \"bills.listCableTvPlans\");\n return this.request({\n method: \"GET\",\n path: \"/v1/bill/cableTvProduct\",\n query: { cableTvType },\n });\n }\n\n /** Returns the customer's name. */\n async lookupCableTvCustomer(params: LookupCableTvCustomerParams): Promise<string> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"customerId\", \"cableTvType\"],\n \"bills.lookupCableTvCustomer\"\n );\n return this.request({\n method: \"GET\",\n path: \"/v1/bill/cabletv/lookup\",\n query: { customerId: params.customerId, cableTvType: params.cableTvType },\n });\n }\n\n async fundBetting(\n params: FundBettingParams,\n options: SubAccountOption = {}\n ): Promise<BillPurchaseResult> {\n return this.withMerchantTxRef(\"/v2/bill/betting\", params, options);\n }\n\n async listBettingProviders(): Promise<BettingProvider[]> {\n return this.request({ method: \"GET\", path: \"/v1/bill/betting/providers\" });\n }\n\n /** Returns the customer's name. */\n async lookupBettingCustomer(params: LookupBettingCustomerParams): Promise<string> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"providerId\", \"customerId\"],\n \"bills.lookupBettingCustomer\"\n );\n return this.request({\n method: \"GET\",\n path: \"/v1/bill/betting/lookup\",\n query: { providerId: params.providerId, customerId: params.customerId },\n });\n }\n}\n","import { ValidationError } from \"../errors.js\";\nimport type { RequestOptions } from \"../internal/http.js\";\nimport { isRecord, randomUUID, requireFields } from \"../internal/utils.js\";\nimport type {\n CancelTransactionParams,\n ChargeSavedCardParams,\n ChargeSavedCardResult,\n CheckoutTransaction,\n ConfirmTransactionReceiptResult,\n CreateOrderParams,\n CreateOrderResult,\n DeleteSavedCardParams,\n GetCheckoutTransactionParams,\n GetOrderResult,\n GetSavedCardsParams,\n ListSavedCardsParams,\n OrderReferenceParams,\n RefundParams,\n RequestSaveCardOtpParams,\n SavedCardList,\n StatusMessage,\n SubmitCardDetailsParams,\n SubmitCardDetailsResult,\n SubmitCardOtpParams,\n SubmitCardOtpResult,\n SubmitUserOtpParams,\n SuccessMessage,\n TransferAccount,\n UpdateSavedCardEmailParams,\n UpdateSavedCardEmailResult,\n UserSavedCards,\n} from \"../types.js\";\nimport { Resource, seg } from \"./base.js\";\n\ntype Params = Record<string, unknown>;\n\nexport class Checkout extends Resource {\n /** Create a hosted checkout order and get its `checkoutLink`. */\n async createOrder(params: CreateOrderParams): Promise<CreateOrderResult> {\n if (!isRecord(params?.order)) {\n throw ValidationError.client('checkout.createOrder: \"order\" is required');\n }\n return this.request({ method: \"POST\", path: \"/v1/checkout/order\", body: params });\n }\n\n async getOrder(orderReference: string): Promise<GetOrderResult> {\n return this.request({\n method: \"GET\",\n path: `/v1/checkout/order/${seg(orderReference, \"orderReference\")}`,\n });\n }\n\n async cancelOrder(params: OrderReferenceParams): Promise<SuccessMessage> {\n requireFields(\n params as unknown as Params,\n [\"orderReference\"],\n \"checkout.cancelOrder\"\n );\n return this.request({\n method: \"POST\",\n path: \"/v1/checkout/order/cancel\",\n body: params,\n });\n }\n\n /** A checkout transaction by order ID or order reference. */\n async getTransaction(\n params: GetCheckoutTransactionParams\n ): Promise<CheckoutTransaction> {\n requireFields(\n params as unknown as Params,\n [\"idType\", \"id\"],\n \"checkout.getTransaction\"\n );\n return this.request({\n method: \"GET\",\n path: \"/v1/checkout/transaction\",\n query: { idType: params.idType, id: params.id },\n });\n }\n\n /** Refund a checkout transaction. Never retried automatically. */\n async refund(params: RefundParams): Promise<SuccessMessage> {\n requireFields(params as unknown as Params, [\"transactionId\"], \"checkout.refund\");\n return this.request({ method: \"POST\", path: \"/v1/checkout/refund\", body: params });\n }\n\n /**\n * Charge a saved (tokenized) card. This endpoint has no `merchantTxRef`; its\n * reference is `order.orderReference`. If you omit it the SDK generates one\n * (UUID v4) and returns it as `orderReference`. Never retried automatically.\n */\n async chargeSavedCard(params: ChargeSavedCardParams): Promise<ChargeSavedCardResult> {\n requireFields(params as unknown as Params, [\"tokenKey\"], \"checkout.chargeSavedCard\");\n const body: Params = { ...params };\n let reference: RequestOptions[\"reference\"];\n if (isRecord(params.order)) {\n const order: Params = { ...params.order };\n if (typeof order.orderReference !== \"string\" || order.orderReference === \"\") {\n order.orderReference = await randomUUID();\n }\n reference = { field: \"orderReference\", value: order.orderReference as string };\n body.order = order;\n }\n return this.request({\n method: \"POST\",\n path: \"/v1/checkout/tokenized-card-payment\",\n body,\n reference,\n });\n }\n\n /** Saved cards, filtered by customer email and/or date range (page-numbered). */\n async listSavedCards(params: ListSavedCardsParams = {}): Promise<SavedCardList> {\n return this.request({\n method: \"GET\",\n path: \"/v1/checkout/tokenized-card-data\",\n query: { ...params },\n });\n }\n\n async updateSavedCardEmail(\n params: UpdateSavedCardEmailParams\n ): Promise<UpdateSavedCardEmailResult> {\n requireFields(\n params as unknown as Params,\n [\"tokenKey\", \"currentEmailAddress\", \"newEmailAddress\"],\n \"checkout.updateSavedCardEmail\"\n );\n return this.request({\n method: \"POST\",\n path: \"/v1/checkout/tokenized-card-data\",\n body: params,\n });\n }\n\n /** Delete a saved card. Sends a JSON body with DELETE. */\n async deleteSavedCard(params: DeleteSavedCardParams): Promise<StatusMessage> {\n requireFields(params as unknown as Params, [\"tokenKey\"], \"checkout.deleteSavedCard\");\n return this.request({\n method: \"DELETE\",\n path: \"/v1/checkout/tokenized-card-data\",\n body: params,\n });\n }\n\n /** The bank account a customer can transfer to for this order. */\n async getTransferAccount(orderReference: string): Promise<TransferAccount> {\n return this.request({\n method: \"GET\",\n path: `/v1/checkout/get-checkout-kta/${seg(orderReference, \"orderReference\")}`,\n });\n }\n\n async submitCardDetails(\n params: SubmitCardDetailsParams\n ): Promise<SubmitCardDetailsResult> {\n return this.request({\n method: \"POST\",\n path: \"/v1/checkout/checkout-card-detail\",\n body: params,\n });\n }\n\n async submitCardOtp(params: SubmitCardOtpParams): Promise<SubmitCardOtpResult> {\n requireFields(\n params as unknown as Params,\n [\"otp\", \"orderReference\", \"transactionId\"],\n \"checkout.submitCardOtp\"\n );\n return this.request({\n method: \"POST\",\n path: \"/v1/checkout/checkout-card-otp\",\n body: params,\n });\n }\n\n async resendOtp(params: OrderReferenceParams): Promise<SuccessMessage> {\n requireFields(params as unknown as Params, [\"orderReference\"], \"checkout.resendOtp\");\n return this.request({\n method: \"POST\",\n path: \"/v1/checkout/resend-otp\",\n body: params,\n });\n }\n\n async confirmTransactionReceipt(\n params: OrderReferenceParams\n ): Promise<ConfirmTransactionReceiptResult> {\n requireFields(\n params as unknown as Params,\n [\"orderReference\"],\n \"checkout.confirmTransactionReceipt\"\n );\n return this.request({\n method: \"POST\",\n path: \"/v1/checkout/confirm-transaction-receipt\",\n body: params,\n });\n }\n\n async cancelTransaction(params: CancelTransactionParams): Promise<SuccessMessage> {\n requireFields(\n params as unknown as Params,\n [\"transactionId\", \"forceCancel\"],\n \"checkout.cancelTransaction\"\n );\n return this.request({\n method: \"POST\",\n path: \"/v1/checkout/transaction/cancel\",\n body: params,\n });\n }\n\n /** Send an OTP to a customer who wants to save their card. */\n async requestSaveCardOtp(params: RequestSaveCardOtpParams): Promise<SuccessMessage> {\n requireFields(\n params as unknown as Params,\n [\"orderReference\", \"phoneNumber\"],\n \"checkout.requestSaveCardOtp\"\n );\n return this.request({\n method: \"POST\",\n path: \"/v1/checkout/user-card/auth\",\n body: params,\n });\n }\n\n /** Send an OTP to a customer who already has saved cards. */\n async requestSavedCardsOtp(params: OrderReferenceParams): Promise<SuccessMessage> {\n requireFields(\n params as unknown as Params,\n [\"orderReference\"],\n \"checkout.requestSavedCardsOtp\"\n );\n return this.request({\n method: \"POST\",\n path: \"/v1/checkout/user-card/saved-card/auth\",\n body: params,\n });\n }\n\n async submitUserOtp(params: SubmitUserOtpParams): Promise<SuccessMessage> {\n requireFields(\n params as unknown as Params,\n [\"orderReference\", \"phoneNumber\", \"otp\"],\n \"checkout.submitUserOtp\"\n );\n return this.request({ method: \"POST\", path: \"/v1/checkout/user-card\", body: params });\n }\n\n /** The customer's saved cards for this order, after OTP verification. */\n async getSavedCards(\n orderReference: string,\n params: GetSavedCardsParams\n ): Promise<UserSavedCards> {\n requireFields(params as unknown as Params, [\"otp\"], \"checkout.getSavedCards\");\n return this.request({\n method: \"GET\",\n path: `/v1/checkout/user-card/${seg(orderReference, \"orderReference\")}`,\n query: { otp: params.otp },\n });\n }\n}\n","import { requireFields } from \"../internal/utils.js\";\nimport type {\n CreateMandateParams,\n CreateMandateResult,\n DebitMandateParams,\n DebitMandateResult,\n ListMandatesParams,\n MandateList,\n MandateStatus,\n UpdateMandateStatusParams,\n UpdateMandateStatusResult,\n} from \"../types.js\";\nimport { Resource } from \"./base.js\";\n\nexport class DirectDebits extends Resource {\n async createMandate(params: CreateMandateParams): Promise<CreateMandateResult> {\n return this.request({ method: \"POST\", path: \"/v1/direct-debits\", body: params });\n }\n\n /** Debit a customer against an active mandate. Never retried automatically. */\n async debitMandate(params: DebitMandateParams): Promise<DebitMandateResult> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"mandateId\", \"amount\"],\n \"directDebits.debitMandate\"\n );\n return this.request({\n method: \"POST\",\n path: \"/v1/direct-debits/debit-mandate\",\n body: params,\n });\n }\n\n async getMandateStatus(mandateId: string): Promise<MandateStatus> {\n requireFields({ mandateId }, [\"mandateId\"], \"directDebits.getMandateStatus\");\n return this.request({\n method: \"GET\",\n path: \"/v1/direct-debits/status\",\n query: { mandateId },\n });\n }\n\n async listMandates(params: ListMandatesParams = {}): Promise<MandateList> {\n return this.request({\n method: \"GET\",\n path: \"/v1/direct-debits/mandates\",\n query: { ...params },\n });\n }\n\n async updateMandateStatus(\n params: UpdateMandateStatusParams\n ): Promise<UpdateMandateStatusResult> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"mandateId\", \"status\"],\n \"directDebits.updateMandateStatus\"\n );\n return this.request({\n method: \"PUT\",\n path: \"/v1/direct-debits/update-status\",\n body: params,\n });\n }\n}\n","import type {\n CollectionTransaction,\n InitiateInflowParams,\n InitiateInflowResult,\n Provider,\n} from \"../types.js\";\nimport { Resource, seg } from \"./base.js\";\n\nexport class GlobalCollection extends Resource {\n /** Mobile-money providers for DRC inflows. */\n async listDrcProviders(): Promise<Provider[]> {\n return this.request({\n method: \"GET\",\n path: \"/v1/global-collection/drc/inflow/providers\",\n });\n }\n\n /** Start a mobile-money inflow. Never retried automatically. */\n async initiateInflow(params: InitiateInflowParams): Promise<InitiateInflowResult> {\n return this.request({\n method: \"POST\",\n path: \"/v1/global-collection/inflow/initiate\",\n body: params,\n });\n }\n\n async getTransaction(transactionId: string): Promise<CollectionTransaction> {\n return this.request({\n method: \"GET\",\n path: `/v1/global-collection/transactions/${seg(transactionId, \"transactionId\")}`,\n });\n }\n}\n","import type {\n AuthorizeExchangeParams,\n AuthorizeExchangeResult,\n AuthorizeTransferParams,\n AuthorizeTransferResult,\n ConvertMoneyParams,\n ConvertMoneyResult,\n ExchangeRates,\n GetExchangeRatesParams,\n GlobalPayoutAccount,\n GlobalPayoutTransaction,\n ListBankProvidersParams,\n ListPaymentMethodsParams,\n PaymentMethod,\n Provider,\n} from \"../types.js\";\nimport { requireFields } from \"../internal/utils.js\";\nimport { Resource, seg } from \"./base.js\";\n\n/** Cross-border payouts. The sandbox uses separate paths for the account methods. */\nexport class GlobalPayout extends Resource {\n #accountsPath(): string {\n return this.ctx.environment === \"sandbox\"\n ? \"/v1/sandbox/global-payout/accounts\"\n : \"/v1/global-payout/accounts\";\n }\n\n async listAccounts(): Promise<GlobalPayoutAccount[]> {\n return this.request({ method: \"GET\", path: this.#accountsPath() });\n }\n\n async getAccount(accountId: string): Promise<GlobalPayoutAccount> {\n return this.request({\n method: \"GET\",\n path: `${this.#accountsPath()}/${seg(accountId, \"accountId\")}`,\n });\n }\n\n async listBankProviders(params: ListBankProvidersParams = {}): Promise<Provider[]> {\n return this.request({\n method: \"GET\",\n path: \"/v1/global-payout/bank/providers\",\n query: { ...params },\n });\n }\n\n async getExchangeRates(params: GetExchangeRatesParams): Promise<ExchangeRates> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"from\", \"to\"],\n \"globalPayout.getExchangeRates\"\n );\n return this.request({\n method: \"GET\",\n path: \"/v1/global-payout/exchange-rates\",\n query: { ...params },\n });\n }\n\n async listPaymentMethods(\n params: ListPaymentMethodsParams = {}\n ): Promise<PaymentMethod[]> {\n return this.request({\n method: \"GET\",\n path: \"/v1/global-payout/payment-methods\",\n query: { ...params },\n });\n }\n\n async getTransaction(transactionId: string): Promise<GlobalPayoutTransaction> {\n return this.request({\n method: \"GET\",\n path: `/v1/global-payout/transactions/${seg(transactionId, \"transactionId\")}`,\n });\n }\n\n /** Never retried automatically; pass an `idempotencyKey` and reuse it when retrying. */\n async authorizeExchange(\n params: AuthorizeExchangeParams\n ): Promise<AuthorizeExchangeResult> {\n return this.request({\n method: \"POST\",\n path: \"/v1/global-payout/exchange/authorize\",\n body: params,\n });\n }\n\n async convertMoney(params: ConvertMoneyParams): Promise<ConvertMoneyResult> {\n return this.request({\n method: \"POST\",\n path: \"/v1/global-payout/money/convert\",\n body: params,\n });\n }\n\n /** Never retried automatically; pass an `idempotencyKey` and reuse it when retrying. */\n async authorizeTransfer(\n params: AuthorizeTransferParams\n ): Promise<AuthorizeTransferResult> {\n return this.request({\n method: \"POST\",\n path: \"/v1/global-payout/transfer/authorize\",\n body: params,\n });\n }\n}\n","import { requireFields } from \"../internal/utils.js\";\nimport type {\n AssignTerminalParams,\n SubAccountOption,\n Terminal,\n TerminalPaymentRequestParams,\n TerminalPaymentRequestResult,\n} from \"../types.js\";\nimport { Resource, seg } from \"./base.js\";\n\nexport class Terminals extends Resource {\n /** Assign a terminal to the parent account or a sub account. */\n async assign(\n params: AssignTerminalParams,\n options: SubAccountOption = {}\n ): Promise<Terminal> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"serialNumber\"],\n \"terminals.assign\"\n );\n return this.request({\n method: \"POST\",\n path: this.withSubAccount(\"/v1/terminals/assign\", options.subAccountId),\n body: params,\n });\n }\n\n /** Un-assign a terminal from the parent account or a sub account. */\n async unassign(\n params: AssignTerminalParams,\n options: SubAccountOption = {}\n ): Promise<Terminal> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"serialNumber\"],\n \"terminals.unassign\"\n );\n return this.request({\n method: \"POST\",\n path: this.withSubAccount(\"/v1/terminals/unassign\", options.subAccountId),\n body: params,\n });\n }\n\n /** Push a payment request to a terminal. */\n async sendPaymentRequest(\n terminalId: string,\n params: TerminalPaymentRequestParams\n ): Promise<TerminalPaymentRequestResult> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"merchantTxRef\", \"amount\", \"currency\"],\n \"terminals.sendPaymentRequest\"\n );\n return this.request({\n method: \"POST\",\n path: `/v1/terminals/payment-request/${seg(terminalId, \"terminalId\")}`,\n body: params,\n });\n }\n}\n","import { autoPage } from \"../internal/pagination.js\";\nimport { requireExactlyOne, validateLimit } from \"../internal/utils.js\";\nimport type {\n BankTransaction,\n CursorPage,\n GetTransactionParams,\n ListBankTransactionsParams,\n ListTransactionsParams,\n Transaction,\n TransactionFilters,\n} from \"../types.js\";\nimport { Resource, seg } from \"./base.js\";\n\nconst REFERENCE_KEYS = [\n \"transactionRef\",\n \"merchantTxRef\",\n \"orderReference\",\n \"orderId\",\n] as const;\n\nexport class Transactions extends Resource {\n #accountsPath(subAccountId: string | undefined, suffix = \"\"): string {\n return this.withSubAccount(\"/v1/transactions/accounts\", subAccountId, suffix);\n }\n\n /** One page of transactions on the parent account or a sub account. */\n async list(params: ListTransactionsParams = {}): Promise<CursorPage<Transaction>> {\n const { subAccountId, ...query } = params;\n validateLimit(query.limit);\n return this.request({\n method: \"GET\",\n path: this.#accountsPath(subAccountId),\n query: { ...query },\n });\n }\n\n /** Every transaction, across pages: `for await (const tx of nomba.transactions.listAll())`. */\n async *listAll(\n params: Omit<ListTransactionsParams, \"cursor\"> = {}\n ): AsyncGenerator<Transaction> {\n validateLimit(params.limit);\n yield* autoPage((cursor) => this.list({ ...params, cursor }));\n }\n\n /** One page of transactions matching `filters`. */\n async filter(\n filters: TransactionFilters = {},\n params: ListTransactionsParams = {}\n ): Promise<CursorPage<Transaction>> {\n const { subAccountId, ...query } = params;\n validateLimit(query.limit);\n return this.request({\n method: \"POST\",\n path: this.#accountsPath(subAccountId),\n query: { ...query },\n body: filters,\n });\n }\n\n /** Every transaction matching `filters`, across pages. */\n async *filterAll(\n filters: TransactionFilters = {},\n params: Omit<ListTransactionsParams, \"cursor\"> = {}\n ): AsyncGenerator<Transaction> {\n validateLimit(params.limit);\n yield* autoPage((cursor) => this.filter(filters, { ...params, cursor }));\n }\n\n /** One transaction, by exactly one of `transactionRef`, `merchantTxRef`, `orderReference`, `orderId`. */\n async get(params: GetTransactionParams): Promise<Transaction> {\n requireExactlyOne(\n params as Record<string, unknown>,\n REFERENCE_KEYS,\n \"transactions.get\"\n );\n const { subAccountId, ...query } = params;\n return this.request({\n method: \"GET\",\n path: this.#accountsPath(subAccountId, \"/single\"),\n query: { ...query },\n });\n }\n\n /** One page of credits/debits on the parent account. */\n async listBankTransactions(\n params: ListBankTransactionsParams = {}\n ): Promise<CursorPage<BankTransaction>> {\n validateLimit(params.limit);\n return this.request({\n method: \"GET\",\n path: \"/v1/transactions/bank\",\n query: { ...params },\n });\n }\n\n /** Every credit/debit on the parent account, across pages. */\n async *listAllBankTransactions(\n params: Omit<ListBankTransactionsParams, \"cursor\"> = {}\n ): AsyncGenerator<BankTransaction> {\n validateLimit(params.limit);\n yield* autoPage((cursor) => this.listBankTransactions({ ...params, cursor }));\n }\n\n /** Confirm a transaction's status by its NIP `sessionId`. */\n async requery(sessionId: string): Promise<Transaction> {\n return this.request({\n method: \"GET\",\n path: `/v1/transactions/requery/${seg(sessionId, \"sessionId\")}`,\n });\n }\n}\n","import { requireFields } from \"../internal/utils.js\";\nimport type {\n AccountLookupResult,\n Bank,\n BankTransferParams,\n BankTransferResult,\n LookupAccountParams,\n SubAccountOption,\n WalletTransferParams,\n WalletTransferResult,\n} from \"../types.js\";\nimport { Resource } from \"./base.js\";\n\nexport class Transfers extends Resource {\n /** Bank codes and names. */\n async listBanks(): Promise<Bank[]> {\n return this.request({ method: \"GET\", path: \"/v1/transfers/banks\" });\n }\n\n /** Resolve the account name for an account number and bank code. */\n async lookupAccount(params: LookupAccountParams): Promise<AccountLookupResult> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"accountNumber\", \"bankCode\"],\n \"transfers.lookupAccount\"\n );\n return this.request({\n method: \"POST\",\n path: \"/v1/transfers/bank/lookup\",\n body: { accountNumber: params.accountNumber, bankCode: params.bankCode },\n });\n }\n\n /**\n * Transfer to a bank account. Never retried automatically. Pass your own\n * `merchantTxRef` (or keep the generated one from the result) to requery.\n */\n async toBank(\n params: BankTransferParams,\n options: SubAccountOption = {}\n ): Promise<BankTransferResult> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"amount\", \"accountNumber\", \"accountName\", \"bankCode\"],\n \"transfers.toBank\"\n );\n return this.withMerchantTxRef(\"/v2/transfers/bank\", params, options);\n }\n\n /** Transfer to another Nomba wallet. Never retried automatically. */\n async toWallet(\n params: WalletTransferParams,\n options: SubAccountOption = {}\n ): Promise<WalletTransferResult> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"amount\", \"receiverAccountId\"],\n \"transfers.toWallet\"\n );\n return this.withMerchantTxRef(\"/v2/transfers/wallet\", params, options);\n }\n}\n","import { autoPage } from \"../internal/pagination.js\";\nimport { requireFields, validateLimit } from \"../internal/utils.js\";\nimport type {\n CreateVirtualAccountParams,\n CursorPage,\n ExpireVirtualAccountResult,\n PageOptions,\n SubAccountOption,\n UpdateVirtualAccountParams,\n UpdateVirtualAccountResult,\n VirtualAccount,\n VirtualAccountFilters,\n} from \"../types.js\";\nimport { Resource, seg } from \"./base.js\";\n\nexport class VirtualAccounts extends Resource {\n /** Create a virtual account on the parent account or a sub account. */\n async create(\n params: CreateVirtualAccountParams,\n options: SubAccountOption = {}\n ): Promise<VirtualAccount> {\n requireFields(\n params as unknown as Record<string, unknown>,\n [\"accountRef\", \"accountName\"],\n \"virtualAccounts.create\"\n );\n return this.request({\n method: \"POST\",\n path: this.withSubAccount(\"/v1/accounts/virtual\", options.subAccountId),\n body: params,\n });\n }\n\n /** Fetch a virtual account by its account reference or number. */\n async get(identifier: string): Promise<VirtualAccount> {\n return this.request({\n method: \"GET\",\n path: `/v1/accounts/virtual/${seg(identifier, \"identifier\")}`,\n });\n }\n\n async update(\n identifier: string,\n params: UpdateVirtualAccountParams\n ): Promise<UpdateVirtualAccountResult> {\n return this.request({\n method: \"PUT\",\n path: `/v1/accounts/virtual/${seg(identifier, \"identifier\")}`,\n body: params,\n });\n }\n\n /** Expire (close) a virtual account. */\n async expire(identifier: string): Promise<ExpireVirtualAccountResult> {\n return this.request({\n method: \"DELETE\",\n path: `/v1/accounts/virtual/${seg(identifier, \"identifier\")}`,\n });\n }\n\n /** One page of virtual accounts matching `filters`. */\n async list(\n filters: VirtualAccountFilters = {},\n options: PageOptions = {}\n ): Promise<CursorPage<VirtualAccount>> {\n validateLimit(options.limit);\n return this.request({\n method: \"POST\",\n path: \"/v1/accounts/virtual/list\",\n query: { limit: options.limit, cursor: options.cursor },\n body: filters,\n });\n }\n\n /** Every virtual account matching `filters`, across pages. */\n async *listAll(\n filters: VirtualAccountFilters = {},\n options: Omit<PageOptions, \"cursor\"> = {}\n ): AsyncGenerator<VirtualAccount> {\n validateLimit(options.limit);\n yield* autoPage((cursor) => this.list(filters, { limit: options.limit, cursor }));\n }\n}\n","/** SDK version. Kept in sync with package.json (checked by a unit test). */\nexport const VERSION = \"0.1.0\";\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { WebhookVerificationError } from \"./errors.js\";\nimport { isRecord } from \"./internal/utils.js\";\nimport type { WebhookEvent } from \"./types.js\";\n\n/** Headers as a fetch `Headers` object or a plain object (e.g. Node's `req.headers`). */\nexport type WebhookHeaders =\n { get(name: string): string | null } | Record<string, string | string[] | undefined>;\n\nexport interface VerifyWebhookOptions {\n /**\n * Reject events whose `nomba-timestamp` is more than this many seconds away from\n * now (replay protection). Off by default.\n */\n toleranceSeconds?: number;\n /** Override the clock (for tests). */\n now?: Date;\n}\n\nfunction header(headers: WebhookHeaders, name: string): string | undefined {\n if (typeof (headers as { get?: unknown }).get === \"function\") {\n const v = (headers as { get(name: string): string | null }).get(name);\n return v ?? undefined;\n }\n const record = headers as Record<string, string | string[] | undefined>;\n for (const key of Object.keys(record)) {\n if (key.toLowerCase() === name) {\n const v = record[key];\n return Array.isArray(v) ? v[0] : v;\n }\n }\n return undefined;\n}\n\nfunction field(v: unknown): string {\n if (v === undefined || v === null) return \"\";\n return typeof v === \"string\" ? v : String(v as number);\n}\n\n/** Strict RFC 3339, e.g. `2025-09-29T10:51:44Z` or `2025-09-29T11:51:44.123+01:00`. */\nconst RFC3339 = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/;\n\n/** `responseCode` as signed: null, absent and the string \"null\" all become \"\". */\nfunction signedResponseCode(event: WebhookEvent): string {\n const responseCode = field(event.data.transaction.responseCode);\n return responseCode === \"null\" ? \"\" : responseCode;\n}\n\n/** The string Nomba signs, per https://developer.nomba.com/docs/api-basics/webhook */\nexport function webhookSignedMessage(event: WebhookEvent, timestamp: string): string {\n const { merchant, transaction } = event.data;\n return [\n event.event_type,\n event.requestId,\n field(merchant.userId),\n field(merchant.walletId),\n field(transaction.transactionId),\n field(transaction.type),\n field(transaction.time),\n signedResponseCode(event),\n timestamp,\n ].join(\":\");\n}\n\n/** base64(HMAC-SHA256(signingKey, message)). */\nexport function computeWebhookSignature(\n event: WebhookEvent,\n timestamp: string,\n signingKey: string\n): string {\n return createHmac(\"sha256\", signingKey)\n .update(webhookSignedMessage(event, timestamp), \"utf8\")\n .digest(\"base64\");\n}\n\nfunction parseEvent(rawBody: string | Uint8Array | ArrayBuffer): WebhookEvent {\n if (\n typeof rawBody !== \"string\" &&\n !(rawBody instanceof Uint8Array) &&\n !(rawBody instanceof ArrayBuffer)\n ) {\n throw new WebhookVerificationError(\n \"Webhook body must be the raw request body as a string or bytes, not a parsed object\"\n );\n }\n const text =\n typeof rawBody === \"string\"\n ? rawBody\n : new TextDecoder(\"utf-8\").decode(\n rawBody instanceof ArrayBuffer ? new Uint8Array(rawBody) : rawBody\n );\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new WebhookVerificationError(\"Webhook body is not valid JSON\");\n }\n if (\n !isRecord(parsed) ||\n typeof parsed.event_type !== \"string\" ||\n typeof parsed.requestId !== \"string\" ||\n !isRecord(parsed.data) ||\n !isRecord(parsed.data.merchant) ||\n !isRecord(parsed.data.transaction)\n ) {\n throw new WebhookVerificationError(\n \"Webhook body is missing event_type, requestId, data.merchant or data.transaction\"\n );\n }\n return parsed as WebhookEvent;\n}\n\n/**\n * Verify a Nomba webhook and return the parsed event. Throws\n * {@link WebhookVerificationError} if the signature or payload is not valid.\n *\n * Pass the **raw** request body exactly as received. Re-serialising a parsed\n * object can change it and break verification.\n */\nexport function verifyWebhook(\n rawBody: string | Uint8Array | ArrayBuffer,\n headers: WebhookHeaders,\n signingKey: string,\n options: VerifyWebhookOptions = {}\n): WebhookEvent {\n if (typeof signingKey !== \"string\" || signingKey === \"\") {\n throw new WebhookVerificationError(\"A webhook signing key is required\");\n }\n if (!headers || typeof headers !== \"object\") {\n throw new WebhookVerificationError(\"Webhook headers are required\");\n }\n const signature =\n header(headers, \"nomba-signature\") ?? header(headers, \"nomba-sig-value\");\n if (!signature) throw new WebhookVerificationError(\"Missing nomba-signature header\");\n const timestamp = header(headers, \"nomba-timestamp\");\n if (!timestamp) throw new WebhookVerificationError(\"Missing nomba-timestamp header\");\n const algorithm = header(headers, \"nomba-signature-algorithm\");\n if (algorithm !== undefined && algorithm !== \"HmacSHA256\") {\n throw new WebhookVerificationError(`Unsupported signature algorithm \"${algorithm}\"`);\n }\n\n // The signed fields are joined with \":\" and the timestamp itself contains colons.\n // Without these two checks an attacker holding one genuine webhook could move the\n // front of the timestamp into responseCode (\":2025-09-29T10\" + \"51:44Z\") and keep\n // the same HMAC input.\n if (!RFC3339.test(timestamp)) {\n throw new WebhookVerificationError(\n \"Invalid nomba-timestamp header: expected RFC 3339\"\n );\n }\n\n const event = parseEvent(rawBody);\n if (signedResponseCode(event).includes(\":\")) {\n throw new WebhookVerificationError(\"Invalid data.transaction.responseCode\");\n }\n\n if (options.toleranceSeconds !== undefined) {\n const ts = Date.parse(timestamp);\n if (Number.isNaN(ts))\n throw new WebhookVerificationError(\"Invalid nomba-timestamp header\");\n const now = (options.now ?? new Date()).getTime();\n if (Math.abs(now - ts) > options.toleranceSeconds * 1000) {\n throw new WebhookVerificationError(\n \"Webhook timestamp is outside the tolerance window\"\n );\n }\n }\n\n const expected = computeWebhookSignature(event, timestamp, signingKey);\n // Exact, constant-time comparison. Base64 is case-sensitive, so a signature\n // that differs only in letter case is a different signature.\n const a = Buffer.from(expected, \"utf8\");\n const b = Buffer.from(signature.trim(), \"utf8\");\n if (a.length !== b.length || !timingSafeEqual(a, b)) {\n throw new WebhookVerificationError(\"Webhook signature does not match\");\n }\n return event;\n}\n\n/** `nomba.webhooks` / `Nomba.webhooks`. */\nexport const webhooks = {\n verify: verifyWebhook,\n computeSignature: computeWebhookSignature,\n} as const;\n","import {\n InMemoryTokenStore,\n TokenManager,\n type TokenResponse,\n type TokenStore,\n} from \"./auth.js\";\nimport { BASE_URLS, type Environment } from \"./constants.js\";\nimport { ConfigurationError } from \"./errors.js\";\nimport { HttpClient } from \"./internal/http.js\";\nimport { readEnv, runtimeVersion } from \"./internal/utils.js\";\nimport { Accounts } from \"./resources/accounts.js\";\nimport { AuthResource } from \"./resources/auth.js\";\nimport type { ResourceContext } from \"./resources/base.js\";\nimport { Bills } from \"./resources/bills.js\";\nimport { Checkout } from \"./resources/checkout.js\";\nimport { DirectDebits } from \"./resources/directDebits.js\";\nimport { GlobalCollection } from \"./resources/globalCollection.js\";\nimport { GlobalPayout } from \"./resources/globalPayout.js\";\nimport { Terminals } from \"./resources/terminals.js\";\nimport { Transactions } from \"./resources/transactions.js\";\nimport { Transfers } from \"./resources/transfers.js\";\nimport { VirtualAccounts } from \"./resources/virtualAccounts.js\";\nimport { VERSION } from \"./version.js\";\nimport { webhooks } from \"./webhooks.js\";\n\nexport interface NombaOptions {\n /** Defaults to env `NOMBA_CLIENT_ID`. */\n clientId?: string;\n /** Defaults to env `NOMBA_CLIENT_SECRET`. */\n clientSecret?: string;\n /** Parent account ID, sent as the `accountId` header. Defaults to env `NOMBA_ACCOUNT_ID`. */\n accountId?: string;\n /** `\"sandbox\"` (default) or `\"production\"`. Defaults to env `NOMBA_ENVIRONMENT`. */\n environment?: Environment;\n /** Override the API base URL (tests, proxies). Must be https unless the host is localhost. */\n baseUrl?: string;\n /** Per-request timeout in milliseconds. Default 30000. */\n timeout?: number;\n /** Automatic retries for GET and token requests. Default 2. POST/PUT/DELETE are never retried. */\n maxRetries?: number;\n /** Where to keep the access token. Default: in memory. */\n tokenStore?: TokenStore;\n /** Custom `fetch` implementation. Default: the global `fetch`. */\n fetch?: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst LOCAL_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n\nfunction required(value: string | undefined, option: string, env: string): string {\n if (value === undefined || value === \"\") {\n throw new ConfigurationError(\n `Missing ${option}: pass the \"${option}\" option or set the ${env} environment variable`\n );\n }\n return value;\n}\n\nfunction resolveEnvironment(value: string | undefined): Environment {\n const env = value ?? \"sandbox\";\n if (env !== \"sandbox\" && env !== \"production\") {\n throw new ConfigurationError(\n `Invalid environment \"${env}\": use \"sandbox\" or \"production\"`\n );\n }\n return env;\n}\n\nfunction resolveBaseUrl(value: string | undefined, environment: Environment): string {\n if (value === undefined) return BASE_URLS[environment];\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new ConfigurationError(`Invalid baseUrl: not a URL`);\n }\n const local = LOCAL_HOSTS.has(url.hostname);\n if (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && local)) {\n throw new ConfigurationError(\n \"baseUrl must use https:// (http:// is allowed only for localhost)\"\n );\n }\n if (url.search || url.hash || url.username || url.password) {\n throw new ConfigurationError(\n \"baseUrl must not contain credentials, a query or a fragment\"\n );\n }\n return url.toString().replace(/\\/+$/, \"\");\n}\n\n/**\n * Nomba API client.\n *\n * ```ts\n * const nomba = new Nomba(); // reads NOMBA_CLIENT_ID, NOMBA_CLIENT_SECRET, NOMBA_ACCOUNT_ID\n * const balance = await nomba.accounts.getBalance();\n * ```\n */\nexport class Nomba {\n /** Webhook verification without a client: `Nomba.webhooks.verify(rawBody, headers, key)`. */\n static readonly webhooks = webhooks;\n static readonly VERSION = VERSION;\n\n readonly environment: Environment;\n readonly baseUrl: string;\n readonly accountId: string;\n\n readonly auth: AuthResource;\n readonly accounts: Accounts;\n readonly virtualAccounts: VirtualAccounts;\n readonly checkout: Checkout;\n readonly transfers: Transfers;\n readonly transactions: Transactions;\n readonly terminals: Terminals;\n readonly directDebits: DirectDebits;\n readonly bills: Bills;\n readonly globalPayout: GlobalPayout;\n readonly globalCollection: GlobalCollection;\n readonly webhooks = webhooks;\n\n readonly #clientId: string;\n\n constructor(options: NombaOptions = {}) {\n const clientId = required(\n options.clientId ?? readEnv(\"NOMBA_CLIENT_ID\"),\n \"clientId\",\n \"NOMBA_CLIENT_ID\"\n );\n const clientSecret = required(\n options.clientSecret ?? readEnv(\"NOMBA_CLIENT_SECRET\"),\n \"clientSecret\",\n \"NOMBA_CLIENT_SECRET\"\n );\n this.accountId = required(\n options.accountId ?? readEnv(\"NOMBA_ACCOUNT_ID\"),\n \"accountId\",\n \"NOMBA_ACCOUNT_ID\"\n );\n this.environment = resolveEnvironment(\n options.environment ?? readEnv(\"NOMBA_ENVIRONMENT\")\n );\n this.baseUrl = resolveBaseUrl(options.baseUrl, this.environment);\n this.#clientId = clientId;\n\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n if (typeof timeout !== \"number\" || !Number.isFinite(timeout) || timeout <= 0) {\n throw new ConfigurationError(\"timeout must be a positive number of milliseconds\");\n }\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n if (!Number.isInteger(maxRetries) || maxRetries < 0) {\n throw new ConfigurationError(\"maxRetries must be a non-negative integer\");\n }\n const fetchImpl = options.fetch ?? (globalThis.fetch as typeof fetch | undefined);\n if (typeof fetchImpl !== \"function\") {\n throw new ConfigurationError(\n \"No fetch implementation: use Node 18+ or pass the fetch option\"\n );\n }\n\n const http = new HttpClient({\n baseUrl: this.baseUrl,\n accountId: this.accountId,\n timeout,\n maxRetries,\n fetch: fetchImpl,\n userAgent: `nomba-node/${VERSION} ${runtimeVersion()}`,\n });\n const tokens = new TokenManager({\n store: options.tokenStore ?? new InMemoryTokenStore(),\n issue: () =>\n http.request<TokenResponse>({\n method: \"POST\",\n path: \"/v1/auth/token/issue\",\n body: {\n grant_type: \"client_credentials\",\n client_id: clientId,\n client_secret: clientSecret,\n },\n token: \"obtain\",\n }),\n refresh: (refreshToken) =>\n http.request<TokenResponse>({\n method: \"POST\",\n path: \"/v1/auth/token/refresh\",\n body: { grant_type: \"refresh_token\", refresh_token: refreshToken },\n token: \"obtain\",\n }),\n });\n http.setTokenManager(tokens);\n\n const ctx: ResourceContext = { http, environment: this.environment };\n this.auth = new AuthResource(ctx, tokens, clientId);\n this.accounts = new Accounts(ctx);\n this.virtualAccounts = new VirtualAccounts(ctx);\n this.checkout = new Checkout(ctx);\n this.transfers = new Transfers(ctx);\n this.transactions = new Transactions(ctx);\n this.terminals = new Terminals(ctx);\n this.directDebits = new DirectDebits(ctx);\n this.bills = new Bills(ctx);\n this.globalPayout = new GlobalPayout(ctx);\n this.globalCollection = new GlobalCollection(ctx);\n }\n\n /** Safe summary: never includes the client secret or tokens. */\n toJSON(): Record<string, string> {\n return {\n clientId: this.#clientId,\n accountId: this.accountId,\n environment: this.environment,\n baseUrl: this.baseUrl,\n };\n }\n\n [Symbol.for(\"nodejs.util.inspect.custom\")](): string {\n return `Nomba ${JSON.stringify(this.toJSON())}`;\n }\n}\n","import { Nomba } from \"./client.js\";\n\nexport default Nomba;\nexport { Nomba };\nexport type { NombaOptions } from \"./client.js\";\nexport { InMemoryTokenStore, type Token, type TokenStore } from \"./auth.js\";\nexport {\n ApiError,\n type ApiErrorInit,\n AuthenticationError,\n ConfigurationError,\n ConnectionError,\n type ErrorReference,\n NombaError,\n NotFoundError,\n PermissionDeniedError,\n RateLimitError,\n type RateLimitInfo,\n ServerError,\n TimeoutError,\n ValidationError,\n WebhookVerificationError,\n} from \"./errors.js\";\nexport {\n BASE_URLS,\n type Environment,\n SUCCESS_CODES,\n TransactionStatus,\n WebhookEventType,\n} from \"./constants.js\";\nexport {\n computeWebhookSignature,\n verifyWebhook,\n type VerifyWebhookOptions,\n type WebhookHeaders,\n} from \"./webhooks.js\";\nexport { VERSION } from \"./version.js\";\nexport type * from \"./types.js\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,76 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nombaoss/nomba-node",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Official-quality TypeScript/Node SDK for the Nomba payments API",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"require": {
|
|
17
|
+
"types": "./dist/index.d.cts",
|
|
18
|
+
"default": "./dist/index.cjs"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"./package.json": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"nomba",
|
|
32
|
+
"payments",
|
|
33
|
+
"banking",
|
|
34
|
+
"transfers",
|
|
35
|
+
"checkout",
|
|
36
|
+
"nigeria",
|
|
37
|
+
"fintech",
|
|
38
|
+
"sdk"
|
|
39
|
+
],
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "https://github.com/NombaOSS/nomba-node.git"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/NombaOSS/nomba-node",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/NombaOSS/nomba-node/issues"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsup",
|
|
50
|
+
"type-check": "tsc --noEmit",
|
|
51
|
+
"test": "vitest run",
|
|
52
|
+
"test:watch": "vitest",
|
|
53
|
+
"test:coverage": "vitest run --coverage",
|
|
54
|
+
"lint": "eslint src test examples",
|
|
55
|
+
"format": "prettier --write .",
|
|
56
|
+
"format:check": "prettier --check .",
|
|
57
|
+
"prepublishOnly": "npm run build"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@eslint/js": "^9.39.5",
|
|
61
|
+
"@types/express": "^5.0.6",
|
|
62
|
+
"@types/node": "^20.19.43",
|
|
63
|
+
"@vitest/coverage-v8": "^3.2.7",
|
|
64
|
+
"eslint": "^9.39.5",
|
|
65
|
+
"eslint-config-prettier": "^10.1.8",
|
|
66
|
+
"express": "^5.3.0",
|
|
67
|
+
"prettier": "^3.9.10",
|
|
68
|
+
"tsup": "^8.5.1",
|
|
69
|
+
"typescript": "^5.9.3",
|
|
70
|
+
"typescript-eslint": "^8.72.1",
|
|
71
|
+
"vitest": "^3.2.7"
|
|
72
|
+
},
|
|
73
|
+
"overrides": {
|
|
74
|
+
"vite": "^6.3.5"
|
|
75
|
+
}
|
|
76
|
+
}
|