@buiducnhat/ritel-sdk 0.4.0 → 0.5.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.cjs CHANGED
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/errors.ts
4
3
  var RitelError = class extends Error {
5
4
  constructor(message) {
@@ -25,7 +24,6 @@ var RitelNetworkError = class extends RitelError {
25
24
  this.cause = cause;
26
25
  }
27
26
  };
28
-
29
27
  //#endregion
30
28
  //#region src/resources/categories.ts
31
29
  var CategoriesResource = class {
@@ -37,7 +35,6 @@ var CategoriesResource = class {
37
35
  return this.request("GET", "/categories", void 0, params);
38
36
  }
39
37
  };
40
-
41
38
  //#endregion
42
39
  //#region src/resources/orders.ts
43
40
  var OrdersResource = class {
@@ -61,7 +58,6 @@ var OrdersResource = class {
61
58
  return this.request("POST", `/orders/${id}/cancel`);
62
59
  }
63
60
  };
64
-
65
61
  //#endregion
66
62
  //#region src/resources/products.ts
67
63
  var ProductsResource = class {
@@ -76,7 +72,6 @@ var ProductsResource = class {
76
72
  return this.request("GET", `/products/${id}`);
77
73
  }
78
74
  };
79
-
80
75
  //#endregion
81
76
  //#region src/utils/query-string.ts
82
77
  function buildQueryString(params) {
@@ -89,7 +84,6 @@ function buildQueryString(params) {
89
84
  const qs = searchParams.toString();
90
85
  return qs ? `?${qs}` : "";
91
86
  }
92
-
93
87
  //#endregion
94
88
  //#region src/client.ts
95
89
  var RitelClient = class {
@@ -142,7 +136,6 @@ var RitelClient = class {
142
136
  }
143
137
  }
144
138
  };
145
-
146
139
  //#endregion
147
140
  exports.OrdersResource = OrdersResource;
148
141
  exports.ProductsResource = ProductsResource;
@@ -150,4 +143,5 @@ exports.RitelApiError = RitelApiError;
150
143
  exports.RitelClient = RitelClient;
151
144
  exports.RitelError = RitelError;
152
145
  exports.RitelNetworkError = RitelNetworkError;
146
+
153
147
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/errors.ts","../src/resources/categories.ts","../src/resources/orders.ts","../src/resources/products.ts","../src/utils/query-string.ts","../src/client.ts"],"sourcesContent":["export class RitelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RitelError\";\n }\n}\n\nexport class RitelApiError extends RitelError {\n readonly status: number;\n readonly code: string;\n\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = \"RitelApiError\";\n this.status = status;\n this.code = code;\n }\n}\n\nexport class RitelNetworkError extends RitelError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = \"RitelNetworkError\";\n this.cause = cause;\n }\n}\n","import type { RequestFn } from \"../resources/products\";\nimport type { CategoriesListResponse, GetCategoriesParams } from \"../types\";\n\nexport class CategoriesResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async list(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesListResponse> {\n return this.request<CategoriesListResponse>(\n \"GET\",\n \"/categories\",\n undefined,\n params as Record<string, unknown>\n );\n }\n}\n","import type {\n CreateOrderInput,\n ListOrdersParams,\n Order,\n OrderCreateResponse,\n OrdersListResponse,\n UpdateOrderInput,\n} from \"../types\";\n\nexport type RequestFn = <T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n) => Promise<T>;\n\nexport class OrdersResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async create(input: CreateOrderInput): Promise<OrderCreateResponse> {\n return this.request<OrderCreateResponse>(\"POST\", \"/orders\", input);\n }\n\n async list(params: ListOrdersParams = {}): Promise<OrdersListResponse> {\n return this.request<OrdersListResponse>(\n \"GET\",\n \"/orders\",\n undefined,\n params as Record<string, unknown>\n );\n }\n\n async get(id: string): Promise<Order> {\n return this.request<Order>(\"GET\", `/orders/${id}`);\n }\n\n async update(id: string, input: UpdateOrderInput): Promise<Order> {\n return this.request<Order>(\"PATCH\", `/orders/${id}`, input);\n }\n\n async cancel(id: string): Promise<Order> {\n return this.request<Order>(\"POST\", `/orders/${id}/cancel`);\n }\n}\n","import type {\n GetProductsParams,\n Product,\n ProductsListResponse,\n} from \"../types\";\n\nexport type RequestFn = <T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n) => Promise<T>;\n\nexport class ProductsResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async list(params: GetProductsParams = {}): Promise<ProductsListResponse> {\n return this.request<ProductsListResponse>(\n \"GET\",\n \"/products\",\n undefined,\n params as Record<string, unknown>\n );\n }\n\n async get(id: string): Promise<Product> {\n return this.request<Product>(\"GET\", `/products/${id}`);\n }\n}\n","export function buildQueryString(params: Record<string, unknown>): string {\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (value instanceof Date) {\n searchParams.set(key, value.toISOString());\n } else {\n searchParams.set(key, String(value));\n }\n }\n\n const qs = searchParams.toString();\n return qs ? `?${qs}` : \"\";\n}\n","import { RitelApiError, RitelNetworkError } from \"./errors\";\nimport { CategoriesResource } from \"./resources/categories\";\nimport { OrdersResource } from \"./resources/orders\";\nimport { ProductsResource } from \"./resources/products\";\nimport type { ApiErrorResponse, RitelClientConfig } from \"./types\";\nimport { buildQueryString } from \"./utils/query-string\";\n\nexport class RitelClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n\n readonly products: ProductsResource;\n readonly categories: CategoriesResource;\n readonly orders: OrdersResource;\n\n constructor(config: RitelClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.apiKey = config.apiKey;\n this.timeout = config.timeout ?? 30_000;\n\n // Bind request method for resources\n const boundRequest = this.request.bind(this);\n this.products = new ProductsResource(boundRequest);\n this.categories = new CategoriesResource(boundRequest);\n this.orders = new OrdersResource(boundRequest);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n ): Promise<T> {\n const url = `${this.baseUrl}/external${path}${params ? buildQueryString(params) : \"\"}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.apiKey,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = (await response.json().catch(() => ({\n error: \"Unknown\",\n message: response.statusText,\n }))) as ApiErrorResponse;\n\n throw new RitelApiError(\n response.status,\n errorBody.error,\n errorBody.message\n );\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof RitelApiError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new RitelNetworkError(\"Request timeout\", error);\n }\n throw new RitelNetworkError(error.message, error);\n }\n\n throw new RitelNetworkError(\"Unknown network error\");\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/errors.ts","../src/resources/categories.ts","../src/resources/orders.ts","../src/resources/products.ts","../src/utils/query-string.ts","../src/client.ts"],"sourcesContent":["export class RitelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RitelError\";\n }\n}\n\nexport class RitelApiError extends RitelError {\n readonly status: number;\n readonly code: string;\n\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = \"RitelApiError\";\n this.status = status;\n this.code = code;\n }\n}\n\nexport class RitelNetworkError extends RitelError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = \"RitelNetworkError\";\n this.cause = cause;\n }\n}\n","import type { RequestFn } from \"../resources/products\";\nimport type { CategoriesListResponse, GetCategoriesParams } from \"../types\";\n\nexport class CategoriesResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async list(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesListResponse> {\n return this.request<CategoriesListResponse>(\n \"GET\",\n \"/categories\",\n undefined,\n params as Record<string, unknown>\n );\n }\n}\n","import type {\n CreateOrderInput,\n ListOrdersParams,\n Order,\n OrderCreateResponse,\n OrdersListResponse,\n UpdateOrderInput,\n} from \"../types\";\n\nexport type RequestFn = <T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n) => Promise<T>;\n\nexport class OrdersResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async create(input: CreateOrderInput): Promise<OrderCreateResponse> {\n return this.request<OrderCreateResponse>(\"POST\", \"/orders\", input);\n }\n\n async list(params: ListOrdersParams = {}): Promise<OrdersListResponse> {\n return this.request<OrdersListResponse>(\n \"GET\",\n \"/orders\",\n undefined,\n params as Record<string, unknown>\n );\n }\n\n async get(id: string): Promise<Order> {\n return this.request<Order>(\"GET\", `/orders/${id}`);\n }\n\n async update(id: string, input: UpdateOrderInput): Promise<Order> {\n return this.request<Order>(\"PATCH\", `/orders/${id}`, input);\n }\n\n async cancel(id: string): Promise<Order> {\n return this.request<Order>(\"POST\", `/orders/${id}/cancel`);\n }\n}\n","import type {\n GetProductsParams,\n Product,\n ProductsListResponse,\n} from \"../types\";\n\nexport type RequestFn = <T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n) => Promise<T>;\n\nexport class ProductsResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async list(params: GetProductsParams = {}): Promise<ProductsListResponse> {\n return this.request<ProductsListResponse>(\n \"GET\",\n \"/products\",\n undefined,\n params as Record<string, unknown>\n );\n }\n\n async get(id: string): Promise<Product> {\n return this.request<Product>(\"GET\", `/products/${id}`);\n }\n}\n","export function buildQueryString(params: Record<string, unknown>): string {\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (value instanceof Date) {\n searchParams.set(key, value.toISOString());\n } else {\n searchParams.set(key, String(value));\n }\n }\n\n const qs = searchParams.toString();\n return qs ? `?${qs}` : \"\";\n}\n","import { RitelApiError, RitelNetworkError } from \"./errors\";\nimport { CategoriesResource } from \"./resources/categories\";\nimport { OrdersResource } from \"./resources/orders\";\nimport { ProductsResource } from \"./resources/products\";\nimport type { ApiErrorResponse, RitelClientConfig } from \"./types\";\nimport { buildQueryString } from \"./utils/query-string\";\n\nexport class RitelClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n\n readonly products: ProductsResource;\n readonly categories: CategoriesResource;\n readonly orders: OrdersResource;\n\n constructor(config: RitelClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.apiKey = config.apiKey;\n this.timeout = config.timeout ?? 30_000;\n\n // Bind request method for resources\n const boundRequest = this.request.bind(this);\n this.products = new ProductsResource(boundRequest);\n this.categories = new CategoriesResource(boundRequest);\n this.orders = new OrdersResource(boundRequest);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n ): Promise<T> {\n const url = `${this.baseUrl}/external${path}${params ? buildQueryString(params) : \"\"}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.apiKey,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = (await response.json().catch(() => ({\n error: \"Unknown\",\n message: response.statusText,\n }))) as ApiErrorResponse;\n\n throw new RitelApiError(\n response.status,\n errorBody.error,\n errorBody.message\n );\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof RitelApiError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new RitelNetworkError(\"Request timeout\", error);\n }\n throw new RitelNetworkError(error.message, error);\n }\n\n throw new RitelNetworkError(\"Unknown network error\");\n }\n }\n}\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,14 +1,14 @@
1
1
  //#region src/types.d.ts
2
2
  interface GetProductsParams {
3
+ categoryId?: string;
3
4
  limit?: number;
5
+ maxPrice?: number;
6
+ minPrice?: number;
4
7
  offset?: number;
5
8
  search?: string;
6
- categoryId?: string;
7
- stockStatus?: "in_stock" | "out_of_stock" | "all";
8
- minPrice?: number;
9
- maxPrice?: number;
10
9
  sortBy?: "name" | "price" | "created_at";
11
- sortOrder?: "asc" | "desc";
10
+ sortOrder?: SortOrder;
11
+ stockStatus?: StockStatus;
12
12
  }
13
13
  interface GetCategoriesParams {
14
14
  limit?: number;
@@ -16,10 +16,10 @@ interface GetCategoriesParams {
16
16
  search?: string;
17
17
  }
18
18
  interface Category {
19
+ description: string | null;
19
20
  id: string;
20
21
  name: string;
21
22
  slug: string;
22
- description: string | null;
23
23
  }
24
24
  interface CategoriesListResponse {
25
25
  data: Category[];
@@ -30,7 +30,7 @@ interface ProductCategory {
30
30
  name: string;
31
31
  }
32
32
  interface ProductMedia {
33
- type: "image" | "video";
33
+ type: MediaType;
34
34
  url: string;
35
35
  }
36
36
  interface ProductTierPrice {
@@ -39,33 +39,34 @@ interface ProductTierPrice {
39
39
  price: number;
40
40
  }
41
41
  interface Product {
42
- id: string;
43
- name: string;
44
- sku: string | null;
45
- salePrice: number;
42
+ category: ProductCategory | null;
46
43
  currentSalePrice: number | null;
44
+ customProperties: Record<string, unknown> | null;
47
45
  description: string | null;
48
- unit: string | null;
46
+ id: string;
47
+ isContactPrice: boolean;
48
+ medias: ProductMedia[] | null;
49
49
  minOrderQuantity?: number;
50
- category: ProductCategory | null;
51
- customProperties: Record<string, unknown> | null;
50
+ name: string;
51
+ salePrice: number;
52
+ sku: string | null;
52
53
  stockQuantity: number;
53
- medias: ProductMedia[] | null;
54
54
  tierPrices?: ProductTierPrice[];
55
+ unit: string | null;
55
56
  }
56
57
  interface ProductsListResponse {
57
58
  data: Product[];
58
59
  pagination: Pagination;
59
60
  }
60
61
  interface CreateOrderInput {
62
+ customerAddress?: string;
63
+ customerEmail?: string;
61
64
  customerName: string;
62
65
  customerPhone: string;
63
- customerEmail?: string;
64
- customerAddress?: string;
66
+ expectedDeliveryDate?: Date | string;
65
67
  items: OrderItemInput[];
66
- paymentMethod: "cash" | "bank_transfer" | "sepay_pg";
67
68
  notes?: string;
68
- expectedDeliveryDate?: Date | string;
69
+ paymentMethod: "cash" | "bank_transfer" | "sepay_pg";
69
70
  }
70
71
  interface OrderItemInput {
71
72
  productId: string;
@@ -75,20 +76,20 @@ interface OrderItemInput {
75
76
  interface ListOrdersParams {
76
77
  limit?: number;
77
78
  offset?: number;
78
- status?: "pending" | "completed" | "cancelled";
79
- paymentStatus?: "pending" | "paid" | "failed";
80
79
  orderNumber?: string;
80
+ paymentStatus?: "pending" | "paid" | "failed";
81
+ status?: "pending" | "completed" | "cancelled";
81
82
  }
82
83
  interface UpdateOrderInput {
83
- notes?: string;
84
- expectedDeliveryDate?: Date | string | null;
85
84
  deliveryInfo?: DeliveryInfo;
85
+ expectedDeliveryDate?: Date | string | null;
86
+ notes?: string;
86
87
  }
87
88
  interface DeliveryInfo {
89
+ address?: string | null;
90
+ email?: string | null;
88
91
  name: string;
89
92
  phone: string;
90
- email?: string | null;
91
- address?: string | null;
92
93
  }
93
94
  interface OrderItem {
94
95
  id: string;
@@ -96,52 +97,52 @@ interface OrderItem {
96
97
  productName: string;
97
98
  productSku: string | null;
98
99
  quantity: number;
99
- unitPrice: number;
100
100
  subtotal: number;
101
+ unitPrice: number;
101
102
  }
102
103
  interface Order {
104
+ createdAt: string;
105
+ deliveryInfo: DeliveryInfo | null;
106
+ discountAmount: number;
107
+ expectedDeliveryDate: string | null;
103
108
  id: string;
109
+ items?: OrderItem[];
110
+ notes: string | null;
104
111
  orderNumber: string;
105
- status: string;
106
112
  paymentMethod: string | null;
107
113
  paymentStatus: string | null;
114
+ status: string;
108
115
  subtotal: number;
109
- discountAmount: number;
110
116
  taxAmount: number;
111
117
  total: number;
112
- notes: string | null;
113
- expectedDeliveryDate: string | null;
114
- deliveryInfo: DeliveryInfo | null;
115
- items?: OrderItem[];
116
- createdAt: string;
117
118
  updatedAt: string;
118
119
  }
119
120
  interface OrderCreateResponse {
120
- id: string;
121
- orderNumber: string;
122
- total: number;
123
- paymentMethod: string;
124
- paymentStatus: string;
125
- vietQrUrl: string | null;
126
121
  bankInfo: {
127
122
  bankBin: string | null;
128
123
  bankAccountNumber: string | null;
129
124
  bankAccountName: string | null;
130
125
  } | null;
126
+ id: string;
127
+ orderNumber: string;
128
+ paymentMethod: string;
129
+ paymentStatus: string;
130
+ total: number;
131
+ vietQrUrl: string | null;
131
132
  }
132
133
  interface OrdersListResponse {
133
134
  data: Order[];
134
135
  pagination: Pagination;
135
136
  }
136
137
  interface Pagination {
137
- total: number;
138
+ hasMore: boolean;
138
139
  limit: number;
139
140
  offset: number;
140
- hasMore: boolean;
141
+ total: number;
141
142
  }
142
143
  interface RitelClientConfig {
143
- baseUrl: string;
144
144
  apiKey: string;
145
+ baseUrl: string;
145
146
  timeout?: number;
146
147
  }
147
148
  interface ApiErrorResponse {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/resources/products.ts","../src/resources/categories.ts","../src/resources/orders.ts","../src/client.ts","../src/errors.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/resources/products.ts","../src/resources/categories.ts","../src/resources/orders.ts","../src/client.ts","../src/errors.ts"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,14 +1,14 @@
1
1
  //#region src/types.d.ts
2
2
  interface GetProductsParams {
3
+ categoryId?: string;
3
4
  limit?: number;
5
+ maxPrice?: number;
6
+ minPrice?: number;
4
7
  offset?: number;
5
8
  search?: string;
6
- categoryId?: string;
7
- stockStatus?: "in_stock" | "out_of_stock" | "all";
8
- minPrice?: number;
9
- maxPrice?: number;
10
9
  sortBy?: "name" | "price" | "created_at";
11
- sortOrder?: "asc" | "desc";
10
+ sortOrder?: SortOrder;
11
+ stockStatus?: StockStatus;
12
12
  }
13
13
  interface GetCategoriesParams {
14
14
  limit?: number;
@@ -16,10 +16,10 @@ interface GetCategoriesParams {
16
16
  search?: string;
17
17
  }
18
18
  interface Category {
19
+ description: string | null;
19
20
  id: string;
20
21
  name: string;
21
22
  slug: string;
22
- description: string | null;
23
23
  }
24
24
  interface CategoriesListResponse {
25
25
  data: Category[];
@@ -30,7 +30,7 @@ interface ProductCategory {
30
30
  name: string;
31
31
  }
32
32
  interface ProductMedia {
33
- type: "image" | "video";
33
+ type: MediaType;
34
34
  url: string;
35
35
  }
36
36
  interface ProductTierPrice {
@@ -39,33 +39,34 @@ interface ProductTierPrice {
39
39
  price: number;
40
40
  }
41
41
  interface Product {
42
- id: string;
43
- name: string;
44
- sku: string | null;
45
- salePrice: number;
42
+ category: ProductCategory | null;
46
43
  currentSalePrice: number | null;
44
+ customProperties: Record<string, unknown> | null;
47
45
  description: string | null;
48
- unit: string | null;
46
+ id: string;
47
+ isContactPrice: boolean;
48
+ medias: ProductMedia[] | null;
49
49
  minOrderQuantity?: number;
50
- category: ProductCategory | null;
51
- customProperties: Record<string, unknown> | null;
50
+ name: string;
51
+ salePrice: number;
52
+ sku: string | null;
52
53
  stockQuantity: number;
53
- medias: ProductMedia[] | null;
54
54
  tierPrices?: ProductTierPrice[];
55
+ unit: string | null;
55
56
  }
56
57
  interface ProductsListResponse {
57
58
  data: Product[];
58
59
  pagination: Pagination;
59
60
  }
60
61
  interface CreateOrderInput {
62
+ customerAddress?: string;
63
+ customerEmail?: string;
61
64
  customerName: string;
62
65
  customerPhone: string;
63
- customerEmail?: string;
64
- customerAddress?: string;
66
+ expectedDeliveryDate?: Date | string;
65
67
  items: OrderItemInput[];
66
- paymentMethod: "cash" | "bank_transfer" | "sepay_pg";
67
68
  notes?: string;
68
- expectedDeliveryDate?: Date | string;
69
+ paymentMethod: "cash" | "bank_transfer" | "sepay_pg";
69
70
  }
70
71
  interface OrderItemInput {
71
72
  productId: string;
@@ -75,20 +76,20 @@ interface OrderItemInput {
75
76
  interface ListOrdersParams {
76
77
  limit?: number;
77
78
  offset?: number;
78
- status?: "pending" | "completed" | "cancelled";
79
- paymentStatus?: "pending" | "paid" | "failed";
80
79
  orderNumber?: string;
80
+ paymentStatus?: "pending" | "paid" | "failed";
81
+ status?: "pending" | "completed" | "cancelled";
81
82
  }
82
83
  interface UpdateOrderInput {
83
- notes?: string;
84
- expectedDeliveryDate?: Date | string | null;
85
84
  deliveryInfo?: DeliveryInfo;
85
+ expectedDeliveryDate?: Date | string | null;
86
+ notes?: string;
86
87
  }
87
88
  interface DeliveryInfo {
89
+ address?: string | null;
90
+ email?: string | null;
88
91
  name: string;
89
92
  phone: string;
90
- email?: string | null;
91
- address?: string | null;
92
93
  }
93
94
  interface OrderItem {
94
95
  id: string;
@@ -96,52 +97,52 @@ interface OrderItem {
96
97
  productName: string;
97
98
  productSku: string | null;
98
99
  quantity: number;
99
- unitPrice: number;
100
100
  subtotal: number;
101
+ unitPrice: number;
101
102
  }
102
103
  interface Order {
104
+ createdAt: string;
105
+ deliveryInfo: DeliveryInfo | null;
106
+ discountAmount: number;
107
+ expectedDeliveryDate: string | null;
103
108
  id: string;
109
+ items?: OrderItem[];
110
+ notes: string | null;
104
111
  orderNumber: string;
105
- status: string;
106
112
  paymentMethod: string | null;
107
113
  paymentStatus: string | null;
114
+ status: string;
108
115
  subtotal: number;
109
- discountAmount: number;
110
116
  taxAmount: number;
111
117
  total: number;
112
- notes: string | null;
113
- expectedDeliveryDate: string | null;
114
- deliveryInfo: DeliveryInfo | null;
115
- items?: OrderItem[];
116
- createdAt: string;
117
118
  updatedAt: string;
118
119
  }
119
120
  interface OrderCreateResponse {
120
- id: string;
121
- orderNumber: string;
122
- total: number;
123
- paymentMethod: string;
124
- paymentStatus: string;
125
- vietQrUrl: string | null;
126
121
  bankInfo: {
127
122
  bankBin: string | null;
128
123
  bankAccountNumber: string | null;
129
124
  bankAccountName: string | null;
130
125
  } | null;
126
+ id: string;
127
+ orderNumber: string;
128
+ paymentMethod: string;
129
+ paymentStatus: string;
130
+ total: number;
131
+ vietQrUrl: string | null;
131
132
  }
132
133
  interface OrdersListResponse {
133
134
  data: Order[];
134
135
  pagination: Pagination;
135
136
  }
136
137
  interface Pagination {
137
- total: number;
138
+ hasMore: boolean;
138
139
  limit: number;
139
140
  offset: number;
140
- hasMore: boolean;
141
+ total: number;
141
142
  }
142
143
  interface RitelClientConfig {
143
- baseUrl: string;
144
144
  apiKey: string;
145
+ baseUrl: string;
145
146
  timeout?: number;
146
147
  }
147
148
  interface ApiErrorResponse {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/resources/products.ts","../src/resources/categories.ts","../src/resources/orders.ts","../src/client.ts","../src/errors.ts"],"mappings":";UACiB,iBAAA;EACf,KAAA;EACA,MAAA;EACA,MAAA;EACA,UAAA;EACA,WAAA;EACA,QAAA;EACA,QAAA;EACA,MAAA;EACA,SAAA;AAAA;AAAA,UAGe,mBAAA;EACf,KAAA;EACA,MAAA;EACA,MAAA;AAAA;AAAA,UAGe,QAAA;EACf,EAAA;EACA,IAAA;EACA,IAAA;EACA,WAAA;AAAA;AAAA,UAGe,sBAAA;EACf,IAAA,EAAM,QAAA;EACN,UAAA,EAAY,UAAA;AAAA;AAAA,UAGG,eAAA;EACf,EAAA;EACA,IAAA;AAAA;AAAA,UAGe,YAAA;EACf,IAAA;EACA,GAAA;AAAA;AAAA,UAGe,gBAAA;EACf,EAAA;EACA,WAAA;EACA,KAAA;AAAA;AAAA,UAGe,OAAA;EACf,EAAA;EACA,IAAA;EACA,GAAA;EACA,SAAA;EACA,gBAAA;EACA,WAAA;EACA,IAAA;EACA,gBAAA;EACA,QAAA,EAAU,eAAA;EACV,gBAAA,EAAkB,MAAA;EAClB,aAAA;EACA,MAAA,EAAQ,YAAA;EACR,UAAA,GAAa,gBAAA;AAAA;AAAA,UAGE,oBAAA;EACf,IAAA,EAAM,OAAA;EACN,UAAA,EAAY,UAAA;AAAA;AAAA,UAIG,gBAAA;EACf,YAAA;EACA,aAAA;EACA,aAAA;EACA,eAAA;EACA,KAAA,EAAO,cAAA;EACP,aAAA;EACA,KAAA;EACA,oBAAA,GAAuB,IAAA;AAAA;AAAA,UAGR,cAAA;EACf,SAAA;EACA,QAAA;EACA,SAAA;AAAA;AAAA,UAGe,gBAAA;EACf,KAAA;EACA,MAAA;EACA,MAAA;EACA,aAAA;EACA,WAAA;AAAA;AAAA,UAGe,gBAAA;EACf,KAAA;EACA,oBAAA,GAAuB,IAAA;EACvB,YAAA,GAAe,YAAA;AAAA;AAAA,UAGA,YAAA;EACf,IAAA;EACA,KAAA;EACA,KAAA;EACA,OAAA;AAAA;AAAA,UAGe,SAAA;EACf,EAAA;EACA,SAAA;EACA,WAAA;EACA,UAAA;EACA,QAAA;EACA,SAAA;EACA,QAAA;AAAA;AAAA,UAGe,KAAA;EACf,EAAA;EACA,WAAA;EACA,MAAA;EACA,aAAA;EACA,aAAA;EACA,QAAA;EACA,cAAA;EACA,SAAA;EACA,KAAA;EACA,KAAA;EACA,oBAAA;EACA,YAAA,EAAc,YAAA;EACd,KAAA,GAAQ,SAAA;EACR,SAAA;EACA,SAAA;AAAA;AAAA,UAGe,mBAAA;EACf,EAAA;EACA,WAAA;EACA,KAAA;EACA,aAAA;EACA,aAAA;EACA,SAAA;EACA,QAAA;IACE,OAAA;IACA,iBAAA;IACA,eAAA;EAAA;AAAA;AAAA,UAIa,kBAAA;EACf,IAAA,EAAM,KAAA;EACN,UAAA,EAAY,UAAA;AAAA;AAAA,UAIG,UAAA;EACf,KAAA;EACA,KAAA;EACA,MAAA;EACA,OAAA;AAAA;AAAA,UAGe,iBAAA;EACf,OAAA;EACA,MAAA;EACA,OAAA;AAAA;AAAA,UAGe,gBAAA;EACf,KAAA;EACA,OAAA;AAAA;;;KCpKU,WAAA,OACV,MAAA,UACA,IAAA,UACA,IAAA,YACA,MAAA,GAAS,MAAA,sBACN,OAAA,CAAQ,CAAA;AAAA,cAEA,gBAAA;EAAA,iBACM,OAAA;cAEL,OAAA,EAAS,WAAA;EAIf,IAAA,CAAK,MAAA,GAAQ,iBAAA,GAAyB,OAAA,CAAQ,oBAAA;EAS9C,GAAA,CAAI,EAAA,WAAa,OAAA,CAAQ,OAAA;AAAA;;;cC1BpB,kBAAA;EAAA,iBACM,OAAA;cAEL,OAAA,EAAS,WAAA;EAIf,IAAA,CACJ,MAAA,GAAQ,mBAAA,GACP,OAAA,CAAQ,sBAAA;AAAA;;;KCHD,SAAA,OACV,MAAA,UACA,IAAA,UACA,IAAA,YACA,MAAA,GAAS,MAAA,sBACN,OAAA,CAAQ,CAAA;AAAA,cAEA,cAAA;EAAA,iBACM,OAAA;cAEL,OAAA,EAAS,SAAA;EAIf,MAAA,CAAO,KAAA,EAAO,gBAAA,GAAmB,OAAA,CAAQ,mBAAA;EAIzC,IAAA,CAAK,MAAA,GAAQ,gBAAA,GAAwB,OAAA,CAAQ,kBAAA;EAS7C,GAAA,CAAI,EAAA,WAAa,OAAA,CAAQ,KAAA;EAIzB,MAAA,CAAO,EAAA,UAAY,KAAA,EAAO,gBAAA,GAAmB,OAAA,CAAQ,KAAA;EAIrD,MAAA,CAAO,EAAA,WAAa,OAAA,CAAQ,KAAA;AAAA;;;cCrCvB,WAAA;EAAA,iBACM,OAAA;EAAA,iBACA,MAAA;EAAA,iBACA,OAAA;EAAA,SAER,QAAA,EAAU,gBAAA;EAAA,SACV,UAAA,EAAY,kBAAA;EAAA,SACZ,MAAA,EAAQ,cAAA;cAEL,MAAA,EAAQ,iBAAA;EAAA,QAYN,OAAA;AAAA;;;cC5BH,UAAA,SAAmB,KAAA;cAClB,OAAA;AAAA;AAAA,cAMD,aAAA,SAAsB,UAAA;EAAA,SACxB,MAAA;EAAA,SACA,IAAA;cAEG,MAAA,UAAgB,IAAA,UAAc,OAAA;AAAA;AAAA,cAQ/B,iBAAA,SAA0B,UAAA;EAAA,SAC5B,KAAA,GAAQ,KAAA;cAEL,OAAA,UAAiB,KAAA,GAAQ,KAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/resources/products.ts","../src/resources/categories.ts","../src/resources/orders.ts","../src/client.ts","../src/errors.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -23,7 +23,6 @@ var RitelNetworkError = class extends RitelError {
23
23
  this.cause = cause;
24
24
  }
25
25
  };
26
-
27
26
  //#endregion
28
27
  //#region src/resources/categories.ts
29
28
  var CategoriesResource = class {
@@ -35,7 +34,6 @@ var CategoriesResource = class {
35
34
  return this.request("GET", "/categories", void 0, params);
36
35
  }
37
36
  };
38
-
39
37
  //#endregion
40
38
  //#region src/resources/orders.ts
41
39
  var OrdersResource = class {
@@ -59,7 +57,6 @@ var OrdersResource = class {
59
57
  return this.request("POST", `/orders/${id}/cancel`);
60
58
  }
61
59
  };
62
-
63
60
  //#endregion
64
61
  //#region src/resources/products.ts
65
62
  var ProductsResource = class {
@@ -74,7 +71,6 @@ var ProductsResource = class {
74
71
  return this.request("GET", `/products/${id}`);
75
72
  }
76
73
  };
77
-
78
74
  //#endregion
79
75
  //#region src/utils/query-string.ts
80
76
  function buildQueryString(params) {
@@ -87,7 +83,6 @@ function buildQueryString(params) {
87
83
  const qs = searchParams.toString();
88
84
  return qs ? `?${qs}` : "";
89
85
  }
90
-
91
86
  //#endregion
92
87
  //#region src/client.ts
93
88
  var RitelClient = class {
@@ -140,7 +135,7 @@ var RitelClient = class {
140
135
  }
141
136
  }
142
137
  };
143
-
144
138
  //#endregion
145
139
  export { OrdersResource, ProductsResource, RitelApiError, RitelClient, RitelError, RitelNetworkError };
140
+
146
141
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/errors.ts","../src/resources/categories.ts","../src/resources/orders.ts","../src/resources/products.ts","../src/utils/query-string.ts","../src/client.ts"],"sourcesContent":["export class RitelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RitelError\";\n }\n}\n\nexport class RitelApiError extends RitelError {\n readonly status: number;\n readonly code: string;\n\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = \"RitelApiError\";\n this.status = status;\n this.code = code;\n }\n}\n\nexport class RitelNetworkError extends RitelError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = \"RitelNetworkError\";\n this.cause = cause;\n }\n}\n","import type { RequestFn } from \"../resources/products\";\nimport type { CategoriesListResponse, GetCategoriesParams } from \"../types\";\n\nexport class CategoriesResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async list(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesListResponse> {\n return this.request<CategoriesListResponse>(\n \"GET\",\n \"/categories\",\n undefined,\n params as Record<string, unknown>\n );\n }\n}\n","import type {\n CreateOrderInput,\n ListOrdersParams,\n Order,\n OrderCreateResponse,\n OrdersListResponse,\n UpdateOrderInput,\n} from \"../types\";\n\nexport type RequestFn = <T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n) => Promise<T>;\n\nexport class OrdersResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async create(input: CreateOrderInput): Promise<OrderCreateResponse> {\n return this.request<OrderCreateResponse>(\"POST\", \"/orders\", input);\n }\n\n async list(params: ListOrdersParams = {}): Promise<OrdersListResponse> {\n return this.request<OrdersListResponse>(\n \"GET\",\n \"/orders\",\n undefined,\n params as Record<string, unknown>\n );\n }\n\n async get(id: string): Promise<Order> {\n return this.request<Order>(\"GET\", `/orders/${id}`);\n }\n\n async update(id: string, input: UpdateOrderInput): Promise<Order> {\n return this.request<Order>(\"PATCH\", `/orders/${id}`, input);\n }\n\n async cancel(id: string): Promise<Order> {\n return this.request<Order>(\"POST\", `/orders/${id}/cancel`);\n }\n}\n","import type {\n GetProductsParams,\n Product,\n ProductsListResponse,\n} from \"../types\";\n\nexport type RequestFn = <T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n) => Promise<T>;\n\nexport class ProductsResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async list(params: GetProductsParams = {}): Promise<ProductsListResponse> {\n return this.request<ProductsListResponse>(\n \"GET\",\n \"/products\",\n undefined,\n params as Record<string, unknown>\n );\n }\n\n async get(id: string): Promise<Product> {\n return this.request<Product>(\"GET\", `/products/${id}`);\n }\n}\n","export function buildQueryString(params: Record<string, unknown>): string {\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (value instanceof Date) {\n searchParams.set(key, value.toISOString());\n } else {\n searchParams.set(key, String(value));\n }\n }\n\n const qs = searchParams.toString();\n return qs ? `?${qs}` : \"\";\n}\n","import { RitelApiError, RitelNetworkError } from \"./errors\";\nimport { CategoriesResource } from \"./resources/categories\";\nimport { OrdersResource } from \"./resources/orders\";\nimport { ProductsResource } from \"./resources/products\";\nimport type { ApiErrorResponse, RitelClientConfig } from \"./types\";\nimport { buildQueryString } from \"./utils/query-string\";\n\nexport class RitelClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n\n readonly products: ProductsResource;\n readonly categories: CategoriesResource;\n readonly orders: OrdersResource;\n\n constructor(config: RitelClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.apiKey = config.apiKey;\n this.timeout = config.timeout ?? 30_000;\n\n // Bind request method for resources\n const boundRequest = this.request.bind(this);\n this.products = new ProductsResource(boundRequest);\n this.categories = new CategoriesResource(boundRequest);\n this.orders = new OrdersResource(boundRequest);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n ): Promise<T> {\n const url = `${this.baseUrl}/external${path}${params ? buildQueryString(params) : \"\"}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.apiKey,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = (await response.json().catch(() => ({\n error: \"Unknown\",\n message: response.statusText,\n }))) as ApiErrorResponse;\n\n throw new RitelApiError(\n response.status,\n errorBody.error,\n errorBody.message\n );\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof RitelApiError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new RitelNetworkError(\"Request timeout\", error);\n }\n throw new RitelNetworkError(error.message, error);\n }\n\n throw new RitelNetworkError(\"Unknown network error\");\n }\n }\n}\n"],"mappings":";AAAA,IAAa,aAAb,cAAgC,MAAM;CACpC,YAAY,SAAiB;AAC3B,QAAM,QAAQ;AACd,OAAK,OAAO;;;AAIhB,IAAa,gBAAb,cAAmC,WAAW;CAC5C,AAAS;CACT,AAAS;CAET,YAAY,QAAgB,MAAc,SAAiB;AACzD,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,SAAS;AACd,OAAK,OAAO;;;AAIhB,IAAa,oBAAb,cAAuC,WAAW;CAChD,AAAS;CAET,YAAY,SAAiB,OAAe;AAC1C,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,QAAQ;;;;;;ACtBjB,IAAa,qBAAb,MAAgC;CAC9B,AAAiB;CAEjB,YAAY,SAAoB;AAC9B,OAAK,UAAU;;CAGjB,MAAM,KACJ,SAA8B,EAAE,EACC;AACjC,SAAO,KAAK,QACV,OACA,eACA,QACA,OACD;;;;;;ACFL,IAAa,iBAAb,MAA4B;CAC1B,AAAiB;CAEjB,YAAY,SAAoB;AAC9B,OAAK,UAAU;;CAGjB,MAAM,OAAO,OAAuD;AAClE,SAAO,KAAK,QAA6B,QAAQ,WAAW,MAAM;;CAGpE,MAAM,KAAK,SAA2B,EAAE,EAA+B;AACrE,SAAO,KAAK,QACV,OACA,WACA,QACA,OACD;;CAGH,MAAM,IAAI,IAA4B;AACpC,SAAO,KAAK,QAAe,OAAO,WAAW,KAAK;;CAGpD,MAAM,OAAO,IAAY,OAAyC;AAChE,SAAO,KAAK,QAAe,SAAS,WAAW,MAAM,MAAM;;CAG7D,MAAM,OAAO,IAA4B;AACvC,SAAO,KAAK,QAAe,QAAQ,WAAW,GAAG,SAAS;;;;;;AChC9D,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CAEjB,YAAY,SAAoB;AAC9B,OAAK,UAAU;;CAGjB,MAAM,KAAK,SAA4B,EAAE,EAAiC;AACxE,SAAO,KAAK,QACV,OACA,aACA,QACA,OACD;;CAGH,MAAM,IAAI,IAA8B;AACtC,SAAO,KAAK,QAAiB,OAAO,aAAa,KAAK;;;;;;AC9B1D,SAAgB,iBAAiB,QAAyC;CACxE,MAAM,eAAe,IAAI,iBAAiB;AAE1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,EAAE;AACjD,MAAI,UAAU,UAAa,UAAU,KACnC;AAGF,MAAI,iBAAiB,KACnB,cAAa,IAAI,KAAK,MAAM,aAAa,CAAC;MAE1C,cAAa,IAAI,KAAK,OAAO,MAAM,CAAC;;CAIxC,MAAM,KAAK,aAAa,UAAU;AAClC,QAAO,KAAK,IAAI,OAAO;;;;;ACTzB,IAAa,cAAb,MAAyB;CACvB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,AAAS;CACT,AAAS;CACT,AAAS;CAET,YAAY,QAA2B;AACrC,OAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,GAAG;AAChD,OAAK,SAAS,OAAO;AACrB,OAAK,UAAU,OAAO,WAAW;EAGjC,MAAM,eAAe,KAAK,QAAQ,KAAK,KAAK;AAC5C,OAAK,WAAW,IAAI,iBAAiB,aAAa;AAClD,OAAK,aAAa,IAAI,mBAAmB,aAAa;AACtD,OAAK,SAAS,IAAI,eAAe,aAAa;;CAGhD,MAAc,QACZ,QACA,MACA,MACA,QACY;EACZ,MAAM,MAAM,GAAG,KAAK,QAAQ,WAAW,OAAO,SAAS,iBAAiB,OAAO,GAAG;EAElF,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,YAAY,iBAAiB,WAAW,OAAO,EAAE,KAAK,QAAQ;AAEpE,MAAI;GACF,MAAM,WAAW,MAAM,MAAM,KAAK;IAChC;IACA,SAAS;KACP,gBAAgB;KAChB,aAAa,KAAK;KACnB;IACD,MAAM,OAAO,KAAK,UAAU,KAAK,GAAG;IACpC,QAAQ,WAAW;IACpB,CAAC;AAEF,gBAAa,UAAU;AAEvB,OAAI,CAAC,SAAS,IAAI;IAChB,MAAM,YAAa,MAAM,SAAS,MAAM,CAAC,aAAa;KACpD,OAAO;KACP,SAAS,SAAS;KACnB,EAAE;AAEH,UAAM,IAAI,cACR,SAAS,QACT,UAAU,OACV,UAAU,QACX;;AAGH,UAAO,SAAS,MAAM;WACf,OAAO;AACd,gBAAa,UAAU;AAEvB,OAAI,iBAAiB,cACnB,OAAM;AAGR,OAAI,iBAAiB,OAAO;AAC1B,QAAI,MAAM,SAAS,aACjB,OAAM,IAAI,kBAAkB,mBAAmB,MAAM;AAEvD,UAAM,IAAI,kBAAkB,MAAM,SAAS,MAAM;;AAGnD,SAAM,IAAI,kBAAkB,wBAAwB"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/errors.ts","../src/resources/categories.ts","../src/resources/orders.ts","../src/resources/products.ts","../src/utils/query-string.ts","../src/client.ts"],"sourcesContent":["export class RitelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RitelError\";\n }\n}\n\nexport class RitelApiError extends RitelError {\n readonly status: number;\n readonly code: string;\n\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = \"RitelApiError\";\n this.status = status;\n this.code = code;\n }\n}\n\nexport class RitelNetworkError extends RitelError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = \"RitelNetworkError\";\n this.cause = cause;\n }\n}\n","import type { RequestFn } from \"../resources/products\";\nimport type { CategoriesListResponse, GetCategoriesParams } from \"../types\";\n\nexport class CategoriesResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async list(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesListResponse> {\n return this.request<CategoriesListResponse>(\n \"GET\",\n \"/categories\",\n undefined,\n params as Record<string, unknown>\n );\n }\n}\n","import type {\n CreateOrderInput,\n ListOrdersParams,\n Order,\n OrderCreateResponse,\n OrdersListResponse,\n UpdateOrderInput,\n} from \"../types\";\n\nexport type RequestFn = <T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n) => Promise<T>;\n\nexport class OrdersResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async create(input: CreateOrderInput): Promise<OrderCreateResponse> {\n return this.request<OrderCreateResponse>(\"POST\", \"/orders\", input);\n }\n\n async list(params: ListOrdersParams = {}): Promise<OrdersListResponse> {\n return this.request<OrdersListResponse>(\n \"GET\",\n \"/orders\",\n undefined,\n params as Record<string, unknown>\n );\n }\n\n async get(id: string): Promise<Order> {\n return this.request<Order>(\"GET\", `/orders/${id}`);\n }\n\n async update(id: string, input: UpdateOrderInput): Promise<Order> {\n return this.request<Order>(\"PATCH\", `/orders/${id}`, input);\n }\n\n async cancel(id: string): Promise<Order> {\n return this.request<Order>(\"POST\", `/orders/${id}/cancel`);\n }\n}\n","import type {\n GetProductsParams,\n Product,\n ProductsListResponse,\n} from \"../types\";\n\nexport type RequestFn = <T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n) => Promise<T>;\n\nexport class ProductsResource {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n async list(params: GetProductsParams = {}): Promise<ProductsListResponse> {\n return this.request<ProductsListResponse>(\n \"GET\",\n \"/products\",\n undefined,\n params as Record<string, unknown>\n );\n }\n\n async get(id: string): Promise<Product> {\n return this.request<Product>(\"GET\", `/products/${id}`);\n }\n}\n","export function buildQueryString(params: Record<string, unknown>): string {\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (value instanceof Date) {\n searchParams.set(key, value.toISOString());\n } else {\n searchParams.set(key, String(value));\n }\n }\n\n const qs = searchParams.toString();\n return qs ? `?${qs}` : \"\";\n}\n","import { RitelApiError, RitelNetworkError } from \"./errors\";\nimport { CategoriesResource } from \"./resources/categories\";\nimport { OrdersResource } from \"./resources/orders\";\nimport { ProductsResource } from \"./resources/products\";\nimport type { ApiErrorResponse, RitelClientConfig } from \"./types\";\nimport { buildQueryString } from \"./utils/query-string\";\n\nexport class RitelClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n\n readonly products: ProductsResource;\n readonly categories: CategoriesResource;\n readonly orders: OrdersResource;\n\n constructor(config: RitelClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.apiKey = config.apiKey;\n this.timeout = config.timeout ?? 30_000;\n\n // Bind request method for resources\n const boundRequest = this.request.bind(this);\n this.products = new ProductsResource(boundRequest);\n this.categories = new CategoriesResource(boundRequest);\n this.orders = new OrdersResource(boundRequest);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, unknown>\n ): Promise<T> {\n const url = `${this.baseUrl}/external${path}${params ? buildQueryString(params) : \"\"}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.apiKey,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = (await response.json().catch(() => ({\n error: \"Unknown\",\n message: response.statusText,\n }))) as ApiErrorResponse;\n\n throw new RitelApiError(\n response.status,\n errorBody.error,\n errorBody.message\n );\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof RitelApiError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new RitelNetworkError(\"Request timeout\", error);\n }\n throw new RitelNetworkError(error.message, error);\n }\n\n throw new RitelNetworkError(\"Unknown network error\");\n }\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buiducnhat/ritel-sdk",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "TypeScript SDK for Ritel Mini ERP external APIs",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -47,7 +47,8 @@
47
47
  },
48
48
  "devDependencies": {
49
49
  "@ritel/config": "workspace:*",
50
- "tsdown": "^0.20.3",
50
+ "@ritel/utils": "workspace:*",
51
+ "tsdown": "^0.21.0",
51
52
  "typescript": "^5"
52
53
  },
53
54
  "peerDependencies": {