pathao-merchant-sdk 2.1.0 → 2.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/pathao-api.ts","../src/types.ts"],"names":["config","DeliveryType","ItemType"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Pathao Merchant API Service (Unofficial SDK)\n *\n * This is an unofficial SDK for the Pathao Merchant API.\n *\n * API Details (based on public documentation):\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - All endpoints use /aladdin/api/v1/ prefix\n * - Base URL can be set via PATHAO_BASE_URL environment variable or constructor config\n * - Timeout can be set via PATHAO_TIMEOUT environment variable or constructor config\n *\n * Features implemented:\n * - Token-based authentication with refresh token support\n * - Store management (create, list stores)\n * - Order creation (single and bulk)\n * - Order tracking and status\n * - Dynamic price calculation\n * - City, zone, and area management\n */\n\nimport axios, { AxiosError, AxiosInstance } from 'axios';\nimport {\n PathaoAreaResponse,\n PathaoAuthResponse,\n PathaoBulkOrderResponse,\n PathaoCityResponse,\n PathaoConfig,\n PathaoError,\n PathaoOrderRequest,\n PathaoOrderResponse,\n PathaoOrderStatusResponse,\n PathaoPriceRequest,\n PathaoPriceResponse,\n PathaoStoreCreateResponse,\n PathaoStoreListResponse,\n PathaoStoreRequest,\n PathaoZoneResponse,\n} from './types';\n\nexport class PathaoApiError extends Error {\n status: number | undefined;\n code: number | undefined;\n type: string | undefined;\n errors: Record<string, string[]> | undefined;\n validation: Record<string, string[]> | undefined;\n responseData: unknown;\n\n constructor(\n message: string,\n options: {\n status?: number | undefined;\n code?: number | undefined;\n type?: string | undefined;\n errors?: Record<string, string[]> | undefined;\n validation?: Record<string, string[]> | undefined;\n responseData?: unknown;\n } = {},\n ) {\n super(message);\n this.name = 'PathaoApiError';\n this.status = options.status;\n this.code = options.code;\n this.type = options.type;\n this.errors = options.errors;\n this.validation = options.validation;\n this.responseData = options.responseData;\n }\n}\n\n// Internal resolved config with guaranteed timeout\ninterface ResolvedPathaoConfig extends PathaoConfig {\n timeout: number;\n}\n\n// Circuit breaker configuration\nexport interface CircuitBreakerConfig {\n threshold?: number; // Default: 5\n timeout?: number; // Default: 60000ms\n}\n\nexport class PathaoApiService {\n private pathaoClient: AxiosInstance;\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private tokenExpiry: number | null = null;\n private config: ResolvedPathaoConfig;\n private isAuthenticating: boolean = false;\n private authPromise: Promise<void> | null = null;\n private hasValidated: boolean = false;\n private debug: boolean = false;\n private circuitBreaker: {\n failures: number;\n lastFailureTime: number;\n threshold: number;\n timeout: number;\n isOpen: boolean;\n };\n\n constructor(config: PathaoConfig, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }) {\n const parsedTimeout = parseInt(process.env.PATHAO_TIMEOUT || '', 10);\n const envTimeout = Number.isNaN(parsedTimeout) || parsedTimeout <= 0 ? 30000 : parsedTimeout;\n const timeout: number = config.timeout ?? envTimeout;\n\n this.config = {\n baseURL: config.baseURL || process.env.PATHAO_BASE_URL || '',\n timeout,\n clientId: config.clientId || process.env.PATHAO_CLIENT_ID || '',\n clientSecret:\n config.clientSecret || process.env.PATHAO_CLIENT_SECRET || '',\n username: config.username || process.env.PATHAO_USERNAME || '',\n password: config.password || process.env.PATHAO_PASSWORD || '',\n };\n\n this.debug = options?.debug || false;\n this.circuitBreaker = {\n failures: 0,\n lastFailureTime: 0,\n threshold: options?.circuitBreaker?.threshold ?? 5,\n timeout: options?.circuitBreaker?.timeout ?? 60000,\n isOpen: false,\n };\n\n this.pathaoClient = axios.create({\n baseURL: this.config.baseURL,\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': `pathao-merchant-sdk node/${ process.version}`,\n },\n });\n\n // Add request interceptor for authentication\n this.pathaoClient.interceptors.request.use(async (config) => {\n // Skip auth for token requests to prevent infinite loops\n if (config.url?.includes('/issue-token')) {\n return config;\n }\n\n // Validate configuration on first API call\n this.validateConfiguration();\n await this.ensureAuthenticated();\n if (this.accessToken) {\n config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n\n if (this.debug) {\n const safeHeaders = { ...config.headers } as Record<string, unknown>;\n if (safeHeaders['Authorization']) safeHeaders['Authorization'] = 'Bearer [REDACTED]';\n console.log(`[Pathao SDK] ${config.method?.toUpperCase()} ${config.url}`, {\n headers: safeHeaders,\n data: config.data,\n });\n }\n\n return config;\n });\n\n // Add response interceptor for error handling\n this.pathaoClient.interceptors.response.use(\n (response) => {\n // Reset circuit breaker on successful request\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n\n if (this.debug) {\n console.log(`[Pathao SDK] Response ${response.status}`, {\n url: response.config.url,\n data: response.data,\n });\n }\n\n return response;\n },\n async (error) => {\n if (error.response?.status === 401) {\n // Token expired, clear tokens and retry once\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n\n if (error.config && !error.config._retry) {\n error.config._retry = true;\n await this.ensureAuthenticated();\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n return this.pathaoClient.request(error.config);\n }\n }\n\n // Respect Retry-After on 429 (rate limit), retry once\n if (error.response?.status === 429 && error.config && !error.config._rateLimitRetry) {\n error.config._rateLimitRetry = true;\n const retryAfterHeader = error.response.headers['retry-after'] as string | undefined;\n const delayMs = retryAfterHeader ? parseInt(retryAfterHeader, 10) * 1000 : 1000;\n await this.delay(delayMs);\n return this.pathaoClient.request(error.config);\n }\n\n // Retry transient 5xx errors with exponential backoff (max 2 retries)\n const status: number | undefined = error.response?.status;\n if (status !== undefined && status >= 500 && error.config) {\n const retryCount: number = (error.config._retryCount as number | undefined) ?? 0;\n if (retryCount < 2) {\n error.config._retryCount = retryCount + 1;\n await this.delay(Math.min(500 * 2 ** retryCount, 4000));\n return this.pathaoClient.request(error.config);\n }\n }\n\n // Handle circuit breaker\n this.handleCircuitBreaker();\n return Promise.reject(error);\n },\n );\n }\n\n private validateConfiguration(): void {\n // Only validate once\n if (this.hasValidated) {\n return;\n }\n\n if (!this.config.baseURL) {\n throw this.toPathaoApiError(\n new Error(\n 'Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable',\n ),\n 'Configuration validation failed',\n );\n }\n\n if (!this.config.baseURL.startsWith('https://')) {\n throw this.toPathaoApiError(\n new Error('Pathao API baseURL must use HTTPS (https://)'),\n 'Configuration validation failed',\n );\n }\n\n if (\n !this.config.clientId ||\n !this.config.clientSecret ||\n !this.config.username ||\n !this.config.password\n ) {\n throw this.toPathaoApiError(\n new Error(\n 'Pathao API credentials are required: clientId, clientSecret, username, password. You can provide them via constructor config or environment variables (PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME, PATHAO_PASSWORD)',\n ),\n 'Configuration validation failed',\n );\n }\n\n this.hasValidated = true;\n }\n\n private async ensureAuthenticated(): Promise<void> {\n // Check circuit breaker\n if (this.circuitBreaker.isOpen) {\n if (\n Date.now() - this.circuitBreaker.lastFailureTime >\n this.circuitBreaker.timeout\n ) {\n this.circuitBreaker.isOpen = false;\n this.circuitBreaker.failures = 0;\n } else {\n throw new PathaoApiError(\n 'Circuit breaker is open. Too many authentication failures. Try again later.',\n { code: 503 },\n );\n }\n }\n\n if (this.accessToken && this.tokenExpiry && Date.now() < this.tokenExpiry) {\n return; // Token is still valid\n }\n\n // If already authenticating, wait for it to complete\n if (this.isAuthenticating && this.authPromise) {\n return this.authPromise;\n }\n\n // Start authentication process\n this.isAuthenticating = true;\n this.authPromise = this.performAuthentication();\n\n try {\n await this.authPromise;\n } finally {\n this.isAuthenticating = false;\n this.authPromise = null;\n }\n }\n\n private async performAuthentication(): Promise<void> {\n if (this.refreshToken) {\n try {\n await this.refreshAccessToken();\n return;\n } catch (error) {\n // Refresh failed, try fresh authentication\n this.refreshToken = null;\n }\n }\n\n await this.authenticate();\n }\n\n private async authenticate(): Promise<void> {\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>(\n '/aladdin/api/v1/issue-token',\n {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n username: this.config.username,\n password: this.config.password,\n grant_type: 'password',\n },\n );\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + response.data.expires_in * 1000 - 60000; // 1 minute buffer\n\n // Reset circuit breaker on successful auth\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n } catch (error) {\n this.handleCircuitBreaker();\n throw this.toPathaoApiError(error, 'Authentication failed');\n }\n }\n\n private async refreshAccessToken(): Promise<void> {\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>(\n '/aladdin/api/v1/issue-token',\n {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n refresh_token: this.refreshToken,\n grant_type: 'refresh_token',\n },\n );\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + response.data.expires_in * 1000 - 60000; // 1 minute buffer\n\n // Reset circuit breaker on successful refresh\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n } catch (error) {\n this.handleCircuitBreaker();\n throw this.toPathaoApiError(error, 'Token refresh failed');\n }\n }\n\n private getErrorMessage(error: unknown): string {\n if (error instanceof AxiosError) {\n const pathaoError = error.response?.data as PathaoError;\n if (pathaoError?.message) {\n return pathaoError.message;\n }\n return error.message;\n }\n if (error instanceof Error) return error.message;\n return 'Unknown error';\n }\n\n private toPathaoApiError(error: unknown, context: string): PathaoApiError {\n if (error instanceof PathaoApiError) {\n return error;\n }\n\n const messageFallback = this.getErrorMessage(error);\n const hasResponse = (e: unknown): e is { response?: AxiosError['response'] } =>\n typeof e === 'object' && e !== null && 'response' in e;\n const axiosLike =\n error instanceof AxiosError\n ? error\n : hasResponse(error)\n ? error\n : null;\n if (axiosLike) {\n const pathaoError = axiosLike.response?.data as PathaoError | undefined;\n return new PathaoApiError(\n `${context}: ${pathaoError?.message || messageFallback}`,\n {\n status: axiosLike.response?.status,\n code: pathaoError?.code ?? axiosLike.response?.status,\n type: pathaoError?.type,\n errors: pathaoError?.errors,\n validation: pathaoError?.validation,\n responseData: pathaoError ?? axiosLike.response?.data,\n },\n );\n }\n\n return new PathaoApiError(`${context}: ${messageFallback}`);\n }\n\n private handleCircuitBreaker(): void {\n this.circuitBreaker.failures++;\n this.circuitBreaker.lastFailureTime = Date.now();\n\n if (this.circuitBreaker.failures >= this.circuitBreaker.threshold) {\n this.circuitBreaker.isOpen = true;\n }\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n // Official Pathao API: Create Order\n async createOrder(\n orderData: PathaoOrderRequest,\n ): Promise<PathaoOrderResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoOrderResponse>(\n '/aladdin/api/v1/orders',\n orderData,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create Pathao order');\n }\n }\n\n // Official Pathao API: Create Store\n async createStore(\n storeData: PathaoStoreRequest,\n ): Promise<PathaoStoreCreateResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoStoreCreateResponse>(\n '/aladdin/api/v1/stores',\n storeData,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create Pathao store');\n }\n }\n\n // Official Pathao API: Get Store List\n async getStores(page?: number): Promise<PathaoStoreListResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoStoreListResponse>(\n '/aladdin/api/v1/stores',\n page !== undefined ? { params: { page } } : undefined,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao stores');\n }\n }\n\n // Official Pathao API: Calculate Price\n async calculatePrice(\n priceData: PathaoPriceRequest,\n ): Promise<PathaoPriceResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoPriceResponse>(\n '/aladdin/api/v1/merchant/price-plan',\n priceData,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to calculate Pathao price');\n }\n }\n\n // Official Pathao API: Get Cities\n async getCities(): Promise<PathaoCityResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoCityResponse>(\n '/aladdin/api/v1/city-list',\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao cities');\n }\n }\n\n // Official Pathao API: Get Zones for a City\n async getZones(cityId: number): Promise<PathaoZoneResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoZoneResponse>(\n `/aladdin/api/v1/cities/${cityId}/zone-list`,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao zones');\n }\n }\n\n // Official Pathao API: Get Areas for a Zone\n async getAreas(zoneId: number): Promise<PathaoAreaResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoAreaResponse>(\n `/aladdin/api/v1/zones/${zoneId}/area-list`,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao areas');\n }\n }\n\n // Official Pathao API: Get Order Status\n async getOrderStatus(\n consignmentId: string,\n ): Promise<PathaoOrderStatusResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoOrderStatusResponse>(\n `/aladdin/api/v1/orders/${encodeURIComponent(consignmentId)}/info`,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao order status');\n }\n }\n\n // Official Pathao API: Create Bulk Order\n async createBulkOrder(\n orders: PathaoOrderRequest[],\n ): Promise<PathaoBulkOrderResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoBulkOrderResponse>(\n '/aladdin/api/v1/orders/bulk', { orders });\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create bulk Pathao orders');\n }\n }\n\n // Helper method to validate phone number\n static validatePhoneNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11 && cleanPhone.startsWith('01');\n }\n\n // Helper method to format phone number\n static formatPhoneNumber(phone: string): string {\n const cleanPhone = phone.replace(/\\D/g, '');\n if (cleanPhone.length === 11 && cleanPhone.startsWith('01')) {\n return cleanPhone;\n }\n throw new Error(\n 'Invalid phone number format. Must be 11 digits starting with 01',\n );\n }\n\n // Helper method to validate address\n static validateAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 10 && trimmed.length <= 220;\n }\n\n // Helper method to validate weight\n static validateWeight(weight: number): boolean {\n return weight >= 0.5 && weight <= 10;\n }\n\n // Helper method to validate recipient name\n static validateRecipientName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 100;\n }\n\n // Helper method to validate store name\n static validateStoreName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 50;\n }\n\n // Helper method to validate contact name\n static validateContactName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 50;\n }\n\n // Helper method to validate contact number\n static validateContactNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11 && cleanPhone.startsWith('01');\n }\n\n // Helper method to validate store address\n static validateStoreAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 15 && trimmed.length <= 120;\n }\n\n // Method to clear authentication state (useful for testing)\n clearAuth(): void {\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n this.isAuthenticating = false;\n this.authPromise = null;\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n this.circuitBreaker.lastFailureTime = 0;\n }\n\n // Static factory method to create instance from environment variables\n static fromEnv(options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n const config: PathaoConfig = {\n clientId: '',\n clientSecret: '',\n username: '',\n password: '',\n baseURL: '',\n };\n return new PathaoApiService(config, options);\n }\n\n // Static factory method to create instance from configuration object\n static fromConfig(\n config: PathaoConfig,\n options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig },\n ): PathaoApiService {\n return new PathaoApiService(config, options);\n }\n\n // Named constructor for sandbox environment\n static sandbox(credentials: Omit<PathaoConfig, 'baseURL'>, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n return new PathaoApiService(\n { ...credentials, baseURL: 'https://courier-api-sandbox.pathao.com' },\n options,\n );\n }\n\n // Named constructor for production environment\n static production(credentials: Omit<PathaoConfig, 'baseURL'>, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n return new PathaoApiService(\n { ...credentials, baseURL: 'https://api-hermes.pathao.com' },\n options,\n );\n }\n}\n\n","/**\n * Pathao Courier API Types\n * \n * Official API Details:\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - All endpoints use /aladdin/api/v1/ prefix\n * - Base URL can be set via PATHAO_BASE_URL environment variable or constructor config\n * - Timeout can be set via PATHAO_TIMEOUT environment variable or constructor config\n */\n\n// Official Pathao API Authentication Response\nexport interface PathaoAuthResponse {\n token_type: string;\n expires_in: number;\n access_token: string;\n refresh_token: string;\n}\n\n// Official Pathao Order Creation Request\nexport interface PathaoOrderRequest {\n store_id: number;\n merchant_order_id?: string; // Optional - Your order tracking ID\n recipient_name: string; // Required - 3-100 characters\n recipient_phone: string; // Required - 11 characters\n recipient_secondary_phone?: string; // Optional - 11 characters\n recipient_address: string; // Required - 10-220 characters\n recipient_city?: number; // Optional - Auto-detected if not provided\n recipient_zone?: number; // Optional - Auto-detected if not provided\n recipient_area?: number; // Optional - Auto-detected if not provided\n delivery_type: number; // Required - 48 (Normal), 12 (On Demand)\n item_type: number; // Required - 1 (Document), 2 (Parcel)\n special_instruction?: string; // Optional\n item_quantity: number; // Required\n item_weight: number; // Required - 0.5-10 kg\n item_description?: string; // Optional\n amount_to_collect: number; // Required - COD amount (0 for non-COD)\n}\n\n// Official Pathao Store Creation Request\nexport interface PathaoStoreRequest {\n name: string; // 3-50 characters\n contact_name: string; // 3-50 characters\n contact_number: string; // 11 characters\n secondary_contact?: string; // Optional - 11 characters\n otp_number?: string; // Optional - OTP for orders\n address: string; // 15-120 characters\n city_id: number;\n zone_id: number;\n area_id: number;\n}\n\n// Official Pathao Order Response\nexport interface PathaoOrderResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n merchant_order_id: string;\n order_status: string;\n delivery_fee: number;\n };\n}\n\n// Official Pathao Store Creation Response\nexport interface PathaoStoreCreateResponse {\n type: string;\n code: number;\n message: string;\n data: {\n store_name: string; // Only store_name returned on creation\n };\n}\n\n// Official Pathao Store List Item (from GET /stores)\nexport interface PathaoStore {\n store_id: number;\n store_name: string;\n store_address: string;\n is_active: 0 | 1; // 1 for active, 0 for deactivated\n city_id: number;\n zone_id: number;\n hub_id: number;\n is_default_store: boolean;\n is_default_return_store: boolean;\n}\n\n// Official Pathao Store List Response\nexport interface PathaoStoreListResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: PathaoStore[];\n total: number;\n current_page: number;\n per_page: number;\n total_in_page: number;\n last_page: number;\n path: string;\n to: number;\n from: number;\n last_page_url: string;\n first_page_url: string;\n };\n}\n\n// Official Pathao Price Calculation Request\nexport interface PathaoPriceRequest {\n store_id: number;\n item_type: number;\n item_weight: number;\n delivery_type: number;\n recipient_city: number;\n recipient_zone: number;\n}\n\n// Official Pathao Price Response\nexport interface PathaoPriceResponse {\n type: string;\n code: number;\n message: string;\n data: {\n price: number; // Calculated price for given item\n discount: number; // Discount for the given item\n promo_discount: number; // Promo discount for the given item\n plan_id: number; // Price plan id for the given item\n cod_enabled: 0 | 1; // 1 if COD enabled, 0 if not\n cod_percentage: number; // Cash on delivery percentage\n additional_charge: number; // If there is any additional charge\n final_price: number; // Your final price for the given item\n };\n}\n\n// Official Pathao City Response\nexport interface PathaoCityResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n city_id: number;\n city_name: string;\n }>;\n };\n}\n\n// Official Pathao Order Status Response\nexport interface PathaoOrderStatusResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n merchant_order_id: string;\n order_status: string;\n order_status_slug: string;\n updated_at: string;\n invoice_id: string | null;\n };\n}\n\n// Official Pathao Zone Response\nexport interface PathaoZoneResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n zone_id: number;\n zone_name: string;\n }>;\n };\n}\n\n// Official Pathao Area Response\nexport interface PathaoAreaResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n area_id: number;\n area_name: string;\n home_delivery_available: boolean;\n pickup_available: boolean;\n }>;\n };\n}\n\n// Configuration options for PathaoApiService\nexport interface PathaoConfig {\n clientId: string;\n clientSecret: string;\n username: string;\n password: string;\n baseURL: string;\n timeout?: number; // Optional - defaults to 30000 if not provided\n}\n\n// Error response from Pathao API\nexport interface PathaoError {\n type: string;\n code: number;\n message: string;\n errors?: Record<string, string[]>;\n validation?: Record<string, string[]>;\n}\n\n/**\n * Delivery type codes defined by the Pathao API.\n * Values correspond to Pathao's internal delivery_type IDs.\n * @see https://developers.pathao.com - Order Creation endpoint\n */\nexport enum DeliveryType {\n /** Standard delivery (API value: 48) */\n NORMAL = 48,\n /** Same-day on-demand delivery (API value: 12) */\n ON_DEMAND = 12\n}\n\n// Item types enum\nexport enum ItemType {\n DOCUMENT = 1,\n PARCEL = 2\n}\n\n// Official Pathao Bulk Order Response\nexport interface PathaoBulkOrderResponse {\n message: string;\n type: string;\n code: number;\n data: boolean;\n}\n\n"]}
1
+ {"version":3,"sources":["../src/pathao-api.ts","../src/types.ts"],"names":["config","DeliveryType","ItemType"],"mappings":";;;AAwCO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EAQxC,WAAA,CACE,OAAA,EACA,OAAA,GAOI,EAAC,EACL;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAAA,EAC9B;AACF;AAaO,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,EAkB5B,WAAA,CAAY,QAAsB,OAAA,EAAsE;AAhBxG,IAAA,IAAA,CAAQ,WAAA,GAA6B,IAAA;AACrC,IAAA,IAAA,CAAQ,YAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAQ,WAAA,GAA6B,IAAA;AAErC,IAAA,IAAA,CAAQ,gBAAA,GAA4B,KAAA;AACpC,IAAA,IAAA,CAAQ,WAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,YAAA,GAAwB,KAAA;AAChC,IAAA,IAAA,CAAQ,KAAA,GAAiB,KAAA;AAUvB,IAAA,MAAM,gBAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAA,IAAkB,IAAI,EAAE,CAAA;AACnE,IAAA,MAAM,aAAa,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA,IAAK,aAAA,IAAiB,IAAI,GAAA,GAAQ,aAAA;AAC/E,IAAA,MAAM,OAAA,GAAkB,OAAO,OAAA,IAAW,UAAA;AAE1C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,OAAA,CAAQ,IAAI,eAAA,IAAmB,EAAA;AAAA,MAC1D,OAAA;AAAA,MACA,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,OAAA,CAAQ,IAAI,gBAAA,IAAoB,EAAA;AAAA,MAC7D,YAAA,EACE,MAAA,CAAO,YAAA,IAAgB,OAAA,CAAQ,IAAI,oBAAA,IAAwB,EAAA;AAAA,MAC7D,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,OAAA,CAAQ,IAAI,eAAA,IAAmB,EAAA;AAAA,MAC5D,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,OAAA,CAAQ,IAAI,eAAA,IAAmB;AAAA,KAC9D;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,KAAA;AAC/B,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,QAAA,EAAU,CAAA;AAAA,MACV,eAAA,EAAiB,CAAA;AAAA,MACjB,SAAA,EAAW,OAAA,EAAS,cAAA,EAAgB,SAAA,IAAa,CAAA;AAAA,MACjD,OAAA,EAAS,OAAA,EAAS,cAAA,EAAgB,OAAA,IAAW,GAAA;AAAA,MAC7C,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,MAAM,MAAA,CAAO;AAAA,MAC/B,GAAI,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ,GAAI,EAAC;AAAA,MAC9D,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,MAAA,EAAQ,kBAAA;AAAA,QACR,YAAA,EAAc,CAAA,yBAAA,EAA4B,OAAA,CAAQ,OAAO,CAAA;AAAA;AAC3D,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,OAAOA,OAAAA,KAAW;AAE3D,MAAA,IAAIA,OAAAA,CAAO,GAAA,EAAK,QAAA,CAAS,cAAc,CAAA,EAAG;AACxC,QAAA,OAAOA,OAAAA;AAAA,MACT;AAGA,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,MAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAAA,OAAAA,CAAO,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,WAAW,CAAA,CAAA;AAAA,MAC3D;AAEA,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,MAAM,WAAA,GAAc,EAAE,GAAGA,OAAAA,CAAO,OAAA,EAAQ;AACxC,QAAA,IAAI,WAAA,CAAY,eAAe,CAAA,EAAG,WAAA,CAAY,eAAe,CAAA,GAAI,mBAAA;AACjE,QAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgBA,OAAAA,CAAO,MAAA,EAAQ,aAAa,CAAA,CAAA,EAAIA,OAAAA,CAAO,GAAG,CAAA,CAAA,EAAI;AAAA,UACxE,OAAA,EAAS,WAAA;AAAA,UACT,MAAMA,OAAAA,CAAO;AAAA,SACd,CAAA;AAAA,MACH;AAEA,MAAA,OAAOA,OAAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,YAAA,CAAa,aAAa,QAAA,CAAS,GAAA;AAAA,MACtC,CAAC,QAAA,KAAa;AAEZ,QAAA,IAAA,CAAK,eAAe,QAAA,GAAW,CAAA;AAC/B,QAAA,IAAA,CAAK,eAAe,MAAA,GAAS,KAAA;AAE7B,QAAA,IAAI,KAAK,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI;AAAA,YACtD,GAAA,EAAK,SAAS,MAAA,CAAO,GAAA;AAAA,YACrB,MAAM,QAAA,CAAS;AAAA,WAChB,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,CAAA;AAAA,MACA,OAAO,KAAA,KAAU;AACf,QAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAElC,UAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,UAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,UAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAEnB,UAAA,IAAI,KAAA,CAAM,MAAA,IAAU,CAAC,KAAA,CAAM,OAAO,MAAA,EAAQ;AACxC,YAAA,KAAA,CAAM,OAAO,MAAA,GAAS,IAAA;AACtB,YAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,YAAA,IAAI,KAAK,WAAA,EAAa;AACpB,cAAA,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,WAAW,CAAA,CAAA;AAAA,YACjE;AACA,YAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAAA,UAC/C;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,CAAM,UAAU,MAAA,KAAW,GAAA,IAAO,MAAM,MAAA,IAAU,CAAC,KAAA,CAAM,MAAA,CAAO,eAAA,EAAiB;AACnF,UAAA,KAAA,CAAM,OAAO,eAAA,GAAkB,IAAA;AAC/B,UAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,aAAa,CAAA;AAC7D,UAAA,MAAM,UAAU,gBAAA,GAAmB,QAAA,CAAS,gBAAA,EAAkB,EAAE,IAAI,GAAA,GAAO,GAAA;AAC3E,UAAA,MAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AACxB,UAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAAA,QAC/C;AAGA,QAAA,MAAM,MAAA,GAA6B,MAAM,QAAA,EAAU,MAAA;AACnD,QAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,IAAU,GAAA,IAAO,MAAM,MAAA,EAAQ;AACzD,UAAA,MAAM,UAAA,GAAsB,KAAA,CAAM,MAAA,CAAO,WAAA,IAAsC,CAAA;AAC/E,UAAA,IAAI,aAAa,CAAA,EAAG;AAClB,YAAA,KAAA,CAAM,MAAA,CAAO,cAAc,UAAA,GAAa,CAAA;AACxC,YAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,IAAK,UAAA,EAAY,GAAI,CAAC,CAAA;AACtD,YAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAAA,UAC/C;AAAA,QACF;AAGA,QAAA,MAAM,WAAA,GAAc,WAAW,MAAA,IAAa,MAAA,IAAU,OAAO,MAAA,GAAS,GAAA,IAAO,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA;AAC1G,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,QAC5B;AACA,QAAA,OAAO,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,MAC7B;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,qBAAA,GAA8B;AAEpC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AACxB,MAAA,MAAM,IAAA,CAAK,gBAAA;AAAA,QACT,IAAI,KAAA;AAAA,UACF;AAAA,SACF;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,EAAG;AAC/C,MAAA,MAAM,IAAA,CAAK,gBAAA;AAAA,QACT,IAAI,MAAM,8CAA8C,CAAA;AAAA,QACxD;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IACE,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,IACb,CAAC,IAAA,CAAK,MAAA,CAAO,YAAA,IACb,CAAC,KAAK,MAAA,CAAO,QAAA,IACb,CAAC,IAAA,CAAK,OAAO,QAAA,EACb;AACA,MAAA,MAAM,IAAA,CAAK,gBAAA;AAAA,QACT,IAAI,KAAA;AAAA,UACF;AAAA,SACF;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA,EAEA,MAAc,mBAAA,GAAqC;AAEjD,IAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAQ;AAC9B,MAAA,IACE,IAAA,CAAK,KAAI,GAAI,IAAA,CAAK,eAAe,eAAA,GACjC,IAAA,CAAK,eAAe,OAAA,EACpB;AACA,QAAA,IAAA,CAAK,eAAe,MAAA,GAAS,KAAA;AAC7B,QAAA,IAAA,CAAK,eAAe,QAAA,GAAW,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,cAAA;AAAA,UACR,6EAAA;AAAA,UACA,EAAE,MAAM,GAAA;AAAI,SACd;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA,IAAe,KAAK,GAAA,EAAI,GAAI,KAAK,WAAA,EAAa;AACzE,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,WAAA,EAAa;AAC7C,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,IACd;AAGA,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,qBAAA,EAAsB;AAE9C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,WAAA;AAAA,IACb,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,qBAAA,GAAuC;AACnD,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,kBAAA,EAAmB;AAC9B,QAAA;AAAA,MACF,SAAS,KAAA,EAAO;AAEd,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,MAAM,KAAK,YAAA,EAAa;AAAA,EAC1B;AAAA,EAEA,MAAc,YAAA,GAA8B;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA;AAAA,QACvC,6BAAA;AAAA,QACA;AAAA,UACE,SAAA,EAAW,KAAK,MAAA,CAAO,QAAA;AAAA,UACvB,aAAA,EAAe,KAAK,MAAA,CAAO,YAAA;AAAA,UAC3B,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,UACtB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,UACtB,UAAA,EAAY;AAAA;AACd,OACF;AAEA,MAAA,IAAA,CAAK,WAAA,GAAc,SAAS,IAAA,CAAK,YAAA;AACjC,MAAA,IAAA,CAAK,YAAA,GAAe,SAAS,IAAA,CAAK,aAAA;AAClC,MAAA,IAAA,CAAK,cAAc,IAAA,CAAK,GAAA,KAAQ,QAAA,CAAS,IAAA,CAAK,aAAa,GAAA,GAAO,GAAA;AAGlE,MAAA,IAAA,CAAK,eAAe,QAAA,GAAW,CAAA;AAC/B,MAAA,IAAA,CAAK,eAAe,MAAA,GAAS,KAAA;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,uBAAuB,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAc,kBAAA,GAAoC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA;AAAA,QACvC,6BAAA;AAAA,QACA;AAAA,UACE,SAAA,EAAW,KAAK,MAAA,CAAO,QAAA;AAAA,UACvB,aAAA,EAAe,KAAK,MAAA,CAAO,YAAA;AAAA,UAC3B,eAAe,IAAA,CAAK,YAAA;AAAA,UACpB,UAAA,EAAY;AAAA;AACd,OACF;AAEA,MAAA,IAAA,CAAK,WAAA,GAAc,SAAS,IAAA,CAAK,YAAA;AACjC,MAAA,IAAA,CAAK,YAAA,GAAe,SAAS,IAAA,CAAK,aAAA;AAClC,MAAA,IAAA,CAAK,cAAc,IAAA,CAAK,GAAA,KAAQ,QAAA,CAAS,IAAA,CAAK,aAAa,GAAA,GAAO,GAAA;AAGlE,MAAA,IAAA,CAAK,eAAe,QAAA,GAAW,CAAA;AAC/B,MAAA,IAAA,CAAK,eAAe,MAAA,GAAS,KAAA;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,sBAAsB,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEQ,gBAAgB,KAAA,EAAwB;AAC9C,IAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,MAAA,MAAM,WAAA,GAAc,MAAM,QAAA,EAAU,IAAA;AACpC,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,OAAO,WAAA,CAAY,OAAA;AAAA,MACrB;AACA,MAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACf;AACA,IAAA,IAAI,KAAA,YAAiB,KAAA,EAAO,OAAO,KAAA,CAAM,OAAA;AACzC,IAAA,OAAO,eAAA;AAAA,EACT;AAAA,EAEQ,gBAAA,CAAiB,OAAgB,OAAA,EAAiC;AACxE,IAAA,IAAI,iBAAiB,cAAA,EAAgB;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAClD,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KACnB,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,UAAA,IAAc,CAAA;AACvD,IAAA,MAAM,YACJ,KAAA,YAAiB,UAAA,GACb,QACA,WAAA,CAAY,KAAK,IACf,KAAA,GACA,IAAA;AACR,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,WAAA,GAAc,UAAU,QAAA,EAAU,IAAA;AACxC,MAAA,OAAO,IAAI,cAAA;AAAA,QACT,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,WAAA,EAAa,WAAW,eAAe,CAAA,CAAA;AAAA,QACtD;AAAA,UACE,MAAA,EAAQ,UAAU,QAAA,EAAU,MAAA;AAAA,UAC5B,IAAA,EAAM,WAAA,EAAa,IAAA,IAAQ,SAAA,CAAU,QAAA,EAAU,MAAA;AAAA,UAC/C,MAAM,WAAA,EAAa,IAAA;AAAA,UACnB,QAAQ,WAAA,EAAa,MAAA;AAAA,UACrB,YAAY,WAAA,EAAa,UAAA;AAAA,UACzB,YAAA,EAAc,WAAA,IAAe,SAAA,CAAU,QAAA,EAAU;AAAA;AACnD,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,cAAA,CAAe,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,eAAe,CAAA,CAAE,CAAA;AAAA,EAC5D;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAA,CAAK,cAAA,CAAe,QAAA,EAAA;AACpB,IAAA,IAAA,CAAK,cAAA,CAAe,eAAA,GAAkB,IAAA,CAAK,GAAA,EAAI;AAE/C,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,QAAA,IAAY,IAAA,CAAK,eAAe,SAAA,EAAW;AACjE,MAAA,IAAA,CAAK,eAAe,MAAA,GAAS,IAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA,EAGA,MAAM,YACJ,SAAA,EAC8B;AAC9B,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,iBAAA,CAAiB,mBAAA,CAAoB,SAAA,CAAU,eAAe,CAAA,EAAG;AACpE,QAAA,MAAM,IAAI,cAAA,CAAe,mDAAA,EAAqD,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA,MAC7F;AACA,MAAA,IAAI,CAAC,iBAAA,CAAiB,cAAA,CAAe,SAAA,CAAU,WAAW,CAAA,EAAG;AAC3D,QAAA,MAAM,IAAI,cAAA,CAAe,4DAAA,EAA8D,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA,MACtG;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA;AAAA,QACvC,wBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,+BAA+B,CAAA;AAAA,IACpE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,YACJ,SAAA,EACoC;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA;AAAA,QACvC,wBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,+BAA+B,CAAA;AAAA,IACpE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAU,IAAA,EAAiD;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA;AAAA,QACvC,wBAAA;AAAA,QACA,SAAS,KAAA,CAAA,GAAY,EAAE,QAAQ,EAAE,IAAA,IAAO,GAAI,KAAA;AAAA,OAC9C;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,+BAA+B,CAAA;AAAA,IACpE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,YAAA,GAAuC;AAC3C,IAAA,IAAI;AACF,MAAA,IAAI,WAAA,GAAc,CAAA;AAClB,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,MAAM,YAA2B,EAAC;AAElC,MAAA,GAAG;AACD,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AACjD,QAAA,IAAI,QAAA,CAAS,MAAM,IAAA,EAAM;AACvB,UAAA,SAAA,CAAU,IAAA,CAAK,GAAG,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,QACtC;AACA,QAAA,QAAA,GAAW,QAAA,CAAS,MAAM,SAAA,IAAa,CAAA;AACvC,QAAA,WAAA,EAAA;AAAA,MACF,SAAS,WAAA,IAAe,QAAA;AAExB,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,mCAAmC,CAAA;AAAA,IACxE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eACJ,SAAA,EAC8B;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA;AAAA,QACvC,qCAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,kCAAkC,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAA,GAAyC;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA;AAAA,QACvC;AAAA,OACF;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,+BAA+B,CAAA;AAAA,IACpE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAS,MAAA,EAA6C;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA;AAAA,QACvC,0BAA0B,MAAM,CAAA,UAAA;AAAA,OAClC;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,8BAA8B,CAAA;AAAA,IACnE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAS,MAAA,EAA6C;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA;AAAA,QACvC,yBAAyB,MAAM,CAAA,UAAA;AAAA,OACjC;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,8BAA8B,CAAA;AAAA,IACnE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eACJ,aAAA,EACoC;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA;AAAA,QACvC,CAAA,uBAAA,EAA0B,kBAAA,CAAmB,aAAa,CAAC,CAAA,KAAA;AAAA,OAC7D;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,qCAAqC,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBACJ,MAAA,EACkC;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA;AAAA,QACvC,6BAAA;AAAA,QAA+B,EAAE,MAAA;AAAO,OAAC;AAC3C,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,qCAAqC,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,oBAAoB,KAAA,EAAwB;AACjD,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC1C,IAAA,OAAO,UAAA,CAAW,MAAA,KAAW,EAAA,IAAM,UAAA,CAAW,WAAW,IAAI,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGA,OAAO,kBAAkB,KAAA,EAAuB;AAC9C,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC1C,IAAA,IAAI,WAAW,MAAA,KAAW,EAAA,IAAM,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,EAAG;AAC3D,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,gBAAgB,OAAA,EAA0B;AAC/C,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,IAAA,OAAO,OAAA,CAAQ,MAAA,IAAU,EAAA,IAAM,OAAA,CAAQ,MAAA,IAAU,GAAA;AAAA,EACnD;AAAA;AAAA,EAGA,OAAO,eAAe,MAAA,EAAyB;AAC7C,IAAA,OAAO,MAAA,IAAU,OAAO,MAAA,IAAU,EAAA;AAAA,EACpC;AAAA;AAAA,EAGA,OAAO,sBAAsB,IAAA,EAAuB;AAClD,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,OAAO,OAAA,CAAQ,MAAA,IAAU,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,GAAA;AAAA,EAClD;AAAA;AAAA,EAGA,OAAO,kBAAkB,IAAA,EAAuB;AAC9C,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,OAAO,OAAA,CAAQ,MAAA,IAAU,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,EAAA;AAAA,EAClD;AAAA;AAAA,EAGA,OAAO,oBAAoB,IAAA,EAAuB;AAChD,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,OAAO,OAAA,CAAQ,MAAA,IAAU,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,EAAA;AAAA,EAClD;AAAA;AAAA,EAGA,OAAO,sBAAsB,KAAA,EAAwB;AACnD,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC1C,IAAA,OAAO,UAAA,CAAW,MAAA,KAAW,EAAA,IAAM,UAAA,CAAW,WAAW,IAAI,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGA,OAAO,qBAAqB,OAAA,EAA0B;AACpD,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,IAAA,OAAO,OAAA,CAAQ,MAAA,IAAU,EAAA,IAAM,OAAA,CAAQ,MAAA,IAAU,GAAA;AAAA,EACnD;AAAA;AAAA,EAGA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,eAAe,QAAA,GAAW,CAAA;AAC/B,IAAA,IAAA,CAAK,eAAe,MAAA,GAAS,KAAA;AAC7B,IAAA,IAAA,CAAK,eAAe,eAAA,GAAkB,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,OAAO,QAAQ,OAAA,EAAwF;AACrG,IAAA,MAAM,MAAA,GAAuB;AAAA,MAC3B,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,EAAA;AAAA,MAC1C,YAAA,EAAc,OAAA,CAAQ,GAAA,CAAI,oBAAA,IAAwB,EAAA;AAAA,MAClD,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,EAAA;AAAA,MACzC,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,EAAA;AAAA,MACzC,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB;AAAA,KAC1C;AACA,IAAA,OAAO,IAAI,iBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,OAAO,UAAA,CACL,MAAA,EACA,OAAA,EACkB;AAClB,IAAA,OAAO,IAAI,iBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,OAAO,OAAA,CAAQ,WAAA,EAA4C,OAAA,EAAwF;AACjJ,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,EAAE,GAAG,WAAA,EAAa,OAAA,EAAS,wCAAA,EAAyC;AAAA,MACpE;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,UAAA,CAAW,WAAA,EAA4C,OAAA,EAAwF;AACpJ,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,EAAE,GAAG,WAAA,EAAa,OAAA,EAAS,+BAAA,EAAgC;AAAA,MAC3D;AAAA,KACF;AAAA,EACF;AACF;;;AC9cO,IAAK,YAAA,qBAAAC,aAAAA,KAAL;AAEL,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,YAAS,EAAA,CAAA,GAAT,QAAA;AAEA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,eAAY,EAAA,CAAA,GAAZ,WAAA;AAJU,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AAQL,IAAK,QAAA,qBAAAC,SAAAA,KAAL;AACL,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,cAAW,CAAA,CAAA,GAAX,UAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AAFU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA","file":"index.mjs","sourcesContent":["/**\n * Pathao Merchant API Service (Unofficial SDK)\n *\n * This is an unofficial SDK for the Pathao Merchant API.\n *\n * API Details (based on public documentation):\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - All endpoints use /aladdin/api/v1/ prefix\n * - Base URL can be set via PATHAO_BASE_URL environment variable or constructor config\n * - Timeout can be set via PATHAO_TIMEOUT environment variable or constructor config\n *\n * Features implemented:\n * - Token-based authentication with refresh token support\n * - Store management (create, list stores)\n * - Order creation (single and bulk)\n * - Order tracking and status\n * - Dynamic price calculation\n * - City, zone, and area management\n */\n\nimport axios, { AxiosError, AxiosInstance } from 'axios';\nimport {\n PathaoAreaResponse,\n PathaoAuthResponse,\n PathaoBulkOrderResponse,\n PathaoCityResponse,\n PathaoConfig,\n PathaoError,\n PathaoOrderRequest,\n PathaoOrderResponse,\n PathaoOrderStatusResponse,\n PathaoPriceRequest,\n PathaoPriceResponse,\n PathaoStore,\n PathaoStoreCreateResponse,\n PathaoStoreListResponse,\n PathaoStoreRequest,\n PathaoZoneResponse,\n} from './types';\n\nexport class PathaoApiError extends Error {\n status: number | undefined;\n code: number | undefined;\n type: string | undefined;\n errors: Record<string, string[]> | undefined;\n validation: Record<string, string[]> | undefined;\n responseData: unknown;\n\n constructor(\n message: string,\n options: {\n status?: number | undefined;\n code?: number | undefined;\n type?: string | undefined;\n errors?: Record<string, string[]> | undefined;\n validation?: Record<string, string[]> | undefined;\n responseData?: unknown;\n } = {},\n ) {\n super(message);\n this.name = 'PathaoApiError';\n this.status = options.status;\n this.code = options.code;\n this.type = options.type;\n this.errors = options.errors;\n this.validation = options.validation;\n this.responseData = options.responseData;\n }\n}\n\n// Internal resolved config with guaranteed timeout\ninterface ResolvedPathaoConfig extends PathaoConfig {\n timeout: number;\n}\n\n// Circuit breaker configuration\nexport interface CircuitBreakerConfig {\n threshold?: number; // Default: 5\n timeout?: number; // Default: 60000ms\n}\n\nexport class PathaoApiService {\n private pathaoClient: AxiosInstance;\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private tokenExpiry: number | null = null;\n private config: ResolvedPathaoConfig;\n private isAuthenticating: boolean = false;\n private authPromise: Promise<void> | null = null;\n private hasValidated: boolean = false;\n private debug: boolean = false;\n private circuitBreaker: {\n failures: number;\n lastFailureTime: number;\n threshold: number;\n timeout: number;\n isOpen: boolean;\n };\n\n constructor(config: PathaoConfig, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }) {\n const parsedTimeout = parseInt(process.env.PATHAO_TIMEOUT || '', 10);\n const envTimeout = Number.isNaN(parsedTimeout) || parsedTimeout <= 0 ? 30000 : parsedTimeout;\n const timeout: number = config.timeout ?? envTimeout;\n\n this.config = {\n baseURL: config.baseURL || process.env.PATHAO_BASE_URL || '',\n timeout,\n clientId: config.clientId || process.env.PATHAO_CLIENT_ID || '',\n clientSecret:\n config.clientSecret || process.env.PATHAO_CLIENT_SECRET || '',\n username: config.username || process.env.PATHAO_USERNAME || '',\n password: config.password || process.env.PATHAO_PASSWORD || '',\n };\n\n this.debug = options?.debug || false;\n this.circuitBreaker = {\n failures: 0,\n lastFailureTime: 0,\n threshold: options?.circuitBreaker?.threshold ?? 5,\n timeout: options?.circuitBreaker?.timeout ?? 60000,\n isOpen: false,\n };\n\n this.pathaoClient = axios.create({\n ...(this.config.baseURL ? { baseURL: this.config.baseURL } : {}),\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': `pathao-merchant-sdk node/${process.version}`,\n },\n });\n\n // Add request interceptor for authentication\n this.pathaoClient.interceptors.request.use(async (config) => {\n // Skip auth for token requests to prevent infinite loops\n if (config.url?.includes('/issue-token')) {\n return config;\n }\n\n // Validate configuration on first API call\n this.validateConfiguration();\n await this.ensureAuthenticated();\n if (this.accessToken) {\n config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n\n if (this.debug) {\n const safeHeaders = { ...config.headers } as Record<string, unknown>;\n if (safeHeaders['Authorization']) safeHeaders['Authorization'] = 'Bearer [REDACTED]';\n console.log(`[Pathao SDK] ${config.method?.toUpperCase()} ${config.url}`, {\n headers: safeHeaders,\n data: config.data,\n });\n }\n\n return config;\n });\n\n // Add response interceptor for error handling\n this.pathaoClient.interceptors.response.use(\n (response) => {\n // Reset circuit breaker on successful request\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n\n if (this.debug) {\n console.log(`[Pathao SDK] Response ${response.status}`, {\n url: response.config.url,\n data: response.data,\n });\n }\n\n return response;\n },\n async (error) => {\n if (error.response?.status === 401) {\n // Token expired, clear tokens and retry once\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n\n if (error.config && !error.config._retry) {\n error.config._retry = true;\n await this.ensureAuthenticated();\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n return this.pathaoClient.request(error.config);\n }\n }\n\n // Respect Retry-After on 429 (rate limit), retry once\n if (error.response?.status === 429 && error.config && !error.config._rateLimitRetry) {\n error.config._rateLimitRetry = true;\n const retryAfterHeader = error.response.headers['retry-after'] as string | undefined;\n const delayMs = retryAfterHeader ? parseInt(retryAfterHeader, 10) * 1000 : 1000;\n await this.delay(delayMs);\n return this.pathaoClient.request(error.config);\n }\n\n // Retry transient 5xx errors with exponential backoff (max 2 retries)\n const status: number | undefined = error.response?.status;\n if (status !== undefined && status >= 500 && error.config) {\n const retryCount: number = (error.config._retryCount as number | undefined) ?? 0;\n if (retryCount < 2) {\n error.config._retryCount = retryCount + 1;\n await this.delay(Math.min(500 * 2 ** retryCount, 4000));\n return this.pathaoClient.request(error.config);\n }\n }\n\n // Handle circuit breaker for network, 5xx, or specific auth/rate-limit failures\n const isUserError = status !== undefined && status >= 400 && status < 500 && status !== 401 && status !== 429;\n if (!isUserError) {\n this.handleCircuitBreaker();\n }\n return Promise.reject(error);\n },\n );\n }\n\n private validateConfiguration(): void {\n // Only validate once\n if (this.hasValidated) {\n return;\n }\n\n if (!this.config.baseURL) {\n throw this.toPathaoApiError(\n new Error(\n 'Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable',\n ),\n 'Configuration validation failed',\n );\n }\n\n if (!this.config.baseURL.startsWith('https://')) {\n throw this.toPathaoApiError(\n new Error('Pathao API baseURL must use HTTPS (https://)'),\n 'Configuration validation failed',\n );\n }\n\n if (\n !this.config.clientId ||\n !this.config.clientSecret ||\n !this.config.username ||\n !this.config.password\n ) {\n throw this.toPathaoApiError(\n new Error(\n 'Pathao API credentials are required: clientId, clientSecret, username, password. You can provide them via constructor config or environment variables (PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME, PATHAO_PASSWORD)',\n ),\n 'Configuration validation failed',\n );\n }\n\n this.hasValidated = true;\n }\n\n private async ensureAuthenticated(): Promise<void> {\n // Check circuit breaker\n if (this.circuitBreaker.isOpen) {\n if (\n Date.now() - this.circuitBreaker.lastFailureTime >\n this.circuitBreaker.timeout\n ) {\n this.circuitBreaker.isOpen = false;\n this.circuitBreaker.failures = 0;\n } else {\n throw new PathaoApiError(\n 'Circuit breaker is open. Too many authentication failures. Try again later.',\n { code: 503 },\n );\n }\n }\n\n if (this.accessToken && this.tokenExpiry && Date.now() < this.tokenExpiry) {\n return; // Token is still valid\n }\n\n // If already authenticating, wait for it to complete\n if (this.isAuthenticating && this.authPromise) {\n return this.authPromise;\n }\n\n // Start authentication process\n this.isAuthenticating = true;\n this.authPromise = this.performAuthentication();\n\n try {\n await this.authPromise;\n } finally {\n this.isAuthenticating = false;\n this.authPromise = null;\n }\n }\n\n private async performAuthentication(): Promise<void> {\n if (this.refreshToken) {\n try {\n await this.refreshAccessToken();\n return;\n } catch (error) {\n // Refresh failed, try fresh authentication\n this.refreshToken = null;\n }\n }\n\n await this.authenticate();\n }\n\n private async authenticate(): Promise<void> {\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>(\n '/aladdin/api/v1/issue-token',\n {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n username: this.config.username,\n password: this.config.password,\n grant_type: 'password',\n },\n );\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + response.data.expires_in * 1000 - 60000; // 1 minute buffer\n\n // Reset circuit breaker on successful auth\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n } catch (error) {\n this.handleCircuitBreaker();\n throw this.toPathaoApiError(error, 'Authentication failed');\n }\n }\n\n private async refreshAccessToken(): Promise<void> {\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>(\n '/aladdin/api/v1/issue-token',\n {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n refresh_token: this.refreshToken,\n grant_type: 'refresh_token',\n },\n );\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + response.data.expires_in * 1000 - 60000; // 1 minute buffer\n\n // Reset circuit breaker on successful refresh\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n } catch (error) {\n this.handleCircuitBreaker();\n throw this.toPathaoApiError(error, 'Token refresh failed');\n }\n }\n\n private getErrorMessage(error: unknown): string {\n if (error instanceof AxiosError) {\n const pathaoError = error.response?.data as PathaoError;\n if (pathaoError?.message) {\n return pathaoError.message;\n }\n return error.message;\n }\n if (error instanceof Error) return error.message;\n return 'Unknown error';\n }\n\n private toPathaoApiError(error: unknown, context: string): PathaoApiError {\n if (error instanceof PathaoApiError) {\n return error;\n }\n\n const messageFallback = this.getErrorMessage(error);\n const hasResponse = (e: unknown): e is { response?: AxiosError['response'] } =>\n typeof e === 'object' && e !== null && 'response' in e;\n const axiosLike =\n error instanceof AxiosError\n ? error\n : hasResponse(error)\n ? error\n : null;\n if (axiosLike) {\n const pathaoError = axiosLike.response?.data as PathaoError | undefined;\n return new PathaoApiError(\n `${context}: ${pathaoError?.message || messageFallback}`,\n {\n status: axiosLike.response?.status,\n code: pathaoError?.code ?? axiosLike.response?.status,\n type: pathaoError?.type,\n errors: pathaoError?.errors,\n validation: pathaoError?.validation,\n responseData: pathaoError ?? axiosLike.response?.data,\n },\n );\n }\n\n return new PathaoApiError(`${context}: ${messageFallback}`);\n }\n\n private handleCircuitBreaker(): void {\n this.circuitBreaker.failures++;\n this.circuitBreaker.lastFailureTime = Date.now();\n\n if (this.circuitBreaker.failures >= this.circuitBreaker.threshold) {\n this.circuitBreaker.isOpen = true;\n }\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n // Official Pathao API: Create Order\n async createOrder(\n orderData: PathaoOrderRequest,\n ): Promise<PathaoOrderResponse> {\n try {\n if (!PathaoApiService.validatePhoneNumber(orderData.recipient_phone)) {\n throw new PathaoApiError('Validation failed: Invalid recipient_phone format', { code: 400 });\n }\n if (!PathaoApiService.validateWeight(orderData.item_weight)) {\n throw new PathaoApiError('Validation failed: Invalid item_weight (must be 0.5 to 10)', { code: 400 });\n }\n\n const response = await this.pathaoClient.post<PathaoOrderResponse>(\n '/aladdin/api/v1/orders',\n orderData,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create Pathao order');\n }\n }\n\n // Official Pathao API: Create Store\n async createStore(\n storeData: PathaoStoreRequest,\n ): Promise<PathaoStoreCreateResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoStoreCreateResponse>(\n '/aladdin/api/v1/stores',\n storeData,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create Pathao store');\n }\n }\n\n // Official Pathao API: Get Store List\n async getStores(page?: number): Promise<PathaoStoreListResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoStoreListResponse>(\n '/aladdin/api/v1/stores',\n page !== undefined ? { params: { page } } : undefined,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao stores');\n }\n }\n\n // Official Pathao API: Get All Stores (Auto-paginating helper)\n async getStoresAll(): Promise<PathaoStore[]> {\n try {\n let currentPage = 1;\n let lastPage = 1;\n const allStores: PathaoStore[] = [];\n\n do {\n const response = await this.getStores(currentPage);\n if (response.data?.data) {\n allStores.push(...response.data.data);\n }\n lastPage = response.data?.last_page || 1;\n currentPage++;\n } while (currentPage <= lastPage);\n\n return allStores;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch all Pathao stores');\n }\n }\n\n // Official Pathao API: Calculate Price\n async calculatePrice(\n priceData: PathaoPriceRequest,\n ): Promise<PathaoPriceResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoPriceResponse>(\n '/aladdin/api/v1/merchant/price-plan',\n priceData,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to calculate Pathao price');\n }\n }\n\n // Official Pathao API: Get Cities\n async getCities(): Promise<PathaoCityResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoCityResponse>(\n '/aladdin/api/v1/city-list',\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao cities');\n }\n }\n\n // Official Pathao API: Get Zones for a City\n async getZones(cityId: number): Promise<PathaoZoneResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoZoneResponse>(\n `/aladdin/api/v1/cities/${cityId}/zone-list`,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao zones');\n }\n }\n\n // Official Pathao API: Get Areas for a Zone\n async getAreas(zoneId: number): Promise<PathaoAreaResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoAreaResponse>(\n `/aladdin/api/v1/zones/${zoneId}/area-list`,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao areas');\n }\n }\n\n // Official Pathao API: Get Order Status\n async getOrderStatus(\n consignmentId: string,\n ): Promise<PathaoOrderStatusResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoOrderStatusResponse>(\n `/aladdin/api/v1/orders/${encodeURIComponent(consignmentId)}/info`,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao order status');\n }\n }\n\n // Official Pathao API: Create Bulk Order\n async createBulkOrder(\n orders: PathaoOrderRequest[],\n ): Promise<PathaoBulkOrderResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoBulkOrderResponse>(\n '/aladdin/api/v1/orders/bulk', { orders });\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create bulk Pathao orders');\n }\n }\n\n // Helper method to validate phone number\n static validatePhoneNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11 && cleanPhone.startsWith('01');\n }\n\n // Helper method to format phone number\n static formatPhoneNumber(phone: string): string {\n const cleanPhone = phone.replace(/\\D/g, '');\n if (cleanPhone.length === 11 && cleanPhone.startsWith('01')) {\n return cleanPhone;\n }\n throw new Error(\n 'Invalid phone number format. Must be 11 digits starting with 01',\n );\n }\n\n // Helper method to validate address\n static validateAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 10 && trimmed.length <= 220;\n }\n\n // Helper method to validate weight\n static validateWeight(weight: number): boolean {\n return weight >= 0.5 && weight <= 10;\n }\n\n // Helper method to validate recipient name\n static validateRecipientName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 100;\n }\n\n // Helper method to validate store name\n static validateStoreName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 50;\n }\n\n // Helper method to validate contact name\n static validateContactName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 50;\n }\n\n // Helper method to validate contact number\n static validateContactNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11 && cleanPhone.startsWith('01');\n }\n\n // Helper method to validate store address\n static validateStoreAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 15 && trimmed.length <= 120;\n }\n\n // Method to clear authentication state (useful for testing)\n clearAuth(): void {\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n this.isAuthenticating = false;\n this.authPromise = null;\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n this.circuitBreaker.lastFailureTime = 0;\n }\n\n // Static factory method to create instance from environment variables\n static fromEnv(options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n const config: PathaoConfig = {\n clientId: process.env.PATHAO_CLIENT_ID || '',\n clientSecret: process.env.PATHAO_CLIENT_SECRET || '',\n username: process.env.PATHAO_USERNAME || '',\n password: process.env.PATHAO_PASSWORD || '',\n baseURL: process.env.PATHAO_BASE_URL || '',\n };\n return new PathaoApiService(config, options);\n }\n\n // Static factory method to create instance from configuration object\n static fromConfig(\n config: PathaoConfig,\n options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig },\n ): PathaoApiService {\n return new PathaoApiService(config, options);\n }\n\n // Named constructor for sandbox environment\n static sandbox(credentials: Omit<PathaoConfig, 'baseURL'>, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n return new PathaoApiService(\n { ...credentials, baseURL: 'https://courier-api-sandbox.pathao.com' },\n options,\n );\n }\n\n // Named constructor for production environment\n static production(credentials: Omit<PathaoConfig, 'baseURL'>, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n return new PathaoApiService(\n { ...credentials, baseURL: 'https://api-hermes.pathao.com' },\n options,\n );\n }\n}\n\n","/**\n * Pathao Courier API Types\n * \n * Official API Details:\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - All endpoints use /aladdin/api/v1/ prefix\n * - Base URL can be set via PATHAO_BASE_URL environment variable or constructor config\n * - Timeout can be set via PATHAO_TIMEOUT environment variable or constructor config\n */\n\n// Official Pathao API Authentication Response\nexport interface PathaoAuthResponse {\n token_type: string;\n expires_in: number;\n access_token: string;\n refresh_token: string;\n}\n\n// Official Pathao Order Creation Request\nexport interface PathaoOrderRequest {\n store_id: number;\n merchant_order_id?: string; // Optional - Your order tracking ID\n recipient_name: string; // Required - 3-100 characters\n recipient_phone: string; // Required - 11 characters\n recipient_secondary_phone?: string; // Optional - 11 characters\n recipient_address: string; // Required - 10-220 characters\n recipient_city?: number; // Optional - Auto-detected if not provided\n recipient_zone?: number; // Optional - Auto-detected if not provided\n recipient_area?: number; // Optional - Auto-detected if not provided\n delivery_type: number; // Required - 48 (Normal), 12 (On Demand)\n item_type: number; // Required - 1 (Document), 2 (Parcel)\n special_instruction?: string; // Optional\n item_quantity: number; // Required\n item_weight: number; // Required - 0.5-10 kg\n item_description?: string; // Optional\n amount_to_collect: number; // Required - COD amount (0 for non-COD)\n}\n\n// Official Pathao Store Creation Request\nexport interface PathaoStoreRequest {\n name: string; // 3-50 characters\n contact_name: string; // 3-50 characters\n contact_number: string; // 11 characters\n secondary_contact?: string; // Optional - 11 characters\n otp_number?: string; // Optional - OTP for orders\n address: string; // 15-120 characters\n city_id: number;\n zone_id: number;\n area_id: number;\n}\n\n// Official Pathao Order Response\nexport interface PathaoOrderResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n merchant_order_id: string;\n order_status: string;\n delivery_fee: number;\n };\n}\n\n// Official Pathao Store Creation Response\nexport interface PathaoStoreCreateResponse {\n type: string;\n code: number;\n message: string;\n data: {\n store_name: string; // Only store_name returned on creation\n };\n}\n\n// Official Pathao Store List Item (from GET /stores)\nexport interface PathaoStore {\n store_id: number;\n store_name: string;\n store_address: string;\n is_active: 0 | 1; // 1 for active, 0 for deactivated\n city_id: number;\n zone_id: number;\n hub_id: number;\n is_default_store: boolean;\n is_default_return_store: boolean;\n}\n\n// Official Pathao Store List Response\nexport interface PathaoStoreListResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: PathaoStore[];\n total: number;\n current_page: number;\n per_page: number;\n total_in_page: number;\n last_page: number;\n path: string;\n to: number;\n from: number;\n last_page_url: string;\n first_page_url: string;\n };\n}\n\n// Official Pathao Price Calculation Request\nexport interface PathaoPriceRequest {\n store_id: number;\n item_type: number;\n item_weight: number;\n delivery_type: number;\n recipient_city: number;\n recipient_zone: number;\n}\n\n// Official Pathao Price Response\nexport interface PathaoPriceResponse {\n type: string;\n code: number;\n message: string;\n data: {\n price: number; // Calculated price for given item\n discount: number; // Discount for the given item\n promo_discount: number; // Promo discount for the given item\n plan_id: number; // Price plan id for the given item\n cod_enabled: 0 | 1; // 1 if COD enabled, 0 if not\n cod_percentage: number; // Cash on delivery percentage\n additional_charge: number; // If there is any additional charge\n final_price: number; // Your final price for the given item\n };\n}\n\n// Official Pathao City Response\nexport interface PathaoCityResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n city_id: number;\n city_name: string;\n }>;\n };\n}\n\n// Official Pathao Order Status Response\nexport interface PathaoOrderStatusResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n merchant_order_id: string;\n order_status: string;\n order_status_slug: string;\n updated_at: string;\n invoice_id: string | null;\n };\n}\n\n// Official Pathao Zone Response\nexport interface PathaoZoneResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n zone_id: number;\n zone_name: string;\n }>;\n };\n}\n\n// Official Pathao Area Response\nexport interface PathaoAreaResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n area_id: number;\n area_name: string;\n home_delivery_available: boolean;\n pickup_available: boolean;\n }>;\n };\n}\n\n// Configuration options for PathaoApiService\nexport interface PathaoConfig {\n clientId: string;\n clientSecret: string;\n username: string;\n password: string;\n baseURL?: string;\n timeout?: number; // Optional - defaults to 30000 if not provided\n}\n\n// Error response from Pathao API\nexport interface PathaoError {\n type: string;\n code: number;\n message: string;\n errors?: Record<string, string[]>;\n validation?: Record<string, string[]>;\n}\n\n/**\n * Delivery type codes defined by the Pathao API.\n * Values correspond to Pathao's internal delivery_type IDs.\n * @see https://developers.pathao.com - Order Creation endpoint\n */\nexport enum DeliveryType {\n /** Standard delivery (API value: 48) */\n NORMAL = 48,\n /** Same-day on-demand delivery (API value: 12) */\n ON_DEMAND = 12\n}\n\n// Item types enum\nexport enum ItemType {\n DOCUMENT = 1,\n PARCEL = 2\n}\n\n// Official Pathao Bulk Order Response\nexport interface PathaoBulkOrderResponse {\n message: string;\n type: string;\n code: number;\n data: boolean;\n}\n\n"]}
@@ -5,35 +5,15 @@ import { EventEmitter } from 'events';
5
5
  *
6
6
  * Handles incoming webhook events from Pathao.
7
7
  *
8
- * IMPORTANT: The official Pathao API documentation does not describe a webhook
9
- * specification. This implementation is based on observed webhook behaviour and
10
- * community research. Treat it as best-effort until Pathao publishes official
11
- * webhook docs.
12
- *
13
- * Signature mechanism: Pathao sends the raw shared secret in the
14
- * `X-PATHAO-Signature` header. There is no HMAC — the header value IS the
15
- * secret. A constant-time comparison is used to prevent timing attacks.
16
- *
17
- * @example — framework-agnostic
18
- * ```typescript
19
- * import {
20
- * PathaoWebhookHandler,
21
- * PathaoWebhookEvent,
22
- * } from 'pathao-merchant-sdk/webhooks';
23
- *
24
- * const handler = new PathaoWebhookHandler(process.env.PATHAO_WEBHOOK_SECRET!);
25
- *
26
- * handler.on(PathaoWebhookEvent.ORDER_DELIVERED, (payload) => {
27
- * console.log(payload.consignment_id, payload.collected_amount);
28
- * });
29
- *
30
- * // In your HTTP server — raw body as Buffer/string required:
31
- * const event = handler.process(rawBody, req.headers);
32
- * res.status(200).json({ received: true });
33
- * ```
8
+ * IMPORTANT INTEGRATION DETAILS:
9
+ * - Pathao does NOT sign incoming requests.
10
+ * - Instead, Pathao requires you to prove ownership by echoing your webhook secret
11
+ * in the \`X-Pathao-Merchant-Webhook-Integration-Secret\` header of EVERY response.
12
+ * - This SDK automatically handles the \`webhook_integration\` handshake event, which
13
+ * expects a 202 status code and the secret header.
34
14
  *
35
15
  * @example — Express
36
- * ```typescript
16
+ * \`\`\`typescript
37
17
  * import express from 'express';
38
18
  * import {
39
19
  * PathaoWebhookHandler,
@@ -45,13 +25,18 @@ import { EventEmitter } from 'events';
45
25
  *
46
26
  * handler.on(PathaoWebhookEvent.ORDER_DELIVERED, (payload) => { ... });
47
27
  *
48
- * // Mount express.raw() BEFORE the webhook middleware
28
+ * // Mount express.json() BEFORE the webhook middleware
49
29
  * app.post(
50
30
  * '/webhooks/pathao',
51
- * express.raw({ type: 'application/json' }),
31
+ * express.json(),
52
32
  * handler.expressMiddleware(),
33
+ * (req, res) => {
34
+ * // The middleware already sets the required secret header.
35
+ * // You just need to return a 200 OK for standard events.
36
+ * res.status(200).send('OK');
37
+ * }
53
38
  * );
54
- * ```
39
+ * \`\`\`
55
40
  */
56
41
 
57
42
  declare class PathaoWebhookError extends Error {
@@ -59,9 +44,10 @@ declare class PathaoWebhookError extends Error {
59
44
  }
60
45
  /**
61
46
  * All webhook event types emitted by Pathao.
62
- * Values are the exact strings that appear in the `event` field of each payload.
47
+ * Values are the exact strings that appear in the \`event\` field of each payload.
63
48
  */
64
49
  declare enum PathaoWebhookEvent {
50
+ WEBHOOK_INTEGRATION = "webhook_integration",
65
51
  ORDER_CREATED = "order.created",
66
52
  ORDER_UPDATED = "order.updated",
67
53
  ORDER_PICKUP_REQUESTED = "order.pickup-requested",
@@ -84,13 +70,15 @@ declare enum PathaoWebhookEvent {
84
70
  STORE_CREATED = "store.created",
85
71
  STORE_UPDATED = "store.updated"
86
72
  }
87
- /** Fields present on every webhook payload */
73
+ interface WebhookIntegrationPayload {
74
+ event: PathaoWebhookEvent.WEBHOOK_INTEGRATION;
75
+ }
76
+ /** Fields present on every normal webhook payload */
88
77
  interface BaseWebhookPayload {
89
- /** Dot-notation event type — matches a `PathaoWebhookEvent` value */
90
78
  event: string;
91
- /** ISO timestamp of when the state change occurred */
79
+ /** Format: MySQL datetime YYYY-MM-DD HH:MM:SS (no timezone indicator) */
92
80
  updated_at: string;
93
- /** ISO timestamp of when this webhook was dispatched */
81
+ /** Format: ISO 8601 timestamp */
94
82
  timestamp: string;
95
83
  }
96
84
  /** Fields shared by all order-related events */
@@ -185,9 +173,10 @@ interface StoreUpdatedPayload extends StoreWebhookPayload {
185
173
  event: PathaoWebhookEvent.STORE_UPDATED;
186
174
  }
187
175
  /** Union of all possible webhook payloads */
188
- type PathaoWebhookPayload = OrderCreatedPayload | OrderUpdatedPayload | OrderPickupRequestedPayload | OrderAssignedForPickupPayload | OrderPickedPayload | OrderPickupFailedPayload | OrderPickupCancelledPayload | OrderAtSortingHubPayload | OrderInTransitPayload | OrderAtLastMileHubPayload | OrderAssignedForDeliveryPayload | OrderDeliveredPayload | OrderPartialDeliveryPayload | OrderReturnedPayload | OrderDeliveryFailedPayload | OrderOnHoldPayload | OrderPaidPayload | OrderPaidReturnPayload | OrderExchangedPayload | StoreCreatedPayload | StoreUpdatedPayload;
189
- /** Maps each `PathaoWebhookEvent` to its specific payload type */
176
+ type PathaoWebhookPayload = WebhookIntegrationPayload | OrderCreatedPayload | OrderUpdatedPayload | OrderPickupRequestedPayload | OrderAssignedForPickupPayload | OrderPickedPayload | OrderPickupFailedPayload | OrderPickupCancelledPayload | OrderAtSortingHubPayload | OrderInTransitPayload | OrderAtLastMileHubPayload | OrderAssignedForDeliveryPayload | OrderDeliveredPayload | OrderPartialDeliveryPayload | OrderReturnedPayload | OrderDeliveryFailedPayload | OrderOnHoldPayload | OrderPaidPayload | OrderPaidReturnPayload | OrderExchangedPayload | StoreCreatedPayload | StoreUpdatedPayload;
177
+ /** Maps each \`PathaoWebhookEvent\` to its specific payload type */
190
178
  interface WebhookEventPayloadMap {
179
+ [PathaoWebhookEvent.WEBHOOK_INTEGRATION]: WebhookIntegrationPayload;
191
180
  [PathaoWebhookEvent.ORDER_CREATED]: OrderCreatedPayload;
192
181
  [PathaoWebhookEvent.ORDER_UPDATED]: OrderUpdatedPayload;
193
182
  [PathaoWebhookEvent.ORDER_PICKUP_REQUESTED]: OrderPickupRequestedPayload;
@@ -210,108 +199,114 @@ interface WebhookEventPayloadMap {
210
199
  [PathaoWebhookEvent.STORE_CREATED]: StoreCreatedPayload;
211
200
  [PathaoWebhookEvent.STORE_UPDATED]: StoreUpdatedPayload;
212
201
  }
213
- /** Signature header name sent by Pathao on every webhook request */
214
- declare const PATHAO_SIGNATURE_HEADER = "x-pathao-signature";
215
- /**
216
- * Verify the `X-PATHAO-Signature` header against the configured webhook secret.
217
- *
218
- * Uses a constant-time comparison to prevent timing attacks. The header value
219
- * is the raw shared secret — Pathao does not hash the signature.
220
- *
221
- * @returns `true` if valid, `false` if missing or mismatched.
222
- */
223
- declare function verifySignature(signature: string | undefined, webhookSecret: string): boolean;
202
+ /** Required response header used to authorize your endpoint with Pathao */
203
+ declare const PATHAO_SECRET_HEADER = "x-pathao-merchant-webhook-integration-secret";
224
204
  /**
225
- * Verify the webhook signature and parse the raw body in one step.
205
+ * Parses the raw body into a webhook payload.
206
+ * Pathao does not sign inbound requests, so this just ensures it is valid JSON with an event field.
226
207
  *
227
- * Throws `PathaoWebhookError` on signature failure or malformed JSON.
208
+ * Throws \`PathaoWebhookError\` on malformed JSON or missing event.
228
209
  *
229
- * @param rawBody Raw request body — do NOT pre-parse with `JSON.parse`
230
- * @param headers Request headers object
231
- * @param webhookSecret Your Pathao webhook integration secret
210
+ * @param rawBody Raw request body or parsed object
232
211
  */
233
- declare function constructEvent(rawBody: Buffer | string, headers: Record<string, string | string[] | undefined>, webhookSecret: string): PathaoWebhookPayload;
234
- type GenericHeaders = Record<string, string | string[] | undefined>;
212
+ declare function constructEvent(rawBody: Buffer | string | object): PathaoWebhookPayload;
213
+ type WebhookResponseInstructions = {
214
+ statusCode: number;
215
+ headers: Record<string, string>;
216
+ payload: PathaoWebhookPayload | null;
217
+ error: PathaoWebhookError | null;
218
+ };
235
219
  /**
236
- * Stateful webhook handler that verifies incoming requests, parses payloads,
220
+ * Stateful webhook handler that parses payloads, provides response instructions,
237
221
  * and dispatches events to typed listeners.
238
222
  *
239
223
  * @example
240
- * ```typescript
224
+ * \`\`\`typescript
241
225
  * const handler = new PathaoWebhookHandler(process.env.PATHAO_WEBHOOK_SECRET!);
242
226
  *
243
227
  * handler.on(PathaoWebhookEvent.ORDER_DELIVERED, (payload) => {
244
228
  * // payload is fully typed as OrderDeliveredPayload
245
229
  * console.log(payload.consignment_id, payload.collected_amount);
246
230
  * });
247
- * ```
231
+ * \`\`\`
248
232
  */
249
233
  declare class PathaoWebhookHandler extends EventEmitter {
250
234
  private readonly webhookSecret;
251
235
  constructor(webhookSecret: string);
252
236
  /** Listen for a specific Pathao event with a fully-typed payload callback. */
253
237
  on<E extends PathaoWebhookEvent>(event: E, listener: (payload: WebhookEventPayloadMap[E]) => void): this;
254
- /** Fires for every successfully verified event regardless of type. */
238
+ /** Fires for every successfully parsed event regardless of type. */
255
239
  on(event: 'webhook', listener: (payload: PathaoWebhookPayload) => void): this;
256
- /** Fires when verification or parsing fails. */
240
+ /** Fires when parsing fails. */
257
241
  on(event: 'error', listener: (error: PathaoWebhookError) => void): this;
242
+ /** Listen once for a specific Pathao event. */
243
+ once<E extends PathaoWebhookEvent>(event: E, listener: (payload: WebhookEventPayloadMap[E]) => void): this;
244
+ once(event: 'webhook', listener: (payload: PathaoWebhookPayload) => void): this;
245
+ once(event: 'error', listener: (error: PathaoWebhookError) => void): this;
258
246
  /**
259
- * Verify the signature, parse the body, and dispatch the event.
247
+ * Parse the body and dispatch the event.
260
248
  *
261
- * Throws `PathaoWebhookError` on failure and also emits `'error'` so
249
+ * Throws \`PathaoWebhookError\` on failure and also emits \`'error'\` so
262
250
  * listeners can respond without a try/catch.
263
251
  *
264
- * @param rawBody Raw request body — must NOT be pre-parsed
265
- * @param headers HTTP request headers
252
+ * @param rawBody Raw request body or matched json object
266
253
  */
267
- process(rawBody: Buffer | string, headers: GenericHeaders): PathaoWebhookPayload;
254
+ process(rawBody: Buffer | string | object): PathaoWebhookPayload;
268
255
  /**
269
256
  * Returns an Express-compatible middleware function.
270
257
  *
271
- * **Requires** `express.raw({ type: 'application/json' })` mounted on the
272
- * same route before this middleware so the raw body Buffer is preserved.
258
+ * Automatically sets the required \`X-Pathao-Merchant-Webhook-Integration-Secret\` header.
259
+ * Automatically responds with 202 for the \`webhook_integration\` handshake.
260
+ * For standard events, attaches the payload to \`req.pathaoWebhook\` and calls \`next()\`.
261
+ * On error, calls \`next(err)\`.
273
262
  *
274
- * On success the parsed payload is attached to `req.pathaoWebhook`.
275
- * On failure a `400` response is returned.
276
- *
277
- * ```typescript
263
+ * \`\`\`typescript
278
264
  * app.post(
279
265
  * '/webhooks/pathao',
280
- * express.raw({ type: 'application/json' }),
266
+ * express.json(),
281
267
  * handler.expressMiddleware(),
268
+ * (req, res) => res.sendStatus(200) // You must send 200 for other events
282
269
  * );
283
- * ```
270
+ * \`\`\`
284
271
  */
285
272
  expressMiddleware(): (req: {
286
- body: Buffer | string;
287
- headers: GenericHeaders;
273
+ body: Buffer | string | object;
288
274
  pathaoWebhook?: PathaoWebhookPayload;
289
275
  }, res: {
276
+ setHeader: (name: string, value: string) => void;
290
277
  status: (code: number) => {
291
- json: (body: unknown) => void;
278
+ send: () => void;
292
279
  };
293
280
  }, next: (err?: unknown) => void) => void;
294
281
  /**
295
- * Returns a generic async handler for any framework (Fastify, Hono, plain
296
- * `http.createServer`, etc.).
282
+ * Returns response instructions for any framework (Fastify, Hono, etc.).
297
283
  *
298
- * Never rejects — always resolves with either `{ payload, error: null }` or
299
- * `{ payload: null, error: PathaoWebhookError }`.
284
+ * Never throws — always resolves with a \`WebhookResponseInstructions\` object
285
+ * that tells you which status code and headers to return, along with the payload/error.
300
286
  *
301
- * ```typescript
287
+ * \`\`\`typescript
302
288
  * const handle = handler.middleware();
303
- * const { payload, error } = await handle(rawBody, request.headers);
304
- * if (error) { reply.status(400).send({ error: error.message }); return; }
305
- * reply.send({ received: true });
306
- * ```
289
+ * const instructions = await handle(request.body);
290
+ *
291
+ * // Apply the required headers (the secret header)
292
+ * for (const [key, value] of Object.entries(instructions.headers)) {
293
+ * reply.header(key, value);
294
+ * }
295
+ *
296
+ * if (instructions.error) {
297
+ * return reply.status(instructions.statusCode).send({ error: instructions.error.message });
298
+ * }
299
+ *
300
+ * // If it was the handshake, we should just return 202 as instructed
301
+ * if (instructions.payload?.event === 'webhook_integration') {
302
+ * return reply.status(instructions.statusCode).send();
303
+ * }
304
+ *
305
+ * // Process your real webhook
306
+ * return reply.status(instructions.statusCode).send({ received: true });
307
+ * \`\`\`
307
308
  */
308
- middleware(): (rawBody: Buffer | string, headers: GenericHeaders) => Promise<{
309
- payload: PathaoWebhookPayload;
310
- error: null;
311
- } | {
312
- payload: null;
313
- error: PathaoWebhookError;
314
- }>;
309
+ middleware(): (rawBody: Buffer | string | object) => Promise<WebhookResponseInstructions>;
315
310
  }
316
311
 
317
- export { type BaseWebhookPayload, type OrderAssignedForDeliveryPayload, type OrderAssignedForPickupPayload, type OrderAtLastMileHubPayload, type OrderAtSortingHubPayload, type OrderCreatedPayload, type OrderDeliveredPayload, type OrderDeliveryFailedPayload, type OrderExchangedPayload, type OrderInTransitPayload, type OrderOnHoldPayload, type OrderPaidPayload, type OrderPaidReturnPayload, type OrderPartialDeliveryPayload, type OrderPickedPayload, type OrderPickupCancelledPayload, type OrderPickupFailedPayload, type OrderPickupRequestedPayload, type OrderReturnedPayload, type OrderUpdatedPayload, type OrderWebhookPayload, PATHAO_SIGNATURE_HEADER, PathaoWebhookError, PathaoWebhookEvent, PathaoWebhookHandler, type PathaoWebhookPayload, type StoreCreatedPayload, type StoreUpdatedPayload, type StoreWebhookPayload, type WebhookEventPayloadMap, constructEvent, verifySignature };
312
+ export { type BaseWebhookPayload, type OrderAssignedForDeliveryPayload, type OrderAssignedForPickupPayload, type OrderAtLastMileHubPayload, type OrderAtSortingHubPayload, type OrderCreatedPayload, type OrderDeliveredPayload, type OrderDeliveryFailedPayload, type OrderExchangedPayload, type OrderInTransitPayload, type OrderOnHoldPayload, type OrderPaidPayload, type OrderPaidReturnPayload, type OrderPartialDeliveryPayload, type OrderPickedPayload, type OrderPickupCancelledPayload, type OrderPickupFailedPayload, type OrderPickupRequestedPayload, type OrderReturnedPayload, type OrderUpdatedPayload, type OrderWebhookPayload, PATHAO_SECRET_HEADER, PathaoWebhookError, PathaoWebhookEvent, PathaoWebhookHandler, type PathaoWebhookPayload, type StoreCreatedPayload, type StoreUpdatedPayload, type StoreWebhookPayload, type WebhookEventPayloadMap, type WebhookIntegrationPayload, type WebhookResponseInstructions, constructEvent };