@buiducnhat/ritel-sdk 0.3.1 → 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/README.md CHANGED
@@ -97,6 +97,7 @@ const product = await client.products.get("prod_123");
97
97
  category: { id: string; name: string } | null;
98
98
  customProperties: Record<string, unknown> | null;
99
99
  stockQuantity: number;
100
+ medias: ProductMedia[] | null;
100
101
  }
101
102
  ```
102
103
 
@@ -262,6 +263,7 @@ import type {
262
263
  OrderCreateResponse,
263
264
  OrdersListResponse,
264
265
  DeliveryInfo,
266
+ ProductMedia,
265
267
 
266
268
  // Common
267
269
  Pagination,
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/errors.ts
3
3
  var RitelError = class extends Error {
4
4
  constructor(message) {
@@ -24,7 +24,6 @@ var RitelNetworkError = class extends RitelError {
24
24
  this.cause = cause;
25
25
  }
26
26
  };
27
-
28
27
  //#endregion
29
28
  //#region src/resources/categories.ts
30
29
  var CategoriesResource = class {
@@ -36,7 +35,6 @@ var CategoriesResource = class {
36
35
  return this.request("GET", "/categories", void 0, params);
37
36
  }
38
37
  };
39
-
40
38
  //#endregion
41
39
  //#region src/resources/orders.ts
42
40
  var OrdersResource = class {
@@ -60,7 +58,6 @@ var OrdersResource = class {
60
58
  return this.request("POST", `/orders/${id}/cancel`);
61
59
  }
62
60
  };
63
-
64
61
  //#endregion
65
62
  //#region src/resources/products.ts
66
63
  var ProductsResource = class {
@@ -75,7 +72,6 @@ var ProductsResource = class {
75
72
  return this.request("GET", `/products/${id}`);
76
73
  }
77
74
  };
78
-
79
75
  //#endregion
80
76
  //#region src/utils/query-string.ts
81
77
  function buildQueryString(params) {
@@ -88,7 +84,6 @@ function buildQueryString(params) {
88
84
  const qs = searchParams.toString();
89
85
  return qs ? `?${qs}` : "";
90
86
  }
91
-
92
87
  //#endregion
93
88
  //#region src/client.ts
94
89
  var RitelClient = class {
@@ -141,7 +136,6 @@ var RitelClient = class {
141
136
  }
142
137
  }
143
138
  };
144
-
145
139
  //#endregion
146
140
  exports.OrdersResource = OrdersResource;
147
141
  exports.ProductsResource = ProductsResource;
@@ -149,4 +143,5 @@ exports.RitelApiError = RitelApiError;
149
143
  exports.RitelClient = RitelClient;
150
144
  exports.RitelError = RitelError;
151
145
  exports.RitelNetworkError = RitelNetworkError;
146
+
152
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,35 +30,43 @@ 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
+ interface ProductTierPrice {
37
+ id: string;
38
+ minQuantity: number;
39
+ price: number;
40
+ }
36
41
  interface Product {
42
+ category: ProductCategory | null;
43
+ currentSalePrice: number | null;
44
+ customProperties: Record<string, unknown> | null;
45
+ description: string | null;
37
46
  id: string;
47
+ isContactPrice: boolean;
48
+ medias: ProductMedia[] | null;
49
+ minOrderQuantity?: number;
38
50
  name: string;
39
- sku: string | null;
40
51
  salePrice: number;
41
- currentSalePrice: number | null;
42
- description: string | null;
43
- unit: string | null;
44
- category: ProductCategory | null;
45
- customProperties: Record<string, unknown> | null;
52
+ sku: string | null;
46
53
  stockQuantity: number;
47
- medias: ProductMedia[] | null;
54
+ tierPrices?: ProductTierPrice[];
55
+ unit: string | null;
48
56
  }
49
57
  interface ProductsListResponse {
50
58
  data: Product[];
51
59
  pagination: Pagination;
52
60
  }
53
61
  interface CreateOrderInput {
62
+ customerAddress?: string;
63
+ customerEmail?: string;
54
64
  customerName: string;
55
65
  customerPhone: string;
56
- customerEmail?: string;
57
- customerAddress?: string;
66
+ expectedDeliveryDate?: Date | string;
58
67
  items: OrderItemInput[];
59
- paymentMethod: "cash" | "bank_transfer" | "sepay_pg";
60
68
  notes?: string;
61
- expectedDeliveryDate?: Date | string;
69
+ paymentMethod: "cash" | "bank_transfer" | "sepay_pg";
62
70
  }
63
71
  interface OrderItemInput {
64
72
  productId: string;
@@ -68,20 +76,20 @@ interface OrderItemInput {
68
76
  interface ListOrdersParams {
69
77
  limit?: number;
70
78
  offset?: number;
71
- status?: "pending" | "completed" | "cancelled";
72
- paymentStatus?: "pending" | "paid" | "failed";
73
79
  orderNumber?: string;
80
+ paymentStatus?: "pending" | "paid" | "failed";
81
+ status?: "pending" | "completed" | "cancelled";
74
82
  }
75
83
  interface UpdateOrderInput {
76
- notes?: string;
77
- expectedDeliveryDate?: Date | string | null;
78
84
  deliveryInfo?: DeliveryInfo;
85
+ expectedDeliveryDate?: Date | string | null;
86
+ notes?: string;
79
87
  }
80
88
  interface DeliveryInfo {
89
+ address?: string | null;
90
+ email?: string | null;
81
91
  name: string;
82
92
  phone: string;
83
- email?: string | null;
84
- address?: string | null;
85
93
  }
86
94
  interface OrderItem {
87
95
  id: string;
@@ -89,52 +97,52 @@ interface OrderItem {
89
97
  productName: string;
90
98
  productSku: string | null;
91
99
  quantity: number;
92
- unitPrice: number;
93
100
  subtotal: number;
101
+ unitPrice: number;
94
102
  }
95
103
  interface Order {
104
+ createdAt: string;
105
+ deliveryInfo: DeliveryInfo | null;
106
+ discountAmount: number;
107
+ expectedDeliveryDate: string | null;
96
108
  id: string;
109
+ items?: OrderItem[];
110
+ notes: string | null;
97
111
  orderNumber: string;
98
- status: string;
99
112
  paymentMethod: string | null;
100
113
  paymentStatus: string | null;
114
+ status: string;
101
115
  subtotal: number;
102
- discountAmount: number;
103
116
  taxAmount: number;
104
117
  total: number;
105
- notes: string | null;
106
- expectedDeliveryDate: string | null;
107
- deliveryInfo: DeliveryInfo | null;
108
- items?: OrderItem[];
109
- createdAt: string;
110
118
  updatedAt: string;
111
119
  }
112
120
  interface OrderCreateResponse {
113
- id: string;
114
- orderNumber: string;
115
- total: number;
116
- paymentMethod: string;
117
- paymentStatus: string;
118
- vietQrUrl: string | null;
119
121
  bankInfo: {
120
122
  bankBin: string | null;
121
123
  bankAccountNumber: string | null;
122
124
  bankAccountName: string | null;
123
125
  } | null;
126
+ id: string;
127
+ orderNumber: string;
128
+ paymentMethod: string;
129
+ paymentStatus: string;
130
+ total: number;
131
+ vietQrUrl: string | null;
124
132
  }
125
133
  interface OrdersListResponse {
126
134
  data: Order[];
127
135
  pagination: Pagination;
128
136
  }
129
137
  interface Pagination {
130
- total: number;
138
+ hasMore: boolean;
131
139
  limit: number;
132
140
  offset: number;
133
- hasMore: boolean;
141
+ total: number;
134
142
  }
135
143
  interface RitelClientConfig {
136
- baseUrl: string;
137
144
  apiKey: string;
145
+ baseUrl: string;
138
146
  timeout?: number;
139
147
  }
140
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,35 +30,43 @@ 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
+ interface ProductTierPrice {
37
+ id: string;
38
+ minQuantity: number;
39
+ price: number;
40
+ }
36
41
  interface Product {
42
+ category: ProductCategory | null;
43
+ currentSalePrice: number | null;
44
+ customProperties: Record<string, unknown> | null;
45
+ description: string | null;
37
46
  id: string;
47
+ isContactPrice: boolean;
48
+ medias: ProductMedia[] | null;
49
+ minOrderQuantity?: number;
38
50
  name: string;
39
- sku: string | null;
40
51
  salePrice: number;
41
- currentSalePrice: number | null;
42
- description: string | null;
43
- unit: string | null;
44
- category: ProductCategory | null;
45
- customProperties: Record<string, unknown> | null;
52
+ sku: string | null;
46
53
  stockQuantity: number;
47
- medias: ProductMedia[] | null;
54
+ tierPrices?: ProductTierPrice[];
55
+ unit: string | null;
48
56
  }
49
57
  interface ProductsListResponse {
50
58
  data: Product[];
51
59
  pagination: Pagination;
52
60
  }
53
61
  interface CreateOrderInput {
62
+ customerAddress?: string;
63
+ customerEmail?: string;
54
64
  customerName: string;
55
65
  customerPhone: string;
56
- customerEmail?: string;
57
- customerAddress?: string;
66
+ expectedDeliveryDate?: Date | string;
58
67
  items: OrderItemInput[];
59
- paymentMethod: "cash" | "bank_transfer" | "sepay_pg";
60
68
  notes?: string;
61
- expectedDeliveryDate?: Date | string;
69
+ paymentMethod: "cash" | "bank_transfer" | "sepay_pg";
62
70
  }
63
71
  interface OrderItemInput {
64
72
  productId: string;
@@ -68,20 +76,20 @@ interface OrderItemInput {
68
76
  interface ListOrdersParams {
69
77
  limit?: number;
70
78
  offset?: number;
71
- status?: "pending" | "completed" | "cancelled";
72
- paymentStatus?: "pending" | "paid" | "failed";
73
79
  orderNumber?: string;
80
+ paymentStatus?: "pending" | "paid" | "failed";
81
+ status?: "pending" | "completed" | "cancelled";
74
82
  }
75
83
  interface UpdateOrderInput {
76
- notes?: string;
77
- expectedDeliveryDate?: Date | string | null;
78
84
  deliveryInfo?: DeliveryInfo;
85
+ expectedDeliveryDate?: Date | string | null;
86
+ notes?: string;
79
87
  }
80
88
  interface DeliveryInfo {
89
+ address?: string | null;
90
+ email?: string | null;
81
91
  name: string;
82
92
  phone: string;
83
- email?: string | null;
84
- address?: string | null;
85
93
  }
86
94
  interface OrderItem {
87
95
  id: string;
@@ -89,52 +97,52 @@ interface OrderItem {
89
97
  productName: string;
90
98
  productSku: string | null;
91
99
  quantity: number;
92
- unitPrice: number;
93
100
  subtotal: number;
101
+ unitPrice: number;
94
102
  }
95
103
  interface Order {
104
+ createdAt: string;
105
+ deliveryInfo: DeliveryInfo | null;
106
+ discountAmount: number;
107
+ expectedDeliveryDate: string | null;
96
108
  id: string;
109
+ items?: OrderItem[];
110
+ notes: string | null;
97
111
  orderNumber: string;
98
- status: string;
99
112
  paymentMethod: string | null;
100
113
  paymentStatus: string | null;
114
+ status: string;
101
115
  subtotal: number;
102
- discountAmount: number;
103
116
  taxAmount: number;
104
117
  total: number;
105
- notes: string | null;
106
- expectedDeliveryDate: string | null;
107
- deliveryInfo: DeliveryInfo | null;
108
- items?: OrderItem[];
109
- createdAt: string;
110
118
  updatedAt: string;
111
119
  }
112
120
  interface OrderCreateResponse {
113
- id: string;
114
- orderNumber: string;
115
- total: number;
116
- paymentMethod: string;
117
- paymentStatus: string;
118
- vietQrUrl: string | null;
119
121
  bankInfo: {
120
122
  bankBin: string | null;
121
123
  bankAccountNumber: string | null;
122
124
  bankAccountName: string | null;
123
125
  } | null;
126
+ id: string;
127
+ orderNumber: string;
128
+ paymentMethod: string;
129
+ paymentStatus: string;
130
+ total: number;
131
+ vietQrUrl: string | null;
124
132
  }
125
133
  interface OrdersListResponse {
126
134
  data: Order[];
127
135
  pagination: Pagination;
128
136
  }
129
137
  interface Pagination {
130
- total: number;
138
+ hasMore: boolean;
131
139
  limit: number;
132
140
  offset: number;
133
- hasMore: boolean;
141
+ total: number;
134
142
  }
135
143
  interface RitelClientConfig {
136
- baseUrl: string;
137
144
  apiKey: string;
145
+ baseUrl: string;
138
146
  timeout?: number;
139
147
  }
140
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":"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"}
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":"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"}
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.3.1",
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",
@@ -24,7 +24,7 @@
24
24
  ],
25
25
  "scripts": {
26
26
  "build": "tsdown",
27
- "typecheck": "tsc --noEmit",
27
+ "typecheck": "tsc -b --noEmit",
28
28
  "prepublishOnly": "bun run build"
29
29
  },
30
30
  "keywords": [
@@ -47,7 +47,8 @@
47
47
  },
48
48
  "devDependencies": {
49
49
  "@ritel/config": "workspace:*",
50
- "tsdown": "^0.20.1",
50
+ "@ritel/utils": "workspace:*",
51
+ "tsdown": "^0.21.0",
51
52
  "typescript": "^5"
52
53
  },
53
54
  "peerDependencies": {