@hubcommerce/trendyol 1.0.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.
Files changed (235) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/LICENSE +21 -0
  3. package/README.md +257 -0
  4. package/dist/batch/poller.d.ts +23 -0
  5. package/dist/batch/poller.d.ts.map +1 -0
  6. package/dist/batch/poller.js +85 -0
  7. package/dist/batch/report.d.ts +15 -0
  8. package/dist/batch/report.d.ts.map +1 -0
  9. package/dist/batch/report.js +41 -0
  10. package/dist/batch/types.d.ts +4 -0
  11. package/dist/batch/types.d.ts.map +1 -0
  12. package/dist/batch/types.js +2 -0
  13. package/dist/claims/api.d.ts +48 -0
  14. package/dist/claims/api.d.ts.map +1 -0
  15. package/dist/claims/api.js +116 -0
  16. package/dist/claims/form.d.ts +9 -0
  17. package/dist/claims/form.d.ts.map +1 -0
  18. package/dist/claims/form.js +20 -0
  19. package/dist/claims/paths.d.ts +3 -0
  20. package/dist/claims/paths.d.ts.map +1 -0
  21. package/dist/claims/paths.js +8 -0
  22. package/dist/client.d.ts +39 -0
  23. package/dist/client.d.ts.map +1 -0
  24. package/dist/client.js +66 -0
  25. package/dist/compensation/api.d.ts +17 -0
  26. package/dist/compensation/api.d.ts.map +1 -0
  27. package/dist/compensation/api.js +37 -0
  28. package/dist/compensation/paths.d.ts +2 -0
  29. package/dist/compensation/paths.d.ts.map +1 -0
  30. package/dist/compensation/paths.js +4 -0
  31. package/dist/config.d.ts +10 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +78 -0
  34. package/dist/connection.d.ts +4 -0
  35. package/dist/connection.d.ts.map +1 -0
  36. package/dist/connection.js +8 -0
  37. package/dist/constants/claim-reasons.d.ts +10 -0
  38. package/dist/constants/claim-reasons.d.ts.map +1 -0
  39. package/dist/constants/claim-reasons.js +43 -0
  40. package/dist/constants/error-codes.d.ts +3 -0
  41. package/dist/constants/error-codes.d.ts.map +1 -0
  42. package/dist/constants/error-codes.js +9 -0
  43. package/dist/constants/origins.d.ts +6 -0
  44. package/dist/constants/origins.d.ts.map +1 -0
  45. package/dist/constants/origins.js +6 -0
  46. package/dist/constants/package-status.d.ts +3 -0
  47. package/dist/constants/package-status.d.ts.map +1 -0
  48. package/dist/constants/package-status.js +15 -0
  49. package/dist/constants/page-limits.d.ts +3 -0
  50. package/dist/constants/page-limits.d.ts.map +1 -0
  51. package/dist/constants/page-limits.js +9 -0
  52. package/dist/constants.d.ts +18 -0
  53. package/dist/constants.d.ts.map +1 -0
  54. package/dist/constants.js +17 -0
  55. package/dist/errors.d.ts +27 -0
  56. package/dist/errors.d.ts.map +1 -0
  57. package/dist/errors.js +113 -0
  58. package/dist/finance/api.d.ts +39 -0
  59. package/dist/finance/api.d.ts.map +1 -0
  60. package/dist/finance/api.js +165 -0
  61. package/dist/finance/paths.d.ts +6 -0
  62. package/dist/finance/paths.d.ts.map +1 -0
  63. package/dist/finance/paths.js +16 -0
  64. package/dist/http/multipart.d.ts +10 -0
  65. package/dist/http/multipart.d.ts.map +1 -0
  66. package/dist/http/multipart.js +1 -0
  67. package/dist/http/query.d.ts +5 -0
  68. package/dist/http/query.d.ts.map +1 -0
  69. package/dist/http/query.js +24 -0
  70. package/dist/http/response.d.ts +9 -0
  71. package/dist/http/response.d.ts.map +1 -0
  72. package/dist/http/response.js +37 -0
  73. package/dist/http/signals.d.ts +5 -0
  74. package/dist/http/signals.d.ts.map +1 -0
  75. package/dist/http/signals.js +26 -0
  76. package/dist/http.d.ts +14 -0
  77. package/dist/http.d.ts.map +1 -0
  78. package/dist/http.js +180 -0
  79. package/dist/index.d.ts +61 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +41 -0
  82. package/dist/inventory/api.d.ts +26 -0
  83. package/dist/inventory/api.d.ts.map +1 -0
  84. package/dist/inventory/api.js +51 -0
  85. package/dist/inventory/paths.d.ts +2 -0
  86. package/dist/inventory/paths.d.ts.map +1 -0
  87. package/dist/inventory/paths.js +4 -0
  88. package/dist/invoices/api.d.ts +23 -0
  89. package/dist/invoices/api.d.ts.map +1 -0
  90. package/dist/invoices/api.js +52 -0
  91. package/dist/labels/api.d.ts +45 -0
  92. package/dist/labels/api.d.ts.map +1 -0
  93. package/dist/labels/api.js +89 -0
  94. package/dist/labels/paths.d.ts +3 -0
  95. package/dist/labels/paths.d.ts.map +1 -0
  96. package/dist/labels/paths.js +7 -0
  97. package/dist/logger.d.ts +6 -0
  98. package/dist/logger.d.ts.map +1 -0
  99. package/dist/logger.js +47 -0
  100. package/dist/orders/api.d.ts +68 -0
  101. package/dist/orders/api.d.ts.map +1 -0
  102. package/dist/orders/api.js +69 -0
  103. package/dist/orders/created-by.d.ts +4 -0
  104. package/dist/orders/created-by.d.ts.map +1 -0
  105. package/dist/orders/created-by.js +9 -0
  106. package/dist/orders/mutations.d.ts +31 -0
  107. package/dist/orders/mutations.d.ts.map +1 -0
  108. package/dist/orders/mutations.js +139 -0
  109. package/dist/orders/paths.d.ts +4 -0
  110. package/dist/orders/paths.d.ts.map +1 -0
  111. package/dist/orders/paths.js +12 -0
  112. package/dist/orders/read.d.ts +35 -0
  113. package/dist/orders/read.d.ts.map +1 -0
  114. package/dist/orders/read.js +140 -0
  115. package/dist/orders/split.d.ts +17 -0
  116. package/dist/orders/split.d.ts.map +1 -0
  117. package/dist/orders/split.js +45 -0
  118. package/dist/orders/status.d.ts +9 -0
  119. package/dist/orders/status.d.ts.map +1 -0
  120. package/dist/orders/status.js +20 -0
  121. package/dist/orders/stream.d.ts +19 -0
  122. package/dist/orders/stream.d.ts.map +1 -0
  123. package/dist/orders/stream.js +26 -0
  124. package/dist/orders/warranty.d.ts +24 -0
  125. package/dist/orders/warranty.d.ts.map +1 -0
  126. package/dist/orders/warranty.js +30 -0
  127. package/dist/pagination.d.ts +23 -0
  128. package/dist/pagination.d.ts.map +1 -0
  129. package/dist/pagination.js +34 -0
  130. package/dist/products/api.d.ts +52 -0
  131. package/dist/products/api.d.ts.map +1 -0
  132. package/dist/products/api.js +222 -0
  133. package/dist/products/builder.d.ts +22 -0
  134. package/dist/products/builder.d.ts.map +1 -0
  135. package/dist/products/builder.js +89 -0
  136. package/dist/products/paths.d.ts +7 -0
  137. package/dist/products/paths.d.ts.map +1 -0
  138. package/dist/products/paths.js +20 -0
  139. package/dist/qna/api.d.ts +32 -0
  140. package/dist/qna/api.d.ts.map +1 -0
  141. package/dist/qna/api.js +78 -0
  142. package/dist/qna/paths.d.ts +5 -0
  143. package/dist/qna/paths.d.ts.map +1 -0
  144. package/dist/qna/paths.js +13 -0
  145. package/dist/rate-limit/governor.d.ts +11 -0
  146. package/dist/rate-limit/governor.d.ts.map +1 -0
  147. package/dist/rate-limit/governor.js +25 -0
  148. package/dist/rate-limit/groups.d.ts +15 -0
  149. package/dist/rate-limit/groups.d.ts.map +1 -0
  150. package/dist/rate-limit/groups.js +14 -0
  151. package/dist/reference/addresses-cache.d.ts +13 -0
  152. package/dist/reference/addresses-cache.d.ts.map +1 -0
  153. package/dist/reference/addresses-cache.js +33 -0
  154. package/dist/reference/api.d.ts +48 -0
  155. package/dist/reference/api.d.ts.map +1 -0
  156. package/dist/reference/api.js +215 -0
  157. package/dist/reference/paths.d.ts +12 -0
  158. package/dist/reference/paths.d.ts.map +1 -0
  159. package/dist/reference/paths.js +34 -0
  160. package/dist/retry.d.ts +6 -0
  161. package/dist/retry.d.ts.map +1 -0
  162. package/dist/retry.js +37 -0
  163. package/dist/testing/fixtures/batch-partial-fail.json +12 -0
  164. package/dist/testing/fixtures/shipment-package.json +5 -0
  165. package/dist/testing/fixtures/webhook-payload.json +4 -0
  166. package/dist/testing/fixtures.d.ts +23 -0
  167. package/dist/testing/fixtures.d.ts.map +1 -0
  168. package/dist/testing/fixtures.js +9 -0
  169. package/dist/testing/guard.d.ts +13 -0
  170. package/dist/testing/guard.d.ts.map +1 -0
  171. package/dist/testing/guard.js +32 -0
  172. package/dist/testing/index.d.ts +6 -0
  173. package/dist/testing/index.d.ts.map +1 -0
  174. package/dist/testing/index.js +4 -0
  175. package/dist/testing/paths.d.ts +5 -0
  176. package/dist/testing/paths.d.ts.map +1 -0
  177. package/dist/testing/paths.js +14 -0
  178. package/dist/testing/stage-helpers.d.ts +24 -0
  179. package/dist/testing/stage-helpers.d.ts.map +1 -0
  180. package/dist/testing/stage-helpers.js +64 -0
  181. package/dist/testing/types.d.ts +66 -0
  182. package/dist/testing/types.d.ts.map +1 -0
  183. package/dist/testing/types.js +1 -0
  184. package/dist/types/claims.d.ts +132 -0
  185. package/dist/types/claims.d.ts.map +1 -0
  186. package/dist/types/claims.js +1 -0
  187. package/dist/types/compensation.d.ts +32 -0
  188. package/dist/types/compensation.d.ts.map +1 -0
  189. package/dist/types/compensation.js +20 -0
  190. package/dist/types/finance.d.ts +98 -0
  191. package/dist/types/finance.d.ts.map +1 -0
  192. package/dist/types/finance.js +1 -0
  193. package/dist/types/inventory.d.ts +12 -0
  194. package/dist/types/inventory.d.ts.map +1 -0
  195. package/dist/types/inventory.js +1 -0
  196. package/dist/types/labels.d.ts +19 -0
  197. package/dist/types/labels.d.ts.map +1 -0
  198. package/dist/types/labels.js +1 -0
  199. package/dist/types/orders.d.ts +276 -0
  200. package/dist/types/orders.d.ts.map +1 -0
  201. package/dist/types/orders.js +1 -0
  202. package/dist/types/products.d.ts +99 -0
  203. package/dist/types/products.d.ts.map +1 -0
  204. package/dist/types/products.js +1 -0
  205. package/dist/types/qna.d.ts +51 -0
  206. package/dist/types/qna.d.ts.map +1 -0
  207. package/dist/types/qna.js +6 -0
  208. package/dist/types/reference.d.ts +78 -0
  209. package/dist/types/reference.d.ts.map +1 -0
  210. package/dist/types/reference.js +1 -0
  211. package/dist/types/webhooks.d.ts +47 -0
  212. package/dist/types/webhooks.d.ts.map +1 -0
  213. package/dist/types/webhooks.js +19 -0
  214. package/dist/types.d.ts +73 -0
  215. package/dist/types.d.ts.map +1 -0
  216. package/dist/types.js +1 -0
  217. package/dist/validate.d.ts +9 -0
  218. package/dist/validate.d.ts.map +1 -0
  219. package/dist/validate.js +70 -0
  220. package/dist/video/api.d.ts +46 -0
  221. package/dist/video/api.d.ts.map +1 -0
  222. package/dist/video/api.js +95 -0
  223. package/dist/video/paths.d.ts +3 -0
  224. package/dist/video/paths.d.ts.map +1 -0
  225. package/dist/video/paths.js +7 -0
  226. package/dist/webhooks/inbound.d.ts +33 -0
  227. package/dist/webhooks/inbound.d.ts.map +1 -0
  228. package/dist/webhooks/inbound.js +113 -0
  229. package/dist/webhooks/management.d.ts +49 -0
  230. package/dist/webhooks/management.d.ts.map +1 -0
  231. package/dist/webhooks/management.js +89 -0
  232. package/dist/webhooks/paths.d.ts +5 -0
  233. package/dist/webhooks/paths.d.ts.map +1 -0
  234. package/dist/webhooks/paths.js +13 -0
  235. package/package.json +47 -0
@@ -0,0 +1,45 @@
1
+ import { shipmentPackageBase } from "./paths.js";
2
+ export class OrdersSplitApi {
3
+ http;
4
+ config;
5
+ constructor(http, config) {
6
+ this.http = http;
7
+ this.config = config;
8
+ }
9
+ splitShipmentPackage(packageId, body, options) {
10
+ return this.http.requestJson({
11
+ method: "POST",
12
+ path: `${shipmentPackageBase(this.config.sellerId, packageId)}/split`,
13
+ body,
14
+ retryPolicy: "none",
15
+ signal: options?.signal,
16
+ });
17
+ }
18
+ splitByQuantity(packageId, body, options) {
19
+ return this.http.requestJson({
20
+ method: "POST",
21
+ path: `${shipmentPackageBase(this.config.sellerId, packageId)}/quantity-split`,
22
+ body,
23
+ retryPolicy: "none",
24
+ signal: options?.signal,
25
+ });
26
+ }
27
+ multiSplit(packageId, body, options) {
28
+ return this.http.requestJson({
29
+ method: "POST",
30
+ path: `${shipmentPackageBase(this.config.sellerId, packageId)}/multi-split`,
31
+ body,
32
+ retryPolicy: "none",
33
+ signal: options?.signal,
34
+ });
35
+ }
36
+ splitMultiPackageByQuantity(packageId, body, options) {
37
+ return this.http.requestJson({
38
+ method: "POST",
39
+ path: `${shipmentPackageBase(this.config.sellerId, packageId)}/split-packages`,
40
+ body,
41
+ retryPolicy: "none",
42
+ signal: options?.signal,
43
+ });
44
+ }
45
+ }
@@ -0,0 +1,9 @@
1
+ import { type PackageStatus } from "../constants/package-status.js";
2
+ import type { TrendyolResult } from "../types.js";
3
+ /** updatePackageStatus icin gecerli hedef statuler. */
4
+ export declare const UPDATE_PACKAGE_STATUS_VALUES: readonly ["Picking", "Invoiced"];
5
+ export type UpdatePackageStatusValue = (typeof UPDATE_PACKAGE_STATUS_VALUES)[number];
6
+ export declare function isPackageStatus(value: string): value is PackageStatus;
7
+ export declare function isUpdatePackageStatusValue(value: string): value is UpdatePackageStatusValue;
8
+ export declare function validateUpdatePackageStatus(status: string): TrendyolResult<UpdatePackageStatusValue>;
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/orders/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,uDAAuD;AACvD,eAAO,MAAM,4BAA4B,kCAAmC,CAAC;AAE7E,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAErF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAErE;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,GACZ,KAAK,IAAI,wBAAwB,CAEnC;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,GACb,cAAc,CAAC,wBAAwB,CAAC,CAU1C"}
@@ -0,0 +1,20 @@
1
+ import { PACKAGE_STATUSES } from "../constants/package-status.js";
2
+ /** updatePackageStatus icin gecerli hedef statuler. */
3
+ export const UPDATE_PACKAGE_STATUS_VALUES = ["Picking", "Invoiced"];
4
+ export function isPackageStatus(value) {
5
+ return PACKAGE_STATUSES.includes(value);
6
+ }
7
+ export function isUpdatePackageStatusValue(value) {
8
+ return UPDATE_PACKAGE_STATUS_VALUES.includes(value);
9
+ }
10
+ export function validateUpdatePackageStatus(status) {
11
+ if (!isUpdatePackageStatusValue(status)) {
12
+ return {
13
+ ok: false,
14
+ reason: `Gecersiz paket statu guncelleme degeri: ${status}. Izin verilen: Picking, Invoiced.`,
15
+ code: "INVALID_PACKAGE_STATUS",
16
+ retryable: false,
17
+ };
18
+ }
19
+ return { ok: true, data: status };
20
+ }
@@ -0,0 +1,19 @@
1
+ /** Varsayilan stream lookback — saat kaymasi / kacan event icin 5 dk. */
2
+ export declare const DEFAULT_STREAM_LOOKBACK_MS = 300000;
3
+ export type StreamLookbackOptions = {
4
+ lookbackMs?: number;
5
+ now?: Date;
6
+ };
7
+ /**
8
+ * Verilen tarihe lookback uygular (stream baslangic penceresi).
9
+ */
10
+ export declare function applyLookback(date: Date, lookbackMs?: number): Date;
11
+ /**
12
+ * Stream sorgusu icin baslangic tarihi — explicit date yoksa simdi - lookbackMs.
13
+ */
14
+ export declare function resolveStreamStartDate(options?: StreamLookbackOptions): Date;
15
+ export declare function buildStreamQueryParams(options?: StreamLookbackOptions): {
16
+ startDate: Date;
17
+ lookbackMs: number;
18
+ };
19
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/orders/stream.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,eAAO,MAAM,0BAA0B,SAAU,CAAC;AAElD,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,UAAU,GAAE,MAAmC,GAC9C,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAI5E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG;IACvE,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAMA"}
@@ -0,0 +1,26 @@
1
+ /** Varsayilan stream lookback — saat kaymasi / kacan event icin 5 dk. */
2
+ export const DEFAULT_STREAM_LOOKBACK_MS = 300_000;
3
+ /**
4
+ * Verilen tarihe lookback uygular (stream baslangic penceresi).
5
+ */
6
+ export function applyLookback(date, lookbackMs = DEFAULT_STREAM_LOOKBACK_MS) {
7
+ if (lookbackMs <= 0) {
8
+ return date;
9
+ }
10
+ return new Date(date.getTime() - lookbackMs);
11
+ }
12
+ /**
13
+ * Stream sorgusu icin baslangic tarihi — explicit date yoksa simdi - lookbackMs.
14
+ */
15
+ export function resolveStreamStartDate(options) {
16
+ const lookbackMs = options?.lookbackMs ?? DEFAULT_STREAM_LOOKBACK_MS;
17
+ const anchor = options?.now ?? new Date();
18
+ return applyLookback(anchor, lookbackMs);
19
+ }
20
+ export function buildStreamQueryParams(options) {
21
+ const lookbackMs = options?.lookbackMs ?? DEFAULT_STREAM_LOOKBACK_MS;
22
+ return {
23
+ lookbackMs,
24
+ startDate: resolveStreamStartDate({ lookbackMs, now: options?.now }),
25
+ };
26
+ }
@@ -0,0 +1,24 @@
1
+ import type { TrendyolHttpClient } from "../http.js";
2
+ import type { TrendyolConfig, TrendyolResult } from "../types.js";
3
+ type WarrantyOptions = {
4
+ signal?: AbortSignal;
5
+ };
6
+ export type UploadWarrantyDocumentFields = {
7
+ shipmentPackageId: number | string;
8
+ lineId: number | string;
9
+ file: Blob;
10
+ fileName?: string;
11
+ };
12
+ /**
13
+ * Garanti belgesi upload — multipart form-data.
14
+ *
15
+ * POST /integration/sellers/{sellerId}/warranty-documents
16
+ */
17
+ export declare class WarrantyApi {
18
+ private readonly http;
19
+ private readonly config;
20
+ constructor(http: TrendyolHttpClient, config: TrendyolConfig);
21
+ uploadWarrantyDocument(fields: UploadWarrantyDocumentFields, options?: WarrantyOptions): Promise<TrendyolResult<unknown>>;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=warranty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warranty.d.ts","sourceRoot":"","sources":["../../src/orders/warranty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,KAAK,eAAe,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AAEhD,MAAM,MAAM,4BAA4B,GAAG;IACzC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF;;;;GAIG;AACH,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,cAAc;IAGzC,sBAAsB,CACpB,MAAM,EAAE,4BAA4B,EACpC,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;CAcpC"}
@@ -0,0 +1,30 @@
1
+ import { TRENDYOL_INTEGRATION_PREFIX } from "../constants.js";
2
+ function warrantyDocumentsPath(sellerId) {
3
+ return `${TRENDYOL_INTEGRATION_PREFIX}/sellers/${sellerId}/warranty-documents`;
4
+ }
5
+ /**
6
+ * Garanti belgesi upload — multipart form-data.
7
+ *
8
+ * POST /integration/sellers/{sellerId}/warranty-documents
9
+ */
10
+ export class WarrantyApi {
11
+ http;
12
+ config;
13
+ constructor(http, config) {
14
+ this.http = http;
15
+ this.config = config;
16
+ }
17
+ uploadWarrantyDocument(fields, options) {
18
+ const form = new FormData();
19
+ form.append("shipmentPackageId", String(fields.shipmentPackageId));
20
+ form.append("lineId", String(fields.lineId));
21
+ form.append("file", fields.file, fields.fileName ?? "warranty.pdf");
22
+ return this.http.requestMultipart({
23
+ method: "POST",
24
+ path: warrantyDocumentsPath(this.config.sellerId),
25
+ formData: form,
26
+ retryPolicy: "none",
27
+ signal: options?.signal,
28
+ });
29
+ }
30
+ }
@@ -0,0 +1,23 @@
1
+ import type { PageParams, TrendyolResult } from "./types.js";
2
+ export type ListResponseShape<T> = {
3
+ content?: T[];
4
+ items?: T[];
5
+ data?: T[];
6
+ totalElements?: number;
7
+ totalPages?: number;
8
+ nextPageToken?: string;
9
+ nextCursor?: string;
10
+ };
11
+ export declare function normalizeListResponse<T>(response: ListResponseShape<T>): {
12
+ items: T[];
13
+ totalElements?: number;
14
+ nextPageToken?: string;
15
+ nextCursor?: string;
16
+ };
17
+ export type FetchPageFn<T> = (params: PageParams & Record<string, unknown>) => Promise<TrendyolResult<ListResponseShape<T>>>;
18
+ export declare function fetchAllPages<T>(fetchPage: FetchPageFn<T>, options?: {
19
+ pageSize?: number;
20
+ maxPages?: number;
21
+ extraParams?: Record<string, unknown>;
22
+ }): Promise<TrendyolResult<T[]>>;
23
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;IACd,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC7B;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAQrF;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAC3B,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACzC,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnD,wBAAsB,aAAa,CAAC,CAAC,EACnC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,EACzB,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,GACA,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CA6B9B"}
@@ -0,0 +1,34 @@
1
+ export function normalizeListResponse(response) {
2
+ const items = response.content ?? response.items ?? response.data ?? [];
3
+ return {
4
+ items,
5
+ totalElements: response.totalElements,
6
+ nextPageToken: response.nextPageToken,
7
+ nextCursor: response.nextCursor,
8
+ };
9
+ }
10
+ export async function fetchAllPages(fetchPage, options) {
11
+ const pageSize = options?.pageSize ?? 50;
12
+ const maxPages = options?.maxPages ?? 100;
13
+ const items = [];
14
+ for (let page = 0; page < maxPages; page += 1) {
15
+ const result = await fetchPage({
16
+ page,
17
+ size: pageSize,
18
+ ...options?.extraParams,
19
+ });
20
+ if (!result.ok) {
21
+ return result;
22
+ }
23
+ const normalized = normalizeListResponse(result.data);
24
+ items.push(...normalized.items);
25
+ if (normalized.items.length < pageSize) {
26
+ break;
27
+ }
28
+ if (normalized.nextPageToken || normalized.nextCursor) {
29
+ // Token/cursor pagination — caller should use dedicated iterator (Faz 1+)
30
+ break;
31
+ }
32
+ }
33
+ return { ok: true, data: items };
34
+ }
@@ -0,0 +1,52 @@
1
+ import { type BatchRequestReport } from "../batch/report.js";
2
+ import type { TrendyolHttpClient } from "../http.js";
3
+ import type { TrendyolConfig, TrendyolResult } from "../types.js";
4
+ import type { ArchiveProductsBody, BuyboxInformationBody, BuyboxInformationResponse, DeleteProductsBody, ProductBaseResponse, ProductBatchSubmitResponse, ProductCreateItem, ProductFilterParams, ProductFilterResponse, UnlockProductsBody, UpdateAuditsResponse } from "../types/products.js";
5
+ type ProductOptions = {
6
+ signal?: AbortSignal;
7
+ };
8
+ /**
9
+ * Urun V2 API — CRUD, filtre, batch submit, buybox.
10
+ */
11
+ export declare class ProductsApi {
12
+ private readonly http;
13
+ private readonly config;
14
+ constructor(http: TrendyolHttpClient, config: TrendyolConfig);
15
+ /** POST /product/sellers/{id}/v2/products */
16
+ createProducts(items: ProductCreateItem[], options?: ProductOptions): Promise<TrendyolResult<ProductBatchSubmitResponse>>;
17
+ /** POST .../products/unapproved-bulk-update */
18
+ updateUnapprovedProducts(items: ProductCreateItem[], options?: ProductOptions): Promise<TrendyolResult<ProductBatchSubmitResponse>>;
19
+ /** POST .../products/content-bulk-update */
20
+ updateContentBulk(items: ProductCreateItem[], options?: ProductOptions): Promise<TrendyolResult<ProductBatchSubmitResponse>>;
21
+ /** POST .../products/variant-bulk-update */
22
+ updateVariantBulk(items: ProductCreateItem[], options?: ProductOptions): Promise<TrendyolResult<ProductBatchSubmitResponse>>;
23
+ /** POST .../products/delivery-info-bulk-update */
24
+ updateDeliveryInfoBulk(items: ProductCreateItem[], options?: ProductOptions): Promise<TrendyolResult<ProductBatchSubmitResponse>>;
25
+ /** GET .../products/unapproved */
26
+ filterUnapprovedProducts(params?: ProductFilterParams, options?: ProductOptions): Promise<TrendyolResult<ProductFilterResponse>>;
27
+ /** GET .../products/approved */
28
+ filterApprovedProducts(params?: ProductFilterParams, options?: ProductOptions): Promise<TrendyolResult<ProductFilterResponse>>;
29
+ /** GET .../products/approved/inventory-and-price */
30
+ filterApprovedInventoryAndPrice(params?: ProductFilterParams, options?: ProductOptions): Promise<TrendyolResult<ProductFilterResponse>>;
31
+ /** GET .../product/{barcode} */
32
+ getProductBase(barcode: string, options?: ProductOptions): Promise<TrendyolResult<ProductBaseResponse>>;
33
+ /** DELETE .../products */
34
+ deleteProducts(body: DeleteProductsBody, options?: ProductOptions): Promise<TrendyolResult<ProductBatchSubmitResponse>>;
35
+ /** PUT .../products/archive-state */
36
+ archiveProducts(body: ArchiveProductsBody, options?: ProductOptions): Promise<TrendyolResult<ProductBatchSubmitResponse>>;
37
+ /** PUT .../products/unlock */
38
+ unlockProducts(body: UnlockProductsBody, options?: ProductOptions): Promise<TrendyolResult<ProductBatchSubmitResponse>>;
39
+ /** POST .../products/buybox-information — max 10 barkod */
40
+ getBuyboxInformation(body: BuyboxInformationBody, options?: ProductOptions): Promise<TrendyolResult<BuyboxInformationResponse>>;
41
+ /** GET .../products/{contentId}/update-audits */
42
+ getUpdateAudits(contentId: number | string, options?: ProductOptions): Promise<TrendyolResult<UpdateAuditsResponse>>;
43
+ /**
44
+ * GET .../products/batch-requests/{id}
45
+ *
46
+ * Inventory batch path ile karistirilmaz — yalnizca product batch-requests.
47
+ */
48
+ getBatchRequestResult(batchRequestId: string, options?: ProductOptions): Promise<TrendyolResult<BatchRequestReport>>;
49
+ private filterProducts;
50
+ }
51
+ export {};
52
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/products/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAU9B,KAAK,cAAc,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AAc/C;;GAEG;AACH,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,cAAc;IAGzC,6CAA6C;IAC7C,cAAc,CACZ,KAAK,EAAE,iBAAiB,EAAE,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAetD,+CAA+C;IAC/C,wBAAwB,CACtB,KAAK,EAAE,iBAAiB,EAAE,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAetD,4CAA4C;IAC5C,iBAAiB,CACf,KAAK,EAAE,iBAAiB,EAAE,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAetD,4CAA4C;IAC5C,iBAAiB,CACf,KAAK,EAAE,iBAAiB,EAAE,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAetD,kDAAkD;IAClD,sBAAsB,CACpB,KAAK,EAAE,iBAAiB,EAAE,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAetD,kCAAkC;IAClC,wBAAwB,CACtB,MAAM,CAAC,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;IAQjD,gCAAgC;IAChC,sBAAsB,CACpB,MAAM,CAAC,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;IAQjD,oDAAoD;IACpD,+BAA+B,CAC7B,MAAM,CAAC,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;IAQjD,gCAAgC;IAChC,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAa/C,0BAA0B;IAC1B,cAAc,CACZ,IAAI,EAAE,kBAAkB,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAetD,qCAAqC;IACrC,eAAe,CACb,IAAI,EAAE,mBAAmB,EACzB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAetD,8BAA8B;IAC9B,cAAc,CACZ,IAAI,EAAE,kBAAkB,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAetD,2DAA2D;IAC3D,oBAAoB,CAClB,IAAI,EAAE,qBAAqB,EAC3B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,yBAAyB,CAAC,CAAC;IAiBrD,iDAAiD;IACjD,eAAe,CACb,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;IAShD;;;;OAIG;IACH,qBAAqB,CACnB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;IAoB9C,OAAO,CAAC,cAAc;CAqBvB"}
@@ -0,0 +1,222 @@
1
+ import { parseBatchRequestReport } from "../batch/report.js";
2
+ import { validateBatchSize, validatePageSize } from "../validate.js";
3
+ import { batchRequestPath, productByBarcodePath, productsBase, productV2Path, updateAuditsPath, } from "./paths.js";
4
+ const MAX_BUYBOX_BARCODES = 10;
5
+ function validateProductBatch(items) {
6
+ const batchValidation = validateBatchSize(items.length, 1000);
7
+ if (!batchValidation.ok) {
8
+ return batchValidation;
9
+ }
10
+ return undefined;
11
+ }
12
+ /**
13
+ * Urun V2 API — CRUD, filtre, batch submit, buybox.
14
+ */
15
+ export class ProductsApi {
16
+ http;
17
+ config;
18
+ constructor(http, config) {
19
+ this.http = http;
20
+ this.config = config;
21
+ }
22
+ /** POST /product/sellers/{id}/v2/products */
23
+ createProducts(items, options) {
24
+ const validation = validateProductBatch(items);
25
+ if (validation) {
26
+ return Promise.resolve(validation);
27
+ }
28
+ return this.http.requestJson({
29
+ method: "POST",
30
+ path: productV2Path(this.config.sellerId),
31
+ body: { items },
32
+ retryPolicy: "none",
33
+ signal: options?.signal,
34
+ });
35
+ }
36
+ /** POST .../products/unapproved-bulk-update */
37
+ updateUnapprovedProducts(items, options) {
38
+ const validation = validateProductBatch(items);
39
+ if (validation) {
40
+ return Promise.resolve(validation);
41
+ }
42
+ return this.http.requestJson({
43
+ method: "POST",
44
+ path: `${productsBase(this.config.sellerId)}/unapproved-bulk-update`,
45
+ body: { items },
46
+ retryPolicy: "none",
47
+ signal: options?.signal,
48
+ });
49
+ }
50
+ /** POST .../products/content-bulk-update */
51
+ updateContentBulk(items, options) {
52
+ const validation = validateProductBatch(items);
53
+ if (validation) {
54
+ return Promise.resolve(validation);
55
+ }
56
+ return this.http.requestJson({
57
+ method: "POST",
58
+ path: `${productsBase(this.config.sellerId)}/content-bulk-update`,
59
+ body: { items },
60
+ retryPolicy: "none",
61
+ signal: options?.signal,
62
+ });
63
+ }
64
+ /** POST .../products/variant-bulk-update */
65
+ updateVariantBulk(items, options) {
66
+ const validation = validateProductBatch(items);
67
+ if (validation) {
68
+ return Promise.resolve(validation);
69
+ }
70
+ return this.http.requestJson({
71
+ method: "POST",
72
+ path: `${productsBase(this.config.sellerId)}/variant-bulk-update`,
73
+ body: { items },
74
+ retryPolicy: "none",
75
+ signal: options?.signal,
76
+ });
77
+ }
78
+ /** POST .../products/delivery-info-bulk-update */
79
+ updateDeliveryInfoBulk(items, options) {
80
+ const validation = validateProductBatch(items);
81
+ if (validation) {
82
+ return Promise.resolve(validation);
83
+ }
84
+ return this.http.requestJson({
85
+ method: "POST",
86
+ path: `${productsBase(this.config.sellerId)}/delivery-info-bulk-update`,
87
+ body: { items },
88
+ retryPolicy: "none",
89
+ signal: options?.signal,
90
+ });
91
+ }
92
+ /** GET .../products/unapproved */
93
+ filterUnapprovedProducts(params, options) {
94
+ return this.filterProducts(`${productsBase(this.config.sellerId)}/unapproved`, params, options);
95
+ }
96
+ /** GET .../products/approved */
97
+ filterApprovedProducts(params, options) {
98
+ return this.filterProducts(`${productsBase(this.config.sellerId)}/approved`, params, options);
99
+ }
100
+ /** GET .../products/approved/inventory-and-price */
101
+ filterApprovedInventoryAndPrice(params, options) {
102
+ return this.filterProducts(`${productsBase(this.config.sellerId)}/approved/inventory-and-price`, params, options);
103
+ }
104
+ /** GET .../product/{barcode} */
105
+ getProductBase(barcode, options) {
106
+ if (!barcode.trim()) {
107
+ return Promise.resolve({ ok: false, reason: "barcode bos olamaz." });
108
+ }
109
+ return this.http.requestJson({
110
+ method: "GET",
111
+ path: productByBarcodePath(this.config.sellerId, barcode),
112
+ retryPolicy: "safe",
113
+ signal: options?.signal,
114
+ });
115
+ }
116
+ /** DELETE .../products */
117
+ deleteProducts(body, options) {
118
+ const validation = validateProductBatch(body.items);
119
+ if (validation) {
120
+ return Promise.resolve(validation);
121
+ }
122
+ return this.http.requestJson({
123
+ method: "DELETE",
124
+ path: productsBase(this.config.sellerId),
125
+ body,
126
+ retryPolicy: "none",
127
+ signal: options?.signal,
128
+ });
129
+ }
130
+ /** PUT .../products/archive-state */
131
+ archiveProducts(body, options) {
132
+ const validation = validateProductBatch(body.items);
133
+ if (validation) {
134
+ return Promise.resolve(validation);
135
+ }
136
+ return this.http.requestJson({
137
+ method: "PUT",
138
+ path: `${productsBase(this.config.sellerId)}/archive-state`,
139
+ body,
140
+ retryPolicy: "none",
141
+ signal: options?.signal,
142
+ });
143
+ }
144
+ /** PUT .../products/unlock */
145
+ unlockProducts(body, options) {
146
+ const validation = validateProductBatch(body.barcodes);
147
+ if (validation) {
148
+ return Promise.resolve(validation);
149
+ }
150
+ return this.http.requestJson({
151
+ method: "PUT",
152
+ path: `${productsBase(this.config.sellerId)}/unlock`,
153
+ body,
154
+ retryPolicy: "none",
155
+ signal: options?.signal,
156
+ });
157
+ }
158
+ /** POST .../products/buybox-information — max 10 barkod */
159
+ getBuyboxInformation(body, options) {
160
+ if (body.barcodes.length < 1 || body.barcodes.length > MAX_BUYBOX_BARCODES) {
161
+ return Promise.resolve({
162
+ ok: false,
163
+ reason: `buybox sorgusu en fazla ${MAX_BUYBOX_BARCODES} barkod icerebilir.`,
164
+ });
165
+ }
166
+ return this.http.requestJson({
167
+ method: "POST",
168
+ path: `${productsBase(this.config.sellerId)}/buybox-information`,
169
+ body,
170
+ retryPolicy: "none",
171
+ signal: options?.signal,
172
+ });
173
+ }
174
+ /** GET .../products/{contentId}/update-audits */
175
+ getUpdateAudits(contentId, options) {
176
+ return this.http.requestJson({
177
+ method: "GET",
178
+ path: updateAuditsPath(this.config.sellerId, contentId),
179
+ retryPolicy: "safe",
180
+ signal: options?.signal,
181
+ });
182
+ }
183
+ /**
184
+ * GET .../products/batch-requests/{id}
185
+ *
186
+ * Inventory batch path ile karistirilmaz — yalnizca product batch-requests.
187
+ */
188
+ getBatchRequestResult(batchRequestId, options) {
189
+ if (!batchRequestId.trim()) {
190
+ return Promise.resolve({ ok: false, reason: "batchRequestId bos olamaz." });
191
+ }
192
+ return this.http
193
+ .requestJson({
194
+ method: "GET",
195
+ path: batchRequestPath(this.config.sellerId, batchRequestId),
196
+ retryPolicy: "safe",
197
+ signal: options?.signal,
198
+ })
199
+ .then((result) => {
200
+ if (!result.ok) {
201
+ return result;
202
+ }
203
+ return { ok: true, data: parseBatchRequestReport(result.data) };
204
+ });
205
+ }
206
+ filterProducts(path, params, options) {
207
+ if (params?.size !== undefined) {
208
+ const pageValidation = validatePageSize("products", params.size);
209
+ if (!pageValidation.ok) {
210
+ return Promise.resolve(pageValidation);
211
+ }
212
+ }
213
+ const { page, size, ...rest } = params ?? {};
214
+ return this.http.requestJson({
215
+ method: "GET",
216
+ path,
217
+ query: { page, size, ...rest },
218
+ retryPolicy: "safe",
219
+ signal: options?.signal,
220
+ });
221
+ }
222
+ }
@@ -0,0 +1,22 @@
1
+ import type { TrendyolResult } from "../types.js";
2
+ import type { CategoryAttribute, SupplierAddress } from "../types/reference.js";
3
+ import type { ProductCreateItem } from "../types/products.js";
4
+ export type BuildProductPayloadOptions = {
5
+ /** Kategori zorunlu attribute kontrolu icin referans cevabi. */
6
+ categoryAttributes?: CategoryAttribute[];
7
+ /** shipmentAddressId / returningAddressId dogrulama icin. */
8
+ supplierAddresses?: SupplierAddress[];
9
+ /** EAN-13 kontrolu (varsayilan true). */
10
+ validateBarcodes?: boolean;
11
+ };
12
+ /**
13
+ * Urun V2 payload dogrulama ve hazirlama.
14
+ *
15
+ * - Kategori zorunlu attribute kontrolu
16
+ * - listPrice >= salePrice
17
+ * - Varyant/barcode uniqueness
18
+ * - Menşei (ORIGIN_COUNTRIES) enum
19
+ * - Adres ID'leri (getSuppliersAddresses cache'den)
20
+ */
21
+ export declare function buildProductCreatePayload(items: ProductCreateItem[], options?: BuildProductPayloadOptions): TrendyolResult<ProductCreateItem[]>;
22
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/products/builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,MAAM,MAAM,0BAA0B,GAAG;IACvC,gEAAgE;IAChE,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACzC,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,eAAe,EAAE,CAAC;IACtC,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAIF;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,iBAAiB,EAAE,EAC1B,OAAO,CAAC,EAAE,0BAA0B,GACnC,cAAc,CAAC,iBAAiB,EAAE,CAAC,CA6ErC"}
@@ -0,0 +1,89 @@
1
+ import { ORIGIN_COUNTRIES } from "../constants/origins.js";
2
+ import { validateEan13, validatePrices } from "../validate.js";
3
+ const ORIGIN_CODES = new Set(ORIGIN_COUNTRIES.map((c) => c.code));
4
+ /**
5
+ * Urun V2 payload dogrulama ve hazirlama.
6
+ *
7
+ * - Kategori zorunlu attribute kontrolu
8
+ * - listPrice >= salePrice
9
+ * - Varyant/barcode uniqueness
10
+ * - Menşei (ORIGIN_COUNTRIES) enum
11
+ * - Adres ID'leri (getSuppliersAddresses cache'den)
12
+ */
13
+ export function buildProductCreatePayload(items, options) {
14
+ if (items.length < 1) {
15
+ return { ok: false, reason: "en az bir urun satiri gerekli." };
16
+ }
17
+ const seenBarcodes = new Set();
18
+ const addressIds = new Set((options?.supplierAddresses ?? [])
19
+ .map((a) => a.id)
20
+ .filter((id) => typeof id === "number"));
21
+ for (let index = 0; index < items.length; index += 1) {
22
+ const item = items[index];
23
+ const prefix = `items[${index}]`;
24
+ if (options?.validateBarcodes !== false) {
25
+ const eanValidation = validateEan13(item.barcode);
26
+ if (!eanValidation.ok) {
27
+ return { ok: false, reason: `${prefix}: ${eanValidation.reason}` };
28
+ }
29
+ }
30
+ const normalizedBarcode = item.barcode.trim();
31
+ if (seenBarcodes.has(normalizedBarcode)) {
32
+ return {
33
+ ok: false,
34
+ reason: `${prefix}: tekrarlayan barkod '${normalizedBarcode}'.`,
35
+ };
36
+ }
37
+ seenBarcodes.add(normalizedBarcode);
38
+ const priceValidation = validatePrices(item.listPrice, item.salePrice);
39
+ if (!priceValidation.ok) {
40
+ return { ok: false, reason: `${prefix}: ${priceValidation.reason}` };
41
+ }
42
+ if (item.origin !== undefined && !ORIGIN_CODES.has(item.origin)) {
43
+ return {
44
+ ok: false,
45
+ reason: `${prefix}: gecersiz origin '${item.origin}' — ORIGIN_COUNTRIES kullanin.`,
46
+ };
47
+ }
48
+ if (item.shipmentAddressId !== undefined &&
49
+ addressIds.size > 0 &&
50
+ !addressIds.has(item.shipmentAddressId)) {
51
+ return {
52
+ ok: false,
53
+ reason: `${prefix}: shipmentAddressId ${item.shipmentAddressId} tedarikci adreslerinde yok.`,
54
+ };
55
+ }
56
+ if (item.returningAddressId !== undefined &&
57
+ addressIds.size > 0 &&
58
+ !addressIds.has(item.returningAddressId)) {
59
+ return {
60
+ ok: false,
61
+ reason: `${prefix}: returningAddressId ${item.returningAddressId} tedarikci adreslerinde yok.`,
62
+ };
63
+ }
64
+ const attributeError = validateRequiredCategoryAttributes(item, options?.categoryAttributes, prefix);
65
+ if (attributeError) {
66
+ return attributeError;
67
+ }
68
+ }
69
+ return { ok: true, data: items };
70
+ }
71
+ function validateRequiredCategoryAttributes(item, categoryAttributes, prefix) {
72
+ if (!categoryAttributes?.length) {
73
+ return undefined;
74
+ }
75
+ const required = categoryAttributes.filter((a) => a.required === true);
76
+ if (required.length === 0) {
77
+ return undefined;
78
+ }
79
+ const provided = new Set((item.attributes ?? []).map((a) => a.attributeId));
80
+ for (const attr of required) {
81
+ if (!provided.has(attr.attributeId)) {
82
+ return {
83
+ ok: false,
84
+ reason: `${prefix}: zorunlu kategori attribute ${attr.attributeId} (${attr.attributeName}) eksik.`,
85
+ };
86
+ }
87
+ }
88
+ return undefined;
89
+ }
@@ -0,0 +1,7 @@
1
+ export declare function productSellerBase(sellerId: string): string;
2
+ export declare function productV2Path(sellerId: string): string;
3
+ export declare function productsBase(sellerId: string): string;
4
+ export declare function productByBarcodePath(sellerId: string, barcode: string): string;
5
+ export declare function batchRequestPath(sellerId: string, batchRequestId: string): string;
6
+ export declare function updateAuditsPath(sellerId: string, contentId: number | string): string;
7
+ //# sourceMappingURL=paths.d.ts.map