@mitumba/sdk 0.6.0 → 0.7.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 +33 -1
- package/dist/index.d.ts +33 -1
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +27 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -261,6 +261,18 @@ interface SendMessageInput {
|
|
|
261
261
|
store_id?: string;
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
+
type NotificationType = 'order' | 'message' | 'price_drop' | 'offer' | 'payout' | 'system';
|
|
265
|
+
interface Notification {
|
|
266
|
+
id: string;
|
|
267
|
+
user_id: string;
|
|
268
|
+
type: NotificationType;
|
|
269
|
+
title: string;
|
|
270
|
+
body: string;
|
|
271
|
+
metadata: string | null;
|
|
272
|
+
read_at: string | null;
|
|
273
|
+
created_at: string;
|
|
274
|
+
}
|
|
275
|
+
|
|
264
276
|
interface MitumbaClientConfig {
|
|
265
277
|
baseUrl: string;
|
|
266
278
|
debug?: boolean;
|
|
@@ -533,6 +545,25 @@ declare class MessagesModule {
|
|
|
533
545
|
}>;
|
|
534
546
|
}
|
|
535
547
|
|
|
548
|
+
declare class NotificationsModule {
|
|
549
|
+
private readonly client;
|
|
550
|
+
constructor(client: APIClient);
|
|
551
|
+
/**
|
|
552
|
+
* List paginated notifications with unread count.
|
|
553
|
+
*/
|
|
554
|
+
list(page?: number, options?: RequestOptions): Promise<{
|
|
555
|
+
data: Notification[];
|
|
556
|
+
unread_count: number;
|
|
557
|
+
page: number;
|
|
558
|
+
}>;
|
|
559
|
+
/**
|
|
560
|
+
* Mark notifications as read. If ids omitted, marks all as read.
|
|
561
|
+
*/
|
|
562
|
+
markRead(ids?: string[], options?: RequestOptions): Promise<{
|
|
563
|
+
ok: true;
|
|
564
|
+
}>;
|
|
565
|
+
}
|
|
566
|
+
|
|
536
567
|
declare class MitumbaClient {
|
|
537
568
|
readonly api: APIClient;
|
|
538
569
|
readonly auth: AuthModule;
|
|
@@ -542,6 +573,7 @@ declare class MitumbaClient {
|
|
|
542
573
|
readonly pay: PayModule;
|
|
543
574
|
readonly vazi: VaziModule;
|
|
544
575
|
readonly messages: MessagesModule;
|
|
576
|
+
readonly notifications: NotificationsModule;
|
|
545
577
|
constructor(config: MitumbaClientConfig);
|
|
546
578
|
/**
|
|
547
579
|
* Set the access token for authenticated requests.
|
|
@@ -558,4 +590,4 @@ declare class MitumbaClient {
|
|
|
558
590
|
clearToken(): void;
|
|
559
591
|
}
|
|
560
592
|
|
|
561
|
-
export { APIClient, APIError, type APIErrorResponse, AuthModule, type AuthTokens, CONDITIONS, type Category, type City, type Condition, type Conversation, type CreateListingInput, type CreateOrderInput, type EmailLoginInput, type EmailRegisterInput, type ForgotPasswordInput, GARMENT_TYPES, type GarmentType, LISTING_STATUSES, type Listing, type ListingImage, type ListingStatus, type ListingsFeedParams, ListingsModule, type LoginInput, type Message, type MessageResponse, MessagesModule, MitumbaClient, type MitumbaClientConfig, ORDER_STATUSES, type Order, type OrderEvent, type OrderHistoryParams, type OrderStatus, OrdersModule, PAYMENT_STATUSES, type PaginatedResponse, PayModule, type PaymentStatus, type PaymentStatusResponse, type PhoneLoginInput, type PhoneRegisterInput, type PresignImageResponse, type RegisterInput, type RequestOptions, type ResetPasswordInput, SearchModule, type SearchParams, type SearchResult, type SellerProfile, type SellerStorefront, type SendMessageInput, type SendOtpInput, type StkPushInput, type StkPushResponse, type TransitionOrderInput, type TrendingTerm, type UpdateListingInput, type UserProfile, type VAZIOutfit, type VAZIOutfitItem, type VaziFeedParams, type VaziFeedResponse, VaziModule, type VerifyOtpInput };
|
|
593
|
+
export { APIClient, APIError, type APIErrorResponse, AuthModule, type AuthTokens, CONDITIONS, type Category, type City, type Condition, type Conversation, type CreateListingInput, type CreateOrderInput, type EmailLoginInput, type EmailRegisterInput, type ForgotPasswordInput, GARMENT_TYPES, type GarmentType, LISTING_STATUSES, type Listing, type ListingImage, type ListingStatus, type ListingsFeedParams, ListingsModule, type LoginInput, type Message, type MessageResponse, MessagesModule, MitumbaClient, type MitumbaClientConfig, type Notification, type NotificationType, NotificationsModule, ORDER_STATUSES, type Order, type OrderEvent, type OrderHistoryParams, type OrderStatus, OrdersModule, PAYMENT_STATUSES, type PaginatedResponse, PayModule, type PaymentStatus, type PaymentStatusResponse, type PhoneLoginInput, type PhoneRegisterInput, type PresignImageResponse, type RegisterInput, type RequestOptions, type ResetPasswordInput, SearchModule, type SearchParams, type SearchResult, type SellerProfile, type SellerStorefront, type SendMessageInput, type SendOtpInput, type StkPushInput, type StkPushResponse, type TransitionOrderInput, type TrendingTerm, type UpdateListingInput, type UserProfile, type VAZIOutfit, type VAZIOutfitItem, type VaziFeedParams, type VaziFeedResponse, VaziModule, type VerifyOtpInput };
|
package/dist/index.d.ts
CHANGED
|
@@ -261,6 +261,18 @@ interface SendMessageInput {
|
|
|
261
261
|
store_id?: string;
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
+
type NotificationType = 'order' | 'message' | 'price_drop' | 'offer' | 'payout' | 'system';
|
|
265
|
+
interface Notification {
|
|
266
|
+
id: string;
|
|
267
|
+
user_id: string;
|
|
268
|
+
type: NotificationType;
|
|
269
|
+
title: string;
|
|
270
|
+
body: string;
|
|
271
|
+
metadata: string | null;
|
|
272
|
+
read_at: string | null;
|
|
273
|
+
created_at: string;
|
|
274
|
+
}
|
|
275
|
+
|
|
264
276
|
interface MitumbaClientConfig {
|
|
265
277
|
baseUrl: string;
|
|
266
278
|
debug?: boolean;
|
|
@@ -533,6 +545,25 @@ declare class MessagesModule {
|
|
|
533
545
|
}>;
|
|
534
546
|
}
|
|
535
547
|
|
|
548
|
+
declare class NotificationsModule {
|
|
549
|
+
private readonly client;
|
|
550
|
+
constructor(client: APIClient);
|
|
551
|
+
/**
|
|
552
|
+
* List paginated notifications with unread count.
|
|
553
|
+
*/
|
|
554
|
+
list(page?: number, options?: RequestOptions): Promise<{
|
|
555
|
+
data: Notification[];
|
|
556
|
+
unread_count: number;
|
|
557
|
+
page: number;
|
|
558
|
+
}>;
|
|
559
|
+
/**
|
|
560
|
+
* Mark notifications as read. If ids omitted, marks all as read.
|
|
561
|
+
*/
|
|
562
|
+
markRead(ids?: string[], options?: RequestOptions): Promise<{
|
|
563
|
+
ok: true;
|
|
564
|
+
}>;
|
|
565
|
+
}
|
|
566
|
+
|
|
536
567
|
declare class MitumbaClient {
|
|
537
568
|
readonly api: APIClient;
|
|
538
569
|
readonly auth: AuthModule;
|
|
@@ -542,6 +573,7 @@ declare class MitumbaClient {
|
|
|
542
573
|
readonly pay: PayModule;
|
|
543
574
|
readonly vazi: VaziModule;
|
|
544
575
|
readonly messages: MessagesModule;
|
|
576
|
+
readonly notifications: NotificationsModule;
|
|
545
577
|
constructor(config: MitumbaClientConfig);
|
|
546
578
|
/**
|
|
547
579
|
* Set the access token for authenticated requests.
|
|
@@ -558,4 +590,4 @@ declare class MitumbaClient {
|
|
|
558
590
|
clearToken(): void;
|
|
559
591
|
}
|
|
560
592
|
|
|
561
|
-
export { APIClient, APIError, type APIErrorResponse, AuthModule, type AuthTokens, CONDITIONS, type Category, type City, type Condition, type Conversation, type CreateListingInput, type CreateOrderInput, type EmailLoginInput, type EmailRegisterInput, type ForgotPasswordInput, GARMENT_TYPES, type GarmentType, LISTING_STATUSES, type Listing, type ListingImage, type ListingStatus, type ListingsFeedParams, ListingsModule, type LoginInput, type Message, type MessageResponse, MessagesModule, MitumbaClient, type MitumbaClientConfig, ORDER_STATUSES, type Order, type OrderEvent, type OrderHistoryParams, type OrderStatus, OrdersModule, PAYMENT_STATUSES, type PaginatedResponse, PayModule, type PaymentStatus, type PaymentStatusResponse, type PhoneLoginInput, type PhoneRegisterInput, type PresignImageResponse, type RegisterInput, type RequestOptions, type ResetPasswordInput, SearchModule, type SearchParams, type SearchResult, type SellerProfile, type SellerStorefront, type SendMessageInput, type SendOtpInput, type StkPushInput, type StkPushResponse, type TransitionOrderInput, type TrendingTerm, type UpdateListingInput, type UserProfile, type VAZIOutfit, type VAZIOutfitItem, type VaziFeedParams, type VaziFeedResponse, VaziModule, type VerifyOtpInput };
|
|
593
|
+
export { APIClient, APIError, type APIErrorResponse, AuthModule, type AuthTokens, CONDITIONS, type Category, type City, type Condition, type Conversation, type CreateListingInput, type CreateOrderInput, type EmailLoginInput, type EmailRegisterInput, type ForgotPasswordInput, GARMENT_TYPES, type GarmentType, LISTING_STATUSES, type Listing, type ListingImage, type ListingStatus, type ListingsFeedParams, ListingsModule, type LoginInput, type Message, type MessageResponse, MessagesModule, MitumbaClient, type MitumbaClientConfig, type Notification, type NotificationType, NotificationsModule, ORDER_STATUSES, type Order, type OrderEvent, type OrderHistoryParams, type OrderStatus, OrdersModule, PAYMENT_STATUSES, type PaginatedResponse, PayModule, type PaymentStatus, type PaymentStatusResponse, type PhoneLoginInput, type PhoneRegisterInput, type PresignImageResponse, type RegisterInput, type RequestOptions, type ResetPasswordInput, SearchModule, type SearchParams, type SearchResult, type SellerProfile, type SellerStorefront, type SendMessageInput, type SendOtpInput, type StkPushInput, type StkPushResponse, type TransitionOrderInput, type TrendingTerm, type UpdateListingInput, type UserProfile, type VAZIOutfit, type VAZIOutfitItem, type VaziFeedParams, type VaziFeedResponse, VaziModule, type VerifyOtpInput };
|
package/dist/index.js
CHANGED
|
@@ -437,6 +437,30 @@ var MessagesModule = class {
|
|
|
437
437
|
}
|
|
438
438
|
};
|
|
439
439
|
|
|
440
|
+
// src/modules/notifications.ts
|
|
441
|
+
var NotificationsModule = class {
|
|
442
|
+
constructor(client) {
|
|
443
|
+
this.client = client;
|
|
444
|
+
}
|
|
445
|
+
client;
|
|
446
|
+
/**
|
|
447
|
+
* List paginated notifications with unread count.
|
|
448
|
+
*/
|
|
449
|
+
async list(page, options) {
|
|
450
|
+
return this.client.get(
|
|
451
|
+
"/notify/notifications",
|
|
452
|
+
page !== void 0 ? { page } : void 0,
|
|
453
|
+
options
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Mark notifications as read. If ids omitted, marks all as read.
|
|
458
|
+
*/
|
|
459
|
+
async markRead(ids, options) {
|
|
460
|
+
return this.client.post("/notify/notifications/read", ids ? { ids } : {}, options);
|
|
461
|
+
}
|
|
462
|
+
};
|
|
463
|
+
|
|
440
464
|
// src/types/listings.ts
|
|
441
465
|
var CONDITIONS = ["new", "like_new", "good", "fair"];
|
|
442
466
|
var LISTING_STATUSES = ["draft", "active", "sold", "removed"];
|
|
@@ -479,6 +503,7 @@ var MitumbaClient = class {
|
|
|
479
503
|
pay;
|
|
480
504
|
vazi;
|
|
481
505
|
messages;
|
|
506
|
+
notifications;
|
|
482
507
|
constructor(config) {
|
|
483
508
|
this.api = new APIClient(config);
|
|
484
509
|
this.auth = new AuthModule(this.api);
|
|
@@ -488,6 +513,7 @@ var MitumbaClient = class {
|
|
|
488
513
|
this.pay = new PayModule(this.api);
|
|
489
514
|
this.vazi = new VaziModule(this.api);
|
|
490
515
|
this.messages = new MessagesModule(this.api);
|
|
516
|
+
this.notifications = new NotificationsModule(this.api);
|
|
491
517
|
}
|
|
492
518
|
/**
|
|
493
519
|
* Set the access token for authenticated requests.
|
|
@@ -519,6 +545,7 @@ exports.LISTING_STATUSES = LISTING_STATUSES;
|
|
|
519
545
|
exports.ListingsModule = ListingsModule;
|
|
520
546
|
exports.MessagesModule = MessagesModule;
|
|
521
547
|
exports.MitumbaClient = MitumbaClient;
|
|
548
|
+
exports.NotificationsModule = NotificationsModule;
|
|
522
549
|
exports.ORDER_STATUSES = ORDER_STATUSES;
|
|
523
550
|
exports.OrdersModule = OrdersModule;
|
|
524
551
|
exports.PAYMENT_STATUSES = PAYMENT_STATUSES;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/types/listings.ts","../src/types/orders.ts","../src/types/pay.ts","../src/types/vazi.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { MitumbaClientConfig, APIErrorResponse, RequestOptions } from './types'\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\nexport class APIClient {\n private config: MitumbaClientConfig\n private isRefreshing = false\n private refreshPromise: Promise<void> | null = null\n\n constructor(config: MitumbaClientConfig) {\n this.config = config\n }\n\n public setToken(token: string, refreshToken?: string) {\n this.config.token = token\n if (refreshToken) {\n this.config.refreshToken = refreshToken\n }\n }\n\n public getToken(): string | undefined {\n return this.config.token\n }\n\n public clearToken() {\n this.config.token = undefined\n this.config.refreshToken = undefined\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 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 automatic token refresh\n if (response.status === 401 && this.config.refreshToken && !path.includes('/auth/refresh')) {\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 }\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.setToken(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 this.clearToken()\n throw new APIError(401, { error: 'token_expired', message: 'Session expired. Please log in again.' })\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 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.\n * If using PhoneLoginInput, returns MessageResponse (OTP sent).\n */\n async login(input: LoginInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse> {\n return this.client.post<AuthTokens | MessageResponse>('/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","import { APIClient } from '../client'\nimport type {\n Category,\n City,\n CreateListingInput,\n Listing,\n ListingImage,\n ListingStatus,\n ListingsFeedParams,\n PaginatedResponse,\n PresignImageResponse,\n SellerStorefront,\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 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","import { APIClient } from '../client'\nimport type { PaginatedResponse, SearchParams, SearchResult, 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","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 { 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 * 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, 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","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(options?: RequestOptions): Promise<{ data: Conversation[] }> {\n return this.client.get<{ data: Conversation[] }>('/notify/messages', undefined, options)\n }\n\n /**\n * Get the message thread with a specific partner.\n */\n async getThread(partnerId: string, options?: RequestOptions): Promise<{ data: Message[] }> {\n return this.client.get<{ data: Message[] }>(`/notify/messages/${partnerId}`, undefined, options)\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","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 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}\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 title: string\n description?: string\n category_id: string\n city_id: string\n price: number\n condition: Condition\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","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 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 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 page?: number\n}\n","export interface StkPushInput {\n order_id: string\n phone: string // format: +254XXXXXXXXX\n}\n\nexport interface StkPushResponse {\n payment_id: string\n provider: 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 GARMENT_TYPES = [\n 'top',\n 'bottom',\n 'shoes',\n 'accessory',\n 'dress',\n 'outerwear',\n 'bag',\n 'kids',\n] as const\n\nexport type GarmentType = typeof GARMENT_TYPES[number]\n\nexport interface VAZIOutfitItem {\n listing_id: string\n garment_type: GarmentType\n price_kes: number\n seller_id: string\n seller_sti: number\n seller_city: string\n image_url: string | null\n is_seed: boolean\n final_score: number\n}\n\nexport interface VAZIOutfit {\n id: string\n name: string\n items: VAZIOutfitItem[]\n total_price_kes: number\n sellers_count: number\n is_multi_city: boolean\n assembled_at: string // ISO timestamp\n}\n\nexport interface VaziFeedParams {\n limit?: number\n offset?: number\n}\n\nexport interface VaziFeedResponse {\n outfits: VAZIOutfit[]\n total: number\n limit: number\n offset: 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'\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\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 }\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\nexport * from './types'\nexport { APIClient, APIError } from './client'\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'\n"]}
|
|
1
|
+
{"version":3,"sources":["../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/types/listings.ts","../src/types/orders.ts","../src/types/pay.ts","../src/types/vazi.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { MitumbaClientConfig, APIErrorResponse, RequestOptions } from './types'\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\nexport class APIClient {\n private config: MitumbaClientConfig\n private isRefreshing = false\n private refreshPromise: Promise<void> | null = null\n\n constructor(config: MitumbaClientConfig) {\n this.config = config\n }\n\n public setToken(token: string, refreshToken?: string) {\n this.config.token = token\n if (refreshToken) {\n this.config.refreshToken = refreshToken\n }\n }\n\n public getToken(): string | undefined {\n return this.config.token\n }\n\n public clearToken() {\n this.config.token = undefined\n this.config.refreshToken = undefined\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 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 automatic token refresh\n if (response.status === 401 && this.config.refreshToken && !path.includes('/auth/refresh')) {\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 }\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.setToken(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 this.clearToken()\n throw new APIError(401, { error: 'token_expired', message: 'Session expired. Please log in again.' })\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 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.\n * If using PhoneLoginInput, returns MessageResponse (OTP sent).\n */\n async login(input: LoginInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse> {\n return this.client.post<AuthTokens | MessageResponse>('/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","import { APIClient } from '../client'\nimport type {\n Category,\n City,\n CreateListingInput,\n Listing,\n ListingImage,\n ListingStatus,\n ListingsFeedParams,\n PaginatedResponse,\n PresignImageResponse,\n SellerStorefront,\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 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","import { APIClient } from '../client'\nimport type { PaginatedResponse, SearchParams, SearchResult, 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","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 { 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 * 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, 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","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(options?: RequestOptions): Promise<{ data: Conversation[] }> {\n return this.client.get<{ data: Conversation[] }>('/notify/messages', undefined, options)\n }\n\n /**\n * Get the message thread with a specific partner.\n */\n async getThread(partnerId: string, options?: RequestOptions): Promise<{ data: Message[] }> {\n return this.client.get<{ data: Message[] }>(`/notify/messages/${partnerId}`, undefined, options)\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","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","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 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}\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 title: string\n description?: string\n category_id: string\n city_id: string\n price: number\n condition: Condition\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","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 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 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 page?: number\n}\n","export interface StkPushInput {\n order_id: string\n phone: string // format: +254XXXXXXXXX\n}\n\nexport interface StkPushResponse {\n payment_id: string\n provider: 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 GARMENT_TYPES = [\n 'top',\n 'bottom',\n 'shoes',\n 'accessory',\n 'dress',\n 'outerwear',\n 'bag',\n 'kids',\n] as const\n\nexport type GarmentType = typeof GARMENT_TYPES[number]\n\nexport interface VAZIOutfitItem {\n listing_id: string\n garment_type: GarmentType\n price_kes: number\n seller_id: string\n seller_sti: number\n seller_city: string\n image_url: string | null\n is_seed: boolean\n final_score: number\n}\n\nexport interface VAZIOutfit {\n id: string\n name: string\n items: VAZIOutfitItem[]\n total_price_kes: number\n sellers_count: number\n is_multi_city: boolean\n assembled_at: string // ISO timestamp\n}\n\nexport interface VaziFeedParams {\n limit?: number\n offset?: number\n}\n\nexport interface VaziFeedResponse {\n outfits: VAZIOutfit[]\n total: number\n limit: number\n offset: 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'\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\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 }\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\nexport * from './types'\nexport { APIClient, APIError } from './client'\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'\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -435,6 +435,30 @@ var MessagesModule = class {
|
|
|
435
435
|
}
|
|
436
436
|
};
|
|
437
437
|
|
|
438
|
+
// src/modules/notifications.ts
|
|
439
|
+
var NotificationsModule = class {
|
|
440
|
+
constructor(client) {
|
|
441
|
+
this.client = client;
|
|
442
|
+
}
|
|
443
|
+
client;
|
|
444
|
+
/**
|
|
445
|
+
* List paginated notifications with unread count.
|
|
446
|
+
*/
|
|
447
|
+
async list(page, options) {
|
|
448
|
+
return this.client.get(
|
|
449
|
+
"/notify/notifications",
|
|
450
|
+
page !== void 0 ? { page } : void 0,
|
|
451
|
+
options
|
|
452
|
+
);
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Mark notifications as read. If ids omitted, marks all as read.
|
|
456
|
+
*/
|
|
457
|
+
async markRead(ids, options) {
|
|
458
|
+
return this.client.post("/notify/notifications/read", ids ? { ids } : {}, options);
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
|
|
438
462
|
// src/types/listings.ts
|
|
439
463
|
var CONDITIONS = ["new", "like_new", "good", "fair"];
|
|
440
464
|
var LISTING_STATUSES = ["draft", "active", "sold", "removed"];
|
|
@@ -477,6 +501,7 @@ var MitumbaClient = class {
|
|
|
477
501
|
pay;
|
|
478
502
|
vazi;
|
|
479
503
|
messages;
|
|
504
|
+
notifications;
|
|
480
505
|
constructor(config) {
|
|
481
506
|
this.api = new APIClient(config);
|
|
482
507
|
this.auth = new AuthModule(this.api);
|
|
@@ -486,6 +511,7 @@ var MitumbaClient = class {
|
|
|
486
511
|
this.pay = new PayModule(this.api);
|
|
487
512
|
this.vazi = new VaziModule(this.api);
|
|
488
513
|
this.messages = new MessagesModule(this.api);
|
|
514
|
+
this.notifications = new NotificationsModule(this.api);
|
|
489
515
|
}
|
|
490
516
|
/**
|
|
491
517
|
* Set the access token for authenticated requests.
|
|
@@ -508,6 +534,6 @@ var MitumbaClient = class {
|
|
|
508
534
|
}
|
|
509
535
|
};
|
|
510
536
|
|
|
511
|
-
export { APIClient, APIError, AuthModule, CONDITIONS, GARMENT_TYPES, LISTING_STATUSES, ListingsModule, MessagesModule, MitumbaClient, ORDER_STATUSES, OrdersModule, PAYMENT_STATUSES, PayModule, SearchModule, VaziModule };
|
|
537
|
+
export { APIClient, APIError, AuthModule, CONDITIONS, GARMENT_TYPES, LISTING_STATUSES, ListingsModule, MessagesModule, MitumbaClient, NotificationsModule, ORDER_STATUSES, OrdersModule, PAYMENT_STATUSES, PayModule, SearchModule, VaziModule };
|
|
512
538
|
//# sourceMappingURL=index.mjs.map
|
|
513
539
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/types/listings.ts","../src/types/orders.ts","../src/types/pay.ts","../src/types/vazi.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { MitumbaClientConfig, APIErrorResponse, RequestOptions } from './types'\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\nexport class APIClient {\n private config: MitumbaClientConfig\n private isRefreshing = false\n private refreshPromise: Promise<void> | null = null\n\n constructor(config: MitumbaClientConfig) {\n this.config = config\n }\n\n public setToken(token: string, refreshToken?: string) {\n this.config.token = token\n if (refreshToken) {\n this.config.refreshToken = refreshToken\n }\n }\n\n public getToken(): string | undefined {\n return this.config.token\n }\n\n public clearToken() {\n this.config.token = undefined\n this.config.refreshToken = undefined\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 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 automatic token refresh\n if (response.status === 401 && this.config.refreshToken && !path.includes('/auth/refresh')) {\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 }\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.setToken(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 this.clearToken()\n throw new APIError(401, { error: 'token_expired', message: 'Session expired. Please log in again.' })\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 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.\n * If using PhoneLoginInput, returns MessageResponse (OTP sent).\n */\n async login(input: LoginInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse> {\n return this.client.post<AuthTokens | MessageResponse>('/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","import { APIClient } from '../client'\nimport type {\n Category,\n City,\n CreateListingInput,\n Listing,\n ListingImage,\n ListingStatus,\n ListingsFeedParams,\n PaginatedResponse,\n PresignImageResponse,\n SellerStorefront,\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 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","import { APIClient } from '../client'\nimport type { PaginatedResponse, SearchParams, SearchResult, 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","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 { 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 * 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, 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","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(options?: RequestOptions): Promise<{ data: Conversation[] }> {\n return this.client.get<{ data: Conversation[] }>('/notify/messages', undefined, options)\n }\n\n /**\n * Get the message thread with a specific partner.\n */\n async getThread(partnerId: string, options?: RequestOptions): Promise<{ data: Message[] }> {\n return this.client.get<{ data: Message[] }>(`/notify/messages/${partnerId}`, undefined, options)\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","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 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}\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 title: string\n description?: string\n category_id: string\n city_id: string\n price: number\n condition: Condition\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","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 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 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 page?: number\n}\n","export interface StkPushInput {\n order_id: string\n phone: string // format: +254XXXXXXXXX\n}\n\nexport interface StkPushResponse {\n payment_id: string\n provider: 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 GARMENT_TYPES = [\n 'top',\n 'bottom',\n 'shoes',\n 'accessory',\n 'dress',\n 'outerwear',\n 'bag',\n 'kids',\n] as const\n\nexport type GarmentType = typeof GARMENT_TYPES[number]\n\nexport interface VAZIOutfitItem {\n listing_id: string\n garment_type: GarmentType\n price_kes: number\n seller_id: string\n seller_sti: number\n seller_city: string\n image_url: string | null\n is_seed: boolean\n final_score: number\n}\n\nexport interface VAZIOutfit {\n id: string\n name: string\n items: VAZIOutfitItem[]\n total_price_kes: number\n sellers_count: number\n is_multi_city: boolean\n assembled_at: string // ISO timestamp\n}\n\nexport interface VaziFeedParams {\n limit?: number\n offset?: number\n}\n\nexport interface VaziFeedResponse {\n outfits: VAZIOutfit[]\n total: number\n limit: number\n offset: 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'\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\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 }\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\nexport * from './types'\nexport { APIClient, APIError } from './client'\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'\n"]}
|
|
1
|
+
{"version":3,"sources":["../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/types/listings.ts","../src/types/orders.ts","../src/types/pay.ts","../src/types/vazi.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { MitumbaClientConfig, APIErrorResponse, RequestOptions } from './types'\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\nexport class APIClient {\n private config: MitumbaClientConfig\n private isRefreshing = false\n private refreshPromise: Promise<void> | null = null\n\n constructor(config: MitumbaClientConfig) {\n this.config = config\n }\n\n public setToken(token: string, refreshToken?: string) {\n this.config.token = token\n if (refreshToken) {\n this.config.refreshToken = refreshToken\n }\n }\n\n public getToken(): string | undefined {\n return this.config.token\n }\n\n public clearToken() {\n this.config.token = undefined\n this.config.refreshToken = undefined\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 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 automatic token refresh\n if (response.status === 401 && this.config.refreshToken && !path.includes('/auth/refresh')) {\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 }\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.setToken(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 this.clearToken()\n throw new APIError(401, { error: 'token_expired', message: 'Session expired. Please log in again.' })\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 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.\n * If using PhoneLoginInput, returns MessageResponse (OTP sent).\n */\n async login(input: LoginInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse> {\n return this.client.post<AuthTokens | MessageResponse>('/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","import { APIClient } from '../client'\nimport type {\n Category,\n City,\n CreateListingInput,\n Listing,\n ListingImage,\n ListingStatus,\n ListingsFeedParams,\n PaginatedResponse,\n PresignImageResponse,\n SellerStorefront,\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 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","import { APIClient } from '../client'\nimport type { PaginatedResponse, SearchParams, SearchResult, 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","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 { 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 * 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, 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","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(options?: RequestOptions): Promise<{ data: Conversation[] }> {\n return this.client.get<{ data: Conversation[] }>('/notify/messages', undefined, options)\n }\n\n /**\n * Get the message thread with a specific partner.\n */\n async getThread(partnerId: string, options?: RequestOptions): Promise<{ data: Message[] }> {\n return this.client.get<{ data: Message[] }>(`/notify/messages/${partnerId}`, undefined, options)\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","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","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 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}\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 title: string\n description?: string\n category_id: string\n city_id: string\n price: number\n condition: Condition\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","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 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 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 page?: number\n}\n","export interface StkPushInput {\n order_id: string\n phone: string // format: +254XXXXXXXXX\n}\n\nexport interface StkPushResponse {\n payment_id: string\n provider: 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 GARMENT_TYPES = [\n 'top',\n 'bottom',\n 'shoes',\n 'accessory',\n 'dress',\n 'outerwear',\n 'bag',\n 'kids',\n] as const\n\nexport type GarmentType = typeof GARMENT_TYPES[number]\n\nexport interface VAZIOutfitItem {\n listing_id: string\n garment_type: GarmentType\n price_kes: number\n seller_id: string\n seller_sti: number\n seller_city: string\n image_url: string | null\n is_seed: boolean\n final_score: number\n}\n\nexport interface VAZIOutfit {\n id: string\n name: string\n items: VAZIOutfitItem[]\n total_price_kes: number\n sellers_count: number\n is_multi_city: boolean\n assembled_at: string // ISO timestamp\n}\n\nexport interface VaziFeedParams {\n limit?: number\n offset?: number\n}\n\nexport interface VaziFeedResponse {\n outfits: VAZIOutfit[]\n total: number\n limit: number\n offset: 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'\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\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 }\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\nexport * from './types'\nexport { APIClient, APIError } from './client'\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'\n"]}
|