{"version":3,"file":"index.cjs","sources":["../src/config.ts","../src/zarinpal.ts","../src/index.ts"],"sourcesContent":["export const API_BASE_URL = {\n  production: 'https://payment.zarinpal.com/pg/v4/payment/',\n  sandbox: 'https://sandbox.zarinpal.com/pg/v4/payment/'\n} as const;\n\nexport const API_PATHS = {\n  paymentRequest: 'request.json',\n  paymentVerification: 'verify.json',\n  unverifiedTransactions: 'unVerified.json',\n  refreshAuthority: 'refresh.json'\n} as const;\n\nexport const START_PAY_BASE_URL = {\n  production: 'https://www.zarinpal.com/pg/StartPay/',\n  sandbox: 'https://sandbox.zarinpal.com/pg/StartPay/'\n} as const;\n\nexport const MERCHANT_ID_LENGTH = 36;\n","// @ts-ignore TS5097: Node ESM tests require explicit .ts extension.\nimport { API_BASE_URL, API_PATHS, MERCHANT_ID_LENGTH, START_PAY_BASE_URL } from './config.ts';\nimport type {\n  Currency,\n  HttpClient,\n  HttpRequestConfig,\n  HttpResponse,\n  PaymentRequestInput,\n  PaymentRequestResponse,\n  PaymentVerificationInput,\n  PaymentVerificationResponse,\n  RefreshAuthorityInput,\n  RefreshAuthorityResponse,\n  UnverifiedTransactionsResponse,\n  ZarinPalClientOptions,\n  ZarinPalError\n} from './types.ts';\n\ninterface RequestPayload {\n  merchant_id: string;\n  currency?: Currency;\n  amount?: number;\n  callback_url?: string;\n  description?: string;\n  metadata?: {\n    email?: string;\n    mobile?: string;\n  };\n  authority?: string;\n  expire?: number;\n}\n\ninterface ApiData {\n  code: number;\n  message: string;\n  authority?: string;\n  authorities?: string[];\n  card_hash?: string;\n  card_pan?: string;\n  ref_id?: number;\n  fee_type?: string;\n  fee?: number;\n}\n\ninterface HttpErrorData {\n  errors?: ZarinPalError['errors'];\n}\n\ninterface HttpError extends Error {\n  response?: {\n    data?: HttpErrorData;\n  };\n}\n\nconst VALID_CURRENCIES = new Set<Currency>(['IRR', 'IRT']);\nconst DEFAULT_HEADERS = {\n  accept: 'application/json',\n  'content-type': 'application/json'\n} as const;\n\nclass FetchHttpClient implements HttpClient {\n  private readonly timeoutMs: number;\n  private readonly headers: Record<string, string>;\n\n  public constructor(options: ZarinPalClientOptions) {\n    this.timeoutMs = options.timeoutMs ?? 10_000;\n    this.headers = {\n      ...DEFAULT_HEADERS,\n      ...(options.requestConfig?.headers ?? {}),\n      ...(options.axiosConfig?.headers ?? {})\n    };\n  }\n\n  public async request<T>(config: HttpRequestConfig): Promise<HttpResponse<T>> {\n    const controller = new AbortController();\n    const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n\n    try {\n      const response = await fetch(config.url, {\n        method: config.method,\n        headers: this.headers,\n        body: JSON.stringify(config.data),\n        signal: controller.signal\n      });\n\n      const parsedData = await response.json() as T | HttpErrorData;\n\n      if (!response.ok) {\n        const httpError = new Error(`Request failed with status ${response.status}`) as HttpError;\n        httpError.response = { data: parsedData as HttpErrorData };\n        throw httpError;\n      }\n\n      return { data: parsedData as T };\n    } catch (error: unknown) {\n      if (error instanceof Error && error.name === 'AbortError') {\n        throw new Error(`Request timed out after ${this.timeoutMs}ms`);\n      }\n\n      throw error;\n    } finally {\n      clearTimeout(timeout);\n    }\n  }\n}\n\nfunction hasApiError(error: unknown): error is HttpError {\n  if (typeof error !== 'object' || error === null) {\n    return false;\n  }\n\n  const responseData = (error as HttpError).response?.data;\n  return responseData !== undefined && typeof responseData === 'object' && responseData !== null && 'errors' in responseData;\n}\n\nexport class ZarinPalCheckout {\n  public readonly merchant: string;\n  public readonly sandbox: boolean;\n  public readonly currency: Currency;\n  private readonly client: HttpClient;\n\n  public constructor(merchantId: string, options: ZarinPalClientOptions = {}) {\n    if (merchantId.length !== MERCHANT_ID_LENGTH) {\n      throw new Error(`The MerchantID must be ${MERCHANT_ID_LENGTH} characters.`);\n    }\n\n    this.merchant = merchantId;\n    this.sandbox = options.sandbox ?? false;\n    this.currency = options.currency ?? 'IRT';\n\n    if (!VALID_CURRENCIES.has(this.currency)) {\n      throw new Error(\"Invalid currency. Valid options are 'IRR' or 'IRT'.\");\n    }\n\n    this.client = options.httpClient ?? new FetchHttpClient(options);\n  }\n\n  public async PaymentRequest(input: PaymentRequestInput): Promise<PaymentRequestResponse> {\n    const metadata: RequestPayload['metadata'] = {\n      ...(input.Email !== undefined ? { email: input.Email } : {}),\n      ...(input.Mobile !== undefined ? { mobile: input.Mobile } : {})\n    };\n\n    const data = await this.request(API_PATHS.paymentRequest, {\n      merchant_id: this.merchant,\n      currency: this.currency,\n      amount: input.Amount,\n      callback_url: input.CallbackURL,\n      description: input.Description,\n      ...(Object.keys(metadata).length > 0 ? { metadata } : {})\n    });\n\n    return {\n      status: data.code,\n      authority: data.authority ?? '',\n      url: `${this.getStartPayUrl()}${data.authority ?? ''}`\n    };\n  }\n\n  public async PaymentVerification(input: PaymentVerificationInput): Promise<PaymentVerificationResponse> {\n    const data = await this.request(API_PATHS.paymentVerification, {\n      merchant_id: this.merchant,\n      amount: input.Amount,\n      authority: input.Authority\n    });\n\n    return {\n      status: data.code,\n      message: data.message,\n      ...(data.card_hash !== undefined ? { cardHash: data.card_hash } : {}),\n      ...(data.card_pan !== undefined ? { cardPan: data.card_pan } : {}),\n      ...(data.ref_id !== undefined ? { refId: data.ref_id } : {}),\n      ...(data.fee_type !== undefined ? { feeType: data.fee_type } : {}),\n      ...(data.fee !== undefined ? { fee: data.fee } : {})\n    };\n  }\n\n  public async UnverifiedTransactions(): Promise<UnverifiedTransactionsResponse> {\n    const data = await this.request(API_PATHS.unverifiedTransactions, {\n      merchant_id: this.merchant\n    });\n\n    return {\n      code: data.code,\n      message: data.message,\n      authorities: data.authorities ?? []\n    };\n  }\n\n  public async RefreshAuthority(input: RefreshAuthorityInput): Promise<RefreshAuthorityResponse> {\n    const data = await this.request(API_PATHS.refreshAuthority, {\n      merchant_id: this.merchant,\n      authority: input.Authority,\n      expire: input.Expire\n    });\n\n    return {\n      code: data.code,\n      message: data.message\n    };\n  }\n\n  public TokenBeautifier(token: string): string[] {\n    return token.split(/\\b0+/g);\n  }\n\n  private getApiBaseUrl(): string {\n    return this.sandbox ? API_BASE_URL.sandbox : API_BASE_URL.production;\n  }\n\n  private getStartPayUrl(): string {\n    return this.sandbox ? START_PAY_BASE_URL.sandbox : START_PAY_BASE_URL.production;\n  }\n\n  private async request(path: string, payload: RequestPayload): Promise<ApiData> {\n    const url = `${this.getApiBaseUrl()}${path}`;\n\n    try {\n      const response = await this.client.request<{ data: ApiData }>({\n        url,\n        method: 'POST',\n        data: payload\n      });\n\n      return response.data.data;\n    } catch (error: unknown) {\n      if (hasApiError(error) && error.response?.data?.errors) {\n        throw error.response.data;\n      }\n\n      throw error;\n    }\n  }\n}\n","// @ts-ignore TS5097: Node ESM tests require explicit .ts extension.\nimport { ZarinPalCheckout } from './zarinpal.ts';\nimport type { Currency, ZarinPalClientOptions, ZarinPalModule } from './types.ts';\n\nconst version = '1.0.0';\n\nconst createWithOptions = (merchantId: string, options: ZarinPalClientOptions = {}): ZarinPalCheckout => {\n  return new ZarinPalCheckout(merchantId, options);\n};\n\nconst create = (merchantId: string, sandbox = false, currency: Currency = 'IRT'): ZarinPalCheckout => {\n  return createWithOptions(merchantId, { sandbox, currency });\n};\n\nconst ZarinpalCheckout: ZarinPalModule = {\n  version,\n  create,\n  createWithOptions\n};\n\nexport { ZarinPalCheckout, create, createWithOptions, version };\nexport default ZarinpalCheckout;\n// @ts-ignore TS5097: Node ESM tests require explicit .ts extension.\nexport * from './types.ts';\n"],"names":[],"mappings":"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"}