@mitumba/sdk 1.14.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1530,6 +1530,15 @@ declare class DisputesModule {
1530
1530
  }>;
1531
1531
  }
1532
1532
 
1533
+ declare class UploadsModule {
1534
+ private readonly client;
1535
+ constructor(client: APIClient);
1536
+ /** Upload a file (avatar, evidence, etc). Returns the public CDN URL. */
1537
+ upload(file: Blob, options?: RequestOptions): Promise<{
1538
+ url: string;
1539
+ }>;
1540
+ }
1541
+
1533
1542
  declare class MitumbaClient {
1534
1543
  readonly api: APIClient;
1535
1544
  readonly auth: AuthModule;
@@ -1549,6 +1558,7 @@ declare class MitumbaClient {
1549
1558
  readonly businesses: BusinessesModule;
1550
1559
  readonly admin: AdminModule;
1551
1560
  readonly disputes: DisputesModule;
1561
+ readonly uploads: UploadsModule;
1552
1562
  constructor(config: MitumbaClientConfig);
1553
1563
  /**
1554
1564
  * Set the access token for authenticated requests.
@@ -1573,4 +1583,4 @@ declare class MitumbaClient {
1573
1583
  isAuthenticated(): Promise<boolean>;
1574
1584
  }
1575
1585
 
1576
- export { APIClient, APIError, type APIErrorResponse, type AddAddressInput, type AddPaymentMethodInput, type Address, AdminModule, AuthModule, type AuthTokens, type BecomeSellerInput, type BlockedIp, type Business, BusinessesModule, CONDITIONS, type CartItem, CartModule, type Category, type ChangePasswordInput, type City, type CompleteOnboardingInput, type Condition, type Conversation, type CreateListingInput, type CreateOrderInput, type CreateReviewInput, type CreateStoreInput, DESIRED_RESOLUTIONS, DISPUTE_REASONS, DISPUTE_STATUSES, type DeliveryAddress, type DesiredResolution, type Dispute, type DisputeEvent, type DisputeEvidence, type DisputeListParams, type DisputeReason, type DisputeStatus, DisputesModule, type EmailLoginInput, type EmailRegisterInput, type ForgotPasswordInput, IDBTokenStore, LISTING_STATUSES, type LinkedAccount, type LinkedAccountProvider, type Listing, type ListingImage, type ListingStatus, type ListingsFeedParams, ListingsModule, type LoginInput, MailerModule, type MailerTemplate, MemoryTokenStore, type Message, type MessageResponse, MessagesModule, MitumbaClient, type MitumbaClientConfig, type MpesaInput, type Notification, type NotificationPref, type NotificationType, NotificationsModule, ORDER_STATUSES, type Order, type OrderEvent, type OrderHistoryParams, type OrderStatus, OrdersModule, PAYMENT_STATUSES, type PaginatedResponse, PayModule, type PaymentMethod, type PaymentMethodType, type PaymentStatus, type PaymentStatusResponse, type PaystackInitResponse, type PaystackInput, type PhoneLoginInput, type PhoneRegisterInput, type PresignImageResponse, type RaiseDisputeInput, type RegisterInput, type RequestOptions, type ResetPasswordInput, type ResolveDisputeInput, type RespondDisputeInput, type Review, type ReviewableOrder, ReviewsModule, type SaveSearchInput, type SearchHistoryItem, SearchModule, type SearchParams, type SearchResult, type SellerProfile, type SellerStorefront, type SendEmailInput, type SendMessageInput, type SendOtpInput, type Session, SettingsModule, type SimilarListing, type StkPushInput, type StkPushResponse, type Store, type StoreAnalytics, type StoreSettings, type StoreStats, StoresModule, type SubscriptionTier, type SystemStats, type TokenStore, type TransitionOrderInput, type TrendingTerm, type TwoFactorRequired, type UpdateBusinessInput, type UpdateListingInput, type UpdateProfileInput, type UpdateStoreInput, type UserProfile, type VAZIOutfit, type VAZIOutfitDetail, type VAZIOutfitDetailItem, type VAZIOutfitItem, type VaziFeedParams, type VaziFeedResponse, VaziModule, type Verify2FAInput, type VerifyOtpInput, type WishlistListing, WishlistsModule, createTokenStore };
1586
+ export { APIClient, APIError, type APIErrorResponse, type AddAddressInput, type AddPaymentMethodInput, type Address, AdminModule, AuthModule, type AuthTokens, type BecomeSellerInput, type BlockedIp, type Business, BusinessesModule, CONDITIONS, type CartItem, CartModule, type Category, type ChangePasswordInput, type City, type CompleteOnboardingInput, type Condition, type Conversation, type CreateListingInput, type CreateOrderInput, type CreateReviewInput, type CreateStoreInput, DESIRED_RESOLUTIONS, DISPUTE_REASONS, DISPUTE_STATUSES, type DeliveryAddress, type DesiredResolution, type Dispute, type DisputeEvent, type DisputeEvidence, type DisputeListParams, type DisputeReason, type DisputeStatus, DisputesModule, type EmailLoginInput, type EmailRegisterInput, type ForgotPasswordInput, IDBTokenStore, LISTING_STATUSES, type LinkedAccount, type LinkedAccountProvider, type Listing, type ListingImage, type ListingStatus, type ListingsFeedParams, ListingsModule, type LoginInput, MailerModule, type MailerTemplate, MemoryTokenStore, type Message, type MessageResponse, MessagesModule, MitumbaClient, type MitumbaClientConfig, type MpesaInput, type Notification, type NotificationPref, type NotificationType, NotificationsModule, ORDER_STATUSES, type Order, type OrderEvent, type OrderHistoryParams, type OrderStatus, OrdersModule, PAYMENT_STATUSES, type PaginatedResponse, PayModule, type PaymentMethod, type PaymentMethodType, type PaymentStatus, type PaymentStatusResponse, type PaystackInitResponse, type PaystackInput, type PhoneLoginInput, type PhoneRegisterInput, type PresignImageResponse, type RaiseDisputeInput, type RegisterInput, type RequestOptions, type ResetPasswordInput, type ResolveDisputeInput, type RespondDisputeInput, type Review, type ReviewableOrder, ReviewsModule, type SaveSearchInput, type SearchHistoryItem, SearchModule, type SearchParams, type SearchResult, type SellerProfile, type SellerStorefront, type SendEmailInput, type SendMessageInput, type SendOtpInput, type Session, SettingsModule, type SimilarListing, type StkPushInput, type StkPushResponse, type Store, type StoreAnalytics, type StoreSettings, type StoreStats, StoresModule, type SubscriptionTier, type SystemStats, type TokenStore, type TransitionOrderInput, type TrendingTerm, type TwoFactorRequired, type UpdateBusinessInput, type UpdateListingInput, type UpdateProfileInput, type UpdateStoreInput, UploadsModule, type UserProfile, type VAZIOutfit, type VAZIOutfitDetail, type VAZIOutfitDetailItem, type VAZIOutfitItem, type VaziFeedParams, type VaziFeedResponse, VaziModule, type Verify2FAInput, type VerifyOtpInput, type WishlistListing, WishlistsModule, createTokenStore };
package/dist/index.d.ts CHANGED
@@ -1530,6 +1530,15 @@ declare class DisputesModule {
1530
1530
  }>;
1531
1531
  }
1532
1532
 
1533
+ declare class UploadsModule {
1534
+ private readonly client;
1535
+ constructor(client: APIClient);
1536
+ /** Upload a file (avatar, evidence, etc). Returns the public CDN URL. */
1537
+ upload(file: Blob, options?: RequestOptions): Promise<{
1538
+ url: string;
1539
+ }>;
1540
+ }
1541
+
1533
1542
  declare class MitumbaClient {
1534
1543
  readonly api: APIClient;
1535
1544
  readonly auth: AuthModule;
@@ -1549,6 +1558,7 @@ declare class MitumbaClient {
1549
1558
  readonly businesses: BusinessesModule;
1550
1559
  readonly admin: AdminModule;
1551
1560
  readonly disputes: DisputesModule;
1561
+ readonly uploads: UploadsModule;
1552
1562
  constructor(config: MitumbaClientConfig);
1553
1563
  /**
1554
1564
  * Set the access token for authenticated requests.
@@ -1573,4 +1583,4 @@ declare class MitumbaClient {
1573
1583
  isAuthenticated(): Promise<boolean>;
1574
1584
  }
1575
1585
 
1576
- export { APIClient, APIError, type APIErrorResponse, type AddAddressInput, type AddPaymentMethodInput, type Address, AdminModule, AuthModule, type AuthTokens, type BecomeSellerInput, type BlockedIp, type Business, BusinessesModule, CONDITIONS, type CartItem, CartModule, type Category, type ChangePasswordInput, type City, type CompleteOnboardingInput, type Condition, type Conversation, type CreateListingInput, type CreateOrderInput, type CreateReviewInput, type CreateStoreInput, DESIRED_RESOLUTIONS, DISPUTE_REASONS, DISPUTE_STATUSES, type DeliveryAddress, type DesiredResolution, type Dispute, type DisputeEvent, type DisputeEvidence, type DisputeListParams, type DisputeReason, type DisputeStatus, DisputesModule, type EmailLoginInput, type EmailRegisterInput, type ForgotPasswordInput, IDBTokenStore, LISTING_STATUSES, type LinkedAccount, type LinkedAccountProvider, type Listing, type ListingImage, type ListingStatus, type ListingsFeedParams, ListingsModule, type LoginInput, MailerModule, type MailerTemplate, MemoryTokenStore, type Message, type MessageResponse, MessagesModule, MitumbaClient, type MitumbaClientConfig, type MpesaInput, type Notification, type NotificationPref, type NotificationType, NotificationsModule, ORDER_STATUSES, type Order, type OrderEvent, type OrderHistoryParams, type OrderStatus, OrdersModule, PAYMENT_STATUSES, type PaginatedResponse, PayModule, type PaymentMethod, type PaymentMethodType, type PaymentStatus, type PaymentStatusResponse, type PaystackInitResponse, type PaystackInput, type PhoneLoginInput, type PhoneRegisterInput, type PresignImageResponse, type RaiseDisputeInput, type RegisterInput, type RequestOptions, type ResetPasswordInput, type ResolveDisputeInput, type RespondDisputeInput, type Review, type ReviewableOrder, ReviewsModule, type SaveSearchInput, type SearchHistoryItem, SearchModule, type SearchParams, type SearchResult, type SellerProfile, type SellerStorefront, type SendEmailInput, type SendMessageInput, type SendOtpInput, type Session, SettingsModule, type SimilarListing, type StkPushInput, type StkPushResponse, type Store, type StoreAnalytics, type StoreSettings, type StoreStats, StoresModule, type SubscriptionTier, type SystemStats, type TokenStore, type TransitionOrderInput, type TrendingTerm, type TwoFactorRequired, type UpdateBusinessInput, type UpdateListingInput, type UpdateProfileInput, type UpdateStoreInput, type UserProfile, type VAZIOutfit, type VAZIOutfitDetail, type VAZIOutfitDetailItem, type VAZIOutfitItem, type VaziFeedParams, type VaziFeedResponse, VaziModule, type Verify2FAInput, type VerifyOtpInput, type WishlistListing, WishlistsModule, createTokenStore };
1586
+ export { APIClient, APIError, type APIErrorResponse, type AddAddressInput, type AddPaymentMethodInput, type Address, AdminModule, AuthModule, type AuthTokens, type BecomeSellerInput, type BlockedIp, type Business, BusinessesModule, CONDITIONS, type CartItem, CartModule, type Category, type ChangePasswordInput, type City, type CompleteOnboardingInput, type Condition, type Conversation, type CreateListingInput, type CreateOrderInput, type CreateReviewInput, type CreateStoreInput, DESIRED_RESOLUTIONS, DISPUTE_REASONS, DISPUTE_STATUSES, type DeliveryAddress, type DesiredResolution, type Dispute, type DisputeEvent, type DisputeEvidence, type DisputeListParams, type DisputeReason, type DisputeStatus, DisputesModule, type EmailLoginInput, type EmailRegisterInput, type ForgotPasswordInput, IDBTokenStore, LISTING_STATUSES, type LinkedAccount, type LinkedAccountProvider, type Listing, type ListingImage, type ListingStatus, type ListingsFeedParams, ListingsModule, type LoginInput, MailerModule, type MailerTemplate, MemoryTokenStore, type Message, type MessageResponse, MessagesModule, MitumbaClient, type MitumbaClientConfig, type MpesaInput, type Notification, type NotificationPref, type NotificationType, NotificationsModule, ORDER_STATUSES, type Order, type OrderEvent, type OrderHistoryParams, type OrderStatus, OrdersModule, PAYMENT_STATUSES, type PaginatedResponse, PayModule, type PaymentMethod, type PaymentMethodType, type PaymentStatus, type PaymentStatusResponse, type PaystackInitResponse, type PaystackInput, type PhoneLoginInput, type PhoneRegisterInput, type PresignImageResponse, type RaiseDisputeInput, type RegisterInput, type RequestOptions, type ResetPasswordInput, type ResolveDisputeInput, type RespondDisputeInput, type Review, type ReviewableOrder, ReviewsModule, type SaveSearchInput, type SearchHistoryItem, SearchModule, type SearchParams, type SearchResult, type SellerProfile, type SellerStorefront, type SendEmailInput, type SendMessageInput, type SendOtpInput, type Session, SettingsModule, type SimilarListing, type StkPushInput, type StkPushResponse, type Store, type StoreAnalytics, type StoreSettings, type StoreStats, StoresModule, type SubscriptionTier, type SystemStats, type TokenStore, type TransitionOrderInput, type TrendingTerm, type TwoFactorRequired, type UpdateBusinessInput, type UpdateListingInput, type UpdateProfileInput, type UpdateStoreInput, UploadsModule, type UserProfile, type VAZIOutfit, type VAZIOutfitDetail, type VAZIOutfitDetailItem, type VAZIOutfitItem, type VaziFeedParams, type VaziFeedResponse, VaziModule, type Verify2FAInput, type VerifyOtpInput, type WishlistListing, WishlistsModule, createTokenStore };
package/dist/index.js CHANGED
@@ -1157,6 +1157,20 @@ var DisputesModule = class {
1157
1157
  }
1158
1158
  };
1159
1159
 
1160
+ // src/modules/uploads.ts
1161
+ var UploadsModule = class {
1162
+ constructor(client) {
1163
+ this.client = client;
1164
+ }
1165
+ client;
1166
+ /** Upload a file (avatar, evidence, etc). Returns the public CDN URL. */
1167
+ async upload(file, options) {
1168
+ const formData = new FormData();
1169
+ formData.append("file", file);
1170
+ return this.client.post("/listings/uploads", formData, options);
1171
+ }
1172
+ };
1173
+
1160
1174
  // src/types/listings.ts
1161
1175
  var CONDITIONS = ["new", "like_new", "good", "fair"];
1162
1176
  var LISTING_STATUSES = ["draft", "active", "sold", "removed"];
@@ -1202,6 +1216,7 @@ var MitumbaClient = class {
1202
1216
  businesses;
1203
1217
  admin;
1204
1218
  disputes;
1219
+ uploads;
1205
1220
  constructor(config) {
1206
1221
  this.api = new APIClient(config);
1207
1222
  this.auth = new AuthModule(this.api);
@@ -1221,6 +1236,7 @@ var MitumbaClient = class {
1221
1236
  this.businesses = new BusinessesModule(this.api);
1222
1237
  this.admin = new AdminModule(this.api);
1223
1238
  this.disputes = new DisputesModule(this.api);
1239
+ this.uploads = new UploadsModule(this.api);
1224
1240
  }
1225
1241
  /**
1226
1242
  * Set the access token for authenticated requests.
@@ -1282,6 +1298,7 @@ exports.ReviewsModule = ReviewsModule;
1282
1298
  exports.SearchModule = SearchModule;
1283
1299
  exports.SettingsModule = SettingsModule;
1284
1300
  exports.StoresModule = StoresModule;
1301
+ exports.UploadsModule = UploadsModule;
1285
1302
  exports.VaziModule = VaziModule;
1286
1303
  exports.WishlistsModule = WishlistsModule;
1287
1304
  exports.createTokenStore = createTokenStore;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/token-store.ts","../src/client.ts","../src/modules/auth.ts","../src/modules/listings.ts","../src/modules/search.ts","../src/modules/orders.ts","../src/modules/pay.ts","../src/modules/vazi.ts","../src/modules/messages.ts","../src/modules/notifications.ts","../src/modules/stores.ts","../src/modules/reviews.ts","../src/modules/wishlists.ts","../src/modules/cart.ts","../src/modules/settings.ts","../src/modules/mailer.ts","../src/modules/businesses.ts","../src/modules/admin.ts","../src/modules/disputes.ts","../src/types/listings.ts","../src/types/orders.ts","../src/types/pay.ts","../src/types/disputes.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export interface TokenStore {\n getAccessToken(): Promise<string | null>\n getRefreshToken(): Promise<string | null>\n setTokens(access: string, refresh: string): Promise<void>\n clear(): Promise<void>\n}\n\nexport class MemoryTokenStore implements TokenStore {\n private accessToken: string | null = null\n private refreshToken: string | null = null\n\n async getAccessToken(): Promise<string | null> { return this.accessToken }\n async getRefreshToken(): Promise<string | null> { return this.refreshToken }\n async setTokens(access: string, refresh: string): Promise<void> {\n this.accessToken = access\n this.refreshToken = refresh\n }\n async clear(): Promise<void> {\n this.accessToken = null\n this.refreshToken = null\n }\n}\n\nconst DB_NAME = 'mitumba_sdk'\nconst STORE_NAME = 'tokens'\nconst KEY = 'auth'\n\nexport class IDBTokenStore implements TokenStore {\n private dbPromise: Promise<IDBDatabase> | null = null\n\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, 1)\n request.onupgradeneeded = () => {\n request.result.createObjectStore(STORE_NAME)\n }\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n return this.dbPromise\n }\n\n private async get(): Promise<{ access: string; refresh: string } | null> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly')\n const req = tx.objectStore(STORE_NAME).get(KEY)\n req.onsuccess = () => resolve(req.result || null)\n req.onerror = () => reject(req.error)\n })\n }\n\n async getAccessToken(): Promise<string | null> {\n const data = await this.get()\n return data?.access ?? null\n }\n\n async getRefreshToken(): Promise<string | null> {\n const data = await this.get()\n return data?.refresh ?? null\n }\n\n async setTokens(access: string, refresh: string): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).put({ access, refresh }, KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n\n async clear(): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).delete(KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n}\n\n/** Creates IDBTokenStore if indexedDB is available, otherwise MemoryTokenStore. */\nexport function createTokenStore(): TokenStore {\n if (typeof indexedDB !== 'undefined') {\n return new IDBTokenStore()\n }\n return new MemoryTokenStore()\n}\n","import { MitumbaClientConfig, APIErrorResponse, RequestOptions } from './types'\nimport { TokenStore, createTokenStore } from './token-store'\n\nexport class APIError extends Error {\n public readonly code: string\n public readonly status: number\n public readonly details?: unknown\n\n constructor(status: number, data: APIErrorResponse) {\n super(data.message || data.error)\n this.name = 'APIError'\n this.code = data.error\n this.status = status\n this.details = data.details\n }\n}\n\nfunction isExpiringSoon(token: string, thresholdSeconds: number): boolean {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]))\n const exp = payload.exp as number\n return exp - (Date.now() / 1000) < thresholdSeconds\n } catch {\n return false\n }\n}\n\nexport class APIClient {\n private config: MitumbaClientConfig\n private tokenStore: TokenStore\n private isRefreshing = false\n private refreshPromise: Promise<void> | null = null\n\n constructor(config: MitumbaClientConfig) {\n this.config = config\n this.tokenStore = config.tokenStore ?? createTokenStore()\n\n // Seed store from config if tokens provided\n if (config.token) {\n this.tokenStore.setTokens(config.token, config.refreshToken ?? '')\n }\n }\n\n public async setToken(token: string, refreshToken?: string): Promise<void> {\n this.config.token = token\n if (refreshToken) {\n this.config.refreshToken = refreshToken\n }\n await this.tokenStore.setTokens(token, refreshToken ?? this.config.refreshToken ?? '')\n }\n\n public getToken(): string | undefined {\n return this.config.token\n }\n\n public getBaseUrl(): string {\n return this.config.baseUrl\n }\n\n public async clearToken(): Promise<void> {\n this.config.token = undefined\n this.config.refreshToken = undefined\n await this.tokenStore.clear()\n }\n\n /**\n * Check if user has a stored session (access or refresh token available).\n */\n public async isAuthenticated(): Promise<boolean> {\n const access = this.config.token ?? await this.tokenStore.getAccessToken()\n if (access) return true\n const refresh = await this.tokenStore.getRefreshToken()\n return !!refresh\n }\n\n /**\n * Hydrate tokens from the store into memory (call on app boot).\n */\n public async hydrate(): Promise<void> {\n const access = await this.tokenStore.getAccessToken()\n const refresh = await this.tokenStore.getRefreshToken()\n if (access) this.config.token = access\n if (refresh) this.config.refreshToken = refresh\n }\n\n private async ensureFreshToken(): Promise<void> {\n // Try hydrating from store if no in-memory token\n if (!this.config.token) {\n const stored = await this.tokenStore.getAccessToken()\n if (stored) this.config.token = stored\n const refresh = await this.tokenStore.getRefreshToken()\n if (refresh) this.config.refreshToken = refresh\n }\n\n // Proactive refresh if token expires within 60 seconds\n if (this.config.token && isExpiringSoon(this.config.token, 60) && this.config.refreshToken) {\n await this.handleTokenRefresh()\n }\n }\n\n private async request<T>(\n method: string, \n path: string, \n body?: unknown, \n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions\n ): Promise<T> {\n // Proactive refresh before request (skip for auth endpoints)\n if (!path.includes('/auth/refresh') && !path.includes('/auth/login') && !path.includes('/auth/register')) {\n await this.ensureFreshToken()\n }\n\n const url = new URL(path, this.config.baseUrl)\n \n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n }\n }\n\n const headers = new Headers()\n if (body && !(body instanceof FormData)) {\n headers.set('Content-Type', 'application/json')\n }\n\n if (this.config.token) {\n headers.set('Authorization', `Bearer ${this.config.token}`)\n }\n\n const init: RequestInit = {\n method,\n headers,\n body: body instanceof FormData ? body : body ? JSON.stringify(body) : undefined,\n signal: options?.signal\n }\n\n const maxRetries = this.config.maxRetries ?? 3\n let attempt = 0\n let response: Response\n\n while (true) {\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()}`)\n }\n \n const startTime = Date.now()\n try {\n response = await fetch(url.toString(), init)\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw err\n }\n if (attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] Network error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n throw new APIError(0, { error: 'network_error', message: err instanceof Error ? err.message : 'Network request failed' })\n }\n\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()} - ${response.status} (${Date.now() - startTime}ms)`)\n }\n\n if (response.status >= 500 && attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${response.status} error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n\n break\n }\n\n // Handle 401 — attempt refresh and retry\n if (response.status === 401 && this.config.refreshToken && !path.includes('/auth/refresh')) {\n try {\n await this.handleTokenRefresh()\n // Retry request with new token\n headers.set('Authorization', `Bearer ${this.config.token}`)\n response = await fetch(url.toString(), { ...init, headers })\n } catch {\n // Refresh failed — session is dead\n if (this.config.onAuthExpired) {\n this.config.onAuthExpired()\n }\n throw new APIError(401, { error: 'session_expired', message: 'Session expired. Please log in again.' })\n }\n }\n\n if (!response.ok) {\n let errorData: APIErrorResponse\n try {\n errorData = await response.json()\n } catch {\n errorData = { error: 'unknown_error', message: response.statusText }\n }\n throw new APIError(response.status, errorData)\n }\n\n if (response.status === 204) {\n return undefined as unknown as T\n }\n\n return response.json() as Promise<T>\n }\n\n private async handleTokenRefresh(): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.isRefreshing = true\n this.refreshPromise = (async () => {\n try {\n const url = new URL('/auth/refresh', this.config.baseUrl)\n const response = await fetch(url.toString(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refresh_token: this.config.refreshToken }),\n })\n\n if (!response.ok) {\n throw new Error('Refresh failed')\n }\n\n const data = await response.json() as { access_token: string, refresh_token: string }\n this.config.token = data.access_token\n this.config.refreshToken = data.refresh_token\n await this.tokenStore.setTokens(data.access_token, data.refresh_token)\n\n if (this.config.onTokenRefresh) {\n this.config.onTokenRefresh({ token: data.access_token, refreshToken: data.refresh_token })\n }\n } catch (err) {\n await this.clearToken()\n throw err\n } finally {\n this.isRefreshing = false\n this.refreshPromise = null\n }\n })()\n\n return this.refreshPromise\n }\n\n public get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, params, options)\n }\n\n public post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, undefined, options)\n }\n\n public put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, undefined, options)\n }\n\n public patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, body, undefined, options)\n }\n\n public delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, undefined, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n RegisterInput,\n LoginInput,\n SendOtpInput,\n VerifyOtpInput,\n ForgotPasswordInput,\n ResetPasswordInput,\n CompleteOnboardingInput,\n Verify2FAInput,\n TwoFactorRequired,\n BecomeSellerInput,\n UserProfile,\n AuthTokens,\n MessageResponse,\n RequestOptions,\n} from '../types'\n\nexport class AuthModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Register a new account.\n * If using EmailRegisterInput, returns AuthTokens.\n * If using PhoneRegisterInput, returns MessageResponse (OTP sent).\n */\n async register(input: RegisterInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse> {\n return this.client.post<AuthTokens | MessageResponse>('/auth/register', input, options)\n }\n\n /**\n * Log in to an existing account.\n * If using EmailLoginInput, returns AuthTokens (or TwoFactorRequired if 2FA enabled).\n * If using PhoneLoginInput, returns MessageResponse (OTP sent).\n */\n async login(input: LoginInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse | TwoFactorRequired> {\n return this.client.post<AuthTokens | MessageResponse | TwoFactorRequired>('/auth/login', input, options)\n }\n\n /**\n * Send an OTP code to a phone number.\n */\n async sendOtp(input: SendOtpInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/otp/send', input, options)\n }\n\n /**\n * Verify an OTP code.\n */\n async verifyOtp(input: VerifyOtpInput, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/otp/verify', input, options)\n }\n\n /**\n * Refresh the access token using a refresh token.\n */\n async refresh(input: { refresh_token: string }, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/refresh', input, options)\n }\n\n /**\n * Revoke the refresh token and log out.\n */\n async logout(input: { refresh_token: string }, options?: RequestOptions): Promise<{ ok: boolean }> {\n return this.client.post<{ ok: boolean }>('/auth/logout', input, options)\n }\n\n /**\n * Request a password reset email.\n * Sends a reset link to the provided email address.\n */\n async forgotPassword(input: ForgotPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/forgot-password', input, options)\n }\n\n /**\n * Reset the password using a token from the reset email.\n */\n async resetPassword(input: ResetPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/reset-password', input, options)\n }\n\n /**\n * Get the current authenticated user's profile.\n */\n async me(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n /**\n * Complete the onboarding flow.\n */\n async completeOnboarding(input: CompleteOnboardingInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/onboarding/complete', input, options)\n }\n\n /**\n * Verify 2FA code during login (when login returns requires_2fa).\n */\n async verify2FA(input: Verify2FAInput, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/2fa/login', input, options)\n }\n\n /**\n * Send a verification code to the user's email.\n * If unauthenticated, pass the email address.\n */\n async sendVerificationCode(email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/send', email ? { email } : undefined, options)\n }\n\n /**\n * Verify the email with the 6-digit code.\n * If unauthenticated, pass the email address.\n */\n async verifyEmail(code: string, email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/confirm', email ? { code, email } : { code }, options)\n }\n\n /**\n * Upgrade the current user to a seller role.\n * Idempotent — returns success if already a seller.\n */\n async becomeSeller(input: BecomeSellerInput, options?: RequestOptions): Promise<{ ok: true; roles: string[]; sti_score: number }> {\n return this.client.post<{ ok: true; roles: string[]; sti_score: number }>('/auth/become-seller', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n Category,\n City,\n Condition,\n CreateListingInput,\n Listing,\n ListingImage,\n ListingStatus,\n ListingsFeedParams,\n PaginatedResponse,\n PresignImageResponse,\n SellerStorefront,\n SimilarListing,\n Store,\n UpdateListingInput,\n RequestOptions,\n} from '../types'\n\nexport class ListingsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the marketplace feed with optional filters.\n */\n async getFeed(params?: ListingsFeedParams, options?: RequestOptions): Promise<PaginatedResponse<Listing>> {\n // APIClient handles converting params to string|number|boolean properly\n return this.client.get<PaginatedResponse<Listing>>(\n '/listings/feed', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get full details of a single listing, including its images.\n */\n async getById(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.client.get<Listing & { images: ListingImage[] }>(`/listings/${id}`, undefined, options)\n }\n\n /**\n * Create a new listing (requires seller role).\n */\n async create(input: CreateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.post<Listing>('/listings', input, options)\n }\n\n /**\n * Update an existing listing.\n */\n async update(id: string, input: UpdateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.put<Listing>(`/listings/${id}`, input, options)\n }\n\n /**\n * Change the status of a listing.\n */\n async updateStatus(id: string, status: ListingStatus, options?: RequestOptions): Promise<{ ok: boolean; status: ListingStatus }> {\n return this.client.patch<{ ok: boolean; status: ListingStatus }>(`/listings/${id}/status`, { status }, options)\n }\n\n /**\n * Soft delete a listing (sets status to 'removed').\n */\n async delete(id: string, options?: RequestOptions): Promise<{ ok: boolean }> {\n return this.client.delete<{ ok: boolean }>(`/listings/${id}`, options)\n }\n\n /**\n * Get a seller's public storefront.\n */\n async getSellerStorefront(\n sellerId: string,\n params?: { page?: number; page_size?: number },\n options?: RequestOptions\n ): Promise<SellerStorefront> {\n return this.client.get<SellerStorefront>(\n `/listings/seller/${sellerId}`, \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * List all supported categories.\n */\n async getCategories(options?: RequestOptions): Promise<Category[]> {\n return this.client.get<Category[]>('/listings/categories', undefined, options)\n }\n\n /**\n * List all supported cities.\n */\n async getCities(options?: RequestOptions): Promise<City[]> {\n return this.client.get<City[]>('/listings/cities', undefined, options)\n }\n\n /**\n * Get trending listings, optionally filtered by category.\n */\n async getTrending(categoryId?: string, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n '/listings/trending',\n categoryId ? { category_id: categoryId } : undefined,\n options\n )\n }\n\n /**\n * Get top-performing stores for the home feed.\n */\n async getTopStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/top-stores', undefined, options)\n }\n\n /**\n * Get personalized \"for you\" listings (returns recent for anonymous users).\n */\n async getForYou(options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>('/listings/for-you', undefined, options)\n }\n\n /**\n * Get a presigned upload URL for a listing image.\n * Index should be between 0 and 9.\n */\n async presignImage(listingId: string, index: number, options?: RequestOptions): Promise<PresignImageResponse> {\n return this.client.post<PresignImageResponse>(`/listings/${listingId}/images/presign`, { index }, options)\n }\n\n /**\n * Upload an image file directly for a listing.\n * Uses multipart/form-data.\n */\n async uploadImage(listingId: string, file: Blob, index: number, options?: RequestOptions): Promise<{ r2_key: string; image_id: string; url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('index', String(index))\n return this.client.post<{ r2_key: string; image_id: string; url: string }>(`/listings/${listingId}/images/upload`, formData, options)\n }\n\n /**\n * Browse the listing feed (alias for getFeed with simplified params).\n */\n async feed(params?: { page?: number; city?: string; category?: string; sort?: string }, options?: RequestOptions): Promise<{ data: Listing[]; page: number }> {\n return this.client.get<{ data: Listing[]; page: number }>(\n '/listings',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a single listing by ID (alias for getById).\n */\n async get(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.getById(id, options)\n }\n\n /**\n * Full-text search with filters.\n */\n async search(params: { q: string; category?: string; condition?: Condition; min_price?: number; max_price?: number; sort?: string; page?: number }, options?: RequestOptions): Promise<{ data: Listing[]; total: number }> {\n return this.client.get<{ data: Listing[]; total: number }>(\n '/search',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get similar listings for a given listing.\n */\n async getSimilar(listingId: string, mode?: 'global' | 'store', options?: RequestOptions): Promise<{ data: SimilarListing[] }> {\n return this.client.get<{ data: SimilarListing[] }>(\n `/listings/${listingId}/similar`,\n mode ? { mode } : undefined,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type { PaginatedResponse, SearchParams, SearchResult, SearchHistoryItem, SaveSearchInput, TrendingTerm, RequestOptions } from '../types'\n\nexport class SearchModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Perform a full-text search with optional filters.\n */\n async query(params: SearchParams, options?: RequestOptions): Promise<PaginatedResponse<SearchResult>> {\n return this.client.get<PaginatedResponse<SearchResult>>(\n '/search', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get trending search terms.\n */\n async trending(params?: { city_id?: string }, options?: RequestOptions): Promise<{ terms: TrendingTerm[] }> {\n return this.client.get<{ terms: TrendingTerm[] }>(\n '/search/trending',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get the user's search history.\n */\n async getHistory(options?: RequestOptions): Promise<{ data: SearchHistoryItem[] }> {\n return this.client.get<{ data: SearchHistoryItem[] }>('/search/history', undefined, options)\n }\n\n /**\n * Save a search query to history.\n */\n async saveHistory(input: SaveSearchInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/search/history', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateOrderInput, Order, OrderEvent, OrderHistoryParams, OrderStatus, TransitionOrderInput, RequestOptions } from '../types'\n\nexport class OrdersModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Create a new order from a listing.\n */\n async create(input: CreateOrderInput, options?: RequestOptions): Promise<{ order_id: string; total: number; delivery_fee: number }> {\n return this.client.post<{ order_id: string; total: number; delivery_fee: number }>('/orders', input, options)\n }\n\n /**\n * Get full details of an order, including its event timeline.\n */\n async getById(id: string, options?: RequestOptions): Promise<Order & { events: OrderEvent[] }> {\n return this.client.get<Order & { events: OrderEvent[] }>(`/orders/${id}`, undefined, options)\n }\n\n /**\n * Transition the status of an order.\n */\n async transition(id: string, input: TransitionOrderInput, options?: RequestOptions): Promise<{ ok: boolean; status: OrderStatus }> {\n return this.client.post<{ ok: boolean; status: OrderStatus }>(`/orders/${id}/transition`, input, options)\n }\n\n /**\n * Get the order history for the current authenticated user.\n */\n async getHistory(params?: OrderHistoryParams, options?: RequestOptions): Promise<{ data: Order[]; page: number; page_size: number }> {\n return this.client.get<{ data: Order[]; page: number; page_size: number }>(\n '/orders/history',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type { MpesaInput, PaystackInput, PaystackInitResponse, PaymentStatusResponse, StkPushInput, StkPushResponse, RequestOptions } from '../types'\n\nexport class PayModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Initiate an M-Pesa STK Push payment for an order.\n */\n async initiateStk(input: StkPushInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate M-Pesa STK Push (alias for initiateStk).\n */\n async initMpesa(input: MpesaInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate a Paystack payment — returns access_code for inline popup.\n */\n async initPaystack(input: PaystackInput, options?: RequestOptions): Promise<PaystackInitResponse> {\n return this.client.post<PaystackInitResponse>('/pay/paystack/init', input, options)\n }\n\n /**\n * Poll for the current status of a payment by its order ID.\n */\n async getStatus(orderId: string, options?: RequestOptions): Promise<PaymentStatusResponse> {\n return this.client.get<PaymentStatusResponse>(`/pay/status/${orderId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { VAZIOutfit, VAZIOutfitDetail, VaziFeedParams, VaziFeedResponse, RequestOptions } from '../types'\n\nexport class VaziModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the AI-curated outfit feed.\n */\n async getFeed(params?: VaziFeedParams, options?: RequestOptions): Promise<VaziFeedResponse> {\n return this.client.get<VaziFeedResponse>(\n '/vazi/feed',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a complete outfit built around a specific seed listing.\n */\n async getCompleteLook(listingId: string, options?: RequestOptions): Promise<{ outfits: VAZIOutfit[] }> {\n return this.client.get<{ outfits: VAZIOutfit[] }>(`/vazi/complete/${listingId}`, undefined, options)\n }\n\n /**\n * Get a single outfit by ID with full item details.\n */\n async getOutfit(outfitId: string, options?: RequestOptions): Promise<VAZIOutfitDetail> {\n return this.client.get<VAZIOutfitDetail>(`/vazi/outfits/${outfitId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Conversation, Message, SendMessageInput, RequestOptions } from '../types'\n\nexport class MessagesModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List all conversations for the authenticated user.\n */\n async list(storeId?: string, options?: RequestOptions): Promise<{ data: Conversation[] }> {\n return this.client.get<{ data: Conversation[] }>(\n '/notify/messages',\n storeId ? { store_id: storeId } : undefined,\n options\n )\n }\n\n /**\n * Get the message thread with a specific partner.\n */\n async getThread(partnerId: string, storeId?: string, options?: RequestOptions): Promise<{ data: Message[] }> {\n return this.client.get<{ data: Message[] }>(\n `/notify/messages/${partnerId}`,\n storeId ? { store_id: storeId } : undefined,\n options\n )\n }\n\n /**\n * Send a message to another user.\n */\n async send(input: SendMessageInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/notify/messages', input, options)\n }\n\n /**\n * Mark all messages from a partner as read.\n */\n async markRead(partnerId: string, storeId?: string, options?: RequestOptions): Promise<{ ok: true }> {\n const path = storeId\n ? `/notify/messages/${partnerId}/read?store_id=${storeId}`\n : `/notify/messages/${partnerId}/read`\n return this.client.post<{ ok: true }>(path, undefined, options)\n }\n\n /**\n * Connect to the typing indicator WebSocket for a conversation.\n * Token is passed via query param since WebSocket can't set headers.\n */\n connectTyping(partnerId: string): WebSocket {\n const token = this.client.getToken()\n const wsUrl = this.client.getBaseUrl().replace(/^http/, 'ws') + `/notify/messages/${partnerId}/ws?token=${token}`\n return new WebSocket(wsUrl)\n }\n}\n","import { APIClient } from '../client'\nimport type { Notification, RequestOptions } from '../types'\n\nexport class NotificationsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List paginated notifications with unread count.\n */\n async list(page?: number, options?: RequestOptions): Promise<{ data: Notification[]; unread_count: number; page: number }> {\n return this.client.get<{ data: Notification[]; unread_count: number; page: number }>(\n '/notify/notifications',\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Mark notifications as read. If ids omitted, marks all as read.\n */\n async markRead(ids?: string[], options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/notifications/read', ids ? { ids } : {}, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateStoreInput, UpdateStoreInput, StoreStats, StoreSettings, StoreAnalytics, Listing, Store, RequestOptions } from '../types'\n\nexport class StoresModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Get a store by its URL slug.\n */\n async getBySlug(slug: string, options?: RequestOptions): Promise<Store> {\n return this.client.get<Store>(`/listings/stores/${slug}`, undefined, options)\n }\n\n /**\n * Follow a store.\n */\n async follow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/stores/${storeId}/follow`, undefined, options)\n }\n\n /**\n * Unfollow a store.\n */\n async unfollow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/stores/${storeId}/follow`, options)\n }\n\n /**\n * Get paginated listings for a specific store.\n */\n async getListings(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n `/listings/stores/${storeId}/listings`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Get all stores owned by the authenticated user.\n */\n async getMyStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/stores/mine', undefined, options)\n }\n\n /**\n * Create a new store.\n */\n async create(input: CreateStoreInput, options?: RequestOptions): Promise<{ id: string; slug: string }> {\n return this.client.post<{ id: string; slug: string }>('/listings/stores', input, options)\n }\n\n /**\n * Update a store's details.\n */\n async update(storeId: string, input: UpdateStoreInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}`, input, options)\n }\n\n /**\n * Get store statistics.\n */\n async getStats(storeId: string, options?: RequestOptions): Promise<StoreStats> {\n return this.client.get<StoreStats>(`/listings/stores/${storeId}/stats`, undefined, options)\n }\n\n /**\n * Get store settings.\n */\n async getSettings(storeId: string, options?: RequestOptions): Promise<StoreSettings> {\n return this.client.get<StoreSettings>(`/listings/stores/${storeId}/settings`, undefined, options)\n }\n\n /**\n * Update store settings (partial).\n */\n async updateSettings(storeId: string, input: Partial<StoreSettings>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}/settings`, input, options)\n }\n\n /**\n * Get store analytics.\n */\n async getAnalytics(storeId: string, period?: 'daily' | 'weekly' | 'monthly', options?: RequestOptions): Promise<StoreAnalytics> {\n return this.client.get<StoreAnalytics>(\n `/listings/stores/${storeId}/analytics`,\n period ? { period } : undefined,\n options\n )\n }\n\n /**\n * Upload a store logo image.\n */\n async uploadLogo(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/logo`, formData, options)\n }\n\n /**\n * Upload a store banner image.\n */\n async uploadBanner(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/banner`, formData, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateReviewInput, Review, ReviewableOrder, RequestOptions } from '../types'\n\nexport class ReviewsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List reviews for a store (public).\n */\n async list(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Review[]; total: number; avg_rating: number; page: number }> {\n return this.client.get<{ data: Review[]; total: number; avg_rating: number; page: number }>(\n `/listings/stores/${storeId}/reviews`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Create a review for a store (authenticated).\n */\n async create(storeId: string, input: CreateReviewInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>(`/listings/stores/${storeId}/reviews`, input, options)\n }\n\n /**\n * Get orders eligible for review (delivered/completed, not yet reviewed).\n */\n async getReviewableOrders(storeId: string, options?: RequestOptions): Promise<{ data: ReviewableOrder[] }> {\n return this.client.get<{ data: ReviewableOrder[] }>(`/listings/stores/${storeId}/reviews/eligible`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { WishlistListing, RequestOptions } from '../types'\n\nexport class WishlistsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List saved listings.\n */\n async list(options?: RequestOptions): Promise<{ data: WishlistListing[] }> {\n return this.client.get<{ data: WishlistListing[] }>('/listings/wishlists', undefined, options)\n }\n\n /**\n * Add a listing to the wishlist.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/wishlists/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the wishlist.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/wishlists/${listingId}`, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CartItem, RequestOptions } from '../types'\n\nexport class CartModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List items in the cart.\n */\n async list(options?: RequestOptions): Promise<{ data: CartItem[] }> {\n return this.client.get<{ data: CartItem[] }>('/listings/cart', undefined, options)\n }\n\n /**\n * Add a listing to the cart.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/cart/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the cart.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/cart/${listingId}`, options)\n }\n\n /**\n * Update the quantity of a cart item.\n */\n async updateQuantity(listingId: string, quantity: number, options?: RequestOptions): Promise<{ ok: true; quantity: number }> {\n return this.client.patch<{ ok: true; quantity: number }>(`/listings/cart/${listingId}`, { quantity }, options)\n }\n\n /**\n * Checkout the cart — creates orders grouped by store and clears the cart.\n */\n async checkout(options?: RequestOptions): Promise<{ order_ids: string[]; count: number }> {\n return this.client.post<{ order_ids: string[]; count: number }>('/orders/checkout', undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n UpdateProfileInput,\n ChangePasswordInput,\n Session,\n NotificationPref,\n Address,\n AddAddressInput,\n PaymentMethod,\n AddPaymentMethodInput,\n LinkedAccount,\n LinkedAccountProvider,\n UserProfile,\n RequestOptions,\n} from '../types'\n\nexport class SettingsModule {\n constructor(private readonly client: APIClient) {}\n\n // ── Profile ──\n\n async getProfile(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n async updateProfile(input: UpdateProfileInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/me', input, options)\n }\n\n // ── Security ──\n\n async changePassword(input: ChangePasswordInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/change-password', input, options)\n }\n\n async getSessions(options?: RequestOptions): Promise<{ data: Session[] }> {\n return this.client.get<{ data: Session[] }>('/auth/sessions', undefined, options)\n }\n\n async revokeSession(sessionId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/sessions/${sessionId}`, options)\n }\n\n // ── Notification Preferences ──\n\n async getNotificationPrefs(options?: RequestOptions): Promise<{ data: NotificationPref[] }> {\n return this.client.get<{ data: NotificationPref[] }>('/auth/notification-prefs', undefined, options)\n }\n\n async updateNotificationPref(channel: string, enabled: boolean, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/notification-prefs/${channel}`, { enabled }, options)\n }\n\n // ── Preferences ──\n\n async getPreferences(options?: RequestOptions): Promise<{ data: Record<string, string> }> {\n return this.client.get<{ data: Record<string, string> }>('/auth/preferences', undefined, options)\n }\n\n async updatePreferences(prefs: Record<string, string>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/preferences', { prefs }, options)\n }\n\n // ── Addresses ──\n\n async getAddresses(options?: RequestOptions): Promise<{ data: Address[] }> {\n return this.client.get<{ data: Address[] }>('/auth/addresses', undefined, options)\n }\n\n async addAddress(input: AddAddressInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/addresses', input, options)\n }\n\n async updateAddress(id: string, input: Partial<AddAddressInput>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/addresses/${id}`, input, options)\n }\n\n async deleteAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/addresses/${id}`, options)\n }\n\n async setDefaultAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/addresses/${id}/default`, undefined, options)\n }\n\n // ── Payment Methods ──\n\n async getPaymentMethods(options?: RequestOptions): Promise<{ data: PaymentMethod[] }> {\n return this.client.get<{ data: PaymentMethod[] }>('/auth/payment-methods', undefined, options)\n }\n\n async addPaymentMethod(input: AddPaymentMethodInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/payment-methods', input, options)\n }\n\n async deletePaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/payment-methods/${id}`, options)\n }\n\n async setDefaultPaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/payment-methods/${id}/default`, undefined, options)\n }\n\n // ── Linked Accounts ──\n\n async getLinkedAccounts(options?: RequestOptions): Promise<{ data: LinkedAccount[] }> {\n return this.client.get<{ data: LinkedAccount[] }>('/auth/linked-accounts', undefined, options)\n }\n\n async linkAccount(provider: LinkedAccountProvider, token: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/linked-accounts', { provider, token }, options)\n }\n\n async unlinkAccount(provider: LinkedAccountProvider, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/linked-accounts/${provider}`, options)\n }\n\n // ── 2FA ──\n\n async setup2FA(options?: RequestOptions): Promise<{ secret: string; otpauth_uri: string }> {\n return this.client.post<{ secret: string; otpauth_uri: string }>('/auth/2fa/setup', undefined, options)\n }\n\n async verify2FA(code: string, options?: RequestOptions): Promise<{ ok: true; backup_codes: string[] }> {\n return this.client.post<{ ok: true; backup_codes: string[] }>('/auth/2fa/verify', { code }, options)\n }\n\n async disable2FA(code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/2fa/disable', { code }, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { MailerTemplate, SendEmailInput, RequestOptions } from '../types'\n\nexport class MailerModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Send a transactional email via the notifications worker.\n */\n async send(template: MailerTemplate, input: SendEmailInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/email', { template, ...input }, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Business, UpdateBusinessInput, RequestOptions } from '../types'\n\nexport class BusinessesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Get all businesses owned by the current user. */\n async getMine(options?: RequestOptions): Promise<{ data: Business[] }> {\n return this.client.get<{ data: Business[] }>('/listings/businesses/mine', undefined, options)\n }\n\n /** Get a business by ID. */\n async getById(id: string, options?: RequestOptions): Promise<Business> {\n return this.client.get<Business>(`/listings/businesses/${id}`, undefined, options)\n }\n\n /** Update a business. */\n async update(id: string, input: UpdateBusinessInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/businesses/${id}`, input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { BlockedIp, SystemStats, RequestOptions } from '../types'\n\nexport class AdminModule {\n constructor(private readonly client: APIClient) {}\n\n /** Block an IP address. Default duration: 24 hours. */\n async blockIp(ip: string, durationHours?: number, options?: RequestOptions): Promise<{ ok: true; blocked: string; hours: number }> {\n return this.client.post<{ ok: true; blocked: string; hours: number }>('/admin/block-ip', { ip, duration_hours: durationHours ?? 24 }, options)\n }\n\n /** Unblock an IP address. */\n async unblockIp(ip: string, options?: RequestOptions): Promise<{ ok: true; unblocked: string }> {\n return this.client.post<{ ok: true; unblocked: string }>('/admin/unblock-ip', { ip }, options)\n }\n\n /** List currently blocked IPs. */\n async getBlockedIps(options?: RequestOptions): Promise<{ data: BlockedIp[] }> {\n return this.client.get<{ data: BlockedIp[] }>('/admin/blocked-ips', undefined, options)\n }\n\n /** Get platform-wide statistics. */\n async getSystemStats(options?: RequestOptions): Promise<SystemStats> {\n return this.client.get<SystemStats>('/admin/stats', undefined, options)\n }\n\n /** Suspend a user account. */\n async suspendUser(userId: string, reason: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/suspend`, { reason }, options)\n }\n\n /** Unsuspend a user account. */\n async unsuspendUser(userId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/unsuspend`, undefined, options)\n }\n\n /** Grant verified badge to a store. */\n async verifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/verify`, undefined, options)\n }\n\n /** Revoke verified badge from a store. */\n async unverifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/unverify`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Dispute, RaiseDisputeInput, RespondDisputeInput, ResolveDisputeInput, DisputeListParams, RequestOptions } from '../types'\n\nexport class DisputesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Raise a dispute on an order (buyer). */\n async raise(orderId: string, input: RaiseDisputeInput, options?: RequestOptions): Promise<{ dispute_id: string; status: 'open' }> {\n return this.client.post<{ dispute_id: string; status: 'open' }>(`/orders/${orderId}/dispute`, input, options)\n }\n\n /** Get the dispute for a specific order. */\n async getForOrder(orderId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/${orderId}/dispute`, undefined, options)\n }\n\n /** Get a dispute by ID. */\n async get(disputeId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/disputes/${disputeId}`, undefined, options)\n }\n\n /** Add evidence to a dispute. */\n async addEvidence(disputeId: string, input: { type: 'image' | 'text'; content: string }, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/orders/disputes/${disputeId}/evidence`, input, options)\n }\n\n /** Escalate a dispute to admin review (buyer). */\n async escalate(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'under_review' }> {\n return this.client.post<{ ok: true; status: 'under_review' }>(`/orders/disputes/${disputeId}/escalate`, undefined, options)\n }\n\n /** Withdraw a dispute (buyer). */\n async withdraw(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'withdrawn' }> {\n return this.client.post<{ ok: true; status: 'withdrawn' }>(`/orders/disputes/${disputeId}/withdraw`, undefined, options)\n }\n\n /** Respond to a dispute (seller). */\n async respond(disputeId: string, input: RespondDisputeInput, options?: RequestOptions): Promise<{ ok: true; status?: string; voluntary?: boolean }> {\n return this.client.post<{ ok: true; status?: string; voluntary?: boolean }>(`/orders/disputes/${disputeId}/respond`, input, options)\n }\n\n /** List all disputes (admin). */\n async list(params?: DisputeListParams, options?: RequestOptions): Promise<{ data: Dispute[]; page: number; page_size: number }> {\n return this.client.get<{ data: Dispute[]; page: number; page_size: number }>(\n '/orders/disputes',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /** Resolve a dispute (admin). */\n async resolve(disputeId: string, input: ResolveDisputeInput, options?: RequestOptions): Promise<{ ok: true; status: string; sti_impact: number }> {\n return this.client.post<{ ok: true; status: string; sti_impact: number }>(`/orders/disputes/${disputeId}/resolve`, input, options)\n }\n}\n","export const CONDITIONS = ['new', 'like_new', 'good', 'fair'] as const\nexport type Condition = typeof CONDITIONS[number]\n\nexport const LISTING_STATUSES = ['draft', 'active', 'sold', 'removed'] as const\nexport type ListingStatus = typeof LISTING_STATUSES[number]\n\nexport interface ListingImage {\n id: string\n listing_id: string\n url: string\n position: number\n created_at: string\n}\n\nexport interface SellerProfile {\n id: string\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n}\n\nexport interface Listing {\n id: string\n seller_id: string\n title: string\n description: string | null\n category_id: string\n city_id: string\n price: number // KES integer\n condition: Condition\n status: ListingStatus\n photo_verified: boolean\n vazi_eligible: boolean\n size: string | null\n created_at: string\n updated_at: string\n // Seller profile (joined)\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n // Images (only present on GET /listings/:id, not in feed)\n images?: ListingImage[]\n // First image as full CDN URL (present in feeds/store listings)\n image_url?: string | null\n}\n\nexport interface ListingsFeedParams {\n city_id?: string\n category_id?: string\n min_price?: number\n max_price?: number\n condition?: Condition\n sort?: 'recency' | 'price_asc' | 'price_desc'\n page?: number\n page_size?: number\n}\n\nexport interface CreateListingInput {\n store_id: string\n title: string\n description?: string\n category_id: string\n city_id: string\n price: number\n condition: Condition\n size?: string\n vazi_eligible?: boolean\n}\n\nexport type UpdateListingInput = Partial<CreateListingInput>\n\nexport interface Category {\n id: string\n name: string\n slug: string\n}\n\nexport interface City {\n id: string\n name: string\n delivery_fee: number\n}\n\nexport interface SellerStorefront {\n seller: SellerProfile\n listings: Listing[]\n total: number\n page: number\n page_size: number\n has_more: boolean\n}\n\nexport interface PresignImageResponse {\n r2_key: string\n image_id: string\n}\n\nexport interface SimilarListing {\n id: string\n title: string\n price: number\n condition: string\n category_id: string\n store_id: string | null\n image_keys: string | null\n created_at: string\n}\n","export const ORDER_STATUSES = [\n 'created',\n 'payment_pending',\n 'paid',\n 'seller_confirmed',\n 'shipped',\n 'delivered',\n 'completed',\n 'cancelled',\n 'disputed',\n] as const\n\nexport type OrderStatus = typeof ORDER_STATUSES[number]\n\nexport interface OrderEvent {\n id: string\n order_id: string\n actor: string // user ID or 'system'\n old_status: string\n new_status: string\n note: string | null\n created_at: string\n}\n\nexport interface DeliveryAddress {\n label: string\n line1: string\n city: string\n county: string\n phone: string\n}\n\nexport interface Order {\n id: string\n buyer_id: string\n seller_id: string\n listing_id: string\n amount: number\n delivery_fee: number\n total: number\n status: OrderStatus\n city_id: string\n created_at: string\n updated_at: string\n // Joined listing details\n listing_title: string | null\n listing_image_url: string | null\n listing_condition: string | null\n listing_size: string | null\n // Joined buyer details\n buyer_name: string | null\n buyer_phone: string | null\n // Buyer's default delivery address\n delivery_address: DeliveryAddress | null\n events?: OrderEvent[]\n}\n\nexport interface CreateOrderInput {\n listing_id: string\n}\n\nexport interface TransitionOrderInput {\n status: OrderStatus\n note?: string\n}\n\nexport interface OrderHistoryParams {\n role?: 'buyer' | 'seller'\n store_id?: string\n page?: number\n}\n","export interface StkPushInput {\n order_id: string\n phone: string // format: +254XXXXXXXXX\n}\n\nexport type MpesaInput = StkPushInput\n\nexport interface StkPushResponse {\n payment_id: string\n provider: string\n}\n\nexport interface PaystackInput {\n order_id: string\n email: string\n}\n\nexport interface PaystackInitResponse {\n access_code: string\n authorization_url: string\n reference: string\n}\n\nexport const PAYMENT_STATUSES = ['initiated', 'funded', 'failed', 'refunded', 'cancelled'] as const\nexport type PaymentStatus = typeof PAYMENT_STATUSES[number]\n\nexport interface PaymentStatusResponse {\n id: string\n status: PaymentStatus\n total: number\n}\n","export const DISPUTE_REASONS = ['not_received', 'not_as_described', 'damaged', 'counterfeit', 'wrong_item'] as const\nexport type DisputeReason = typeof DISPUTE_REASONS[number]\n\nexport const DESIRED_RESOLUTIONS = ['refund', 'replacement', 'partial_refund'] as const\nexport type DesiredResolution = typeof DESIRED_RESOLUTIONS[number]\n\nexport const DISPUTE_STATUSES = ['open', 'seller_responded', 'under_review', 'resolved_refund', 'resolved_release', 'resolved_partial', 'withdrawn'] as const\nexport type DisputeStatus = typeof DISPUTE_STATUSES[number]\n\nexport interface DisputeEvidence {\n id: string\n uploader_role: 'buyer' | 'seller' | 'admin'\n type: 'image' | 'text'\n content: string\n created_at: string\n}\n\nexport interface DisputeEvent {\n actor_role: 'buyer' | 'seller' | 'admin' | 'system'\n action: string\n old_status: string | null\n new_status: string | null\n note: string | null\n created_at: string\n}\n\nexport interface Dispute {\n id: string\n order_id: string\n buyer_id: string\n seller_id: string\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n status: DisputeStatus\n amount_disputed: number\n resolution: 'refund' | 'release' | 'partial' | null\n resolution_amount: number | null\n resolution_note: string | null\n sti_impact: number | null\n seller_responded_at: string | null\n escalated_at: string | null\n resolved_at: string | null\n created_at: string\n updated_at: string\n evidence?: DisputeEvidence[]\n events?: DisputeEvent[]\n}\n\nexport interface RaiseDisputeInput {\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n evidence_urls?: string[]\n}\n\nexport interface RespondDisputeInput {\n accept: boolean\n message?: string\n evidence_urls?: string[]\n}\n\nexport interface ResolveDisputeInput {\n resolution: 'refund' | 'release' | 'partial'\n amount?: number\n note?: string\n}\n\nexport interface DisputeListParams {\n status?: DisputeStatus\n page?: number\n}\n","import { APIClient } from './client'\nimport { MitumbaClientConfig } from './types'\nimport { AuthModule } from './modules/auth'\nimport { ListingsModule } from './modules/listings'\nimport { SearchModule } from './modules/search'\nimport { OrdersModule } from './modules/orders'\nimport { PayModule } from './modules/pay'\nimport { VaziModule } from './modules/vazi'\nimport { MessagesModule } from './modules/messages'\nimport { NotificationsModule } from './modules/notifications'\nimport { StoresModule } from './modules/stores'\nimport { ReviewsModule } from './modules/reviews'\nimport { WishlistsModule } from './modules/wishlists'\nimport { CartModule } from './modules/cart'\nimport { SettingsModule } from './modules/settings'\nimport { MailerModule } from './modules/mailer'\nimport { BusinessesModule } from './modules/businesses'\nimport { AdminModule } from './modules/admin'\nimport { DisputesModule } from './modules/disputes'\n\nexport class MitumbaClient {\n public readonly api: APIClient\n public readonly auth: AuthModule\n public readonly listings: ListingsModule\n public readonly search: SearchModule\n public readonly orders: OrdersModule\n public readonly pay: PayModule\n public readonly vazi: VaziModule\n public readonly messages: MessagesModule\n public readonly notifications: NotificationsModule\n public readonly stores: StoresModule\n public readonly reviews: ReviewsModule\n public readonly wishlists: WishlistsModule\n public readonly cart: CartModule\n public readonly settings: SettingsModule\n public readonly mailer: MailerModule\n public readonly businesses: BusinessesModule\n public readonly admin: AdminModule\n public readonly disputes: DisputesModule\n\n constructor(config: MitumbaClientConfig) {\n this.api = new APIClient(config)\n this.auth = new AuthModule(this.api)\n this.listings = new ListingsModule(this.api)\n this.search = new SearchModule(this.api)\n this.orders = new OrdersModule(this.api)\n this.pay = new PayModule(this.api)\n this.vazi = new VaziModule(this.api)\n this.messages = new MessagesModule(this.api)\n this.notifications = new NotificationsModule(this.api)\n this.stores = new StoresModule(this.api)\n this.reviews = new ReviewsModule(this.api)\n this.wishlists = new WishlistsModule(this.api)\n this.cart = new CartModule(this.api)\n this.settings = new SettingsModule(this.api)\n this.mailer = new MailerModule(this.api)\n this.businesses = new BusinessesModule(this.api)\n this.admin = new AdminModule(this.api)\n this.disputes = new DisputesModule(this.api)\n }\n\n /**\n * Set the access token for authenticated requests.\n * Optionally pass a refresh token to enable automatic token rotation.\n */\n public setToken(token: string, refreshToken?: string) {\n this.api.setToken(token, refreshToken)\n }\n\n /**\n * Get the current access token.\n */\n public getToken(): string | undefined {\n return this.api.getToken()\n }\n\n /**\n * Clear the current tokens.\n */\n public clearToken() {\n this.api.clearToken()\n }\n\n /**\n * Hydrate tokens from persistent store (call on app boot).\n */\n public hydrate(): Promise<void> {\n return this.api.hydrate()\n }\n\n /**\n * Check if user has a stored session.\n */\n public isAuthenticated(): Promise<boolean> {\n return this.api.isAuthenticated()\n }\n}\n\nexport * from './types'\nexport { APIClient, APIError } from './client'\nexport { MemoryTokenStore, IDBTokenStore, createTokenStore } from './token-store'\nexport type { TokenStore } from './token-store'\nexport { AuthModule } from './modules/auth'\nexport { ListingsModule } from './modules/listings'\nexport { SearchModule } from './modules/search'\nexport { OrdersModule } from './modules/orders'\nexport { PayModule } from './modules/pay'\nexport { VaziModule } from './modules/vazi'\nexport { MessagesModule } from './modules/messages'\nexport { NotificationsModule } from './modules/notifications'\nexport { StoresModule } from './modules/stores'\nexport { ReviewsModule } from './modules/reviews'\nexport { WishlistsModule } from './modules/wishlists'\nexport { CartModule } from './modules/cart'\nexport { SettingsModule } from './modules/settings'\nexport { MailerModule } from './modules/mailer'\nexport { BusinessesModule } from './modules/businesses'\nexport { AdminModule } from './modules/admin'\nexport { DisputesModule } from './modules/disputes'\n"]}
1
+ {"version":3,"sources":["../src/token-store.ts","../src/client.ts","../src/modules/auth.ts","../src/modules/listings.ts","../src/modules/search.ts","../src/modules/orders.ts","../src/modules/pay.ts","../src/modules/vazi.ts","../src/modules/messages.ts","../src/modules/notifications.ts","../src/modules/stores.ts","../src/modules/reviews.ts","../src/modules/wishlists.ts","../src/modules/cart.ts","../src/modules/settings.ts","../src/modules/mailer.ts","../src/modules/businesses.ts","../src/modules/admin.ts","../src/modules/disputes.ts","../src/modules/uploads.ts","../src/types/listings.ts","../src/types/orders.ts","../src/types/pay.ts","../src/types/disputes.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export interface TokenStore {\n getAccessToken(): Promise<string | null>\n getRefreshToken(): Promise<string | null>\n setTokens(access: string, refresh: string): Promise<void>\n clear(): Promise<void>\n}\n\nexport class MemoryTokenStore implements TokenStore {\n private accessToken: string | null = null\n private refreshToken: string | null = null\n\n async getAccessToken(): Promise<string | null> { return this.accessToken }\n async getRefreshToken(): Promise<string | null> { return this.refreshToken }\n async setTokens(access: string, refresh: string): Promise<void> {\n this.accessToken = access\n this.refreshToken = refresh\n }\n async clear(): Promise<void> {\n this.accessToken = null\n this.refreshToken = null\n }\n}\n\nconst DB_NAME = 'mitumba_sdk'\nconst STORE_NAME = 'tokens'\nconst KEY = 'auth'\n\nexport class IDBTokenStore implements TokenStore {\n private dbPromise: Promise<IDBDatabase> | null = null\n\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, 1)\n request.onupgradeneeded = () => {\n request.result.createObjectStore(STORE_NAME)\n }\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n return this.dbPromise\n }\n\n private async get(): Promise<{ access: string; refresh: string } | null> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly')\n const req = tx.objectStore(STORE_NAME).get(KEY)\n req.onsuccess = () => resolve(req.result || null)\n req.onerror = () => reject(req.error)\n })\n }\n\n async getAccessToken(): Promise<string | null> {\n const data = await this.get()\n return data?.access ?? null\n }\n\n async getRefreshToken(): Promise<string | null> {\n const data = await this.get()\n return data?.refresh ?? null\n }\n\n async setTokens(access: string, refresh: string): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).put({ access, refresh }, KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n\n async clear(): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).delete(KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n}\n\n/** Creates IDBTokenStore if indexedDB is available, otherwise MemoryTokenStore. */\nexport function createTokenStore(): TokenStore {\n if (typeof indexedDB !== 'undefined') {\n return new IDBTokenStore()\n }\n return new MemoryTokenStore()\n}\n","import { MitumbaClientConfig, APIErrorResponse, RequestOptions } from './types'\nimport { TokenStore, createTokenStore } from './token-store'\n\nexport class APIError extends Error {\n public readonly code: string\n public readonly status: number\n public readonly details?: unknown\n\n constructor(status: number, data: APIErrorResponse) {\n super(data.message || data.error)\n this.name = 'APIError'\n this.code = data.error\n this.status = status\n this.details = data.details\n }\n}\n\nfunction isExpiringSoon(token: string, thresholdSeconds: number): boolean {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]))\n const exp = payload.exp as number\n return exp - (Date.now() / 1000) < thresholdSeconds\n } catch {\n return false\n }\n}\n\nexport class APIClient {\n private config: MitumbaClientConfig\n private tokenStore: TokenStore\n private isRefreshing = false\n private refreshPromise: Promise<void> | null = null\n\n constructor(config: MitumbaClientConfig) {\n this.config = config\n this.tokenStore = config.tokenStore ?? createTokenStore()\n\n // Seed store from config if tokens provided\n if (config.token) {\n this.tokenStore.setTokens(config.token, config.refreshToken ?? '')\n }\n }\n\n public async setToken(token: string, refreshToken?: string): Promise<void> {\n this.config.token = token\n if (refreshToken) {\n this.config.refreshToken = refreshToken\n }\n await this.tokenStore.setTokens(token, refreshToken ?? this.config.refreshToken ?? '')\n }\n\n public getToken(): string | undefined {\n return this.config.token\n }\n\n public getBaseUrl(): string {\n return this.config.baseUrl\n }\n\n public async clearToken(): Promise<void> {\n this.config.token = undefined\n this.config.refreshToken = undefined\n await this.tokenStore.clear()\n }\n\n /**\n * Check if user has a stored session (access or refresh token available).\n */\n public async isAuthenticated(): Promise<boolean> {\n const access = this.config.token ?? await this.tokenStore.getAccessToken()\n if (access) return true\n const refresh = await this.tokenStore.getRefreshToken()\n return !!refresh\n }\n\n /**\n * Hydrate tokens from the store into memory (call on app boot).\n */\n public async hydrate(): Promise<void> {\n const access = await this.tokenStore.getAccessToken()\n const refresh = await this.tokenStore.getRefreshToken()\n if (access) this.config.token = access\n if (refresh) this.config.refreshToken = refresh\n }\n\n private async ensureFreshToken(): Promise<void> {\n // Try hydrating from store if no in-memory token\n if (!this.config.token) {\n const stored = await this.tokenStore.getAccessToken()\n if (stored) this.config.token = stored\n const refresh = await this.tokenStore.getRefreshToken()\n if (refresh) this.config.refreshToken = refresh\n }\n\n // Proactive refresh if token expires within 60 seconds\n if (this.config.token && isExpiringSoon(this.config.token, 60) && this.config.refreshToken) {\n await this.handleTokenRefresh()\n }\n }\n\n private async request<T>(\n method: string, \n path: string, \n body?: unknown, \n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions\n ): Promise<T> {\n // Proactive refresh before request (skip for auth endpoints)\n if (!path.includes('/auth/refresh') && !path.includes('/auth/login') && !path.includes('/auth/register')) {\n await this.ensureFreshToken()\n }\n\n const url = new URL(path, this.config.baseUrl)\n \n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n }\n }\n\n const headers = new Headers()\n if (body && !(body instanceof FormData)) {\n headers.set('Content-Type', 'application/json')\n }\n\n if (this.config.token) {\n headers.set('Authorization', `Bearer ${this.config.token}`)\n }\n\n const init: RequestInit = {\n method,\n headers,\n body: body instanceof FormData ? body : body ? JSON.stringify(body) : undefined,\n signal: options?.signal\n }\n\n const maxRetries = this.config.maxRetries ?? 3\n let attempt = 0\n let response: Response\n\n while (true) {\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()}`)\n }\n \n const startTime = Date.now()\n try {\n response = await fetch(url.toString(), init)\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw err\n }\n if (attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] Network error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n throw new APIError(0, { error: 'network_error', message: err instanceof Error ? err.message : 'Network request failed' })\n }\n\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()} - ${response.status} (${Date.now() - startTime}ms)`)\n }\n\n if (response.status >= 500 && attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${response.status} error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n\n break\n }\n\n // Handle 401 — attempt refresh and retry\n if (response.status === 401 && this.config.refreshToken && !path.includes('/auth/refresh')) {\n try {\n await this.handleTokenRefresh()\n // Retry request with new token\n headers.set('Authorization', `Bearer ${this.config.token}`)\n response = await fetch(url.toString(), { ...init, headers })\n } catch {\n // Refresh failed — session is dead\n if (this.config.onAuthExpired) {\n this.config.onAuthExpired()\n }\n throw new APIError(401, { error: 'session_expired', message: 'Session expired. Please log in again.' })\n }\n }\n\n if (!response.ok) {\n let errorData: APIErrorResponse\n try {\n errorData = await response.json()\n } catch {\n errorData = { error: 'unknown_error', message: response.statusText }\n }\n throw new APIError(response.status, errorData)\n }\n\n if (response.status === 204) {\n return undefined as unknown as T\n }\n\n return response.json() as Promise<T>\n }\n\n private async handleTokenRefresh(): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.isRefreshing = true\n this.refreshPromise = (async () => {\n try {\n const url = new URL('/auth/refresh', this.config.baseUrl)\n const response = await fetch(url.toString(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refresh_token: this.config.refreshToken }),\n })\n\n if (!response.ok) {\n throw new Error('Refresh failed')\n }\n\n const data = await response.json() as { access_token: string, refresh_token: string }\n this.config.token = data.access_token\n this.config.refreshToken = data.refresh_token\n await this.tokenStore.setTokens(data.access_token, data.refresh_token)\n\n if (this.config.onTokenRefresh) {\n this.config.onTokenRefresh({ token: data.access_token, refreshToken: data.refresh_token })\n }\n } catch (err) {\n await this.clearToken()\n throw err\n } finally {\n this.isRefreshing = false\n this.refreshPromise = null\n }\n })()\n\n return this.refreshPromise\n }\n\n public get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, params, options)\n }\n\n public post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, undefined, options)\n }\n\n public put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, undefined, options)\n }\n\n public patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, body, undefined, options)\n }\n\n public delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, undefined, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n RegisterInput,\n LoginInput,\n SendOtpInput,\n VerifyOtpInput,\n ForgotPasswordInput,\n ResetPasswordInput,\n CompleteOnboardingInput,\n Verify2FAInput,\n TwoFactorRequired,\n BecomeSellerInput,\n UserProfile,\n AuthTokens,\n MessageResponse,\n RequestOptions,\n} from '../types'\n\nexport class AuthModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Register a new account.\n * If using EmailRegisterInput, returns AuthTokens.\n * If using PhoneRegisterInput, returns MessageResponse (OTP sent).\n */\n async register(input: RegisterInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse> {\n return this.client.post<AuthTokens | MessageResponse>('/auth/register', input, options)\n }\n\n /**\n * Log in to an existing account.\n * If using EmailLoginInput, returns AuthTokens (or TwoFactorRequired if 2FA enabled).\n * If using PhoneLoginInput, returns MessageResponse (OTP sent).\n */\n async login(input: LoginInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse | TwoFactorRequired> {\n return this.client.post<AuthTokens | MessageResponse | TwoFactorRequired>('/auth/login', input, options)\n }\n\n /**\n * Send an OTP code to a phone number.\n */\n async sendOtp(input: SendOtpInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/otp/send', input, options)\n }\n\n /**\n * Verify an OTP code.\n */\n async verifyOtp(input: VerifyOtpInput, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/otp/verify', input, options)\n }\n\n /**\n * Refresh the access token using a refresh token.\n */\n async refresh(input: { refresh_token: string }, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/refresh', input, options)\n }\n\n /**\n * Revoke the refresh token and log out.\n */\n async logout(input: { refresh_token: string }, options?: RequestOptions): Promise<{ ok: boolean }> {\n return this.client.post<{ ok: boolean }>('/auth/logout', input, options)\n }\n\n /**\n * Request a password reset email.\n * Sends a reset link to the provided email address.\n */\n async forgotPassword(input: ForgotPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/forgot-password', input, options)\n }\n\n /**\n * Reset the password using a token from the reset email.\n */\n async resetPassword(input: ResetPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/reset-password', input, options)\n }\n\n /**\n * Get the current authenticated user's profile.\n */\n async me(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n /**\n * Complete the onboarding flow.\n */\n async completeOnboarding(input: CompleteOnboardingInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/onboarding/complete', input, options)\n }\n\n /**\n * Verify 2FA code during login (when login returns requires_2fa).\n */\n async verify2FA(input: Verify2FAInput, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/2fa/login', input, options)\n }\n\n /**\n * Send a verification code to the user's email.\n * If unauthenticated, pass the email address.\n */\n async sendVerificationCode(email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/send', email ? { email } : undefined, options)\n }\n\n /**\n * Verify the email with the 6-digit code.\n * If unauthenticated, pass the email address.\n */\n async verifyEmail(code: string, email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/confirm', email ? { code, email } : { code }, options)\n }\n\n /**\n * Upgrade the current user to a seller role.\n * Idempotent — returns success if already a seller.\n */\n async becomeSeller(input: BecomeSellerInput, options?: RequestOptions): Promise<{ ok: true; roles: string[]; sti_score: number }> {\n return this.client.post<{ ok: true; roles: string[]; sti_score: number }>('/auth/become-seller', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n Category,\n City,\n Condition,\n CreateListingInput,\n Listing,\n ListingImage,\n ListingStatus,\n ListingsFeedParams,\n PaginatedResponse,\n PresignImageResponse,\n SellerStorefront,\n SimilarListing,\n Store,\n UpdateListingInput,\n RequestOptions,\n} from '../types'\n\nexport class ListingsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the marketplace feed with optional filters.\n */\n async getFeed(params?: ListingsFeedParams, options?: RequestOptions): Promise<PaginatedResponse<Listing>> {\n // APIClient handles converting params to string|number|boolean properly\n return this.client.get<PaginatedResponse<Listing>>(\n '/listings/feed', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get full details of a single listing, including its images.\n */\n async getById(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.client.get<Listing & { images: ListingImage[] }>(`/listings/${id}`, undefined, options)\n }\n\n /**\n * Create a new listing (requires seller role).\n */\n async create(input: CreateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.post<Listing>('/listings', input, options)\n }\n\n /**\n * Update an existing listing.\n */\n async update(id: string, input: UpdateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.put<Listing>(`/listings/${id}`, input, options)\n }\n\n /**\n * Change the status of a listing.\n */\n async updateStatus(id: string, status: ListingStatus, options?: RequestOptions): Promise<{ ok: boolean; status: ListingStatus }> {\n return this.client.patch<{ ok: boolean; status: ListingStatus }>(`/listings/${id}/status`, { status }, options)\n }\n\n /**\n * Soft delete a listing (sets status to 'removed').\n */\n async delete(id: string, options?: RequestOptions): Promise<{ ok: boolean }> {\n return this.client.delete<{ ok: boolean }>(`/listings/${id}`, options)\n }\n\n /**\n * Get a seller's public storefront.\n */\n async getSellerStorefront(\n sellerId: string,\n params?: { page?: number; page_size?: number },\n options?: RequestOptions\n ): Promise<SellerStorefront> {\n return this.client.get<SellerStorefront>(\n `/listings/seller/${sellerId}`, \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * List all supported categories.\n */\n async getCategories(options?: RequestOptions): Promise<Category[]> {\n return this.client.get<Category[]>('/listings/categories', undefined, options)\n }\n\n /**\n * List all supported cities.\n */\n async getCities(options?: RequestOptions): Promise<City[]> {\n return this.client.get<City[]>('/listings/cities', undefined, options)\n }\n\n /**\n * Get trending listings, optionally filtered by category.\n */\n async getTrending(categoryId?: string, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n '/listings/trending',\n categoryId ? { category_id: categoryId } : undefined,\n options\n )\n }\n\n /**\n * Get top-performing stores for the home feed.\n */\n async getTopStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/top-stores', undefined, options)\n }\n\n /**\n * Get personalized \"for you\" listings (returns recent for anonymous users).\n */\n async getForYou(options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>('/listings/for-you', undefined, options)\n }\n\n /**\n * Get a presigned upload URL for a listing image.\n * Index should be between 0 and 9.\n */\n async presignImage(listingId: string, index: number, options?: RequestOptions): Promise<PresignImageResponse> {\n return this.client.post<PresignImageResponse>(`/listings/${listingId}/images/presign`, { index }, options)\n }\n\n /**\n * Upload an image file directly for a listing.\n * Uses multipart/form-data.\n */\n async uploadImage(listingId: string, file: Blob, index: number, options?: RequestOptions): Promise<{ r2_key: string; image_id: string; url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('index', String(index))\n return this.client.post<{ r2_key: string; image_id: string; url: string }>(`/listings/${listingId}/images/upload`, formData, options)\n }\n\n /**\n * Browse the listing feed (alias for getFeed with simplified params).\n */\n async feed(params?: { page?: number; city?: string; category?: string; sort?: string }, options?: RequestOptions): Promise<{ data: Listing[]; page: number }> {\n return this.client.get<{ data: Listing[]; page: number }>(\n '/listings',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a single listing by ID (alias for getById).\n */\n async get(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.getById(id, options)\n }\n\n /**\n * Full-text search with filters.\n */\n async search(params: { q: string; category?: string; condition?: Condition; min_price?: number; max_price?: number; sort?: string; page?: number }, options?: RequestOptions): Promise<{ data: Listing[]; total: number }> {\n return this.client.get<{ data: Listing[]; total: number }>(\n '/search',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get similar listings for a given listing.\n */\n async getSimilar(listingId: string, mode?: 'global' | 'store', options?: RequestOptions): Promise<{ data: SimilarListing[] }> {\n return this.client.get<{ data: SimilarListing[] }>(\n `/listings/${listingId}/similar`,\n mode ? { mode } : undefined,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type { PaginatedResponse, SearchParams, SearchResult, SearchHistoryItem, SaveSearchInput, TrendingTerm, RequestOptions } from '../types'\n\nexport class SearchModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Perform a full-text search with optional filters.\n */\n async query(params: SearchParams, options?: RequestOptions): Promise<PaginatedResponse<SearchResult>> {\n return this.client.get<PaginatedResponse<SearchResult>>(\n '/search', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get trending search terms.\n */\n async trending(params?: { city_id?: string }, options?: RequestOptions): Promise<{ terms: TrendingTerm[] }> {\n return this.client.get<{ terms: TrendingTerm[] }>(\n '/search/trending',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get the user's search history.\n */\n async getHistory(options?: RequestOptions): Promise<{ data: SearchHistoryItem[] }> {\n return this.client.get<{ data: SearchHistoryItem[] }>('/search/history', undefined, options)\n }\n\n /**\n * Save a search query to history.\n */\n async saveHistory(input: SaveSearchInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/search/history', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateOrderInput, Order, OrderEvent, OrderHistoryParams, OrderStatus, TransitionOrderInput, RequestOptions } from '../types'\n\nexport class OrdersModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Create a new order from a listing.\n */\n async create(input: CreateOrderInput, options?: RequestOptions): Promise<{ order_id: string; total: number; delivery_fee: number }> {\n return this.client.post<{ order_id: string; total: number; delivery_fee: number }>('/orders', input, options)\n }\n\n /**\n * Get full details of an order, including its event timeline.\n */\n async getById(id: string, options?: RequestOptions): Promise<Order & { events: OrderEvent[] }> {\n return this.client.get<Order & { events: OrderEvent[] }>(`/orders/${id}`, undefined, options)\n }\n\n /**\n * Transition the status of an order.\n */\n async transition(id: string, input: TransitionOrderInput, options?: RequestOptions): Promise<{ ok: boolean; status: OrderStatus }> {\n return this.client.post<{ ok: boolean; status: OrderStatus }>(`/orders/${id}/transition`, input, options)\n }\n\n /**\n * Get the order history for the current authenticated user.\n */\n async getHistory(params?: OrderHistoryParams, options?: RequestOptions): Promise<{ data: Order[]; page: number; page_size: number }> {\n return this.client.get<{ data: Order[]; page: number; page_size: number }>(\n '/orders/history',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type { MpesaInput, PaystackInput, PaystackInitResponse, PaymentStatusResponse, StkPushInput, StkPushResponse, RequestOptions } from '../types'\n\nexport class PayModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Initiate an M-Pesa STK Push payment for an order.\n */\n async initiateStk(input: StkPushInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate M-Pesa STK Push (alias for initiateStk).\n */\n async initMpesa(input: MpesaInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate a Paystack payment — returns access_code for inline popup.\n */\n async initPaystack(input: PaystackInput, options?: RequestOptions): Promise<PaystackInitResponse> {\n return this.client.post<PaystackInitResponse>('/pay/paystack/init', input, options)\n }\n\n /**\n * Poll for the current status of a payment by its order ID.\n */\n async getStatus(orderId: string, options?: RequestOptions): Promise<PaymentStatusResponse> {\n return this.client.get<PaymentStatusResponse>(`/pay/status/${orderId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { VAZIOutfit, VAZIOutfitDetail, VaziFeedParams, VaziFeedResponse, RequestOptions } from '../types'\n\nexport class VaziModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the AI-curated outfit feed.\n */\n async getFeed(params?: VaziFeedParams, options?: RequestOptions): Promise<VaziFeedResponse> {\n return this.client.get<VaziFeedResponse>(\n '/vazi/feed',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a complete outfit built around a specific seed listing.\n */\n async getCompleteLook(listingId: string, options?: RequestOptions): Promise<{ outfits: VAZIOutfit[] }> {\n return this.client.get<{ outfits: VAZIOutfit[] }>(`/vazi/complete/${listingId}`, undefined, options)\n }\n\n /**\n * Get a single outfit by ID with full item details.\n */\n async getOutfit(outfitId: string, options?: RequestOptions): Promise<VAZIOutfitDetail> {\n return this.client.get<VAZIOutfitDetail>(`/vazi/outfits/${outfitId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Conversation, Message, SendMessageInput, RequestOptions } from '../types'\n\nexport class MessagesModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List all conversations for the authenticated user.\n */\n async list(storeId?: string, options?: RequestOptions): Promise<{ data: Conversation[] }> {\n return this.client.get<{ data: Conversation[] }>(\n '/notify/messages',\n storeId ? { store_id: storeId } : undefined,\n options\n )\n }\n\n /**\n * Get the message thread with a specific partner.\n */\n async getThread(partnerId: string, storeId?: string, options?: RequestOptions): Promise<{ data: Message[] }> {\n return this.client.get<{ data: Message[] }>(\n `/notify/messages/${partnerId}`,\n storeId ? { store_id: storeId } : undefined,\n options\n )\n }\n\n /**\n * Send a message to another user.\n */\n async send(input: SendMessageInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/notify/messages', input, options)\n }\n\n /**\n * Mark all messages from a partner as read.\n */\n async markRead(partnerId: string, storeId?: string, options?: RequestOptions): Promise<{ ok: true }> {\n const path = storeId\n ? `/notify/messages/${partnerId}/read?store_id=${storeId}`\n : `/notify/messages/${partnerId}/read`\n return this.client.post<{ ok: true }>(path, undefined, options)\n }\n\n /**\n * Connect to the typing indicator WebSocket for a conversation.\n * Token is passed via query param since WebSocket can't set headers.\n */\n connectTyping(partnerId: string): WebSocket {\n const token = this.client.getToken()\n const wsUrl = this.client.getBaseUrl().replace(/^http/, 'ws') + `/notify/messages/${partnerId}/ws?token=${token}`\n return new WebSocket(wsUrl)\n }\n}\n","import { APIClient } from '../client'\nimport type { Notification, RequestOptions } from '../types'\n\nexport class NotificationsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List paginated notifications with unread count.\n */\n async list(page?: number, options?: RequestOptions): Promise<{ data: Notification[]; unread_count: number; page: number }> {\n return this.client.get<{ data: Notification[]; unread_count: number; page: number }>(\n '/notify/notifications',\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Mark notifications as read. If ids omitted, marks all as read.\n */\n async markRead(ids?: string[], options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/notifications/read', ids ? { ids } : {}, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateStoreInput, UpdateStoreInput, StoreStats, StoreSettings, StoreAnalytics, Listing, Store, RequestOptions } from '../types'\n\nexport class StoresModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Get a store by its URL slug.\n */\n async getBySlug(slug: string, options?: RequestOptions): Promise<Store> {\n return this.client.get<Store>(`/listings/stores/${slug}`, undefined, options)\n }\n\n /**\n * Follow a store.\n */\n async follow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/stores/${storeId}/follow`, undefined, options)\n }\n\n /**\n * Unfollow a store.\n */\n async unfollow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/stores/${storeId}/follow`, options)\n }\n\n /**\n * Get paginated listings for a specific store.\n */\n async getListings(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n `/listings/stores/${storeId}/listings`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Get all stores owned by the authenticated user.\n */\n async getMyStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/stores/mine', undefined, options)\n }\n\n /**\n * Create a new store.\n */\n async create(input: CreateStoreInput, options?: RequestOptions): Promise<{ id: string; slug: string }> {\n return this.client.post<{ id: string; slug: string }>('/listings/stores', input, options)\n }\n\n /**\n * Update a store's details.\n */\n async update(storeId: string, input: UpdateStoreInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}`, input, options)\n }\n\n /**\n * Get store statistics.\n */\n async getStats(storeId: string, options?: RequestOptions): Promise<StoreStats> {\n return this.client.get<StoreStats>(`/listings/stores/${storeId}/stats`, undefined, options)\n }\n\n /**\n * Get store settings.\n */\n async getSettings(storeId: string, options?: RequestOptions): Promise<StoreSettings> {\n return this.client.get<StoreSettings>(`/listings/stores/${storeId}/settings`, undefined, options)\n }\n\n /**\n * Update store settings (partial).\n */\n async updateSettings(storeId: string, input: Partial<StoreSettings>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}/settings`, input, options)\n }\n\n /**\n * Get store analytics.\n */\n async getAnalytics(storeId: string, period?: 'daily' | 'weekly' | 'monthly', options?: RequestOptions): Promise<StoreAnalytics> {\n return this.client.get<StoreAnalytics>(\n `/listings/stores/${storeId}/analytics`,\n period ? { period } : undefined,\n options\n )\n }\n\n /**\n * Upload a store logo image.\n */\n async uploadLogo(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/logo`, formData, options)\n }\n\n /**\n * Upload a store banner image.\n */\n async uploadBanner(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/banner`, formData, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateReviewInput, Review, ReviewableOrder, RequestOptions } from '../types'\n\nexport class ReviewsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List reviews for a store (public).\n */\n async list(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Review[]; total: number; avg_rating: number; page: number }> {\n return this.client.get<{ data: Review[]; total: number; avg_rating: number; page: number }>(\n `/listings/stores/${storeId}/reviews`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Create a review for a store (authenticated).\n */\n async create(storeId: string, input: CreateReviewInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>(`/listings/stores/${storeId}/reviews`, input, options)\n }\n\n /**\n * Get orders eligible for review (delivered/completed, not yet reviewed).\n */\n async getReviewableOrders(storeId: string, options?: RequestOptions): Promise<{ data: ReviewableOrder[] }> {\n return this.client.get<{ data: ReviewableOrder[] }>(`/listings/stores/${storeId}/reviews/eligible`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { WishlistListing, RequestOptions } from '../types'\n\nexport class WishlistsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List saved listings.\n */\n async list(options?: RequestOptions): Promise<{ data: WishlistListing[] }> {\n return this.client.get<{ data: WishlistListing[] }>('/listings/wishlists', undefined, options)\n }\n\n /**\n * Add a listing to the wishlist.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/wishlists/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the wishlist.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/wishlists/${listingId}`, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CartItem, RequestOptions } from '../types'\n\nexport class CartModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List items in the cart.\n */\n async list(options?: RequestOptions): Promise<{ data: CartItem[] }> {\n return this.client.get<{ data: CartItem[] }>('/listings/cart', undefined, options)\n }\n\n /**\n * Add a listing to the cart.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/cart/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the cart.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/cart/${listingId}`, options)\n }\n\n /**\n * Update the quantity of a cart item.\n */\n async updateQuantity(listingId: string, quantity: number, options?: RequestOptions): Promise<{ ok: true; quantity: number }> {\n return this.client.patch<{ ok: true; quantity: number }>(`/listings/cart/${listingId}`, { quantity }, options)\n }\n\n /**\n * Checkout the cart — creates orders grouped by store and clears the cart.\n */\n async checkout(options?: RequestOptions): Promise<{ order_ids: string[]; count: number }> {\n return this.client.post<{ order_ids: string[]; count: number }>('/orders/checkout', undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n UpdateProfileInput,\n ChangePasswordInput,\n Session,\n NotificationPref,\n Address,\n AddAddressInput,\n PaymentMethod,\n AddPaymentMethodInput,\n LinkedAccount,\n LinkedAccountProvider,\n UserProfile,\n RequestOptions,\n} from '../types'\n\nexport class SettingsModule {\n constructor(private readonly client: APIClient) {}\n\n // ── Profile ──\n\n async getProfile(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n async updateProfile(input: UpdateProfileInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/me', input, options)\n }\n\n // ── Security ──\n\n async changePassword(input: ChangePasswordInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/change-password', input, options)\n }\n\n async getSessions(options?: RequestOptions): Promise<{ data: Session[] }> {\n return this.client.get<{ data: Session[] }>('/auth/sessions', undefined, options)\n }\n\n async revokeSession(sessionId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/sessions/${sessionId}`, options)\n }\n\n // ── Notification Preferences ──\n\n async getNotificationPrefs(options?: RequestOptions): Promise<{ data: NotificationPref[] }> {\n return this.client.get<{ data: NotificationPref[] }>('/auth/notification-prefs', undefined, options)\n }\n\n async updateNotificationPref(channel: string, enabled: boolean, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/notification-prefs/${channel}`, { enabled }, options)\n }\n\n // ── Preferences ──\n\n async getPreferences(options?: RequestOptions): Promise<{ data: Record<string, string> }> {\n return this.client.get<{ data: Record<string, string> }>('/auth/preferences', undefined, options)\n }\n\n async updatePreferences(prefs: Record<string, string>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/preferences', { prefs }, options)\n }\n\n // ── Addresses ──\n\n async getAddresses(options?: RequestOptions): Promise<{ data: Address[] }> {\n return this.client.get<{ data: Address[] }>('/auth/addresses', undefined, options)\n }\n\n async addAddress(input: AddAddressInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/addresses', input, options)\n }\n\n async updateAddress(id: string, input: Partial<AddAddressInput>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/addresses/${id}`, input, options)\n }\n\n async deleteAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/addresses/${id}`, options)\n }\n\n async setDefaultAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/addresses/${id}/default`, undefined, options)\n }\n\n // ── Payment Methods ──\n\n async getPaymentMethods(options?: RequestOptions): Promise<{ data: PaymentMethod[] }> {\n return this.client.get<{ data: PaymentMethod[] }>('/auth/payment-methods', undefined, options)\n }\n\n async addPaymentMethod(input: AddPaymentMethodInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/payment-methods', input, options)\n }\n\n async deletePaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/payment-methods/${id}`, options)\n }\n\n async setDefaultPaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/payment-methods/${id}/default`, undefined, options)\n }\n\n // ── Linked Accounts ──\n\n async getLinkedAccounts(options?: RequestOptions): Promise<{ data: LinkedAccount[] }> {\n return this.client.get<{ data: LinkedAccount[] }>('/auth/linked-accounts', undefined, options)\n }\n\n async linkAccount(provider: LinkedAccountProvider, token: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/linked-accounts', { provider, token }, options)\n }\n\n async unlinkAccount(provider: LinkedAccountProvider, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/linked-accounts/${provider}`, options)\n }\n\n // ── 2FA ──\n\n async setup2FA(options?: RequestOptions): Promise<{ secret: string; otpauth_uri: string }> {\n return this.client.post<{ secret: string; otpauth_uri: string }>('/auth/2fa/setup', undefined, options)\n }\n\n async verify2FA(code: string, options?: RequestOptions): Promise<{ ok: true; backup_codes: string[] }> {\n return this.client.post<{ ok: true; backup_codes: string[] }>('/auth/2fa/verify', { code }, options)\n }\n\n async disable2FA(code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/2fa/disable', { code }, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { MailerTemplate, SendEmailInput, RequestOptions } from '../types'\n\nexport class MailerModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Send a transactional email via the notifications worker.\n */\n async send(template: MailerTemplate, input: SendEmailInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/email', { template, ...input }, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Business, UpdateBusinessInput, RequestOptions } from '../types'\n\nexport class BusinessesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Get all businesses owned by the current user. */\n async getMine(options?: RequestOptions): Promise<{ data: Business[] }> {\n return this.client.get<{ data: Business[] }>('/listings/businesses/mine', undefined, options)\n }\n\n /** Get a business by ID. */\n async getById(id: string, options?: RequestOptions): Promise<Business> {\n return this.client.get<Business>(`/listings/businesses/${id}`, undefined, options)\n }\n\n /** Update a business. */\n async update(id: string, input: UpdateBusinessInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/businesses/${id}`, input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { BlockedIp, SystemStats, RequestOptions } from '../types'\n\nexport class AdminModule {\n constructor(private readonly client: APIClient) {}\n\n /** Block an IP address. Default duration: 24 hours. */\n async blockIp(ip: string, durationHours?: number, options?: RequestOptions): Promise<{ ok: true; blocked: string; hours: number }> {\n return this.client.post<{ ok: true; blocked: string; hours: number }>('/admin/block-ip', { ip, duration_hours: durationHours ?? 24 }, options)\n }\n\n /** Unblock an IP address. */\n async unblockIp(ip: string, options?: RequestOptions): Promise<{ ok: true; unblocked: string }> {\n return this.client.post<{ ok: true; unblocked: string }>('/admin/unblock-ip', { ip }, options)\n }\n\n /** List currently blocked IPs. */\n async getBlockedIps(options?: RequestOptions): Promise<{ data: BlockedIp[] }> {\n return this.client.get<{ data: BlockedIp[] }>('/admin/blocked-ips', undefined, options)\n }\n\n /** Get platform-wide statistics. */\n async getSystemStats(options?: RequestOptions): Promise<SystemStats> {\n return this.client.get<SystemStats>('/admin/stats', undefined, options)\n }\n\n /** Suspend a user account. */\n async suspendUser(userId: string, reason: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/suspend`, { reason }, options)\n }\n\n /** Unsuspend a user account. */\n async unsuspendUser(userId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/unsuspend`, undefined, options)\n }\n\n /** Grant verified badge to a store. */\n async verifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/verify`, undefined, options)\n }\n\n /** Revoke verified badge from a store. */\n async unverifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/unverify`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Dispute, RaiseDisputeInput, RespondDisputeInput, ResolveDisputeInput, DisputeListParams, RequestOptions } from '../types'\n\nexport class DisputesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Raise a dispute on an order (buyer). */\n async raise(orderId: string, input: RaiseDisputeInput, options?: RequestOptions): Promise<{ dispute_id: string; status: 'open' }> {\n return this.client.post<{ dispute_id: string; status: 'open' }>(`/orders/${orderId}/dispute`, input, options)\n }\n\n /** Get the dispute for a specific order. */\n async getForOrder(orderId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/${orderId}/dispute`, undefined, options)\n }\n\n /** Get a dispute by ID. */\n async get(disputeId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/disputes/${disputeId}`, undefined, options)\n }\n\n /** Add evidence to a dispute. */\n async addEvidence(disputeId: string, input: { type: 'image' | 'text'; content: string }, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/orders/disputes/${disputeId}/evidence`, input, options)\n }\n\n /** Escalate a dispute to admin review (buyer). */\n async escalate(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'under_review' }> {\n return this.client.post<{ ok: true; status: 'under_review' }>(`/orders/disputes/${disputeId}/escalate`, undefined, options)\n }\n\n /** Withdraw a dispute (buyer). */\n async withdraw(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'withdrawn' }> {\n return this.client.post<{ ok: true; status: 'withdrawn' }>(`/orders/disputes/${disputeId}/withdraw`, undefined, options)\n }\n\n /** Respond to a dispute (seller). */\n async respond(disputeId: string, input: RespondDisputeInput, options?: RequestOptions): Promise<{ ok: true; status?: string; voluntary?: boolean }> {\n return this.client.post<{ ok: true; status?: string; voluntary?: boolean }>(`/orders/disputes/${disputeId}/respond`, input, options)\n }\n\n /** List all disputes (admin). */\n async list(params?: DisputeListParams, options?: RequestOptions): Promise<{ data: Dispute[]; page: number; page_size: number }> {\n return this.client.get<{ data: Dispute[]; page: number; page_size: number }>(\n '/orders/disputes',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /** Resolve a dispute (admin). */\n async resolve(disputeId: string, input: ResolveDisputeInput, options?: RequestOptions): Promise<{ ok: true; status: string; sti_impact: number }> {\n return this.client.post<{ ok: true; status: string; sti_impact: number }>(`/orders/disputes/${disputeId}/resolve`, input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { RequestOptions } from '../types'\n\nexport class UploadsModule {\n constructor(private readonly client: APIClient) {}\n\n /** Upload a file (avatar, evidence, etc). Returns the public CDN URL. */\n async upload(file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>('/listings/uploads', formData, options)\n }\n}\n","export const CONDITIONS = ['new', 'like_new', 'good', 'fair'] as const\nexport type Condition = typeof CONDITIONS[number]\n\nexport const LISTING_STATUSES = ['draft', 'active', 'sold', 'removed'] as const\nexport type ListingStatus = typeof LISTING_STATUSES[number]\n\nexport interface ListingImage {\n id: string\n listing_id: string\n url: string\n position: number\n created_at: string\n}\n\nexport interface SellerProfile {\n id: string\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n}\n\nexport interface Listing {\n id: string\n seller_id: string\n title: string\n description: string | null\n category_id: string\n city_id: string\n price: number // KES integer\n condition: Condition\n status: ListingStatus\n photo_verified: boolean\n vazi_eligible: boolean\n size: string | null\n created_at: string\n updated_at: string\n // Seller profile (joined)\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n // Images (only present on GET /listings/:id, not in feed)\n images?: ListingImage[]\n // First image as full CDN URL (present in feeds/store listings)\n image_url?: string | null\n}\n\nexport interface ListingsFeedParams {\n city_id?: string\n category_id?: string\n min_price?: number\n max_price?: number\n condition?: Condition\n sort?: 'recency' | 'price_asc' | 'price_desc'\n page?: number\n page_size?: number\n}\n\nexport interface CreateListingInput {\n store_id: string\n title: string\n description?: string\n category_id: string\n city_id: string\n price: number\n condition: Condition\n size?: string\n vazi_eligible?: boolean\n}\n\nexport type UpdateListingInput = Partial<CreateListingInput>\n\nexport interface Category {\n id: string\n name: string\n slug: string\n}\n\nexport interface City {\n id: string\n name: string\n delivery_fee: number\n}\n\nexport interface SellerStorefront {\n seller: SellerProfile\n listings: Listing[]\n total: number\n page: number\n page_size: number\n has_more: boolean\n}\n\nexport interface PresignImageResponse {\n r2_key: string\n image_id: string\n}\n\nexport interface SimilarListing {\n id: string\n title: string\n price: number\n condition: string\n category_id: string\n store_id: string | null\n image_keys: string | null\n created_at: string\n}\n","export const ORDER_STATUSES = [\n 'created',\n 'payment_pending',\n 'paid',\n 'seller_confirmed',\n 'shipped',\n 'delivered',\n 'completed',\n 'cancelled',\n 'disputed',\n] as const\n\nexport type OrderStatus = typeof ORDER_STATUSES[number]\n\nexport interface OrderEvent {\n id: string\n order_id: string\n actor: string // user ID or 'system'\n old_status: string\n new_status: string\n note: string | null\n created_at: string\n}\n\nexport interface DeliveryAddress {\n label: string\n line1: string\n city: string\n county: string\n phone: string\n}\n\nexport interface Order {\n id: string\n buyer_id: string\n seller_id: string\n listing_id: string\n amount: number\n delivery_fee: number\n total: number\n status: OrderStatus\n city_id: string\n created_at: string\n updated_at: string\n // Joined listing details\n listing_title: string | null\n listing_image_url: string | null\n listing_condition: string | null\n listing_size: string | null\n // Joined buyer details\n buyer_name: string | null\n buyer_phone: string | null\n // Buyer's default delivery address\n delivery_address: DeliveryAddress | null\n events?: OrderEvent[]\n}\n\nexport interface CreateOrderInput {\n listing_id: string\n}\n\nexport interface TransitionOrderInput {\n status: OrderStatus\n note?: string\n}\n\nexport interface OrderHistoryParams {\n role?: 'buyer' | 'seller'\n store_id?: string\n page?: number\n}\n","export interface StkPushInput {\n order_id: string\n phone: string // format: +254XXXXXXXXX\n}\n\nexport type MpesaInput = StkPushInput\n\nexport interface StkPushResponse {\n payment_id: string\n provider: string\n}\n\nexport interface PaystackInput {\n order_id: string\n email: string\n}\n\nexport interface PaystackInitResponse {\n access_code: string\n authorization_url: string\n reference: string\n}\n\nexport const PAYMENT_STATUSES = ['initiated', 'funded', 'failed', 'refunded', 'cancelled'] as const\nexport type PaymentStatus = typeof PAYMENT_STATUSES[number]\n\nexport interface PaymentStatusResponse {\n id: string\n status: PaymentStatus\n total: number\n}\n","export const DISPUTE_REASONS = ['not_received', 'not_as_described', 'damaged', 'counterfeit', 'wrong_item'] as const\nexport type DisputeReason = typeof DISPUTE_REASONS[number]\n\nexport const DESIRED_RESOLUTIONS = ['refund', 'replacement', 'partial_refund'] as const\nexport type DesiredResolution = typeof DESIRED_RESOLUTIONS[number]\n\nexport const DISPUTE_STATUSES = ['open', 'seller_responded', 'under_review', 'resolved_refund', 'resolved_release', 'resolved_partial', 'withdrawn'] as const\nexport type DisputeStatus = typeof DISPUTE_STATUSES[number]\n\nexport interface DisputeEvidence {\n id: string\n uploader_role: 'buyer' | 'seller' | 'admin'\n type: 'image' | 'text'\n content: string\n created_at: string\n}\n\nexport interface DisputeEvent {\n actor_role: 'buyer' | 'seller' | 'admin' | 'system'\n action: string\n old_status: string | null\n new_status: string | null\n note: string | null\n created_at: string\n}\n\nexport interface Dispute {\n id: string\n order_id: string\n buyer_id: string\n seller_id: string\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n status: DisputeStatus\n amount_disputed: number\n resolution: 'refund' | 'release' | 'partial' | null\n resolution_amount: number | null\n resolution_note: string | null\n sti_impact: number | null\n seller_responded_at: string | null\n escalated_at: string | null\n resolved_at: string | null\n created_at: string\n updated_at: string\n evidence?: DisputeEvidence[]\n events?: DisputeEvent[]\n}\n\nexport interface RaiseDisputeInput {\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n evidence_urls?: string[]\n}\n\nexport interface RespondDisputeInput {\n accept: boolean\n message?: string\n evidence_urls?: string[]\n}\n\nexport interface ResolveDisputeInput {\n resolution: 'refund' | 'release' | 'partial'\n amount?: number\n note?: string\n}\n\nexport interface DisputeListParams {\n status?: DisputeStatus\n page?: number\n}\n","import { APIClient } from './client'\nimport { MitumbaClientConfig } from './types'\nimport { AuthModule } from './modules/auth'\nimport { ListingsModule } from './modules/listings'\nimport { SearchModule } from './modules/search'\nimport { OrdersModule } from './modules/orders'\nimport { PayModule } from './modules/pay'\nimport { VaziModule } from './modules/vazi'\nimport { MessagesModule } from './modules/messages'\nimport { NotificationsModule } from './modules/notifications'\nimport { StoresModule } from './modules/stores'\nimport { ReviewsModule } from './modules/reviews'\nimport { WishlistsModule } from './modules/wishlists'\nimport { CartModule } from './modules/cart'\nimport { SettingsModule } from './modules/settings'\nimport { MailerModule } from './modules/mailer'\nimport { BusinessesModule } from './modules/businesses'\nimport { AdminModule } from './modules/admin'\nimport { DisputesModule } from './modules/disputes'\nimport { UploadsModule } from './modules/uploads'\n\nexport class MitumbaClient {\n public readonly api: APIClient\n public readonly auth: AuthModule\n public readonly listings: ListingsModule\n public readonly search: SearchModule\n public readonly orders: OrdersModule\n public readonly pay: PayModule\n public readonly vazi: VaziModule\n public readonly messages: MessagesModule\n public readonly notifications: NotificationsModule\n public readonly stores: StoresModule\n public readonly reviews: ReviewsModule\n public readonly wishlists: WishlistsModule\n public readonly cart: CartModule\n public readonly settings: SettingsModule\n public readonly mailer: MailerModule\n public readonly businesses: BusinessesModule\n public readonly admin: AdminModule\n public readonly disputes: DisputesModule\n public readonly uploads: UploadsModule\n\n constructor(config: MitumbaClientConfig) {\n this.api = new APIClient(config)\n this.auth = new AuthModule(this.api)\n this.listings = new ListingsModule(this.api)\n this.search = new SearchModule(this.api)\n this.orders = new OrdersModule(this.api)\n this.pay = new PayModule(this.api)\n this.vazi = new VaziModule(this.api)\n this.messages = new MessagesModule(this.api)\n this.notifications = new NotificationsModule(this.api)\n this.stores = new StoresModule(this.api)\n this.reviews = new ReviewsModule(this.api)\n this.wishlists = new WishlistsModule(this.api)\n this.cart = new CartModule(this.api)\n this.settings = new SettingsModule(this.api)\n this.mailer = new MailerModule(this.api)\n this.businesses = new BusinessesModule(this.api)\n this.admin = new AdminModule(this.api)\n this.disputes = new DisputesModule(this.api)\n this.uploads = new UploadsModule(this.api)\n }\n\n /**\n * Set the access token for authenticated requests.\n * Optionally pass a refresh token to enable automatic token rotation.\n */\n public setToken(token: string, refreshToken?: string) {\n this.api.setToken(token, refreshToken)\n }\n\n /**\n * Get the current access token.\n */\n public getToken(): string | undefined {\n return this.api.getToken()\n }\n\n /**\n * Clear the current tokens.\n */\n public clearToken() {\n this.api.clearToken()\n }\n\n /**\n * Hydrate tokens from persistent store (call on app boot).\n */\n public hydrate(): Promise<void> {\n return this.api.hydrate()\n }\n\n /**\n * Check if user has a stored session.\n */\n public isAuthenticated(): Promise<boolean> {\n return this.api.isAuthenticated()\n }\n}\n\nexport * from './types'\nexport { APIClient, APIError } from './client'\nexport { MemoryTokenStore, IDBTokenStore, createTokenStore } from './token-store'\nexport type { TokenStore } from './token-store'\nexport { AuthModule } from './modules/auth'\nexport { ListingsModule } from './modules/listings'\nexport { SearchModule } from './modules/search'\nexport { OrdersModule } from './modules/orders'\nexport { PayModule } from './modules/pay'\nexport { VaziModule } from './modules/vazi'\nexport { MessagesModule } from './modules/messages'\nexport { NotificationsModule } from './modules/notifications'\nexport { StoresModule } from './modules/stores'\nexport { ReviewsModule } from './modules/reviews'\nexport { WishlistsModule } from './modules/wishlists'\nexport { CartModule } from './modules/cart'\nexport { SettingsModule } from './modules/settings'\nexport { MailerModule } from './modules/mailer'\nexport { BusinessesModule } from './modules/businesses'\nexport { AdminModule } from './modules/admin'\nexport { DisputesModule } from './modules/disputes'\nexport { UploadsModule } from './modules/uploads'\n"]}
package/dist/index.mjs CHANGED
@@ -1155,6 +1155,20 @@ var DisputesModule = class {
1155
1155
  }
1156
1156
  };
1157
1157
 
1158
+ // src/modules/uploads.ts
1159
+ var UploadsModule = class {
1160
+ constructor(client) {
1161
+ this.client = client;
1162
+ }
1163
+ client;
1164
+ /** Upload a file (avatar, evidence, etc). Returns the public CDN URL. */
1165
+ async upload(file, options) {
1166
+ const formData = new FormData();
1167
+ formData.append("file", file);
1168
+ return this.client.post("/listings/uploads", formData, options);
1169
+ }
1170
+ };
1171
+
1158
1172
  // src/types/listings.ts
1159
1173
  var CONDITIONS = ["new", "like_new", "good", "fair"];
1160
1174
  var LISTING_STATUSES = ["draft", "active", "sold", "removed"];
@@ -1200,6 +1214,7 @@ var MitumbaClient = class {
1200
1214
  businesses;
1201
1215
  admin;
1202
1216
  disputes;
1217
+ uploads;
1203
1218
  constructor(config) {
1204
1219
  this.api = new APIClient(config);
1205
1220
  this.auth = new AuthModule(this.api);
@@ -1219,6 +1234,7 @@ var MitumbaClient = class {
1219
1234
  this.businesses = new BusinessesModule(this.api);
1220
1235
  this.admin = new AdminModule(this.api);
1221
1236
  this.disputes = new DisputesModule(this.api);
1237
+ this.uploads = new UploadsModule(this.api);
1222
1238
  }
1223
1239
  /**
1224
1240
  * Set the access token for authenticated requests.
@@ -1253,6 +1269,6 @@ var MitumbaClient = class {
1253
1269
  }
1254
1270
  };
1255
1271
 
1256
- export { APIClient, APIError, AdminModule, AuthModule, BusinessesModule, CONDITIONS, CartModule, DESIRED_RESOLUTIONS, DISPUTE_REASONS, DISPUTE_STATUSES, DisputesModule, IDBTokenStore, LISTING_STATUSES, ListingsModule, MailerModule, MemoryTokenStore, MessagesModule, MitumbaClient, NotificationsModule, ORDER_STATUSES, OrdersModule, PAYMENT_STATUSES, PayModule, ReviewsModule, SearchModule, SettingsModule, StoresModule, VaziModule, WishlistsModule, createTokenStore };
1272
+ export { APIClient, APIError, AdminModule, AuthModule, BusinessesModule, CONDITIONS, CartModule, DESIRED_RESOLUTIONS, DISPUTE_REASONS, DISPUTE_STATUSES, DisputesModule, IDBTokenStore, LISTING_STATUSES, ListingsModule, MailerModule, MemoryTokenStore, MessagesModule, MitumbaClient, NotificationsModule, ORDER_STATUSES, OrdersModule, PAYMENT_STATUSES, PayModule, ReviewsModule, SearchModule, SettingsModule, StoresModule, UploadsModule, VaziModule, WishlistsModule, createTokenStore };
1257
1273
  //# sourceMappingURL=index.mjs.map
1258
1274
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/token-store.ts","../src/client.ts","../src/modules/auth.ts","../src/modules/listings.ts","../src/modules/search.ts","../src/modules/orders.ts","../src/modules/pay.ts","../src/modules/vazi.ts","../src/modules/messages.ts","../src/modules/notifications.ts","../src/modules/stores.ts","../src/modules/reviews.ts","../src/modules/wishlists.ts","../src/modules/cart.ts","../src/modules/settings.ts","../src/modules/mailer.ts","../src/modules/businesses.ts","../src/modules/admin.ts","../src/modules/disputes.ts","../src/types/listings.ts","../src/types/orders.ts","../src/types/pay.ts","../src/types/disputes.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export interface TokenStore {\n getAccessToken(): Promise<string | null>\n getRefreshToken(): Promise<string | null>\n setTokens(access: string, refresh: string): Promise<void>\n clear(): Promise<void>\n}\n\nexport class MemoryTokenStore implements TokenStore {\n private accessToken: string | null = null\n private refreshToken: string | null = null\n\n async getAccessToken(): Promise<string | null> { return this.accessToken }\n async getRefreshToken(): Promise<string | null> { return this.refreshToken }\n async setTokens(access: string, refresh: string): Promise<void> {\n this.accessToken = access\n this.refreshToken = refresh\n }\n async clear(): Promise<void> {\n this.accessToken = null\n this.refreshToken = null\n }\n}\n\nconst DB_NAME = 'mitumba_sdk'\nconst STORE_NAME = 'tokens'\nconst KEY = 'auth'\n\nexport class IDBTokenStore implements TokenStore {\n private dbPromise: Promise<IDBDatabase> | null = null\n\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, 1)\n request.onupgradeneeded = () => {\n request.result.createObjectStore(STORE_NAME)\n }\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n return this.dbPromise\n }\n\n private async get(): Promise<{ access: string; refresh: string } | null> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly')\n const req = tx.objectStore(STORE_NAME).get(KEY)\n req.onsuccess = () => resolve(req.result || null)\n req.onerror = () => reject(req.error)\n })\n }\n\n async getAccessToken(): Promise<string | null> {\n const data = await this.get()\n return data?.access ?? null\n }\n\n async getRefreshToken(): Promise<string | null> {\n const data = await this.get()\n return data?.refresh ?? null\n }\n\n async setTokens(access: string, refresh: string): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).put({ access, refresh }, KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n\n async clear(): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).delete(KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n}\n\n/** Creates IDBTokenStore if indexedDB is available, otherwise MemoryTokenStore. */\nexport function createTokenStore(): TokenStore {\n if (typeof indexedDB !== 'undefined') {\n return new IDBTokenStore()\n }\n return new MemoryTokenStore()\n}\n","import { MitumbaClientConfig, APIErrorResponse, RequestOptions } from './types'\nimport { TokenStore, createTokenStore } from './token-store'\n\nexport class APIError extends Error {\n public readonly code: string\n public readonly status: number\n public readonly details?: unknown\n\n constructor(status: number, data: APIErrorResponse) {\n super(data.message || data.error)\n this.name = 'APIError'\n this.code = data.error\n this.status = status\n this.details = data.details\n }\n}\n\nfunction isExpiringSoon(token: string, thresholdSeconds: number): boolean {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]))\n const exp = payload.exp as number\n return exp - (Date.now() / 1000) < thresholdSeconds\n } catch {\n return false\n }\n}\n\nexport class APIClient {\n private config: MitumbaClientConfig\n private tokenStore: TokenStore\n private isRefreshing = false\n private refreshPromise: Promise<void> | null = null\n\n constructor(config: MitumbaClientConfig) {\n this.config = config\n this.tokenStore = config.tokenStore ?? createTokenStore()\n\n // Seed store from config if tokens provided\n if (config.token) {\n this.tokenStore.setTokens(config.token, config.refreshToken ?? '')\n }\n }\n\n public async setToken(token: string, refreshToken?: string): Promise<void> {\n this.config.token = token\n if (refreshToken) {\n this.config.refreshToken = refreshToken\n }\n await this.tokenStore.setTokens(token, refreshToken ?? this.config.refreshToken ?? '')\n }\n\n public getToken(): string | undefined {\n return this.config.token\n }\n\n public getBaseUrl(): string {\n return this.config.baseUrl\n }\n\n public async clearToken(): Promise<void> {\n this.config.token = undefined\n this.config.refreshToken = undefined\n await this.tokenStore.clear()\n }\n\n /**\n * Check if user has a stored session (access or refresh token available).\n */\n public async isAuthenticated(): Promise<boolean> {\n const access = this.config.token ?? await this.tokenStore.getAccessToken()\n if (access) return true\n const refresh = await this.tokenStore.getRefreshToken()\n return !!refresh\n }\n\n /**\n * Hydrate tokens from the store into memory (call on app boot).\n */\n public async hydrate(): Promise<void> {\n const access = await this.tokenStore.getAccessToken()\n const refresh = await this.tokenStore.getRefreshToken()\n if (access) this.config.token = access\n if (refresh) this.config.refreshToken = refresh\n }\n\n private async ensureFreshToken(): Promise<void> {\n // Try hydrating from store if no in-memory token\n if (!this.config.token) {\n const stored = await this.tokenStore.getAccessToken()\n if (stored) this.config.token = stored\n const refresh = await this.tokenStore.getRefreshToken()\n if (refresh) this.config.refreshToken = refresh\n }\n\n // Proactive refresh if token expires within 60 seconds\n if (this.config.token && isExpiringSoon(this.config.token, 60) && this.config.refreshToken) {\n await this.handleTokenRefresh()\n }\n }\n\n private async request<T>(\n method: string, \n path: string, \n body?: unknown, \n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions\n ): Promise<T> {\n // Proactive refresh before request (skip for auth endpoints)\n if (!path.includes('/auth/refresh') && !path.includes('/auth/login') && !path.includes('/auth/register')) {\n await this.ensureFreshToken()\n }\n\n const url = new URL(path, this.config.baseUrl)\n \n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n }\n }\n\n const headers = new Headers()\n if (body && !(body instanceof FormData)) {\n headers.set('Content-Type', 'application/json')\n }\n\n if (this.config.token) {\n headers.set('Authorization', `Bearer ${this.config.token}`)\n }\n\n const init: RequestInit = {\n method,\n headers,\n body: body instanceof FormData ? body : body ? JSON.stringify(body) : undefined,\n signal: options?.signal\n }\n\n const maxRetries = this.config.maxRetries ?? 3\n let attempt = 0\n let response: Response\n\n while (true) {\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()}`)\n }\n \n const startTime = Date.now()\n try {\n response = await fetch(url.toString(), init)\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw err\n }\n if (attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] Network error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n throw new APIError(0, { error: 'network_error', message: err instanceof Error ? err.message : 'Network request failed' })\n }\n\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()} - ${response.status} (${Date.now() - startTime}ms)`)\n }\n\n if (response.status >= 500 && attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${response.status} error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n\n break\n }\n\n // Handle 401 — attempt refresh and retry\n if (response.status === 401 && this.config.refreshToken && !path.includes('/auth/refresh')) {\n try {\n await this.handleTokenRefresh()\n // Retry request with new token\n headers.set('Authorization', `Bearer ${this.config.token}`)\n response = await fetch(url.toString(), { ...init, headers })\n } catch {\n // Refresh failed — session is dead\n if (this.config.onAuthExpired) {\n this.config.onAuthExpired()\n }\n throw new APIError(401, { error: 'session_expired', message: 'Session expired. Please log in again.' })\n }\n }\n\n if (!response.ok) {\n let errorData: APIErrorResponse\n try {\n errorData = await response.json()\n } catch {\n errorData = { error: 'unknown_error', message: response.statusText }\n }\n throw new APIError(response.status, errorData)\n }\n\n if (response.status === 204) {\n return undefined as unknown as T\n }\n\n return response.json() as Promise<T>\n }\n\n private async handleTokenRefresh(): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.isRefreshing = true\n this.refreshPromise = (async () => {\n try {\n const url = new URL('/auth/refresh', this.config.baseUrl)\n const response = await fetch(url.toString(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refresh_token: this.config.refreshToken }),\n })\n\n if (!response.ok) {\n throw new Error('Refresh failed')\n }\n\n const data = await response.json() as { access_token: string, refresh_token: string }\n this.config.token = data.access_token\n this.config.refreshToken = data.refresh_token\n await this.tokenStore.setTokens(data.access_token, data.refresh_token)\n\n if (this.config.onTokenRefresh) {\n this.config.onTokenRefresh({ token: data.access_token, refreshToken: data.refresh_token })\n }\n } catch (err) {\n await this.clearToken()\n throw err\n } finally {\n this.isRefreshing = false\n this.refreshPromise = null\n }\n })()\n\n return this.refreshPromise\n }\n\n public get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, params, options)\n }\n\n public post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, undefined, options)\n }\n\n public put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, undefined, options)\n }\n\n public patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, body, undefined, options)\n }\n\n public delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, undefined, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n RegisterInput,\n LoginInput,\n SendOtpInput,\n VerifyOtpInput,\n ForgotPasswordInput,\n ResetPasswordInput,\n CompleteOnboardingInput,\n Verify2FAInput,\n TwoFactorRequired,\n BecomeSellerInput,\n UserProfile,\n AuthTokens,\n MessageResponse,\n RequestOptions,\n} from '../types'\n\nexport class AuthModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Register a new account.\n * If using EmailRegisterInput, returns AuthTokens.\n * If using PhoneRegisterInput, returns MessageResponse (OTP sent).\n */\n async register(input: RegisterInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse> {\n return this.client.post<AuthTokens | MessageResponse>('/auth/register', input, options)\n }\n\n /**\n * Log in to an existing account.\n * If using EmailLoginInput, returns AuthTokens (or TwoFactorRequired if 2FA enabled).\n * If using PhoneLoginInput, returns MessageResponse (OTP sent).\n */\n async login(input: LoginInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse | TwoFactorRequired> {\n return this.client.post<AuthTokens | MessageResponse | TwoFactorRequired>('/auth/login', input, options)\n }\n\n /**\n * Send an OTP code to a phone number.\n */\n async sendOtp(input: SendOtpInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/otp/send', input, options)\n }\n\n /**\n * Verify an OTP code.\n */\n async verifyOtp(input: VerifyOtpInput, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/otp/verify', input, options)\n }\n\n /**\n * Refresh the access token using a refresh token.\n */\n async refresh(input: { refresh_token: string }, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/refresh', input, options)\n }\n\n /**\n * Revoke the refresh token and log out.\n */\n async logout(input: { refresh_token: string }, options?: RequestOptions): Promise<{ ok: boolean }> {\n return this.client.post<{ ok: boolean }>('/auth/logout', input, options)\n }\n\n /**\n * Request a password reset email.\n * Sends a reset link to the provided email address.\n */\n async forgotPassword(input: ForgotPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/forgot-password', input, options)\n }\n\n /**\n * Reset the password using a token from the reset email.\n */\n async resetPassword(input: ResetPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/reset-password', input, options)\n }\n\n /**\n * Get the current authenticated user's profile.\n */\n async me(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n /**\n * Complete the onboarding flow.\n */\n async completeOnboarding(input: CompleteOnboardingInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/onboarding/complete', input, options)\n }\n\n /**\n * Verify 2FA code during login (when login returns requires_2fa).\n */\n async verify2FA(input: Verify2FAInput, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/2fa/login', input, options)\n }\n\n /**\n * Send a verification code to the user's email.\n * If unauthenticated, pass the email address.\n */\n async sendVerificationCode(email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/send', email ? { email } : undefined, options)\n }\n\n /**\n * Verify the email with the 6-digit code.\n * If unauthenticated, pass the email address.\n */\n async verifyEmail(code: string, email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/confirm', email ? { code, email } : { code }, options)\n }\n\n /**\n * Upgrade the current user to a seller role.\n * Idempotent — returns success if already a seller.\n */\n async becomeSeller(input: BecomeSellerInput, options?: RequestOptions): Promise<{ ok: true; roles: string[]; sti_score: number }> {\n return this.client.post<{ ok: true; roles: string[]; sti_score: number }>('/auth/become-seller', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n Category,\n City,\n Condition,\n CreateListingInput,\n Listing,\n ListingImage,\n ListingStatus,\n ListingsFeedParams,\n PaginatedResponse,\n PresignImageResponse,\n SellerStorefront,\n SimilarListing,\n Store,\n UpdateListingInput,\n RequestOptions,\n} from '../types'\n\nexport class ListingsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the marketplace feed with optional filters.\n */\n async getFeed(params?: ListingsFeedParams, options?: RequestOptions): Promise<PaginatedResponse<Listing>> {\n // APIClient handles converting params to string|number|boolean properly\n return this.client.get<PaginatedResponse<Listing>>(\n '/listings/feed', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get full details of a single listing, including its images.\n */\n async getById(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.client.get<Listing & { images: ListingImage[] }>(`/listings/${id}`, undefined, options)\n }\n\n /**\n * Create a new listing (requires seller role).\n */\n async create(input: CreateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.post<Listing>('/listings', input, options)\n }\n\n /**\n * Update an existing listing.\n */\n async update(id: string, input: UpdateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.put<Listing>(`/listings/${id}`, input, options)\n }\n\n /**\n * Change the status of a listing.\n */\n async updateStatus(id: string, status: ListingStatus, options?: RequestOptions): Promise<{ ok: boolean; status: ListingStatus }> {\n return this.client.patch<{ ok: boolean; status: ListingStatus }>(`/listings/${id}/status`, { status }, options)\n }\n\n /**\n * Soft delete a listing (sets status to 'removed').\n */\n async delete(id: string, options?: RequestOptions): Promise<{ ok: boolean }> {\n return this.client.delete<{ ok: boolean }>(`/listings/${id}`, options)\n }\n\n /**\n * Get a seller's public storefront.\n */\n async getSellerStorefront(\n sellerId: string,\n params?: { page?: number; page_size?: number },\n options?: RequestOptions\n ): Promise<SellerStorefront> {\n return this.client.get<SellerStorefront>(\n `/listings/seller/${sellerId}`, \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * List all supported categories.\n */\n async getCategories(options?: RequestOptions): Promise<Category[]> {\n return this.client.get<Category[]>('/listings/categories', undefined, options)\n }\n\n /**\n * List all supported cities.\n */\n async getCities(options?: RequestOptions): Promise<City[]> {\n return this.client.get<City[]>('/listings/cities', undefined, options)\n }\n\n /**\n * Get trending listings, optionally filtered by category.\n */\n async getTrending(categoryId?: string, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n '/listings/trending',\n categoryId ? { category_id: categoryId } : undefined,\n options\n )\n }\n\n /**\n * Get top-performing stores for the home feed.\n */\n async getTopStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/top-stores', undefined, options)\n }\n\n /**\n * Get personalized \"for you\" listings (returns recent for anonymous users).\n */\n async getForYou(options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>('/listings/for-you', undefined, options)\n }\n\n /**\n * Get a presigned upload URL for a listing image.\n * Index should be between 0 and 9.\n */\n async presignImage(listingId: string, index: number, options?: RequestOptions): Promise<PresignImageResponse> {\n return this.client.post<PresignImageResponse>(`/listings/${listingId}/images/presign`, { index }, options)\n }\n\n /**\n * Upload an image file directly for a listing.\n * Uses multipart/form-data.\n */\n async uploadImage(listingId: string, file: Blob, index: number, options?: RequestOptions): Promise<{ r2_key: string; image_id: string; url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('index', String(index))\n return this.client.post<{ r2_key: string; image_id: string; url: string }>(`/listings/${listingId}/images/upload`, formData, options)\n }\n\n /**\n * Browse the listing feed (alias for getFeed with simplified params).\n */\n async feed(params?: { page?: number; city?: string; category?: string; sort?: string }, options?: RequestOptions): Promise<{ data: Listing[]; page: number }> {\n return this.client.get<{ data: Listing[]; page: number }>(\n '/listings',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a single listing by ID (alias for getById).\n */\n async get(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.getById(id, options)\n }\n\n /**\n * Full-text search with filters.\n */\n async search(params: { q: string; category?: string; condition?: Condition; min_price?: number; max_price?: number; sort?: string; page?: number }, options?: RequestOptions): Promise<{ data: Listing[]; total: number }> {\n return this.client.get<{ data: Listing[]; total: number }>(\n '/search',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get similar listings for a given listing.\n */\n async getSimilar(listingId: string, mode?: 'global' | 'store', options?: RequestOptions): Promise<{ data: SimilarListing[] }> {\n return this.client.get<{ data: SimilarListing[] }>(\n `/listings/${listingId}/similar`,\n mode ? { mode } : undefined,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type { PaginatedResponse, SearchParams, SearchResult, SearchHistoryItem, SaveSearchInput, TrendingTerm, RequestOptions } from '../types'\n\nexport class SearchModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Perform a full-text search with optional filters.\n */\n async query(params: SearchParams, options?: RequestOptions): Promise<PaginatedResponse<SearchResult>> {\n return this.client.get<PaginatedResponse<SearchResult>>(\n '/search', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get trending search terms.\n */\n async trending(params?: { city_id?: string }, options?: RequestOptions): Promise<{ terms: TrendingTerm[] }> {\n return this.client.get<{ terms: TrendingTerm[] }>(\n '/search/trending',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get the user's search history.\n */\n async getHistory(options?: RequestOptions): Promise<{ data: SearchHistoryItem[] }> {\n return this.client.get<{ data: SearchHistoryItem[] }>('/search/history', undefined, options)\n }\n\n /**\n * Save a search query to history.\n */\n async saveHistory(input: SaveSearchInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/search/history', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateOrderInput, Order, OrderEvent, OrderHistoryParams, OrderStatus, TransitionOrderInput, RequestOptions } from '../types'\n\nexport class OrdersModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Create a new order from a listing.\n */\n async create(input: CreateOrderInput, options?: RequestOptions): Promise<{ order_id: string; total: number; delivery_fee: number }> {\n return this.client.post<{ order_id: string; total: number; delivery_fee: number }>('/orders', input, options)\n }\n\n /**\n * Get full details of an order, including its event timeline.\n */\n async getById(id: string, options?: RequestOptions): Promise<Order & { events: OrderEvent[] }> {\n return this.client.get<Order & { events: OrderEvent[] }>(`/orders/${id}`, undefined, options)\n }\n\n /**\n * Transition the status of an order.\n */\n async transition(id: string, input: TransitionOrderInput, options?: RequestOptions): Promise<{ ok: boolean; status: OrderStatus }> {\n return this.client.post<{ ok: boolean; status: OrderStatus }>(`/orders/${id}/transition`, input, options)\n }\n\n /**\n * Get the order history for the current authenticated user.\n */\n async getHistory(params?: OrderHistoryParams, options?: RequestOptions): Promise<{ data: Order[]; page: number; page_size: number }> {\n return this.client.get<{ data: Order[]; page: number; page_size: number }>(\n '/orders/history',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type { MpesaInput, PaystackInput, PaystackInitResponse, PaymentStatusResponse, StkPushInput, StkPushResponse, RequestOptions } from '../types'\n\nexport class PayModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Initiate an M-Pesa STK Push payment for an order.\n */\n async initiateStk(input: StkPushInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate M-Pesa STK Push (alias for initiateStk).\n */\n async initMpesa(input: MpesaInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate a Paystack payment — returns access_code for inline popup.\n */\n async initPaystack(input: PaystackInput, options?: RequestOptions): Promise<PaystackInitResponse> {\n return this.client.post<PaystackInitResponse>('/pay/paystack/init', input, options)\n }\n\n /**\n * Poll for the current status of a payment by its order ID.\n */\n async getStatus(orderId: string, options?: RequestOptions): Promise<PaymentStatusResponse> {\n return this.client.get<PaymentStatusResponse>(`/pay/status/${orderId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { VAZIOutfit, VAZIOutfitDetail, VaziFeedParams, VaziFeedResponse, RequestOptions } from '../types'\n\nexport class VaziModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the AI-curated outfit feed.\n */\n async getFeed(params?: VaziFeedParams, options?: RequestOptions): Promise<VaziFeedResponse> {\n return this.client.get<VaziFeedResponse>(\n '/vazi/feed',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a complete outfit built around a specific seed listing.\n */\n async getCompleteLook(listingId: string, options?: RequestOptions): Promise<{ outfits: VAZIOutfit[] }> {\n return this.client.get<{ outfits: VAZIOutfit[] }>(`/vazi/complete/${listingId}`, undefined, options)\n }\n\n /**\n * Get a single outfit by ID with full item details.\n */\n async getOutfit(outfitId: string, options?: RequestOptions): Promise<VAZIOutfitDetail> {\n return this.client.get<VAZIOutfitDetail>(`/vazi/outfits/${outfitId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Conversation, Message, SendMessageInput, RequestOptions } from '../types'\n\nexport class MessagesModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List all conversations for the authenticated user.\n */\n async list(storeId?: string, options?: RequestOptions): Promise<{ data: Conversation[] }> {\n return this.client.get<{ data: Conversation[] }>(\n '/notify/messages',\n storeId ? { store_id: storeId } : undefined,\n options\n )\n }\n\n /**\n * Get the message thread with a specific partner.\n */\n async getThread(partnerId: string, storeId?: string, options?: RequestOptions): Promise<{ data: Message[] }> {\n return this.client.get<{ data: Message[] }>(\n `/notify/messages/${partnerId}`,\n storeId ? { store_id: storeId } : undefined,\n options\n )\n }\n\n /**\n * Send a message to another user.\n */\n async send(input: SendMessageInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/notify/messages', input, options)\n }\n\n /**\n * Mark all messages from a partner as read.\n */\n async markRead(partnerId: string, storeId?: string, options?: RequestOptions): Promise<{ ok: true }> {\n const path = storeId\n ? `/notify/messages/${partnerId}/read?store_id=${storeId}`\n : `/notify/messages/${partnerId}/read`\n return this.client.post<{ ok: true }>(path, undefined, options)\n }\n\n /**\n * Connect to the typing indicator WebSocket for a conversation.\n * Token is passed via query param since WebSocket can't set headers.\n */\n connectTyping(partnerId: string): WebSocket {\n const token = this.client.getToken()\n const wsUrl = this.client.getBaseUrl().replace(/^http/, 'ws') + `/notify/messages/${partnerId}/ws?token=${token}`\n return new WebSocket(wsUrl)\n }\n}\n","import { APIClient } from '../client'\nimport type { Notification, RequestOptions } from '../types'\n\nexport class NotificationsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List paginated notifications with unread count.\n */\n async list(page?: number, options?: RequestOptions): Promise<{ data: Notification[]; unread_count: number; page: number }> {\n return this.client.get<{ data: Notification[]; unread_count: number; page: number }>(\n '/notify/notifications',\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Mark notifications as read. If ids omitted, marks all as read.\n */\n async markRead(ids?: string[], options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/notifications/read', ids ? { ids } : {}, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateStoreInput, UpdateStoreInput, StoreStats, StoreSettings, StoreAnalytics, Listing, Store, RequestOptions } from '../types'\n\nexport class StoresModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Get a store by its URL slug.\n */\n async getBySlug(slug: string, options?: RequestOptions): Promise<Store> {\n return this.client.get<Store>(`/listings/stores/${slug}`, undefined, options)\n }\n\n /**\n * Follow a store.\n */\n async follow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/stores/${storeId}/follow`, undefined, options)\n }\n\n /**\n * Unfollow a store.\n */\n async unfollow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/stores/${storeId}/follow`, options)\n }\n\n /**\n * Get paginated listings for a specific store.\n */\n async getListings(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n `/listings/stores/${storeId}/listings`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Get all stores owned by the authenticated user.\n */\n async getMyStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/stores/mine', undefined, options)\n }\n\n /**\n * Create a new store.\n */\n async create(input: CreateStoreInput, options?: RequestOptions): Promise<{ id: string; slug: string }> {\n return this.client.post<{ id: string; slug: string }>('/listings/stores', input, options)\n }\n\n /**\n * Update a store's details.\n */\n async update(storeId: string, input: UpdateStoreInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}`, input, options)\n }\n\n /**\n * Get store statistics.\n */\n async getStats(storeId: string, options?: RequestOptions): Promise<StoreStats> {\n return this.client.get<StoreStats>(`/listings/stores/${storeId}/stats`, undefined, options)\n }\n\n /**\n * Get store settings.\n */\n async getSettings(storeId: string, options?: RequestOptions): Promise<StoreSettings> {\n return this.client.get<StoreSettings>(`/listings/stores/${storeId}/settings`, undefined, options)\n }\n\n /**\n * Update store settings (partial).\n */\n async updateSettings(storeId: string, input: Partial<StoreSettings>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}/settings`, input, options)\n }\n\n /**\n * Get store analytics.\n */\n async getAnalytics(storeId: string, period?: 'daily' | 'weekly' | 'monthly', options?: RequestOptions): Promise<StoreAnalytics> {\n return this.client.get<StoreAnalytics>(\n `/listings/stores/${storeId}/analytics`,\n period ? { period } : undefined,\n options\n )\n }\n\n /**\n * Upload a store logo image.\n */\n async uploadLogo(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/logo`, formData, options)\n }\n\n /**\n * Upload a store banner image.\n */\n async uploadBanner(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/banner`, formData, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateReviewInput, Review, ReviewableOrder, RequestOptions } from '../types'\n\nexport class ReviewsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List reviews for a store (public).\n */\n async list(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Review[]; total: number; avg_rating: number; page: number }> {\n return this.client.get<{ data: Review[]; total: number; avg_rating: number; page: number }>(\n `/listings/stores/${storeId}/reviews`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Create a review for a store (authenticated).\n */\n async create(storeId: string, input: CreateReviewInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>(`/listings/stores/${storeId}/reviews`, input, options)\n }\n\n /**\n * Get orders eligible for review (delivered/completed, not yet reviewed).\n */\n async getReviewableOrders(storeId: string, options?: RequestOptions): Promise<{ data: ReviewableOrder[] }> {\n return this.client.get<{ data: ReviewableOrder[] }>(`/listings/stores/${storeId}/reviews/eligible`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { WishlistListing, RequestOptions } from '../types'\n\nexport class WishlistsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List saved listings.\n */\n async list(options?: RequestOptions): Promise<{ data: WishlistListing[] }> {\n return this.client.get<{ data: WishlistListing[] }>('/listings/wishlists', undefined, options)\n }\n\n /**\n * Add a listing to the wishlist.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/wishlists/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the wishlist.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/wishlists/${listingId}`, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CartItem, RequestOptions } from '../types'\n\nexport class CartModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List items in the cart.\n */\n async list(options?: RequestOptions): Promise<{ data: CartItem[] }> {\n return this.client.get<{ data: CartItem[] }>('/listings/cart', undefined, options)\n }\n\n /**\n * Add a listing to the cart.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/cart/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the cart.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/cart/${listingId}`, options)\n }\n\n /**\n * Update the quantity of a cart item.\n */\n async updateQuantity(listingId: string, quantity: number, options?: RequestOptions): Promise<{ ok: true; quantity: number }> {\n return this.client.patch<{ ok: true; quantity: number }>(`/listings/cart/${listingId}`, { quantity }, options)\n }\n\n /**\n * Checkout the cart — creates orders grouped by store and clears the cart.\n */\n async checkout(options?: RequestOptions): Promise<{ order_ids: string[]; count: number }> {\n return this.client.post<{ order_ids: string[]; count: number }>('/orders/checkout', undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n UpdateProfileInput,\n ChangePasswordInput,\n Session,\n NotificationPref,\n Address,\n AddAddressInput,\n PaymentMethod,\n AddPaymentMethodInput,\n LinkedAccount,\n LinkedAccountProvider,\n UserProfile,\n RequestOptions,\n} from '../types'\n\nexport class SettingsModule {\n constructor(private readonly client: APIClient) {}\n\n // ── Profile ──\n\n async getProfile(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n async updateProfile(input: UpdateProfileInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/me', input, options)\n }\n\n // ── Security ──\n\n async changePassword(input: ChangePasswordInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/change-password', input, options)\n }\n\n async getSessions(options?: RequestOptions): Promise<{ data: Session[] }> {\n return this.client.get<{ data: Session[] }>('/auth/sessions', undefined, options)\n }\n\n async revokeSession(sessionId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/sessions/${sessionId}`, options)\n }\n\n // ── Notification Preferences ──\n\n async getNotificationPrefs(options?: RequestOptions): Promise<{ data: NotificationPref[] }> {\n return this.client.get<{ data: NotificationPref[] }>('/auth/notification-prefs', undefined, options)\n }\n\n async updateNotificationPref(channel: string, enabled: boolean, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/notification-prefs/${channel}`, { enabled }, options)\n }\n\n // ── Preferences ──\n\n async getPreferences(options?: RequestOptions): Promise<{ data: Record<string, string> }> {\n return this.client.get<{ data: Record<string, string> }>('/auth/preferences', undefined, options)\n }\n\n async updatePreferences(prefs: Record<string, string>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/preferences', { prefs }, options)\n }\n\n // ── Addresses ──\n\n async getAddresses(options?: RequestOptions): Promise<{ data: Address[] }> {\n return this.client.get<{ data: Address[] }>('/auth/addresses', undefined, options)\n }\n\n async addAddress(input: AddAddressInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/addresses', input, options)\n }\n\n async updateAddress(id: string, input: Partial<AddAddressInput>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/addresses/${id}`, input, options)\n }\n\n async deleteAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/addresses/${id}`, options)\n }\n\n async setDefaultAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/addresses/${id}/default`, undefined, options)\n }\n\n // ── Payment Methods ──\n\n async getPaymentMethods(options?: RequestOptions): Promise<{ data: PaymentMethod[] }> {\n return this.client.get<{ data: PaymentMethod[] }>('/auth/payment-methods', undefined, options)\n }\n\n async addPaymentMethod(input: AddPaymentMethodInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/payment-methods', input, options)\n }\n\n async deletePaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/payment-methods/${id}`, options)\n }\n\n async setDefaultPaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/payment-methods/${id}/default`, undefined, options)\n }\n\n // ── Linked Accounts ──\n\n async getLinkedAccounts(options?: RequestOptions): Promise<{ data: LinkedAccount[] }> {\n return this.client.get<{ data: LinkedAccount[] }>('/auth/linked-accounts', undefined, options)\n }\n\n async linkAccount(provider: LinkedAccountProvider, token: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/linked-accounts', { provider, token }, options)\n }\n\n async unlinkAccount(provider: LinkedAccountProvider, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/linked-accounts/${provider}`, options)\n }\n\n // ── 2FA ──\n\n async setup2FA(options?: RequestOptions): Promise<{ secret: string; otpauth_uri: string }> {\n return this.client.post<{ secret: string; otpauth_uri: string }>('/auth/2fa/setup', undefined, options)\n }\n\n async verify2FA(code: string, options?: RequestOptions): Promise<{ ok: true; backup_codes: string[] }> {\n return this.client.post<{ ok: true; backup_codes: string[] }>('/auth/2fa/verify', { code }, options)\n }\n\n async disable2FA(code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/2fa/disable', { code }, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { MailerTemplate, SendEmailInput, RequestOptions } from '../types'\n\nexport class MailerModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Send a transactional email via the notifications worker.\n */\n async send(template: MailerTemplate, input: SendEmailInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/email', { template, ...input }, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Business, UpdateBusinessInput, RequestOptions } from '../types'\n\nexport class BusinessesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Get all businesses owned by the current user. */\n async getMine(options?: RequestOptions): Promise<{ data: Business[] }> {\n return this.client.get<{ data: Business[] }>('/listings/businesses/mine', undefined, options)\n }\n\n /** Get a business by ID. */\n async getById(id: string, options?: RequestOptions): Promise<Business> {\n return this.client.get<Business>(`/listings/businesses/${id}`, undefined, options)\n }\n\n /** Update a business. */\n async update(id: string, input: UpdateBusinessInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/businesses/${id}`, input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { BlockedIp, SystemStats, RequestOptions } from '../types'\n\nexport class AdminModule {\n constructor(private readonly client: APIClient) {}\n\n /** Block an IP address. Default duration: 24 hours. */\n async blockIp(ip: string, durationHours?: number, options?: RequestOptions): Promise<{ ok: true; blocked: string; hours: number }> {\n return this.client.post<{ ok: true; blocked: string; hours: number }>('/admin/block-ip', { ip, duration_hours: durationHours ?? 24 }, options)\n }\n\n /** Unblock an IP address. */\n async unblockIp(ip: string, options?: RequestOptions): Promise<{ ok: true; unblocked: string }> {\n return this.client.post<{ ok: true; unblocked: string }>('/admin/unblock-ip', { ip }, options)\n }\n\n /** List currently blocked IPs. */\n async getBlockedIps(options?: RequestOptions): Promise<{ data: BlockedIp[] }> {\n return this.client.get<{ data: BlockedIp[] }>('/admin/blocked-ips', undefined, options)\n }\n\n /** Get platform-wide statistics. */\n async getSystemStats(options?: RequestOptions): Promise<SystemStats> {\n return this.client.get<SystemStats>('/admin/stats', undefined, options)\n }\n\n /** Suspend a user account. */\n async suspendUser(userId: string, reason: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/suspend`, { reason }, options)\n }\n\n /** Unsuspend a user account. */\n async unsuspendUser(userId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/unsuspend`, undefined, options)\n }\n\n /** Grant verified badge to a store. */\n async verifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/verify`, undefined, options)\n }\n\n /** Revoke verified badge from a store. */\n async unverifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/unverify`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Dispute, RaiseDisputeInput, RespondDisputeInput, ResolveDisputeInput, DisputeListParams, RequestOptions } from '../types'\n\nexport class DisputesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Raise a dispute on an order (buyer). */\n async raise(orderId: string, input: RaiseDisputeInput, options?: RequestOptions): Promise<{ dispute_id: string; status: 'open' }> {\n return this.client.post<{ dispute_id: string; status: 'open' }>(`/orders/${orderId}/dispute`, input, options)\n }\n\n /** Get the dispute for a specific order. */\n async getForOrder(orderId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/${orderId}/dispute`, undefined, options)\n }\n\n /** Get a dispute by ID. */\n async get(disputeId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/disputes/${disputeId}`, undefined, options)\n }\n\n /** Add evidence to a dispute. */\n async addEvidence(disputeId: string, input: { type: 'image' | 'text'; content: string }, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/orders/disputes/${disputeId}/evidence`, input, options)\n }\n\n /** Escalate a dispute to admin review (buyer). */\n async escalate(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'under_review' }> {\n return this.client.post<{ ok: true; status: 'under_review' }>(`/orders/disputes/${disputeId}/escalate`, undefined, options)\n }\n\n /** Withdraw a dispute (buyer). */\n async withdraw(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'withdrawn' }> {\n return this.client.post<{ ok: true; status: 'withdrawn' }>(`/orders/disputes/${disputeId}/withdraw`, undefined, options)\n }\n\n /** Respond to a dispute (seller). */\n async respond(disputeId: string, input: RespondDisputeInput, options?: RequestOptions): Promise<{ ok: true; status?: string; voluntary?: boolean }> {\n return this.client.post<{ ok: true; status?: string; voluntary?: boolean }>(`/orders/disputes/${disputeId}/respond`, input, options)\n }\n\n /** List all disputes (admin). */\n async list(params?: DisputeListParams, options?: RequestOptions): Promise<{ data: Dispute[]; page: number; page_size: number }> {\n return this.client.get<{ data: Dispute[]; page: number; page_size: number }>(\n '/orders/disputes',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /** Resolve a dispute (admin). */\n async resolve(disputeId: string, input: ResolveDisputeInput, options?: RequestOptions): Promise<{ ok: true; status: string; sti_impact: number }> {\n return this.client.post<{ ok: true; status: string; sti_impact: number }>(`/orders/disputes/${disputeId}/resolve`, input, options)\n }\n}\n","export const CONDITIONS = ['new', 'like_new', 'good', 'fair'] as const\nexport type Condition = typeof CONDITIONS[number]\n\nexport const LISTING_STATUSES = ['draft', 'active', 'sold', 'removed'] as const\nexport type ListingStatus = typeof LISTING_STATUSES[number]\n\nexport interface ListingImage {\n id: string\n listing_id: string\n url: string\n position: number\n created_at: string\n}\n\nexport interface SellerProfile {\n id: string\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n}\n\nexport interface Listing {\n id: string\n seller_id: string\n title: string\n description: string | null\n category_id: string\n city_id: string\n price: number // KES integer\n condition: Condition\n status: ListingStatus\n photo_verified: boolean\n vazi_eligible: boolean\n size: string | null\n created_at: string\n updated_at: string\n // Seller profile (joined)\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n // Images (only present on GET /listings/:id, not in feed)\n images?: ListingImage[]\n // First image as full CDN URL (present in feeds/store listings)\n image_url?: string | null\n}\n\nexport interface ListingsFeedParams {\n city_id?: string\n category_id?: string\n min_price?: number\n max_price?: number\n condition?: Condition\n sort?: 'recency' | 'price_asc' | 'price_desc'\n page?: number\n page_size?: number\n}\n\nexport interface CreateListingInput {\n store_id: string\n title: string\n description?: string\n category_id: string\n city_id: string\n price: number\n condition: Condition\n size?: string\n vazi_eligible?: boolean\n}\n\nexport type UpdateListingInput = Partial<CreateListingInput>\n\nexport interface Category {\n id: string\n name: string\n slug: string\n}\n\nexport interface City {\n id: string\n name: string\n delivery_fee: number\n}\n\nexport interface SellerStorefront {\n seller: SellerProfile\n listings: Listing[]\n total: number\n page: number\n page_size: number\n has_more: boolean\n}\n\nexport interface PresignImageResponse {\n r2_key: string\n image_id: string\n}\n\nexport interface SimilarListing {\n id: string\n title: string\n price: number\n condition: string\n category_id: string\n store_id: string | null\n image_keys: string | null\n created_at: string\n}\n","export const ORDER_STATUSES = [\n 'created',\n 'payment_pending',\n 'paid',\n 'seller_confirmed',\n 'shipped',\n 'delivered',\n 'completed',\n 'cancelled',\n 'disputed',\n] as const\n\nexport type OrderStatus = typeof ORDER_STATUSES[number]\n\nexport interface OrderEvent {\n id: string\n order_id: string\n actor: string // user ID or 'system'\n old_status: string\n new_status: string\n note: string | null\n created_at: string\n}\n\nexport interface DeliveryAddress {\n label: string\n line1: string\n city: string\n county: string\n phone: string\n}\n\nexport interface Order {\n id: string\n buyer_id: string\n seller_id: string\n listing_id: string\n amount: number\n delivery_fee: number\n total: number\n status: OrderStatus\n city_id: string\n created_at: string\n updated_at: string\n // Joined listing details\n listing_title: string | null\n listing_image_url: string | null\n listing_condition: string | null\n listing_size: string | null\n // Joined buyer details\n buyer_name: string | null\n buyer_phone: string | null\n // Buyer's default delivery address\n delivery_address: DeliveryAddress | null\n events?: OrderEvent[]\n}\n\nexport interface CreateOrderInput {\n listing_id: string\n}\n\nexport interface TransitionOrderInput {\n status: OrderStatus\n note?: string\n}\n\nexport interface OrderHistoryParams {\n role?: 'buyer' | 'seller'\n store_id?: string\n page?: number\n}\n","export interface StkPushInput {\n order_id: string\n phone: string // format: +254XXXXXXXXX\n}\n\nexport type MpesaInput = StkPushInput\n\nexport interface StkPushResponse {\n payment_id: string\n provider: string\n}\n\nexport interface PaystackInput {\n order_id: string\n email: string\n}\n\nexport interface PaystackInitResponse {\n access_code: string\n authorization_url: string\n reference: string\n}\n\nexport const PAYMENT_STATUSES = ['initiated', 'funded', 'failed', 'refunded', 'cancelled'] as const\nexport type PaymentStatus = typeof PAYMENT_STATUSES[number]\n\nexport interface PaymentStatusResponse {\n id: string\n status: PaymentStatus\n total: number\n}\n","export const DISPUTE_REASONS = ['not_received', 'not_as_described', 'damaged', 'counterfeit', 'wrong_item'] as const\nexport type DisputeReason = typeof DISPUTE_REASONS[number]\n\nexport const DESIRED_RESOLUTIONS = ['refund', 'replacement', 'partial_refund'] as const\nexport type DesiredResolution = typeof DESIRED_RESOLUTIONS[number]\n\nexport const DISPUTE_STATUSES = ['open', 'seller_responded', 'under_review', 'resolved_refund', 'resolved_release', 'resolved_partial', 'withdrawn'] as const\nexport type DisputeStatus = typeof DISPUTE_STATUSES[number]\n\nexport interface DisputeEvidence {\n id: string\n uploader_role: 'buyer' | 'seller' | 'admin'\n type: 'image' | 'text'\n content: string\n created_at: string\n}\n\nexport interface DisputeEvent {\n actor_role: 'buyer' | 'seller' | 'admin' | 'system'\n action: string\n old_status: string | null\n new_status: string | null\n note: string | null\n created_at: string\n}\n\nexport interface Dispute {\n id: string\n order_id: string\n buyer_id: string\n seller_id: string\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n status: DisputeStatus\n amount_disputed: number\n resolution: 'refund' | 'release' | 'partial' | null\n resolution_amount: number | null\n resolution_note: string | null\n sti_impact: number | null\n seller_responded_at: string | null\n escalated_at: string | null\n resolved_at: string | null\n created_at: string\n updated_at: string\n evidence?: DisputeEvidence[]\n events?: DisputeEvent[]\n}\n\nexport interface RaiseDisputeInput {\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n evidence_urls?: string[]\n}\n\nexport interface RespondDisputeInput {\n accept: boolean\n message?: string\n evidence_urls?: string[]\n}\n\nexport interface ResolveDisputeInput {\n resolution: 'refund' | 'release' | 'partial'\n amount?: number\n note?: string\n}\n\nexport interface DisputeListParams {\n status?: DisputeStatus\n page?: number\n}\n","import { APIClient } from './client'\nimport { MitumbaClientConfig } from './types'\nimport { AuthModule } from './modules/auth'\nimport { ListingsModule } from './modules/listings'\nimport { SearchModule } from './modules/search'\nimport { OrdersModule } from './modules/orders'\nimport { PayModule } from './modules/pay'\nimport { VaziModule } from './modules/vazi'\nimport { MessagesModule } from './modules/messages'\nimport { NotificationsModule } from './modules/notifications'\nimport { StoresModule } from './modules/stores'\nimport { ReviewsModule } from './modules/reviews'\nimport { WishlistsModule } from './modules/wishlists'\nimport { CartModule } from './modules/cart'\nimport { SettingsModule } from './modules/settings'\nimport { MailerModule } from './modules/mailer'\nimport { BusinessesModule } from './modules/businesses'\nimport { AdminModule } from './modules/admin'\nimport { DisputesModule } from './modules/disputes'\n\nexport class MitumbaClient {\n public readonly api: APIClient\n public readonly auth: AuthModule\n public readonly listings: ListingsModule\n public readonly search: SearchModule\n public readonly orders: OrdersModule\n public readonly pay: PayModule\n public readonly vazi: VaziModule\n public readonly messages: MessagesModule\n public readonly notifications: NotificationsModule\n public readonly stores: StoresModule\n public readonly reviews: ReviewsModule\n public readonly wishlists: WishlistsModule\n public readonly cart: CartModule\n public readonly settings: SettingsModule\n public readonly mailer: MailerModule\n public readonly businesses: BusinessesModule\n public readonly admin: AdminModule\n public readonly disputes: DisputesModule\n\n constructor(config: MitumbaClientConfig) {\n this.api = new APIClient(config)\n this.auth = new AuthModule(this.api)\n this.listings = new ListingsModule(this.api)\n this.search = new SearchModule(this.api)\n this.orders = new OrdersModule(this.api)\n this.pay = new PayModule(this.api)\n this.vazi = new VaziModule(this.api)\n this.messages = new MessagesModule(this.api)\n this.notifications = new NotificationsModule(this.api)\n this.stores = new StoresModule(this.api)\n this.reviews = new ReviewsModule(this.api)\n this.wishlists = new WishlistsModule(this.api)\n this.cart = new CartModule(this.api)\n this.settings = new SettingsModule(this.api)\n this.mailer = new MailerModule(this.api)\n this.businesses = new BusinessesModule(this.api)\n this.admin = new AdminModule(this.api)\n this.disputes = new DisputesModule(this.api)\n }\n\n /**\n * Set the access token for authenticated requests.\n * Optionally pass a refresh token to enable automatic token rotation.\n */\n public setToken(token: string, refreshToken?: string) {\n this.api.setToken(token, refreshToken)\n }\n\n /**\n * Get the current access token.\n */\n public getToken(): string | undefined {\n return this.api.getToken()\n }\n\n /**\n * Clear the current tokens.\n */\n public clearToken() {\n this.api.clearToken()\n }\n\n /**\n * Hydrate tokens from persistent store (call on app boot).\n */\n public hydrate(): Promise<void> {\n return this.api.hydrate()\n }\n\n /**\n * Check if user has a stored session.\n */\n public isAuthenticated(): Promise<boolean> {\n return this.api.isAuthenticated()\n }\n}\n\nexport * from './types'\nexport { APIClient, APIError } from './client'\nexport { MemoryTokenStore, IDBTokenStore, createTokenStore } from './token-store'\nexport type { TokenStore } from './token-store'\nexport { AuthModule } from './modules/auth'\nexport { ListingsModule } from './modules/listings'\nexport { SearchModule } from './modules/search'\nexport { OrdersModule } from './modules/orders'\nexport { PayModule } from './modules/pay'\nexport { VaziModule } from './modules/vazi'\nexport { MessagesModule } from './modules/messages'\nexport { NotificationsModule } from './modules/notifications'\nexport { StoresModule } from './modules/stores'\nexport { ReviewsModule } from './modules/reviews'\nexport { WishlistsModule } from './modules/wishlists'\nexport { CartModule } from './modules/cart'\nexport { SettingsModule } from './modules/settings'\nexport { MailerModule } from './modules/mailer'\nexport { BusinessesModule } from './modules/businesses'\nexport { AdminModule } from './modules/admin'\nexport { DisputesModule } from './modules/disputes'\n"]}
1
+ {"version":3,"sources":["../src/token-store.ts","../src/client.ts","../src/modules/auth.ts","../src/modules/listings.ts","../src/modules/search.ts","../src/modules/orders.ts","../src/modules/pay.ts","../src/modules/vazi.ts","../src/modules/messages.ts","../src/modules/notifications.ts","../src/modules/stores.ts","../src/modules/reviews.ts","../src/modules/wishlists.ts","../src/modules/cart.ts","../src/modules/settings.ts","../src/modules/mailer.ts","../src/modules/businesses.ts","../src/modules/admin.ts","../src/modules/disputes.ts","../src/modules/uploads.ts","../src/types/listings.ts","../src/types/orders.ts","../src/types/pay.ts","../src/types/disputes.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export interface TokenStore {\n getAccessToken(): Promise<string | null>\n getRefreshToken(): Promise<string | null>\n setTokens(access: string, refresh: string): Promise<void>\n clear(): Promise<void>\n}\n\nexport class MemoryTokenStore implements TokenStore {\n private accessToken: string | null = null\n private refreshToken: string | null = null\n\n async getAccessToken(): Promise<string | null> { return this.accessToken }\n async getRefreshToken(): Promise<string | null> { return this.refreshToken }\n async setTokens(access: string, refresh: string): Promise<void> {\n this.accessToken = access\n this.refreshToken = refresh\n }\n async clear(): Promise<void> {\n this.accessToken = null\n this.refreshToken = null\n }\n}\n\nconst DB_NAME = 'mitumba_sdk'\nconst STORE_NAME = 'tokens'\nconst KEY = 'auth'\n\nexport class IDBTokenStore implements TokenStore {\n private dbPromise: Promise<IDBDatabase> | null = null\n\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, 1)\n request.onupgradeneeded = () => {\n request.result.createObjectStore(STORE_NAME)\n }\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n return this.dbPromise\n }\n\n private async get(): Promise<{ access: string; refresh: string } | null> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly')\n const req = tx.objectStore(STORE_NAME).get(KEY)\n req.onsuccess = () => resolve(req.result || null)\n req.onerror = () => reject(req.error)\n })\n }\n\n async getAccessToken(): Promise<string | null> {\n const data = await this.get()\n return data?.access ?? null\n }\n\n async getRefreshToken(): Promise<string | null> {\n const data = await this.get()\n return data?.refresh ?? null\n }\n\n async setTokens(access: string, refresh: string): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).put({ access, refresh }, KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n\n async clear(): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).delete(KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n}\n\n/** Creates IDBTokenStore if indexedDB is available, otherwise MemoryTokenStore. */\nexport function createTokenStore(): TokenStore {\n if (typeof indexedDB !== 'undefined') {\n return new IDBTokenStore()\n }\n return new MemoryTokenStore()\n}\n","import { MitumbaClientConfig, APIErrorResponse, RequestOptions } from './types'\nimport { TokenStore, createTokenStore } from './token-store'\n\nexport class APIError extends Error {\n public readonly code: string\n public readonly status: number\n public readonly details?: unknown\n\n constructor(status: number, data: APIErrorResponse) {\n super(data.message || data.error)\n this.name = 'APIError'\n this.code = data.error\n this.status = status\n this.details = data.details\n }\n}\n\nfunction isExpiringSoon(token: string, thresholdSeconds: number): boolean {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]))\n const exp = payload.exp as number\n return exp - (Date.now() / 1000) < thresholdSeconds\n } catch {\n return false\n }\n}\n\nexport class APIClient {\n private config: MitumbaClientConfig\n private tokenStore: TokenStore\n private isRefreshing = false\n private refreshPromise: Promise<void> | null = null\n\n constructor(config: MitumbaClientConfig) {\n this.config = config\n this.tokenStore = config.tokenStore ?? createTokenStore()\n\n // Seed store from config if tokens provided\n if (config.token) {\n this.tokenStore.setTokens(config.token, config.refreshToken ?? '')\n }\n }\n\n public async setToken(token: string, refreshToken?: string): Promise<void> {\n this.config.token = token\n if (refreshToken) {\n this.config.refreshToken = refreshToken\n }\n await this.tokenStore.setTokens(token, refreshToken ?? this.config.refreshToken ?? '')\n }\n\n public getToken(): string | undefined {\n return this.config.token\n }\n\n public getBaseUrl(): string {\n return this.config.baseUrl\n }\n\n public async clearToken(): Promise<void> {\n this.config.token = undefined\n this.config.refreshToken = undefined\n await this.tokenStore.clear()\n }\n\n /**\n * Check if user has a stored session (access or refresh token available).\n */\n public async isAuthenticated(): Promise<boolean> {\n const access = this.config.token ?? await this.tokenStore.getAccessToken()\n if (access) return true\n const refresh = await this.tokenStore.getRefreshToken()\n return !!refresh\n }\n\n /**\n * Hydrate tokens from the store into memory (call on app boot).\n */\n public async hydrate(): Promise<void> {\n const access = await this.tokenStore.getAccessToken()\n const refresh = await this.tokenStore.getRefreshToken()\n if (access) this.config.token = access\n if (refresh) this.config.refreshToken = refresh\n }\n\n private async ensureFreshToken(): Promise<void> {\n // Try hydrating from store if no in-memory token\n if (!this.config.token) {\n const stored = await this.tokenStore.getAccessToken()\n if (stored) this.config.token = stored\n const refresh = await this.tokenStore.getRefreshToken()\n if (refresh) this.config.refreshToken = refresh\n }\n\n // Proactive refresh if token expires within 60 seconds\n if (this.config.token && isExpiringSoon(this.config.token, 60) && this.config.refreshToken) {\n await this.handleTokenRefresh()\n }\n }\n\n private async request<T>(\n method: string, \n path: string, \n body?: unknown, \n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions\n ): Promise<T> {\n // Proactive refresh before request (skip for auth endpoints)\n if (!path.includes('/auth/refresh') && !path.includes('/auth/login') && !path.includes('/auth/register')) {\n await this.ensureFreshToken()\n }\n\n const url = new URL(path, this.config.baseUrl)\n \n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n }\n }\n\n const headers = new Headers()\n if (body && !(body instanceof FormData)) {\n headers.set('Content-Type', 'application/json')\n }\n\n if (this.config.token) {\n headers.set('Authorization', `Bearer ${this.config.token}`)\n }\n\n const init: RequestInit = {\n method,\n headers,\n body: body instanceof FormData ? body : body ? JSON.stringify(body) : undefined,\n signal: options?.signal\n }\n\n const maxRetries = this.config.maxRetries ?? 3\n let attempt = 0\n let response: Response\n\n while (true) {\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()}`)\n }\n \n const startTime = Date.now()\n try {\n response = await fetch(url.toString(), init)\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw err\n }\n if (attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] Network error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n throw new APIError(0, { error: 'network_error', message: err instanceof Error ? err.message : 'Network request failed' })\n }\n\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()} - ${response.status} (${Date.now() - startTime}ms)`)\n }\n\n if (response.status >= 500 && attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${response.status} error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n\n break\n }\n\n // Handle 401 — attempt refresh and retry\n if (response.status === 401 && this.config.refreshToken && !path.includes('/auth/refresh')) {\n try {\n await this.handleTokenRefresh()\n // Retry request with new token\n headers.set('Authorization', `Bearer ${this.config.token}`)\n response = await fetch(url.toString(), { ...init, headers })\n } catch {\n // Refresh failed — session is dead\n if (this.config.onAuthExpired) {\n this.config.onAuthExpired()\n }\n throw new APIError(401, { error: 'session_expired', message: 'Session expired. Please log in again.' })\n }\n }\n\n if (!response.ok) {\n let errorData: APIErrorResponse\n try {\n errorData = await response.json()\n } catch {\n errorData = { error: 'unknown_error', message: response.statusText }\n }\n throw new APIError(response.status, errorData)\n }\n\n if (response.status === 204) {\n return undefined as unknown as T\n }\n\n return response.json() as Promise<T>\n }\n\n private async handleTokenRefresh(): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.isRefreshing = true\n this.refreshPromise = (async () => {\n try {\n const url = new URL('/auth/refresh', this.config.baseUrl)\n const response = await fetch(url.toString(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refresh_token: this.config.refreshToken }),\n })\n\n if (!response.ok) {\n throw new Error('Refresh failed')\n }\n\n const data = await response.json() as { access_token: string, refresh_token: string }\n this.config.token = data.access_token\n this.config.refreshToken = data.refresh_token\n await this.tokenStore.setTokens(data.access_token, data.refresh_token)\n\n if (this.config.onTokenRefresh) {\n this.config.onTokenRefresh({ token: data.access_token, refreshToken: data.refresh_token })\n }\n } catch (err) {\n await this.clearToken()\n throw err\n } finally {\n this.isRefreshing = false\n this.refreshPromise = null\n }\n })()\n\n return this.refreshPromise\n }\n\n public get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, params, options)\n }\n\n public post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, undefined, options)\n }\n\n public put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, undefined, options)\n }\n\n public patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, body, undefined, options)\n }\n\n public delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, undefined, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n RegisterInput,\n LoginInput,\n SendOtpInput,\n VerifyOtpInput,\n ForgotPasswordInput,\n ResetPasswordInput,\n CompleteOnboardingInput,\n Verify2FAInput,\n TwoFactorRequired,\n BecomeSellerInput,\n UserProfile,\n AuthTokens,\n MessageResponse,\n RequestOptions,\n} from '../types'\n\nexport class AuthModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Register a new account.\n * If using EmailRegisterInput, returns AuthTokens.\n * If using PhoneRegisterInput, returns MessageResponse (OTP sent).\n */\n async register(input: RegisterInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse> {\n return this.client.post<AuthTokens | MessageResponse>('/auth/register', input, options)\n }\n\n /**\n * Log in to an existing account.\n * If using EmailLoginInput, returns AuthTokens (or TwoFactorRequired if 2FA enabled).\n * If using PhoneLoginInput, returns MessageResponse (OTP sent).\n */\n async login(input: LoginInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse | TwoFactorRequired> {\n return this.client.post<AuthTokens | MessageResponse | TwoFactorRequired>('/auth/login', input, options)\n }\n\n /**\n * Send an OTP code to a phone number.\n */\n async sendOtp(input: SendOtpInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/otp/send', input, options)\n }\n\n /**\n * Verify an OTP code.\n */\n async verifyOtp(input: VerifyOtpInput, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/otp/verify', input, options)\n }\n\n /**\n * Refresh the access token using a refresh token.\n */\n async refresh(input: { refresh_token: string }, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/refresh', input, options)\n }\n\n /**\n * Revoke the refresh token and log out.\n */\n async logout(input: { refresh_token: string }, options?: RequestOptions): Promise<{ ok: boolean }> {\n return this.client.post<{ ok: boolean }>('/auth/logout', input, options)\n }\n\n /**\n * Request a password reset email.\n * Sends a reset link to the provided email address.\n */\n async forgotPassword(input: ForgotPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/forgot-password', input, options)\n }\n\n /**\n * Reset the password using a token from the reset email.\n */\n async resetPassword(input: ResetPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/reset-password', input, options)\n }\n\n /**\n * Get the current authenticated user's profile.\n */\n async me(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n /**\n * Complete the onboarding flow.\n */\n async completeOnboarding(input: CompleteOnboardingInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/onboarding/complete', input, options)\n }\n\n /**\n * Verify 2FA code during login (when login returns requires_2fa).\n */\n async verify2FA(input: Verify2FAInput, options?: RequestOptions): Promise<AuthTokens> {\n return this.client.post<AuthTokens>('/auth/2fa/login', input, options)\n }\n\n /**\n * Send a verification code to the user's email.\n * If unauthenticated, pass the email address.\n */\n async sendVerificationCode(email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/send', email ? { email } : undefined, options)\n }\n\n /**\n * Verify the email with the 6-digit code.\n * If unauthenticated, pass the email address.\n */\n async verifyEmail(code: string, email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/confirm', email ? { code, email } : { code }, options)\n }\n\n /**\n * Upgrade the current user to a seller role.\n * Idempotent — returns success if already a seller.\n */\n async becomeSeller(input: BecomeSellerInput, options?: RequestOptions): Promise<{ ok: true; roles: string[]; sti_score: number }> {\n return this.client.post<{ ok: true; roles: string[]; sti_score: number }>('/auth/become-seller', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n Category,\n City,\n Condition,\n CreateListingInput,\n Listing,\n ListingImage,\n ListingStatus,\n ListingsFeedParams,\n PaginatedResponse,\n PresignImageResponse,\n SellerStorefront,\n SimilarListing,\n Store,\n UpdateListingInput,\n RequestOptions,\n} from '../types'\n\nexport class ListingsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the marketplace feed with optional filters.\n */\n async getFeed(params?: ListingsFeedParams, options?: RequestOptions): Promise<PaginatedResponse<Listing>> {\n // APIClient handles converting params to string|number|boolean properly\n return this.client.get<PaginatedResponse<Listing>>(\n '/listings/feed', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get full details of a single listing, including its images.\n */\n async getById(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.client.get<Listing & { images: ListingImage[] }>(`/listings/${id}`, undefined, options)\n }\n\n /**\n * Create a new listing (requires seller role).\n */\n async create(input: CreateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.post<Listing>('/listings', input, options)\n }\n\n /**\n * Update an existing listing.\n */\n async update(id: string, input: UpdateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.put<Listing>(`/listings/${id}`, input, options)\n }\n\n /**\n * Change the status of a listing.\n */\n async updateStatus(id: string, status: ListingStatus, options?: RequestOptions): Promise<{ ok: boolean; status: ListingStatus }> {\n return this.client.patch<{ ok: boolean; status: ListingStatus }>(`/listings/${id}/status`, { status }, options)\n }\n\n /**\n * Soft delete a listing (sets status to 'removed').\n */\n async delete(id: string, options?: RequestOptions): Promise<{ ok: boolean }> {\n return this.client.delete<{ ok: boolean }>(`/listings/${id}`, options)\n }\n\n /**\n * Get a seller's public storefront.\n */\n async getSellerStorefront(\n sellerId: string,\n params?: { page?: number; page_size?: number },\n options?: RequestOptions\n ): Promise<SellerStorefront> {\n return this.client.get<SellerStorefront>(\n `/listings/seller/${sellerId}`, \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * List all supported categories.\n */\n async getCategories(options?: RequestOptions): Promise<Category[]> {\n return this.client.get<Category[]>('/listings/categories', undefined, options)\n }\n\n /**\n * List all supported cities.\n */\n async getCities(options?: RequestOptions): Promise<City[]> {\n return this.client.get<City[]>('/listings/cities', undefined, options)\n }\n\n /**\n * Get trending listings, optionally filtered by category.\n */\n async getTrending(categoryId?: string, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n '/listings/trending',\n categoryId ? { category_id: categoryId } : undefined,\n options\n )\n }\n\n /**\n * Get top-performing stores for the home feed.\n */\n async getTopStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/top-stores', undefined, options)\n }\n\n /**\n * Get personalized \"for you\" listings (returns recent for anonymous users).\n */\n async getForYou(options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>('/listings/for-you', undefined, options)\n }\n\n /**\n * Get a presigned upload URL for a listing image.\n * Index should be between 0 and 9.\n */\n async presignImage(listingId: string, index: number, options?: RequestOptions): Promise<PresignImageResponse> {\n return this.client.post<PresignImageResponse>(`/listings/${listingId}/images/presign`, { index }, options)\n }\n\n /**\n * Upload an image file directly for a listing.\n * Uses multipart/form-data.\n */\n async uploadImage(listingId: string, file: Blob, index: number, options?: RequestOptions): Promise<{ r2_key: string; image_id: string; url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('index', String(index))\n return this.client.post<{ r2_key: string; image_id: string; url: string }>(`/listings/${listingId}/images/upload`, formData, options)\n }\n\n /**\n * Browse the listing feed (alias for getFeed with simplified params).\n */\n async feed(params?: { page?: number; city?: string; category?: string; sort?: string }, options?: RequestOptions): Promise<{ data: Listing[]; page: number }> {\n return this.client.get<{ data: Listing[]; page: number }>(\n '/listings',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a single listing by ID (alias for getById).\n */\n async get(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.getById(id, options)\n }\n\n /**\n * Full-text search with filters.\n */\n async search(params: { q: string; category?: string; condition?: Condition; min_price?: number; max_price?: number; sort?: string; page?: number }, options?: RequestOptions): Promise<{ data: Listing[]; total: number }> {\n return this.client.get<{ data: Listing[]; total: number }>(\n '/search',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get similar listings for a given listing.\n */\n async getSimilar(listingId: string, mode?: 'global' | 'store', options?: RequestOptions): Promise<{ data: SimilarListing[] }> {\n return this.client.get<{ data: SimilarListing[] }>(\n `/listings/${listingId}/similar`,\n mode ? { mode } : undefined,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type { PaginatedResponse, SearchParams, SearchResult, SearchHistoryItem, SaveSearchInput, TrendingTerm, RequestOptions } from '../types'\n\nexport class SearchModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Perform a full-text search with optional filters.\n */\n async query(params: SearchParams, options?: RequestOptions): Promise<PaginatedResponse<SearchResult>> {\n return this.client.get<PaginatedResponse<SearchResult>>(\n '/search', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get trending search terms.\n */\n async trending(params?: { city_id?: string }, options?: RequestOptions): Promise<{ terms: TrendingTerm[] }> {\n return this.client.get<{ terms: TrendingTerm[] }>(\n '/search/trending',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get the user's search history.\n */\n async getHistory(options?: RequestOptions): Promise<{ data: SearchHistoryItem[] }> {\n return this.client.get<{ data: SearchHistoryItem[] }>('/search/history', undefined, options)\n }\n\n /**\n * Save a search query to history.\n */\n async saveHistory(input: SaveSearchInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/search/history', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateOrderInput, Order, OrderEvent, OrderHistoryParams, OrderStatus, TransitionOrderInput, RequestOptions } from '../types'\n\nexport class OrdersModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Create a new order from a listing.\n */\n async create(input: CreateOrderInput, options?: RequestOptions): Promise<{ order_id: string; total: number; delivery_fee: number }> {\n return this.client.post<{ order_id: string; total: number; delivery_fee: number }>('/orders', input, options)\n }\n\n /**\n * Get full details of an order, including its event timeline.\n */\n async getById(id: string, options?: RequestOptions): Promise<Order & { events: OrderEvent[] }> {\n return this.client.get<Order & { events: OrderEvent[] }>(`/orders/${id}`, undefined, options)\n }\n\n /**\n * Transition the status of an order.\n */\n async transition(id: string, input: TransitionOrderInput, options?: RequestOptions): Promise<{ ok: boolean; status: OrderStatus }> {\n return this.client.post<{ ok: boolean; status: OrderStatus }>(`/orders/${id}/transition`, input, options)\n }\n\n /**\n * Get the order history for the current authenticated user.\n */\n async getHistory(params?: OrderHistoryParams, options?: RequestOptions): Promise<{ data: Order[]; page: number; page_size: number }> {\n return this.client.get<{ data: Order[]; page: number; page_size: number }>(\n '/orders/history',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type { MpesaInput, PaystackInput, PaystackInitResponse, PaymentStatusResponse, StkPushInput, StkPushResponse, RequestOptions } from '../types'\n\nexport class PayModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Initiate an M-Pesa STK Push payment for an order.\n */\n async initiateStk(input: StkPushInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate M-Pesa STK Push (alias for initiateStk).\n */\n async initMpesa(input: MpesaInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate a Paystack payment — returns access_code for inline popup.\n */\n async initPaystack(input: PaystackInput, options?: RequestOptions): Promise<PaystackInitResponse> {\n return this.client.post<PaystackInitResponse>('/pay/paystack/init', input, options)\n }\n\n /**\n * Poll for the current status of a payment by its order ID.\n */\n async getStatus(orderId: string, options?: RequestOptions): Promise<PaymentStatusResponse> {\n return this.client.get<PaymentStatusResponse>(`/pay/status/${orderId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { VAZIOutfit, VAZIOutfitDetail, VaziFeedParams, VaziFeedResponse, RequestOptions } from '../types'\n\nexport class VaziModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the AI-curated outfit feed.\n */\n async getFeed(params?: VaziFeedParams, options?: RequestOptions): Promise<VaziFeedResponse> {\n return this.client.get<VaziFeedResponse>(\n '/vazi/feed',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a complete outfit built around a specific seed listing.\n */\n async getCompleteLook(listingId: string, options?: RequestOptions): Promise<{ outfits: VAZIOutfit[] }> {\n return this.client.get<{ outfits: VAZIOutfit[] }>(`/vazi/complete/${listingId}`, undefined, options)\n }\n\n /**\n * Get a single outfit by ID with full item details.\n */\n async getOutfit(outfitId: string, options?: RequestOptions): Promise<VAZIOutfitDetail> {\n return this.client.get<VAZIOutfitDetail>(`/vazi/outfits/${outfitId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Conversation, Message, SendMessageInput, RequestOptions } from '../types'\n\nexport class MessagesModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List all conversations for the authenticated user.\n */\n async list(storeId?: string, options?: RequestOptions): Promise<{ data: Conversation[] }> {\n return this.client.get<{ data: Conversation[] }>(\n '/notify/messages',\n storeId ? { store_id: storeId } : undefined,\n options\n )\n }\n\n /**\n * Get the message thread with a specific partner.\n */\n async getThread(partnerId: string, storeId?: string, options?: RequestOptions): Promise<{ data: Message[] }> {\n return this.client.get<{ data: Message[] }>(\n `/notify/messages/${partnerId}`,\n storeId ? { store_id: storeId } : undefined,\n options\n )\n }\n\n /**\n * Send a message to another user.\n */\n async send(input: SendMessageInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/notify/messages', input, options)\n }\n\n /**\n * Mark all messages from a partner as read.\n */\n async markRead(partnerId: string, storeId?: string, options?: RequestOptions): Promise<{ ok: true }> {\n const path = storeId\n ? `/notify/messages/${partnerId}/read?store_id=${storeId}`\n : `/notify/messages/${partnerId}/read`\n return this.client.post<{ ok: true }>(path, undefined, options)\n }\n\n /**\n * Connect to the typing indicator WebSocket for a conversation.\n * Token is passed via query param since WebSocket can't set headers.\n */\n connectTyping(partnerId: string): WebSocket {\n const token = this.client.getToken()\n const wsUrl = this.client.getBaseUrl().replace(/^http/, 'ws') + `/notify/messages/${partnerId}/ws?token=${token}`\n return new WebSocket(wsUrl)\n }\n}\n","import { APIClient } from '../client'\nimport type { Notification, RequestOptions } from '../types'\n\nexport class NotificationsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List paginated notifications with unread count.\n */\n async list(page?: number, options?: RequestOptions): Promise<{ data: Notification[]; unread_count: number; page: number }> {\n return this.client.get<{ data: Notification[]; unread_count: number; page: number }>(\n '/notify/notifications',\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Mark notifications as read. If ids omitted, marks all as read.\n */\n async markRead(ids?: string[], options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/notifications/read', ids ? { ids } : {}, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateStoreInput, UpdateStoreInput, StoreStats, StoreSettings, StoreAnalytics, Listing, Store, RequestOptions } from '../types'\n\nexport class StoresModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Get a store by its URL slug.\n */\n async getBySlug(slug: string, options?: RequestOptions): Promise<Store> {\n return this.client.get<Store>(`/listings/stores/${slug}`, undefined, options)\n }\n\n /**\n * Follow a store.\n */\n async follow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/stores/${storeId}/follow`, undefined, options)\n }\n\n /**\n * Unfollow a store.\n */\n async unfollow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/stores/${storeId}/follow`, options)\n }\n\n /**\n * Get paginated listings for a specific store.\n */\n async getListings(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n `/listings/stores/${storeId}/listings`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Get all stores owned by the authenticated user.\n */\n async getMyStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/stores/mine', undefined, options)\n }\n\n /**\n * Create a new store.\n */\n async create(input: CreateStoreInput, options?: RequestOptions): Promise<{ id: string; slug: string }> {\n return this.client.post<{ id: string; slug: string }>('/listings/stores', input, options)\n }\n\n /**\n * Update a store's details.\n */\n async update(storeId: string, input: UpdateStoreInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}`, input, options)\n }\n\n /**\n * Get store statistics.\n */\n async getStats(storeId: string, options?: RequestOptions): Promise<StoreStats> {\n return this.client.get<StoreStats>(`/listings/stores/${storeId}/stats`, undefined, options)\n }\n\n /**\n * Get store settings.\n */\n async getSettings(storeId: string, options?: RequestOptions): Promise<StoreSettings> {\n return this.client.get<StoreSettings>(`/listings/stores/${storeId}/settings`, undefined, options)\n }\n\n /**\n * Update store settings (partial).\n */\n async updateSettings(storeId: string, input: Partial<StoreSettings>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}/settings`, input, options)\n }\n\n /**\n * Get store analytics.\n */\n async getAnalytics(storeId: string, period?: 'daily' | 'weekly' | 'monthly', options?: RequestOptions): Promise<StoreAnalytics> {\n return this.client.get<StoreAnalytics>(\n `/listings/stores/${storeId}/analytics`,\n period ? { period } : undefined,\n options\n )\n }\n\n /**\n * Upload a store logo image.\n */\n async uploadLogo(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/logo`, formData, options)\n }\n\n /**\n * Upload a store banner image.\n */\n async uploadBanner(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/banner`, formData, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateReviewInput, Review, ReviewableOrder, RequestOptions } from '../types'\n\nexport class ReviewsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List reviews for a store (public).\n */\n async list(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Review[]; total: number; avg_rating: number; page: number }> {\n return this.client.get<{ data: Review[]; total: number; avg_rating: number; page: number }>(\n `/listings/stores/${storeId}/reviews`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Create a review for a store (authenticated).\n */\n async create(storeId: string, input: CreateReviewInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>(`/listings/stores/${storeId}/reviews`, input, options)\n }\n\n /**\n * Get orders eligible for review (delivered/completed, not yet reviewed).\n */\n async getReviewableOrders(storeId: string, options?: RequestOptions): Promise<{ data: ReviewableOrder[] }> {\n return this.client.get<{ data: ReviewableOrder[] }>(`/listings/stores/${storeId}/reviews/eligible`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { WishlistListing, RequestOptions } from '../types'\n\nexport class WishlistsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List saved listings.\n */\n async list(options?: RequestOptions): Promise<{ data: WishlistListing[] }> {\n return this.client.get<{ data: WishlistListing[] }>('/listings/wishlists', undefined, options)\n }\n\n /**\n * Add a listing to the wishlist.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/wishlists/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the wishlist.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/wishlists/${listingId}`, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CartItem, RequestOptions } from '../types'\n\nexport class CartModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List items in the cart.\n */\n async list(options?: RequestOptions): Promise<{ data: CartItem[] }> {\n return this.client.get<{ data: CartItem[] }>('/listings/cart', undefined, options)\n }\n\n /**\n * Add a listing to the cart.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/cart/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the cart.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/cart/${listingId}`, options)\n }\n\n /**\n * Update the quantity of a cart item.\n */\n async updateQuantity(listingId: string, quantity: number, options?: RequestOptions): Promise<{ ok: true; quantity: number }> {\n return this.client.patch<{ ok: true; quantity: number }>(`/listings/cart/${listingId}`, { quantity }, options)\n }\n\n /**\n * Checkout the cart — creates orders grouped by store and clears the cart.\n */\n async checkout(options?: RequestOptions): Promise<{ order_ids: string[]; count: number }> {\n return this.client.post<{ order_ids: string[]; count: number }>('/orders/checkout', undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n UpdateProfileInput,\n ChangePasswordInput,\n Session,\n NotificationPref,\n Address,\n AddAddressInput,\n PaymentMethod,\n AddPaymentMethodInput,\n LinkedAccount,\n LinkedAccountProvider,\n UserProfile,\n RequestOptions,\n} from '../types'\n\nexport class SettingsModule {\n constructor(private readonly client: APIClient) {}\n\n // ── Profile ──\n\n async getProfile(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n async updateProfile(input: UpdateProfileInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/me', input, options)\n }\n\n // ── Security ──\n\n async changePassword(input: ChangePasswordInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/change-password', input, options)\n }\n\n async getSessions(options?: RequestOptions): Promise<{ data: Session[] }> {\n return this.client.get<{ data: Session[] }>('/auth/sessions', undefined, options)\n }\n\n async revokeSession(sessionId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/sessions/${sessionId}`, options)\n }\n\n // ── Notification Preferences ──\n\n async getNotificationPrefs(options?: RequestOptions): Promise<{ data: NotificationPref[] }> {\n return this.client.get<{ data: NotificationPref[] }>('/auth/notification-prefs', undefined, options)\n }\n\n async updateNotificationPref(channel: string, enabled: boolean, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/notification-prefs/${channel}`, { enabled }, options)\n }\n\n // ── Preferences ──\n\n async getPreferences(options?: RequestOptions): Promise<{ data: Record<string, string> }> {\n return this.client.get<{ data: Record<string, string> }>('/auth/preferences', undefined, options)\n }\n\n async updatePreferences(prefs: Record<string, string>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/preferences', { prefs }, options)\n }\n\n // ── Addresses ──\n\n async getAddresses(options?: RequestOptions): Promise<{ data: Address[] }> {\n return this.client.get<{ data: Address[] }>('/auth/addresses', undefined, options)\n }\n\n async addAddress(input: AddAddressInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/addresses', input, options)\n }\n\n async updateAddress(id: string, input: Partial<AddAddressInput>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/addresses/${id}`, input, options)\n }\n\n async deleteAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/addresses/${id}`, options)\n }\n\n async setDefaultAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/addresses/${id}/default`, undefined, options)\n }\n\n // ── Payment Methods ──\n\n async getPaymentMethods(options?: RequestOptions): Promise<{ data: PaymentMethod[] }> {\n return this.client.get<{ data: PaymentMethod[] }>('/auth/payment-methods', undefined, options)\n }\n\n async addPaymentMethod(input: AddPaymentMethodInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/payment-methods', input, options)\n }\n\n async deletePaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/payment-methods/${id}`, options)\n }\n\n async setDefaultPaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/payment-methods/${id}/default`, undefined, options)\n }\n\n // ── Linked Accounts ──\n\n async getLinkedAccounts(options?: RequestOptions): Promise<{ data: LinkedAccount[] }> {\n return this.client.get<{ data: LinkedAccount[] }>('/auth/linked-accounts', undefined, options)\n }\n\n async linkAccount(provider: LinkedAccountProvider, token: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/linked-accounts', { provider, token }, options)\n }\n\n async unlinkAccount(provider: LinkedAccountProvider, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/linked-accounts/${provider}`, options)\n }\n\n // ── 2FA ──\n\n async setup2FA(options?: RequestOptions): Promise<{ secret: string; otpauth_uri: string }> {\n return this.client.post<{ secret: string; otpauth_uri: string }>('/auth/2fa/setup', undefined, options)\n }\n\n async verify2FA(code: string, options?: RequestOptions): Promise<{ ok: true; backup_codes: string[] }> {\n return this.client.post<{ ok: true; backup_codes: string[] }>('/auth/2fa/verify', { code }, options)\n }\n\n async disable2FA(code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/2fa/disable', { code }, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { MailerTemplate, SendEmailInput, RequestOptions } from '../types'\n\nexport class MailerModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Send a transactional email via the notifications worker.\n */\n async send(template: MailerTemplate, input: SendEmailInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/email', { template, ...input }, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Business, UpdateBusinessInput, RequestOptions } from '../types'\n\nexport class BusinessesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Get all businesses owned by the current user. */\n async getMine(options?: RequestOptions): Promise<{ data: Business[] }> {\n return this.client.get<{ data: Business[] }>('/listings/businesses/mine', undefined, options)\n }\n\n /** Get a business by ID. */\n async getById(id: string, options?: RequestOptions): Promise<Business> {\n return this.client.get<Business>(`/listings/businesses/${id}`, undefined, options)\n }\n\n /** Update a business. */\n async update(id: string, input: UpdateBusinessInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/businesses/${id}`, input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { BlockedIp, SystemStats, RequestOptions } from '../types'\n\nexport class AdminModule {\n constructor(private readonly client: APIClient) {}\n\n /** Block an IP address. Default duration: 24 hours. */\n async blockIp(ip: string, durationHours?: number, options?: RequestOptions): Promise<{ ok: true; blocked: string; hours: number }> {\n return this.client.post<{ ok: true; blocked: string; hours: number }>('/admin/block-ip', { ip, duration_hours: durationHours ?? 24 }, options)\n }\n\n /** Unblock an IP address. */\n async unblockIp(ip: string, options?: RequestOptions): Promise<{ ok: true; unblocked: string }> {\n return this.client.post<{ ok: true; unblocked: string }>('/admin/unblock-ip', { ip }, options)\n }\n\n /** List currently blocked IPs. */\n async getBlockedIps(options?: RequestOptions): Promise<{ data: BlockedIp[] }> {\n return this.client.get<{ data: BlockedIp[] }>('/admin/blocked-ips', undefined, options)\n }\n\n /** Get platform-wide statistics. */\n async getSystemStats(options?: RequestOptions): Promise<SystemStats> {\n return this.client.get<SystemStats>('/admin/stats', undefined, options)\n }\n\n /** Suspend a user account. */\n async suspendUser(userId: string, reason: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/suspend`, { reason }, options)\n }\n\n /** Unsuspend a user account. */\n async unsuspendUser(userId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/unsuspend`, undefined, options)\n }\n\n /** Grant verified badge to a store. */\n async verifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/verify`, undefined, options)\n }\n\n /** Revoke verified badge from a store. */\n async unverifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/unverify`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Dispute, RaiseDisputeInput, RespondDisputeInput, ResolveDisputeInput, DisputeListParams, RequestOptions } from '../types'\n\nexport class DisputesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Raise a dispute on an order (buyer). */\n async raise(orderId: string, input: RaiseDisputeInput, options?: RequestOptions): Promise<{ dispute_id: string; status: 'open' }> {\n return this.client.post<{ dispute_id: string; status: 'open' }>(`/orders/${orderId}/dispute`, input, options)\n }\n\n /** Get the dispute for a specific order. */\n async getForOrder(orderId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/${orderId}/dispute`, undefined, options)\n }\n\n /** Get a dispute by ID. */\n async get(disputeId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/disputes/${disputeId}`, undefined, options)\n }\n\n /** Add evidence to a dispute. */\n async addEvidence(disputeId: string, input: { type: 'image' | 'text'; content: string }, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/orders/disputes/${disputeId}/evidence`, input, options)\n }\n\n /** Escalate a dispute to admin review (buyer). */\n async escalate(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'under_review' }> {\n return this.client.post<{ ok: true; status: 'under_review' }>(`/orders/disputes/${disputeId}/escalate`, undefined, options)\n }\n\n /** Withdraw a dispute (buyer). */\n async withdraw(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'withdrawn' }> {\n return this.client.post<{ ok: true; status: 'withdrawn' }>(`/orders/disputes/${disputeId}/withdraw`, undefined, options)\n }\n\n /** Respond to a dispute (seller). */\n async respond(disputeId: string, input: RespondDisputeInput, options?: RequestOptions): Promise<{ ok: true; status?: string; voluntary?: boolean }> {\n return this.client.post<{ ok: true; status?: string; voluntary?: boolean }>(`/orders/disputes/${disputeId}/respond`, input, options)\n }\n\n /** List all disputes (admin). */\n async list(params?: DisputeListParams, options?: RequestOptions): Promise<{ data: Dispute[]; page: number; page_size: number }> {\n return this.client.get<{ data: Dispute[]; page: number; page_size: number }>(\n '/orders/disputes',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /** Resolve a dispute (admin). */\n async resolve(disputeId: string, input: ResolveDisputeInput, options?: RequestOptions): Promise<{ ok: true; status: string; sti_impact: number }> {\n return this.client.post<{ ok: true; status: string; sti_impact: number }>(`/orders/disputes/${disputeId}/resolve`, input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { RequestOptions } from '../types'\n\nexport class UploadsModule {\n constructor(private readonly client: APIClient) {}\n\n /** Upload a file (avatar, evidence, etc). Returns the public CDN URL. */\n async upload(file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>('/listings/uploads', formData, options)\n }\n}\n","export const CONDITIONS = ['new', 'like_new', 'good', 'fair'] as const\nexport type Condition = typeof CONDITIONS[number]\n\nexport const LISTING_STATUSES = ['draft', 'active', 'sold', 'removed'] as const\nexport type ListingStatus = typeof LISTING_STATUSES[number]\n\nexport interface ListingImage {\n id: string\n listing_id: string\n url: string\n position: number\n created_at: string\n}\n\nexport interface SellerProfile {\n id: string\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n}\n\nexport interface Listing {\n id: string\n seller_id: string\n title: string\n description: string | null\n category_id: string\n city_id: string\n price: number // KES integer\n condition: Condition\n status: ListingStatus\n photo_verified: boolean\n vazi_eligible: boolean\n size: string | null\n created_at: string\n updated_at: string\n // Seller profile (joined)\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n // Images (only present on GET /listings/:id, not in feed)\n images?: ListingImage[]\n // First image as full CDN URL (present in feeds/store listings)\n image_url?: string | null\n}\n\nexport interface ListingsFeedParams {\n city_id?: string\n category_id?: string\n min_price?: number\n max_price?: number\n condition?: Condition\n sort?: 'recency' | 'price_asc' | 'price_desc'\n page?: number\n page_size?: number\n}\n\nexport interface CreateListingInput {\n store_id: string\n title: string\n description?: string\n category_id: string\n city_id: string\n price: number\n condition: Condition\n size?: string\n vazi_eligible?: boolean\n}\n\nexport type UpdateListingInput = Partial<CreateListingInput>\n\nexport interface Category {\n id: string\n name: string\n slug: string\n}\n\nexport interface City {\n id: string\n name: string\n delivery_fee: number\n}\n\nexport interface SellerStorefront {\n seller: SellerProfile\n listings: Listing[]\n total: number\n page: number\n page_size: number\n has_more: boolean\n}\n\nexport interface PresignImageResponse {\n r2_key: string\n image_id: string\n}\n\nexport interface SimilarListing {\n id: string\n title: string\n price: number\n condition: string\n category_id: string\n store_id: string | null\n image_keys: string | null\n created_at: string\n}\n","export const ORDER_STATUSES = [\n 'created',\n 'payment_pending',\n 'paid',\n 'seller_confirmed',\n 'shipped',\n 'delivered',\n 'completed',\n 'cancelled',\n 'disputed',\n] as const\n\nexport type OrderStatus = typeof ORDER_STATUSES[number]\n\nexport interface OrderEvent {\n id: string\n order_id: string\n actor: string // user ID or 'system'\n old_status: string\n new_status: string\n note: string | null\n created_at: string\n}\n\nexport interface DeliveryAddress {\n label: string\n line1: string\n city: string\n county: string\n phone: string\n}\n\nexport interface Order {\n id: string\n buyer_id: string\n seller_id: string\n listing_id: string\n amount: number\n delivery_fee: number\n total: number\n status: OrderStatus\n city_id: string\n created_at: string\n updated_at: string\n // Joined listing details\n listing_title: string | null\n listing_image_url: string | null\n listing_condition: string | null\n listing_size: string | null\n // Joined buyer details\n buyer_name: string | null\n buyer_phone: string | null\n // Buyer's default delivery address\n delivery_address: DeliveryAddress | null\n events?: OrderEvent[]\n}\n\nexport interface CreateOrderInput {\n listing_id: string\n}\n\nexport interface TransitionOrderInput {\n status: OrderStatus\n note?: string\n}\n\nexport interface OrderHistoryParams {\n role?: 'buyer' | 'seller'\n store_id?: string\n page?: number\n}\n","export interface StkPushInput {\n order_id: string\n phone: string // format: +254XXXXXXXXX\n}\n\nexport type MpesaInput = StkPushInput\n\nexport interface StkPushResponse {\n payment_id: string\n provider: string\n}\n\nexport interface PaystackInput {\n order_id: string\n email: string\n}\n\nexport interface PaystackInitResponse {\n access_code: string\n authorization_url: string\n reference: string\n}\n\nexport const PAYMENT_STATUSES = ['initiated', 'funded', 'failed', 'refunded', 'cancelled'] as const\nexport type PaymentStatus = typeof PAYMENT_STATUSES[number]\n\nexport interface PaymentStatusResponse {\n id: string\n status: PaymentStatus\n total: number\n}\n","export const DISPUTE_REASONS = ['not_received', 'not_as_described', 'damaged', 'counterfeit', 'wrong_item'] as const\nexport type DisputeReason = typeof DISPUTE_REASONS[number]\n\nexport const DESIRED_RESOLUTIONS = ['refund', 'replacement', 'partial_refund'] as const\nexport type DesiredResolution = typeof DESIRED_RESOLUTIONS[number]\n\nexport const DISPUTE_STATUSES = ['open', 'seller_responded', 'under_review', 'resolved_refund', 'resolved_release', 'resolved_partial', 'withdrawn'] as const\nexport type DisputeStatus = typeof DISPUTE_STATUSES[number]\n\nexport interface DisputeEvidence {\n id: string\n uploader_role: 'buyer' | 'seller' | 'admin'\n type: 'image' | 'text'\n content: string\n created_at: string\n}\n\nexport interface DisputeEvent {\n actor_role: 'buyer' | 'seller' | 'admin' | 'system'\n action: string\n old_status: string | null\n new_status: string | null\n note: string | null\n created_at: string\n}\n\nexport interface Dispute {\n id: string\n order_id: string\n buyer_id: string\n seller_id: string\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n status: DisputeStatus\n amount_disputed: number\n resolution: 'refund' | 'release' | 'partial' | null\n resolution_amount: number | null\n resolution_note: string | null\n sti_impact: number | null\n seller_responded_at: string | null\n escalated_at: string | null\n resolved_at: string | null\n created_at: string\n updated_at: string\n evidence?: DisputeEvidence[]\n events?: DisputeEvent[]\n}\n\nexport interface RaiseDisputeInput {\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n evidence_urls?: string[]\n}\n\nexport interface RespondDisputeInput {\n accept: boolean\n message?: string\n evidence_urls?: string[]\n}\n\nexport interface ResolveDisputeInput {\n resolution: 'refund' | 'release' | 'partial'\n amount?: number\n note?: string\n}\n\nexport interface DisputeListParams {\n status?: DisputeStatus\n page?: number\n}\n","import { APIClient } from './client'\nimport { MitumbaClientConfig } from './types'\nimport { AuthModule } from './modules/auth'\nimport { ListingsModule } from './modules/listings'\nimport { SearchModule } from './modules/search'\nimport { OrdersModule } from './modules/orders'\nimport { PayModule } from './modules/pay'\nimport { VaziModule } from './modules/vazi'\nimport { MessagesModule } from './modules/messages'\nimport { NotificationsModule } from './modules/notifications'\nimport { StoresModule } from './modules/stores'\nimport { ReviewsModule } from './modules/reviews'\nimport { WishlistsModule } from './modules/wishlists'\nimport { CartModule } from './modules/cart'\nimport { SettingsModule } from './modules/settings'\nimport { MailerModule } from './modules/mailer'\nimport { BusinessesModule } from './modules/businesses'\nimport { AdminModule } from './modules/admin'\nimport { DisputesModule } from './modules/disputes'\nimport { UploadsModule } from './modules/uploads'\n\nexport class MitumbaClient {\n public readonly api: APIClient\n public readonly auth: AuthModule\n public readonly listings: ListingsModule\n public readonly search: SearchModule\n public readonly orders: OrdersModule\n public readonly pay: PayModule\n public readonly vazi: VaziModule\n public readonly messages: MessagesModule\n public readonly notifications: NotificationsModule\n public readonly stores: StoresModule\n public readonly reviews: ReviewsModule\n public readonly wishlists: WishlistsModule\n public readonly cart: CartModule\n public readonly settings: SettingsModule\n public readonly mailer: MailerModule\n public readonly businesses: BusinessesModule\n public readonly admin: AdminModule\n public readonly disputes: DisputesModule\n public readonly uploads: UploadsModule\n\n constructor(config: MitumbaClientConfig) {\n this.api = new APIClient(config)\n this.auth = new AuthModule(this.api)\n this.listings = new ListingsModule(this.api)\n this.search = new SearchModule(this.api)\n this.orders = new OrdersModule(this.api)\n this.pay = new PayModule(this.api)\n this.vazi = new VaziModule(this.api)\n this.messages = new MessagesModule(this.api)\n this.notifications = new NotificationsModule(this.api)\n this.stores = new StoresModule(this.api)\n this.reviews = new ReviewsModule(this.api)\n this.wishlists = new WishlistsModule(this.api)\n this.cart = new CartModule(this.api)\n this.settings = new SettingsModule(this.api)\n this.mailer = new MailerModule(this.api)\n this.businesses = new BusinessesModule(this.api)\n this.admin = new AdminModule(this.api)\n this.disputes = new DisputesModule(this.api)\n this.uploads = new UploadsModule(this.api)\n }\n\n /**\n * Set the access token for authenticated requests.\n * Optionally pass a refresh token to enable automatic token rotation.\n */\n public setToken(token: string, refreshToken?: string) {\n this.api.setToken(token, refreshToken)\n }\n\n /**\n * Get the current access token.\n */\n public getToken(): string | undefined {\n return this.api.getToken()\n }\n\n /**\n * Clear the current tokens.\n */\n public clearToken() {\n this.api.clearToken()\n }\n\n /**\n * Hydrate tokens from persistent store (call on app boot).\n */\n public hydrate(): Promise<void> {\n return this.api.hydrate()\n }\n\n /**\n * Check if user has a stored session.\n */\n public isAuthenticated(): Promise<boolean> {\n return this.api.isAuthenticated()\n }\n}\n\nexport * from './types'\nexport { APIClient, APIError } from './client'\nexport { MemoryTokenStore, IDBTokenStore, createTokenStore } from './token-store'\nexport type { TokenStore } from './token-store'\nexport { AuthModule } from './modules/auth'\nexport { ListingsModule } from './modules/listings'\nexport { SearchModule } from './modules/search'\nexport { OrdersModule } from './modules/orders'\nexport { PayModule } from './modules/pay'\nexport { VaziModule } from './modules/vazi'\nexport { MessagesModule } from './modules/messages'\nexport { NotificationsModule } from './modules/notifications'\nexport { StoresModule } from './modules/stores'\nexport { ReviewsModule } from './modules/reviews'\nexport { WishlistsModule } from './modules/wishlists'\nexport { CartModule } from './modules/cart'\nexport { SettingsModule } from './modules/settings'\nexport { MailerModule } from './modules/mailer'\nexport { BusinessesModule } from './modules/businesses'\nexport { AdminModule } from './modules/admin'\nexport { DisputesModule } from './modules/disputes'\nexport { UploadsModule } from './modules/uploads'\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mitumba/sdk",
3
- "version": "1.14.0",
3
+ "version": "1.15.0",
4
4
  "description": "The official TypeScript SDK for the Mitumba marketplace platform.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",