pathao-merchant-sdk 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +1 -1
- package/dist/index.d.mts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.0.1](https://github.com/Sifat07/pathao-merchant-sdk/compare/pathao-merchant-sdk-v3.0.0...pathao-merchant-sdk-v3.0.1) (2026-10-02)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* classify HTTP 402 as kind 'forbidden' ([be59179](https://github.com/Sifat07/pathao-merchant-sdk/commit/be59179fb669d74e6bef863f6f44390b9b7fb265))
|
|
14
|
+
* export ./package.json ([daddca4](https://github.com/Sifat07/pathao-merchant-sdk/commit/daddca47359c6fee6284a74a595e45e4968d4054))
|
|
15
|
+
|
|
8
16
|
## [3.0.0](https://github.com/Sifat07/pathao-merchant-sdk/compare/pathao-merchant-sdk-v2.3.2...pathao-merchant-sdk-v3.0.0) (2026-10-02)
|
|
9
17
|
|
|
10
18
|
|
package/README.md
CHANGED
|
@@ -387,7 +387,7 @@ Branch on `err.kind` instead of matching message text. `err.retryable` is `true`
|
|
|
387
387
|
| `validation` | Rejected by the SDK before sending, or HTTP 400/422 |
|
|
388
388
|
| `config` | Missing/invalid `baseURL` or credentials |
|
|
389
389
|
| `auth` | HTTP 401 |
|
|
390
|
-
| `forbidden` | HTTP 403
|
|
390
|
+
| `forbidden` | HTTP 403, or 402 (unpaid dues block new orders) |
|
|
391
391
|
| `not_found` | HTTP 404 |
|
|
392
392
|
| `rate_limited` | HTTP 429 |
|
|
393
393
|
| `unavailable` | 5xx, timeout, network failure, circuit breaker open |
|
package/dist/index.d.mts
CHANGED
|
@@ -226,7 +226,10 @@ type PathaoErrorKind =
|
|
|
226
226
|
| 'config'
|
|
227
227
|
/** Rejected credentials or token (HTTP 401). */
|
|
228
228
|
| 'auth'
|
|
229
|
-
/**
|
|
229
|
+
/**
|
|
230
|
+
* The account may not do this right now: HTTP 403, or 402 when Pathao
|
|
231
|
+
* refuses new orders until the merchant pays outstanding dues.
|
|
232
|
+
*/
|
|
230
233
|
| 'forbidden'
|
|
231
234
|
/** Unknown consignment, store or resource (HTTP 404). */
|
|
232
235
|
| 'not_found'
|
package/dist/index.d.ts
CHANGED
|
@@ -226,7 +226,10 @@ type PathaoErrorKind =
|
|
|
226
226
|
| 'config'
|
|
227
227
|
/** Rejected credentials or token (HTTP 401). */
|
|
228
228
|
| 'auth'
|
|
229
|
-
/**
|
|
229
|
+
/**
|
|
230
|
+
* The account may not do this right now: HTTP 403, or 402 when Pathao
|
|
231
|
+
* refuses new orders until the merchant pays outstanding dues.
|
|
232
|
+
*/
|
|
230
233
|
| 'forbidden'
|
|
231
234
|
/** Unknown consignment, store or resource (HTTP 404). */
|
|
232
235
|
| 'not_found'
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ function isSafeToRetry(config) {
|
|
|
14
14
|
function kindForStatus(status) {
|
|
15
15
|
if (status === 400 || status === 422) return "validation";
|
|
16
16
|
if (status === 401) return "auth";
|
|
17
|
-
if (status === 403) return "forbidden";
|
|
17
|
+
if (status === 402 || status === 403) return "forbidden";
|
|
18
18
|
if (status === 404) return "not_found";
|
|
19
19
|
if (status === 429) return "rate_limited";
|
|
20
20
|
if (status !== void 0 && status >= 500) return "unavailable";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pathao-api.ts","../src/status.ts","../src/types.ts"],"names":["axios","config","AxiosError","DeliveryType","ItemType"],"mappings":"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","file":"index.js","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 * - The constructor reads only the config it is given. Use fromEnv() to read\n * PATHAO_* environment variables (including PATHAO_TIMEOUT).\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\n// GETs, token grants and the read-only price-plan POST can be repeated\n// without side effects. Order and store creation cannot.\nfunction isSafeToRetry(config: { method?: string | undefined; url?: string | undefined }): boolean {\n const url = config.url ?? '';\n return (\n config.method?.toLowerCase() === 'get' ||\n url.includes('/issue-token') ||\n url.includes('/merchant/price-plan')\n );\n}\n\nexport type PathaoErrorKind =\n /** Input rejected, by this SDK before sending or by Pathao (HTTP 400/422). */\n | 'validation'\n /** Missing or wrong baseURL / credentials, caught before any request. */\n | 'config'\n /** Rejected credentials or token (HTTP 401). */\n | 'auth'\n /** HTTP 403. */\n | 'forbidden'\n /** Unknown consignment, store or resource (HTTP 404). */\n | 'not_found'\n /** HTTP 429. Back off; see PATHAO_RATE_LIMIT_PER_MINUTE. */\n | 'rate_limited'\n /** 5xx, timeout, network failure or open circuit breaker. */\n | 'unavailable'\n /** A response this SDK doesn't understand. Inspect `responseData`. */\n | 'unexpected';\n\nfunction kindForStatus(status: number | undefined): PathaoErrorKind {\n if (status === 400 || status === 422) return 'validation';\n if (status === 401) return 'auth';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 429) return 'rate_limited';\n if (status !== undefined && status >= 500) return 'unavailable';\n return 'unexpected';\n}\n\nexport class PathaoApiError extends Error {\n kind: PathaoErrorKind;\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 kind?: PathaoErrorKind | undefined;\n } = {},\n ) {\n super(message);\n this.name = 'PathaoApiError';\n this.kind = options.kind ?? kindForStatus(options.status ?? options.code);\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 * True for transient failures (`unavailable`, `rate_limited`). For\n * createOrder / createBulkOrder a 5xx may hide a booking that went through:\n * look the order up before retrying a create.\n */\n get retryable(): boolean {\n return this.kind === 'unavailable' || this.kind === 'rate_limited';\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 interface PathaoClientOptions {\n /** Log requests and responses (tokens and Authorization redacted). */\n debug?: boolean;\n circuitBreaker?: CircuitBreakerConfig;\n /**\n * Minimum gap between requests from this instance, in ms. Requests queue\n * instead of tripping Pathao's 60/min limit (PATHAO_RATE_LIMIT_PER_MINUTE).\n * 1500 keeps one instance near 40/min, leaving headroom for other callers\n * sharing the credentials. Default 0 (no spacing).\n */\n minRequestIntervalMs?: number;\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 minRequestIntervalMs: number;\n private nextRequestAt = 0;\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?: PathaoClientOptions) {\n // Explicit config is read as given, never topped up from process.env: in\n // a multi-tenant app a blank field would otherwise pick up the platform's\n // own Pathao account. Env-based setup is fromEnv().\n this.config = {\n baseURL: config.baseURL ?? '',\n timeout: config.timeout ?? 30000,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n username: config.username,\n password: config.password,\n };\n\n this.debug = options?.debug || false;\n this.minRequestIntervalMs = Math.max(0, options?.minRequestIntervalMs ?? 0);\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 // Pathao has no reason to redirect, and a 307/308 would re-send the\n // issue-token body (client secret, password) to wherever it points.\n // With 0, any 3xx rejects like an error status.\n maxRedirects: 0,\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 // Every request counts against Pathao's limit, token grants and\n // retries included, so space them all.\n await this.waitForRequestSlot();\n\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 // Token grants carry access_token / refresh_token; never log them.\n const isTokenResponse = response.config.url?.includes('/issue-token');\n console.log(`[Pathao SDK] Response ${response.status}`, {\n url: response.config.url,\n data: isTokenResponse ? '[REDACTED]' : 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 // Pathao's gateway allows 60 requests per rolling minute and its 429\n // carries no Retry-After, so a blind short retry always fails. Retry\n // once only when the server says how long to wait; otherwise hand the\n // 429 to the caller.\n const retryAfterSeconds = parseInt(\n (error.response?.headers?.['retry-after'] as string | undefined) ?? '',\n 10,\n );\n if (\n error.response?.status === 429 &&\n error.config &&\n !error.config._rateLimitRetry &&\n retryAfterSeconds > 0\n ) {\n error.config._rateLimitRetry = true;\n await this.delay(retryAfterSeconds * 1000);\n return this.pathaoClient.request(error.config);\n }\n\n // Retry transient 5xx errors with exponential backoff (max 2 retries),\n // but only for requests that are safe to repeat. A 5xx on a create\n // (a gateway 502/504 in front of a slow success) may already have\n // booked the consignment; re-POSTing can book it again.\n const status: number | undefined = error.response?.status;\n if (status !== undefined && status >= 500 && error.config && isSafeToRetry(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 // Trip the circuit breaker on outages (network, 5xx) and auth failures.\n // A 429 is not an outage: counting it locked out every call for the\n // breaker timeout and re-tripped each time the rate window reset.\n const tripsBreaker = status === undefined || status >= 500 || status === 401;\n if (tripsBreaker) {\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 new PathaoApiError(\n 'Configuration validation failed: Pathao API baseURL is required. Pass it in the config, or use PathaoApiService.fromEnv() with PATHAO_BASE_URL set',\n { kind: 'config' },\n );\n }\n\n if (!this.config.baseURL.startsWith('https://')) {\n throw new PathaoApiError(\n 'Configuration validation failed: Pathao API baseURL must use HTTPS (https://)',\n { kind: 'config' },\n );\n }\n\n if (\n !this.config.clientId ||\n !this.config.clientSecret ||\n !this.config.username ||\n !this.config.password\n ) {\n throw new PathaoApiError(\n 'Configuration validation failed: Pathao API credentials are required: clientId, clientSecret, username, password. Pass them in the config, or use PathaoApiService.fromEnv() with PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME and PATHAO_PASSWORD set',\n { kind: 'config' },\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 after repeated network, server or authentication failures. Try again later.',\n { code: 503, kind: 'unavailable' },\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 // No response at all: timeout or network failure.\n ...(axiosLike.response ? {} : { kind: 'unavailable' as const }),\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 // Reserves the next free slot synchronously, then waits for it, so\n // concurrent callers queue in call order.\n private async waitForRequestSlot(): Promise<void> {\n if (this.minRequestIntervalMs <= 0) return;\n const now = Date.now();\n const at = Math.max(now, this.nextRequestAt);\n this.nextRequestAt = at + this.minRequestIntervalMs;\n if (at > now) await this.delay(at - now);\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 PathaoApiService.prepareOrder(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 prepared = orders.map((order, i) => PathaoApiService.prepareOrder(order, `orders[${i}]: `));\n const response = await this.pathaoClient.post<PathaoBulkOrderResponse>(\n '/aladdin/api/v1/orders/bulk', { orders: prepared });\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create bulk Pathao orders');\n }\n }\n\n // Validates an order and returns it with phones normalised to 01XXXXXXXXX,\n // so local checks catch what Pathao would reject with a 422 and what is\n // sent is what was validated.\n private static prepareOrder(order: PathaoOrderRequest, prefix = ''): PathaoOrderRequest {\n const fail = (message: string): never => {\n throw new PathaoApiError(`Validation failed: ${prefix}${message}`, { code: 400 });\n };\n const phone = PathaoApiService.normalizePhoneNumber(order.recipient_phone ?? '');\n if (!phone) fail('Invalid recipient_phone format');\n let secondary: string | null = null;\n if (order.recipient_secondary_phone) {\n secondary = PathaoApiService.normalizePhoneNumber(order.recipient_secondary_phone);\n if (!secondary) fail('Invalid recipient_secondary_phone format');\n }\n if (!PathaoApiService.validateRecipientName(order.recipient_name ?? '')) {\n fail('Invalid recipient_name (must be 3 to 100 characters)');\n }\n if (!PathaoApiService.validateAddress(order.recipient_address ?? '')) {\n fail('Invalid recipient_address (must be 10 to 220 characters)');\n }\n if (!PathaoApiService.validateWeight(order.item_weight)) {\n fail('Invalid item_weight (must be 0.5 to 10)');\n }\n return {\n ...order,\n recipient_phone: phone as string,\n ...(secondary ? { recipient_secondary_phone: secondary } : {}),\n };\n }\n\n /**\n * Normalise a Bangladeshi mobile number to 01XXXXXXXXX. Accepts +8801…,\n * 8801… and 01…, with spaces, dashes, dots or parentheses. Returns null for\n * anything that isn't a BD mobile number (operator prefixes 013–019).\n */\n static normalizePhoneNumber(phone: string): string | null {\n const digits = phone.replace(/[\\s\\-().]/g, '').replace(/^\\+/, '');\n const local = digits.startsWith('880') ? `0${digits.slice(3)}` : digits;\n return /^01[3-9]\\d{8}$/.test(local) ? local : null;\n }\n\n // Helper method to validate phone number\n static validatePhoneNumber(phone: string): boolean {\n return PathaoApiService.normalizePhoneNumber(phone) !== null;\n }\n\n // Helper method to format phone number\n static formatPhoneNumber(phone: string): string {\n const normalized = PathaoApiService.normalizePhoneNumber(phone);\n if (normalized) {\n return normalized;\n }\n throw new Error(\n 'Invalid phone number format. Must be a Bangladeshi mobile number (01XXXXXXXXX or +8801XXXXXXXXX)',\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 return PathaoApiService.normalizePhoneNumber(phone) !== null;\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?: PathaoClientOptions): 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 const timeout = parseInt(process.env.PATHAO_TIMEOUT || '', 10);\n if (timeout > 0) {\n config.timeout = timeout;\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?: PathaoClientOptions,\n ): PathaoApiService {\n return new PathaoApiService(config, options);\n }\n\n // Named constructor for sandbox environment\n static sandbox(credentials: Omit<PathaoConfig, 'baseURL'>, options?: PathaoClientOptions): 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?: PathaoClientOptions): PathaoApiService {\n return new PathaoApiService(\n { ...credentials, baseURL: 'https://api-hermes.pathao.com' },\n options,\n );\n }\n}\n\n","/**\n * Shared order lifecycle for Pathao webhook events and order-status slugs.\n *\n * Both describe the same parcel journey. `toLifecycleStatus` maps either one\n * to a small stable vocabulary, so consumers don't each keep a map of spelling\n * variants (\"Pickup Requested\", \"pickup-requested\", \"order.pickup-requested\").\n * Zero dependencies: safe to import from the webhooks entry point.\n */\n\nexport type PathaoLifecycleStatus =\n | 'created'\n | 'picked_up'\n | 'in_transit'\n | 'out_for_delivery'\n | 'delivered'\n | 'partial'\n | 'on_hold'\n /** On its way back. Not back yet: don't restock on this. */\n | 'returning'\n /** Back with the merchant. */\n | 'returned'\n | 'cancelled';\n\n/** Pathao's gateway allows 60 requests per rolling minute, with no Retry-After on its 429. */\nexport const PATHAO_RATE_LIMIT_PER_MINUTE = 60;\n\n/** getOrderStatus only finds orders for roughly this many days after creation. */\nexport const PATHAO_STATUS_RETENTION_DAYS = 90;\n\n// Keys are webhook event names without \"order.\", plus the kebab-cased status\n// labels Pathao uses elsewhere: order_status_slug values seen in production\n// (\"Pending\", \"In Transit\", \"Return\") and the labels in Pathao's own\n// WooCommerce plugin (\"Order_Created\", \"Return\", \"exchange\").\nconst LIFECYCLE: Readonly<Record<string, PathaoLifecycleStatus>> = {\n 'pending': 'created',\n 'created': 'created',\n 'order-created': 'created',\n 'pickup-requested': 'created',\n 'assigned-for-pickup': 'created',\n 'picked': 'picked_up',\n 'pickup-failed': 'on_hold',\n 'pickup-cancelled': 'cancelled',\n 'at-the-sorting-hub': 'in_transit',\n 'in-transit': 'in_transit',\n 'received-at-last-mile-hub': 'in_transit',\n 'assigned-for-delivery': 'out_for_delivery',\n 'delivered': 'delivered',\n 'partial-delivery': 'partial',\n 'delivery-failed': 'on_hold',\n 'on-hold': 'on_hold',\n // Marked for return; the parcel only comes back with returned-to-merchant.\n 'returned': 'returning',\n 'return': 'returning',\n 'return-id-created': 'returning',\n 'return-in-transit': 'returning',\n 'paid-return': 'returning',\n 'exchanged': 'returning',\n 'exchange': 'returning',\n 'returned-to-merchant': 'returned',\n};\n\n/**\n * Map a webhook event (`order.delivered`) or an order-status slug / display\n * string (`Pickup Requested`, `pickup_requested`) to a lifecycle status.\n * Returns `'unknown'` for anything that isn't a lifecycle change\n * (`order.updated`, `order.paid`, store events) or that this SDK hasn't seen.\n */\nexport function toLifecycleStatus(value: string): PathaoLifecycleStatus | 'unknown' {\n const key = value\n .trim()\n .toLowerCase()\n .replace(/^order\\./, '')\n .replace(/[\\s_]+/g, '-');\n return LIFECYCLE[key] ?? 'unknown';\n}\n\n/** Delivered, partially delivered, back with the merchant, or cancelled. */\nexport function isFinalLifecycleStatus(status: PathaoLifecycleStatus | 'unknown'): boolean {\n return status === 'delivered' || status === 'partial' || status === 'returned' || status === 'cancelled';\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 * - Config is passed explicitly, or read from PATHAO_* env vars by fromEnv()\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: DeliveryType; // Required - DeliveryType.NORMAL (48) or DeliveryType.ON_DEMAND (12)\n item_type: ItemType; // Required - ItemType.DOCUMENT (1) or ItemType.PARCEL (2)\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; // Only present if provided in the request\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: ItemType;\n item_weight: number;\n delivery_type: DeliveryType;\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; // Only present if provided at order creation\n order_status: string;\n order_status_slug: string;\n updated_at: string; // Format: \"YYYY-MM-DD HH:MM:SS\"\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/pathao-api.ts","../src/status.ts","../src/types.ts"],"names":["axios","config","AxiosError","DeliveryType","ItemType"],"mappings":"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","file":"index.js","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 * - The constructor reads only the config it is given. Use fromEnv() to read\n * PATHAO_* environment variables (including PATHAO_TIMEOUT).\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\n// GETs, token grants and the read-only price-plan POST can be repeated\n// without side effects. Order and store creation cannot.\nfunction isSafeToRetry(config: { method?: string | undefined; url?: string | undefined }): boolean {\n const url = config.url ?? '';\n return (\n config.method?.toLowerCase() === 'get' ||\n url.includes('/issue-token') ||\n url.includes('/merchant/price-plan')\n );\n}\n\nexport type PathaoErrorKind =\n /** Input rejected, by this SDK before sending or by Pathao (HTTP 400/422). */\n | 'validation'\n /** Missing or wrong baseURL / credentials, caught before any request. */\n | 'config'\n /** Rejected credentials or token (HTTP 401). */\n | 'auth'\n /**\n * The account may not do this right now: HTTP 403, or 402 when Pathao\n * refuses new orders until the merchant pays outstanding dues.\n */\n | 'forbidden'\n /** Unknown consignment, store or resource (HTTP 404). */\n | 'not_found'\n /** HTTP 429. Back off; see PATHAO_RATE_LIMIT_PER_MINUTE. */\n | 'rate_limited'\n /** 5xx, timeout, network failure or open circuit breaker. */\n | 'unavailable'\n /** A response this SDK doesn't understand. Inspect `responseData`. */\n | 'unexpected';\n\nfunction kindForStatus(status: number | undefined): PathaoErrorKind {\n if (status === 400 || status === 422) return 'validation';\n if (status === 401) return 'auth';\n if (status === 402 || status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 429) return 'rate_limited';\n if (status !== undefined && status >= 500) return 'unavailable';\n return 'unexpected';\n}\n\nexport class PathaoApiError extends Error {\n kind: PathaoErrorKind;\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 kind?: PathaoErrorKind | undefined;\n } = {},\n ) {\n super(message);\n this.name = 'PathaoApiError';\n this.kind = options.kind ?? kindForStatus(options.status ?? options.code);\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 * True for transient failures (`unavailable`, `rate_limited`). For\n * createOrder / createBulkOrder a 5xx may hide a booking that went through:\n * look the order up before retrying a create.\n */\n get retryable(): boolean {\n return this.kind === 'unavailable' || this.kind === 'rate_limited';\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 interface PathaoClientOptions {\n /** Log requests and responses (tokens and Authorization redacted). */\n debug?: boolean;\n circuitBreaker?: CircuitBreakerConfig;\n /**\n * Minimum gap between requests from this instance, in ms. Requests queue\n * instead of tripping Pathao's 60/min limit (PATHAO_RATE_LIMIT_PER_MINUTE).\n * 1500 keeps one instance near 40/min, leaving headroom for other callers\n * sharing the credentials. Default 0 (no spacing).\n */\n minRequestIntervalMs?: number;\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 minRequestIntervalMs: number;\n private nextRequestAt = 0;\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?: PathaoClientOptions) {\n // Explicit config is read as given, never topped up from process.env: in\n // a multi-tenant app a blank field would otherwise pick up the platform's\n // own Pathao account. Env-based setup is fromEnv().\n this.config = {\n baseURL: config.baseURL ?? '',\n timeout: config.timeout ?? 30000,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n username: config.username,\n password: config.password,\n };\n\n this.debug = options?.debug || false;\n this.minRequestIntervalMs = Math.max(0, options?.minRequestIntervalMs ?? 0);\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 // Pathao has no reason to redirect, and a 307/308 would re-send the\n // issue-token body (client secret, password) to wherever it points.\n // With 0, any 3xx rejects like an error status.\n maxRedirects: 0,\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 // Every request counts against Pathao's limit, token grants and\n // retries included, so space them all.\n await this.waitForRequestSlot();\n\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 // Token grants carry access_token / refresh_token; never log them.\n const isTokenResponse = response.config.url?.includes('/issue-token');\n console.log(`[Pathao SDK] Response ${response.status}`, {\n url: response.config.url,\n data: isTokenResponse ? '[REDACTED]' : 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 // Pathao's gateway allows 60 requests per rolling minute and its 429\n // carries no Retry-After, so a blind short retry always fails. Retry\n // once only when the server says how long to wait; otherwise hand the\n // 429 to the caller.\n const retryAfterSeconds = parseInt(\n (error.response?.headers?.['retry-after'] as string | undefined) ?? '',\n 10,\n );\n if (\n error.response?.status === 429 &&\n error.config &&\n !error.config._rateLimitRetry &&\n retryAfterSeconds > 0\n ) {\n error.config._rateLimitRetry = true;\n await this.delay(retryAfterSeconds * 1000);\n return this.pathaoClient.request(error.config);\n }\n\n // Retry transient 5xx errors with exponential backoff (max 2 retries),\n // but only for requests that are safe to repeat. A 5xx on a create\n // (a gateway 502/504 in front of a slow success) may already have\n // booked the consignment; re-POSTing can book it again.\n const status: number | undefined = error.response?.status;\n if (status !== undefined && status >= 500 && error.config && isSafeToRetry(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 // Trip the circuit breaker on outages (network, 5xx) and auth failures.\n // A 429 is not an outage: counting it locked out every call for the\n // breaker timeout and re-tripped each time the rate window reset.\n const tripsBreaker = status === undefined || status >= 500 || status === 401;\n if (tripsBreaker) {\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 new PathaoApiError(\n 'Configuration validation failed: Pathao API baseURL is required. Pass it in the config, or use PathaoApiService.fromEnv() with PATHAO_BASE_URL set',\n { kind: 'config' },\n );\n }\n\n if (!this.config.baseURL.startsWith('https://')) {\n throw new PathaoApiError(\n 'Configuration validation failed: Pathao API baseURL must use HTTPS (https://)',\n { kind: 'config' },\n );\n }\n\n if (\n !this.config.clientId ||\n !this.config.clientSecret ||\n !this.config.username ||\n !this.config.password\n ) {\n throw new PathaoApiError(\n 'Configuration validation failed: Pathao API credentials are required: clientId, clientSecret, username, password. Pass them in the config, or use PathaoApiService.fromEnv() with PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME and PATHAO_PASSWORD set',\n { kind: 'config' },\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 after repeated network, server or authentication failures. Try again later.',\n { code: 503, kind: 'unavailable' },\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 // No response at all: timeout or network failure.\n ...(axiosLike.response ? {} : { kind: 'unavailable' as const }),\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 // Reserves the next free slot synchronously, then waits for it, so\n // concurrent callers queue in call order.\n private async waitForRequestSlot(): Promise<void> {\n if (this.minRequestIntervalMs <= 0) return;\n const now = Date.now();\n const at = Math.max(now, this.nextRequestAt);\n this.nextRequestAt = at + this.minRequestIntervalMs;\n if (at > now) await this.delay(at - now);\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 PathaoApiService.prepareOrder(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 prepared = orders.map((order, i) => PathaoApiService.prepareOrder(order, `orders[${i}]: `));\n const response = await this.pathaoClient.post<PathaoBulkOrderResponse>(\n '/aladdin/api/v1/orders/bulk', { orders: prepared });\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create bulk Pathao orders');\n }\n }\n\n // Validates an order and returns it with phones normalised to 01XXXXXXXXX,\n // so local checks catch what Pathao would reject with a 422 and what is\n // sent is what was validated.\n private static prepareOrder(order: PathaoOrderRequest, prefix = ''): PathaoOrderRequest {\n const fail = (message: string): never => {\n throw new PathaoApiError(`Validation failed: ${prefix}${message}`, { code: 400 });\n };\n const phone = PathaoApiService.normalizePhoneNumber(order.recipient_phone ?? '');\n if (!phone) fail('Invalid recipient_phone format');\n let secondary: string | null = null;\n if (order.recipient_secondary_phone) {\n secondary = PathaoApiService.normalizePhoneNumber(order.recipient_secondary_phone);\n if (!secondary) fail('Invalid recipient_secondary_phone format');\n }\n if (!PathaoApiService.validateRecipientName(order.recipient_name ?? '')) {\n fail('Invalid recipient_name (must be 3 to 100 characters)');\n }\n if (!PathaoApiService.validateAddress(order.recipient_address ?? '')) {\n fail('Invalid recipient_address (must be 10 to 220 characters)');\n }\n if (!PathaoApiService.validateWeight(order.item_weight)) {\n fail('Invalid item_weight (must be 0.5 to 10)');\n }\n return {\n ...order,\n recipient_phone: phone as string,\n ...(secondary ? { recipient_secondary_phone: secondary } : {}),\n };\n }\n\n /**\n * Normalise a Bangladeshi mobile number to 01XXXXXXXXX. Accepts +8801…,\n * 8801… and 01…, with spaces, dashes, dots or parentheses. Returns null for\n * anything that isn't a BD mobile number (operator prefixes 013–019).\n */\n static normalizePhoneNumber(phone: string): string | null {\n const digits = phone.replace(/[\\s\\-().]/g, '').replace(/^\\+/, '');\n const local = digits.startsWith('880') ? `0${digits.slice(3)}` : digits;\n return /^01[3-9]\\d{8}$/.test(local) ? local : null;\n }\n\n // Helper method to validate phone number\n static validatePhoneNumber(phone: string): boolean {\n return PathaoApiService.normalizePhoneNumber(phone) !== null;\n }\n\n // Helper method to format phone number\n static formatPhoneNumber(phone: string): string {\n const normalized = PathaoApiService.normalizePhoneNumber(phone);\n if (normalized) {\n return normalized;\n }\n throw new Error(\n 'Invalid phone number format. Must be a Bangladeshi mobile number (01XXXXXXXXX or +8801XXXXXXXXX)',\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 return PathaoApiService.normalizePhoneNumber(phone) !== null;\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?: PathaoClientOptions): 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 const timeout = parseInt(process.env.PATHAO_TIMEOUT || '', 10);\n if (timeout > 0) {\n config.timeout = timeout;\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?: PathaoClientOptions,\n ): PathaoApiService {\n return new PathaoApiService(config, options);\n }\n\n // Named constructor for sandbox environment\n static sandbox(credentials: Omit<PathaoConfig, 'baseURL'>, options?: PathaoClientOptions): 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?: PathaoClientOptions): PathaoApiService {\n return new PathaoApiService(\n { ...credentials, baseURL: 'https://api-hermes.pathao.com' },\n options,\n );\n }\n}\n\n","/**\n * Shared order lifecycle for Pathao webhook events and order-status slugs.\n *\n * Both describe the same parcel journey. `toLifecycleStatus` maps either one\n * to a small stable vocabulary, so consumers don't each keep a map of spelling\n * variants (\"Pickup Requested\", \"pickup-requested\", \"order.pickup-requested\").\n * Zero dependencies: safe to import from the webhooks entry point.\n */\n\nexport type PathaoLifecycleStatus =\n | 'created'\n | 'picked_up'\n | 'in_transit'\n | 'out_for_delivery'\n | 'delivered'\n | 'partial'\n | 'on_hold'\n /** On its way back. Not back yet: don't restock on this. */\n | 'returning'\n /** Back with the merchant. */\n | 'returned'\n | 'cancelled';\n\n/** Pathao's gateway allows 60 requests per rolling minute, with no Retry-After on its 429. */\nexport const PATHAO_RATE_LIMIT_PER_MINUTE = 60;\n\n/** getOrderStatus only finds orders for roughly this many days after creation. */\nexport const PATHAO_STATUS_RETENTION_DAYS = 90;\n\n// Keys are webhook event names without \"order.\", plus the kebab-cased status\n// labels Pathao uses elsewhere: order_status_slug values seen in production\n// (\"Pending\", \"In Transit\", \"Return\") and the labels in Pathao's own\n// WooCommerce plugin (\"Order_Created\", \"Return\", \"exchange\").\nconst LIFECYCLE: Readonly<Record<string, PathaoLifecycleStatus>> = {\n 'pending': 'created',\n 'created': 'created',\n 'order-created': 'created',\n 'pickup-requested': 'created',\n 'assigned-for-pickup': 'created',\n 'picked': 'picked_up',\n 'pickup-failed': 'on_hold',\n 'pickup-cancelled': 'cancelled',\n 'at-the-sorting-hub': 'in_transit',\n 'in-transit': 'in_transit',\n 'received-at-last-mile-hub': 'in_transit',\n 'assigned-for-delivery': 'out_for_delivery',\n 'delivered': 'delivered',\n 'partial-delivery': 'partial',\n 'delivery-failed': 'on_hold',\n 'on-hold': 'on_hold',\n // Marked for return; the parcel only comes back with returned-to-merchant.\n 'returned': 'returning',\n 'return': 'returning',\n 'return-id-created': 'returning',\n 'return-in-transit': 'returning',\n 'paid-return': 'returning',\n 'exchanged': 'returning',\n 'exchange': 'returning',\n 'returned-to-merchant': 'returned',\n};\n\n/**\n * Map a webhook event (`order.delivered`) or an order-status slug / display\n * string (`Pickup Requested`, `pickup_requested`) to a lifecycle status.\n * Returns `'unknown'` for anything that isn't a lifecycle change\n * (`order.updated`, `order.paid`, store events) or that this SDK hasn't seen.\n */\nexport function toLifecycleStatus(value: string): PathaoLifecycleStatus | 'unknown' {\n const key = value\n .trim()\n .toLowerCase()\n .replace(/^order\\./, '')\n .replace(/[\\s_]+/g, '-');\n return LIFECYCLE[key] ?? 'unknown';\n}\n\n/** Delivered, partially delivered, back with the merchant, or cancelled. */\nexport function isFinalLifecycleStatus(status: PathaoLifecycleStatus | 'unknown'): boolean {\n return status === 'delivered' || status === 'partial' || status === 'returned' || status === 'cancelled';\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 * - Config is passed explicitly, or read from PATHAO_* env vars by fromEnv()\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: DeliveryType; // Required - DeliveryType.NORMAL (48) or DeliveryType.ON_DEMAND (12)\n item_type: ItemType; // Required - ItemType.DOCUMENT (1) or ItemType.PARCEL (2)\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; // Only present if provided in the request\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: ItemType;\n item_weight: number;\n delivery_type: DeliveryType;\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; // Only present if provided at order creation\n order_status: string;\n order_status_slug: string;\n updated_at: string; // Format: \"YYYY-MM-DD HH:MM:SS\"\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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -8,7 +8,7 @@ function isSafeToRetry(config) {
|
|
|
8
8
|
function kindForStatus(status) {
|
|
9
9
|
if (status === 400 || status === 422) return "validation";
|
|
10
10
|
if (status === 401) return "auth";
|
|
11
|
-
if (status === 403) return "forbidden";
|
|
11
|
+
if (status === 402 || status === 403) return "forbidden";
|
|
12
12
|
if (status === 404) return "not_found";
|
|
13
13
|
if (status === 429) return "rate_limited";
|
|
14
14
|
if (status !== void 0 && status >= 500) return "unavailable";
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pathao-api.ts","../src/status.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 * - The constructor reads only the config it is given. Use fromEnv() to read\n * PATHAO_* environment variables (including PATHAO_TIMEOUT).\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\n// GETs, token grants and the read-only price-plan POST can be repeated\n// without side effects. Order and store creation cannot.\nfunction isSafeToRetry(config: { method?: string | undefined; url?: string | undefined }): boolean {\n const url = config.url ?? '';\n return (\n config.method?.toLowerCase() === 'get' ||\n url.includes('/issue-token') ||\n url.includes('/merchant/price-plan')\n );\n}\n\nexport type PathaoErrorKind =\n /** Input rejected, by this SDK before sending or by Pathao (HTTP 400/422). */\n | 'validation'\n /** Missing or wrong baseURL / credentials, caught before any request. */\n | 'config'\n /** Rejected credentials or token (HTTP 401). */\n | 'auth'\n /** HTTP 403. */\n | 'forbidden'\n /** Unknown consignment, store or resource (HTTP 404). */\n | 'not_found'\n /** HTTP 429. Back off; see PATHAO_RATE_LIMIT_PER_MINUTE. */\n | 'rate_limited'\n /** 5xx, timeout, network failure or open circuit breaker. */\n | 'unavailable'\n /** A response this SDK doesn't understand. Inspect `responseData`. */\n | 'unexpected';\n\nfunction kindForStatus(status: number | undefined): PathaoErrorKind {\n if (status === 400 || status === 422) return 'validation';\n if (status === 401) return 'auth';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 429) return 'rate_limited';\n if (status !== undefined && status >= 500) return 'unavailable';\n return 'unexpected';\n}\n\nexport class PathaoApiError extends Error {\n kind: PathaoErrorKind;\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 kind?: PathaoErrorKind | undefined;\n } = {},\n ) {\n super(message);\n this.name = 'PathaoApiError';\n this.kind = options.kind ?? kindForStatus(options.status ?? options.code);\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 * True for transient failures (`unavailable`, `rate_limited`). For\n * createOrder / createBulkOrder a 5xx may hide a booking that went through:\n * look the order up before retrying a create.\n */\n get retryable(): boolean {\n return this.kind === 'unavailable' || this.kind === 'rate_limited';\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 interface PathaoClientOptions {\n /** Log requests and responses (tokens and Authorization redacted). */\n debug?: boolean;\n circuitBreaker?: CircuitBreakerConfig;\n /**\n * Minimum gap between requests from this instance, in ms. Requests queue\n * instead of tripping Pathao's 60/min limit (PATHAO_RATE_LIMIT_PER_MINUTE).\n * 1500 keeps one instance near 40/min, leaving headroom for other callers\n * sharing the credentials. Default 0 (no spacing).\n */\n minRequestIntervalMs?: number;\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 minRequestIntervalMs: number;\n private nextRequestAt = 0;\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?: PathaoClientOptions) {\n // Explicit config is read as given, never topped up from process.env: in\n // a multi-tenant app a blank field would otherwise pick up the platform's\n // own Pathao account. Env-based setup is fromEnv().\n this.config = {\n baseURL: config.baseURL ?? '',\n timeout: config.timeout ?? 30000,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n username: config.username,\n password: config.password,\n };\n\n this.debug = options?.debug || false;\n this.minRequestIntervalMs = Math.max(0, options?.minRequestIntervalMs ?? 0);\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 // Pathao has no reason to redirect, and a 307/308 would re-send the\n // issue-token body (client secret, password) to wherever it points.\n // With 0, any 3xx rejects like an error status.\n maxRedirects: 0,\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 // Every request counts against Pathao's limit, token grants and\n // retries included, so space them all.\n await this.waitForRequestSlot();\n\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 // Token grants carry access_token / refresh_token; never log them.\n const isTokenResponse = response.config.url?.includes('/issue-token');\n console.log(`[Pathao SDK] Response ${response.status}`, {\n url: response.config.url,\n data: isTokenResponse ? '[REDACTED]' : 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 // Pathao's gateway allows 60 requests per rolling minute and its 429\n // carries no Retry-After, so a blind short retry always fails. Retry\n // once only when the server says how long to wait; otherwise hand the\n // 429 to the caller.\n const retryAfterSeconds = parseInt(\n (error.response?.headers?.['retry-after'] as string | undefined) ?? '',\n 10,\n );\n if (\n error.response?.status === 429 &&\n error.config &&\n !error.config._rateLimitRetry &&\n retryAfterSeconds > 0\n ) {\n error.config._rateLimitRetry = true;\n await this.delay(retryAfterSeconds * 1000);\n return this.pathaoClient.request(error.config);\n }\n\n // Retry transient 5xx errors with exponential backoff (max 2 retries),\n // but only for requests that are safe to repeat. A 5xx on a create\n // (a gateway 502/504 in front of a slow success) may already have\n // booked the consignment; re-POSTing can book it again.\n const status: number | undefined = error.response?.status;\n if (status !== undefined && status >= 500 && error.config && isSafeToRetry(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 // Trip the circuit breaker on outages (network, 5xx) and auth failures.\n // A 429 is not an outage: counting it locked out every call for the\n // breaker timeout and re-tripped each time the rate window reset.\n const tripsBreaker = status === undefined || status >= 500 || status === 401;\n if (tripsBreaker) {\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 new PathaoApiError(\n 'Configuration validation failed: Pathao API baseURL is required. Pass it in the config, or use PathaoApiService.fromEnv() with PATHAO_BASE_URL set',\n { kind: 'config' },\n );\n }\n\n if (!this.config.baseURL.startsWith('https://')) {\n throw new PathaoApiError(\n 'Configuration validation failed: Pathao API baseURL must use HTTPS (https://)',\n { kind: 'config' },\n );\n }\n\n if (\n !this.config.clientId ||\n !this.config.clientSecret ||\n !this.config.username ||\n !this.config.password\n ) {\n throw new PathaoApiError(\n 'Configuration validation failed: Pathao API credentials are required: clientId, clientSecret, username, password. Pass them in the config, or use PathaoApiService.fromEnv() with PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME and PATHAO_PASSWORD set',\n { kind: 'config' },\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 after repeated network, server or authentication failures. Try again later.',\n { code: 503, kind: 'unavailable' },\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 // No response at all: timeout or network failure.\n ...(axiosLike.response ? {} : { kind: 'unavailable' as const }),\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 // Reserves the next free slot synchronously, then waits for it, so\n // concurrent callers queue in call order.\n private async waitForRequestSlot(): Promise<void> {\n if (this.minRequestIntervalMs <= 0) return;\n const now = Date.now();\n const at = Math.max(now, this.nextRequestAt);\n this.nextRequestAt = at + this.minRequestIntervalMs;\n if (at > now) await this.delay(at - now);\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 PathaoApiService.prepareOrder(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 prepared = orders.map((order, i) => PathaoApiService.prepareOrder(order, `orders[${i}]: `));\n const response = await this.pathaoClient.post<PathaoBulkOrderResponse>(\n '/aladdin/api/v1/orders/bulk', { orders: prepared });\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create bulk Pathao orders');\n }\n }\n\n // Validates an order and returns it with phones normalised to 01XXXXXXXXX,\n // so local checks catch what Pathao would reject with a 422 and what is\n // sent is what was validated.\n private static prepareOrder(order: PathaoOrderRequest, prefix = ''): PathaoOrderRequest {\n const fail = (message: string): never => {\n throw new PathaoApiError(`Validation failed: ${prefix}${message}`, { code: 400 });\n };\n const phone = PathaoApiService.normalizePhoneNumber(order.recipient_phone ?? '');\n if (!phone) fail('Invalid recipient_phone format');\n let secondary: string | null = null;\n if (order.recipient_secondary_phone) {\n secondary = PathaoApiService.normalizePhoneNumber(order.recipient_secondary_phone);\n if (!secondary) fail('Invalid recipient_secondary_phone format');\n }\n if (!PathaoApiService.validateRecipientName(order.recipient_name ?? '')) {\n fail('Invalid recipient_name (must be 3 to 100 characters)');\n }\n if (!PathaoApiService.validateAddress(order.recipient_address ?? '')) {\n fail('Invalid recipient_address (must be 10 to 220 characters)');\n }\n if (!PathaoApiService.validateWeight(order.item_weight)) {\n fail('Invalid item_weight (must be 0.5 to 10)');\n }\n return {\n ...order,\n recipient_phone: phone as string,\n ...(secondary ? { recipient_secondary_phone: secondary } : {}),\n };\n }\n\n /**\n * Normalise a Bangladeshi mobile number to 01XXXXXXXXX. Accepts +8801…,\n * 8801… and 01…, with spaces, dashes, dots or parentheses. Returns null for\n * anything that isn't a BD mobile number (operator prefixes 013–019).\n */\n static normalizePhoneNumber(phone: string): string | null {\n const digits = phone.replace(/[\\s\\-().]/g, '').replace(/^\\+/, '');\n const local = digits.startsWith('880') ? `0${digits.slice(3)}` : digits;\n return /^01[3-9]\\d{8}$/.test(local) ? local : null;\n }\n\n // Helper method to validate phone number\n static validatePhoneNumber(phone: string): boolean {\n return PathaoApiService.normalizePhoneNumber(phone) !== null;\n }\n\n // Helper method to format phone number\n static formatPhoneNumber(phone: string): string {\n const normalized = PathaoApiService.normalizePhoneNumber(phone);\n if (normalized) {\n return normalized;\n }\n throw new Error(\n 'Invalid phone number format. Must be a Bangladeshi mobile number (01XXXXXXXXX or +8801XXXXXXXXX)',\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 return PathaoApiService.normalizePhoneNumber(phone) !== null;\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?: PathaoClientOptions): 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 const timeout = parseInt(process.env.PATHAO_TIMEOUT || '', 10);\n if (timeout > 0) {\n config.timeout = timeout;\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?: PathaoClientOptions,\n ): PathaoApiService {\n return new PathaoApiService(config, options);\n }\n\n // Named constructor for sandbox environment\n static sandbox(credentials: Omit<PathaoConfig, 'baseURL'>, options?: PathaoClientOptions): 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?: PathaoClientOptions): PathaoApiService {\n return new PathaoApiService(\n { ...credentials, baseURL: 'https://api-hermes.pathao.com' },\n options,\n );\n }\n}\n\n","/**\n * Shared order lifecycle for Pathao webhook events and order-status slugs.\n *\n * Both describe the same parcel journey. `toLifecycleStatus` maps either one\n * to a small stable vocabulary, so consumers don't each keep a map of spelling\n * variants (\"Pickup Requested\", \"pickup-requested\", \"order.pickup-requested\").\n * Zero dependencies: safe to import from the webhooks entry point.\n */\n\nexport type PathaoLifecycleStatus =\n | 'created'\n | 'picked_up'\n | 'in_transit'\n | 'out_for_delivery'\n | 'delivered'\n | 'partial'\n | 'on_hold'\n /** On its way back. Not back yet: don't restock on this. */\n | 'returning'\n /** Back with the merchant. */\n | 'returned'\n | 'cancelled';\n\n/** Pathao's gateway allows 60 requests per rolling minute, with no Retry-After on its 429. */\nexport const PATHAO_RATE_LIMIT_PER_MINUTE = 60;\n\n/** getOrderStatus only finds orders for roughly this many days after creation. */\nexport const PATHAO_STATUS_RETENTION_DAYS = 90;\n\n// Keys are webhook event names without \"order.\", plus the kebab-cased status\n// labels Pathao uses elsewhere: order_status_slug values seen in production\n// (\"Pending\", \"In Transit\", \"Return\") and the labels in Pathao's own\n// WooCommerce plugin (\"Order_Created\", \"Return\", \"exchange\").\nconst LIFECYCLE: Readonly<Record<string, PathaoLifecycleStatus>> = {\n 'pending': 'created',\n 'created': 'created',\n 'order-created': 'created',\n 'pickup-requested': 'created',\n 'assigned-for-pickup': 'created',\n 'picked': 'picked_up',\n 'pickup-failed': 'on_hold',\n 'pickup-cancelled': 'cancelled',\n 'at-the-sorting-hub': 'in_transit',\n 'in-transit': 'in_transit',\n 'received-at-last-mile-hub': 'in_transit',\n 'assigned-for-delivery': 'out_for_delivery',\n 'delivered': 'delivered',\n 'partial-delivery': 'partial',\n 'delivery-failed': 'on_hold',\n 'on-hold': 'on_hold',\n // Marked for return; the parcel only comes back with returned-to-merchant.\n 'returned': 'returning',\n 'return': 'returning',\n 'return-id-created': 'returning',\n 'return-in-transit': 'returning',\n 'paid-return': 'returning',\n 'exchanged': 'returning',\n 'exchange': 'returning',\n 'returned-to-merchant': 'returned',\n};\n\n/**\n * Map a webhook event (`order.delivered`) or an order-status slug / display\n * string (`Pickup Requested`, `pickup_requested`) to a lifecycle status.\n * Returns `'unknown'` for anything that isn't a lifecycle change\n * (`order.updated`, `order.paid`, store events) or that this SDK hasn't seen.\n */\nexport function toLifecycleStatus(value: string): PathaoLifecycleStatus | 'unknown' {\n const key = value\n .trim()\n .toLowerCase()\n .replace(/^order\\./, '')\n .replace(/[\\s_]+/g, '-');\n return LIFECYCLE[key] ?? 'unknown';\n}\n\n/** Delivered, partially delivered, back with the merchant, or cancelled. */\nexport function isFinalLifecycleStatus(status: PathaoLifecycleStatus | 'unknown'): boolean {\n return status === 'delivered' || status === 'partial' || status === 'returned' || status === 'cancelled';\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 * - Config is passed explicitly, or read from PATHAO_* env vars by fromEnv()\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: DeliveryType; // Required - DeliveryType.NORMAL (48) or DeliveryType.ON_DEMAND (12)\n item_type: ItemType; // Required - ItemType.DOCUMENT (1) or ItemType.PARCEL (2)\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; // Only present if provided in the request\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: ItemType;\n item_weight: number;\n delivery_type: DeliveryType;\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; // Only present if provided at order creation\n order_status: string;\n order_status_slug: string;\n updated_at: string; // Format: \"YYYY-MM-DD HH:MM:SS\"\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/pathao-api.ts","../src/status.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 * - The constructor reads only the config it is given. Use fromEnv() to read\n * PATHAO_* environment variables (including PATHAO_TIMEOUT).\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\n// GETs, token grants and the read-only price-plan POST can be repeated\n// without side effects. Order and store creation cannot.\nfunction isSafeToRetry(config: { method?: string | undefined; url?: string | undefined }): boolean {\n const url = config.url ?? '';\n return (\n config.method?.toLowerCase() === 'get' ||\n url.includes('/issue-token') ||\n url.includes('/merchant/price-plan')\n );\n}\n\nexport type PathaoErrorKind =\n /** Input rejected, by this SDK before sending or by Pathao (HTTP 400/422). */\n | 'validation'\n /** Missing or wrong baseURL / credentials, caught before any request. */\n | 'config'\n /** Rejected credentials or token (HTTP 401). */\n | 'auth'\n /**\n * The account may not do this right now: HTTP 403, or 402 when Pathao\n * refuses new orders until the merchant pays outstanding dues.\n */\n | 'forbidden'\n /** Unknown consignment, store or resource (HTTP 404). */\n | 'not_found'\n /** HTTP 429. Back off; see PATHAO_RATE_LIMIT_PER_MINUTE. */\n | 'rate_limited'\n /** 5xx, timeout, network failure or open circuit breaker. */\n | 'unavailable'\n /** A response this SDK doesn't understand. Inspect `responseData`. */\n | 'unexpected';\n\nfunction kindForStatus(status: number | undefined): PathaoErrorKind {\n if (status === 400 || status === 422) return 'validation';\n if (status === 401) return 'auth';\n if (status === 402 || status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 429) return 'rate_limited';\n if (status !== undefined && status >= 500) return 'unavailable';\n return 'unexpected';\n}\n\nexport class PathaoApiError extends Error {\n kind: PathaoErrorKind;\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 kind?: PathaoErrorKind | undefined;\n } = {},\n ) {\n super(message);\n this.name = 'PathaoApiError';\n this.kind = options.kind ?? kindForStatus(options.status ?? options.code);\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 * True for transient failures (`unavailable`, `rate_limited`). For\n * createOrder / createBulkOrder a 5xx may hide a booking that went through:\n * look the order up before retrying a create.\n */\n get retryable(): boolean {\n return this.kind === 'unavailable' || this.kind === 'rate_limited';\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 interface PathaoClientOptions {\n /** Log requests and responses (tokens and Authorization redacted). */\n debug?: boolean;\n circuitBreaker?: CircuitBreakerConfig;\n /**\n * Minimum gap between requests from this instance, in ms. Requests queue\n * instead of tripping Pathao's 60/min limit (PATHAO_RATE_LIMIT_PER_MINUTE).\n * 1500 keeps one instance near 40/min, leaving headroom for other callers\n * sharing the credentials. Default 0 (no spacing).\n */\n minRequestIntervalMs?: number;\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 minRequestIntervalMs: number;\n private nextRequestAt = 0;\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?: PathaoClientOptions) {\n // Explicit config is read as given, never topped up from process.env: in\n // a multi-tenant app a blank field would otherwise pick up the platform's\n // own Pathao account. Env-based setup is fromEnv().\n this.config = {\n baseURL: config.baseURL ?? '',\n timeout: config.timeout ?? 30000,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n username: config.username,\n password: config.password,\n };\n\n this.debug = options?.debug || false;\n this.minRequestIntervalMs = Math.max(0, options?.minRequestIntervalMs ?? 0);\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 // Pathao has no reason to redirect, and a 307/308 would re-send the\n // issue-token body (client secret, password) to wherever it points.\n // With 0, any 3xx rejects like an error status.\n maxRedirects: 0,\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 // Every request counts against Pathao's limit, token grants and\n // retries included, so space them all.\n await this.waitForRequestSlot();\n\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 // Token grants carry access_token / refresh_token; never log them.\n const isTokenResponse = response.config.url?.includes('/issue-token');\n console.log(`[Pathao SDK] Response ${response.status}`, {\n url: response.config.url,\n data: isTokenResponse ? '[REDACTED]' : 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 // Pathao's gateway allows 60 requests per rolling minute and its 429\n // carries no Retry-After, so a blind short retry always fails. Retry\n // once only when the server says how long to wait; otherwise hand the\n // 429 to the caller.\n const retryAfterSeconds = parseInt(\n (error.response?.headers?.['retry-after'] as string | undefined) ?? '',\n 10,\n );\n if (\n error.response?.status === 429 &&\n error.config &&\n !error.config._rateLimitRetry &&\n retryAfterSeconds > 0\n ) {\n error.config._rateLimitRetry = true;\n await this.delay(retryAfterSeconds * 1000);\n return this.pathaoClient.request(error.config);\n }\n\n // Retry transient 5xx errors with exponential backoff (max 2 retries),\n // but only for requests that are safe to repeat. A 5xx on a create\n // (a gateway 502/504 in front of a slow success) may already have\n // booked the consignment; re-POSTing can book it again.\n const status: number | undefined = error.response?.status;\n if (status !== undefined && status >= 500 && error.config && isSafeToRetry(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 // Trip the circuit breaker on outages (network, 5xx) and auth failures.\n // A 429 is not an outage: counting it locked out every call for the\n // breaker timeout and re-tripped each time the rate window reset.\n const tripsBreaker = status === undefined || status >= 500 || status === 401;\n if (tripsBreaker) {\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 new PathaoApiError(\n 'Configuration validation failed: Pathao API baseURL is required. Pass it in the config, or use PathaoApiService.fromEnv() with PATHAO_BASE_URL set',\n { kind: 'config' },\n );\n }\n\n if (!this.config.baseURL.startsWith('https://')) {\n throw new PathaoApiError(\n 'Configuration validation failed: Pathao API baseURL must use HTTPS (https://)',\n { kind: 'config' },\n );\n }\n\n if (\n !this.config.clientId ||\n !this.config.clientSecret ||\n !this.config.username ||\n !this.config.password\n ) {\n throw new PathaoApiError(\n 'Configuration validation failed: Pathao API credentials are required: clientId, clientSecret, username, password. Pass them in the config, or use PathaoApiService.fromEnv() with PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME and PATHAO_PASSWORD set',\n { kind: 'config' },\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 after repeated network, server or authentication failures. Try again later.',\n { code: 503, kind: 'unavailable' },\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 // No response at all: timeout or network failure.\n ...(axiosLike.response ? {} : { kind: 'unavailable' as const }),\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 // Reserves the next free slot synchronously, then waits for it, so\n // concurrent callers queue in call order.\n private async waitForRequestSlot(): Promise<void> {\n if (this.minRequestIntervalMs <= 0) return;\n const now = Date.now();\n const at = Math.max(now, this.nextRequestAt);\n this.nextRequestAt = at + this.minRequestIntervalMs;\n if (at > now) await this.delay(at - now);\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 PathaoApiService.prepareOrder(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 prepared = orders.map((order, i) => PathaoApiService.prepareOrder(order, `orders[${i}]: `));\n const response = await this.pathaoClient.post<PathaoBulkOrderResponse>(\n '/aladdin/api/v1/orders/bulk', { orders: prepared });\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create bulk Pathao orders');\n }\n }\n\n // Validates an order and returns it with phones normalised to 01XXXXXXXXX,\n // so local checks catch what Pathao would reject with a 422 and what is\n // sent is what was validated.\n private static prepareOrder(order: PathaoOrderRequest, prefix = ''): PathaoOrderRequest {\n const fail = (message: string): never => {\n throw new PathaoApiError(`Validation failed: ${prefix}${message}`, { code: 400 });\n };\n const phone = PathaoApiService.normalizePhoneNumber(order.recipient_phone ?? '');\n if (!phone) fail('Invalid recipient_phone format');\n let secondary: string | null = null;\n if (order.recipient_secondary_phone) {\n secondary = PathaoApiService.normalizePhoneNumber(order.recipient_secondary_phone);\n if (!secondary) fail('Invalid recipient_secondary_phone format');\n }\n if (!PathaoApiService.validateRecipientName(order.recipient_name ?? '')) {\n fail('Invalid recipient_name (must be 3 to 100 characters)');\n }\n if (!PathaoApiService.validateAddress(order.recipient_address ?? '')) {\n fail('Invalid recipient_address (must be 10 to 220 characters)');\n }\n if (!PathaoApiService.validateWeight(order.item_weight)) {\n fail('Invalid item_weight (must be 0.5 to 10)');\n }\n return {\n ...order,\n recipient_phone: phone as string,\n ...(secondary ? { recipient_secondary_phone: secondary } : {}),\n };\n }\n\n /**\n * Normalise a Bangladeshi mobile number to 01XXXXXXXXX. Accepts +8801…,\n * 8801… and 01…, with spaces, dashes, dots or parentheses. Returns null for\n * anything that isn't a BD mobile number (operator prefixes 013–019).\n */\n static normalizePhoneNumber(phone: string): string | null {\n const digits = phone.replace(/[\\s\\-().]/g, '').replace(/^\\+/, '');\n const local = digits.startsWith('880') ? `0${digits.slice(3)}` : digits;\n return /^01[3-9]\\d{8}$/.test(local) ? local : null;\n }\n\n // Helper method to validate phone number\n static validatePhoneNumber(phone: string): boolean {\n return PathaoApiService.normalizePhoneNumber(phone) !== null;\n }\n\n // Helper method to format phone number\n static formatPhoneNumber(phone: string): string {\n const normalized = PathaoApiService.normalizePhoneNumber(phone);\n if (normalized) {\n return normalized;\n }\n throw new Error(\n 'Invalid phone number format. Must be a Bangladeshi mobile number (01XXXXXXXXX or +8801XXXXXXXXX)',\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 return PathaoApiService.normalizePhoneNumber(phone) !== null;\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?: PathaoClientOptions): 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 const timeout = parseInt(process.env.PATHAO_TIMEOUT || '', 10);\n if (timeout > 0) {\n config.timeout = timeout;\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?: PathaoClientOptions,\n ): PathaoApiService {\n return new PathaoApiService(config, options);\n }\n\n // Named constructor for sandbox environment\n static sandbox(credentials: Omit<PathaoConfig, 'baseURL'>, options?: PathaoClientOptions): 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?: PathaoClientOptions): PathaoApiService {\n return new PathaoApiService(\n { ...credentials, baseURL: 'https://api-hermes.pathao.com' },\n options,\n );\n }\n}\n\n","/**\n * Shared order lifecycle for Pathao webhook events and order-status slugs.\n *\n * Both describe the same parcel journey. `toLifecycleStatus` maps either one\n * to a small stable vocabulary, so consumers don't each keep a map of spelling\n * variants (\"Pickup Requested\", \"pickup-requested\", \"order.pickup-requested\").\n * Zero dependencies: safe to import from the webhooks entry point.\n */\n\nexport type PathaoLifecycleStatus =\n | 'created'\n | 'picked_up'\n | 'in_transit'\n | 'out_for_delivery'\n | 'delivered'\n | 'partial'\n | 'on_hold'\n /** On its way back. Not back yet: don't restock on this. */\n | 'returning'\n /** Back with the merchant. */\n | 'returned'\n | 'cancelled';\n\n/** Pathao's gateway allows 60 requests per rolling minute, with no Retry-After on its 429. */\nexport const PATHAO_RATE_LIMIT_PER_MINUTE = 60;\n\n/** getOrderStatus only finds orders for roughly this many days after creation. */\nexport const PATHAO_STATUS_RETENTION_DAYS = 90;\n\n// Keys are webhook event names without \"order.\", plus the kebab-cased status\n// labels Pathao uses elsewhere: order_status_slug values seen in production\n// (\"Pending\", \"In Transit\", \"Return\") and the labels in Pathao's own\n// WooCommerce plugin (\"Order_Created\", \"Return\", \"exchange\").\nconst LIFECYCLE: Readonly<Record<string, PathaoLifecycleStatus>> = {\n 'pending': 'created',\n 'created': 'created',\n 'order-created': 'created',\n 'pickup-requested': 'created',\n 'assigned-for-pickup': 'created',\n 'picked': 'picked_up',\n 'pickup-failed': 'on_hold',\n 'pickup-cancelled': 'cancelled',\n 'at-the-sorting-hub': 'in_transit',\n 'in-transit': 'in_transit',\n 'received-at-last-mile-hub': 'in_transit',\n 'assigned-for-delivery': 'out_for_delivery',\n 'delivered': 'delivered',\n 'partial-delivery': 'partial',\n 'delivery-failed': 'on_hold',\n 'on-hold': 'on_hold',\n // Marked for return; the parcel only comes back with returned-to-merchant.\n 'returned': 'returning',\n 'return': 'returning',\n 'return-id-created': 'returning',\n 'return-in-transit': 'returning',\n 'paid-return': 'returning',\n 'exchanged': 'returning',\n 'exchange': 'returning',\n 'returned-to-merchant': 'returned',\n};\n\n/**\n * Map a webhook event (`order.delivered`) or an order-status slug / display\n * string (`Pickup Requested`, `pickup_requested`) to a lifecycle status.\n * Returns `'unknown'` for anything that isn't a lifecycle change\n * (`order.updated`, `order.paid`, store events) or that this SDK hasn't seen.\n */\nexport function toLifecycleStatus(value: string): PathaoLifecycleStatus | 'unknown' {\n const key = value\n .trim()\n .toLowerCase()\n .replace(/^order\\./, '')\n .replace(/[\\s_]+/g, '-');\n return LIFECYCLE[key] ?? 'unknown';\n}\n\n/** Delivered, partially delivered, back with the merchant, or cancelled. */\nexport function isFinalLifecycleStatus(status: PathaoLifecycleStatus | 'unknown'): boolean {\n return status === 'delivered' || status === 'partial' || status === 'returned' || status === 'cancelled';\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 * - Config is passed explicitly, or read from PATHAO_* env vars by fromEnv()\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: DeliveryType; // Required - DeliveryType.NORMAL (48) or DeliveryType.ON_DEMAND (12)\n item_type: ItemType; // Required - ItemType.DOCUMENT (1) or ItemType.PARCEL (2)\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; // Only present if provided in the request\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: ItemType;\n item_weight: number;\n delivery_type: DeliveryType;\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; // Only present if provided at order creation\n order_status: string;\n order_status_slug: string;\n updated_at: string; // Format: \"YYYY-MM-DD HH:MM:SS\"\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pathao-merchant-sdk",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "Unofficial TypeScript SDK for the Pathao Merchant API",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"default": "./dist/index.js"
|
|
17
17
|
}
|
|
18
18
|
},
|
|
19
|
+
"./package.json": "./package.json",
|
|
19
20
|
"./webhooks": {
|
|
20
21
|
"import": {
|
|
21
22
|
"types": "./dist/webhooks.d.mts",
|