{"version":3,"sources":["../src/constants.ts","../src/client.ts","../src/upi.ts","../src/scanner.ts"],"sourcesContent":["/** Origin of the local Vouch backend (no path). */\nexport const DEFAULT_DEV_BACKEND_ORIGIN = \"http://localhost:9393\";\n\n/** Default API base when {@link VouchConfig.baseUrl} is omitted (local dev only). */\nexport const DEFAULT_DEV_BASE_URL = `${DEFAULT_DEV_BACKEND_ORIGIN}/api/v1`;\n\n/** Resolve API base URL: explicit config → `VOUCH_BASE_URL` (Node) → local dev default. */\nexport function resolveBaseUrl(explicit?: string): string {\n  const fromConfig = explicit?.trim();\n  if (fromConfig) return fromConfig.replace(/\\/$/, \"\");\n\n  if (typeof process !== \"undefined\" && typeof process.env?.VOUCH_BASE_URL === \"string\") {\n    const fromEnv = process.env.VOUCH_BASE_URL.trim();\n    if (fromEnv) return fromEnv.replace(/\\/$/, \"\");\n  }\n\n  return DEFAULT_DEV_BASE_URL;\n}\n","/// <reference lib=\"dom\" />\nimport type {\n  VouchConfig,\n  ApiResponse,\n  ApiListResponse,\n  Program,\n  ProgramStats,\n  PaymentIntent,\n  Voucher,\n  VoucherBalanceStatus,\n  UPIData,\n  UPIIntentResponse,\n  AuthorizeResponse,\n  IntentStatusResponse,\n} from \"./types\";\nimport { resolveBaseUrl } from \"./constants\";\n\nexport class Vouch {\n  private apiKey: string;\n  private baseUrl: string;\n  private version: string;\n  readonly showVoucherOnlyWithBalance: boolean;\n\n  constructor(config: VouchConfig) {\n    this.apiKey = config.apiKey;\n    this.baseUrl = resolveBaseUrl(config.baseUrl);\n    this.version = config.version ?? \"2026-04-06\";\n    this.showVoucherOnlyWithBalance = config.showVoucherOnlyWithBalance ?? false;\n  }\n\n  private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n    const res = await fetch(`${this.baseUrl}${path}`, {\n      method,\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"x-api-key\": this.apiKey,\n        \"Vouch-Version\": this.version,\n      },\n      ...(body !== undefined && { body: JSON.stringify(body) }),\n    });\n\n    const json = await res.json();\n\n    if (!res.ok) {\n      const error = json.error ?? json;\n      const message =\n        typeof error === \"string\"\n          ? error\n          : (error.message ?? json.message ?? \"Request failed\");\n      const code =\n        typeof error === \"string\"\n          ? \"API_ERROR\"\n          : (error.code ?? \"API_ERROR\");\n      const requestId = typeof error === \"object\" && error ? error.request_id : undefined;\n      throw new VouchError(code, message, res.status, requestId);\n    }\n\n    return json as T;\n  }\n\n  programs = {\n    list: () => this.request<{ programs: Program[] }>(\"GET\", \"/programs\"),\n\n    get: (slug: string) => this.request<{ program: Program }>(\"GET\", `/programs/${slug}`),\n\n    create: (params: {\n      slug: string;\n      name: string;\n      currency?: string;\n      currencySymbol?: string;\n      description?: string;\n      defaultLocale?: string;\n      supportedLocales?: string[];\n    }) => this.request<ApiResponse<{ program: Program }>>(\"POST\", \"/programs\", params),\n\n    stats: (slug: string) => this.request<ApiResponse<{ stats: ProgramStats }>>(\"GET\", `/programs/${slug}/stats`),\n\n    enrol: (slug: string, params: {\n      phone: string;\n      fields?: Record<string, unknown>;\n    }, options?: { idempotencyKey?: string }) =>\n      this.request<ApiResponse<unknown>>(\"POST\", `/programs/${slug}/enrol`, params),\n  };\n\n  payments = {\n    createIntent: (params: {\n      merchantId: string;\n      items: Array<{ sku: string; name: string; categoryCode: string; qty: number; unitPrice: number }>;\n      programId?: string;\n    }) => this.request<ApiResponse<PaymentIntent>>(\"POST\", \"/payments/intents\", params),\n\n    quote: (params: { intentId: string; tokenId: number }) =>\n      this.request<ApiResponse<unknown>>(\"POST\", \"/payments/quote\", params),\n\n    authorize: (params: { intentId: string }) =>\n      this.request<AuthorizeResponse>(\"POST\", \"/payments/authorize\", params),\n\n    /**\n     * Initiate a payment from a scanned UPI QR code.\n     *\n     * Resolves the merchant by UPI ID, looks up the beneficiary's voucher\n     * (via tokenId + programId, or via the authenticated session), creates\n     * a PaymentIntent, and auto-quotes if a matching voucher is found.\n     *\n     * For partner integrations using API key auth, pass `beneficiaryPhone`\n     * or `beneficiaryId` to identify the beneficiary without a session.\n     *\n     * Set `externalSettlement: true` when your platform moves the money itself\n     * (open-network UPI). Settlement then records the voucher ledger entry and\n     * marks the payment SETTLED, but Vouch does NOT call the UPI rail engine to\n     * perform/confirm the payout. Optionally pass your own `payoutReference`.\n     */\n    initiateUPI: (params: {\n      upiData: UPIData;\n      tokenId?: number;\n      programId: string;\n      beneficiaryPhone?: string;\n      beneficiaryId?: string;\n      externalSettlement?: boolean;\n      payoutReference?: string;\n    }) =>\n      this.request<UPIIntentResponse>(\"POST\", \"/payments/upi-intent\", {\n        upiId: params.upiData.upiId,\n        merchantName: params.upiData.merchantName,\n        amount: params.upiData.amount,\n        mcc: params.upiData.mcc,\n        raw: params.upiData.raw,\n        tokenId: params.tokenId,\n        programId: params.programId,\n        beneficiaryPhone: params.beneficiaryPhone,\n        beneficiaryId: params.beneficiaryId,\n        externalSettlement: params.externalSettlement,\n        payoutReference: params.payoutReference,\n      }),\n\n    getIntent: (intentId: string) =>\n      this.request<IntentStatusResponse>(\"GET\", `/payments/${intentId}`),\n  };\n\n  vouchers = {\n    verify: (token: string, programId?: string) =>\n      this.request<ApiResponse<Voucher>>(\"POST\", \"/verify\", { token, programId }),\n\n    getBalance: (params: { beneficiaryPhone: string; programId: string }) => {\n      const q = new URLSearchParams({\n        phone: params.beneficiaryPhone,\n        programId: params.programId,\n      });\n      return this.request<{ success: true } & VoucherBalanceStatus>(\n        \"GET\",\n        `/beneficiaries/voucher-balance?${q.toString()}`,\n      );\n    },\n\n    shouldShowUI: async (params: { beneficiaryPhone: string; programId: string }): Promise<boolean> => {\n      if (!this.showVoucherOnlyWithBalance) return true;\n      const balance = await this.vouchers.getBalance(params);\n      return balance.hasBalance;\n    },\n  };\n\n  merchants = {\n    list: (programId?: string) =>\n      this.request<ApiListResponse<unknown>>(\"GET\", programId ? `/merchants?programId=${programId}` : \"/merchants\"),\n  };\n}\n\nexport class VouchError extends Error {\n  code: string;\n  statusCode: number;\n  requestId?: string;\n\n  constructor(code: string, message: string, statusCode: number, requestId?: string) {\n    super(message);\n    this.name = \"VouchError\";\n    this.code = code;\n    this.statusCode = statusCode;\n    this.requestId = requestId;\n  }\n}\n","import type { UPIData, UPIScheme } from \"./types\";\n\n/**\n * Parse a UPI payment scheme string.\n *\n * Supports:\n * - `upi://pay?pa=merchant@upi&pn=Merchant+Name&am=100.00`\n * - Raw UPI IDs like `merchant@upi`\n *\n * Returns `null` if the input is not recognisable as UPI.\n */\nexport function parseUPIScheme(raw: string): UPIData | null {\n  const trimmed = raw.trim();\n  if (!trimmed) return null;\n\n  // Standard UPI URI scheme\n  if (trimmed.toLowerCase().startsWith(\"upi://\")) {\n    try {\n      const url = new URL(trimmed);\n      const upiId = url.searchParams.get(\"pa\") || undefined;\n      if (!upiId) return null;\n\n      return {\n        type: \"upi\",\n        raw: trimmed,\n        upiId,\n        merchantName: url.searchParams.get(\"pn\")?.replace(/\\+/g, \" \") || undefined,\n        amount: url.searchParams.get(\"am\") || undefined,\n        mcc: url.searchParams.get(\"mc\") || undefined,\n      };\n    } catch {\n      return null;\n    }\n  }\n\n  // Raw UPI ID fallback (anything containing @)\n  if (trimmed.includes(\"@\")) {\n    return {\n      type: \"upi\",\n      raw: trimmed,\n      upiId: trimmed,\n    };\n  }\n\n  return null;\n}\n\n/**\n * Extract all UPI query parameters from a raw UPI scheme string.\n * Useful if you need fields beyond the common ones (e.g. `mc`, `tr`, `tn`).\n */\nexport function parseUPISchemeFull(raw: string): UPIScheme | null {\n  const trimmed = raw.trim();\n  if (!trimmed.toLowerCase().startsWith(\"upi://\")) return null;\n\n  try {\n    const url = new URL(trimmed);\n    const get = (key: string) => url.searchParams.get(key) || undefined;\n    return {\n      pa: get(\"pa\"),\n      pn: get(\"pn\"),\n      am: get(\"am\"),\n      cu: get(\"cu\"),\n      tn: get(\"tn\"),\n      tr: get(\"tr\"),\n      url: get(\"url\"),\n      mc: get(\"mc\"),\n    };\n  } catch {\n    return null;\n  }\n}\n","import type { UPIData, UPIScannerOptions } from \"./types\";\nimport { parseUPIScheme } from \"./upi\";\n\n/**\n * Framework-agnostic UPI QR scanner.\n *\n * Works in any browser environment — vanilla JS, React, Vue, Svelte, etc.\n * Dynamically loads `html5-qrcode` on first use.\n *\n * @example\n * ```ts\n * const scanner = new UPIScanner({\n *   container: \"#scanner\",\n *   onScan: (upi) => console.log(upi.upiId),\n *   onError: (err) => alert(err.message),\n * });\n * await scanner.start();\n * // later...\n * await scanner.stop();\n * ```\n */\nexport class UPIScanner {\n  private options: Required<UPIScannerOptions>;\n  private scanner: { stop: () => Promise<void> } | null = null;\n  private lastScan = 0;\n  private _started = false;\n  private containerEl: HTMLElement | null = null;\n\n  constructor(options: UPIScannerOptions) {\n    this.options = {\n      onError: () => {},\n      width: 320,\n      height: 320,\n      fps: 10,\n      debounceMs: 2000,\n      ...options,\n    };\n  }\n\n  private resolveContainer(): HTMLElement | null {\n    const { container } = this.options;\n    if (typeof container === \"string\") {\n      return document.querySelector(container);\n    }\n    return container;\n  }\n\n  /**\n   * Start the camera and begin scanning for UPI QR codes.\n   */\n  async start(): Promise<void> {\n    if (this._started) return;\n\n    this.containerEl = this.resolveContainer();\n    if (!this.containerEl) {\n      const err = new Error(`UPIScanner: container not found`);\n      this.options.onError(err);\n      throw err;\n    }\n\n    try {\n      const { Html5Qrcode } = await import(\"html5-qrcode\");\n\n      // Ensure the container has an ID for html5-qrcode\n      let scannerId = this.containerEl.id;\n      if (!scannerId) {\n        scannerId = `vouch-scanner-${Math.random().toString(36).slice(2, 9)}`;\n        this.containerEl.id = scannerId;\n      }\n\n      // Clear any previous content\n      this.containerEl.innerHTML = \"\";\n      this.containerEl.style.width = `${this.options.width}px`;\n      this.containerEl.style.height = `${this.options.height}px`;\n\n      const scanner = new Html5Qrcode(scannerId);\n      this.scanner = scanner;\n\n      const qrboxSize = Math.min(this.options.width, this.options.height) * 0.7;\n\n      await scanner.start(\n        { facingMode: \"environment\" },\n        { fps: this.options.fps, qrbox: { width: qrboxSize, height: qrboxSize } },\n        (decodedText: string) => {\n          this.handleScan(decodedText);\n        },\n        () => {\n          // QR not found in this frame — no-op\n        }\n      );\n\n      this._started = true;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err));\n      this.options.onError(error);\n      throw error;\n    }\n  }\n\n  /**\n   * Stop the camera and release resources.\n   */\n  async stop(): Promise<void> {\n    if (!this._started || !this.scanner) return;\n    try {\n      await this.scanner.stop();\n    } catch {\n      // ignore cleanup errors\n    }\n    this.scanner = null;\n    this._started = false;\n  }\n\n  /** Whether the scanner is currently active. */\n  isStarted(): boolean {\n    return this._started;\n  }\n\n  private handleScan(decodedText: string): void {\n    const now = Date.now();\n    if (now - this.lastScan < this.options.debounceMs) return;\n\n    const parsed = parseUPIScheme(decodedText);\n    if (!parsed) return; // ignore non-UPI codes\n\n    this.lastScan = now;\n    this.options.onScan(parsed);\n  }\n}\n"],"mappings":"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","names":["DEFAULT_DEV_BACKEND_ORIGIN","DEFAULT_DEV_BASE_URL","resolveBaseUrl","explicit","fromConfig","fromEnv","Vouch","config","resolveBaseUrl","method","path","body","res","json","error","message","code","requestId","VouchError","slug","params","options","intentId","token","programId","q","statusCode","parseUPIScheme","raw","trimmed","url","upiId","parseUPISchemeFull","get","key","UPIScanner","options","container","err","Html5Qrcode","scannerId","scanner","qrboxSize","decodedText","error","now","parsed","parseUPIScheme"]}