{"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/sepay-bankhub.service.ts"],"sourcesContent":["﻿import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, Method } from \"axios\";\r\n\r\nimport { SepayBankHubError } from \"./errors\";\r\nimport { CreateTokenResponse } from \"./types\";\r\n\r\ntype AuthMode = \"basic\" | \"bearer\" | \"none\";\r\n\r\nexport interface SepayBankHubClientOptions {\r\n  baseUrl?: string;\r\n  sandbox?: boolean;\r\n  clientId: string;\r\n  clientSecret: string;\r\n  timeoutMs?: number;\r\n  tokenRefreshBufferSeconds?: number;\r\n}\r\n\r\nexport interface SepayRequestOptions {\r\n  operation: string;\r\n  authMode?: AuthMode;\r\n  params?: Record<string, string | number | boolean | undefined>;\r\n  headers?: Record<string, string>;\r\n}\r\n\r\nexport class SepayBankHubClient {\r\n  private readonly http: AxiosInstance;\r\n  private readonly clientId: string;\r\n  private readonly clientSecret: string;\r\n  private readonly tokenRefreshBufferSeconds: number;\r\n\r\n  private accessToken: string | null = null;\r\n  private tokenExpiresAt = 0;\r\n\r\n  constructor(options: SepayBankHubClientOptions) {\r\n    if (!options.clientId || !options.clientSecret) {\r\n      throw new SepayBankHubError(\"Missing SePay clientId or clientSecret\", {\r\n        code: \"CONFIGURATION_ERROR\"\r\n      });\r\n    }\r\n\r\n    this.clientId = options.clientId;\r\n    this.clientSecret = options.clientSecret;\r\n    this.tokenRefreshBufferSeconds = options.tokenRefreshBufferSeconds ?? 30;\r\n\r\n    const baseUrl = options.baseUrl ?? (options.sandbox ? \"https://bankhub-api-sandbox.sepay.vn\" : \"https://bankhub-api.sepay.vn\");\r\n\r\n    this.http = axios.create({\r\n      baseURL: baseUrl.replace(/\\/+$/, \"\"),\r\n      timeout: options.timeoutMs ?? 30000,\r\n      headers: {\r\n        Accept: \"application/json\"\r\n      }\r\n    });\r\n  }\r\n\r\n  async get<TResponse = unknown>(path: string, options: SepayRequestOptions): Promise<TResponse> {\r\n    return this.request<TResponse>(\"GET\", path, undefined, options);\r\n  }\r\n\r\n  async post<TResponse = unknown, TBody = unknown>(\r\n    path: string,\r\n    body: TBody,\r\n    options: SepayRequestOptions\r\n  ): Promise<TResponse> {\r\n    return this.request<TResponse>(\"POST\", path, body, options);\r\n  }\r\n\r\n  async createAccessToken(): Promise<CreateTokenResponse> {\r\n    const payload = await this.post<CreateTokenResponse, Record<string, never>>(\"/v1/token\", {}, {\r\n      operation: \"create access token\",\r\n      authMode: \"basic\",\r\n      headers: {\r\n        \"Content-Type\": \"application/json\"\r\n      }\r\n    });\r\n\r\n    if (!payload?.access_token || typeof payload.ttl !== \"number\") {\r\n      throw new SepayBankHubError(\"Invalid token payload from SePay BankHub\", {\r\n        code: \"UNEXPECTED_RESPONSE\",\r\n        operation: \"create access token\",\r\n        details: payload\r\n      });\r\n    }\r\n\r\n    this.setAccessToken(payload.access_token, payload.ttl);\r\n    return payload;\r\n  }\r\n\r\n  setAccessToken(accessToken: string, ttlSeconds?: number): void {\r\n    this.accessToken = accessToken;\r\n    const ttl = ttlSeconds ?? 600;\r\n    this.tokenExpiresAt = Date.now() + Math.max(1, ttl - this.tokenRefreshBufferSeconds) * 1000;\r\n  }\r\n\r\n  private async request<TResponse>(\r\n    method: Method,\r\n    path: string,\r\n    body: unknown,\r\n    options: SepayRequestOptions\r\n  ): Promise<TResponse> {\r\n    const authMode = options.authMode ?? \"bearer\";\r\n    const headers: Record<string, string> = {\r\n      ...options.headers\r\n    };\r\n\r\n    if (authMode === \"basic\") {\r\n      headers.Authorization = this.createBasicAuthorization();\r\n    } else if (authMode === \"bearer\") {\r\n      const token = await this.ensureAccessToken();\r\n      headers.Authorization = `Bearer ${token}`;\r\n    }\r\n\r\n    const config: AxiosRequestConfig = {\r\n      method,\r\n      url: path,\r\n      data: body,\r\n      params: options.params,\r\n      headers\r\n    };\r\n\r\n    try {\r\n      const response = await this.http.request<TResponse>(config);\r\n      return response.data;\r\n    } catch (error: unknown) {\r\n      throw this.mapAxiosError(error, options.operation);\r\n    }\r\n  }\r\n\r\n  private async ensureAccessToken(): Promise<string> {\r\n    const now = Date.now();\r\n    if (!this.accessToken || now >= this.tokenExpiresAt) {\r\n      await this.createAccessToken();\r\n    }\r\n\r\n    if (!this.accessToken) {\r\n      throw new SepayBankHubError(\"Unable to acquire access token\", {\r\n        code: \"AUTHENTICATION_ERROR\"\r\n      });\r\n    }\r\n\r\n    return this.accessToken;\r\n  }\r\n\r\n  private createBasicAuthorization(): string {\r\n    const raw = `${this.clientId}:${this.clientSecret}`;\r\n    const encoded = Buffer.from(raw, \"utf-8\").toString(\"base64\");\r\n    return `Basic ${encoded}`;\r\n  }\r\n\r\n  private mapAxiosError(error: unknown, operation: string): SepayBankHubError {\r\n    if (!(error instanceof AxiosError)) {\r\n      return new SepayBankHubError(`Unknown error when ${operation}`, {\r\n        code: \"API_ERROR\",\r\n        operation,\r\n        cause: error\r\n      });\r\n    }\r\n\r\n    if (error.code === \"ECONNABORTED\") {\r\n      return new SepayBankHubError(`Timeout when ${operation}`, {\r\n        code: \"TIMEOUT_ERROR\",\r\n        operation,\r\n        cause: error,\r\n        retryable: true\r\n      });\r\n    }\r\n\r\n    if (!error.response) {\r\n      return new SepayBankHubError(`Network error when ${operation}`, {\r\n        code: \"NETWORK_ERROR\",\r\n        operation,\r\n        cause: error,\r\n        retryable: true\r\n      });\r\n    }\r\n\r\n    const status = error.response.status;\r\n    const payload = error.response.data;\r\n    const message = this.pickMessage(payload) ?? error.message;\r\n\r\n    if (status === 400) {\r\n      return new SepayBankHubError(`Validation failed when ${operation}: ${message}`, {\r\n        code: \"VALIDATION_ERROR\",\r\n        status,\r\n        operation,\r\n        details: payload,\r\n        cause: error,\r\n        retryable: false\r\n      });\r\n    }\r\n\r\n    if (status === 401 || status === 403) {\r\n      return new SepayBankHubError(`Authentication failed when ${operation}: ${message}`, {\r\n        code: \"AUTHENTICATION_ERROR\",\r\n        status,\r\n        operation,\r\n        details: payload,\r\n        cause: error,\r\n        retryable: false\r\n      });\r\n    }\r\n\r\n    return new SepayBankHubError(`SePay API error when ${operation}: ${message}`, {\r\n      code: \"API_ERROR\",\r\n      status,\r\n      operation,\r\n      details: payload,\r\n      cause: error,\r\n      retryable: status >= 500\r\n    });\r\n  }\r\n\r\n  private pickMessage(payload: unknown): string | undefined {\r\n    if (!payload || typeof payload !== \"object\") {\r\n      return undefined;\r\n    }\r\n\r\n    const maybeMessage = (payload as { message?: unknown }).message;\r\n    return typeof maybeMessage === \"string\" ? maybeMessage : undefined;\r\n  }\r\n}\r\n","﻿export type SepayBankHubErrorCode =\r\n  | \"CONFIGURATION_ERROR\"\r\n  | \"AUTHENTICATION_ERROR\"\r\n  | \"VALIDATION_ERROR\"\r\n  | \"API_ERROR\"\r\n  | \"NETWORK_ERROR\"\r\n  | \"TIMEOUT_ERROR\"\r\n  | \"UNEXPECTED_RESPONSE\";\r\n\r\nexport interface SepayBankHubErrorOptions {\r\n  code: SepayBankHubErrorCode;\r\n  status?: number;\r\n  operation?: string;\r\n  details?: unknown;\r\n  requestId?: string;\r\n  retryable?: boolean;\r\n  cause?: unknown;\r\n}\r\n\r\nexport class SepayBankHubError extends Error {\r\n  readonly code: SepayBankHubErrorCode;\r\n  readonly status?: number;\r\n  readonly operation?: string;\r\n  readonly details?: unknown;\r\n  readonly requestId?: string;\r\n  readonly retryable?: boolean;\r\n\r\n  constructor(message: string, options: SepayBankHubErrorOptions) {\r\n    super(message);\r\n    this.name = \"SepayBankHubError\";\r\n    this.code = options.code;\r\n    if (options.status !== undefined) {\r\n      this.status = options.status;\r\n    }\r\n    if (options.operation !== undefined) {\r\n      this.operation = options.operation;\r\n    }\r\n    this.details = options.details;\r\n    if (options.requestId !== undefined) {\r\n      this.requestId = options.requestId;\r\n    }\r\n    if (options.retryable !== undefined) {\r\n      this.retryable = options.retryable;\r\n    }\r\n\r\n    if (options.cause !== undefined) {\r\n      (this as { cause?: unknown }).cause = options.cause;\r\n    }\r\n  }\r\n}\r\n","﻿import { SepayBankHubClient, SepayBankHubClientOptions } from \"./client\";\r\nimport { SepayBankHubError } from \"./errors\";\r\nimport {\r\n  BankAccount,\r\n  BankAccountListQuery,\r\n  Company,\r\n  CompanyCounterData,\r\n  CompanyCounterQuery,\r\n  CompanyCreateRequest,\r\n  CompanyListQuery,\r\n  CompanyUpdateRequest,\r\n  CreateLinkTokenRequest,\r\n  CreateLinkTokenResponse,\r\n  CreateTokenResponse,\r\n  GetLinkTokenRequest,\r\n  LinkTokenDetails,\r\n  MerchantConfig,\r\n  MerchantConfigUpdateRequest,\r\n  MockTransactionCreateRequest,\r\n  MockTransactionCreateResponse,\r\n  RevokeLinkTokenRequest,\r\n  SepayApiEnvelope,\r\n  SepayApiPaginationMeta,\r\n  SepayDetailResult,\r\n  SepayOperationResult,\r\n  SepayPaginatedResult,\r\n  Transaction,\r\n  TransactionListQuery,\r\n  UploadMerchantLogoOptions,\r\n  WebhookConfig,\r\n  WebhookUpsertRequest\r\n} from \"./types\";\r\n\r\nexport class SepayBankHubService {\r\n  private readonly client: SepayBankHubClient;\r\n\r\n  readonly auth = {\r\n    createToken: () => this.createAccessToken(),\r\n    setAccessToken: (accessToken: string, ttlSeconds?: number) => this.setAccessToken(accessToken, ttlSeconds)\r\n  };\r\n\r\n  readonly linkToken = {\r\n    create: (payload: CreateLinkTokenRequest) => this.createLinkToken(payload),\r\n    get: (payload: GetLinkTokenRequest) => this.getLinkToken(payload),\r\n    revoke: (payload: RevokeLinkTokenRequest) => this.revokeLinkToken(payload)\r\n  };\r\n\r\n  readonly company = {\r\n    list: (query?: CompanyListQuery) => this.listCompanies(query),\r\n    details: (companyId: string) => this.getCompanyDetails(companyId),\r\n    create: (payload: CompanyCreateRequest) => this.createCompany(payload),\r\n    update: (companyId: string, payload: CompanyUpdateRequest) => this.updateCompany(companyId, payload),\r\n    counter: (companyId: string, query?: CompanyCounterQuery) => this.getCompanyCounter(companyId, query)\r\n  };\r\n\r\n  readonly bankAccount = {\r\n    list: (query?: BankAccountListQuery) => this.listBankAccounts(query),\r\n    details: (bankAccountId: string) => this.getBankAccountDetails(bankAccountId)\r\n  };\r\n\r\n  readonly transaction = {\r\n    list: (query?: TransactionListQuery) => this.listTransactions(query),\r\n    details: (transactionId: string) => this.getTransactionDetails(transactionId),\r\n    createMock: (payload: MockTransactionCreateRequest) => this.createMockTransaction(payload)\r\n  };\r\n\r\n  readonly merchantConfig = {\r\n    get: () => this.getMerchantConfig(),\r\n    update: (payload: MerchantConfigUpdateRequest) => this.updateMerchantConfig(payload),\r\n    uploadLogo: (options: UploadMerchantLogoOptions) => this.uploadMerchantLogo(options)\r\n  };\r\n\r\n  readonly webhook = {\r\n    get: () => this.getWebhookConfig(),\r\n    upsert: (payload: WebhookUpsertRequest) => this.upsertWebhook(payload)\r\n  };\r\n\r\n  constructor(options: SepayBankHubClientOptions | SepayBankHubClient) {\r\n    this.client = options instanceof SepayBankHubClient ? options : new SepayBankHubClient(options);\r\n  }\r\n\r\n  async createAccessToken(): Promise<CreateTokenResponse> {\r\n    return this.client.createAccessToken();\r\n  }\r\n\r\n  setAccessToken(accessToken: string, ttlSeconds?: number): void {\r\n    this.client.setAccessToken(accessToken, ttlSeconds);\r\n  }\r\n\r\n  async createLinkToken(payload: CreateLinkTokenRequest): Promise<CreateLinkTokenResponse> {\r\n    const response = await this.client.post<CreateLinkTokenResponse | SepayApiEnvelope<CreateLinkTokenResponse>, CreateLinkTokenRequest>(\r\n      \"/v1/link-token/create\",\r\n      payload,\r\n      this.req(\"create link token\")\r\n    );\r\n\r\n    return this.extractDataOrSelf<CreateLinkTokenResponse>(response, \"create link token\");\r\n  }\r\n\r\n  async getLinkToken(payload: GetLinkTokenRequest): Promise<SepayDetailResult<LinkTokenDetails>> {\r\n    const response = await this.client.post<LinkTokenDetails | SepayApiEnvelope<LinkTokenDetails>, GetLinkTokenRequest>(\r\n      \"/v1/link-token/get\",\r\n      payload,\r\n      this.req(\"get link token details\")\r\n    );\r\n\r\n    return { item: this.extractDataOrSelf<LinkTokenDetails>(response, \"get link token details\") };\r\n  }\r\n\r\n  async revokeLinkToken(payload: RevokeLinkTokenRequest): Promise<SepayOperationResult> {\r\n    const response = await this.client.post<SepayOperationResult | SepayApiEnvelope<never>, RevokeLinkTokenRequest>(\r\n      \"/v1/link-token/revoke\",\r\n      payload,\r\n      this.req(\"revoke link token\")\r\n    );\r\n\r\n    return this.extractOperationResult(response);\r\n  }\r\n\r\n  async listCompanies(query?: CompanyListQuery): Promise<SepayPaginatedResult<Company>> {\r\n    const response = await this.client.get<SepayApiEnvelope<Company[]>>(\r\n      \"/v1/company\",\r\n      this.req(\"list companies\", this.toParams(query))\r\n    );\r\n\r\n    const items = this.extractListData<Company>(response, \"list companies\");\r\n    return { items, meta: this.extractMeta(response) };\r\n  }\r\n\r\n  async getCompanyDetails(companyId: string): Promise<SepayDetailResult<Company>> {\r\n    const response = await this.client.get<SepayApiEnvelope<Company> | Company>(\r\n      `/v1/company/${this.ensureId(companyId, \"companyId\")}`,\r\n      this.req(\"get company details\")\r\n    );\r\n\r\n    return { item: this.extractDataOrSelf<Company>(response, \"get company details\") };\r\n  }\r\n\r\n  async createCompany(payload: CompanyCreateRequest): Promise<SepayOperationResult> {\r\n    const response = await this.client.post<SepayOperationResult | SepayApiEnvelope<never>, CompanyCreateRequest>(\r\n      \"/v1/company/create\",\r\n      payload,\r\n      this.req(\"create company\")\r\n    );\r\n\r\n    return this.extractOperationResult(response);\r\n  }\r\n\r\n  async updateCompany(companyId: string, payload: CompanyUpdateRequest): Promise<SepayOperationResult> {\r\n    const response = await this.client.post<SepayOperationResult | SepayApiEnvelope<never>, CompanyUpdateRequest>(\r\n      `/v1/company/edit/${this.ensureId(companyId, \"companyId\")}`,\r\n      payload,\r\n      this.req(\"update company\")\r\n    );\r\n\r\n    return this.extractOperationResult(response);\r\n  }\r\n\r\n  async getCompanyCounter(companyId: string, query?: CompanyCounterQuery): Promise<CompanyCounterData> {\r\n    const response = await this.client.get<SepayApiEnvelope<CompanyCounterData> | CompanyCounterData>(\r\n      `/v1/company/counter/${this.ensureId(companyId, \"companyId\")}`,\r\n      this.req(\"get company counter\", this.toParams(query))\r\n    );\r\n\r\n    return this.extractDataOrSelf<CompanyCounterData>(response, \"get company counter\");\r\n  }\r\n\r\n  async listBankAccounts(query?: BankAccountListQuery): Promise<SepayPaginatedResult<BankAccount>> {\r\n    const response = await this.client.get<SepayApiEnvelope<BankAccount[]>>(\r\n      \"/v1/bank-account\",\r\n      this.req(\"list bank accounts\", this.toParams(query))\r\n    );\r\n\r\n    const items = this.extractListData<BankAccount>(response, \"list bank accounts\");\r\n    return { items, meta: this.extractMeta(response) };\r\n  }\r\n\r\n  async getBankAccountDetails(bankAccountId: string): Promise<SepayDetailResult<BankAccount>> {\r\n    const response = await this.client.get<SepayApiEnvelope<BankAccount> | BankAccount>(\r\n      `/v1/bank-account/${this.ensureId(bankAccountId, \"bankAccountId\")}`,\r\n      this.req(\"get bank account details\")\r\n    );\r\n\r\n    return { item: this.extractDataOrSelf<BankAccount>(response, \"get bank account details\") };\r\n  }\r\n\r\n  async listTransactions(query?: TransactionListQuery): Promise<SepayPaginatedResult<Transaction>> {\r\n    const response = await this.client.get<SepayApiEnvelope<Transaction[]>>(\r\n      \"/v1/transaction\",\r\n      this.req(\"list transactions\", this.toParams(query))\r\n    );\r\n\r\n    const items = this.extractListData<Transaction>(response, \"list transactions\");\r\n    return { items, meta: this.extractMeta(response) };\r\n  }\r\n\r\n  async getTransactionDetails(transactionId: string): Promise<SepayDetailResult<Transaction>> {\r\n    const response = await this.client.get<SepayApiEnvelope<Transaction> | Transaction>(\r\n      `/v1/transaction/${this.ensureId(transactionId, \"transactionId\")}`,\r\n      this.req(\"get transaction details\")\r\n    );\r\n\r\n    return { item: this.extractDataOrSelf<Transaction>(response, \"get transaction details\") };\r\n  }\r\n\r\n  async createMockTransaction(payload: MockTransactionCreateRequest): Promise<MockTransactionCreateResponse> {\r\n    const response = await this.client.post<SepayApiEnvelope<MockTransactionCreateResponse> | MockTransactionCreateResponse, MockTransactionCreateRequest>(\r\n      \"/v1/transaction/create\",\r\n      payload,\r\n      this.req(\"create mock transaction\")\r\n    );\r\n\r\n    return this.extractDataOrSelf<MockTransactionCreateResponse>(response, \"create mock transaction\");\r\n  }\r\n\r\n  async getMerchantConfig(): Promise<SepayDetailResult<MerchantConfig>> {\r\n    const response = await this.client.get<SepayApiEnvelope<MerchantConfig> | MerchantConfig>(\r\n      \"/v1/merchant-config\",\r\n      this.req(\"get merchant config\")\r\n    );\r\n\r\n    return { item: this.extractDataOrSelf<MerchantConfig>(response, \"get merchant config\") };\r\n  }\r\n\r\n  async updateMerchantConfig(payload: MerchantConfigUpdateRequest): Promise<SepayOperationResult> {\r\n    const response = await this.client.post<SepayOperationResult | SepayApiEnvelope<never>, MerchantConfigUpdateRequest>(\r\n      \"/v1/merchant-config\",\r\n      payload,\r\n      this.req(\"update merchant config\")\r\n    );\r\n\r\n    return this.extractOperationResult(response);\r\n  }\r\n\r\n  async uploadMerchantLogo(options: UploadMerchantLogoOptions): Promise<SepayOperationResult> {\r\n    const response = await this.client.post<SepayOperationResult | SepayApiEnvelope<never>, FormData>(\r\n      \"/v1/merchant-config/logo\",\r\n      options.formData,\r\n      this.req(\"upload merchant logo\")\r\n    );\r\n\r\n    return this.extractOperationResult(response);\r\n  }\r\n\r\n  async getWebhookConfig(): Promise<SepayDetailResult<WebhookConfig | null>> {\r\n    const response = await this.client.get<SepayApiEnvelope<WebhookConfig | null> | WebhookConfig | null>(\r\n      \"/v1/webhook\",\r\n      this.req(\"get webhook config\")\r\n    );\r\n\r\n    return { item: this.extractDataOrSelf<WebhookConfig | null>(response, \"get webhook config\") };\r\n  }\r\n\r\n  async upsertWebhook(payload: WebhookUpsertRequest): Promise<SepayOperationResult> {\r\n    const response = await this.client.post<SepayOperationResult | SepayApiEnvelope<never>, WebhookUpsertRequest>(\r\n      \"/v1/webhook\",\r\n      payload,\r\n      this.req(\"upsert webhook\")\r\n    );\r\n\r\n    return this.extractOperationResult(response);\r\n  }\r\n\r\n  private req(operation: string, params?: Record<string, string | number | boolean | undefined>) {\r\n    if (params) {\r\n      return { operation, params };\r\n    }\r\n\r\n    return { operation };\r\n  }\r\n\r\n  private toParams<T extends object>(query?: T): Record<string, string | number | boolean | undefined> | undefined {\r\n    if (!query) {\r\n      return undefined;\r\n    }\r\n\r\n    return query as Record<string, string | number | boolean | undefined>;\r\n  }\r\n\r\n  private ensureId(id: string, fieldName: string): string {\r\n    if (!id || !id.trim()) {\r\n      throw new SepayBankHubError(`${fieldName} is required`, {\r\n        code: \"VALIDATION_ERROR\",\r\n        operation: \"validate input\"\r\n      });\r\n    }\r\n\r\n    return id;\r\n  }\r\n\r\n  private extractListData<T>(payload: unknown, operation: string): T[] {\r\n    const data = this.extractDataOrSelf<unknown>(payload, operation);\r\n    if (!Array.isArray(data)) {\r\n      throw new SepayBankHubError(`Unexpected response shape when ${operation}`, {\r\n        code: \"UNEXPECTED_RESPONSE\",\r\n        operation,\r\n        details: payload\r\n      });\r\n    }\r\n\r\n    return data as T[];\r\n  }\r\n\r\n  private extractMeta(payload: unknown): SepayApiPaginationMeta {\r\n    if (!payload || typeof payload !== \"object\") {\r\n      return {};\r\n    }\r\n\r\n    const meta = (payload as { meta?: unknown }).meta;\r\n    if (!meta || typeof meta !== \"object\") {\r\n      return {};\r\n    }\r\n\r\n    return meta as SepayApiPaginationMeta;\r\n  }\r\n\r\n  private extractOperationResult(payload: unknown): SepayOperationResult {\r\n    if (!payload || typeof payload !== \"object\") {\r\n      return { message: \"success\" };\r\n    }\r\n\r\n    const envelope = payload as SepayApiEnvelope<unknown>;\r\n    if (typeof envelope.code === \"number\" || typeof envelope.message === \"string\") {\r\n      const result: SepayOperationResult = {\r\n        ...(payload as Record<string, unknown>)\r\n      };\r\n\r\n      if (envelope.code !== undefined) {\r\n        result.code = envelope.code;\r\n      }\r\n      if (envelope.message !== undefined) {\r\n        result.message = envelope.message;\r\n      }\r\n\r\n      return result;\r\n    }\r\n\r\n    return payload as SepayOperationResult;\r\n  }\r\n\r\n  private extractDataOrSelf<T>(payload: unknown, operation: string): T {\r\n    if (payload === null || payload === undefined) {\r\n      throw new SepayBankHubError(`Empty response payload when ${operation}`, {\r\n        code: \"UNEXPECTED_RESPONSE\",\r\n        operation,\r\n        details: payload\r\n      });\r\n    }\r\n\r\n    if (typeof payload !== \"object\") {\r\n      return payload as T;\r\n    }\r\n\r\n    const envelope = payload as SepayApiEnvelope<T>;\r\n    if (\"data\" in envelope) {\r\n      return envelope.data as T;\r\n    }\r\n\r\n    return payload as T;\r\n  }\r\n}\r\n"],"mappings":"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","names":[]}