@lonca/trendyol 0.12.0 → 0.13.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resources/brands.ts","../src/resources/categories.ts","../src/resources/claims.ts","../src/resources/export-center.ts","../src/resources/finance.ts","../src/resources/inventory.ts","../src/resources/invoices.ts","../src/resources/labels.ts","../src/resources/locations.ts","../src/resources/orders.ts","../src/resources/products.ts","../src/resources/questions.ts","../src/resources/suppliers.ts","../src/resources/test-orders.ts","../src/resources/videos.ts","../src/resources/webhooks.ts","../src/capabilities.ts","../src/auth.ts","../src/errors.ts","../src/transport.ts","../src/client.ts","../src/testing.ts"],"names":["TokenBucketRateLimiter","ValidationError","toIso","TimeoutError","ServerError","DEFAULT_PAGE_SIZE","normalizePackage","out","MAX_PAGE_SIZE","normalizeAttribute","normalizeAddress","AuthError","NotFoundError","RateLimitError","LoncaError","normalizeIssueEntries","n","createRequester"],"mappings":"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","file":"testing.cjs","sourcesContent":["import { TokenBucketRateLimiter, type CursorPage, type CursorPaginationParams } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { Brand } from '../types/brand.js';\n\n/**\n * Default page size when callers don't specify `limit`.\n *\n * NOTE: Trendyol's live API enforces a **minimum** page size of 1000 — any smaller\n * `limit` value is silently ignored server-side and you still receive ~1000 brands\n * per page. The `limit` parameter is kept on the SDK signature for forward\n * compatibility, but in practice you'll always receive 1000 per request.\n */\nconst DEFAULT_PAGE_SIZE = 1000;\n\ninterface TrendyolBrandListResponse {\n brands: Array<{ id: number; name: string }>;\n totalPages: number;\n totalElements: number;\n}\n\n/**\n * Trendyol brand-list endpoint group.\n *\n * Rate limit: 50 req/min (per Trendyol service limits).\n *\n * Trendyol uses page-based pagination internally; we expose the cursor-based\n * `CursorPage` shape from `@lonca/core` so callers can drive everything with\n * `paginate()` and stay consistent across Lonca SDKs.\n */\nexport class BrandsResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 50, intervalMs: 60_000 });\n }\n\n /**\n * List Trendyol brands, one page at a time.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const brand of paginate((p) => client.brands.list(p))) {\n * console.log(brand.id, brand.name);\n * }\n * ```\n */\n async list(params: CursorPaginationParams = {}): Promise<CursorPage<Brand>> {\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n const size = params.limit ?? DEFAULT_PAGE_SIZE;\n\n const data = await this.transport.request<TrendyolBrandListResponse>({\n method: 'GET',\n path: '/integration/product/brands',\n query: { page, size },\n rateLimiter: this.limiter,\n });\n\n const items: Brand[] = data.brands.map((b) => ({ id: String(b.id), name: b.name }));\n const nextCursor = page + 1 < data.totalPages ? String(page + 1) : undefined;\n\n return nextCursor !== undefined ? { items, nextCursor } : { items };\n }\n\n /**\n * Search brands by name. Useful when you need a brand's numeric ID for\n * `createProducts` and don't want to page through the full `list()`\n * (1000 brands per page).\n *\n * **Wire fact (verified STAGE 2026-05-25):** Trendyol's\n * doc claims this is a case-sensitive *exact* match, but live behaviour\n * is **substring + case-insensitive** — `search('Trendyol')` returns\n * 17 hits including `TRENDYOLMILLA`, `trendyol vavist`, `Trendyol Üyelik`.\n * Plan for ranking your results client-side if you need an exact match.\n * The endpoint returns an empty array when nothing matches (no 404).\n *\n * @param name The brand name to search for.\n */\n async search(name: string): Promise<Brand[]> {\n const data = await this.transport.request<Array<{ id: number; name: string }>>({\n method: 'GET',\n path: '/integration/product/brands/by-name',\n query: { name },\n rateLimiter: this.limiter,\n });\n return (data ?? []).map((b) => ({ id: String(b.id), name: b.name }));\n }\n}\n","import {\n TokenBucketRateLimiter,\n ValidationError,\n type CursorPage,\n type CursorPaginationParams,\n} from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n BarcodeCategoryLookup,\n Category,\n CategoryAttribute,\n CategoryAttributeValue,\n} from '../types/category.js';\n\ninterface TrendyolCategoryNode {\n id: number;\n name: string;\n parentId: number | null;\n subCategories?: TrendyolCategoryNode[];\n}\n\n/**\n * Trendyol's category-tree response shape.\n *\n * The OpenAPI spec advertises a root-level array, but live PROD/STAGE responses\n * may wrap it. We accept both shapes defensively.\n */\ntype TrendyolCategoriesResponse = TrendyolCategoryNode[] | { categories: TrendyolCategoryNode[] };\n\ninterface TrendyolCategoryAttributeValue {\n id: number;\n name: string;\n}\n\n/**\n * Wire shape of one item in the V2 `getCategoryAttributeValues` page.\n *\n * Important: the official OpenAPI spec calls this `attributeValueName`,\n * but live STAGE responses (verified 2026-05-25) return `attributeValue`.\n * We accept both defensively.\n */\ninterface TrendyolAttributeValueItem {\n attributeValueId?: number | string;\n attributeValue?: string;\n attributeValueName?: string;\n}\n\ninterface TrendyolAttributeValuesPage {\n content?: TrendyolAttributeValueItem[];\n page?: number;\n size?: number;\n totalPages?: number;\n totalElements?: number;\n}\n\ninterface TrendyolCategoryAttributeNode {\n attribute?: { id: number; name: string };\n categoryId?: number;\n required?: boolean;\n allowCustom?: boolean;\n varianter?: boolean;\n slicer?: boolean;\n /** V2-only: whether the attribute accepts multiple values at once. */\n allowMultipleAttributeValues?: boolean;\n /** Often omitted by Trendyol's live API; treat as optional. */\n attributeValues?: TrendyolCategoryAttributeValue[];\n}\n\nfunction normalizeCategory(node: TrendyolCategoryNode): Category {\n return {\n id: String(node.id),\n name: node.name,\n parentId: node.parentId === null || node.parentId === undefined ? null : String(node.parentId),\n subCategories: (node.subCategories ?? []).map(normalizeCategory),\n };\n}\n\nfunction normalizeAttribute(node: TrendyolCategoryAttributeNode): CategoryAttribute {\n const attr = node.attribute ?? { id: 0, name: '' };\n const rawValues = node.attributeValues ?? [];\n const out: CategoryAttribute = {\n id: String(attr.id),\n name: attr.name,\n required: !!node.required,\n allowCustom: !!node.allowCustom,\n varianter: !!node.varianter,\n slicer: !!node.slicer,\n values: rawValues.map((v) => ({ id: String(v.id), name: v.name })),\n };\n if (node.categoryId !== undefined) {\n out.categoryId = String(node.categoryId);\n }\n if (node.allowMultipleAttributeValues !== undefined) {\n out.allowMultipleAttributeValues = node.allowMultipleAttributeValues;\n }\n return out;\n}\n\n/** Trendyol caps `page` and `size` at 1000 for the values endpoint. */\nconst MAX_ATTR_VALUES_PAGE_SIZE = 1000;\nconst DEFAULT_ATTR_VALUES_PAGE_SIZE = 100;\n\nexport type ListCategoryAttributeValuesParams = CursorPaginationParams;\n\n/**\n * Trendyol category-tree and category-attribute endpoints.\n *\n * Rate limits (per Trendyol service limits):\n * - Category list: 50 req/min\n * - Category attributes: 50 req/min\n * - Category attribute values: 50 req/min (same service tier)\n *\n * All three counters live on the same Trendyol service, so we share one\n * limiter across the endpoints.\n */\nexport class CategoriesResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n /**\n * Trendyol seller (supplier) ID — required only for the AutoFT-scoped\n * `getByBarcodes` lookup. Other category endpoints don't need it.\n * Provided automatically when constructed via `createTrendyolClient`.\n */\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 50, intervalMs: 60_000 });\n }\n\n /**\n * Fetch the full Trendyol category tree.\n *\n * Trendyol returns the entire tree in one response — there is no pagination.\n * Cache the result aggressively in your application; the tree changes rarely.\n */\n async list(): Promise<Category[]> {\n const data = await this.transport.request<TrendyolCategoriesResponse>({\n method: 'GET',\n path: '/integration/product/product-categories',\n rateLimiter: this.limiter,\n });\n const list = Array.isArray(data) ? data : data.categories;\n return list.map(normalizeCategory);\n }\n\n /**\n * Fetch the attributes (required and optional) for a single category.\n *\n * Call this before `createProduct V2` so you know which attributes are\n * mandatory — the API rejects products that omit any `required` attribute.\n *\n * @param categoryId Trendyol numeric category ID; accepts `string` or `number`.\n */\n async getAttributes(categoryId: string | number): Promise<CategoryAttribute[]> {\n const id = encodeURIComponent(String(categoryId));\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/product/categories/${id}/attributes`,\n rateLimiter: this.limiter,\n });\n\n // Defensive: live API wraps the array as either a root array, `categoryAttributes`,\n // or `attributes`. Verified via STAGE + PROD smoke tests on 2026-05-25.\n const list = extractAttributeList(data);\n if (!list) {\n console.error(\n '[@lonca/trendyol] getCategoryAttributes: unexpected response shape:',\n JSON.stringify(data).slice(0, 800),\n );\n return [];\n }\n return list.map(normalizeAttribute);\n }\n\n /**\n * Fetch the allowed values for a single category attribute (paginated).\n *\n * `getCategoryAttributes` returns attribute metadata + flags but typically\n * omits the value catalog. Use this method to fetch the catalog for an\n * attribute when `allowCustom` is `false` and you need to map your data\n * onto Trendyol's accepted values.\n *\n * @param categoryId Trendyol numeric category ID; accepts `string` or `number`.\n * @param attributeId Attribute ID returned by `getAttributes`.\n * @param params Cursor pagination (max page size 1000; default 100).\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const value of paginate((p) =>\n * client.categories.getAttributeValues(catId, attrId, p),\n * )) {\n * console.log(value.id, value.name);\n * }\n * ```\n */\n async getAttributeValues(\n categoryId: string | number,\n attributeId: string | number,\n params: ListCategoryAttributeValuesParams = {},\n ): Promise<CursorPage<CategoryAttributeValue>> {\n const catId = encodeURIComponent(String(categoryId));\n const attrId = encodeURIComponent(String(attributeId));\n const size = Math.min(params.limit ?? DEFAULT_ATTR_VALUES_PAGE_SIZE, MAX_ATTR_VALUES_PAGE_SIZE);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n const data = await this.transport.request<TrendyolAttributeValuesPage>({\n method: 'GET',\n path: `/integration/product/categories/${catId}/attributes/${attrId}/values`,\n query: { page, size },\n rateLimiter: this.limiter,\n });\n\n const items: CategoryAttributeValue[] = (data.content ?? []).map((item) => ({\n id: item.attributeValueId !== undefined ? String(item.attributeValueId) : '',\n name: item.attributeValue ?? item.attributeValueName ?? '',\n }));\n const result: CursorPage<CategoryAttributeValue> = { items };\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n /**\n * Look up category info for a list of barcodes (Trendyol Export Center\n * / AutoFT endpoint).\n *\n * **Requires Export Center enrollment.** Sellers who have not joined\n * Trendyol's \"İhracat Merkezi\" program will get an auth error on this\n * endpoint even though their regular Marketplace credentials are valid.\n *\n * @param barcodes 1–N barcodes to look up.\n * @throws {ValidationError} when `barcodes` is empty.\n */\n async getByBarcodes(barcodes: string[]): Promise<BarcodeCategoryLookup> {\n if (!Array.isArray(barcodes) || barcodes.length === 0) {\n throw new ValidationError({ message: 'getByBarcodes: barcodes must not be empty' });\n }\n\n interface WireResponse {\n barcodeCategories?: Record<string, { id?: number | string; displayName?: string }>;\n notFound?: string[];\n }\n const data = await this.transport.request<WireResponse>({\n method: 'POST',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/lookup/product-categories/by-barcodes`,\n body: { barcodes },\n rateLimiter: this.limiter,\n });\n\n const matches = Object.entries(data.barcodeCategories ?? {}).map(([barcode, cat]) => ({\n barcode,\n category: {\n id: cat.id !== undefined ? String(cat.id) : '',\n name: cat.displayName ?? '',\n },\n }));\n return { matches, notFound: data.notFound ?? [] };\n }\n}\n\nfunction extractAttributeList(data: unknown): TrendyolCategoryAttributeNode[] | null {\n if (Array.isArray(data)) return data as TrendyolCategoryAttributeNode[];\n if (data && typeof data === 'object') {\n const obj = data as Record<string, unknown>;\n if (Array.isArray(obj.categoryAttributes)) {\n return obj.categoryAttributes as TrendyolCategoryAttributeNode[];\n }\n if (Array.isArray(obj.attributes)) {\n return obj.attributes as TrendyolCategoryAttributeNode[];\n }\n }\n return null;\n}\n","import { TokenBucketRateLimiter, ValidationError, type CursorPage } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n ApproveClaimLineItemsInput,\n Claim,\n ClaimItemAudit,\n ClaimIssueReason,\n CreateClaimInput,\n CreateClaimIssueInput,\n ListClaimsParams,\n} from '../types/claim.js';\n\nfunction toIso(epochMs: number | undefined): string | undefined {\n if (typeof epochMs !== 'number' || !Number.isFinite(epochMs) || epochMs === 0) {\n return undefined;\n }\n return new Date(epochMs).toISOString();\n}\n\ninterface WireClaim {\n id?: string;\n claimId?: string;\n orderNumber?: string;\n orderDate?: number;\n claimDate?: number;\n customerFirstName?: string;\n customerLastName?: string;\n [key: string]: unknown;\n}\n\nfunction normalizeClaim(node: WireClaim): Claim {\n const out: Claim = {\n id: node.id ?? node.claimId ?? '',\n orderNumber: node.orderNumber ?? '',\n raw: node as Record<string, unknown>,\n };\n const orderDate = toIso(node.orderDate);\n if (orderDate) out.orderDate = orderDate;\n const claimDate = toIso(node.claimDate);\n if (claimDate) out.claimDate = claimDate;\n if (node.customerFirstName !== undefined) out.customerFirstName = node.customerFirstName;\n if (node.customerLastName !== undefined) out.customerLastName = node.customerLastName;\n return out;\n}\n\n/**\n * Trendyol claims (return / iade) endpoints.\n *\n * Rate limit (per Trendyol service limits): shares the order service bucket;\n * the SDK provisions its own 1000 req/min limiter that the caller can override.\n */\nexport class ClaimsResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n }\n\n /**\n * Create a return claim against an order. Use this to file a return on\n * behalf of a customer (e.g. when they called your CS line). For\n * customer-initiated returns coming from trendyol.com, you receive them\n * via `claims.list()` — no need to call `create`.\n *\n * Returns whatever Trendyol returns (typically the new claim's identifier).\n *\n * @throws {ValidationError} when `claimItems` is empty.\n */\n async create(input: CreateClaimInput): Promise<unknown> {\n if (!Array.isArray(input?.claimItems) || input.claimItems.length === 0) {\n throw new ValidationError({ message: 'claims.create: claimItems must not be empty' });\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/order/sellers/${this.transport.sellerId}/claims/create`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * File a seller-side rejection (\"ret talebi\") against a customer claim.\n *\n * **Wire format: `multipart/form-data`** — the SDK builds the FormData\n * internally from the typed input. `claimItemIdList` is joined with\n * commas (Trendyol expects a single comma-separated string field).\n * Attach supporting docs (PDF / JPEG) via `files: [Blob, ...]`.\n */\n async createIssue(claimId: string, input: CreateClaimIssueInput): Promise<unknown> {\n if (!Array.isArray(input?.claimItemIdList) || input.claimItemIdList.length === 0) {\n throw new ValidationError({\n message: 'claims.createIssue: claimItemIdList must not be empty',\n });\n }\n if (typeof input.description !== 'string' || input.description.length === 0) {\n throw new ValidationError({ message: 'claims.createIssue: description is required' });\n }\n if (input.description.length > 500) {\n throw new ValidationError({\n message: `claims.createIssue: description must be ≤500 chars (got ${input.description.length})`,\n });\n }\n\n const form = new FormData();\n form.append('claimIssueReasonId', String(input.claimIssueReasonId));\n form.append('claimItemIdList', input.claimItemIdList.join(','));\n form.append('description', input.description);\n if (input.files) {\n for (const file of input.files) {\n form.append('files', file);\n }\n }\n\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/order/sellers/${this.transport.sellerId}/claims/${encodeURIComponent(claimId)}/issue`,\n body: form,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Approve specific claim line items. After approval, Trendyol moves\n * those line items into the post-approval refund / return-shipping flow.\n *\n * @throws {ValidationError} when `claimLineItemIdList` is empty.\n */\n async approveLineItems(claimId: string, input: ApproveClaimLineItemsInput): Promise<unknown> {\n if (!Array.isArray(input?.claimLineItemIdList) || input.claimLineItemIdList.length === 0) {\n throw new ValidationError({\n message: 'claims.approveLineItems: claimLineItemIdList must not be empty',\n });\n }\n return this.transport.request<unknown>({\n method: 'PUT',\n path: `/integration/order/sellers/${this.transport.sellerId}/claims/${encodeURIComponent(claimId)}/items/approve`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * List claims (page-based; SDK exposes opaque cursor convention).\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const c of paginate((p) =>\n * client.claims.list({ ...p, claimItemStatus: 'WaitingInAction' }),\n * )) {\n * console.log(c.id, c.orderNumber, c.claimDate);\n * }\n * ```\n */\n async list(params: ListClaimsParams = {}): Promise<CursorPage<Claim>> {\n const size = Math.min(params.limit ?? 50, 200);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n const query: Record<string, string | number | undefined> = { page, size };\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n if (params.claimItemStatus) query.claimItemStatus = params.claimItemStatus;\n\n interface WireResponse {\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n content?: WireClaim[];\n }\n const data = await this.transport.request<WireResponse>({\n method: 'GET',\n path: `/integration/order/sellers/${this.transport.sellerId}/claims`,\n query,\n rateLimiter: this.limiter,\n });\n\n const items = (data.content ?? []).map(normalizeClaim);\n const result: CursorPage<Claim> = { items };\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n /**\n * Fetch the catalog of rejection-reason IDs the seller can use on\n * `claims.createIssue()`. Cache the result — it changes rarely.\n *\n * Note: this endpoint is **not seller-scoped** (no `sellerId` in path).\n */\n async getIssueReasons(): Promise<ClaimIssueReason[]> {\n const data = await this.transport.request<Array<{ id?: number; name?: string }>>({\n method: 'GET',\n path: `/integration/order/claim-issue-reasons`,\n rateLimiter: this.limiter,\n });\n return (data ?? []).map((r) => ({\n id: typeof r.id === 'number' ? r.id : 0,\n name: r.name ?? '',\n }));\n }\n\n /**\n * Fetch the audit log for a single claim item (state transitions,\n * actor, timestamp). Trendyol's response shape varies — the SDK\n * surfaces each row as `{ raw }` and leaves field extraction to the\n * caller until we observe a stable shape on the wire.\n */\n async getItemAudits(claimItemId: string): Promise<ClaimItemAudit[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/order/sellers/${this.transport.sellerId}/claims/items/${encodeURIComponent(claimItemId)}/audit`,\n rateLimiter: this.limiter,\n });\n const rows = Array.isArray(data)\n ? data\n : Array.isArray((data as { content?: unknown[] })?.content)\n ? (data as { content: unknown[] }).content\n : [];\n return rows.map((row) => ({ raw: row as Record<string, unknown> }));\n }\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n CareInstruction,\n ExportBatchAcceptedResponse,\n ExportBatchStatus,\n ExportCategoryAttribute,\n ExportPackage,\n ExportPackageItem,\n ExportPriceUpdateInput,\n ExportProduct,\n ExportProductInput,\n ExportStockUpdateInput,\n GetExportPackageItemsParams,\n ListExportPackagesV2Params,\n ListExportPackagesV3Params,\n ListExportProductsParams,\n ProductComposition,\n ProductOrigin,\n} from '../types/export-center.js';\n\n/** Trendyol caps every Export Center batch at 5000 items per call. */\nconst MAX_BATCH_ITEMS = 5000;\n\n/**\n * Trendyol Export Center (İhracat Merkezi / AutoFT) — Türkiye-based\n * sellers exporting to Trendyol's international platforms.\n *\n * **Service base URL**: same `apigw.trendyol.com` as the main marketplace,\n * with a distinct path prefix `/integration/ecgw/v{N}/{sellerId}/…`.\n *\n * The Export Center requires sellers to first complete Trendyol's \"İhracat\n * Merkezi\" application; the same `apiKey`/`apiSecret` then authorize\n * these paths. Calls from non-enrolled sellers return `401`.\n *\n * 12 endpoints across four surfaces — products (list/create/price/stock),\n * batch status, packages (V2/V3 list + item detail), and lookup\n * (categories, care instructions, compositions, origins).\n *\n * NOTE: per-endpoint body / response shapes are documented in HTML tables\n * on developers.trendyol.com — the SDK accepts `Record<string, unknown>`\n * bodies and surfaces row-level `raw` accessors so undocumented fields\n * stay reachable.\n */\nexport class ExportCenterResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n }\n\n // ─── Products ────────────────────────────────────────────────────────────\n\n /**\n * List Export Center-approved products. Uses Trendyol's `pageKey`\n * pagination — the first call leaves `pageKey` empty; subsequent\n * calls pass the `x-paging-key` value from the previous response.\n */\n async listProducts(params: ListExportProductsParams = {}): Promise<ExportProduct[]> {\n const query: Record<string, string | number | undefined> = {};\n if (params.barcodes && params.barcodes.length > 0) query.barcodes = params.barcodes.join(',');\n if (params.pageKey) query.pageKey = params.pageKey;\n if (params.size !== undefined) query.size = params.size;\n\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v2/${this.transport.sellerId}/products`,\n query: Object.keys(query).length ? query : undefined,\n rateLimiter: this.limiter,\n });\n const rows = pickArray(data);\n return rows.map((r) => ({ raw: (r ?? {}) as Record<string, unknown> }));\n }\n\n /**\n * Create Export Center products. Maximum 5000 per call. Returns a\n * `batchId` you can poll via `getBatchStatus(batchId)`.\n *\n * @throws {ValidationError} when `products` is empty / oversized.\n */\n async createProducts(products: ExportProductInput[]): Promise<ExportBatchAcceptedResponse> {\n this.assertBatch(products, 'createProducts');\n const data = await this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/ecgw/v2/${this.transport.sellerId}/products`,\n body: { products },\n rateLimiter: this.limiter,\n });\n return normalizeBatchResponse(data);\n }\n\n /**\n * Update Export Center prices. **Trendyol allows one price update per\n * barcode per day.** Returns a `batchId`.\n *\n * @throws {ValidationError} when `priceInfos` is empty / oversized.\n */\n async updatePrices(priceInfos: ExportPriceUpdateInput[]): Promise<ExportBatchAcceptedResponse> {\n this.assertBatch(priceInfos, 'updatePrices');\n const data = await this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/prices`,\n body: { priceInfos },\n rateLimiter: this.limiter,\n });\n return normalizeBatchResponse(data);\n }\n\n /**\n * Update Export Center stocks. Returns a `batchId`. Sellers using\n * Trendyol's shared inventory cannot use this endpoint (per portal docs).\n *\n * @throws {ValidationError} when `items` is empty / oversized.\n */\n async updateStocks(items: ExportStockUpdateInput[]): Promise<ExportBatchAcceptedResponse> {\n this.assertBatch(items, 'updateStocks');\n const data = await this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/stocks`,\n body: { items },\n rateLimiter: this.limiter,\n });\n return normalizeBatchResponse(data);\n }\n\n // ─── Batch status ────────────────────────────────────────────────────────\n\n /**\n * Look up the status of a previously-submitted batch. Trendyol retains\n * batch records for **24 hours** only — older `batchId`s return `404`.\n */\n async getBatchStatus(batchId: string): Promise<ExportBatchStatus> {\n if (!batchId) {\n throw new ValidationError({ message: 'exportCenter.getBatchStatus: batchId is required' });\n }\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/check-status`,\n query: { batchId },\n rateLimiter: this.limiter,\n });\n return normalizeBatchStatus(data);\n }\n\n // ─── Packages ────────────────────────────────────────────────────────────\n\n /** List daily Export Center packages (V2 — query-based filters). */\n async listPackagesV2(params: ListExportPackagesV2Params = {}): Promise<ExportPackage[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v2/${this.transport.sellerId}/packages`,\n query: {\n trackingNumber: params.trackingNumber,\n status: params.status,\n creationStartDate: params.creationStartDate,\n creationEndDate: params.creationEndDate,\n size: params.size,\n boutiqueId: params.boutiqueId,\n },\n rateLimiter: this.limiter,\n });\n return pickArray(data).map(normalizePackage);\n }\n\n /** List Export Center packages (V3 — consolidated, page-based). */\n async listPackagesV3(params: ListExportPackagesV3Params = {}): Promise<ExportPackage[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v3/${this.transport.sellerId}/packages`,\n query: {\n status: params.status,\n page: params.offset !== undefined ? params.offset : undefined,\n size: params.limit,\n creationStartDate: params.creationStartDate,\n creationEndDate: params.creationEndDate,\n },\n rateLimiter: this.limiter,\n });\n return pickArray(data).map(normalizePackage);\n }\n\n /** Get the line items inside an Export Center package. */\n async getPackageItems(params: GetExportPackageItemsParams): Promise<ExportPackageItem[]> {\n if (!params || !params.packageId) {\n throw new ValidationError({\n message: 'exportCenter.getPackageItems: packageId is required',\n });\n }\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v2/${this.transport.sellerId}/packages/items`,\n query: {\n packageId: params.packageId,\n status: params.status,\n page: params.offset,\n size: params.limit,\n },\n rateLimiter: this.limiter,\n });\n return pickArray(data).map((r) => ({ raw: (r ?? {}) as Record<string, unknown> }));\n }\n\n // ─── Lookup ──────────────────────────────────────────────────────────────\n\n /** Get the required attributes for an Export Center category. */\n async getCategoryAttributes(categoryId: number | string): Promise<ExportCategoryAttribute[]> {\n if (categoryId === undefined || categoryId === null || categoryId === '') {\n throw new ValidationError({\n message: 'exportCenter.getCategoryAttributes: categoryId is required',\n });\n }\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/lookup/product-categories/${encodeURIComponent(String(categoryId))}/attributes`,\n rateLimiter: this.limiter,\n });\n return pickArray(data).map((r) => {\n const row = (r ?? {}) as Record<string, unknown>;\n const out: ExportCategoryAttribute = { raw: row };\n if (typeof row.attributeId === 'number' || typeof row.attributeId === 'string') {\n out.attributeId = row.attributeId;\n }\n if (typeof row.attributeName === 'string') out.attributeName = row.attributeName;\n if (typeof row.required === 'boolean') out.required = row.required;\n if (Array.isArray(row.values)) out.values = row.values;\n return out;\n });\n }\n\n /** Get the care-instruction lookup values used by `createProducts`. */\n async getCareInstructions(): Promise<CareInstruction[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/lookup/care-instructions`,\n rateLimiter: this.limiter,\n });\n return pickArray(data).map(normalizeNamedRef);\n }\n\n /** Get the material-composition lookup values used by `createProducts`. */\n async getCompositions(): Promise<ProductComposition[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/lookup/compositions`,\n rateLimiter: this.limiter,\n });\n return pickArray(data).map(normalizeNamedRef);\n }\n\n /** Get the country-of-origin lookup values used by `createProducts`. */\n async getOrigins(): Promise<ProductOrigin[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/lookup/origins`,\n rateLimiter: this.limiter,\n });\n return pickArray(data).map((r) => {\n const row = (r ?? {}) as Record<string, unknown>;\n const out: ProductOrigin = { raw: row };\n if (typeof row.id === 'number' || typeof row.id === 'string') out.id = row.id;\n if (typeof row.name === 'string') out.name = row.name;\n if (typeof row.countryCode === 'string') out.countryCode = row.countryCode;\n return out;\n });\n }\n\n // ─── Helpers ─────────────────────────────────────────────────────────────\n\n private assertBatch(items: unknown[], methodLabel: string): void {\n if (!Array.isArray(items) || items.length === 0) {\n throw new ValidationError({\n message: `exportCenter.${methodLabel}: items must not be empty`,\n });\n }\n if (items.length > MAX_BATCH_ITEMS) {\n throw new ValidationError({\n message: `exportCenter.${methodLabel}: max ${MAX_BATCH_ITEMS} items per call (got ${items.length})`,\n });\n }\n }\n}\n\n// ─── Normalizers ──────────────────────────────────────────────────────────\n\nfunction pickArray(data: unknown): unknown[] {\n if (Array.isArray(data)) return data;\n if (data && typeof data === 'object') {\n const obj = data as Record<string, unknown>;\n if (Array.isArray(obj.content)) return obj.content;\n if (Array.isArray(obj.items)) return obj.items;\n if (Array.isArray(obj.data)) return obj.data;\n if (Array.isArray(obj.products)) return obj.products;\n if (Array.isArray(obj.packages)) return obj.packages;\n }\n return [];\n}\n\nfunction normalizeBatchResponse(data: unknown): ExportBatchAcceptedResponse {\n const obj = (data && typeof data === 'object' ? data : {}) as Record<string, unknown>;\n return {\n batchId: String(obj.batchId ?? obj.batchRequestId ?? obj.id ?? ''),\n raw: obj,\n };\n}\n\nfunction normalizeBatchStatus(data: unknown): ExportBatchStatus {\n const obj = (data && typeof data === 'object' ? data : {}) as Record<string, unknown>;\n const out: ExportBatchStatus = { raw: obj };\n if (typeof obj.batchId === 'string') out.batchId = obj.batchId;\n if (typeof obj.status === 'string') out.status = obj.status;\n if (typeof obj.itemCount === 'number') out.itemCount = obj.itemCount;\n if (typeof obj.failedItemCount === 'number') out.failedItemCount = obj.failedItemCount;\n if (Array.isArray(obj.items)) out.items = obj.items as Array<Record<string, unknown>>;\n return out;\n}\n\nfunction normalizePackage(row: unknown): ExportPackage {\n const r = (row ?? {}) as Record<string, unknown>;\n const out: ExportPackage = { raw: r };\n if (typeof r.packageNumber === 'string') out.packageNumber = r.packageNumber;\n if (typeof r.status === 'string') out.status = r.status as ExportPackage['status'];\n return out;\n}\n\nfunction normalizeNamedRef<\n T extends { id?: number | string; name?: string; raw: Record<string, unknown> },\n>(row: unknown): T {\n const r = (row ?? {}) as Record<string, unknown>;\n const out = { raw: r } as T;\n if (typeof r.id === 'number' || typeof r.id === 'string') out.id = r.id;\n if (typeof r.name === 'string') out.name = r.name;\n return out;\n}\n","import { TokenBucketRateLimiter, type CursorPage } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { FinancialTransaction, ListFinanceParams } from '../types/misc.js';\n\ninterface WirePage {\n content?: WireRow[];\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n}\n\ninterface WireRow {\n id?: string | number;\n transactionDate?: number;\n barcode?: string | null;\n transactionType?: string;\n receiptId?: number | null;\n description?: string | null;\n debt?: number;\n credit?: number;\n paymentPeriod?: number | null;\n commissionRate?: number | null;\n commissionAmount?: number | null;\n commissionInvoiceSerialNumber?: string | null;\n sellerRevenue?: number | null;\n orderNumber?: string | null;\n paymentOrderId?: number | null;\n paymentDate?: number | null;\n sellerId?: number;\n storeId?: number | null;\n storeName?: string | null;\n storeAddress?: string | null;\n country?: string | null;\n [key: string]: unknown;\n}\n\nfunction toIso(epochMs: number | null | undefined): string | undefined {\n if (typeof epochMs !== 'number' || !Number.isFinite(epochMs) || epochMs === 0) {\n return undefined;\n }\n return new Date(epochMs).toISOString();\n}\n\nfunction normalizeRow(row: WireRow): FinancialTransaction {\n const out: FinancialTransaction = {\n id: row.id !== undefined ? String(row.id) : '',\n raw: row as Record<string, unknown>,\n };\n const tx = toIso(row.transactionDate);\n if (tx) out.transactionDate = tx;\n if (row.barcode !== undefined) out.barcode = row.barcode;\n if (row.transactionType !== undefined) out.transactionType = row.transactionType;\n if (row.receiptId !== undefined) out.receiptId = row.receiptId;\n if (row.description !== undefined) out.description = row.description;\n if (typeof row.debt === 'number') out.debt = row.debt;\n if (typeof row.credit === 'number') out.credit = row.credit;\n if (row.paymentPeriod !== undefined) out.paymentPeriod = row.paymentPeriod;\n if (row.commissionRate !== undefined) out.commissionRate = row.commissionRate;\n if (row.commissionAmount !== undefined) out.commissionAmount = row.commissionAmount;\n if (row.commissionInvoiceSerialNumber !== undefined) {\n out.commissionInvoiceSerialNumber = row.commissionInvoiceSerialNumber;\n }\n if (row.sellerRevenue !== undefined) out.sellerRevenue = row.sellerRevenue;\n if (row.orderNumber !== undefined) out.orderNumber = row.orderNumber;\n if (row.paymentOrderId !== undefined) out.paymentOrderId = row.paymentOrderId;\n const pay = toIso(row.paymentDate);\n if (pay) out.paymentDate = pay;\n if (typeof row.sellerId === 'number') out.sellerId = row.sellerId;\n if (row.storeId !== undefined) out.storeId = row.storeId;\n if (row.storeName !== undefined) out.storeName = row.storeName;\n if (row.storeAddress !== undefined) out.storeAddress = row.storeAddress;\n if (row.country !== undefined) out.country = row.country;\n return out;\n}\n\n/**\n * Trendyol finance endpoints — current-account-statement settlements and\n * \"other financials\" (cargo invoices, labor cost adjustments, etc.).\n *\n * Both endpoints return the same `FinancialTransaction` shape on the wire,\n * so the SDK exposes one typed surface for them.\n */\nexport class FinanceResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 100, intervalMs: 60_000 });\n }\n\n async getSettlements(params: ListFinanceParams = {}): Promise<CursorPage<FinancialTransaction>> {\n return this.queryPage(\n `/integration/finance/che/sellers/${this.transport.sellerId}/settlements`,\n params,\n );\n }\n\n async getOtherFinancials(\n params: ListFinanceParams = {},\n ): Promise<CursorPage<FinancialTransaction>> {\n return this.queryPage(\n `/integration/finance/che/sellers/${this.transport.sellerId}/otherfinancials`,\n params,\n );\n }\n\n private async queryPage(\n path: string,\n params: ListFinanceParams,\n ): Promise<CursorPage<FinancialTransaction>> {\n const size = Math.min(params.limit ?? 50, 200);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n const query: Record<string, string | number | undefined> = { page, size };\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n if (params.transactionType) query.transactionType = params.transactionType;\n\n const data = await this.transport.request<WirePage>({\n method: 'GET',\n path,\n query,\n rateLimiter: this.limiter,\n });\n\n const items = (data.content ?? []).map(normalizeRow);\n const result: CursorPage<FinancialTransaction> = { items };\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n}\n","import { ServerError, TimeoutError, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { PriceInventoryUpdate, UpdatePriceInventoryResponse } from '../types/inventory.js';\nimport type { BatchRequestResult } from '../types/product.js';\n\n/** Trendyol's hard limit for items per `updatePriceAndInventory` call. */\nconst MAX_ITEMS_PER_REQUEST = 1000;\n\ninterface TrendyolBatchRequestResponse {\n batchRequestId?: string;\n}\n\n/** Function that resolves a batch request's current status (i.e. `products.getBatchStatus`). */\ntype BatchStatusPoller = (batchRequestId: string) => Promise<BatchRequestResult>;\n\n/** Options controlling how {@link InventoryResource.updateAndWait} / {@link pollBatchStatus} poll. */\nexport interface BatchPollOptions {\n /** Delay between status polls, in ms. Default: `2000`. */\n pollIntervalMs?: number;\n /** Total time to wait for a batch to settle before throwing `TimeoutError`, in ms. Default: `120000`. */\n timeoutMs?: number;\n /** Abort the wait early. The rejection carries the signal's reason. */\n signal?: AbortSignal;\n}\n\n/**\n * Poll a Trendyol batch request until it reaches a terminal state\n * (`COMPLETED` / `FAILED`) or the timeout elapses.\n *\n * Standalone so callers can poll an id obtained elsewhere (e.g. a persisted\n * `batchRequestId` from a previous process) without going through\n * {@link InventoryResource.updateAndWait}.\n *\n * @throws {TimeoutError} when the batch does not settle within `timeoutMs`;\n * `error.data` carries `{ batchRequestId, lastStatus, lastResult }`.\n */\nexport async function pollBatchStatus(\n getStatus: BatchStatusPoller,\n batchRequestId: string,\n opts: BatchPollOptions = {},\n): Promise<BatchRequestResult> {\n const pollIntervalMs = opts.pollIntervalMs ?? 2000;\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const deadline = Date.now() + timeoutMs;\n\n for (;;) {\n opts.signal?.throwIfAborted();\n const result = await getStatus(batchRequestId);\n if (result.status === 'COMPLETED' || result.status === 'FAILED') {\n return result;\n }\n if (Date.now() >= deadline) {\n throw new TimeoutError({\n message: `Trendyol batch ${batchRequestId} did not settle within ${timeoutMs}ms (last status: ${result.status})`,\n data: { batchRequestId, lastStatus: result.status, lastResult: result },\n });\n }\n await delay(pollIntervalMs, opts.signal);\n }\n}\n\n/**\n * Trendyol stock & price update endpoint (a.k.a. `updatePriceAndInventory`).\n *\n * Rate limit: **none** — Trendyol explicitly lists this endpoint as\n * `NO LIMIT` in its service limits table. The `15-minute duplicate\n * suppression` rule still applies on Trendyol's side, but that's a\n * server-side concern.\n *\n * The endpoint is asynchronous. {@link InventoryResource.update} returns the\n * `batchRequestId`; poll it yourself with `products.getBatchStatus`, or let\n * {@link InventoryResource.updateAndWait} chunk, submit, and poll for you.\n */\nexport class InventoryResource {\n /**\n * @param transport Trendyol transport.\n * @param getBatchStatus Batch-status poller (wired by `createTrendyolClient`\n * to `products.getBatchStatus`). Required only for `updateAndWait`.\n */\n constructor(\n private readonly transport: TrendyolTransport,\n private readonly getBatchStatus?: BatchStatusPoller,\n ) {}\n\n /**\n * Update price and/or stock for one or more SKUs (by barcode).\n *\n * @example\n * ```ts\n * const { batchRequestId } = await client.inventory.update([\n * { barcode: 'ABC123', quantity: 42, salePrice: 199.9, listPrice: 249.9 },\n * { barcode: 'XYZ789', quantity: 0 },\n * ]);\n * const status = await client.products.getBatchStatus(batchRequestId);\n * ```\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n * @throws {ServerError} when Trendyol accepts the request but returns no\n * `batchRequestId` (an unpollable response — surfaced loudly instead of\n * handing back an empty id).\n */\n async update(items: PriceInventoryUpdate[]): Promise<UpdatePriceInventoryResponse> {\n if (items.length === 0) {\n throw new ValidationError({ message: 'updatePriceAndInventory: items must not be empty' });\n }\n if (items.length > MAX_ITEMS_PER_REQUEST) {\n throw new ValidationError({\n message: `updatePriceAndInventory: max ${MAX_ITEMS_PER_REQUEST} items per request, got ${items.length}`,\n });\n }\n\n const data = await this.transport.request<TrendyolBatchRequestResponse>({\n method: 'POST',\n path: `/integration/inventory/sellers/${this.transport.sellerId}/products/price-and-inventory`,\n body: { items },\n });\n\n if (!data.batchRequestId) {\n throw new ServerError({\n message: 'Trendyol updatePriceAndInventory returned no batchRequestId',\n data: { response: data },\n });\n }\n\n return { batchRequestId: data.batchRequestId };\n }\n\n /**\n * Submit price/stock updates and wait for them to settle.\n *\n * Splits `items` into chunks of ≤1000, submits each via {@link update}, and\n * polls each `batchRequestId` to a terminal state. Returns one\n * `BatchRequestResult` per chunk (read `failedItemCount` / `items[]` for\n * per-barcode outcomes). Compose `@lonca/core`'s `retry` around this for\n * transient-error resilience.\n *\n * @throws {ValidationError} when `items` is empty.\n * @throws {TimeoutError} when any chunk does not settle within `timeoutMs`;\n * `error.data.batchRequestId` identifies the stuck chunk.\n */\n async updateAndWait(\n items: PriceInventoryUpdate[],\n opts: BatchPollOptions = {},\n ): Promise<BatchRequestResult[]> {\n if (items.length === 0) {\n throw new ValidationError({ message: 'updateAndWait: items must not be empty' });\n }\n const getStatus = this.getBatchStatus;\n if (!getStatus) {\n throw new Error(\n 'updateAndWait requires a batch-status poller; obtain the client via createTrendyolClient()',\n );\n }\n\n const results: BatchRequestResult[] = [];\n for (const batch of chunk(items, MAX_ITEMS_PER_REQUEST)) {\n const { batchRequestId } = await this.update(batch);\n results.push(await pollBatchStatus(getStatus, batchRequestId, opts));\n }\n return results;\n }\n}\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n if (items.length <= size) return [items];\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n chunks.push(items.slice(i, i + size));\n }\n return chunks;\n}\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error('Aborted'));\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal?.reason ?? new Error('Aborted'));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n DeleteInvoiceLinkInput,\n SendInvoiceLinkInput,\n UploadInvoiceFileInput,\n} from '../types/misc.js';\n\n/**\n * Trendyol invoice endpoints — upload PDF/JPEG/PNG invoice files or\n * register/delete invoice links. Pair these with `orders.updatePackageStatus(_, { status: 'Invoiced' })`\n * after invoice issuance.\n */\nexport class InvoicesResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 500, intervalMs: 60_000 });\n }\n\n /**\n * Upload an invoice file for a shipment package. **Multipart**: the\n * SDK builds the FormData internally from the typed input.\n *\n * Max 10 MB. Accepted formats: PDF, JPEG, PNG.\n */\n async uploadFile(input: UploadInvoiceFileInput): Promise<unknown> {\n if (!input?.file) {\n throw new ValidationError({ message: 'invoices.uploadFile: file is required' });\n }\n if (!input.shipmentPackageId) {\n throw new ValidationError({ message: 'invoices.uploadFile: shipmentPackageId is required' });\n }\n const form = new FormData();\n form.append('shipmentPackageId', String(input.shipmentPackageId));\n form.append('file', input.file);\n if (input.invoiceDateTime !== undefined) {\n form.append('invoiceDateTime', String(input.invoiceDateTime));\n }\n if (input.invoiceNumber !== undefined) {\n form.append('invoiceNumber', input.invoiceNumber);\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/sellers/${this.transport.sellerId}/seller-invoice-file`,\n body: form,\n rateLimiter: this.limiter,\n });\n }\n\n /** Register an invoice URL with Trendyol (alternative to uploading the file). */\n async sendLink(input: SendInvoiceLinkInput): Promise<unknown> {\n if (!input?.invoiceLink) {\n throw new ValidationError({ message: 'invoices.sendLink: invoiceLink is required' });\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/sellers/${this.transport.sellerId}/seller-invoice-links`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /** Remove a previously-registered invoice link. */\n async deleteLink(input: DeleteInvoiceLinkInput): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/sellers/${this.transport.sellerId}/seller-invoice-links/delete`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { CommonLabel, CommonLabelEntry, CreateCommonLabelInput } from '../types/misc.js';\n\n/**\n * Common-label (ortak etiket) endpoints — request and retrieve a\n * combined ZPL shipping label for a cargo tracking number.\n */\nexport class LabelsResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 100, intervalMs: 60_000 });\n }\n\n /**\n * Request a common ZPL label for a cargo tracking number. After this\n * returns, call `getCommon()` with the same `cargoTrackingNumber` to\n * retrieve the generated label.\n *\n * @throws {ValidationError} when `format` is missing.\n */\n async createCommon(\n cargoTrackingNumber: string | number,\n input: CreateCommonLabelInput,\n ): Promise<unknown> {\n if (!input?.format) {\n throw new ValidationError({ message: 'labels.createCommon: format is required' });\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/sellers/${this.transport.sellerId}/common-label/${encodeURIComponent(String(cargoTrackingNumber))}`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Retrieve the previously-created common label. Trendyol returns\n * `{ data: [{ label, format }] }`; the SDK surfaces the array as\n * `labels[]` for ergonomic access.\n *\n * Typically `labels.length === 1` per tracking number, but kept as an\n * array to match the wire shape.\n */\n async getCommon(cargoTrackingNumber: string | number): Promise<CommonLabel> {\n interface WireResponse {\n data?: Array<{ label?: string; format?: string }>;\n [key: string]: unknown;\n }\n const raw = await this.transport.request<WireResponse>({\n method: 'GET',\n path: `/integration/sellers/${this.transport.sellerId}/common-label/${encodeURIComponent(String(cargoTrackingNumber))}`,\n rateLimiter: this.limiter,\n });\n\n const labels: CommonLabelEntry[] = (raw?.data ?? []).map((row) => ({\n label: row.label ?? '',\n format: (row.format ?? 'ZPL') as CommonLabelEntry['format'],\n }));\n return { labels, raw: (raw ?? {}) as Record<string, unknown> };\n }\n}\n","import { TokenBucketRateLimiter } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { City, Country, District, Neighborhood } from '../types/misc.js';\n\ninterface WireNode {\n code?: number | string;\n id?: number | string;\n cityCode?: number | string;\n countryCode?: string;\n districtCode?: number | string;\n name?: string;\n [key: string]: unknown;\n}\n\nfunction n<T extends { code: string; raw: Record<string, unknown> }>(\n rows: unknown,\n extract: (node: WireNode) => Omit<T, 'raw'>,\n): T[] {\n const list = Array.isArray(rows) ? rows : [];\n return list.map((r) => {\n const node = r as WireNode;\n return { ...extract(node), raw: node as Record<string, unknown> } as T;\n });\n}\n\n/**\n * Trendyol location lookups for building shipment / invoice addresses\n * with the correct city / district / neighborhood codes.\n *\n * Trendyol exposes these under a different prefix (`/integration/member/`)\n * — not under `/integration/order/` or `/integration/product/`.\n */\nexport class LocationsResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 60, intervalMs: 60_000 });\n }\n\n /** List all supported countries (Türkiye + AZ + GULF + CEE). */\n async getCountries(): Promise<Country[]> {\n const data = await this.transport.request<unknown[]>({\n method: 'GET',\n path: `/integration/member/countries`,\n rateLimiter: this.limiter,\n });\n return n<Country>(data, (node) => ({\n code: String(node.code ?? node.id ?? ''),\n name: node.name,\n }));\n }\n\n // ─── Domestic (TR / AZ) ───────────────────────────────────────────────\n\n async getTurkeyCities(): Promise<City[]> {\n return this.cities(`/integration/member/countries/domestic/TR/cities`);\n }\n\n async getTurkeyDistricts(cityCode: string | number): Promise<District[]> {\n return this.districts(\n `/integration/member/countries/domestic/TR/cities/${encodeURIComponent(String(cityCode))}/districts`,\n );\n }\n\n async getTurkeyNeighborhoods(\n cityCode: string | number,\n districtCode: string | number,\n ): Promise<Neighborhood[]> {\n return this.neighborhoods(\n `/integration/member/countries/domestic/TR/cities/${encodeURIComponent(String(cityCode))}/districts/${encodeURIComponent(String(districtCode))}/neighborhoods`,\n );\n }\n\n async getAzerbaijanCities(): Promise<City[]> {\n return this.cities(`/integration/member/countries/domestic/AZ/cities`);\n }\n\n async getAzerbaijanDistricts(cityCode: string | number): Promise<District[]> {\n return this.districts(\n `/integration/member/countries/domestic/AZ/cities/${encodeURIComponent(String(cityCode))}/districts`,\n );\n }\n\n // ─── International (GULF / CEE) ───────────────────────────────────────\n\n async getCitiesByCountry(countryCode: string): Promise<City[]> {\n return this.cities(`/integration/member/countries/${encodeURIComponent(countryCode)}/cities`);\n }\n\n async getDistrictsByCity(countryCode: string, cityId: string | number): Promise<District[]> {\n return this.districts(\n `/integration/member/countries/${encodeURIComponent(countryCode)}/cities/${encodeURIComponent(String(cityId))}/districts`,\n );\n }\n\n // ─── Shared paginators ────────────────────────────────────────────────\n\n private async cities(path: string): Promise<City[]> {\n const data = await this.transport.request<unknown[]>({\n method: 'GET',\n path,\n rateLimiter: this.limiter,\n });\n return n<City>(data, (node) => ({\n code: String(node.code ?? node.id ?? ''),\n name: node.name,\n countryCode: node.countryCode,\n }));\n }\n\n private async districts(path: string): Promise<District[]> {\n const data = await this.transport.request<unknown[]>({\n method: 'GET',\n path,\n rateLimiter: this.limiter,\n });\n return n<District>(data, (node) => ({\n code: String(node.code ?? node.id ?? ''),\n name: node.name,\n cityCode: node.cityCode !== undefined ? String(node.cityCode) : undefined,\n }));\n }\n\n private async neighborhoods(path: string): Promise<Neighborhood[]> {\n const data = await this.transport.request<unknown[]>({\n method: 'GET',\n path,\n rateLimiter: this.limiter,\n });\n return n<Neighborhood>(data, (node) => ({\n code: String(node.code ?? node.id ?? ''),\n name: node.name,\n districtCode: node.districtCode !== undefined ? String(node.districtCode) : undefined,\n }));\n }\n}\n","import {\n TokenBucketRateLimiter,\n ValidationError,\n type CursorPage,\n type CursorPaginationParams,\n} from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n CancelPackageItemInput,\n CargoInvoiceItem,\n LaborCostInput,\n ListOrdersStreamParams,\n OrderAddress,\n OrderCustomer,\n OrderLine,\n PackageHistoryEntry,\n ProcessAlternativeDeliveryInput,\n QuantitySplit,\n UpdateBoxInfoInput,\n ShipmentPackage,\n ShipmentPackageStatus,\n SplitGroup,\n SplitPackagePlan,\n TrendyolCargoProvider,\n UpdatePackageStatusInput,\n} from '../types/order.js';\nimport type {\n CompensationItemDetail,\n CompensationTicket,\n ListCompensationTicketsParams,\n} from '../types/returns.js';\n\n/** Trendyol caps `size` at 200; default 200. */\nconst MAX_PAGE_SIZE = 200;\nconst DEFAULT_PAGE_SIZE = 50;\n/**\n * Effective 2026-06-08, `getShipmentPackages` caps total reachable records at\n * 10,000 — requests past that offset return HTTP 429. Use `listStream()` for\n * full scans. We fail fast client-side before issuing a doomed request.\n */\nconst MAX_OFFSET_RECORDS = 10_000;\n\nexport interface ListOrdersParams extends CursorPaginationParams {\n status?: ShipmentPackageStatus;\n orderNumber?: string;\n /** Filter packages updated on or after this date (Trendyol expects ms-epoch). */\n startDate?: Date;\n /** Filter packages updated on or before this date. */\n endDate?: Date;\n}\n\n// ─── Wire shapes (verified via raw inspect on STAGE 2026-05-25) ─────────────\n\ninterface TrendyolPackageHistoryNode {\n status?: string;\n createdDate?: number;\n [key: string]: unknown;\n}\n\ninterface TrendyolOrderLineNode {\n lineId?: number | string;\n quantity?: number;\n productName?: string;\n barcode?: string;\n productSize?: string;\n productColor?: string;\n stockCode?: string;\n contentId?: number | string;\n sellerId?: number | string;\n productCategoryId?: number | string;\n salesCampaignId?: number | string;\n currencyCode?: string;\n lineUnitPrice?: number;\n lineGrossAmount?: number;\n lineSellerDiscount?: number;\n lineTyDiscount?: number;\n lineTotalDiscount?: number;\n vatRate?: number;\n commission?: number;\n orderLineItemStatusName?: string;\n businessUnit?: string;\n fastDeliveryOptions?: unknown[];\n discountDetails?: unknown[];\n [key: string]: unknown;\n}\n\ninterface TrendyolAddressNode {\n id?: number | string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n company?: string;\n address1?: string;\n address2?: string;\n fullAddress?: string;\n shortAddress?: string;\n city?: string;\n cityCode?: number;\n district?: string;\n districtId?: number;\n neighborhoodId?: number;\n countyId?: number;\n countyName?: string;\n stateName?: string;\n postalCode?: string;\n countryCode?: string;\n phone?: string;\n addressLines?: { addressLine1?: string; addressLine2?: string };\n}\n\ninterface TrendyolShipmentPackageNode {\n /** Default field name on `getShipmentPackages` (orders.list). */\n shipmentPackageId?: number | string;\n /** Field name used by `getShipmentPackagesStream` (orders.listStream). */\n id?: number | string;\n orderNumber?: string;\n shipmentNumber?: number | string;\n originPackageIds?: Array<number | string> | null;\n warehouseId?: number | string;\n supplierId?: number | string;\n\n status?: string;\n shipmentPackageStatus?: string;\n\n customerFirstName?: string;\n customerLastName?: string;\n customerEmail?: string;\n customerId?: number | string;\n taxNumber?: string | null;\n identityNumber?: string;\n\n orderDate?: number;\n lastModifiedDate?: number;\n agreedDeliveryDate?: number;\n estimatedDeliveryStartDate?: number;\n estimatedDeliveryEndDate?: number;\n originShipmentDate?: number;\n\n currencyCode?: string;\n packageTotalPrice?: number;\n packageGrossAmount?: number;\n packageSellerDiscount?: number;\n packageTyDiscount?: number;\n packageTotalDiscount?: number;\n\n invoiceAddress?: TrendyolAddressNode;\n shipmentAddress?: TrendyolAddressNode;\n deliveryAddressType?: string;\n\n cargoTrackingNumber?: number | string;\n cargoProviderName?: string;\n cargoProviderId?: number | string;\n cargoSenderNumber?: string;\n\n deliveryType?: string;\n whoPays?: number;\n timeSlotId?: number;\n fastDelivery?: boolean;\n fastDeliveryType?: string;\n deliveredByService?: boolean;\n\n commercial?: boolean;\n micro?: boolean;\n giftBoxRequested?: boolean;\n containsDangerousProduct?: boolean;\n isCod?: boolean;\n is4P?: boolean;\n\n invoiceLink?: string;\n createdBy?: string;\n\n lines?: TrendyolOrderLineNode[];\n packageHistories?: TrendyolPackageHistoryNode[];\n\n [key: string]: unknown;\n}\n\ninterface TrendyolGetOrdersResponse {\n content?: TrendyolShipmentPackageNode[];\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n}\n\n// ─── Normalizers ────────────────────────────────────────────────────────────\n\nfunction toIso(epochMs: number | undefined): string | undefined {\n if (typeof epochMs !== 'number' || !Number.isFinite(epochMs) || epochMs === 0) {\n return undefined;\n }\n return new Date(epochMs).toISOString();\n}\n\nfunction normalizeAddress(node: TrendyolAddressNode | undefined): OrderAddress | undefined {\n if (!node) return undefined;\n const out: OrderAddress = {};\n if (node.id !== undefined) out.id = String(node.id);\n if (node.firstName !== undefined) out.firstName = node.firstName;\n if (node.lastName !== undefined) out.lastName = node.lastName;\n if (node.fullName !== undefined) out.fullName = node.fullName;\n if (node.company !== undefined) out.company = node.company;\n if (node.address1 !== undefined) out.address1 = node.address1;\n if (node.address2 !== undefined) out.address2 = node.address2;\n if (node.fullAddress !== undefined) out.fullAddress = node.fullAddress;\n if (node.shortAddress !== undefined) out.shortAddress = node.shortAddress;\n if (node.city !== undefined) out.city = node.city;\n if (node.cityCode !== undefined) out.cityCode = node.cityCode;\n if (node.district !== undefined) out.district = node.district;\n if (node.districtId !== undefined) out.districtId = node.districtId;\n if (node.neighborhoodId !== undefined) out.neighborhoodId = node.neighborhoodId;\n if (node.countyId !== undefined) out.countyId = node.countyId;\n if (node.countyName !== undefined) out.countyName = node.countyName;\n if (node.stateName !== undefined) out.stateName = node.stateName;\n if (node.postalCode !== undefined) out.postalCode = node.postalCode;\n if (node.countryCode !== undefined) out.countryCode = node.countryCode;\n if (node.phone !== undefined) out.phone = node.phone;\n if (node.addressLines !== undefined) out.addressLines = node.addressLines;\n return out;\n}\n\nfunction normalizeLine(node: TrendyolOrderLineNode): OrderLine {\n const out: OrderLine = {\n id: node.lineId !== undefined ? String(node.lineId) : '',\n quantity: typeof node.quantity === 'number' ? node.quantity : 0,\n productName: node.productName ?? '',\n barcode: node.barcode ?? '',\n lineUnitPrice: typeof node.lineUnitPrice === 'number' ? node.lineUnitPrice : 0,\n lineGrossAmount: typeof node.lineGrossAmount === 'number' ? node.lineGrossAmount : 0,\n raw: node as Record<string, unknown>,\n };\n if (node.productSize !== undefined) out.productSize = node.productSize;\n if (node.productColor !== undefined) out.productColor = node.productColor;\n if (node.stockCode !== undefined) out.stockCode = node.stockCode;\n if (node.contentId !== undefined) out.contentId = String(node.contentId);\n if (node.sellerId !== undefined) out.sellerId = String(node.sellerId);\n if (node.productCategoryId !== undefined) out.productCategoryId = String(node.productCategoryId);\n if (node.salesCampaignId !== undefined) out.salesCampaignId = String(node.salesCampaignId);\n if (node.currencyCode !== undefined) out.currencyCode = node.currencyCode;\n if (node.lineSellerDiscount !== undefined) out.lineSellerDiscount = node.lineSellerDiscount;\n if (node.lineTyDiscount !== undefined) out.lineTyDiscount = node.lineTyDiscount;\n if (node.lineTotalDiscount !== undefined) out.lineTotalDiscount = node.lineTotalDiscount;\n if (node.vatRate !== undefined) out.vatRate = node.vatRate;\n if (node.commission !== undefined) out.commission = node.commission;\n if (node.orderLineItemStatusName !== undefined) {\n out.orderLineItemStatusName = node.orderLineItemStatusName;\n }\n if (node.businessUnit !== undefined) out.businessUnit = node.businessUnit;\n if (Array.isArray(node.fastDeliveryOptions)) out.fastDeliveryOptions = node.fastDeliveryOptions;\n if (Array.isArray(node.discountDetails)) {\n out.discountDetails = node.discountDetails as OrderLine['discountDetails'];\n }\n return out;\n}\n\nfunction normalizeHistory(node: TrendyolPackageHistoryNode): PackageHistoryEntry {\n const out: PackageHistoryEntry = { raw: node as Record<string, unknown> };\n if (node.status !== undefined) out.status = node.status;\n const createdAt = toIso(node.createdDate);\n if (createdAt) out.createdAt = createdAt;\n return out;\n}\n\nfunction normalizeCustomer(node: TrendyolShipmentPackageNode): OrderCustomer {\n const out: OrderCustomer = {\n firstName: node.customerFirstName ?? '',\n lastName: node.customerLastName ?? '',\n };\n if (node.customerId !== undefined) out.id = String(node.customerId);\n if (node.customerEmail !== undefined) out.email = node.customerEmail;\n if (node.taxNumber !== undefined && node.taxNumber !== null) out.taxNumber = node.taxNumber;\n if (node.identityNumber !== undefined) out.identityNumber = node.identityNumber;\n return out;\n}\n\n/**\n * Normalize one raw Trendyol shipment-package node into the public\n * `ShipmentPackage` shape. Exported so consumers handling Trendyol\n * webhooks can reuse the SDK's normalization logic on the event body\n * (Trendyol POSTs the same shape it returns from `getShipmentPackages`).\n *\n * For full-webhook parsing use `parseWebhookEvent(rawBody)` from the\n * top-level package, which calls this internally per item.\n */\nexport function normalizeShipmentPackage(rawNode: unknown): ShipmentPackage {\n return normalizePackage((rawNode ?? {}) as TrendyolShipmentPackageNode);\n}\n\nfunction normalizePackage(node: TrendyolShipmentPackageNode): ShipmentPackage {\n const pkgId = node.shipmentPackageId ?? node.id;\n const out: ShipmentPackage = {\n id: pkgId !== undefined ? String(pkgId) : '',\n orderNumber: node.orderNumber ?? '',\n status: (node.status as ShipmentPackageStatus) ?? '',\n customer: normalizeCustomer(node),\n orderDate: toIso(node.orderDate) ?? '',\n lastModifiedDate: toIso(node.lastModifiedDate) ?? '',\n currencyCode: node.currencyCode ?? '',\n packageTotalPrice: typeof node.packageTotalPrice === 'number' ? node.packageTotalPrice : 0,\n packageGrossAmount: typeof node.packageGrossAmount === 'number' ? node.packageGrossAmount : 0,\n packageSellerDiscount:\n typeof node.packageSellerDiscount === 'number' ? node.packageSellerDiscount : 0,\n packageTyDiscount: typeof node.packageTyDiscount === 'number' ? node.packageTyDiscount : 0,\n packageTotalDiscount:\n typeof node.packageTotalDiscount === 'number' ? node.packageTotalDiscount : 0,\n lines: (node.lines ?? []).map(normalizeLine),\n packageHistories: (node.packageHistories ?? []).map(normalizeHistory),\n raw: node as Record<string, unknown>,\n };\n\n if (node.shipmentNumber !== undefined) out.shipmentNumber = String(node.shipmentNumber);\n if (node.originPackageIds !== undefined && node.originPackageIds !== null) {\n out.originPackageIds = node.originPackageIds.map((id) => String(id));\n }\n if (node.warehouseId !== undefined) out.warehouseId = String(node.warehouseId);\n if (node.supplierId !== undefined) out.supplierId = String(node.supplierId);\n if (node.shipmentPackageStatus !== undefined) {\n out.shipmentPackageStatus = node.shipmentPackageStatus as ShipmentPackageStatus;\n }\n\n const agreed = toIso(node.agreedDeliveryDate);\n if (agreed) out.agreedDeliveryDate = agreed;\n const estStart = toIso(node.estimatedDeliveryStartDate);\n if (estStart) out.estimatedDeliveryStartDate = estStart;\n const estEnd = toIso(node.estimatedDeliveryEndDate);\n if (estEnd) out.estimatedDeliveryEndDate = estEnd;\n const origin = toIso(node.originShipmentDate);\n if (origin) out.originShipmentDate = origin;\n\n const invoice = normalizeAddress(node.invoiceAddress);\n if (invoice) out.invoiceAddress = invoice;\n const shipment = normalizeAddress(node.shipmentAddress);\n if (shipment) out.shipmentAddress = shipment;\n if (node.deliveryAddressType !== undefined) out.deliveryAddressType = node.deliveryAddressType;\n\n if (node.cargoTrackingNumber !== undefined) {\n out.cargoTrackingNumber = String(node.cargoTrackingNumber);\n }\n if (node.cargoProviderName !== undefined) out.cargoProviderName = node.cargoProviderName;\n if (node.cargoProviderId !== undefined) out.cargoProviderId = String(node.cargoProviderId);\n if (node.cargoSenderNumber !== undefined) out.cargoSenderNumber = node.cargoSenderNumber;\n\n if (node.deliveryType !== undefined) out.deliveryType = node.deliveryType;\n if (node.whoPays !== undefined) out.whoPays = node.whoPays;\n if (node.timeSlotId !== undefined) out.timeSlotId = node.timeSlotId;\n if (typeof node.fastDelivery === 'boolean') out.fastDelivery = node.fastDelivery;\n if (node.fastDeliveryType !== undefined) out.fastDeliveryType = node.fastDeliveryType;\n if (typeof node.deliveredByService === 'boolean')\n out.deliveredByService = node.deliveredByService;\n\n if (typeof node.commercial === 'boolean') out.commercial = node.commercial;\n if (typeof node.micro === 'boolean') out.micro = node.micro;\n if (typeof node.giftBoxRequested === 'boolean') out.giftBoxRequested = node.giftBoxRequested;\n if (typeof node['3pByTrendyol'] === 'boolean') {\n out.threePByTrendyol = node['3pByTrendyol'];\n }\n if (typeof node.containsDangerousProduct === 'boolean') {\n out.containsDangerousProduct = node.containsDangerousProduct;\n }\n if (typeof node.isCod === 'boolean') out.isCod = node.isCod;\n if (typeof node.is4P === 'boolean') out.is4P = node.is4P;\n\n if (node.invoiceLink !== undefined) out.invoiceLink = node.invoiceLink;\n if (node.createdBy !== undefined) out.createdBy = node.createdBy;\n\n return out;\n}\n\n/**\n * Trendyol order (shipment-package) endpoints.\n *\n * Rate limit (per Trendyol service limits): tunable via the constructor with a\n * generous default.\n *\n * Pagination: `getShipmentPackages` (`list`) uses page-based pagination (not\n * nextPageToken). The SDK exposes `CursorPage<ShipmentPackage>` so the caller\n * can iterate with `paginate()` from `@lonca/core`; the opaque cursor encodes\n * the page index.\n *\n * **2026-06-08 limit:** `getShipmentPackages` reaches at most 10,000 records —\n * requests past that offset return HTTP 429. For full scans, periodic syncs, or\n * exports use {@link OrdersResource.listStream} (`getShipmentPackagesStream`),\n * which paginates with an opaque cursor and is not subject to the cap. Note the\n * stream endpoint exposes only the last 3 months of orders.\n */\nexport class OrdersResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n }\n\n /**\n * List shipment packages for the seller.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const pkg of paginate((p) => client.orders.list({ ...p, status: 'Created' }))) {\n * console.log(pkg.id, pkg.status, pkg.customer.firstName);\n * }\n * ```\n */\n async list(params: ListOrdersParams = {}): Promise<CursorPage<ShipmentPackage>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n if ((page + 1) * size > MAX_OFFSET_RECORDS) {\n throw new ValidationError({\n message: `getShipmentPackages can reach at most ${MAX_OFFSET_RECORDS} records (page ${page} × size ${size} exceeds it); use listStream() for full scans`,\n });\n }\n\n const query: Record<string, string | number | undefined> = { page, size };\n if (params.status) query.status = params.status;\n if (params.orderNumber) query.orderNumber = params.orderNumber;\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n\n const data = await this.transport.request<TrendyolGetOrdersResponse>({\n method: 'GET',\n path: `/integration/order/sellers/${this.transport.sellerId}/orders`,\n query,\n rateLimiter: this.limiter,\n });\n\n const items = (data.content ?? []).map(normalizePackage);\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n const result: CursorPage<ShipmentPackage> = { items };\n // Only advertise a next page when the server has one AND fetching it would\n // stay within the 10k-record offset cap. Emitting a cursor whose page would\n // trip the guard above makes `paginate()` throw mid-iteration after yielding\n // ~10k rows; instead the stream ends cleanly and the caller is steered to\n // `listStream()` for full scans (see the cap guard and class docs).\n const nextPageWithinCap = (page + 2) * size <= MAX_OFFSET_RECORDS;\n if (page + 1 < totalPages && nextPageWithinCap) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n /**\n * Push a shipment-package status update.\n *\n * Trendyol restricts the seller-side push to two transitions:\n * - `Picking` — order picked up from the shelf / being prepared\n * - `Invoiced` — invoice issued, ready for cargo handoff\n *\n * Other transitions (`Shipped`, `Delivered`, etc.) are driven by Trendyol\n * or the cargo provider — call `processAlternativeDelivery` or\n * `manualDeliverByPackageId` if you ship outside Trendyol's cargo\n * network.\n *\n * Returns void; Trendyol responds with 200 + empty body on success.\n */\n async updatePackageStatus(\n packageId: string | number,\n input: UpdatePackageStatusInput,\n ): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: this.packagePath(packageId),\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Notify Trendyol that one or more line items cannot be supplied\n * (\"Tedarik Edememe Bildirimi\"). Marks the listed line IDs as\n * `UnSupplied`. Trendyol cancels those quantities and notifies the\n * customer.\n *\n * `reasonId` is a numeric code Trendyol publishes separately — consult\n * the seller panel or the \"Tedarik Edememe\" docs for current values.\n *\n * Returns void; Trendyol responds with 200 + empty body on success.\n */\n async cancelPackageItem(\n packageId: string | number,\n input: CancelPackageItemInput,\n ): Promise<void> {\n if (!Array.isArray(input?.lines) || input.lines.length === 0) {\n throw new ValidationError({ message: 'cancelPackageItem: lines must not be empty' });\n }\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/items/unsupplied`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Extend the agreed delivery date for a shipment package by 1, 2, or 3 days.\n * Trendyol enforces the [1, 3] range server-side; the SDK validates client-side\n * to fail fast.\n *\n * Returns void; Trendyol responds with 200 + empty body on success.\n */\n async extendDeliveryDate(packageId: string | number, extendedDayCount: 1 | 2 | 3): Promise<void> {\n if (![1, 2, 3].includes(extendedDayCount)) {\n throw new ValidationError({\n message: `extendDeliveryDate: extendedDayCount must be 1, 2, or 3 (got ${extendedDayCount})`,\n });\n }\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/extended-agreed-delivery-date`,\n body: { extendedDayCount },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Notify Trendyol of an alternative delivery channel — used when the\n * seller is shipping via a non-Trendyol cargo provider. Trendyol then\n * either SMSes the customer the tracking link (when `isPhoneNumber` is\n * `true`) or stores the tracking URL on the package directly.\n *\n * Returns void; Trendyol responds with 200 + empty body on success.\n */\n async processAlternativeDelivery(\n packageId: string | number,\n input: ProcessAlternativeDeliveryInput,\n ): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/alternative-delivery`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Split a shipment package by moving a set of line IDs into a new\n * package. The original package keeps the remaining lines.\n *\n * @param packageId The package to split.\n * @param orderLineIds Line IDs to move into the new package (1+).\n * @throws {ValidationError} when `orderLineIds` is empty.\n */\n async splitPackage(packageId: string | number, orderLineIds: number[]): Promise<void> {\n if (!Array.isArray(orderLineIds) || orderLineIds.length === 0) {\n throw new ValidationError({ message: 'splitPackage: orderLineIds must not be empty' });\n }\n await this.transport.request<unknown>({\n method: 'POST',\n path: `${this.packagePath(packageId)}/split`,\n body: { orderLineIds },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Split a shipment package by quantity. Each `QuantitySplit` entry\n * carves a single line into multiple packages — e.g. `{ orderLineId: 100,\n * quantities: [2, 2, 1] }` splits 5 units of line 100 into three packages\n * of 2 + 2 + 1.\n *\n * @throws {ValidationError} when `quantitySplit` is empty.\n */\n async splitPackageByQuantity(\n packageId: string | number,\n quantitySplit: QuantitySplit[],\n ): Promise<void> {\n if (!Array.isArray(quantitySplit) || quantitySplit.length === 0) {\n throw new ValidationError({\n message: 'splitPackageByQuantity: quantitySplit must not be empty',\n });\n }\n await this.transport.request<unknown>({\n method: 'POST',\n path: `${this.packagePath(packageId)}/quantity-split`,\n body: { quantitySplit },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Split a shipment package into multiple new packages by grouping line\n * IDs. Each `SplitGroup` becomes one new package containing the listed\n * line IDs.\n *\n * @throws {ValidationError} when `splitGroups` is empty.\n */\n async multiSplitPackage(packageId: string | number, splitGroups: SplitGroup[]): Promise<void> {\n if (!Array.isArray(splitGroups) || splitGroups.length === 0) {\n throw new ValidationError({ message: 'multiSplitPackage: splitGroups must not be empty' });\n }\n await this.transport.request<unknown>({\n method: 'POST',\n path: `${this.packagePath(packageId)}/multi-split`,\n body: { splitGroups },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Split a shipment package into multiple new packages, each containing a\n * mix of line items at specific quantities. This is the most expressive\n * split — use it when you need fine-grained control over which line IDs\n * and how many of each end up in each new package.\n *\n * @throws {ValidationError} when `splitPackages` is empty.\n */\n async splitMultiPackagesByQuantity(\n packageId: string | number,\n splitPackages: SplitPackagePlan[],\n ): Promise<void> {\n if (!Array.isArray(splitPackages) || splitPackages.length === 0) {\n throw new ValidationError({\n message: 'splitMultiPackagesByQuantity: splitPackages must not be empty',\n });\n }\n await this.transport.request<unknown>({\n method: 'POST',\n path: `${this.packagePath(packageId)}/split-packages`,\n body: { splitPackages },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Change the cargo provider on an existing shipment package. Use one of\n * Trendyol's documented marketplace cargo codes (`'YKMP'`, `'ARASMP'`,\n * `'SURATMP'`, etc.) — see `TrendyolCargoProvider` for the full list.\n */\n async changeCargoProvider(\n packageId: string | number,\n cargoProvider: TrendyolCargoProvider,\n ): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/cargo-providers`,\n body: { cargoProvider },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Mark a shipment package as manually delivered via its package ID.\n * Used when the seller delivered the order outside Trendyol's cargo\n * network and needs to flip the package to `Delivered` after handover.\n *\n * No request body; Trendyol responds with 200 + empty body on success.\n */\n async manualDeliverByPackageId(packageId: string | number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/manual-invoice-delivery`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Manual-deliver variant that takes the cargo tracking number instead\n * of the package ID. Useful when you only have the tracking number on\n * hand (e.g., from a cargo provider webhook).\n *\n * Note the path structure: tracking number sits at a sibling location,\n * not under `/shipment-packages/{id}/...`.\n */\n async manualDeliverByTrackingNumber(cargoTrackingNumber: string | number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `/integration/order/sellers/${this.transport.sellerId}/shipment-packages/manual-invoice-delivery-by-tracking-number/${encodeURIComponent(String(cargoTrackingNumber))}`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Mark a package as delivered through an authorized service (\"yetkili\n * servis\"). For appliance / installation-required products that are\n * delivered + installed by a third-party service partner.\n */\n async markDeliveredByService(packageId: string | number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/delivered-by-service`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Update box / packaging metadata on a shipment package (desi value\n * and/or number of boxes). Either field can be sent alone.\n */\n async updateBoxInfo(packageId: string | number, input: UpdateBoxInfoInput): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/box-info`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Update labor costs for one or more order lines.\n *\n * **Wire note:** Trendyol's request body is a raw array (no envelope),\n * not `{ items: [...] }`. The SDK forwards `items` verbatim.\n *\n * @throws {ValidationError} when `items` is empty.\n */\n async updateLaborCosts(packageId: string | number, items: LaborCostInput[]): Promise<void> {\n if (!Array.isArray(items) || items.length === 0) {\n throw new ValidationError({ message: 'updateLaborCosts: items must not be empty' });\n }\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/labor-costs`,\n body: items,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Reassign a shipment package to a different warehouse. `warehouseId`\n * comes from `client.suppliers.getAddresses()` (filter by `isShipmentAddress`).\n */\n async updateWarehouse(packageId: string | number, warehouseId: number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/warehouse`,\n body: { warehouseId },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Stream variant of `list()`. Trendyol's `getShipmentPackagesStream`\n * returns the same `ShipmentPackage` shape but paginates with an opaque\n * cursor — useful when the dataset is large and page-based pagination\n * would hit the 10 000-record cap.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const pkg of paginate((p) =>\n * client.orders.listStream({ ...p, packageItemStatuses: 'Created,Picking' }),\n * )) {\n * console.log(pkg.id, pkg.status);\n * }\n * ```\n */\n async listStream(params: ListOrdersStreamParams = {}): Promise<CursorPage<ShipmentPackage>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);\n const query: Record<string, string | number | undefined> = { size };\n if (params.cursor) query.nextCursor = params.cursor;\n if (params.packageItemStatuses) query.packageItemStatuses = params.packageItemStatuses;\n if (params.lastModifiedStartDate) {\n query.lastModifiedStartDate = params.lastModifiedStartDate.getTime();\n }\n if (params.lastModifiedEndDate) {\n query.lastModifiedEndDate = params.lastModifiedEndDate.getTime();\n }\n\n interface StreamResponse {\n content?: TrendyolShipmentPackageNode[];\n size?: number;\n hasMore?: boolean;\n nextCursor?: string;\n }\n const data = await this.transport.request<StreamResponse>({\n method: 'GET',\n path: `/integration/order/sellers/${this.transport.sellerId}/orders/stream`,\n query,\n rateLimiter: this.limiter,\n });\n\n const items = (data.content ?? []).map(normalizePackage);\n const result: CursorPage<ShipmentPackage> = { items };\n if (data.hasMore && data.nextCursor) {\n result.nextCursor = data.nextCursor;\n }\n return result;\n }\n\n /**\n * Fetch the per-parcel cargo-fee breakdown for a single cargo invoice\n * (Trendyol's `getCargoInvoiceItems`). Useful for reconciling Trendyol's\n * cargo deductions against your shipped packages.\n *\n * `invoiceSerialNumber` is sourced from the Current Account Statement\n * (\"Cari Hesap Ekstresi\") with `transactionType=DeductionInvoices`.\n *\n * Page-based pagination internally (cursor encodes the page index).\n */\n async getCargoInvoiceItems(\n invoiceSerialNumber: string,\n params: CursorPaginationParams = {},\n ): Promise<CursorPage<CargoInvoiceItem>> {\n const size = Math.min(params.limit ?? 500, 500);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n interface WireRow {\n shipmentPackageType?: string;\n parcelUniqueId?: number | string;\n orderNumber?: string;\n amount?: number;\n desi?: number;\n [key: string]: unknown;\n }\n interface WireResponse {\n page?: number;\n size?: number;\n totalPages?: number;\n totalElements?: number;\n content?: WireRow[];\n }\n\n const data = await this.transport.request<WireResponse>({\n method: 'GET',\n path: `/integration/finance/che/sellers/${this.transport.sellerId}/cargo-invoice/${encodeURIComponent(invoiceSerialNumber)}/items`,\n query: { page, size },\n rateLimiter: this.limiter,\n });\n\n const items: CargoInvoiceItem[] = (data.content ?? []).map((row) => {\n const out: CargoInvoiceItem = { raw: row as Record<string, unknown> };\n if (row.shipmentPackageType !== undefined) out.shipmentPackageType = row.shipmentPackageType;\n if (row.parcelUniqueId !== undefined) {\n out.parcelUniqueId =\n typeof row.parcelUniqueId === 'string' ? row.parcelUniqueId : String(row.parcelUniqueId);\n }\n if (row.orderNumber !== undefined) out.orderNumber = row.orderNumber;\n if (typeof row.amount === 'number') out.amount = row.amount;\n if (typeof row.desi === 'number') out.desi = row.desi;\n return out;\n });\n\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n const result: CursorPage<CargoInvoiceItem> = { items };\n if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n /**\n * Notify Trendyol that a shipped package was returned to you (manual\n * return flow, e.g. customer dropped it at your address or you got the\n * package back without going through Trendyol's return cargo).\n *\n * No body; Trendyol responds with 200 + empty body on success.\n */\n async manualReturnByPackageId(packageId: string | number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/manual-return`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Manual-return variant that takes the cargo tracking number instead of\n * the package ID. Useful when the cargo provider's webhook only carries\n * the tracking number.\n *\n * Sibling path (not under `/{packageId}/...`).\n */\n async manualReturnByTrackingNumber(cargoTrackingNumber: string | number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `/integration/order/sellers/${this.transport.sellerId}/shipment-packages/manual-return-by-tracking-number/${encodeURIComponent(String(cargoTrackingNumber))}`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Fetch Trendyol Express compensation tickets (claims filed when a\n * shipment is lost or damaged in transit). Page-based pagination\n * internally; the SDK exposes the cursor convention.\n *\n * Note the different base path — `/integration/tex/compensation/...`,\n * not the regular `/integration/order/...`.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * const tickets = await client.orders.getCompensationTickets({\n * startDate: new Date('2026-01-01'),\n * endDate: new Date('2026-02-01'),\n * });\n * for (const t of tickets.items) {\n * console.log(t.orderNumber, t.currentState, t.stateMessage);\n * }\n * ```\n */\n async getCompensationTickets(\n params: ListCompensationTicketsParams = {},\n ): Promise<CursorPage<CompensationTicket>> {\n const size = Math.min(params.limit ?? 200, 200);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n const query: Record<string, string | number | undefined> = { page, size };\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n\n interface WireItem {\n itemAmount?: number;\n itemCode?: string;\n itemCount?: number;\n itemName?: string;\n }\n interface WireTicket {\n cargoProvider?: string;\n compensateReason?: string;\n createDate?: number;\n currentState?: string;\n deliveryNumber?: string;\n itemDetails?: WireItem[];\n orderNumber?: string;\n requestedBy?: string;\n stateMessage?: string;\n totalItemsAmount?: string;\n [key: string]: unknown;\n }\n interface WireResponse {\n totalCount?: number;\n /**\n * Trendyol's docs say `data: { items: [...] }` but typical Trendyol\n * paginated responses use `content: [...]` — accept both defensively.\n */\n data?: { items?: WireTicket[]; content?: WireTicket[] } | WireTicket[];\n content?: WireTicket[];\n }\n\n const res = await this.transport.request<WireResponse>({\n method: 'GET',\n path: `/integration/tex/compensation/sellers/${this.transport.sellerId}/tickets`,\n query,\n rateLimiter: this.limiter,\n });\n\n const tickets: WireTicket[] = Array.isArray(res.data)\n ? res.data\n : (res.data?.items ?? res.data?.content ?? res.content ?? []);\n\n const items: CompensationTicket[] = tickets.map((t) => {\n const itemDetails: CompensationItemDetail[] = (t.itemDetails ?? []).map((d) => {\n const out: CompensationItemDetail = {};\n if (typeof d.itemAmount === 'number') out.itemAmount = d.itemAmount;\n if (d.itemCode !== undefined) out.itemCode = d.itemCode;\n if (typeof d.itemCount === 'number') out.itemCount = d.itemCount;\n if (d.itemName !== undefined) out.itemName = d.itemName;\n return out;\n });\n const out: CompensationTicket = {\n itemDetails,\n raw: t as Record<string, unknown>,\n };\n if (t.cargoProvider !== undefined) out.cargoProvider = t.cargoProvider;\n if (t.compensateReason !== undefined) out.compensateReason = t.compensateReason;\n const createdAt = toIso(t.createDate);\n if (createdAt) out.createdAt = createdAt;\n if (t.currentState !== undefined) {\n out.currentState = t.currentState as CompensationTicket['currentState'];\n }\n if (t.deliveryNumber !== undefined) out.deliveryNumber = t.deliveryNumber;\n if (t.orderNumber !== undefined) out.orderNumber = t.orderNumber;\n if (t.requestedBy !== undefined) out.requestedBy = t.requestedBy;\n if (t.stateMessage !== undefined) out.stateMessage = t.stateMessage;\n if (t.totalItemsAmount !== undefined) out.totalItemsAmount = t.totalItemsAmount;\n return out;\n });\n\n // Paging derived from totalCount vs page*size.\n const result: CursorPage<CompensationTicket> = { items };\n const total = typeof res.totalCount === 'number' ? res.totalCount : 0;\n if ((page + 1) * size < total) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n private packagePath(packageId: string | number): string {\n return `/integration/order/sellers/${this.transport.sellerId}/shipment-packages/${encodeURIComponent(String(packageId))}`;\n }\n}\n","import {\n TokenBucketRateLimiter,\n ValidationError,\n type CursorPage,\n type CursorPaginationParams,\n} from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n ApprovedProductStatus,\n BatchRequestItemResult,\n BatchRequestResult,\n BuyboxInfo,\n NamedRef,\n Product,\n ProductAttribute,\n ProductBase,\n ProductStockPrice,\n ProductStockPriceVariant,\n ProductVariant,\n UnapprovedProduct,\n UnapprovedProductRejectReason,\n} from '../types/product.js';\nimport type {\n BatchAcceptedResponse,\n CreateProductV2Input,\n UpdateContentInput,\n UpdateDeliveryInfoInput,\n UpdateUnapprovedInput,\n UpdateVariantInput,\n} from '../types/product-write.js';\n\nconst DEFAULT_PAGE_SIZE = 50;\n/** Trendyol caps `page × size` at 10,000; we cap `size` defensively. */\nconst MAX_PAGE_SIZE = 1000;\n/** The inventory-and-price endpoint caps `size` at 100 (tighter than `list`). */\nconst MAX_INVENTORY_PAGE_SIZE = 100;\n\nexport interface ListProductsParams extends CursorPaginationParams {\n /** Filter by a single barcode. */\n barcode?: string;\n /** Filter products updated on or after this date (Trendyol expects ms-epoch). */\n startDate?: Date;\n /** Filter products updated on or before this date. */\n endDate?: Date;\n}\n\n/**\n * Filters for `products.listInventoryAndPrice` (Trendyol's lightweight\n * `inventory-and-price` approved-product filter). All filters are optional;\n * pass none to page through every approved product's stock + price.\n */\nexport interface ListInventoryAndPriceParams extends CursorPaginationParams {\n /** Filter by a single barcode. */\n barcode?: string;\n /** Filter by a single contentId. */\n contentId?: string;\n /** Filter by the seller's stock code. */\n stockCode?: string;\n /** Filter by the seller's productMainId. */\n productMainId?: string;\n /** Filter by listing status (archived / blacklisted / locked / onSale / notOnSale). */\n status?: ApprovedProductStatus;\n /**\n * Sort by `SellerCreatedDate`. `ASC` = oldest→newest, `DESC` = newest→oldest.\n */\n orderByDirection?: 'ASC' | 'DESC';\n /**\n * Storefront code sent as the `storeFrontCode` header. Required on the\n * International marketplace; optional on the Türkiye marketplace.\n */\n storeFrontCode?: string;\n}\n\n/** Date field to filter against on `listUnapproved` (default: server choice). */\nexport type UnapprovedDateQueryType = 'CREATED_DATE' | 'LAST_MODIFIED_DATE';\n\nexport interface ListUnapprovedProductsParams extends CursorPaginationParams {\n barcode?: string;\n startDate?: Date;\n endDate?: Date;\n /** Choose which date `startDate`/`endDate` apply to. */\n dateQueryType?: UnapprovedDateQueryType;\n /**\n * Optional override of the seller-scoped query (rare; defaults to the\n * client's `sellerId`).\n */\n supplierId?: number;\n}\n\n/** Trendyol caps `barcodes` at 10 for the buybox endpoint. */\nconst MAX_BUYBOX_BARCODES = 10;\n\n// ─── Wire types (Trendyol's real shape, verified live) ──────────────────────\n\ninterface TrendyolRef {\n id?: number | string;\n name?: string;\n}\n\ninterface TrendyolAttributeNode {\n attributeId?: number | string;\n attributeName?: string;\n attributeValueId?: number | string;\n attributeValue?: string;\n}\n\ninterface TrendyolVariantNode {\n variantId?: number | string;\n barcode?: string;\n commission?: number;\n attributes?: TrendyolAttributeNode[];\n productUrl?: string;\n onSale?: boolean;\n stock?: { quantity?: number } | number;\n [key: string]: unknown;\n}\n\ninterface TrendyolProductNode {\n contentId?: number | string;\n productMainId?: string;\n title?: string;\n description?: string;\n brand?: TrendyolRef;\n category?: TrendyolRef;\n images?: Array<{ url?: string } | string>;\n attributes?: TrendyolAttributeNode[];\n variants?: TrendyolVariantNode[];\n creationDate?: number;\n lastModifiedDate?: number;\n lastModifiedBy?: string;\n [key: string]: unknown;\n}\n\ninterface TrendyolFilterResponse {\n content?: TrendyolProductNode[];\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n nextPageToken?: string;\n}\n\n// ─── Inventory-and-price (stock + price only) wire shape ────────────────────\n// Verified live against Trendyol STAGE on 2026-06-03 (seller 2738):\n// response keys totalElements/totalPages/page/size/nextPageToken/content;\n// variant keys variantId/barcode/salePrice/listPrice/quantity/stockCode/\n// stockLastModifiedDate. `storeFrontCode` header is NOT required on the\n// Türkiye marketplace (200 without it).\n\ninterface TrendyolStockPriceVariantNode {\n variantId?: number | string;\n barcode?: string;\n salePrice?: number;\n listPrice?: number;\n quantity?: number;\n stockCode?: string;\n /** ms-epoch; `null` when stock was never updated. */\n stockLastModifiedDate?: number | null;\n [key: string]: unknown;\n}\n\ninterface TrendyolStockPriceNode {\n contentId?: number | string;\n productMainId?: string;\n variants?: TrendyolStockPriceVariantNode[];\n [key: string]: unknown;\n}\n\ninterface TrendyolStockPriceResponse {\n content?: TrendyolStockPriceNode[];\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n nextPageToken?: string;\n}\n\n// ─── Unapproved (draft) products wire shape (verified STAGE 2026-05-25) ────\n\ninterface TrendyolUnapprovedRejectReason {\n rejectReason?: string;\n rejectReasonDetail?: string;\n}\n\ninterface TrendyolUnapprovedNode {\n supplierId?: number | string;\n productMainId?: string;\n status?: string;\n createDateTime?: number;\n lastUpdateDate?: number;\n lastPriceChangeDate?: number;\n lastStockChangeDate?: number;\n brand?: TrendyolRef;\n category?: TrendyolRef;\n barcode?: string;\n title?: string;\n description?: string;\n quantity?: number;\n listPrice?: number;\n salePrice?: number;\n vatRate?: number;\n dimensionalWeight?: number | null;\n stockCode?: string;\n origin?: string | null;\n /** Spec calls this `media`; live wire returns `images`. We accept both. */\n images?: Array<{ url?: string } | string>;\n media?: Array<{ url?: string } | string>;\n attributes?: TrendyolAttributeNode[];\n rejectReasonDetails?: TrendyolUnapprovedRejectReason[];\n locationBasedDelivery?: 'ENABLED' | 'DISABLED' | null;\n lotNumber?: string | null;\n specialConsumptionTax?: number | null;\n sgrPrice?: number | null;\n [key: string]: unknown;\n}\n\ninterface TrendyolUnapprovedResponse {\n content?: TrendyolUnapprovedNode[];\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n nextPageToken?: string;\n}\n\n// ─── Buybox + ProductBase wire shapes ──────────────────────────────────────\n\ninterface TrendyolBuyboxInfoNode {\n barcode?: string;\n buyboxOrder?: number;\n buyboxPrice?: number;\n hasMultipleSeller?: boolean;\n secondBuyboxPrice?: number | null;\n thirdBuyboxPrice?: number | null;\n [key: string]: unknown;\n}\n\ninterface TrendyolBuyboxResponse {\n buyboxInfo?: TrendyolBuyboxInfoNode[];\n /** Some Trendyol responses use `content` instead — accept both defensively. */\n content?: TrendyolBuyboxInfoNode[];\n}\n\ninterface TrendyolProductBaseResponse {\n barcode?: string;\n approved?: boolean;\n approvedDate?: number;\n archived?: boolean;\n listingId?: string;\n contentId?: number | string;\n [key: string]: unknown;\n}\n\ninterface TrendyolBatchResultResponse {\n batchRequestId?: string;\n status?: string;\n itemCount?: number;\n failedItemCount?: number;\n items?: Array<{\n requestItem?: unknown;\n status?: string;\n failureReasons?: string[];\n }>;\n creationDate?: number;\n lastModification?: number;\n sourceType?: string;\n batchRequestType?: string;\n notes?: string;\n objectKey?: string;\n storeFrontCode?: string;\n [key: string]: unknown;\n}\n\n// ─── Normalizers ────────────────────────────────────────────────────────────\n\nfunction normalizeRef(ref: TrendyolRef | undefined): NamedRef {\n return {\n id: ref?.id !== undefined ? String(ref.id) : '',\n name: ref?.name ?? '',\n };\n}\n\nfunction normalizeAttribute(attr: TrendyolAttributeNode): ProductAttribute {\n const out: ProductAttribute = {\n attributeId: attr.attributeId !== undefined ? String(attr.attributeId) : '',\n };\n if (attr.attributeName !== undefined) out.attributeName = attr.attributeName;\n if (attr.attributeValueId !== undefined) {\n out.attributeValueId = String(attr.attributeValueId);\n }\n if (attr.attributeValue !== undefined) out.attributeValue = attr.attributeValue;\n return out;\n}\n\nfunction normalizeImages(images: TrendyolProductNode['images']): string[] {\n if (!images) return [];\n return images\n .map((img) => (typeof img === 'string' ? img : img?.url))\n .filter((u): u is string => typeof u === 'string' && u.length > 0);\n}\n\nfunction normalizeStock(stock: TrendyolVariantNode['stock']): number | undefined {\n if (typeof stock === 'number') return stock;\n if (stock && typeof stock === 'object' && typeof stock.quantity === 'number') {\n return stock.quantity;\n }\n return undefined;\n}\n\nfunction normalizeVariant(variant: TrendyolVariantNode): ProductVariant {\n const out: ProductVariant = {\n variantId: variant.variantId !== undefined ? String(variant.variantId) : '',\n barcode: variant.barcode ?? '',\n attributes: (variant.attributes ?? []).map(normalizeAttribute),\n raw: variant as Record<string, unknown>,\n };\n if (typeof variant.commission === 'number') out.commission = variant.commission;\n if (variant.productUrl !== undefined) out.productUrl = variant.productUrl;\n if (typeof variant.onSale === 'boolean') out.onSale = variant.onSale;\n const stock = normalizeStock(variant.stock);\n if (stock !== undefined) out.stock = stock;\n return out;\n}\n\nfunction toIso(epochMs: number | undefined): string | undefined {\n if (typeof epochMs !== 'number' || !Number.isFinite(epochMs)) return undefined;\n return new Date(epochMs).toISOString();\n}\n\nfunction normalizeProduct(node: TrendyolProductNode): Product {\n const out: Product = {\n contentId: node.contentId !== undefined ? String(node.contentId) : '',\n productMainId: node.productMainId ?? '',\n title: node.title ?? '',\n brand: normalizeRef(node.brand),\n category: normalizeRef(node.category),\n images: normalizeImages(node.images),\n attributes: (node.attributes ?? []).map(normalizeAttribute),\n variants: (node.variants ?? []).map(normalizeVariant),\n createdAt: toIso(node.creationDate) ?? '',\n updatedAt: toIso(node.lastModifiedDate) ?? '',\n raw: node as Record<string, unknown>,\n };\n if (node.description !== undefined) out.description = node.description;\n if (node.lastModifiedBy !== undefined) out.lastModifiedBy = node.lastModifiedBy;\n return out;\n}\n\nfunction normalizeStockPriceVariant(node: TrendyolStockPriceVariantNode): ProductStockPriceVariant {\n const out: ProductStockPriceVariant = {\n variantId: node.variantId !== undefined ? String(node.variantId) : '',\n barcode: node.barcode ?? '',\n raw: node as Record<string, unknown>,\n };\n if (typeof node.salePrice === 'number') out.salePrice = node.salePrice;\n if (typeof node.listPrice === 'number') out.listPrice = node.listPrice;\n if (typeof node.quantity === 'number') out.quantity = node.quantity;\n if (node.stockCode !== undefined) out.stockCode = node.stockCode;\n if (node.stockLastModifiedDate !== undefined && node.stockLastModifiedDate !== null) {\n const iso = toIso(node.stockLastModifiedDate);\n if (iso) out.stockLastModifiedAt = iso;\n }\n return out;\n}\n\nfunction normalizeStockPrice(node: TrendyolStockPriceNode): ProductStockPrice {\n return {\n contentId: node.contentId !== undefined ? String(node.contentId) : '',\n productMainId: node.productMainId ?? '',\n variants: (node.variants ?? []).map(normalizeStockPriceVariant),\n raw: node as Record<string, unknown>,\n };\n}\n\nfunction normalizeUnapprovedRejectReason(\n r: TrendyolUnapprovedRejectReason,\n): UnapprovedProductRejectReason {\n const out: UnapprovedProductRejectReason = {};\n if (r.rejectReason !== undefined) out.rejectReason = r.rejectReason;\n if (r.rejectReasonDetail !== undefined) out.rejectReasonDetail = r.rejectReasonDetail;\n return out;\n}\n\nfunction normalizeUnapproved(node: TrendyolUnapprovedNode): UnapprovedProduct {\n // Spec calls it `media`, live wire calls it `images` — accept both, prefer `images`.\n const imagesSource = node.images ?? node.media;\n const out: UnapprovedProduct = {\n productMainId: node.productMainId ?? '',\n brand: normalizeRef(node.brand),\n category: normalizeRef(node.category),\n barcode: node.barcode ?? '',\n title: node.title ?? '',\n images: normalizeImages(imagesSource),\n attributes: (node.attributes ?? []).map(normalizeAttribute),\n rejectReasonDetails: (node.rejectReasonDetails ?? []).map(normalizeUnapprovedRejectReason),\n raw: node as Record<string, unknown>,\n };\n if (node.supplierId !== undefined) out.supplierId = String(node.supplierId);\n if (node.status !== undefined) out.status = node.status as UnapprovedProduct['status'];\n if (node.description !== undefined) out.description = node.description;\n if (typeof node.quantity === 'number') out.quantity = node.quantity;\n if (typeof node.listPrice === 'number') out.listPrice = node.listPrice;\n if (typeof node.salePrice === 'number') out.salePrice = node.salePrice;\n if (typeof node.vatRate === 'number') out.vatRate = node.vatRate;\n if (node.dimensionalWeight !== undefined && node.dimensionalWeight !== null) {\n out.dimensionalWeight = node.dimensionalWeight;\n }\n if (node.stockCode !== undefined) out.stockCode = node.stockCode;\n if (node.origin !== undefined) out.origin = node.origin;\n if (node.locationBasedDelivery !== undefined) {\n out.locationBasedDelivery = node.locationBasedDelivery;\n }\n if (node.lotNumber !== undefined) out.lotNumber = node.lotNumber;\n if (node.specialConsumptionTax !== undefined) {\n out.specialConsumptionTax = node.specialConsumptionTax;\n }\n if (node.sgrPrice !== undefined) out.sgrPrice = node.sgrPrice;\n const createdAt = toIso(node.createDateTime);\n if (createdAt) out.createdAt = createdAt;\n const updatedAt = toIso(node.lastUpdateDate);\n if (updatedAt) out.updatedAt = updatedAt;\n const priceChanged = toIso(node.lastPriceChangeDate);\n if (priceChanged) out.lastPriceChangedAt = priceChanged;\n const stockChanged = toIso(node.lastStockChangeDate);\n if (stockChanged) out.lastStockChangedAt = stockChanged;\n return out;\n}\n\nfunction normalizeBuyboxInfo(node: TrendyolBuyboxInfoNode): BuyboxInfo {\n const out: BuyboxInfo = {\n barcode: node.barcode ?? '',\n raw: node as Record<string, unknown>,\n };\n if (typeof node.buyboxOrder === 'number') out.buyboxOrder = node.buyboxOrder;\n if (typeof node.buyboxPrice === 'number') out.buyboxPrice = node.buyboxPrice;\n if (typeof node.hasMultipleSeller === 'boolean') {\n out.hasMultipleSeller = node.hasMultipleSeller;\n }\n if (node.secondBuyboxPrice !== undefined) out.secondBuyboxPrice = node.secondBuyboxPrice;\n if (node.thirdBuyboxPrice !== undefined) out.thirdBuyboxPrice = node.thirdBuyboxPrice;\n return out;\n}\n\nfunction normalizeProductBase(data: TrendyolProductBaseResponse): ProductBase {\n const out: ProductBase = {\n barcode: data.barcode ?? '',\n approved: !!data.approved,\n archived: !!data.archived,\n raw: data as Record<string, unknown>,\n };\n const approvedAt = toIso(data.approvedDate);\n if (approvedAt) out.approvedAt = approvedAt;\n if (data.listingId !== undefined) out.listingId = data.listingId;\n if (data.contentId !== undefined) out.contentId = String(data.contentId);\n return out;\n}\n\nfunction normalizeBatchResult(data: TrendyolBatchResultResponse): BatchRequestResult {\n const items: BatchRequestItemResult[] = (data.items ?? []).map((item) => {\n const result: BatchRequestItemResult = {};\n if (item.requestItem !== undefined) result.requestItem = item.requestItem;\n if (item.status !== undefined) result.status = item.status;\n if (item.failureReasons !== undefined) result.failureReasons = item.failureReasons;\n return result;\n });\n const out: BatchRequestResult = {\n batchRequestId: typeof data.batchRequestId === 'string' ? data.batchRequestId : '',\n status: (data.status as BatchRequestResult['status']) ?? 'PROCESSING',\n items,\n raw: data as Record<string, unknown>,\n };\n if (typeof data.itemCount === 'number') out.itemCount = data.itemCount;\n if (typeof data.failedItemCount === 'number') out.failedItemCount = data.failedItemCount;\n const createdAt = toIso(data.creationDate);\n if (createdAt) out.createdAt = createdAt;\n const lastModifiedAt = toIso(data.lastModification);\n if (lastModifiedAt) out.lastModifiedAt = lastModifiedAt;\n if (data.sourceType !== undefined) out.sourceType = data.sourceType;\n if (data.batchRequestType !== undefined) out.batchRequestType = data.batchRequestType;\n if (data.notes !== undefined) out.notes = data.notes;\n if (data.objectKey !== undefined) out.objectKey = data.objectKey;\n if (data.storeFrontCode !== undefined) out.storeFrontCode = data.storeFrontCode;\n return out;\n}\n\n/** Trendyol caps `items[]` at 1000 for every async write endpoint. */\nconst MAX_WRITE_ITEMS = 1000;\n/** Trendyol's documented service-limits cap delete at 100 req/min (separate bucket). */\nconst DELETE_RATE_PER_MIN = 100;\n\n/**\n * Trendyol product read + write + lifecycle + batch-result endpoints.\n *\n * Rate limits (per Trendyol service limits):\n * - filterProducts (approved + unapproved + getProductBase): 2000 req/min\n * - getBatchRequestResult: 1000 req/min\n * - getBuyboxInformation: 1000 req/min\n * - create/update/archive/unlock product writes: 1000 req/min (shared bucket)\n * - delete: 100 req/min (separate bucket)\n */\nexport class ProductsResource {\n private readonly filterLimiter: TokenBucketRateLimiter;\n private readonly batchLimiter: TokenBucketRateLimiter;\n private readonly buyboxLimiter: TokenBucketRateLimiter;\n private readonly writeLimiter: TokenBucketRateLimiter;\n private readonly deleteLimiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n options: {\n filterLimiter?: TokenBucketRateLimiter;\n batchLimiter?: TokenBucketRateLimiter;\n buyboxLimiter?: TokenBucketRateLimiter;\n writeLimiter?: TokenBucketRateLimiter;\n deleteLimiter?: TokenBucketRateLimiter;\n } = {},\n ) {\n this.filterLimiter =\n options.filterLimiter ?? new TokenBucketRateLimiter({ capacity: 2000, intervalMs: 60_000 });\n this.batchLimiter =\n options.batchLimiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n this.buyboxLimiter =\n options.buyboxLimiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n this.writeLimiter =\n options.writeLimiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n this.deleteLimiter =\n options.deleteLimiter ??\n new TokenBucketRateLimiter({ capacity: DELETE_RATE_PER_MIN, intervalMs: 60_000 });\n }\n\n private validateBarcodes(barcodes: string[], methodLabel: string): void {\n if (!Array.isArray(barcodes) || barcodes.length === 0) {\n throw new ValidationError({ message: `${methodLabel}: barcodes must not be empty` });\n }\n if (barcodes.length > MAX_WRITE_ITEMS) {\n throw new ValidationError({\n message: `${methodLabel}: max ${MAX_WRITE_ITEMS} barcodes per call (got ${barcodes.length})`,\n });\n }\n }\n\n private async submitWrite<T>(\n endpoint: string,\n items: T[],\n methodLabel: string,\n ): Promise<BatchAcceptedResponse> {\n if (!Array.isArray(items) || items.length === 0) {\n throw new ValidationError({ message: `${methodLabel}: items must not be empty` });\n }\n if (items.length > MAX_WRITE_ITEMS) {\n throw new ValidationError({\n message: `${methodLabel}: max ${MAX_WRITE_ITEMS} items per call (got ${items.length})`,\n });\n }\n const data = await this.transport.request<BatchAcceptedResponse>({\n method: 'POST',\n path: `/integration/product/sellers/${this.transport.sellerId}${endpoint}`,\n body: { items },\n rateLimiter: this.writeLimiter,\n });\n return { batchRequestId: data?.batchRequestId ?? '' };\n }\n\n /**\n * List approved products. Use `paginate()` from `@lonca/core` to iterate\n * lazily across pages.\n *\n * Trendyol exposes both page-based and `nextPageToken`-based pagination\n * (the latter required when the dataset exceeds 10,000 items). The SDK\n * picks the right strategy automatically — pass our opaque `cursor` from\n * the previous response and we forward it as `nextPageToken`.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const product of paginate((p) => client.products.list(p))) {\n * for (const variant of product.variants) {\n * console.log(variant.barcode, product.title);\n * }\n * }\n * ```\n */\n async list(params: ListProductsParams = {}): Promise<CursorPage<Product>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);\n const query: Record<string, string | number | undefined> = { size };\n if (params.cursor) {\n query.nextPageToken = params.cursor;\n } else {\n query.page = 0;\n }\n if (params.barcode) query.barcode = params.barcode;\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n\n const data = await this.transport.request<TrendyolFilterResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/approved`,\n query,\n rateLimiter: this.filterLimiter,\n });\n\n const items = (data.content ?? []).map(normalizeProduct);\n const page: CursorPage<Product> = { items };\n if (data.nextPageToken) {\n page.nextCursor = data.nextPageToken;\n }\n return page;\n }\n\n /**\n * List **stock and price** for approved products — Trendyol's lightweight\n * `inventory-and-price` filter. A slim alternative to {@link list} when you\n * only need pricing + stock: the response carries `contentId`,\n * `productMainId`, and a `variants[]` array with `barcode`, `salePrice`,\n * `listPrice`, `quantity`, `stockCode`, and `stockLastModifiedAt` — nothing\n * else.\n *\n * Filter by `barcode`, `contentId`, `stockCode`, `productMainId`, or listing\n * `status`. Sort with `orderByDirection` (`SellerCreatedDate`). `size` caps\n * at **100** here (tighter than `list`'s 1000).\n *\n * Pagination follows the same convention as {@link list}: pass our opaque\n * `cursor` from the previous response and we forward it as `nextPageToken`\n * (required once the dataset exceeds 10,000 items).\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const p of paginate((q) =>\n * client.products.listInventoryAndPrice({ ...q, status: 'onSale' }),\n * )) {\n * for (const v of p.variants) {\n * console.log(v.barcode, v.quantity, v.salePrice);\n * }\n * }\n * ```\n */\n async listInventoryAndPrice(\n params: ListInventoryAndPriceParams = {},\n ): Promise<CursorPage<ProductStockPrice>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_INVENTORY_PAGE_SIZE);\n const query: Record<string, string | number | undefined> = { size };\n if (params.cursor) {\n query.nextPageToken = params.cursor;\n } else {\n query.page = 0;\n }\n if (params.barcode) query.barcode = params.barcode;\n if (params.contentId) query.contentId = params.contentId;\n if (params.stockCode) query.stockCode = params.stockCode;\n if (params.productMainId) query.productMainId = params.productMainId;\n if (params.status) query.status = params.status;\n if (params.orderByDirection) query.orderByDirection = params.orderByDirection;\n\n const headers = params.storeFrontCode ? { storeFrontCode: params.storeFrontCode } : undefined;\n\n const data = await this.transport.request<TrendyolStockPriceResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/approved/inventory-and-price`,\n query,\n headers,\n rateLimiter: this.filterLimiter,\n });\n\n const items = (data.content ?? []).map(normalizeStockPrice);\n const page: CursorPage<ProductStockPrice> = { items };\n if (data.nextPageToken) {\n page.nextCursor = data.nextPageToken;\n }\n return page;\n }\n\n /**\n * Poll a batch request returned by an async write (e.g. `createProducts`,\n * `updatePriceAndInventory`).\n *\n * Trendyol retains batch results for **4 hours** after the originating\n * request — poll within that window.\n *\n * @param batchRequestId The opaque ID returned by the originating call.\n */\n async getBatchStatus(batchRequestId: string): Promise<BatchRequestResult> {\n const id = encodeURIComponent(batchRequestId);\n const data = await this.transport.request<TrendyolBatchResultResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/batch-requests/${id}`,\n rateLimiter: this.batchLimiter,\n });\n return normalizeBatchResult(data);\n }\n\n /**\n * List **unapproved** (draft / rejected / pending-review) products.\n *\n * Wire shape is intentionally flatter than the approved-product shape:\n * each barcode is one top-level item with `barcode`, `quantity`, `salePrice`\n * etc. at the root. Rejected drafts carry `rejectReasonDetails` so you can\n * surface why Trendyol's content team turned them down.\n *\n * Pagination follows the same convention as `list()`: `cursor` from the\n * previous response forwards as `nextPageToken`.\n *\n * @example\n * ```ts\n * const page = await client.products.listUnapproved({ limit: 50 });\n * for (const draft of page.items) {\n * if (draft.status === 'rejected') {\n * console.warn(draft.barcode, draft.rejectReasonDetails);\n * }\n * }\n * ```\n */\n async listUnapproved(\n params: ListUnapprovedProductsParams = {},\n ): Promise<CursorPage<UnapprovedProduct>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);\n const query: Record<string, string | number | undefined> = { size };\n if (params.cursor) {\n query.nextPageToken = params.cursor;\n } else {\n query.page = 0;\n }\n if (params.barcode) query.barcode = params.barcode;\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n if (params.dateQueryType) query.dateQueryType = params.dateQueryType;\n if (params.supplierId !== undefined) query.supplierId = params.supplierId;\n\n const data = await this.transport.request<TrendyolUnapprovedResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/unapproved`,\n query,\n rateLimiter: this.filterLimiter,\n });\n\n const items = (data.content ?? []).map(normalizeUnapproved);\n const page: CursorPage<UnapprovedProduct> = { items };\n if (data.nextPageToken) {\n page.nextCursor = data.nextPageToken;\n }\n return page;\n }\n\n /**\n * Fetch the basic lifecycle status of a single product by barcode.\n *\n * Cheap and useful as a polling primitive after `createProducts`: poll\n * this endpoint until `approved` flips to `true` (or use\n * `client.products.getBatchStatus()` to track the originating batch).\n *\n * @param barcode The product barcode to look up.\n */\n async getBase(barcode: string): Promise<ProductBase> {\n const code = encodeURIComponent(barcode);\n const data = await this.transport.request<TrendyolProductBaseResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.transport.sellerId}/product/${code}`,\n rateLimiter: this.filterLimiter,\n });\n return normalizeProductBase(data);\n }\n\n /**\n * Fetch buybox information for up to 10 barcodes in one call.\n *\n * Returns rank (`buyboxOrder === 1` means you hold the buybox), the\n * current buybox price, and — beyond the spec — the second and third\n * competing prices when other sellers are present.\n *\n * @param barcodes 1–10 product barcodes.\n * @throws {ValidationError} when `barcodes` is empty or longer than 10.\n */\n async getBuyboxInfo(barcodes: string[]): Promise<BuyboxInfo[]> {\n if (!Array.isArray(barcodes) || barcodes.length === 0) {\n throw new ValidationError({\n message: 'getBuyboxInfo: barcodes must be a non-empty array',\n });\n }\n if (barcodes.length > MAX_BUYBOX_BARCODES) {\n throw new ValidationError({\n message: `getBuyboxInfo: max ${MAX_BUYBOX_BARCODES} barcodes per call (got ${barcodes.length})`,\n });\n }\n\n const data = await this.transport.request<TrendyolBuyboxResponse>({\n method: 'POST',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/buybox-information`,\n body: { barcodes },\n rateLimiter: this.buyboxLimiter,\n });\n\n const list = data.buyboxInfo ?? data.content ?? [];\n return list.map(normalizeBuyboxInfo);\n }\n\n /**\n * Create products (V2). Async batch — returns a `batchRequestId` you can\n * poll with `getBatchStatus`. Max 1000 items per call.\n *\n * Trendyol requires the full V2 attribute payload — fetch via\n * `categories.getAttributes` (and `categories.getAttributeValues` for\n * values when `allowCustom === false`). Shipment / returning warehouse\n * IDs come from `suppliers.getAddresses`.\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n */\n async create(items: CreateProductV2Input[]): Promise<BatchAcceptedResponse> {\n return this.submitWrite('/v2/products', items, 'createProducts');\n }\n\n /**\n * Update **content** of approved products (title, description, images,\n * attributes). Identified by `contentId`. Partial update is supported\n * except for attributes — if you update ANY attribute, send ALL of them.\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n */\n async updateContent(items: UpdateContentInput[]): Promise<BatchAcceptedResponse> {\n return this.submitWrite('/products/content-bulk-update', items, 'updateContent');\n }\n\n /**\n * Update **variant** fields of approved products (stockCode, vatRate,\n * dimensionalWeight, warehouse IDs, location-based delivery, lot). Identified\n * by `barcode`. The barcode itself cannot be changed via this endpoint.\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n */\n async updateVariants(items: UpdateVariantInput[]): Promise<BatchAcceptedResponse> {\n return this.submitWrite('/products/variant-bulk-update', items, 'updateVariants');\n }\n\n /**\n * Update **unapproved** (draft) products. Identified by `barcode`. All\n * other fields are optional partial updates. Use this to fix drafts that\n * Trendyol rejected — `client.products.listUnapproved` surfaces the\n * `rejectReasonDetails` you need to act on.\n *\n * **Gotcha (verified live STAGE 2026-05-25):** Trendyol's V2 spec claims\n * only `barcode` is required, but the endpoint returns HTTP 500\n * (`TrendyolSystemException` / `TypeError`) when too many optional fields\n * are omitted. In practice, send at least `title`, `description`,\n * `productMainId`, `brandId`, `categoryId`, `stockCode`,\n * `dimensionalWeight`, `vatRate`, `images[]`, and `attributes[]` (an\n * empty array is OK for the latter). The SDK forwards your payload\n * as-is; trim fields only if you have verified the server accepts it.\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n */\n async updateUnapproved(items: UpdateUnapprovedInput[]): Promise<BatchAcceptedResponse> {\n return this.submitWrite('/products/unapproved-bulk-update', items, 'updateUnapproved');\n }\n\n /**\n * Update product **delivery information** (deliveryDuration,\n * fastDeliveryType). Identified by `barcode`.\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n */\n async updateDeliveryInfo(items: UpdateDeliveryInfoInput[]): Promise<BatchAcceptedResponse> {\n return this.submitWrite('/products/delivery-info-bulk-update', items, 'updateDeliveryInfo');\n }\n\n /**\n * Delete products by barcode. Trendyol allows deletion of unapproved\n * products and approved products that have been archived for more than a\n * day (and have not been sales-stopped by Trendyol).\n *\n * Async batch — returns `{ batchRequestId }` to poll via `getBatchStatus`.\n * Separately rate-limited at **100 req/min** (much tighter than create/update).\n *\n * @param barcodes 1–1000 barcodes.\n * @throws {ValidationError} when `barcodes` is empty or longer than 1000.\n */\n async delete(barcodes: string[]): Promise<BatchAcceptedResponse> {\n this.validateBarcodes(barcodes, 'delete');\n const data = await this.transport.request<BatchAcceptedResponse>({\n method: 'DELETE',\n path: `/integration/product/sellers/${this.transport.sellerId}/products`,\n body: { items: barcodes.map((barcode) => ({ barcode })) },\n rateLimiter: this.deleteLimiter,\n });\n return { batchRequestId: data?.batchRequestId ?? '' };\n }\n\n /**\n * Archive products by barcode (Trendyol's `archived=true` state).\n * Archived products are not visible to customers; pair with `delete`\n * after the 24-hour archive cool-down to remove them entirely.\n *\n * Async batch — returns `{ batchRequestId }`.\n *\n * @throws {ValidationError} when `barcodes` is empty or longer than 1000.\n */\n async archive(barcodes: string[]): Promise<BatchAcceptedResponse> {\n return this.setArchivedState(barcodes, true, 'archive');\n }\n\n /**\n * Unarchive products by barcode (Trendyol's `archived=false` state).\n * Restores visibility for previously-archived products.\n *\n * @throws {ValidationError} when `barcodes` is empty or longer than 1000.\n */\n async unarchive(barcodes: string[]): Promise<BatchAcceptedResponse> {\n return this.setArchivedState(barcodes, false, 'unarchive');\n }\n\n private async setArchivedState(\n barcodes: string[],\n archived: boolean,\n methodLabel: string,\n ): Promise<BatchAcceptedResponse> {\n this.validateBarcodes(barcodes, methodLabel);\n const data = await this.transport.request<BatchAcceptedResponse>({\n method: 'PUT',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/archive-state`,\n body: { items: barcodes.map((barcode) => ({ barcode, archived })) },\n rateLimiter: this.writeLimiter,\n });\n return { batchRequestId: data?.batchRequestId ?? '' };\n }\n\n /**\n * Unlock products whose sale was paused by Trendyol due to pricing\n * issues (under/over-pricing, critical price error, supplier issues).\n * Restores selling status for the listed barcodes.\n *\n * Async batch — returns `{ batchRequestId }`.\n *\n * @throws {ValidationError} when `barcodes` is empty or longer than 1000.\n */\n async unlock(barcodes: string[]): Promise<BatchAcceptedResponse> {\n this.validateBarcodes(barcodes, 'unlock');\n const data = await this.transport.request<BatchAcceptedResponse>({\n method: 'PUT',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/unlock`,\n body: { items: barcodes.map((barcode) => ({ barcode })) },\n rateLimiter: this.writeLimiter,\n });\n return { batchRequestId: data?.batchRequestId ?? '' };\n }\n}\n","import { TokenBucketRateLimiter, ValidationError, type CursorPage } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n ListQuestionsParams,\n Question,\n QuestionAnswer,\n QuestionStatus,\n} from '../types/question.js';\n\nfunction toIso(epochMs: number | undefined): string | undefined {\n if (typeof epochMs !== 'number' || !Number.isFinite(epochMs) || epochMs === 0) {\n return undefined;\n }\n return new Date(epochMs).toISOString();\n}\n\ninterface WireAnswer {\n text?: string;\n creationDate?: number;\n status?: string;\n}\n\ninterface WireQuestion {\n id?: number | string;\n text?: string;\n customerId?: number | string;\n userName?: string;\n showUserName?: boolean;\n status?: string;\n public?: boolean;\n productMainId?: string;\n productName?: string;\n imageUrl?: string;\n webUrl?: string;\n creationDate?: number;\n answeredDateMessage?: string;\n answer?: WireAnswer;\n rejectedAnswer?: WireAnswer;\n rejectedDate?: number;\n reason?: string;\n reportReason?: string;\n reportedDate?: number;\n [key: string]: unknown;\n}\n\nfunction normalizeAnswer(a: WireAnswer | undefined): QuestionAnswer | undefined {\n if (!a) return undefined;\n const out: QuestionAnswer = {};\n if (a.text !== undefined) out.text = a.text;\n const createdAt = toIso(a.creationDate);\n if (createdAt) out.createdAt = createdAt;\n if (a.status !== undefined) out.status = a.status;\n return out;\n}\n\nfunction normalizeQuestion(node: WireQuestion): Question {\n const out: Question = {\n id: node.id !== undefined ? String(node.id) : '',\n raw: node as Record<string, unknown>,\n };\n if (node.text !== undefined) out.text = node.text;\n if (node.customerId !== undefined) out.customerId = String(node.customerId);\n if (node.userName !== undefined) out.userName = node.userName;\n if (typeof node.showUserName === 'boolean') out.showUserName = node.showUserName;\n if (node.status !== undefined) out.status = node.status as QuestionStatus;\n if (typeof node.public === 'boolean') out.public = node.public;\n if (node.productMainId !== undefined) out.productMainId = node.productMainId;\n if (node.productName !== undefined) out.productName = node.productName;\n if (node.imageUrl !== undefined) out.imageUrl = node.imageUrl;\n if (node.webUrl !== undefined) out.webUrl = node.webUrl;\n const createdAt = toIso(node.creationDate);\n if (createdAt) out.createdAt = createdAt;\n if (node.answeredDateMessage !== undefined) out.answeredDateMessage = node.answeredDateMessage;\n const answer = normalizeAnswer(node.answer);\n if (answer) out.answer = answer;\n const rejectedAnswer = normalizeAnswer(node.rejectedAnswer);\n if (rejectedAnswer) out.rejectedAnswer = rejectedAnswer;\n const rejectedAt = toIso(node.rejectedDate);\n if (rejectedAt) out.rejectedAt = rejectedAt;\n if (node.reason !== undefined) out.reason = node.reason;\n if (node.reportReason !== undefined) out.reportReason = node.reportReason;\n const reportedAt = toIso(node.reportedDate);\n if (reportedAt) out.reportedAt = reportedAt;\n return out;\n}\n\n/**\n * Trendyol customer Q&A management. Customers post product questions on\n * Trendyol; sellers reply with `questions.answer()`.\n */\nexport class QuestionsResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 500, intervalMs: 60_000 });\n }\n\n /** Fetch a single question by its numeric ID. */\n async get(questionId: string | number): Promise<Question> {\n const data = await this.transport.request<WireQuestion>({\n method: 'GET',\n path: `/integration/qna/sellers/${this.transport.sellerId}/questions/${encodeURIComponent(String(questionId))}`,\n rateLimiter: this.limiter,\n });\n return normalizeQuestion(data);\n }\n\n /**\n * Filter questions by barcode / date range / status. Page-based\n * pagination internally; SDK exposes the opaque-cursor convention.\n */\n async list(params: ListQuestionsParams = {}): Promise<CursorPage<Question>> {\n const size = Math.min(params.limit ?? 50, 200);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n const query: Record<string, string | number | undefined> = { page, size };\n if (params.barcode) query.barcode = params.barcode;\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n if (params.status) query.status = params.status;\n\n interface WireResponse {\n totalElements?: number;\n totalPages?: number;\n content?: WireQuestion[];\n }\n const data = await this.transport.request<WireResponse>({\n method: 'GET',\n path: `/integration/qna/sellers/${this.transport.sellerId}/questions/filter`,\n query,\n rateLimiter: this.limiter,\n });\n\n const items = (data.content ?? []).map(normalizeQuestion);\n const result: CursorPage<Question> = { items };\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n /**\n * Reply to a question. Trendyol enforces 10–2000 characters on the\n * answer text; the SDK pre-validates client-side.\n *\n * @throws {ValidationError} when `text` is outside the 10–2000 char range.\n */\n async answer(questionId: string | number, text: string): Promise<unknown> {\n if (typeof text !== 'string' || text.length < 10) {\n throw new ValidationError({\n message: `questions.answer: text must be at least 10 chars (got ${text?.length ?? 0})`,\n });\n }\n if (text.length > 2000) {\n throw new ValidationError({\n message: `questions.answer: text must be at most 2000 chars (got ${text.length})`,\n });\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/qna/sellers/${this.transport.sellerId}/questions/${encodeURIComponent(String(questionId))}/answers`,\n body: { text },\n rateLimiter: this.limiter,\n });\n }\n}\n","import { TokenBucketRateLimiter } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { SupplierAddress, SupplierAddressType } from '../types/supplier-address.js';\n\ninterface TrendyolSupplierAddressNode {\n id: number;\n name?: string;\n addressType?: string;\n isShipmentAddress?: boolean;\n isReturningAddress?: boolean;\n isInvoiceAddress?: boolean;\n isDefault?: boolean;\n address?: string;\n city?: string;\n district?: string;\n postCode?: string;\n fullName?: string;\n}\n\ninterface TrendyolSupplierAddressesResponse {\n supplierAddresses: TrendyolSupplierAddressNode[];\n}\n\nconst VALID_TYPES: ReadonlySet<SupplierAddressType> = new Set([\n 'SHIPMENT',\n 'RETURNING',\n 'INVOICE',\n 'WAREHOUSE',\n]);\n\nfunction normalizeAddressType(raw: string | undefined): SupplierAddressType {\n if (raw && VALID_TYPES.has(raw as SupplierAddressType)) {\n return raw as SupplierAddressType;\n }\n // Trendyol historically used suffixes like \"_ADDRESS\" — strip and re-check.\n const stripped = raw?.replace(/_ADDRESS$/, '');\n if (stripped && VALID_TYPES.has(stripped as SupplierAddressType)) {\n return stripped as SupplierAddressType;\n }\n return 'SHIPMENT';\n}\n\nfunction normalizeAddress(node: TrendyolSupplierAddressNode): SupplierAddress {\n return {\n id: String(node.id),\n name: node.name,\n addressType: normalizeAddressType(node.addressType),\n isShipmentAddress: node.isShipmentAddress ?? false,\n isReturningAddress: node.isReturningAddress ?? false,\n isInvoiceAddress: node.isInvoiceAddress ?? false,\n isDefault: node.isDefault ?? false,\n address: node.address,\n city: node.city,\n district: node.district,\n postCode: node.postCode,\n fullName: node.fullName,\n };\n}\n\n/** Default cache TTL: 1 hour, matching Trendyol's `1 req/hour` service limit. */\nconst DEFAULT_CACHE_TTL_MS = 60 * 60 * 1000;\n\nexport interface SuppliersResourceOptions {\n /** Override the in-memory cache TTL. Defaults to 1 hour. */\n cacheTtlMs?: number;\n}\n\ninterface CacheEntry {\n value: SupplierAddress[];\n expiresAt: number;\n}\n\n/**\n * Trendyol supplier address endpoints.\n *\n * **Critical:** Trendyol rate-limits `getSuppliersAddresses` to **1 request\n * per hour per seller**. This resource therefore wraps the endpoint with an\n * in-memory cache (default TTL: 1 hour) so callers can request addresses\n * as often as needed without tripping the limit.\n *\n * Use `{ forceRefresh: true }` or `invalidateCache()` only when you know the\n * address list changed in the Partner Panel.\n */\nexport class SuppliersResource {\n private cache: CacheEntry | null = null;\n private readonly cacheTtlMs: number;\n private readonly limiter: TokenBucketRateLimiter;\n private inflight: Promise<SupplierAddress[]> | null = null;\n\n constructor(\n private readonly transport: TrendyolTransport,\n options: SuppliersResourceOptions = {},\n ) {\n this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n this.limiter = new TokenBucketRateLimiter({\n capacity: 1,\n intervalMs: DEFAULT_CACHE_TTL_MS,\n });\n }\n\n /**\n * List the seller's registered addresses (shipment, returning, invoice, warehouse).\n *\n * Returns the cached value if it is still fresh. Concurrent calls share a\n * single in-flight request.\n */\n async getAddresses(options: { forceRefresh?: boolean } = {}): Promise<SupplierAddress[]> {\n if (!options.forceRefresh && this.cache && this.cache.expiresAt > Date.now()) {\n return this.cache.value;\n }\n if (this.inflight) return this.inflight;\n\n this.inflight = this.fetchFresh().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n /** Drop the cache; the next `getAddresses()` call hits the API. */\n invalidateCache(): void {\n this.cache = null;\n }\n\n private async fetchFresh(): Promise<SupplierAddress[]> {\n const data = await this.transport.request<TrendyolSupplierAddressesResponse>({\n method: 'GET',\n path: `/integration/sellers/${this.transport.sellerId}/addresses`,\n rateLimiter: this.limiter,\n });\n const items = data.supplierAddresses.map(normalizeAddress);\n this.cache = { value: items, expiresAt: Date.now() + this.cacheTtlMs };\n return items;\n }\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { CreateTestOrderInput, TestOrderStatus } from '../types/misc.js';\n\n/**\n * STAGE-only helper endpoints for creating + driving test orders /\n * test claims through their state machine. **Do not use in PROD** —\n * Trendyol's test endpoints are scoped to the test environment.\n */\nexport class TestOrdersResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 60, intervalMs: 60_000 });\n }\n\n /**\n * Create a test order with the given customer / addresses / lines. The\n * SDK forwards the typed payload verbatim — drill into Trendyol's\n * `createTestOrder` doc for inner field rules.\n *\n * @throws {ValidationError} when required top-level fields are missing.\n */\n async create(input: CreateTestOrderInput): Promise<unknown> {\n for (const k of ['customer', 'invoiceAddress', 'shippingAddress', 'seller', 'lines']) {\n if (!input?.[k]) {\n throw new ValidationError({ message: `testOrders.create: ${k} is required` });\n }\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/test/order/orders/core`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /** Push a test shipment package to the given status. */\n async updateStatus(packageId: string | number, status: TestOrderStatus): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'PUT',\n path: `/integration/test/order/sellers/${this.transport.sellerId}/shipment-packages/${encodeURIComponent(String(packageId))}/status`,\n body: { status },\n rateLimiter: this.limiter,\n });\n }\n\n /** Move test claims to the `WaitingInAction` state. */\n async setClaimsWaitingInAction(): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'PUT',\n path: `/integration/test/order/sellers/${this.transport.sellerId}/claims/waiting-in-action`,\n rateLimiter: this.limiter,\n });\n }\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { CreateVideoInput, ListVideosParams, SellerVideo } from '../types/video.js';\n\n/**\n * Trendyol Video API (`seller-integration-video-api`) — product video\n * uploads. Upload happens server-side from a URL the seller provides;\n * the SDK exposes the create + list endpoints.\n *\n * Base path: `/integration/video/sellers/{sellerId}/videos`.\n * Trendyol publishes per-endpoint rate limits — `create` at 200 req/min,\n * `list` at 1000 req/min — which the SDK provisions as two separate\n * token buckets so listing doesn't exhaust the create budget.\n */\nexport class VideosResource {\n private readonly createLimiter: TokenBucketRateLimiter;\n private readonly listLimiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n options: {\n createLimiter?: TokenBucketRateLimiter;\n listLimiter?: TokenBucketRateLimiter;\n } = {},\n ) {\n this.createLimiter =\n options.createLimiter ?? new TokenBucketRateLimiter({ capacity: 200, intervalMs: 60_000 });\n this.listLimiter =\n options.listLimiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n }\n\n /**\n * Queue a video for upload. Trendyol downloads from the URL in the\n * body asynchronously; poll `list()` (filtered by id) for status.\n *\n * @throws {ValidationError} when `input` is empty / not an object.\n */\n async create(input: CreateVideoInput): Promise<unknown> {\n if (!input || typeof input !== 'object') {\n throw new ValidationError({ message: 'videos.create: input is required' });\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/video/sellers/${this.transport.sellerId}/videos`,\n body: input,\n rateLimiter: this.createLimiter,\n });\n }\n\n /** List the seller's integration videos (optionally filtered by id / status). */\n async list(params: ListVideosParams = {}): Promise<SellerVideo[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/video/sellers/${this.transport.sellerId}/videos`,\n query: {\n id: params.id,\n sellerIntegrationStatus: params.sellerIntegrationStatus,\n page: params.offset,\n size: params.limit,\n },\n rateLimiter: this.listLimiter,\n });\n const rows = Array.isArray(data)\n ? data\n : Array.isArray((data as { content?: unknown[] })?.content)\n ? (data as { content: unknown[] }).content\n : Array.isArray((data as { items?: unknown[] })?.items)\n ? (data as { items: unknown[] }).items\n : [];\n return rows.map((r) => {\n const row = (r ?? {}) as Record<string, unknown>;\n const out: SellerVideo = { raw: row };\n if (typeof row.id === 'string') out.id = row.id;\n if (typeof row.status === 'string') out.status = row.status as SellerVideo['status'];\n return out;\n });\n }\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { Webhook, WebhookInput } from '../types/webhook.js';\n\n/** Trendyol caps webhook subscriptions per seller. */\nconst MAX_WEBHOOKS_PER_SELLER = 15;\n\ninterface WireWebhook {\n id?: string | number;\n url?: string;\n authenticationType?: 'BASIC_AUTHENTICATION' | 'API_KEY';\n username?: string;\n apiKey?: string;\n subscribedStatuses?: string[];\n active?: boolean;\n isActive?: boolean;\n status?: string;\n [key: string]: unknown;\n}\n\nfunction normalizeWebhook(node: WireWebhook): Webhook {\n const out: Webhook = {\n id: node.id !== undefined ? String(node.id) : '',\n raw: node as Record<string, unknown>,\n };\n if (node.url !== undefined) out.url = node.url;\n if (node.authenticationType !== undefined) out.authenticationType = node.authenticationType;\n if (node.username !== undefined) out.username = node.username;\n if (node.apiKey !== undefined) out.apiKey = node.apiKey;\n if (node.subscribedStatuses !== undefined) out.subscribedStatuses = node.subscribedStatuses;\n // Trendyol's active flag has been seen as `active`, `isActive`, or `status: 'ACTIVE'` —\n // accept all defensively until we observe a single stable shape.\n if (typeof node.active === 'boolean') out.active = node.active;\n else if (typeof node.isActive === 'boolean') out.active = node.isActive;\n else if (typeof node.status === 'string') out.active = node.status.toUpperCase() === 'ACTIVE';\n return out;\n}\n\n/**\n * Trendyol webhook subscription management.\n *\n * Max **15 active webhooks per seller** (Trendyol-enforced). Webhooks\n * fire on shipment-package status events only — there is no webhook\n * support for product / stock changes.\n *\n * Trendyol's gateway authenticates **against your endpoint** with the\n * `authenticationType` you configure. Pick `API_KEY` over\n * `BASIC_AUTHENTICATION` so you can rotate the secret without redeploying.\n *\n * No HMAC signature — security relies entirely on the auth method you\n * pick + the secret you store with Trendyol.\n */\nexport class WebhooksResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 50, intervalMs: 60_000 });\n }\n\n /**\n * Create a new webhook subscription. Trendyol caps subscriptions at 15\n * per seller — the SDK does NOT pre-check (you'd need to call `list()`\n * first), but Trendyol returns 400 when the cap is exceeded.\n *\n * @throws {ValidationError} when `url` or `authenticationType` is missing.\n */\n async create(input: WebhookInput): Promise<unknown> {\n this.validateInput(input, 'create');\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/sellers/${this.transport.sellerId}/webhooks`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /** List all registered webhook subscriptions. */\n async list(): Promise<Webhook[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/sellers/${this.transport.sellerId}/webhooks`,\n rateLimiter: this.limiter,\n });\n const rows = Array.isArray(data)\n ? data\n : Array.isArray((data as { webhooks?: unknown[] })?.webhooks)\n ? (data as { webhooks: unknown[] }).webhooks\n : Array.isArray((data as { content?: unknown[] })?.content)\n ? (data as { content: unknown[] }).content\n : [];\n return rows.map((r) => normalizeWebhook(r as WireWebhook));\n }\n\n /**\n * Update a webhook subscription. Same input shape as `create`; replaces\n * the whole subscription (Trendyol does NOT partially update).\n */\n async update(webhookId: string | number, input: WebhookInput): Promise<unknown> {\n this.validateInput(input, 'update');\n return this.transport.request<unknown>({\n method: 'PUT',\n path: this.webhookPath(webhookId),\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /** Permanently delete a webhook subscription. */\n async delete(webhookId: string | number): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'DELETE',\n path: this.webhookPath(webhookId),\n rateLimiter: this.limiter,\n });\n }\n\n /** Re-activate a previously-deactivated webhook subscription. */\n async activate(webhookId: string | number): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.webhookPath(webhookId)}/activate`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Deactivate a webhook subscription. Trendyol automatically deactivates\n * a subscription after persistent delivery failures (and sends 2 emails);\n * use `activate()` to bring it back online once your endpoint is healthy.\n */\n async deactivate(webhookId: string | number): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.webhookPath(webhookId)}/deactivate`,\n rateLimiter: this.limiter,\n });\n }\n\n private validateInput(input: WebhookInput, method: string): void {\n if (!input?.url || typeof input.url !== 'string') {\n throw new ValidationError({ message: `webhooks.${method}: url is required` });\n }\n if (\n input.authenticationType !== 'BASIC_AUTHENTICATION' &&\n input.authenticationType !== 'API_KEY'\n ) {\n throw new ValidationError({\n message: `webhooks.${method}: authenticationType must be 'BASIC_AUTHENTICATION' or 'API_KEY'`,\n });\n }\n if (input.authenticationType === 'BASIC_AUTHENTICATION') {\n if (!input.username || !input.password) {\n throw new ValidationError({\n message: `webhooks.${method}: BASIC_AUTHENTICATION requires username + password`,\n });\n }\n } else if (!input.apiKey) {\n throw new ValidationError({\n message: `webhooks.${method}: API_KEY requires apiKey`,\n });\n }\n if (input.subscribedStatuses && input.subscribedStatuses.length === 0) {\n // empty array is fine on Trendyol's side (treated as \"all\"), so no throw —\n // just a comment for readers.\n }\n // Soft check: surface Trendyol's 15-cap via JSDoc; not pre-checked here\n // because doing so would require an extra round-trip.\n void MAX_WEBHOOKS_PER_SELLER;\n }\n\n private webhookPath(webhookId: string | number): string {\n return `/integration/sellers/${this.transport.sellerId}/webhooks/${encodeURIComponent(String(webhookId))}`;\n }\n}\n","import type { MarketplaceCapabilities } from '@lonca/core';\n\n/**\n * Static feature-capability flags for the Trendyol marketplace, so consumers\n * can feature-detect instead of hard-coding marketplace quirks. Read them off\n * a client as `client.capabilities`.\n *\n * The flag *values* are marketplace-specific, but the const `satisfies` the\n * shared {@link MarketplaceCapabilities} contract so the key set can't drift\n * from the Hepsiburada SDK without a compile error. Kept `as const` so the\n * literal `true`/`false` values stay narrowed.\n */\nexport const trendyolCapabilities = {\n /** Trendyol has no time-bounded / scheduled pricing (`pricings[]`). */\n scheduledPricing: false,\n /** `inventory.update` accepts stock-only items (`quantity` with no price). */\n stockOnlyBatch: true,\n /** Products expose `updatedAt`, so last-write-wins guards are supported. */\n listingUpdatedAt: true,\n} as const satisfies MarketplaceCapabilities;\n\n/** Shape of {@link trendyolCapabilities}. */\nexport type TrendyolCapabilities = typeof trendyolCapabilities;\n","/** Build the HTTP Basic auth header value from Trendyol credentials. */\nexport function buildAuthHeader(apiKey: string, apiSecret: string): string {\n const token = Buffer.from(`${apiKey}:${apiSecret}`, 'utf8').toString('base64');\n return `Basic ${token}`;\n}\n\n/**\n * Build the `User-Agent` header value Trendyol expects.\n *\n * Per Trendyol's docs:\n * - Solo integrators: `\"<sellerId> - SelfIntegration\"`\n * - Integrator companies: `\"<sellerId> - <CompanyName>\"` (alphanumeric, max 30 chars)\n *\n * A missing or malformed `User-Agent` triggers HTTP 403.\n */\nexport function buildUserAgent(sellerId: number, integratorName: string): string {\n return `${sellerId} - ${integratorName}`;\n}\n","import {\n AuthError,\n LoncaError,\n type LoncaErrorIssue,\n normalizeIssueEntries,\n NotFoundError,\n parseRetryAfter,\n RateLimitError,\n ServerError,\n ValidationError,\n} from '@lonca/core';\n\n// Re-exported from `@lonca/core` so the transport (and existing imports) keep a\n// single, drift-free `Retry-After` parser shared with the Hepsiburada SDK.\nexport { parseRetryAfter };\n\n/**\n * Map a Trendyol HTTP response status to a `@lonca/core` error.\n *\n * - `401` → `AuthError` (bad credentials)\n * - `403` → `ValidationError` (usually missing/malformed `User-Agent` header, or wrong endpoint path)\n * - `404` → `NotFoundError`\n * - `429` → `RateLimitError` (carries `retryAfterMs` if the server provided `Retry-After`)\n * - `5xx` → `ServerError` (retryable)\n * - other → `LoncaError` with code `UNKNOWN` (non-retryable)\n */\nexport function mapHttpError(status: number, body: unknown, retryAfterMs?: number): LoncaError {\n const data = { body } as Record<string, unknown>;\n const issues = normalizeErrorIssues(body);\n switch (status) {\n case 401:\n return new AuthError({\n message: 'Trendyol authentication failed (check apiKey / apiSecret)',\n status,\n data,\n issues,\n });\n case 403:\n return new ValidationError({\n message: 'Trendyol forbidden (check User-Agent header or endpoint path)',\n status,\n data,\n issues,\n });\n case 404:\n return new NotFoundError({ message: 'Trendyol resource not found', status, data, issues });\n case 429:\n return new RateLimitError({\n message: 'Trendyol rate limit exceeded',\n status,\n retryAfterMs,\n data,\n issues,\n });\n case 500:\n case 502:\n case 503:\n case 504:\n return new ServerError({\n message: `Trendyol server error (${status})`,\n status,\n data,\n issues,\n });\n default:\n return new LoncaError({\n code: 'UNKNOWN',\n message: `Trendyol unexpected response (${status})`,\n status,\n data,\n issues,\n retryable: false,\n });\n }\n}\n\n/**\n * Normalize Trendyol's (inconsistent) error body into `LoncaErrorIssue[]`.\n * Trendyol returns either `{ errors: [{ field?, message }] }` or\n * `{ errors: [string] }`, sometimes nested under `{ body: { errors } }`.\n *\n * Only `{ field, code, message }` are copied — never the raw payload, which can\n * carry PII. The untouched body stays on `error.data` for debugging.\n */\nfunction normalizeErrorIssues(body: unknown): LoncaErrorIssue[] {\n const errors = extractErrorsArray(body);\n return errors ? normalizeIssueEntries(errors) : [];\n}\n\nfunction extractErrorsArray(body: unknown): unknown[] | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const b = body as Record<string, unknown>;\n if (Array.isArray(b.errors)) return b.errors;\n const nested = b.body;\n if (nested && typeof nested === 'object') {\n const n = nested as Record<string, unknown>;\n if (Array.isArray(n.errors)) return n.errors;\n }\n return undefined;\n}\n","import { createRequester, type BaseRequestOptions, type Logger } from '@lonca/core';\nimport { buildAuthHeader, buildUserAgent } from './auth.js';\nimport { mapHttpError } from './errors.js';\n\nconst BASE_URLS = {\n prod: 'https://apigw.trendyol.com',\n stage: 'https://stageapigw.trendyol.com',\n} as const;\n\nexport type TrendyolEnvironment = keyof typeof BASE_URLS;\n\nexport interface TransportConfig {\n sellerId: number;\n apiKey: string;\n apiSecret: string;\n env: TrendyolEnvironment;\n integratorName: string;\n clientIp?: string;\n logger?: Logger;\n /** Request timeout in ms. Default: 30_000. */\n timeoutMs?: number;\n /** Override the underlying `fetch` (tests inject a mock). */\n fetch?: typeof fetch;\n}\n\nexport interface RequestOptions extends BaseRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n /** Path beginning with `/` (e.g., `/sapigw/brands`). */\n path: string;\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nexport class TrendyolTransport {\n private readonly baseUrl: string;\n private readonly requester: <T>(opts: RequestOptions) => Promise<T>;\n\n constructor(private readonly config: TransportConfig) {\n this.baseUrl = BASE_URLS[config.env];\n this.requester = createRequester<RequestOptions>({\n fetch: config.fetch ?? fetch,\n logger: config.logger,\n timeoutMs: config.timeoutMs ?? 30_000,\n label: 'Trendyol',\n logPrefix: 'trendyol',\n buildUrl: (opts) => this.buildUrl(opts.path, opts.query),\n buildHeaders: (correlationId) => this.buildHeaders(correlationId),\n mapHttpError,\n });\n }\n\n /** Seller ID this transport is configured with. Resources read it for path-building. */\n get sellerId(): number {\n return this.config.sellerId;\n }\n\n request<T>(opts: RequestOptions): Promise<T> {\n return this.requester<T>(opts);\n }\n\n private buildUrl(path: string, query?: RequestOptions['query']): string {\n const url = new URL(path, this.baseUrl);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(correlationId: string): Record<string, string> {\n return {\n Authorization: buildAuthHeader(this.config.apiKey, this.config.apiSecret),\n 'x-clientip': this.config.clientIp ?? '127.0.0.1',\n 'x-correlationid': correlationId,\n 'x-agentname': this.config.integratorName,\n 'User-Agent': buildUserAgent(this.config.sellerId, this.config.integratorName),\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n}\n","import type { Logger } from '@lonca/core';\nimport { BrandsResource } from './resources/brands.js';\nimport { CategoriesResource } from './resources/categories.js';\nimport { ClaimsResource } from './resources/claims.js';\nimport { ExportCenterResource } from './resources/export-center.js';\nimport { FinanceResource } from './resources/finance.js';\nimport { InventoryResource } from './resources/inventory.js';\nimport { InvoicesResource } from './resources/invoices.js';\nimport { LabelsResource } from './resources/labels.js';\nimport { LocationsResource } from './resources/locations.js';\nimport { OrdersResource } from './resources/orders.js';\nimport { ProductsResource } from './resources/products.js';\nimport { QuestionsResource } from './resources/questions.js';\nimport { SuppliersResource } from './resources/suppliers.js';\nimport { TestOrdersResource } from './resources/test-orders.js';\nimport { VideosResource } from './resources/videos.js';\nimport { WebhooksResource } from './resources/webhooks.js';\nimport { trendyolCapabilities, type TrendyolCapabilities } from './capabilities.js';\nimport { TrendyolTransport, type TrendyolEnvironment } from './transport.js';\n\nexport interface CreateClientOptions {\n /** Trendyol seller (supplier) ID — visible in Partner Panel → Account Info. */\n sellerId: number;\n /** Trendyol API key. */\n apiKey: string;\n /** Trendyol API secret. */\n apiSecret: string;\n /** Which Trendyol environment to target. */\n env: TrendyolEnvironment;\n /**\n * Integrator company name to send in `User-Agent` / `x-agentname`. Required —\n * Trendyol uses this to attribute API traffic. Use `'SelfIntegration'` if\n * the seller owns the integration code, otherwise your company / product name.\n * Trendyol caps this at 30 alphanumeric characters.\n */\n integratorName: string;\n /**\n * IPv4 address to send in `x-clientip`.\n * Defaults to `'127.0.0.1'` — Trendyol does not validate this against the\n * request origin, the header just has to be present and IPv4-shaped.\n */\n clientIp?: string;\n /** Optional structured logger (`@lonca/core` `Logger`). Defaults to no-op. */\n logger?: Logger;\n /** Request timeout in ms. Default: 30_000. */\n timeoutMs?: number;\n}\n\nexport interface TrendyolClient {\n brands: BrandsResource;\n categories: CategoriesResource;\n suppliers: SuppliersResource;\n products: ProductsResource;\n inventory: InventoryResource;\n orders: OrdersResource;\n claims: ClaimsResource;\n webhooks: WebhooksResource;\n questions: QuestionsResource;\n invoices: InvoicesResource;\n finance: FinanceResource;\n labels: LabelsResource;\n testOrders: TestOrdersResource;\n locations: LocationsResource;\n exportCenter: ExportCenterResource;\n videos: VideosResource;\n /** Static feature-capability flags for feature detection. */\n capabilities: TrendyolCapabilities;\n}\n\n/**\n * Create a Trendyol Marketplace SDK client.\n *\n * @example\n * ```ts\n * import { createTrendyolClient } from '@lonca/trendyol';\n *\n * const client = createTrendyolClient({\n * sellerId: 12345,\n * apiKey: process.env.TRENDYOL_API_KEY!,\n * apiSecret: process.env.TRENDYOL_API_SECRET!,\n * env: 'stage',\n * });\n *\n * const page = await client.brands.list({ limit: 100 });\n * ```\n */\nexport function createTrendyolClient(opts: CreateClientOptions): TrendyolClient {\n const transport = new TrendyolTransport({\n sellerId: opts.sellerId,\n apiKey: opts.apiKey,\n apiSecret: opts.apiSecret,\n env: opts.env,\n integratorName: opts.integratorName,\n clientIp: opts.clientIp,\n logger: opts.logger,\n timeoutMs: opts.timeoutMs,\n });\n\n return buildClient(transport);\n}\n\n/**\n * Wire the full resource graph over a transport. Shared by\n * {@link createTrendyolClient} and the `@lonca/trendyol/testing` fake client so\n * both stay structurally identical. Not re-exported from the package entry.\n *\n * @internal\n */\nexport function buildClient(transport: TrendyolTransport): TrendyolClient {\n const products = new ProductsResource(transport);\n\n return {\n brands: new BrandsResource(transport),\n categories: new CategoriesResource(transport),\n suppliers: new SuppliersResource(transport),\n products,\n inventory: new InventoryResource(transport, (id) => products.getBatchStatus(id)),\n orders: new OrdersResource(transport),\n claims: new ClaimsResource(transport),\n webhooks: new WebhooksResource(transport),\n questions: new QuestionsResource(transport),\n invoices: new InvoicesResource(transport),\n finance: new FinanceResource(transport),\n labels: new LabelsResource(transport),\n testOrders: new TestOrdersResource(transport),\n locations: new LocationsResource(transport),\n exportCenter: new ExportCenterResource(transport),\n videos: new VideosResource(transport),\n capabilities: trendyolCapabilities,\n };\n}\n","import { buildClient, type TrendyolClient } from './client.js';\nimport { TrendyolTransport } from './transport.js';\nimport type { BatchRequestStatus } from './types/product.js';\n\n/** A request the fake client received, normalized for matching in a `handler`. */\nexport interface FakeTrendyolRequest {\n method: string;\n /** URL path only — no host, no query string. */\n path: string;\n /** Parsed query parameters. */\n query: URLSearchParams;\n /** Parsed JSON request body, when present. */\n body?: unknown;\n}\n\nexport interface TrendyolFakeSeed {\n /**\n * Return the raw JSON the Trendyol API would respond with for a request, or\n * `undefined` to fall through to the built-in hot-path defaults.\n */\n handler?: (req: FakeTrendyolRequest) => unknown;\n /** `batchRequestId` returned by `inventory.update` and echoed by `getBatchStatus`. Default: `'fake-batch-1'`. */\n batchRequestId?: string;\n /** Terminal status `getBatchStatus` reports. Default: `'COMPLETED'`. */\n batchStatus?: BatchRequestStatus;\n}\n\n/**\n * Build an in-memory {@link TrendyolClient} for unit tests.\n *\n * It is the real client graph wired over a fake `fetch`, so your tests exercise\n * the SDK's real request building and response normalization — no network, no\n * structural-compat guessing. The batch hot-path\n * (`inventory.update` → `products.getBatchStatus` → `inventory.updateAndWait`)\n * works out of the box; drive any other endpoint with `seed.handler`.\n *\n * @example\n * ```ts\n * const client = createFakeTrendyolClient({ batchRequestId: 'b1' });\n * const [result] = await client.inventory.updateAndWait(\n * [{ barcode: 'X', quantity: 1 }],\n * { pollIntervalMs: 1 },\n * );\n * result.status; // 'COMPLETED'\n * ```\n */\nexport function createFakeTrendyolClient(seed: TrendyolFakeSeed = {}): TrendyolClient {\n const batchRequestId = seed.batchRequestId ?? 'fake-batch-1';\n const batchStatus = seed.batchStatus ?? 'COMPLETED';\n\n const fakeFetch: typeof fetch = (input, init) => {\n const rawUrl =\n typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n const url = new URL(rawUrl);\n const req: FakeTrendyolRequest = {\n method: (init?.method ?? 'GET').toUpperCase(),\n path: url.pathname,\n query: url.searchParams,\n body: parseBody(init?.body),\n };\n\n const handled = seed.handler?.(req);\n const data =\n handled !== undefined ? handled : defaultResponse(req, batchRequestId, batchStatus);\n return Promise.resolve(jsonResponse(data));\n };\n\n const transport = new TrendyolTransport({\n sellerId: 1,\n apiKey: 'fake',\n apiSecret: 'fake',\n env: 'stage',\n integratorName: 'fake',\n fetch: fakeFetch,\n });\n\n return buildClient(transport);\n}\n\nfunction defaultResponse(\n req: FakeTrendyolRequest,\n batchRequestId: string,\n batchStatus: BatchRequestStatus,\n): unknown {\n if (req.method === 'POST' && req.path.endsWith('/products/price-and-inventory')) {\n return { batchRequestId };\n }\n if (req.method === 'GET' && req.path.includes('/products/batch-requests/')) {\n const id = decodeURIComponent(req.path.split('/').pop() ?? batchRequestId);\n return { batchRequestId: id, status: batchStatus, itemCount: 0, failedItemCount: 0, items: [] };\n }\n return {};\n}\n\nfunction parseBody(body: unknown): unknown {\n if (typeof body !== 'string') return undefined;\n try {\n return JSON.parse(body);\n } catch {\n return body;\n }\n}\n\nfunction jsonResponse(data: unknown): Response {\n return new Response(JSON.stringify(data), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/resources/brands.ts","../src/resources/categories.ts","../src/resources/claims.ts","../src/resources/export-center.ts","../src/resources/finance.ts","../src/resources/inventory.ts","../src/resources/invoices.ts","../src/resources/labels.ts","../src/resources/locations.ts","../src/resources/orders.ts","../src/resources/products.ts","../src/resources/questions.ts","../src/resources/suppliers.ts","../src/resources/test-orders.ts","../src/resources/videos.ts","../src/resources/webhooks.ts","../src/capabilities.ts","../src/auth.ts","../src/errors.ts","../src/transport.ts","../src/client.ts","../src/testing.ts"],"names":["TokenBucketRateLimiter","ValidationError","toIso","TimeoutError","ServerError","DEFAULT_PAGE_SIZE","normalizePackage","out","MAX_PAGE_SIZE","normalizeAttribute","normalizeAddress","AuthError","NotFoundError","RateLimitError","LoncaError","normalizeIssueEntries","n","createRequester"],"mappings":"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","file":"testing.cjs","sourcesContent":["import { TokenBucketRateLimiter, type CursorPage, type CursorPaginationParams } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { Brand } from '../types/brand.js';\n\n/**\n * Default page size when callers don't specify `limit`.\n *\n * NOTE: Trendyol's live API enforces a **minimum** page size of 1000 — any smaller\n * `limit` value is silently ignored server-side and you still receive ~1000 brands\n * per page. The `limit` parameter is kept on the SDK signature for forward\n * compatibility, but in practice you'll always receive 1000 per request.\n */\nconst DEFAULT_PAGE_SIZE = 1000;\n\ninterface TrendyolBrandListResponse {\n brands: Array<{ id: number; name: string }>;\n totalPages: number;\n totalElements: number;\n}\n\n/**\n * Trendyol brand-list endpoint group.\n *\n * Rate limit: 50 req/min (per Trendyol service limits).\n *\n * Trendyol uses page-based pagination internally; we expose the cursor-based\n * `CursorPage` shape from `@lonca/core` so callers can drive everything with\n * `paginate()` and stay consistent across Lonca SDKs.\n */\nexport class BrandsResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 50, intervalMs: 60_000 });\n }\n\n /**\n * List Trendyol brands, one page at a time.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const brand of paginate((p) => client.brands.list(p))) {\n * console.log(brand.id, brand.name);\n * }\n * ```\n */\n async list(params: CursorPaginationParams = {}): Promise<CursorPage<Brand>> {\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n const size = params.limit ?? DEFAULT_PAGE_SIZE;\n\n const data = await this.transport.request<TrendyolBrandListResponse>({\n method: 'GET',\n path: '/integration/product/brands',\n query: { page, size },\n rateLimiter: this.limiter,\n });\n\n const items: Brand[] = data.brands.map((b) => ({ id: String(b.id), name: b.name }));\n const nextCursor = page + 1 < data.totalPages ? String(page + 1) : undefined;\n\n return nextCursor !== undefined ? { items, nextCursor } : { items };\n }\n\n /**\n * Search brands by name. Useful when you need a brand's numeric ID for\n * `createProducts` and don't want to page through the full `list()`\n * (1000 brands per page).\n *\n * **Wire fact (verified STAGE 2026-05-25):** Trendyol's\n * doc claims this is a case-sensitive *exact* match, but live behaviour\n * is **substring + case-insensitive** — `search('Trendyol')` returns\n * 17 hits including `TRENDYOLMILLA`, `trendyol vavist`, `Trendyol Üyelik`.\n * Plan for ranking your results client-side if you need an exact match.\n * The endpoint returns an empty array when nothing matches (no 404).\n *\n * @param name The brand name to search for.\n */\n async search(name: string): Promise<Brand[]> {\n const data = await this.transport.request<Array<{ id: number; name: string }>>({\n method: 'GET',\n path: '/integration/product/brands/by-name',\n query: { name },\n rateLimiter: this.limiter,\n });\n return (data ?? []).map((b) => ({ id: String(b.id), name: b.name }));\n }\n}\n","import {\n TokenBucketRateLimiter,\n ValidationError,\n type CursorPage,\n type CursorPaginationParams,\n} from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n BarcodeCategoryLookup,\n Category,\n CategoryAttribute,\n CategoryAttributeValue,\n} from '../types/category.js';\n\ninterface TrendyolCategoryNode {\n id: number;\n name: string;\n parentId: number | null;\n subCategories?: TrendyolCategoryNode[];\n}\n\n/**\n * Trendyol's category-tree response shape.\n *\n * The OpenAPI spec advertises a root-level array, but live PROD/STAGE responses\n * may wrap it. We accept both shapes defensively.\n */\ntype TrendyolCategoriesResponse = TrendyolCategoryNode[] | { categories: TrendyolCategoryNode[] };\n\ninterface TrendyolCategoryAttributeValue {\n id: number;\n name: string;\n}\n\n/**\n * Wire shape of one item in the V2 `getCategoryAttributeValues` page.\n *\n * Important: the official OpenAPI spec calls this `attributeValueName`,\n * but live STAGE responses (verified 2026-05-25) return `attributeValue`.\n * We accept both defensively.\n */\ninterface TrendyolAttributeValueItem {\n attributeValueId?: number | string;\n attributeValue?: string;\n attributeValueName?: string;\n}\n\ninterface TrendyolAttributeValuesPage {\n content?: TrendyolAttributeValueItem[];\n page?: number;\n size?: number;\n totalPages?: number;\n totalElements?: number;\n}\n\ninterface TrendyolCategoryAttributeNode {\n attribute?: { id: number; name: string };\n categoryId?: number;\n required?: boolean;\n allowCustom?: boolean;\n varianter?: boolean;\n slicer?: boolean;\n /** V2-only: whether the attribute accepts multiple values at once. */\n allowMultipleAttributeValues?: boolean;\n /** Often omitted by Trendyol's live API; treat as optional. */\n attributeValues?: TrendyolCategoryAttributeValue[];\n}\n\nfunction normalizeCategory(node: TrendyolCategoryNode): Category {\n return {\n id: String(node.id),\n name: node.name,\n parentId: node.parentId === null || node.parentId === undefined ? null : String(node.parentId),\n subCategories: (node.subCategories ?? []).map(normalizeCategory),\n };\n}\n\nfunction normalizeAttribute(node: TrendyolCategoryAttributeNode): CategoryAttribute {\n const attr = node.attribute ?? { id: 0, name: '' };\n const rawValues = node.attributeValues ?? [];\n const out: CategoryAttribute = {\n id: String(attr.id),\n name: attr.name,\n required: !!node.required,\n allowCustom: !!node.allowCustom,\n varianter: !!node.varianter,\n slicer: !!node.slicer,\n values: rawValues.map((v) => ({ id: String(v.id), name: v.name })),\n };\n if (node.categoryId !== undefined) {\n out.categoryId = String(node.categoryId);\n }\n if (node.allowMultipleAttributeValues !== undefined) {\n out.allowMultipleAttributeValues = node.allowMultipleAttributeValues;\n }\n return out;\n}\n\n/** Trendyol caps `page` and `size` at 1000 for the values endpoint. */\nconst MAX_ATTR_VALUES_PAGE_SIZE = 1000;\nconst DEFAULT_ATTR_VALUES_PAGE_SIZE = 100;\n\nexport type ListCategoryAttributeValuesParams = CursorPaginationParams;\n\n/**\n * Trendyol category-tree and category-attribute endpoints.\n *\n * Rate limits (per Trendyol service limits):\n * - Category list: 50 req/min\n * - Category attributes: 50 req/min\n * - Category attribute values: 50 req/min (same service tier)\n *\n * All three counters live on the same Trendyol service, so we share one\n * limiter across the endpoints.\n */\nexport class CategoriesResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n /**\n * Trendyol seller (supplier) ID — required only for the AutoFT-scoped\n * `getByBarcodes` lookup. Other category endpoints don't need it.\n * Provided automatically when constructed via `createTrendyolClient`.\n */\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 50, intervalMs: 60_000 });\n }\n\n /**\n * Fetch the full Trendyol category tree.\n *\n * Trendyol returns the entire tree in one response — there is no pagination.\n * Cache the result aggressively in your application; the tree changes rarely.\n */\n async list(): Promise<Category[]> {\n const data = await this.transport.request<TrendyolCategoriesResponse>({\n method: 'GET',\n path: '/integration/product/product-categories',\n rateLimiter: this.limiter,\n });\n const list = Array.isArray(data) ? data : data.categories;\n return list.map(normalizeCategory);\n }\n\n /**\n * Fetch the attributes (required and optional) for a single category.\n *\n * Call this before `createProduct V2` so you know which attributes are\n * mandatory — the API rejects products that omit any `required` attribute.\n *\n * @param categoryId Trendyol numeric category ID; accepts `string` or `number`.\n */\n async getAttributes(categoryId: string | number): Promise<CategoryAttribute[]> {\n const id = encodeURIComponent(String(categoryId));\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/product/categories/${id}/attributes`,\n rateLimiter: this.limiter,\n });\n\n // Defensive: live API wraps the array as either a root array, `categoryAttributes`,\n // or `attributes`. Verified via STAGE + PROD smoke tests on 2026-05-25.\n const list = extractAttributeList(data);\n if (!list) {\n console.error(\n '[@lonca/trendyol] getCategoryAttributes: unexpected response shape:',\n JSON.stringify(data).slice(0, 800),\n );\n return [];\n }\n return list.map(normalizeAttribute);\n }\n\n /**\n * Fetch the allowed values for a single category attribute (paginated).\n *\n * `getCategoryAttributes` returns attribute metadata + flags but typically\n * omits the value catalog. Use this method to fetch the catalog for an\n * attribute when `allowCustom` is `false` and you need to map your data\n * onto Trendyol's accepted values.\n *\n * @param categoryId Trendyol numeric category ID; accepts `string` or `number`.\n * @param attributeId Attribute ID returned by `getAttributes`.\n * @param params Cursor pagination (max page size 1000; default 100).\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const value of paginate((p) =>\n * client.categories.getAttributeValues(catId, attrId, p),\n * )) {\n * console.log(value.id, value.name);\n * }\n * ```\n */\n async getAttributeValues(\n categoryId: string | number,\n attributeId: string | number,\n params: ListCategoryAttributeValuesParams = {},\n ): Promise<CursorPage<CategoryAttributeValue>> {\n const catId = encodeURIComponent(String(categoryId));\n const attrId = encodeURIComponent(String(attributeId));\n const size = Math.min(params.limit ?? DEFAULT_ATTR_VALUES_PAGE_SIZE, MAX_ATTR_VALUES_PAGE_SIZE);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n const data = await this.transport.request<TrendyolAttributeValuesPage>({\n method: 'GET',\n path: `/integration/product/categories/${catId}/attributes/${attrId}/values`,\n query: { page, size },\n rateLimiter: this.limiter,\n });\n\n const items: CategoryAttributeValue[] = (data.content ?? []).map((item) => ({\n id: item.attributeValueId !== undefined ? String(item.attributeValueId) : '',\n name: item.attributeValue ?? item.attributeValueName ?? '',\n }));\n const result: CursorPage<CategoryAttributeValue> = { items };\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n /**\n * Look up category info for a list of barcodes (Trendyol Export Center\n * / AutoFT endpoint).\n *\n * **Requires Export Center enrollment.** Sellers who have not joined\n * Trendyol's \"İhracat Merkezi\" program will get an auth error on this\n * endpoint even though their regular Marketplace credentials are valid.\n *\n * @param barcodes 1–N barcodes to look up.\n * @throws {ValidationError} when `barcodes` is empty.\n */\n async getByBarcodes(barcodes: string[]): Promise<BarcodeCategoryLookup> {\n if (!Array.isArray(barcodes) || barcodes.length === 0) {\n throw new ValidationError({ message: 'getByBarcodes: barcodes must not be empty' });\n }\n\n interface WireResponse {\n barcodeCategories?: Record<string, { id?: number | string; displayName?: string }>;\n notFound?: string[];\n }\n const data = await this.transport.request<WireResponse>({\n method: 'POST',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/lookup/product-categories/by-barcodes`,\n body: { barcodes },\n rateLimiter: this.limiter,\n });\n\n const matches = Object.entries(data.barcodeCategories ?? {}).map(([barcode, cat]) => ({\n barcode,\n category: {\n id: cat.id !== undefined ? String(cat.id) : '',\n name: cat.displayName ?? '',\n },\n }));\n return { matches, notFound: data.notFound ?? [] };\n }\n}\n\nfunction extractAttributeList(data: unknown): TrendyolCategoryAttributeNode[] | null {\n if (Array.isArray(data)) return data as TrendyolCategoryAttributeNode[];\n if (data && typeof data === 'object') {\n const obj = data as Record<string, unknown>;\n if (Array.isArray(obj.categoryAttributes)) {\n return obj.categoryAttributes as TrendyolCategoryAttributeNode[];\n }\n if (Array.isArray(obj.attributes)) {\n return obj.attributes as TrendyolCategoryAttributeNode[];\n }\n }\n return null;\n}\n","import { TokenBucketRateLimiter, ValidationError, type CursorPage } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n ApproveClaimLineItemsInput,\n Claim,\n ClaimItemAudit,\n ClaimIssueReason,\n CreateClaimInput,\n CreateClaimIssueInput,\n ListClaimsParams,\n} from '../types/claim.js';\n\nfunction toIso(epochMs: number | undefined): string | undefined {\n if (typeof epochMs !== 'number' || !Number.isFinite(epochMs) || epochMs === 0) {\n return undefined;\n }\n return new Date(epochMs).toISOString();\n}\n\ninterface WireClaim {\n id?: string;\n claimId?: string;\n orderNumber?: string;\n orderDate?: number;\n claimDate?: number;\n customerFirstName?: string;\n customerLastName?: string;\n [key: string]: unknown;\n}\n\nfunction normalizeClaim(node: WireClaim): Claim {\n const out: Claim = {\n id: node.id ?? node.claimId ?? '',\n orderNumber: node.orderNumber ?? '',\n raw: node as Record<string, unknown>,\n };\n const orderDate = toIso(node.orderDate);\n if (orderDate) out.orderDate = orderDate;\n const claimDate = toIso(node.claimDate);\n if (claimDate) out.claimDate = claimDate;\n if (node.customerFirstName !== undefined) out.customerFirstName = node.customerFirstName;\n if (node.customerLastName !== undefined) out.customerLastName = node.customerLastName;\n return out;\n}\n\n/**\n * Trendyol claims (return / iade) endpoints.\n *\n * Rate limit (per Trendyol service limits): shares the order service bucket;\n * the SDK provisions its own 1000 req/min limiter that the caller can override.\n */\nexport class ClaimsResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n }\n\n /**\n * Create a return claim against an order. Use this to file a return on\n * behalf of a customer (e.g. when they called your CS line). For\n * customer-initiated returns coming from trendyol.com, you receive them\n * via `claims.list()` — no need to call `create`.\n *\n * Returns whatever Trendyol returns (typically the new claim's identifier).\n *\n * @throws {ValidationError} when `claimItems` is empty.\n */\n async create(input: CreateClaimInput): Promise<unknown> {\n if (!Array.isArray(input?.claimItems) || input.claimItems.length === 0) {\n throw new ValidationError({ message: 'claims.create: claimItems must not be empty' });\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/order/sellers/${this.transport.sellerId}/claims/create`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * File a seller-side rejection (\"ret talebi\") against a customer claim.\n *\n * **Wire format: `multipart/form-data`** — the SDK builds the FormData\n * internally from the typed input. `claimItemIdList` is joined with\n * commas (Trendyol expects a single comma-separated string field).\n * Attach supporting docs (PDF / JPEG) via `files: [Blob, ...]`.\n */\n async createIssue(claimId: string, input: CreateClaimIssueInput): Promise<unknown> {\n if (!Array.isArray(input?.claimItemIdList) || input.claimItemIdList.length === 0) {\n throw new ValidationError({\n message: 'claims.createIssue: claimItemIdList must not be empty',\n });\n }\n if (typeof input.description !== 'string' || input.description.length === 0) {\n throw new ValidationError({ message: 'claims.createIssue: description is required' });\n }\n if (input.description.length > 500) {\n throw new ValidationError({\n message: `claims.createIssue: description must be ≤500 chars (got ${input.description.length})`,\n });\n }\n\n const form = new FormData();\n form.append('claimIssueReasonId', String(input.claimIssueReasonId));\n form.append('claimItemIdList', input.claimItemIdList.join(','));\n form.append('description', input.description);\n if (input.files) {\n for (const file of input.files) {\n form.append('files', file);\n }\n }\n\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/order/sellers/${this.transport.sellerId}/claims/${encodeURIComponent(claimId)}/issue`,\n body: form,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Approve specific claim line items. After approval, Trendyol moves\n * those line items into the post-approval refund / return-shipping flow.\n *\n * @throws {ValidationError} when `claimLineItemIdList` is empty.\n */\n async approveLineItems(claimId: string, input: ApproveClaimLineItemsInput): Promise<unknown> {\n if (!Array.isArray(input?.claimLineItemIdList) || input.claimLineItemIdList.length === 0) {\n throw new ValidationError({\n message: 'claims.approveLineItems: claimLineItemIdList must not be empty',\n });\n }\n return this.transport.request<unknown>({\n method: 'PUT',\n path: `/integration/order/sellers/${this.transport.sellerId}/claims/${encodeURIComponent(claimId)}/items/approve`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * List claims (page-based; SDK exposes opaque cursor convention).\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const c of paginate((p) =>\n * client.claims.list({ ...p, claimItemStatus: 'WaitingInAction' }),\n * )) {\n * console.log(c.id, c.orderNumber, c.claimDate);\n * }\n * ```\n */\n async list(params: ListClaimsParams = {}): Promise<CursorPage<Claim>> {\n const size = Math.min(params.limit ?? 50, 200);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n const query: Record<string, string | number | undefined> = { page, size };\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n if (params.claimItemStatus) query.claimItemStatus = params.claimItemStatus;\n\n interface WireResponse {\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n content?: WireClaim[];\n }\n const data = await this.transport.request<WireResponse>({\n method: 'GET',\n path: `/integration/order/sellers/${this.transport.sellerId}/claims`,\n query,\n rateLimiter: this.limiter,\n });\n\n const items = (data.content ?? []).map(normalizeClaim);\n const result: CursorPage<Claim> = { items };\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n /**\n * Fetch the catalog of rejection-reason IDs the seller can use on\n * `claims.createIssue()`. Cache the result — it changes rarely.\n *\n * Note: this endpoint is **not seller-scoped** (no `sellerId` in path).\n */\n async getIssueReasons(): Promise<ClaimIssueReason[]> {\n const data = await this.transport.request<Array<{ id?: number; name?: string }>>({\n method: 'GET',\n path: `/integration/order/claim-issue-reasons`,\n rateLimiter: this.limiter,\n });\n return (data ?? []).map((r) => ({\n id: typeof r.id === 'number' ? r.id : 0,\n name: r.name ?? '',\n }));\n }\n\n /**\n * Fetch the audit log for a single claim item (state transitions,\n * actor, timestamp). Trendyol's response shape varies — the SDK\n * surfaces each row as `{ raw }` and leaves field extraction to the\n * caller until we observe a stable shape on the wire.\n */\n async getItemAudits(claimItemId: string): Promise<ClaimItemAudit[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/order/sellers/${this.transport.sellerId}/claims/items/${encodeURIComponent(claimItemId)}/audit`,\n rateLimiter: this.limiter,\n });\n const rows = Array.isArray(data)\n ? data\n : Array.isArray((data as { content?: unknown[] })?.content)\n ? (data as { content: unknown[] }).content\n : [];\n return rows.map((row) => ({ raw: row as Record<string, unknown> }));\n }\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n CareInstruction,\n ExportBatchAcceptedResponse,\n ExportBatchStatus,\n ExportCategoryAttribute,\n ExportPackage,\n ExportPackageItem,\n ExportPriceUpdateInput,\n ExportProduct,\n ExportProductInput,\n ExportStockUpdateInput,\n GetExportPackageItemsParams,\n ListExportPackagesV2Params,\n ListExportPackagesV3Params,\n ListExportProductsParams,\n ProductComposition,\n ProductOrigin,\n} from '../types/export-center.js';\n\n/** Trendyol caps every Export Center batch at 5000 items per call. */\nconst MAX_BATCH_ITEMS = 5000;\n\n/**\n * Trendyol Export Center (İhracat Merkezi / AutoFT) — Türkiye-based\n * sellers exporting to Trendyol's international platforms.\n *\n * **Service base URL**: same `apigw.trendyol.com` as the main marketplace,\n * with a distinct path prefix `/integration/ecgw/v{N}/{sellerId}/…`.\n *\n * The Export Center requires sellers to first complete Trendyol's \"İhracat\n * Merkezi\" application; the same `apiKey`/`apiSecret` then authorize\n * these paths. Calls from non-enrolled sellers return `401`.\n *\n * 12 endpoints across four surfaces — products (list/create/price/stock),\n * batch status, packages (V2/V3 list + item detail), and lookup\n * (categories, care instructions, compositions, origins).\n *\n * NOTE: per-endpoint body / response shapes are documented in HTML tables\n * on developers.trendyol.com — the SDK accepts `Record<string, unknown>`\n * bodies and surfaces row-level `raw` accessors so undocumented fields\n * stay reachable.\n */\nexport class ExportCenterResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n }\n\n // ─── Products ────────────────────────────────────────────────────────────\n\n /**\n * List Export Center-approved products. Uses Trendyol's `pageKey`\n * pagination — the first call leaves `pageKey` empty; subsequent\n * calls pass the `x-paging-key` value from the previous response.\n */\n async listProducts(params: ListExportProductsParams = {}): Promise<ExportProduct[]> {\n const query: Record<string, string | number | undefined> = {};\n if (params.barcodes && params.barcodes.length > 0) query.barcodes = params.barcodes.join(',');\n if (params.pageKey) query.pageKey = params.pageKey;\n if (params.size !== undefined) query.size = params.size;\n\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v2/${this.transport.sellerId}/products`,\n query: Object.keys(query).length ? query : undefined,\n rateLimiter: this.limiter,\n });\n const rows = pickArray(data);\n return rows.map((r) => ({ raw: (r ?? {}) as Record<string, unknown> }));\n }\n\n /**\n * Create Export Center products. Maximum 5000 per call. Returns a\n * `batchId` you can poll via `getBatchStatus(batchId)`.\n *\n * @throws {ValidationError} when `products` is empty / oversized.\n */\n async createProducts(products: ExportProductInput[]): Promise<ExportBatchAcceptedResponse> {\n this.assertBatch(products, 'createProducts');\n const data = await this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/ecgw/v2/${this.transport.sellerId}/products`,\n body: { products },\n rateLimiter: this.limiter,\n });\n return normalizeBatchResponse(data);\n }\n\n /**\n * Update Export Center prices. **Trendyol allows one price update per\n * barcode per day.** Returns a `batchId`.\n *\n * @throws {ValidationError} when `priceInfos` is empty / oversized.\n */\n async updatePrices(priceInfos: ExportPriceUpdateInput[]): Promise<ExportBatchAcceptedResponse> {\n this.assertBatch(priceInfos, 'updatePrices');\n const data = await this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/prices`,\n body: { priceInfos },\n rateLimiter: this.limiter,\n });\n return normalizeBatchResponse(data);\n }\n\n /**\n * Update Export Center stocks. Returns a `batchId`. Sellers using\n * Trendyol's shared inventory cannot use this endpoint (per portal docs).\n *\n * @throws {ValidationError} when `items` is empty / oversized.\n */\n async updateStocks(items: ExportStockUpdateInput[]): Promise<ExportBatchAcceptedResponse> {\n this.assertBatch(items, 'updateStocks');\n const data = await this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/stocks`,\n body: { items },\n rateLimiter: this.limiter,\n });\n return normalizeBatchResponse(data);\n }\n\n // ─── Batch status ────────────────────────────────────────────────────────\n\n /**\n * Look up the status of a previously-submitted batch. Trendyol retains\n * batch records for **24 hours** only — older `batchId`s return `404`.\n */\n async getBatchStatus(batchId: string): Promise<ExportBatchStatus> {\n if (!batchId) {\n throw new ValidationError({ message: 'exportCenter.getBatchStatus: batchId is required' });\n }\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/check-status`,\n query: { batchId },\n rateLimiter: this.limiter,\n });\n return normalizeBatchStatus(data);\n }\n\n // ─── Packages ────────────────────────────────────────────────────────────\n\n /** List daily Export Center packages (V2 — query-based filters). */\n async listPackagesV2(params: ListExportPackagesV2Params = {}): Promise<ExportPackage[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v2/${this.transport.sellerId}/packages`,\n query: {\n trackingNumber: params.trackingNumber,\n status: params.status,\n creationStartDate: params.creationStartDate,\n creationEndDate: params.creationEndDate,\n size: params.size,\n boutiqueId: params.boutiqueId,\n },\n rateLimiter: this.limiter,\n });\n return pickArray(data).map(normalizePackage);\n }\n\n /** List Export Center packages (V3 — consolidated, page-based). */\n async listPackagesV3(params: ListExportPackagesV3Params = {}): Promise<ExportPackage[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v3/${this.transport.sellerId}/packages`,\n query: {\n status: params.status,\n page: params.offset !== undefined ? params.offset : undefined,\n size: params.limit,\n creationStartDate: params.creationStartDate,\n creationEndDate: params.creationEndDate,\n },\n rateLimiter: this.limiter,\n });\n return pickArray(data).map(normalizePackage);\n }\n\n /** Get the line items inside an Export Center package. */\n async getPackageItems(params: GetExportPackageItemsParams): Promise<ExportPackageItem[]> {\n if (!params || !params.packageId) {\n throw new ValidationError({\n message: 'exportCenter.getPackageItems: packageId is required',\n });\n }\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v2/${this.transport.sellerId}/packages/items`,\n query: {\n packageId: params.packageId,\n status: params.status,\n page: params.offset,\n size: params.limit,\n },\n rateLimiter: this.limiter,\n });\n return pickArray(data).map((r) => ({ raw: (r ?? {}) as Record<string, unknown> }));\n }\n\n // ─── Lookup ──────────────────────────────────────────────────────────────\n\n /** Get the required attributes for an Export Center category. */\n async getCategoryAttributes(categoryId: number | string): Promise<ExportCategoryAttribute[]> {\n if (categoryId === undefined || categoryId === null || categoryId === '') {\n throw new ValidationError({\n message: 'exportCenter.getCategoryAttributes: categoryId is required',\n });\n }\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/lookup/product-categories/${encodeURIComponent(String(categoryId))}/attributes`,\n rateLimiter: this.limiter,\n });\n return pickArray(data).map((r) => {\n const row = (r ?? {}) as Record<string, unknown>;\n const out: ExportCategoryAttribute = { raw: row };\n if (typeof row.attributeId === 'number' || typeof row.attributeId === 'string') {\n out.attributeId = row.attributeId;\n }\n if (typeof row.attributeName === 'string') out.attributeName = row.attributeName;\n if (typeof row.required === 'boolean') out.required = row.required;\n if (Array.isArray(row.values)) out.values = row.values;\n return out;\n });\n }\n\n /** Get the care-instruction lookup values used by `createProducts`. */\n async getCareInstructions(): Promise<CareInstruction[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/lookup/care-instructions`,\n rateLimiter: this.limiter,\n });\n return pickArray(data).map(normalizeNamedRef);\n }\n\n /** Get the material-composition lookup values used by `createProducts`. */\n async getCompositions(): Promise<ProductComposition[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/lookup/compositions`,\n rateLimiter: this.limiter,\n });\n return pickArray(data).map(normalizeNamedRef);\n }\n\n /** Get the country-of-origin lookup values used by `createProducts`. */\n async getOrigins(): Promise<ProductOrigin[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/ecgw/v1/${this.transport.sellerId}/lookup/origins`,\n rateLimiter: this.limiter,\n });\n return pickArray(data).map((r) => {\n const row = (r ?? {}) as Record<string, unknown>;\n const out: ProductOrigin = { raw: row };\n if (typeof row.id === 'number' || typeof row.id === 'string') out.id = row.id;\n if (typeof row.name === 'string') out.name = row.name;\n if (typeof row.countryCode === 'string') out.countryCode = row.countryCode;\n return out;\n });\n }\n\n // ─── Helpers ─────────────────────────────────────────────────────────────\n\n private assertBatch(items: unknown[], methodLabel: string): void {\n if (!Array.isArray(items) || items.length === 0) {\n throw new ValidationError({\n message: `exportCenter.${methodLabel}: items must not be empty`,\n });\n }\n if (items.length > MAX_BATCH_ITEMS) {\n throw new ValidationError({\n message: `exportCenter.${methodLabel}: max ${MAX_BATCH_ITEMS} items per call (got ${items.length})`,\n });\n }\n }\n}\n\n// ─── Normalizers ──────────────────────────────────────────────────────────\n\nfunction pickArray(data: unknown): unknown[] {\n if (Array.isArray(data)) return data;\n if (data && typeof data === 'object') {\n const obj = data as Record<string, unknown>;\n if (Array.isArray(obj.content)) return obj.content;\n if (Array.isArray(obj.items)) return obj.items;\n if (Array.isArray(obj.data)) return obj.data;\n if (Array.isArray(obj.products)) return obj.products;\n if (Array.isArray(obj.packages)) return obj.packages;\n }\n return [];\n}\n\nfunction normalizeBatchResponse(data: unknown): ExportBatchAcceptedResponse {\n const obj = (data && typeof data === 'object' ? data : {}) as Record<string, unknown>;\n return {\n batchId: String(obj.batchId ?? obj.batchRequestId ?? obj.id ?? ''),\n raw: obj,\n };\n}\n\nfunction normalizeBatchStatus(data: unknown): ExportBatchStatus {\n const obj = (data && typeof data === 'object' ? data : {}) as Record<string, unknown>;\n const out: ExportBatchStatus = { raw: obj };\n if (typeof obj.batchId === 'string') out.batchId = obj.batchId;\n if (typeof obj.status === 'string') out.status = obj.status;\n if (typeof obj.itemCount === 'number') out.itemCount = obj.itemCount;\n if (typeof obj.failedItemCount === 'number') out.failedItemCount = obj.failedItemCount;\n if (Array.isArray(obj.items)) out.items = obj.items as Array<Record<string, unknown>>;\n return out;\n}\n\nfunction normalizePackage(row: unknown): ExportPackage {\n const r = (row ?? {}) as Record<string, unknown>;\n const out: ExportPackage = { raw: r };\n if (typeof r.packageNumber === 'string') out.packageNumber = r.packageNumber;\n if (typeof r.status === 'string') out.status = r.status as ExportPackage['status'];\n return out;\n}\n\nfunction normalizeNamedRef<\n T extends { id?: number | string; name?: string; raw: Record<string, unknown> },\n>(row: unknown): T {\n const r = (row ?? {}) as Record<string, unknown>;\n const out = { raw: r } as T;\n if (typeof r.id === 'number' || typeof r.id === 'string') out.id = r.id;\n if (typeof r.name === 'string') out.name = r.name;\n return out;\n}\n","import { TokenBucketRateLimiter, ValidationError, type CursorPage } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { FinancialTransaction, ListFinanceParams } from '../types/misc.js';\n\ninterface WirePage {\n content?: WireRow[];\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n}\n\ninterface WireRow {\n id?: string | number;\n transactionDate?: number;\n barcode?: string | null;\n transactionType?: string;\n receiptId?: number | null;\n description?: string | null;\n debt?: number;\n credit?: number;\n paymentPeriod?: number | null;\n commissionRate?: number | null;\n commissionAmount?: number | null;\n commissionInvoiceSerialNumber?: string | null;\n sellerRevenue?: number | null;\n orderNumber?: string | null;\n paymentOrderId?: number | null;\n paymentDate?: number | null;\n sellerId?: number;\n storeId?: number | null;\n storeName?: string | null;\n storeAddress?: string | null;\n country?: string | null;\n [key: string]: unknown;\n}\n\nfunction toIso(epochMs: number | null | undefined): string | undefined {\n if (typeof epochMs !== 'number' || !Number.isFinite(epochMs) || epochMs === 0) {\n return undefined;\n }\n return new Date(epochMs).toISOString();\n}\n\nfunction normalizeRow(row: WireRow): FinancialTransaction {\n const out: FinancialTransaction = {\n id: row.id !== undefined ? String(row.id) : '',\n raw: row as Record<string, unknown>,\n };\n const tx = toIso(row.transactionDate);\n if (tx) out.transactionDate = tx;\n if (row.barcode !== undefined) out.barcode = row.barcode;\n if (row.transactionType !== undefined) out.transactionType = row.transactionType;\n if (row.receiptId !== undefined) out.receiptId = row.receiptId;\n if (row.description !== undefined) out.description = row.description;\n if (typeof row.debt === 'number') out.debt = row.debt;\n if (typeof row.credit === 'number') out.credit = row.credit;\n if (row.paymentPeriod !== undefined) out.paymentPeriod = row.paymentPeriod;\n if (row.commissionRate !== undefined) out.commissionRate = row.commissionRate;\n if (row.commissionAmount !== undefined) out.commissionAmount = row.commissionAmount;\n if (row.commissionInvoiceSerialNumber !== undefined) {\n out.commissionInvoiceSerialNumber = row.commissionInvoiceSerialNumber;\n }\n if (row.sellerRevenue !== undefined) out.sellerRevenue = row.sellerRevenue;\n if (row.orderNumber !== undefined) out.orderNumber = row.orderNumber;\n if (row.paymentOrderId !== undefined) out.paymentOrderId = row.paymentOrderId;\n const pay = toIso(row.paymentDate);\n if (pay) out.paymentDate = pay;\n if (typeof row.sellerId === 'number') out.sellerId = row.sellerId;\n if (row.storeId !== undefined) out.storeId = row.storeId;\n if (row.storeName !== undefined) out.storeName = row.storeName;\n if (row.storeAddress !== undefined) out.storeAddress = row.storeAddress;\n if (row.country !== undefined) out.country = row.country;\n return out;\n}\n\n/**\n * Trendyol finance endpoints — current-account-statement settlements and\n * \"other financials\" (cargo invoices, labor cost adjustments, etc.).\n *\n * Both endpoints return the same `FinancialTransaction` shape on the wire,\n * so the SDK exposes one typed surface for them.\n */\nexport class FinanceResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 100, intervalMs: 60_000 });\n }\n\n async getSettlements(params: ListFinanceParams = {}): Promise<CursorPage<FinancialTransaction>> {\n return this.queryPage(\n `/integration/finance/che/sellers/${this.transport.sellerId}/settlements`,\n params,\n );\n }\n\n async getOtherFinancials(\n params: ListFinanceParams = {},\n ): Promise<CursorPage<FinancialTransaction>> {\n return this.queryPage(\n `/integration/finance/che/sellers/${this.transport.sellerId}/otherfinancials`,\n params,\n );\n }\n\n private async queryPage(\n path: string,\n params: ListFinanceParams,\n ): Promise<CursorPage<FinancialTransaction>> {\n // Trendyol's CHE finance API requires `transactionType` — without it the\n // endpoint returns a bare 500. Surface a clear error instead. (Verified live.)\n if (!params.transactionType) {\n throw new ValidationError({\n message:\n \"finance: transactionType is required (Trendyol returns 500 without it) — pass e.g. { transactionType: 'Sale' }.\",\n });\n }\n // …and it only accepts a page size of 500 or 1000 (anything else → 400\n // \"Size değeri 500 ya da 1000 olmalı\"). Clamp to the nearest allowed value.\n const size = (params.limit ?? 500) > 500 ? 1000 : 500;\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n const query: Record<string, string | number | undefined> = {\n page,\n size,\n transactionType: params.transactionType,\n };\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n\n const data = await this.transport.request<WirePage>({\n method: 'GET',\n path,\n query,\n rateLimiter: this.limiter,\n });\n\n const items = (data.content ?? []).map(normalizeRow);\n const result: CursorPage<FinancialTransaction> = { items };\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n}\n","import { ServerError, TimeoutError, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { PriceInventoryUpdate, UpdatePriceInventoryResponse } from '../types/inventory.js';\nimport type { BatchRequestResult } from '../types/product.js';\n\n/** Trendyol's hard limit for items per `updatePriceAndInventory` call. */\nconst MAX_ITEMS_PER_REQUEST = 1000;\n\ninterface TrendyolBatchRequestResponse {\n batchRequestId?: string;\n}\n\n/** Function that resolves a batch request's current status (i.e. `products.getBatchStatus`). */\ntype BatchStatusPoller = (batchRequestId: string) => Promise<BatchRequestResult>;\n\n/** Options controlling how {@link InventoryResource.updateAndWait} / {@link pollBatchStatus} poll. */\nexport interface BatchPollOptions {\n /** Delay between status polls, in ms. Default: `2000`. */\n pollIntervalMs?: number;\n /** Total time to wait for a batch to settle before throwing `TimeoutError`, in ms. Default: `120000`. */\n timeoutMs?: number;\n /** Abort the wait early. The rejection carries the signal's reason. */\n signal?: AbortSignal;\n}\n\n/**\n * Poll a Trendyol batch request until it reaches a terminal state\n * (`COMPLETED` / `FAILED`) or the timeout elapses.\n *\n * Standalone so callers can poll an id obtained elsewhere (e.g. a persisted\n * `batchRequestId` from a previous process) without going through\n * {@link InventoryResource.updateAndWait}.\n *\n * @throws {TimeoutError} when the batch does not settle within `timeoutMs`;\n * `error.data` carries `{ batchRequestId, lastStatus, lastResult }`.\n */\nexport async function pollBatchStatus(\n getStatus: BatchStatusPoller,\n batchRequestId: string,\n opts: BatchPollOptions = {},\n): Promise<BatchRequestResult> {\n const pollIntervalMs = opts.pollIntervalMs ?? 2000;\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const deadline = Date.now() + timeoutMs;\n\n for (;;) {\n opts.signal?.throwIfAborted();\n const result = await getStatus(batchRequestId);\n if (result.status === 'COMPLETED' || result.status === 'FAILED') {\n return result;\n }\n if (Date.now() >= deadline) {\n throw new TimeoutError({\n message: `Trendyol batch ${batchRequestId} did not settle within ${timeoutMs}ms (last status: ${result.status})`,\n data: { batchRequestId, lastStatus: result.status, lastResult: result },\n });\n }\n await delay(pollIntervalMs, opts.signal);\n }\n}\n\n/**\n * Trendyol stock & price update endpoint (a.k.a. `updatePriceAndInventory`).\n *\n * Rate limit: **none** — Trendyol explicitly lists this endpoint as\n * `NO LIMIT` in its service limits table. The `15-minute duplicate\n * suppression` rule still applies on Trendyol's side, but that's a\n * server-side concern.\n *\n * The endpoint is asynchronous. {@link InventoryResource.update} returns the\n * `batchRequestId`; poll it yourself with `products.getBatchStatus`, or let\n * {@link InventoryResource.updateAndWait} chunk, submit, and poll for you.\n */\nexport class InventoryResource {\n /**\n * @param transport Trendyol transport.\n * @param getBatchStatus Batch-status poller (wired by `createTrendyolClient`\n * to `products.getBatchStatus`). Required only for `updateAndWait`.\n */\n constructor(\n private readonly transport: TrendyolTransport,\n private readonly getBatchStatus?: BatchStatusPoller,\n ) {}\n\n /**\n * Update price and/or stock for one or more SKUs (by barcode).\n *\n * @example\n * ```ts\n * const { batchRequestId } = await client.inventory.update([\n * { barcode: 'ABC123', quantity: 42, salePrice: 199.9, listPrice: 249.9 },\n * { barcode: 'XYZ789', quantity: 0 },\n * ]);\n * const status = await client.products.getBatchStatus(batchRequestId);\n * ```\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n * @throws {ServerError} when Trendyol accepts the request but returns no\n * `batchRequestId` (an unpollable response — surfaced loudly instead of\n * handing back an empty id).\n */\n async update(items: PriceInventoryUpdate[]): Promise<UpdatePriceInventoryResponse> {\n if (items.length === 0) {\n throw new ValidationError({ message: 'updatePriceAndInventory: items must not be empty' });\n }\n if (items.length > MAX_ITEMS_PER_REQUEST) {\n throw new ValidationError({\n message: `updatePriceAndInventory: max ${MAX_ITEMS_PER_REQUEST} items per request, got ${items.length}`,\n });\n }\n\n const data = await this.transport.request<TrendyolBatchRequestResponse>({\n method: 'POST',\n path: `/integration/inventory/sellers/${this.transport.sellerId}/products/price-and-inventory`,\n body: { items },\n });\n\n if (!data.batchRequestId) {\n throw new ServerError({\n message: 'Trendyol updatePriceAndInventory returned no batchRequestId',\n data: { response: data },\n });\n }\n\n return { batchRequestId: data.batchRequestId };\n }\n\n /**\n * Submit price/stock updates and wait for them to settle.\n *\n * Splits `items` into chunks of ≤1000, submits each via {@link update}, and\n * polls each `batchRequestId` to a terminal state. Returns one\n * `BatchRequestResult` per chunk (read `failedItemCount` / `items[]` for\n * per-barcode outcomes). Compose `@lonca/core`'s `retry` around this for\n * transient-error resilience.\n *\n * @throws {ValidationError} when `items` is empty.\n * @throws {TimeoutError} when any chunk does not settle within `timeoutMs`;\n * `error.data.batchRequestId` identifies the stuck chunk.\n */\n async updateAndWait(\n items: PriceInventoryUpdate[],\n opts: BatchPollOptions = {},\n ): Promise<BatchRequestResult[]> {\n if (items.length === 0) {\n throw new ValidationError({ message: 'updateAndWait: items must not be empty' });\n }\n const getStatus = this.getBatchStatus;\n if (!getStatus) {\n throw new Error(\n 'updateAndWait requires a batch-status poller; obtain the client via createTrendyolClient()',\n );\n }\n\n const results: BatchRequestResult[] = [];\n for (const batch of chunk(items, MAX_ITEMS_PER_REQUEST)) {\n const { batchRequestId } = await this.update(batch);\n results.push(await pollBatchStatus(getStatus, batchRequestId, opts));\n }\n return results;\n }\n}\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n if (items.length <= size) return [items];\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n chunks.push(items.slice(i, i + size));\n }\n return chunks;\n}\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error('Aborted'));\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal?.reason ?? new Error('Aborted'));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n DeleteInvoiceLinkInput,\n SendInvoiceLinkInput,\n UploadInvoiceFileInput,\n} from '../types/misc.js';\n\n/**\n * Trendyol invoice endpoints — upload PDF/JPEG/PNG invoice files or\n * register/delete invoice links. Pair these with `orders.updatePackageStatus(_, { status: 'Invoiced' })`\n * after invoice issuance.\n */\nexport class InvoicesResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 500, intervalMs: 60_000 });\n }\n\n /**\n * Upload an invoice file for a shipment package. **Multipart**: the\n * SDK builds the FormData internally from the typed input.\n *\n * Max 10 MB. Accepted formats: PDF, JPEG, PNG.\n */\n async uploadFile(input: UploadInvoiceFileInput): Promise<unknown> {\n if (!input?.file) {\n throw new ValidationError({ message: 'invoices.uploadFile: file is required' });\n }\n if (!input.shipmentPackageId) {\n throw new ValidationError({ message: 'invoices.uploadFile: shipmentPackageId is required' });\n }\n const form = new FormData();\n form.append('shipmentPackageId', String(input.shipmentPackageId));\n form.append('file', input.file);\n if (input.invoiceDateTime !== undefined) {\n form.append('invoiceDateTime', String(input.invoiceDateTime));\n }\n if (input.invoiceNumber !== undefined) {\n form.append('invoiceNumber', input.invoiceNumber);\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/sellers/${this.transport.sellerId}/seller-invoice-file`,\n body: form,\n rateLimiter: this.limiter,\n });\n }\n\n /** Register an invoice URL with Trendyol (alternative to uploading the file). */\n async sendLink(input: SendInvoiceLinkInput): Promise<unknown> {\n if (!input?.invoiceLink) {\n throw new ValidationError({ message: 'invoices.sendLink: invoiceLink is required' });\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/sellers/${this.transport.sellerId}/seller-invoice-links`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /** Remove a previously-registered invoice link. */\n async deleteLink(input: DeleteInvoiceLinkInput): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/sellers/${this.transport.sellerId}/seller-invoice-links/delete`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { CommonLabel, CommonLabelEntry, CreateCommonLabelInput } from '../types/misc.js';\n\n/**\n * Common-label (ortak etiket) endpoints — request and retrieve a\n * combined ZPL shipping label for a cargo tracking number.\n */\nexport class LabelsResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 100, intervalMs: 60_000 });\n }\n\n /**\n * Request a common ZPL label for a cargo tracking number. After this\n * returns, call `getCommon()` with the same `cargoTrackingNumber` to\n * retrieve the generated label.\n *\n * @throws {ValidationError} when `format` is missing.\n */\n async createCommon(\n cargoTrackingNumber: string | number,\n input: CreateCommonLabelInput,\n ): Promise<unknown> {\n if (!input?.format) {\n throw new ValidationError({ message: 'labels.createCommon: format is required' });\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/sellers/${this.transport.sellerId}/common-label/${encodeURIComponent(String(cargoTrackingNumber))}`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Retrieve the previously-created common label. Trendyol returns\n * `{ data: [{ label, format }] }`; the SDK surfaces the array as\n * `labels[]` for ergonomic access.\n *\n * Typically `labels.length === 1` per tracking number, but kept as an\n * array to match the wire shape.\n */\n async getCommon(cargoTrackingNumber: string | number): Promise<CommonLabel> {\n interface WireResponse {\n data?: Array<{ label?: string; format?: string }>;\n [key: string]: unknown;\n }\n const raw = await this.transport.request<WireResponse>({\n method: 'GET',\n path: `/integration/sellers/${this.transport.sellerId}/common-label/${encodeURIComponent(String(cargoTrackingNumber))}`,\n rateLimiter: this.limiter,\n });\n\n const labels: CommonLabelEntry[] = (raw?.data ?? []).map((row) => ({\n label: row.label ?? '',\n format: (row.format ?? 'ZPL') as CommonLabelEntry['format'],\n }));\n return { labels, raw: (raw ?? {}) as Record<string, unknown> };\n }\n}\n","import { TokenBucketRateLimiter } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { City, Country, District, Neighborhood } from '../types/misc.js';\n\ninterface WireNode {\n code?: number | string;\n id?: number | string;\n cityCode?: number | string;\n countryCode?: string;\n districtCode?: number | string;\n name?: string;\n [key: string]: unknown;\n}\n\nfunction n<T extends { code: string; raw: Record<string, unknown> }>(\n rows: unknown,\n extract: (node: WireNode) => Omit<T, 'raw'>,\n): T[] {\n const list = Array.isArray(rows) ? rows : [];\n return list.map((r) => {\n const node = r as WireNode;\n return { ...extract(node), raw: node as Record<string, unknown> } as T;\n });\n}\n\n/**\n * Trendyol location lookups for building shipment / invoice addresses\n * with the correct city / district / neighborhood codes.\n *\n * Trendyol exposes these under a different prefix (`/integration/member/`)\n * — not under `/integration/order/` or `/integration/product/`.\n */\nexport class LocationsResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 60, intervalMs: 60_000 });\n }\n\n /** List all supported countries (Türkiye + AZ + GULF + CEE). */\n async getCountries(): Promise<Country[]> {\n const data = await this.transport.request<unknown[]>({\n method: 'GET',\n path: `/integration/member/countries`,\n rateLimiter: this.limiter,\n });\n return n<Country>(data, (node) => ({\n code: String(node.code ?? node.id ?? ''),\n name: node.name,\n }));\n }\n\n // ─── Domestic (TR / AZ) ───────────────────────────────────────────────\n\n async getTurkeyCities(): Promise<City[]> {\n return this.cities(`/integration/member/countries/domestic/TR/cities`);\n }\n\n /**\n * List districts for a Turkish city. **Pass the city `id`** (`City.id`) — the\n * nested endpoint keys off Trendyol's internal id, not the display `code`, and\n * returns 500 for the code. Verified live.\n */\n async getTurkeyDistricts(cityId: string | number): Promise<District[]> {\n return this.districts(\n `/integration/member/countries/domestic/TR/cities/${encodeURIComponent(String(cityId))}/districts`,\n );\n }\n\n /**\n * List neighborhoods for a Turkish district. **Pass the ids** (`City.id`,\n * `District.id`) — not the display codes (those 500).\n */\n async getTurkeyNeighborhoods(\n cityId: string | number,\n districtId: string | number,\n ): Promise<Neighborhood[]> {\n return this.neighborhoods(\n `/integration/member/countries/domestic/TR/cities/${encodeURIComponent(String(cityId))}/districts/${encodeURIComponent(String(districtId))}/neighborhoods`,\n );\n }\n\n async getAzerbaijanCities(): Promise<City[]> {\n return this.cities(`/integration/member/countries/domestic/AZ/cities`);\n }\n\n /** List districts for an Azerbaijani city. **Pass the city `id`** (`City.id`), not `code`. */\n async getAzerbaijanDistricts(cityId: string | number): Promise<District[]> {\n return this.districts(\n `/integration/member/countries/domestic/AZ/cities/${encodeURIComponent(String(cityId))}/districts`,\n );\n }\n\n // ─── International (GULF / CEE) ───────────────────────────────────────\n\n async getCitiesByCountry(countryCode: string): Promise<City[]> {\n return this.cities(`/integration/member/countries/${encodeURIComponent(countryCode)}/cities`);\n }\n\n async getDistrictsByCity(countryCode: string, cityId: string | number): Promise<District[]> {\n return this.districts(\n `/integration/member/countries/${encodeURIComponent(countryCode)}/cities/${encodeURIComponent(String(cityId))}/districts`,\n );\n }\n\n // ─── Shared paginators ────────────────────────────────────────────────\n\n private async cities(path: string): Promise<City[]> {\n const data = await this.transport.request<unknown[]>({\n method: 'GET',\n path,\n rateLimiter: this.limiter,\n });\n return n<City>(data, (node) => ({\n id: node.id !== undefined ? String(node.id) : undefined,\n code: String(node.code ?? node.id ?? ''),\n name: node.name,\n countryCode: node.countryCode,\n }));\n }\n\n private async districts(path: string): Promise<District[]> {\n const data = await this.transport.request<unknown[]>({\n method: 'GET',\n path,\n rateLimiter: this.limiter,\n });\n return n<District>(data, (node) => ({\n id: node.id !== undefined ? String(node.id) : undefined,\n code: String(node.code ?? node.id ?? ''),\n name: node.name,\n cityCode: node.cityCode !== undefined ? String(node.cityCode) : undefined,\n }));\n }\n\n private async neighborhoods(path: string): Promise<Neighborhood[]> {\n const data = await this.transport.request<unknown[]>({\n method: 'GET',\n path,\n rateLimiter: this.limiter,\n });\n return n<Neighborhood>(data, (node) => ({\n id: node.id !== undefined ? String(node.id) : undefined,\n code: String(node.code ?? node.id ?? ''),\n name: node.name,\n districtCode: node.districtCode !== undefined ? String(node.districtCode) : undefined,\n }));\n }\n}\n","import {\n TokenBucketRateLimiter,\n ValidationError,\n type CursorPage,\n type CursorPaginationParams,\n} from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n CancelPackageItemInput,\n CargoInvoiceItem,\n LaborCostInput,\n ListOrdersStreamParams,\n OrderAddress,\n OrderCustomer,\n OrderLine,\n PackageHistoryEntry,\n ProcessAlternativeDeliveryInput,\n QuantitySplit,\n UpdateBoxInfoInput,\n ShipmentPackage,\n ShipmentPackageStatus,\n SplitGroup,\n SplitPackagePlan,\n TrendyolCargoProvider,\n UpdatePackageStatusInput,\n} from '../types/order.js';\nimport type {\n CompensationItemDetail,\n CompensationTicket,\n ListCompensationTicketsParams,\n} from '../types/returns.js';\n\n/** Trendyol caps `size` at 200; default 200. */\nconst MAX_PAGE_SIZE = 200;\nconst DEFAULT_PAGE_SIZE = 50;\n/**\n * Effective 2026-06-08, `getShipmentPackages` caps total reachable records at\n * 10,000 — requests past that offset return HTTP 429. Use `listStream()` for\n * full scans. We fail fast client-side before issuing a doomed request.\n */\nconst MAX_OFFSET_RECORDS = 10_000;\n\nexport interface ListOrdersParams extends CursorPaginationParams {\n status?: ShipmentPackageStatus;\n orderNumber?: string;\n /** Filter packages updated on or after this date (Trendyol expects ms-epoch). */\n startDate?: Date;\n /** Filter packages updated on or before this date. */\n endDate?: Date;\n}\n\n// ─── Wire shapes (verified via raw inspect on STAGE 2026-05-25) ─────────────\n\ninterface TrendyolPackageHistoryNode {\n status?: string;\n createdDate?: number;\n [key: string]: unknown;\n}\n\ninterface TrendyolOrderLineNode {\n lineId?: number | string;\n quantity?: number;\n productName?: string;\n barcode?: string;\n productSize?: string;\n productColor?: string;\n stockCode?: string;\n contentId?: number | string;\n sellerId?: number | string;\n productCategoryId?: number | string;\n salesCampaignId?: number | string;\n currencyCode?: string;\n lineUnitPrice?: number;\n lineGrossAmount?: number;\n lineSellerDiscount?: number;\n lineTyDiscount?: number;\n lineTotalDiscount?: number;\n vatRate?: number;\n commission?: number;\n orderLineItemStatusName?: string;\n businessUnit?: string;\n fastDeliveryOptions?: unknown[];\n discountDetails?: unknown[];\n [key: string]: unknown;\n}\n\ninterface TrendyolAddressNode {\n id?: number | string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n company?: string;\n address1?: string;\n address2?: string;\n fullAddress?: string;\n shortAddress?: string;\n city?: string;\n cityCode?: number;\n district?: string;\n districtId?: number;\n neighborhoodId?: number;\n countyId?: number;\n countyName?: string;\n stateName?: string;\n postalCode?: string;\n countryCode?: string;\n phone?: string;\n addressLines?: { addressLine1?: string; addressLine2?: string };\n}\n\ninterface TrendyolShipmentPackageNode {\n /** Default field name on `getShipmentPackages` (orders.list). */\n shipmentPackageId?: number | string;\n /** Field name used by `getShipmentPackagesStream` (orders.listStream). */\n id?: number | string;\n orderNumber?: string;\n shipmentNumber?: number | string;\n originPackageIds?: Array<number | string> | null;\n warehouseId?: number | string;\n supplierId?: number | string;\n\n status?: string;\n shipmentPackageStatus?: string;\n\n customerFirstName?: string;\n customerLastName?: string;\n customerEmail?: string;\n customerId?: number | string;\n taxNumber?: string | null;\n identityNumber?: string;\n\n orderDate?: number;\n lastModifiedDate?: number;\n agreedDeliveryDate?: number;\n estimatedDeliveryStartDate?: number;\n estimatedDeliveryEndDate?: number;\n originShipmentDate?: number;\n\n currencyCode?: string;\n packageTotalPrice?: number;\n packageGrossAmount?: number;\n packageSellerDiscount?: number;\n packageTyDiscount?: number;\n packageTotalDiscount?: number;\n\n invoiceAddress?: TrendyolAddressNode;\n shipmentAddress?: TrendyolAddressNode;\n deliveryAddressType?: string;\n\n cargoTrackingNumber?: number | string;\n cargoProviderName?: string;\n cargoProviderId?: number | string;\n cargoSenderNumber?: string;\n\n deliveryType?: string;\n whoPays?: number;\n timeSlotId?: number;\n fastDelivery?: boolean;\n fastDeliveryType?: string;\n deliveredByService?: boolean;\n\n commercial?: boolean;\n micro?: boolean;\n giftBoxRequested?: boolean;\n containsDangerousProduct?: boolean;\n isCod?: boolean;\n is4P?: boolean;\n\n invoiceLink?: string;\n createdBy?: string;\n\n lines?: TrendyolOrderLineNode[];\n packageHistories?: TrendyolPackageHistoryNode[];\n\n [key: string]: unknown;\n}\n\ninterface TrendyolGetOrdersResponse {\n content?: TrendyolShipmentPackageNode[];\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n}\n\n// ─── Normalizers ────────────────────────────────────────────────────────────\n\nfunction toIso(epochMs: number | undefined): string | undefined {\n if (typeof epochMs !== 'number' || !Number.isFinite(epochMs) || epochMs === 0) {\n return undefined;\n }\n return new Date(epochMs).toISOString();\n}\n\nfunction normalizeAddress(node: TrendyolAddressNode | undefined): OrderAddress | undefined {\n if (!node) return undefined;\n const out: OrderAddress = {};\n if (node.id !== undefined) out.id = String(node.id);\n if (node.firstName !== undefined) out.firstName = node.firstName;\n if (node.lastName !== undefined) out.lastName = node.lastName;\n if (node.fullName !== undefined) out.fullName = node.fullName;\n if (node.company !== undefined) out.company = node.company;\n if (node.address1 !== undefined) out.address1 = node.address1;\n if (node.address2 !== undefined) out.address2 = node.address2;\n if (node.fullAddress !== undefined) out.fullAddress = node.fullAddress;\n if (node.shortAddress !== undefined) out.shortAddress = node.shortAddress;\n if (node.city !== undefined) out.city = node.city;\n if (node.cityCode !== undefined) out.cityCode = node.cityCode;\n if (node.district !== undefined) out.district = node.district;\n if (node.districtId !== undefined) out.districtId = node.districtId;\n if (node.neighborhoodId !== undefined) out.neighborhoodId = node.neighborhoodId;\n if (node.countyId !== undefined) out.countyId = node.countyId;\n if (node.countyName !== undefined) out.countyName = node.countyName;\n if (node.stateName !== undefined) out.stateName = node.stateName;\n if (node.postalCode !== undefined) out.postalCode = node.postalCode;\n if (node.countryCode !== undefined) out.countryCode = node.countryCode;\n if (node.phone !== undefined) out.phone = node.phone;\n if (node.addressLines !== undefined) out.addressLines = node.addressLines;\n return out;\n}\n\nfunction normalizeLine(node: TrendyolOrderLineNode): OrderLine {\n const out: OrderLine = {\n id: node.lineId !== undefined ? String(node.lineId) : '',\n quantity: typeof node.quantity === 'number' ? node.quantity : 0,\n productName: node.productName ?? '',\n barcode: node.barcode ?? '',\n lineUnitPrice: typeof node.lineUnitPrice === 'number' ? node.lineUnitPrice : 0,\n lineGrossAmount: typeof node.lineGrossAmount === 'number' ? node.lineGrossAmount : 0,\n raw: node as Record<string, unknown>,\n };\n if (node.productSize !== undefined) out.productSize = node.productSize;\n if (node.productColor !== undefined) out.productColor = node.productColor;\n if (node.stockCode !== undefined) out.stockCode = node.stockCode;\n if (node.contentId !== undefined) out.contentId = String(node.contentId);\n if (node.sellerId !== undefined) out.sellerId = String(node.sellerId);\n if (node.productCategoryId !== undefined) out.productCategoryId = String(node.productCategoryId);\n if (node.salesCampaignId !== undefined) out.salesCampaignId = String(node.salesCampaignId);\n if (node.currencyCode !== undefined) out.currencyCode = node.currencyCode;\n if (node.lineSellerDiscount !== undefined) out.lineSellerDiscount = node.lineSellerDiscount;\n if (node.lineTyDiscount !== undefined) out.lineTyDiscount = node.lineTyDiscount;\n if (node.lineTotalDiscount !== undefined) out.lineTotalDiscount = node.lineTotalDiscount;\n if (node.vatRate !== undefined) out.vatRate = node.vatRate;\n if (node.commission !== undefined) out.commission = node.commission;\n if (node.orderLineItemStatusName !== undefined) {\n out.orderLineItemStatusName = node.orderLineItemStatusName;\n }\n if (node.businessUnit !== undefined) out.businessUnit = node.businessUnit;\n if (Array.isArray(node.fastDeliveryOptions)) out.fastDeliveryOptions = node.fastDeliveryOptions;\n if (Array.isArray(node.discountDetails)) {\n out.discountDetails = node.discountDetails as OrderLine['discountDetails'];\n }\n return out;\n}\n\nfunction normalizeHistory(node: TrendyolPackageHistoryNode): PackageHistoryEntry {\n const out: PackageHistoryEntry = { raw: node as Record<string, unknown> };\n if (node.status !== undefined) out.status = node.status;\n const createdAt = toIso(node.createdDate);\n if (createdAt) out.createdAt = createdAt;\n return out;\n}\n\nfunction normalizeCustomer(node: TrendyolShipmentPackageNode): OrderCustomer {\n const out: OrderCustomer = {\n firstName: node.customerFirstName ?? '',\n lastName: node.customerLastName ?? '',\n };\n if (node.customerId !== undefined) out.id = String(node.customerId);\n if (node.customerEmail !== undefined) out.email = node.customerEmail;\n if (node.taxNumber !== undefined && node.taxNumber !== null) out.taxNumber = node.taxNumber;\n if (node.identityNumber !== undefined) out.identityNumber = node.identityNumber;\n return out;\n}\n\n/**\n * Normalize one raw Trendyol shipment-package node into the public\n * `ShipmentPackage` shape. Exported so consumers handling Trendyol\n * webhooks can reuse the SDK's normalization logic on the event body\n * (Trendyol POSTs the same shape it returns from `getShipmentPackages`).\n *\n * For full-webhook parsing use `parseWebhookEvent(rawBody)` from the\n * top-level package, which calls this internally per item.\n */\nexport function normalizeShipmentPackage(rawNode: unknown): ShipmentPackage {\n return normalizePackage((rawNode ?? {}) as TrendyolShipmentPackageNode);\n}\n\nfunction normalizePackage(node: TrendyolShipmentPackageNode): ShipmentPackage {\n const pkgId = node.shipmentPackageId ?? node.id;\n const out: ShipmentPackage = {\n id: pkgId !== undefined ? String(pkgId) : '',\n orderNumber: node.orderNumber ?? '',\n status: (node.status as ShipmentPackageStatus) ?? '',\n customer: normalizeCustomer(node),\n orderDate: toIso(node.orderDate) ?? '',\n lastModifiedDate: toIso(node.lastModifiedDate) ?? '',\n currencyCode: node.currencyCode ?? '',\n packageTotalPrice: typeof node.packageTotalPrice === 'number' ? node.packageTotalPrice : 0,\n packageGrossAmount: typeof node.packageGrossAmount === 'number' ? node.packageGrossAmount : 0,\n packageSellerDiscount:\n typeof node.packageSellerDiscount === 'number' ? node.packageSellerDiscount : 0,\n packageTyDiscount: typeof node.packageTyDiscount === 'number' ? node.packageTyDiscount : 0,\n packageTotalDiscount:\n typeof node.packageTotalDiscount === 'number' ? node.packageTotalDiscount : 0,\n lines: (node.lines ?? []).map(normalizeLine),\n packageHistories: (node.packageHistories ?? []).map(normalizeHistory),\n raw: node as Record<string, unknown>,\n };\n\n if (node.shipmentNumber !== undefined) out.shipmentNumber = String(node.shipmentNumber);\n if (node.originPackageIds !== undefined && node.originPackageIds !== null) {\n out.originPackageIds = node.originPackageIds.map((id) => String(id));\n }\n if (node.warehouseId !== undefined) out.warehouseId = String(node.warehouseId);\n if (node.supplierId !== undefined) out.supplierId = String(node.supplierId);\n if (node.shipmentPackageStatus !== undefined) {\n out.shipmentPackageStatus = node.shipmentPackageStatus as ShipmentPackageStatus;\n }\n\n const agreed = toIso(node.agreedDeliveryDate);\n if (agreed) out.agreedDeliveryDate = agreed;\n const estStart = toIso(node.estimatedDeliveryStartDate);\n if (estStart) out.estimatedDeliveryStartDate = estStart;\n const estEnd = toIso(node.estimatedDeliveryEndDate);\n if (estEnd) out.estimatedDeliveryEndDate = estEnd;\n const origin = toIso(node.originShipmentDate);\n if (origin) out.originShipmentDate = origin;\n\n const invoice = normalizeAddress(node.invoiceAddress);\n if (invoice) out.invoiceAddress = invoice;\n const shipment = normalizeAddress(node.shipmentAddress);\n if (shipment) out.shipmentAddress = shipment;\n if (node.deliveryAddressType !== undefined) out.deliveryAddressType = node.deliveryAddressType;\n\n if (node.cargoTrackingNumber !== undefined) {\n out.cargoTrackingNumber = String(node.cargoTrackingNumber);\n }\n if (node.cargoProviderName !== undefined) out.cargoProviderName = node.cargoProviderName;\n if (node.cargoProviderId !== undefined) out.cargoProviderId = String(node.cargoProviderId);\n if (node.cargoSenderNumber !== undefined) out.cargoSenderNumber = node.cargoSenderNumber;\n\n if (node.deliveryType !== undefined) out.deliveryType = node.deliveryType;\n if (node.whoPays !== undefined) out.whoPays = node.whoPays;\n if (node.timeSlotId !== undefined) out.timeSlotId = node.timeSlotId;\n if (typeof node.fastDelivery === 'boolean') out.fastDelivery = node.fastDelivery;\n if (node.fastDeliveryType !== undefined) out.fastDeliveryType = node.fastDeliveryType;\n if (typeof node.deliveredByService === 'boolean')\n out.deliveredByService = node.deliveredByService;\n\n if (typeof node.commercial === 'boolean') out.commercial = node.commercial;\n if (typeof node.micro === 'boolean') out.micro = node.micro;\n if (typeof node.giftBoxRequested === 'boolean') out.giftBoxRequested = node.giftBoxRequested;\n if (typeof node['3pByTrendyol'] === 'boolean') {\n out.threePByTrendyol = node['3pByTrendyol'];\n }\n if (typeof node.containsDangerousProduct === 'boolean') {\n out.containsDangerousProduct = node.containsDangerousProduct;\n }\n if (typeof node.isCod === 'boolean') out.isCod = node.isCod;\n if (typeof node.is4P === 'boolean') out.is4P = node.is4P;\n\n if (node.invoiceLink !== undefined) out.invoiceLink = node.invoiceLink;\n if (node.createdBy !== undefined) out.createdBy = node.createdBy;\n\n return out;\n}\n\n/**\n * Trendyol order (shipment-package) endpoints.\n *\n * Rate limit (per Trendyol service limits): tunable via the constructor with a\n * generous default.\n *\n * Pagination: `getShipmentPackages` (`list`) uses page-based pagination (not\n * nextPageToken). The SDK exposes `CursorPage<ShipmentPackage>` so the caller\n * can iterate with `paginate()` from `@lonca/core`; the opaque cursor encodes\n * the page index.\n *\n * **2026-06-08 limit:** `getShipmentPackages` reaches at most 10,000 records —\n * requests past that offset return HTTP 429. For full scans, periodic syncs, or\n * exports use {@link OrdersResource.listStream} (`getShipmentPackagesStream`),\n * which paginates with an opaque cursor and is not subject to the cap. Note the\n * stream endpoint exposes only the last 3 months of orders.\n */\nexport class OrdersResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n }\n\n /**\n * List shipment packages for the seller.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const pkg of paginate((p) => client.orders.list({ ...p, status: 'Created' }))) {\n * console.log(pkg.id, pkg.status, pkg.customer.firstName);\n * }\n * ```\n */\n async list(params: ListOrdersParams = {}): Promise<CursorPage<ShipmentPackage>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n if ((page + 1) * size > MAX_OFFSET_RECORDS) {\n throw new ValidationError({\n message: `getShipmentPackages can reach at most ${MAX_OFFSET_RECORDS} records (page ${page} × size ${size} exceeds it); use listStream() for full scans`,\n });\n }\n\n const query: Record<string, string | number | undefined> = { page, size };\n if (params.status) query.status = params.status;\n if (params.orderNumber) query.orderNumber = params.orderNumber;\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n\n const data = await this.transport.request<TrendyolGetOrdersResponse>({\n method: 'GET',\n path: `/integration/order/sellers/${this.transport.sellerId}/orders`,\n query,\n rateLimiter: this.limiter,\n });\n\n const items = (data.content ?? []).map(normalizePackage);\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n const result: CursorPage<ShipmentPackage> = { items };\n // Only advertise a next page when the server has one AND fetching it would\n // stay within the 10k-record offset cap. Emitting a cursor whose page would\n // trip the guard above makes `paginate()` throw mid-iteration after yielding\n // ~10k rows; instead the stream ends cleanly and the caller is steered to\n // `listStream()` for full scans (see the cap guard and class docs).\n const nextPageWithinCap = (page + 2) * size <= MAX_OFFSET_RECORDS;\n if (page + 1 < totalPages && nextPageWithinCap) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n /**\n * Push a shipment-package status update.\n *\n * Trendyol restricts the seller-side push to two transitions:\n * - `Picking` — order picked up from the shelf / being prepared\n * - `Invoiced` — invoice issued, ready for cargo handoff\n *\n * Other transitions (`Shipped`, `Delivered`, etc.) are driven by Trendyol\n * or the cargo provider — call `processAlternativeDelivery` or\n * `manualDeliverByPackageId` if you ship outside Trendyol's cargo\n * network.\n *\n * Returns void; Trendyol responds with 200 + empty body on success.\n */\n async updatePackageStatus(\n packageId: string | number,\n input: UpdatePackageStatusInput,\n ): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: this.packagePath(packageId),\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Notify Trendyol that one or more line items cannot be supplied\n * (\"Tedarik Edememe Bildirimi\"). Marks the listed line IDs as\n * `UnSupplied`. Trendyol cancels those quantities and notifies the\n * customer.\n *\n * `reasonId` is a numeric code Trendyol publishes separately — consult\n * the seller panel or the \"Tedarik Edememe\" docs for current values.\n *\n * Returns void; Trendyol responds with 200 + empty body on success.\n */\n async cancelPackageItem(\n packageId: string | number,\n input: CancelPackageItemInput,\n ): Promise<void> {\n if (!Array.isArray(input?.lines) || input.lines.length === 0) {\n throw new ValidationError({ message: 'cancelPackageItem: lines must not be empty' });\n }\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/items/unsupplied`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Extend the agreed delivery date for a shipment package by 1, 2, or 3 days.\n * Trendyol enforces the [1, 3] range server-side; the SDK validates client-side\n * to fail fast.\n *\n * Returns void; Trendyol responds with 200 + empty body on success.\n */\n async extendDeliveryDate(packageId: string | number, extendedDayCount: 1 | 2 | 3): Promise<void> {\n if (![1, 2, 3].includes(extendedDayCount)) {\n throw new ValidationError({\n message: `extendDeliveryDate: extendedDayCount must be 1, 2, or 3 (got ${extendedDayCount})`,\n });\n }\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/extended-agreed-delivery-date`,\n body: { extendedDayCount },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Notify Trendyol of an alternative delivery channel — used when the\n * seller is shipping via a non-Trendyol cargo provider. Trendyol then\n * either SMSes the customer the tracking link (when `isPhoneNumber` is\n * `true`) or stores the tracking URL on the package directly.\n *\n * Returns void; Trendyol responds with 200 + empty body on success.\n */\n async processAlternativeDelivery(\n packageId: string | number,\n input: ProcessAlternativeDeliveryInput,\n ): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/alternative-delivery`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Split a shipment package by moving a set of line IDs into a new\n * package. The original package keeps the remaining lines.\n *\n * @param packageId The package to split.\n * @param orderLineIds Line IDs to move into the new package (1+).\n * @throws {ValidationError} when `orderLineIds` is empty.\n */\n async splitPackage(packageId: string | number, orderLineIds: number[]): Promise<void> {\n if (!Array.isArray(orderLineIds) || orderLineIds.length === 0) {\n throw new ValidationError({ message: 'splitPackage: orderLineIds must not be empty' });\n }\n await this.transport.request<unknown>({\n method: 'POST',\n path: `${this.packagePath(packageId)}/split`,\n body: { orderLineIds },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Split a shipment package by quantity. Each `QuantitySplit` entry\n * carves a single line into multiple packages — e.g. `{ orderLineId: 100,\n * quantities: [2, 2, 1] }` splits 5 units of line 100 into three packages\n * of 2 + 2 + 1.\n *\n * @throws {ValidationError} when `quantitySplit` is empty.\n */\n async splitPackageByQuantity(\n packageId: string | number,\n quantitySplit: QuantitySplit[],\n ): Promise<void> {\n if (!Array.isArray(quantitySplit) || quantitySplit.length === 0) {\n throw new ValidationError({\n message: 'splitPackageByQuantity: quantitySplit must not be empty',\n });\n }\n await this.transport.request<unknown>({\n method: 'POST',\n path: `${this.packagePath(packageId)}/quantity-split`,\n body: { quantitySplit },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Split a shipment package into multiple new packages by grouping line\n * IDs. Each `SplitGroup` becomes one new package containing the listed\n * line IDs.\n *\n * @throws {ValidationError} when `splitGroups` is empty.\n */\n async multiSplitPackage(packageId: string | number, splitGroups: SplitGroup[]): Promise<void> {\n if (!Array.isArray(splitGroups) || splitGroups.length === 0) {\n throw new ValidationError({ message: 'multiSplitPackage: splitGroups must not be empty' });\n }\n await this.transport.request<unknown>({\n method: 'POST',\n path: `${this.packagePath(packageId)}/multi-split`,\n body: { splitGroups },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Split a shipment package into multiple new packages, each containing a\n * mix of line items at specific quantities. This is the most expressive\n * split — use it when you need fine-grained control over which line IDs\n * and how many of each end up in each new package.\n *\n * @throws {ValidationError} when `splitPackages` is empty.\n */\n async splitMultiPackagesByQuantity(\n packageId: string | number,\n splitPackages: SplitPackagePlan[],\n ): Promise<void> {\n if (!Array.isArray(splitPackages) || splitPackages.length === 0) {\n throw new ValidationError({\n message: 'splitMultiPackagesByQuantity: splitPackages must not be empty',\n });\n }\n await this.transport.request<unknown>({\n method: 'POST',\n path: `${this.packagePath(packageId)}/split-packages`,\n body: { splitPackages },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Change the cargo provider on an existing shipment package. Use one of\n * Trendyol's documented marketplace cargo codes (`'YKMP'`, `'ARASMP'`,\n * `'SURATMP'`, etc.) — see `TrendyolCargoProvider` for the full list.\n */\n async changeCargoProvider(\n packageId: string | number,\n cargoProvider: TrendyolCargoProvider,\n ): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/cargo-providers`,\n body: { cargoProvider },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Mark a shipment package as manually delivered via its package ID.\n * Used when the seller delivered the order outside Trendyol's cargo\n * network and needs to flip the package to `Delivered` after handover.\n *\n * No request body; Trendyol responds with 200 + empty body on success.\n */\n async manualDeliverByPackageId(packageId: string | number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/manual-invoice-delivery`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Manual-deliver variant that takes the cargo tracking number instead\n * of the package ID. Useful when you only have the tracking number on\n * hand (e.g., from a cargo provider webhook).\n *\n * Note the path structure: tracking number sits at a sibling location,\n * not under `/shipment-packages/{id}/...`.\n */\n async manualDeliverByTrackingNumber(cargoTrackingNumber: string | number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `/integration/order/sellers/${this.transport.sellerId}/shipment-packages/manual-invoice-delivery-by-tracking-number/${encodeURIComponent(String(cargoTrackingNumber))}`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Mark a package as delivered through an authorized service (\"yetkili\n * servis\"). For appliance / installation-required products that are\n * delivered + installed by a third-party service partner.\n */\n async markDeliveredByService(packageId: string | number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/delivered-by-service`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Update box / packaging metadata on a shipment package (desi value\n * and/or number of boxes). Either field can be sent alone.\n */\n async updateBoxInfo(packageId: string | number, input: UpdateBoxInfoInput): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/box-info`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Update labor costs for one or more order lines.\n *\n * **Wire note:** Trendyol's request body is a raw array (no envelope),\n * not `{ items: [...] }`. The SDK forwards `items` verbatim.\n *\n * @throws {ValidationError} when `items` is empty.\n */\n async updateLaborCosts(packageId: string | number, items: LaborCostInput[]): Promise<void> {\n if (!Array.isArray(items) || items.length === 0) {\n throw new ValidationError({ message: 'updateLaborCosts: items must not be empty' });\n }\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/labor-costs`,\n body: items,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Reassign a shipment package to a different warehouse. `warehouseId`\n * comes from `client.suppliers.getAddresses()` (filter by `isShipmentAddress`).\n */\n async updateWarehouse(packageId: string | number, warehouseId: number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/warehouse`,\n body: { warehouseId },\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Stream variant of `list()`. Trendyol's `getShipmentPackagesStream`\n * returns the same `ShipmentPackage` shape but paginates with an opaque\n * cursor — useful when the dataset is large and page-based pagination\n * would hit the 10 000-record cap.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const pkg of paginate((p) =>\n * client.orders.listStream({ ...p, packageItemStatuses: 'Created,Picking' }),\n * )) {\n * console.log(pkg.id, pkg.status);\n * }\n * ```\n */\n async listStream(params: ListOrdersStreamParams = {}): Promise<CursorPage<ShipmentPackage>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);\n const query: Record<string, string | number | undefined> = { size };\n if (params.cursor) query.nextCursor = params.cursor;\n if (params.packageItemStatuses) query.packageItemStatuses = params.packageItemStatuses;\n if (params.lastModifiedStartDate) {\n query.lastModifiedStartDate = params.lastModifiedStartDate.getTime();\n }\n if (params.lastModifiedEndDate) {\n query.lastModifiedEndDate = params.lastModifiedEndDate.getTime();\n }\n\n interface StreamResponse {\n content?: TrendyolShipmentPackageNode[];\n size?: number;\n hasMore?: boolean;\n nextCursor?: string;\n }\n const data = await this.transport.request<StreamResponse>({\n method: 'GET',\n path: `/integration/order/sellers/${this.transport.sellerId}/orders/stream`,\n query,\n rateLimiter: this.limiter,\n });\n\n const items = (data.content ?? []).map(normalizePackage);\n const result: CursorPage<ShipmentPackage> = { items };\n if (data.hasMore && data.nextCursor) {\n result.nextCursor = data.nextCursor;\n }\n return result;\n }\n\n /**\n * Fetch the per-parcel cargo-fee breakdown for a single cargo invoice\n * (Trendyol's `getCargoInvoiceItems`). Useful for reconciling Trendyol's\n * cargo deductions against your shipped packages.\n *\n * `invoiceSerialNumber` is sourced from the Current Account Statement\n * (\"Cari Hesap Ekstresi\") with `transactionType=DeductionInvoices`.\n *\n * Page-based pagination internally (cursor encodes the page index).\n */\n async getCargoInvoiceItems(\n invoiceSerialNumber: string,\n params: CursorPaginationParams = {},\n ): Promise<CursorPage<CargoInvoiceItem>> {\n const size = Math.min(params.limit ?? 500, 500);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n interface WireRow {\n shipmentPackageType?: string;\n parcelUniqueId?: number | string;\n orderNumber?: string;\n amount?: number;\n desi?: number;\n [key: string]: unknown;\n }\n interface WireResponse {\n page?: number;\n size?: number;\n totalPages?: number;\n totalElements?: number;\n content?: WireRow[];\n }\n\n const data = await this.transport.request<WireResponse>({\n method: 'GET',\n path: `/integration/finance/che/sellers/${this.transport.sellerId}/cargo-invoice/${encodeURIComponent(invoiceSerialNumber)}/items`,\n query: { page, size },\n rateLimiter: this.limiter,\n });\n\n const items: CargoInvoiceItem[] = (data.content ?? []).map((row) => {\n const out: CargoInvoiceItem = { raw: row as Record<string, unknown> };\n if (row.shipmentPackageType !== undefined) out.shipmentPackageType = row.shipmentPackageType;\n if (row.parcelUniqueId !== undefined) {\n out.parcelUniqueId =\n typeof row.parcelUniqueId === 'string' ? row.parcelUniqueId : String(row.parcelUniqueId);\n }\n if (row.orderNumber !== undefined) out.orderNumber = row.orderNumber;\n if (typeof row.amount === 'number') out.amount = row.amount;\n if (typeof row.desi === 'number') out.desi = row.desi;\n return out;\n });\n\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n const result: CursorPage<CargoInvoiceItem> = { items };\n if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n /**\n * Notify Trendyol that a shipped package was returned to you (manual\n * return flow, e.g. customer dropped it at your address or you got the\n * package back without going through Trendyol's return cargo).\n *\n * No body; Trendyol responds with 200 + empty body on success.\n */\n async manualReturnByPackageId(packageId: string | number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.packagePath(packageId)}/manual-return`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Manual-return variant that takes the cargo tracking number instead of\n * the package ID. Useful when the cargo provider's webhook only carries\n * the tracking number.\n *\n * Sibling path (not under `/{packageId}/...`).\n */\n async manualReturnByTrackingNumber(cargoTrackingNumber: string | number): Promise<void> {\n await this.transport.request<unknown>({\n method: 'PUT',\n path: `/integration/order/sellers/${this.transport.sellerId}/shipment-packages/manual-return-by-tracking-number/${encodeURIComponent(String(cargoTrackingNumber))}`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Fetch Trendyol Express compensation tickets (claims filed when a\n * shipment is lost or damaged in transit). Page-based pagination\n * internally; the SDK exposes the cursor convention.\n *\n * Note the different base path — `/integration/tex/compensation/...`,\n * not the regular `/integration/order/...`.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * const tickets = await client.orders.getCompensationTickets({\n * startDate: new Date('2026-01-01'),\n * endDate: new Date('2026-02-01'),\n * });\n * for (const t of tickets.items) {\n * console.log(t.orderNumber, t.currentState, t.stateMessage);\n * }\n * ```\n */\n async getCompensationTickets(\n params: ListCompensationTicketsParams = {},\n ): Promise<CursorPage<CompensationTicket>> {\n const size = Math.min(params.limit ?? 200, 200);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n const query: Record<string, string | number | undefined> = { page, size };\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n\n interface WireItem {\n itemAmount?: number;\n itemCode?: string;\n itemCount?: number;\n itemName?: string;\n }\n interface WireTicket {\n cargoProvider?: string;\n compensateReason?: string;\n createDate?: number;\n currentState?: string;\n deliveryNumber?: string;\n itemDetails?: WireItem[];\n orderNumber?: string;\n requestedBy?: string;\n stateMessage?: string;\n totalItemsAmount?: string;\n [key: string]: unknown;\n }\n interface WireResponse {\n totalCount?: number;\n /**\n * Trendyol's docs say `data: { items: [...] }` but typical Trendyol\n * paginated responses use `content: [...]` — accept both defensively.\n */\n data?: { items?: WireTicket[]; content?: WireTicket[] } | WireTicket[];\n content?: WireTicket[];\n }\n\n const res = await this.transport.request<WireResponse>({\n method: 'GET',\n path: `/integration/tex/compensation/sellers/${this.transport.sellerId}/tickets`,\n query,\n rateLimiter: this.limiter,\n });\n\n const tickets: WireTicket[] = Array.isArray(res.data)\n ? res.data\n : (res.data?.items ?? res.data?.content ?? res.content ?? []);\n\n const items: CompensationTicket[] = tickets.map((t) => {\n const itemDetails: CompensationItemDetail[] = (t.itemDetails ?? []).map((d) => {\n const out: CompensationItemDetail = {};\n if (typeof d.itemAmount === 'number') out.itemAmount = d.itemAmount;\n if (d.itemCode !== undefined) out.itemCode = d.itemCode;\n if (typeof d.itemCount === 'number') out.itemCount = d.itemCount;\n if (d.itemName !== undefined) out.itemName = d.itemName;\n return out;\n });\n const out: CompensationTicket = {\n itemDetails,\n raw: t as Record<string, unknown>,\n };\n if (t.cargoProvider !== undefined) out.cargoProvider = t.cargoProvider;\n if (t.compensateReason !== undefined) out.compensateReason = t.compensateReason;\n const createdAt = toIso(t.createDate);\n if (createdAt) out.createdAt = createdAt;\n if (t.currentState !== undefined) {\n out.currentState = t.currentState as CompensationTicket['currentState'];\n }\n if (t.deliveryNumber !== undefined) out.deliveryNumber = t.deliveryNumber;\n if (t.orderNumber !== undefined) out.orderNumber = t.orderNumber;\n if (t.requestedBy !== undefined) out.requestedBy = t.requestedBy;\n if (t.stateMessage !== undefined) out.stateMessage = t.stateMessage;\n if (t.totalItemsAmount !== undefined) out.totalItemsAmount = t.totalItemsAmount;\n return out;\n });\n\n // Paging derived from totalCount vs page*size.\n const result: CursorPage<CompensationTicket> = { items };\n const total = typeof res.totalCount === 'number' ? res.totalCount : 0;\n if ((page + 1) * size < total) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n private packagePath(packageId: string | number): string {\n return `/integration/order/sellers/${this.transport.sellerId}/shipment-packages/${encodeURIComponent(String(packageId))}`;\n }\n}\n","import {\n TokenBucketRateLimiter,\n ValidationError,\n type CursorPage,\n type CursorPaginationParams,\n} from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n ApprovedProductStatus,\n BatchRequestItemResult,\n BatchRequestResult,\n BuyboxInfo,\n NamedRef,\n Product,\n ProductAttribute,\n ProductBase,\n ProductStockPrice,\n ProductStockPriceVariant,\n ProductVariant,\n UnapprovedProduct,\n UnapprovedProductRejectReason,\n} from '../types/product.js';\nimport type {\n BatchAcceptedResponse,\n CreateProductV2Input,\n UpdateContentInput,\n UpdateDeliveryInfoInput,\n UpdateUnapprovedInput,\n UpdateVariantInput,\n} from '../types/product-write.js';\n\nconst DEFAULT_PAGE_SIZE = 50;\n/** Trendyol caps `page × size` at 10,000; we cap `size` defensively. */\nconst MAX_PAGE_SIZE = 1000;\n/** The inventory-and-price endpoint caps `size` at 100 (tighter than `list`). */\nconst MAX_INVENTORY_PAGE_SIZE = 100;\n\nexport interface ListProductsParams extends CursorPaginationParams {\n /** Filter by a single barcode. */\n barcode?: string;\n /** Filter products updated on or after this date (Trendyol expects ms-epoch). */\n startDate?: Date;\n /** Filter products updated on or before this date. */\n endDate?: Date;\n}\n\n/**\n * Filters for `products.listInventoryAndPrice` (Trendyol's lightweight\n * `inventory-and-price` approved-product filter). All filters are optional;\n * pass none to page through every approved product's stock + price.\n */\nexport interface ListInventoryAndPriceParams extends CursorPaginationParams {\n /** Filter by a single barcode. */\n barcode?: string;\n /** Filter by a single contentId. */\n contentId?: string;\n /** Filter by the seller's stock code. */\n stockCode?: string;\n /** Filter by the seller's productMainId. */\n productMainId?: string;\n /** Filter by listing status (archived / blacklisted / locked / onSale / notOnSale). */\n status?: ApprovedProductStatus;\n /**\n * Sort by `SellerCreatedDate`. `ASC` = oldest→newest, `DESC` = newest→oldest.\n */\n orderByDirection?: 'ASC' | 'DESC';\n /**\n * Storefront code sent as the `storeFrontCode` header. Required on the\n * International marketplace; optional on the Türkiye marketplace.\n */\n storeFrontCode?: string;\n}\n\n/** Date field to filter against on `listUnapproved` (default: server choice). */\nexport type UnapprovedDateQueryType = 'CREATED_DATE' | 'LAST_MODIFIED_DATE';\n\nexport interface ListUnapprovedProductsParams extends CursorPaginationParams {\n barcode?: string;\n startDate?: Date;\n endDate?: Date;\n /** Choose which date `startDate`/`endDate` apply to. */\n dateQueryType?: UnapprovedDateQueryType;\n /**\n * Optional override of the seller-scoped query (rare; defaults to the\n * client's `sellerId`).\n */\n supplierId?: number;\n}\n\n/** Trendyol caps `barcodes` at 10 for the buybox endpoint. */\nconst MAX_BUYBOX_BARCODES = 10;\n\n// ─── Wire types (Trendyol's real shape, verified live) ──────────────────────\n\ninterface TrendyolRef {\n id?: number | string;\n name?: string;\n}\n\ninterface TrendyolAttributeNode {\n attributeId?: number | string;\n attributeName?: string;\n attributeValueId?: number | string;\n attributeValue?: string;\n}\n\ninterface TrendyolVariantNode {\n variantId?: number | string;\n barcode?: string;\n commission?: number;\n attributes?: TrendyolAttributeNode[];\n productUrl?: string;\n onSale?: boolean;\n stock?: { quantity?: number } | number;\n [key: string]: unknown;\n}\n\ninterface TrendyolProductNode {\n contentId?: number | string;\n productMainId?: string;\n title?: string;\n description?: string;\n brand?: TrendyolRef;\n category?: TrendyolRef;\n images?: Array<{ url?: string } | string>;\n attributes?: TrendyolAttributeNode[];\n variants?: TrendyolVariantNode[];\n creationDate?: number;\n lastModifiedDate?: number;\n lastModifiedBy?: string;\n [key: string]: unknown;\n}\n\ninterface TrendyolFilterResponse {\n content?: TrendyolProductNode[];\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n nextPageToken?: string;\n}\n\n// ─── Inventory-and-price (stock + price only) wire shape ────────────────────\n// Verified live against Trendyol STAGE on 2026-06-03 (seller 2738):\n// response keys totalElements/totalPages/page/size/nextPageToken/content;\n// variant keys variantId/barcode/salePrice/listPrice/quantity/stockCode/\n// stockLastModifiedDate. `storeFrontCode` header is NOT required on the\n// Türkiye marketplace (200 without it).\n\ninterface TrendyolStockPriceVariantNode {\n variantId?: number | string;\n barcode?: string;\n salePrice?: number;\n listPrice?: number;\n quantity?: number;\n stockCode?: string;\n /** ms-epoch; `null` when stock was never updated. */\n stockLastModifiedDate?: number | null;\n [key: string]: unknown;\n}\n\ninterface TrendyolStockPriceNode {\n contentId?: number | string;\n productMainId?: string;\n variants?: TrendyolStockPriceVariantNode[];\n [key: string]: unknown;\n}\n\ninterface TrendyolStockPriceResponse {\n content?: TrendyolStockPriceNode[];\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n nextPageToken?: string;\n}\n\n// ─── Unapproved (draft) products wire shape (verified STAGE 2026-05-25) ────\n\ninterface TrendyolUnapprovedRejectReason {\n rejectReason?: string;\n rejectReasonDetail?: string;\n}\n\ninterface TrendyolUnapprovedNode {\n supplierId?: number | string;\n productMainId?: string;\n status?: string;\n createDateTime?: number;\n lastUpdateDate?: number;\n lastPriceChangeDate?: number;\n lastStockChangeDate?: number;\n brand?: TrendyolRef;\n category?: TrendyolRef;\n barcode?: string;\n title?: string;\n description?: string;\n quantity?: number;\n listPrice?: number;\n salePrice?: number;\n vatRate?: number;\n dimensionalWeight?: number | null;\n stockCode?: string;\n origin?: string | null;\n /** Spec calls this `media`; live wire returns `images`. We accept both. */\n images?: Array<{ url?: string } | string>;\n media?: Array<{ url?: string } | string>;\n attributes?: TrendyolAttributeNode[];\n rejectReasonDetails?: TrendyolUnapprovedRejectReason[];\n locationBasedDelivery?: 'ENABLED' | 'DISABLED' | null;\n lotNumber?: string | null;\n specialConsumptionTax?: number | null;\n sgrPrice?: number | null;\n [key: string]: unknown;\n}\n\ninterface TrendyolUnapprovedResponse {\n content?: TrendyolUnapprovedNode[];\n totalElements?: number;\n totalPages?: number;\n page?: number;\n size?: number;\n nextPageToken?: string;\n}\n\n// ─── Buybox + ProductBase wire shapes ──────────────────────────────────────\n\ninterface TrendyolBuyboxInfoNode {\n barcode?: string;\n buyboxOrder?: number;\n buyboxPrice?: number;\n hasMultipleSeller?: boolean;\n secondBuyboxPrice?: number | null;\n thirdBuyboxPrice?: number | null;\n [key: string]: unknown;\n}\n\ninterface TrendyolBuyboxResponse {\n buyboxInfo?: TrendyolBuyboxInfoNode[];\n /** Some Trendyol responses use `content` instead — accept both defensively. */\n content?: TrendyolBuyboxInfoNode[];\n}\n\ninterface TrendyolProductBaseResponse {\n barcode?: string;\n approved?: boolean;\n approvedDate?: number;\n archived?: boolean;\n listingId?: string;\n contentId?: number | string;\n [key: string]: unknown;\n}\n\ninterface TrendyolBatchResultResponse {\n batchRequestId?: string;\n status?: string;\n itemCount?: number;\n failedItemCount?: number;\n items?: Array<{\n requestItem?: unknown;\n status?: string;\n failureReasons?: string[];\n }>;\n creationDate?: number;\n lastModification?: number;\n sourceType?: string;\n batchRequestType?: string;\n notes?: string;\n objectKey?: string;\n storeFrontCode?: string;\n [key: string]: unknown;\n}\n\n// ─── Normalizers ────────────────────────────────────────────────────────────\n\nfunction normalizeRef(ref: TrendyolRef | undefined): NamedRef {\n return {\n id: ref?.id !== undefined ? String(ref.id) : '',\n name: ref?.name ?? '',\n };\n}\n\nfunction normalizeAttribute(attr: TrendyolAttributeNode): ProductAttribute {\n const out: ProductAttribute = {\n attributeId: attr.attributeId !== undefined ? String(attr.attributeId) : '',\n };\n if (attr.attributeName !== undefined) out.attributeName = attr.attributeName;\n if (attr.attributeValueId !== undefined) {\n out.attributeValueId = String(attr.attributeValueId);\n }\n if (attr.attributeValue !== undefined) out.attributeValue = attr.attributeValue;\n return out;\n}\n\nfunction normalizeImages(images: TrendyolProductNode['images']): string[] {\n if (!images) return [];\n return images\n .map((img) => (typeof img === 'string' ? img : img?.url))\n .filter((u): u is string => typeof u === 'string' && u.length > 0);\n}\n\nfunction normalizeStock(stock: TrendyolVariantNode['stock']): number | undefined {\n if (typeof stock === 'number') return stock;\n if (stock && typeof stock === 'object' && typeof stock.quantity === 'number') {\n return stock.quantity;\n }\n return undefined;\n}\n\nfunction normalizeVariant(variant: TrendyolVariantNode): ProductVariant {\n const out: ProductVariant = {\n variantId: variant.variantId !== undefined ? String(variant.variantId) : '',\n barcode: variant.barcode ?? '',\n attributes: (variant.attributes ?? []).map(normalizeAttribute),\n raw: variant as Record<string, unknown>,\n };\n if (typeof variant.commission === 'number') out.commission = variant.commission;\n if (variant.productUrl !== undefined) out.productUrl = variant.productUrl;\n if (typeof variant.onSale === 'boolean') out.onSale = variant.onSale;\n const stock = normalizeStock(variant.stock);\n if (stock !== undefined) out.stock = stock;\n return out;\n}\n\nfunction toIso(epochMs: number | undefined): string | undefined {\n if (typeof epochMs !== 'number' || !Number.isFinite(epochMs)) return undefined;\n return new Date(epochMs).toISOString();\n}\n\nfunction normalizeProduct(node: TrendyolProductNode): Product {\n const out: Product = {\n contentId: node.contentId !== undefined ? String(node.contentId) : '',\n productMainId: node.productMainId ?? '',\n title: node.title ?? '',\n brand: normalizeRef(node.brand),\n category: normalizeRef(node.category),\n images: normalizeImages(node.images),\n attributes: (node.attributes ?? []).map(normalizeAttribute),\n variants: (node.variants ?? []).map(normalizeVariant),\n createdAt: toIso(node.creationDate) ?? '',\n updatedAt: toIso(node.lastModifiedDate) ?? '',\n raw: node as Record<string, unknown>,\n };\n if (node.description !== undefined) out.description = node.description;\n if (node.lastModifiedBy !== undefined) out.lastModifiedBy = node.lastModifiedBy;\n return out;\n}\n\nfunction normalizeStockPriceVariant(node: TrendyolStockPriceVariantNode): ProductStockPriceVariant {\n const out: ProductStockPriceVariant = {\n variantId: node.variantId !== undefined ? String(node.variantId) : '',\n barcode: node.barcode ?? '',\n raw: node as Record<string, unknown>,\n };\n if (typeof node.salePrice === 'number') out.salePrice = node.salePrice;\n if (typeof node.listPrice === 'number') out.listPrice = node.listPrice;\n if (typeof node.quantity === 'number') out.quantity = node.quantity;\n if (node.stockCode !== undefined) out.stockCode = node.stockCode;\n if (node.stockLastModifiedDate !== undefined && node.stockLastModifiedDate !== null) {\n const iso = toIso(node.stockLastModifiedDate);\n if (iso) out.stockLastModifiedAt = iso;\n }\n return out;\n}\n\nfunction normalizeStockPrice(node: TrendyolStockPriceNode): ProductStockPrice {\n return {\n contentId: node.contentId !== undefined ? String(node.contentId) : '',\n productMainId: node.productMainId ?? '',\n variants: (node.variants ?? []).map(normalizeStockPriceVariant),\n raw: node as Record<string, unknown>,\n };\n}\n\nfunction normalizeUnapprovedRejectReason(\n r: TrendyolUnapprovedRejectReason,\n): UnapprovedProductRejectReason {\n const out: UnapprovedProductRejectReason = {};\n if (r.rejectReason !== undefined) out.rejectReason = r.rejectReason;\n if (r.rejectReasonDetail !== undefined) out.rejectReasonDetail = r.rejectReasonDetail;\n return out;\n}\n\nfunction normalizeUnapproved(node: TrendyolUnapprovedNode): UnapprovedProduct {\n // Spec calls it `media`, live wire calls it `images` — accept both, prefer `images`.\n const imagesSource = node.images ?? node.media;\n const out: UnapprovedProduct = {\n productMainId: node.productMainId ?? '',\n brand: normalizeRef(node.brand),\n category: normalizeRef(node.category),\n barcode: node.barcode ?? '',\n title: node.title ?? '',\n images: normalizeImages(imagesSource),\n attributes: (node.attributes ?? []).map(normalizeAttribute),\n rejectReasonDetails: (node.rejectReasonDetails ?? []).map(normalizeUnapprovedRejectReason),\n raw: node as Record<string, unknown>,\n };\n if (node.supplierId !== undefined) out.supplierId = String(node.supplierId);\n if (node.status !== undefined) out.status = node.status as UnapprovedProduct['status'];\n if (node.description !== undefined) out.description = node.description;\n if (typeof node.quantity === 'number') out.quantity = node.quantity;\n if (typeof node.listPrice === 'number') out.listPrice = node.listPrice;\n if (typeof node.salePrice === 'number') out.salePrice = node.salePrice;\n if (typeof node.vatRate === 'number') out.vatRate = node.vatRate;\n if (node.dimensionalWeight !== undefined && node.dimensionalWeight !== null) {\n out.dimensionalWeight = node.dimensionalWeight;\n }\n if (node.stockCode !== undefined) out.stockCode = node.stockCode;\n if (node.origin !== undefined) out.origin = node.origin;\n if (node.locationBasedDelivery !== undefined) {\n out.locationBasedDelivery = node.locationBasedDelivery;\n }\n if (node.lotNumber !== undefined) out.lotNumber = node.lotNumber;\n if (node.specialConsumptionTax !== undefined) {\n out.specialConsumptionTax = node.specialConsumptionTax;\n }\n if (node.sgrPrice !== undefined) out.sgrPrice = node.sgrPrice;\n const createdAt = toIso(node.createDateTime);\n if (createdAt) out.createdAt = createdAt;\n const updatedAt = toIso(node.lastUpdateDate);\n if (updatedAt) out.updatedAt = updatedAt;\n const priceChanged = toIso(node.lastPriceChangeDate);\n if (priceChanged) out.lastPriceChangedAt = priceChanged;\n const stockChanged = toIso(node.lastStockChangeDate);\n if (stockChanged) out.lastStockChangedAt = stockChanged;\n return out;\n}\n\nfunction normalizeBuyboxInfo(node: TrendyolBuyboxInfoNode): BuyboxInfo {\n const out: BuyboxInfo = {\n barcode: node.barcode ?? '',\n raw: node as Record<string, unknown>,\n };\n if (typeof node.buyboxOrder === 'number') out.buyboxOrder = node.buyboxOrder;\n if (typeof node.buyboxPrice === 'number') out.buyboxPrice = node.buyboxPrice;\n if (typeof node.hasMultipleSeller === 'boolean') {\n out.hasMultipleSeller = node.hasMultipleSeller;\n }\n if (node.secondBuyboxPrice !== undefined) out.secondBuyboxPrice = node.secondBuyboxPrice;\n if (node.thirdBuyboxPrice !== undefined) out.thirdBuyboxPrice = node.thirdBuyboxPrice;\n return out;\n}\n\nfunction normalizeProductBase(data: TrendyolProductBaseResponse): ProductBase {\n const out: ProductBase = {\n barcode: data.barcode ?? '',\n approved: !!data.approved,\n archived: !!data.archived,\n raw: data as Record<string, unknown>,\n };\n const approvedAt = toIso(data.approvedDate);\n if (approvedAt) out.approvedAt = approvedAt;\n if (data.listingId !== undefined) out.listingId = data.listingId;\n if (data.contentId !== undefined) out.contentId = String(data.contentId);\n return out;\n}\n\nfunction normalizeBatchResult(data: TrendyolBatchResultResponse): BatchRequestResult {\n const items: BatchRequestItemResult[] = (data.items ?? []).map((item) => {\n const result: BatchRequestItemResult = {};\n if (item.requestItem !== undefined) result.requestItem = item.requestItem;\n if (item.status !== undefined) result.status = item.status;\n if (item.failureReasons !== undefined) result.failureReasons = item.failureReasons;\n return result;\n });\n const out: BatchRequestResult = {\n batchRequestId: typeof data.batchRequestId === 'string' ? data.batchRequestId : '',\n status: (data.status as BatchRequestResult['status']) ?? 'PROCESSING',\n items,\n raw: data as Record<string, unknown>,\n };\n if (typeof data.itemCount === 'number') out.itemCount = data.itemCount;\n if (typeof data.failedItemCount === 'number') out.failedItemCount = data.failedItemCount;\n const createdAt = toIso(data.creationDate);\n if (createdAt) out.createdAt = createdAt;\n const lastModifiedAt = toIso(data.lastModification);\n if (lastModifiedAt) out.lastModifiedAt = lastModifiedAt;\n if (data.sourceType !== undefined) out.sourceType = data.sourceType;\n if (data.batchRequestType !== undefined) out.batchRequestType = data.batchRequestType;\n if (data.notes !== undefined) out.notes = data.notes;\n if (data.objectKey !== undefined) out.objectKey = data.objectKey;\n if (data.storeFrontCode !== undefined) out.storeFrontCode = data.storeFrontCode;\n return out;\n}\n\n/** Trendyol caps `items[]` at 1000 for every async write endpoint. */\nconst MAX_WRITE_ITEMS = 1000;\n/** Trendyol's documented service-limits cap delete at 100 req/min (separate bucket). */\nconst DELETE_RATE_PER_MIN = 100;\n\n/**\n * Trendyol product read + write + lifecycle + batch-result endpoints.\n *\n * Rate limits (per Trendyol service limits):\n * - filterProducts (approved + unapproved + getProductBase): 2000 req/min\n * - getBatchRequestResult: 1000 req/min\n * - getBuyboxInformation: 1000 req/min\n * - create/update/archive/unlock product writes: 1000 req/min (shared bucket)\n * - delete: 100 req/min (separate bucket)\n */\nexport class ProductsResource {\n private readonly filterLimiter: TokenBucketRateLimiter;\n private readonly batchLimiter: TokenBucketRateLimiter;\n private readonly buyboxLimiter: TokenBucketRateLimiter;\n private readonly writeLimiter: TokenBucketRateLimiter;\n private readonly deleteLimiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n options: {\n filterLimiter?: TokenBucketRateLimiter;\n batchLimiter?: TokenBucketRateLimiter;\n buyboxLimiter?: TokenBucketRateLimiter;\n writeLimiter?: TokenBucketRateLimiter;\n deleteLimiter?: TokenBucketRateLimiter;\n } = {},\n ) {\n this.filterLimiter =\n options.filterLimiter ?? new TokenBucketRateLimiter({ capacity: 2000, intervalMs: 60_000 });\n this.batchLimiter =\n options.batchLimiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n this.buyboxLimiter =\n options.buyboxLimiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n this.writeLimiter =\n options.writeLimiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n this.deleteLimiter =\n options.deleteLimiter ??\n new TokenBucketRateLimiter({ capacity: DELETE_RATE_PER_MIN, intervalMs: 60_000 });\n }\n\n private validateBarcodes(barcodes: string[], methodLabel: string): void {\n if (!Array.isArray(barcodes) || barcodes.length === 0) {\n throw new ValidationError({ message: `${methodLabel}: barcodes must not be empty` });\n }\n if (barcodes.length > MAX_WRITE_ITEMS) {\n throw new ValidationError({\n message: `${methodLabel}: max ${MAX_WRITE_ITEMS} barcodes per call (got ${barcodes.length})`,\n });\n }\n }\n\n private async submitWrite<T>(\n endpoint: string,\n items: T[],\n methodLabel: string,\n ): Promise<BatchAcceptedResponse> {\n if (!Array.isArray(items) || items.length === 0) {\n throw new ValidationError({ message: `${methodLabel}: items must not be empty` });\n }\n if (items.length > MAX_WRITE_ITEMS) {\n throw new ValidationError({\n message: `${methodLabel}: max ${MAX_WRITE_ITEMS} items per call (got ${items.length})`,\n });\n }\n const data = await this.transport.request<BatchAcceptedResponse>({\n method: 'POST',\n path: `/integration/product/sellers/${this.transport.sellerId}${endpoint}`,\n body: { items },\n rateLimiter: this.writeLimiter,\n });\n return { batchRequestId: data?.batchRequestId ?? '' };\n }\n\n /**\n * List approved products. Use `paginate()` from `@lonca/core` to iterate\n * lazily across pages.\n *\n * Trendyol exposes both page-based and `nextPageToken`-based pagination\n * (the latter required when the dataset exceeds 10,000 items). The SDK\n * picks the right strategy automatically — pass our opaque `cursor` from\n * the previous response and we forward it as `nextPageToken`.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const product of paginate((p) => client.products.list(p))) {\n * for (const variant of product.variants) {\n * console.log(variant.barcode, product.title);\n * }\n * }\n * ```\n */\n async list(params: ListProductsParams = {}): Promise<CursorPage<Product>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);\n const query: Record<string, string | number | undefined> = { size };\n if (params.cursor) {\n query.nextPageToken = params.cursor;\n } else {\n query.page = 0;\n }\n if (params.barcode) query.barcode = params.barcode;\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n\n const data = await this.transport.request<TrendyolFilterResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/approved`,\n query,\n rateLimiter: this.filterLimiter,\n });\n\n const items = (data.content ?? []).map(normalizeProduct);\n const page: CursorPage<Product> = { items };\n if (data.nextPageToken) {\n page.nextCursor = data.nextPageToken;\n }\n return page;\n }\n\n /**\n * List **stock and price** for approved products — Trendyol's lightweight\n * `inventory-and-price` filter. A slim alternative to {@link list} when you\n * only need pricing + stock: the response carries `contentId`,\n * `productMainId`, and a `variants[]` array with `barcode`, `salePrice`,\n * `listPrice`, `quantity`, `stockCode`, and `stockLastModifiedAt` — nothing\n * else.\n *\n * Filter by `barcode`, `contentId`, `stockCode`, `productMainId`, or listing\n * `status`. Sort with `orderByDirection` (`SellerCreatedDate`). `size` caps\n * at **100** here (tighter than `list`'s 1000).\n *\n * Pagination follows the same convention as {@link list}: pass our opaque\n * `cursor` from the previous response and we forward it as `nextPageToken`\n * (required once the dataset exceeds 10,000 items).\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const p of paginate((q) =>\n * client.products.listInventoryAndPrice({ ...q, status: 'onSale' }),\n * )) {\n * for (const v of p.variants) {\n * console.log(v.barcode, v.quantity, v.salePrice);\n * }\n * }\n * ```\n */\n async listInventoryAndPrice(\n params: ListInventoryAndPriceParams = {},\n ): Promise<CursorPage<ProductStockPrice>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_INVENTORY_PAGE_SIZE);\n const query: Record<string, string | number | undefined> = { size };\n if (params.cursor) {\n query.nextPageToken = params.cursor;\n } else {\n query.page = 0;\n }\n if (params.barcode) query.barcode = params.barcode;\n if (params.contentId) query.contentId = params.contentId;\n if (params.stockCode) query.stockCode = params.stockCode;\n if (params.productMainId) query.productMainId = params.productMainId;\n if (params.status) query.status = params.status;\n if (params.orderByDirection) query.orderByDirection = params.orderByDirection;\n\n const headers = params.storeFrontCode ? { storeFrontCode: params.storeFrontCode } : undefined;\n\n const data = await this.transport.request<TrendyolStockPriceResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/approved/inventory-and-price`,\n query,\n headers,\n rateLimiter: this.filterLimiter,\n });\n\n const items = (data.content ?? []).map(normalizeStockPrice);\n const page: CursorPage<ProductStockPrice> = { items };\n if (data.nextPageToken) {\n page.nextCursor = data.nextPageToken;\n }\n return page;\n }\n\n /**\n * Poll a batch request returned by an async write (e.g. `createProducts`,\n * `updatePriceAndInventory`).\n *\n * Trendyol retains batch results for **4 hours** after the originating\n * request — poll within that window.\n *\n * @param batchRequestId The opaque ID returned by the originating call.\n */\n async getBatchStatus(batchRequestId: string): Promise<BatchRequestResult> {\n const id = encodeURIComponent(batchRequestId);\n const data = await this.transport.request<TrendyolBatchResultResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/batch-requests/${id}`,\n rateLimiter: this.batchLimiter,\n });\n return normalizeBatchResult(data);\n }\n\n /**\n * List **unapproved** (draft / rejected / pending-review) products.\n *\n * Wire shape is intentionally flatter than the approved-product shape:\n * each barcode is one top-level item with `barcode`, `quantity`, `salePrice`\n * etc. at the root. Rejected drafts carry `rejectReasonDetails` so you can\n * surface why Trendyol's content team turned them down.\n *\n * Pagination follows the same convention as `list()`: `cursor` from the\n * previous response forwards as `nextPageToken`.\n *\n * @example\n * ```ts\n * const page = await client.products.listUnapproved({ limit: 50 });\n * for (const draft of page.items) {\n * if (draft.status === 'rejected') {\n * console.warn(draft.barcode, draft.rejectReasonDetails);\n * }\n * }\n * ```\n */\n async listUnapproved(\n params: ListUnapprovedProductsParams = {},\n ): Promise<CursorPage<UnapprovedProduct>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);\n const query: Record<string, string | number | undefined> = { size };\n if (params.cursor) {\n query.nextPageToken = params.cursor;\n } else {\n query.page = 0;\n }\n if (params.barcode) query.barcode = params.barcode;\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n if (params.dateQueryType) query.dateQueryType = params.dateQueryType;\n if (params.supplierId !== undefined) query.supplierId = params.supplierId;\n\n const data = await this.transport.request<TrendyolUnapprovedResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/unapproved`,\n query,\n rateLimiter: this.filterLimiter,\n });\n\n const items = (data.content ?? []).map(normalizeUnapproved);\n const page: CursorPage<UnapprovedProduct> = { items };\n if (data.nextPageToken) {\n page.nextCursor = data.nextPageToken;\n }\n return page;\n }\n\n /**\n * Fetch the basic lifecycle status of a single product by barcode.\n *\n * Cheap and useful as a polling primitive after `createProducts`: poll\n * this endpoint until `approved` flips to `true` (or use\n * `client.products.getBatchStatus()` to track the originating batch).\n *\n * @param barcode The product barcode to look up.\n */\n async getBase(barcode: string): Promise<ProductBase> {\n const code = encodeURIComponent(barcode);\n const data = await this.transport.request<TrendyolProductBaseResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.transport.sellerId}/product/${code}`,\n rateLimiter: this.filterLimiter,\n });\n return normalizeProductBase(data);\n }\n\n /**\n * Fetch buybox information for up to 10 barcodes in one call.\n *\n * Returns rank (`buyboxOrder === 1` means you hold the buybox), the\n * current buybox price, and — beyond the spec — the second and third\n * competing prices when other sellers are present.\n *\n * @param barcodes 1–10 product barcodes.\n * @throws {ValidationError} when `barcodes` is empty or longer than 10.\n */\n async getBuyboxInfo(barcodes: string[]): Promise<BuyboxInfo[]> {\n if (!Array.isArray(barcodes) || barcodes.length === 0) {\n throw new ValidationError({\n message: 'getBuyboxInfo: barcodes must be a non-empty array',\n });\n }\n if (barcodes.length > MAX_BUYBOX_BARCODES) {\n throw new ValidationError({\n message: `getBuyboxInfo: max ${MAX_BUYBOX_BARCODES} barcodes per call (got ${barcodes.length})`,\n });\n }\n\n const data = await this.transport.request<TrendyolBuyboxResponse>({\n method: 'POST',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/buybox-information`,\n body: { barcodes },\n rateLimiter: this.buyboxLimiter,\n });\n\n const list = data.buyboxInfo ?? data.content ?? [];\n return list.map(normalizeBuyboxInfo);\n }\n\n /**\n * Create products (V2). Async batch — returns a `batchRequestId` you can\n * poll with `getBatchStatus`. Max 1000 items per call.\n *\n * Trendyol requires the full V2 attribute payload — fetch via\n * `categories.getAttributes` (and `categories.getAttributeValues` for\n * values when `allowCustom === false`). Shipment / returning warehouse\n * IDs come from `suppliers.getAddresses`.\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n */\n async create(items: CreateProductV2Input[]): Promise<BatchAcceptedResponse> {\n return this.submitWrite('/v2/products', items, 'createProducts');\n }\n\n /**\n * Update **content** of approved products (title, description, images,\n * attributes). Identified by `contentId`. Partial update is supported\n * except for attributes — if you update ANY attribute, send ALL of them.\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n */\n async updateContent(items: UpdateContentInput[]): Promise<BatchAcceptedResponse> {\n return this.submitWrite('/products/content-bulk-update', items, 'updateContent');\n }\n\n /**\n * Update **variant** fields of approved products (stockCode, vatRate,\n * dimensionalWeight, warehouse IDs, location-based delivery, lot). Identified\n * by `barcode`. The barcode itself cannot be changed via this endpoint.\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n */\n async updateVariants(items: UpdateVariantInput[]): Promise<BatchAcceptedResponse> {\n return this.submitWrite('/products/variant-bulk-update', items, 'updateVariants');\n }\n\n /**\n * Update **unapproved** (draft) products. Identified by `barcode`. All\n * other fields are optional partial updates. Use this to fix drafts that\n * Trendyol rejected — `client.products.listUnapproved` surfaces the\n * `rejectReasonDetails` you need to act on.\n *\n * **Gotcha (verified live STAGE 2026-05-25):** Trendyol's V2 spec claims\n * only `barcode` is required, but the endpoint returns HTTP 500\n * (`TrendyolSystemException` / `TypeError`) when too many optional fields\n * are omitted. In practice, send at least `title`, `description`,\n * `productMainId`, `brandId`, `categoryId`, `stockCode`,\n * `dimensionalWeight`, `vatRate`, `images[]`, and `attributes[]` (an\n * empty array is OK for the latter). The SDK forwards your payload\n * as-is; trim fields only if you have verified the server accepts it.\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n */\n async updateUnapproved(items: UpdateUnapprovedInput[]): Promise<BatchAcceptedResponse> {\n return this.submitWrite('/products/unapproved-bulk-update', items, 'updateUnapproved');\n }\n\n /**\n * Update product **delivery information** (deliveryDuration,\n * fastDeliveryType). Identified by `barcode`.\n *\n * @throws {ValidationError} when `items` is empty or longer than 1000.\n */\n async updateDeliveryInfo(items: UpdateDeliveryInfoInput[]): Promise<BatchAcceptedResponse> {\n return this.submitWrite('/products/delivery-info-bulk-update', items, 'updateDeliveryInfo');\n }\n\n /**\n * Delete products by barcode. Trendyol allows deletion of unapproved\n * products and approved products that have been archived for more than a\n * day (and have not been sales-stopped by Trendyol).\n *\n * Async batch — returns `{ batchRequestId }` to poll via `getBatchStatus`.\n * Separately rate-limited at **100 req/min** (much tighter than create/update).\n *\n * @param barcodes 1–1000 barcodes.\n * @throws {ValidationError} when `barcodes` is empty or longer than 1000.\n */\n async delete(barcodes: string[]): Promise<BatchAcceptedResponse> {\n this.validateBarcodes(barcodes, 'delete');\n const data = await this.transport.request<BatchAcceptedResponse>({\n method: 'DELETE',\n path: `/integration/product/sellers/${this.transport.sellerId}/products`,\n body: { items: barcodes.map((barcode) => ({ barcode })) },\n rateLimiter: this.deleteLimiter,\n });\n return { batchRequestId: data?.batchRequestId ?? '' };\n }\n\n /**\n * Archive products by barcode (Trendyol's `archived=true` state).\n * Archived products are not visible to customers; pair with `delete`\n * after the 24-hour archive cool-down to remove them entirely.\n *\n * Async batch — returns `{ batchRequestId }`.\n *\n * @throws {ValidationError} when `barcodes` is empty or longer than 1000.\n */\n async archive(barcodes: string[]): Promise<BatchAcceptedResponse> {\n return this.setArchivedState(barcodes, true, 'archive');\n }\n\n /**\n * Unarchive products by barcode (Trendyol's `archived=false` state).\n * Restores visibility for previously-archived products.\n *\n * @throws {ValidationError} when `barcodes` is empty or longer than 1000.\n */\n async unarchive(barcodes: string[]): Promise<BatchAcceptedResponse> {\n return this.setArchivedState(barcodes, false, 'unarchive');\n }\n\n private async setArchivedState(\n barcodes: string[],\n archived: boolean,\n methodLabel: string,\n ): Promise<BatchAcceptedResponse> {\n this.validateBarcodes(barcodes, methodLabel);\n const data = await this.transport.request<BatchAcceptedResponse>({\n method: 'PUT',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/archive-state`,\n body: { items: barcodes.map((barcode) => ({ barcode, archived })) },\n rateLimiter: this.writeLimiter,\n });\n return { batchRequestId: data?.batchRequestId ?? '' };\n }\n\n /**\n * Unlock products whose sale was paused by Trendyol due to pricing\n * issues (under/over-pricing, critical price error, supplier issues).\n * Restores selling status for the listed barcodes.\n *\n * Async batch — returns `{ batchRequestId }`.\n *\n * @throws {ValidationError} when `barcodes` is empty or longer than 1000.\n */\n async unlock(barcodes: string[]): Promise<BatchAcceptedResponse> {\n this.validateBarcodes(barcodes, 'unlock');\n const data = await this.transport.request<BatchAcceptedResponse>({\n method: 'PUT',\n path: `/integration/product/sellers/${this.transport.sellerId}/products/unlock`,\n body: { items: barcodes.map((barcode) => ({ barcode })) },\n rateLimiter: this.writeLimiter,\n });\n return { batchRequestId: data?.batchRequestId ?? '' };\n }\n}\n","import { TokenBucketRateLimiter, ValidationError, type CursorPage } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n ListQuestionsParams,\n Question,\n QuestionAnswer,\n QuestionStatus,\n} from '../types/question.js';\n\nfunction toIso(epochMs: number | undefined): string | undefined {\n if (typeof epochMs !== 'number' || !Number.isFinite(epochMs) || epochMs === 0) {\n return undefined;\n }\n return new Date(epochMs).toISOString();\n}\n\ninterface WireAnswer {\n text?: string;\n creationDate?: number;\n status?: string;\n}\n\ninterface WireQuestion {\n id?: number | string;\n text?: string;\n customerId?: number | string;\n userName?: string;\n showUserName?: boolean;\n status?: string;\n public?: boolean;\n productMainId?: string;\n productName?: string;\n imageUrl?: string;\n webUrl?: string;\n creationDate?: number;\n answeredDateMessage?: string;\n answer?: WireAnswer;\n rejectedAnswer?: WireAnswer;\n rejectedDate?: number;\n reason?: string;\n reportReason?: string;\n reportedDate?: number;\n [key: string]: unknown;\n}\n\nfunction normalizeAnswer(a: WireAnswer | undefined): QuestionAnswer | undefined {\n if (!a) return undefined;\n const out: QuestionAnswer = {};\n if (a.text !== undefined) out.text = a.text;\n const createdAt = toIso(a.creationDate);\n if (createdAt) out.createdAt = createdAt;\n if (a.status !== undefined) out.status = a.status;\n return out;\n}\n\nfunction normalizeQuestion(node: WireQuestion): Question {\n const out: Question = {\n id: node.id !== undefined ? String(node.id) : '',\n raw: node as Record<string, unknown>,\n };\n if (node.text !== undefined) out.text = node.text;\n if (node.customerId !== undefined) out.customerId = String(node.customerId);\n if (node.userName !== undefined) out.userName = node.userName;\n if (typeof node.showUserName === 'boolean') out.showUserName = node.showUserName;\n if (node.status !== undefined) out.status = node.status as QuestionStatus;\n if (typeof node.public === 'boolean') out.public = node.public;\n if (node.productMainId !== undefined) out.productMainId = node.productMainId;\n if (node.productName !== undefined) out.productName = node.productName;\n if (node.imageUrl !== undefined) out.imageUrl = node.imageUrl;\n if (node.webUrl !== undefined) out.webUrl = node.webUrl;\n const createdAt = toIso(node.creationDate);\n if (createdAt) out.createdAt = createdAt;\n if (node.answeredDateMessage !== undefined) out.answeredDateMessage = node.answeredDateMessage;\n const answer = normalizeAnswer(node.answer);\n if (answer) out.answer = answer;\n const rejectedAnswer = normalizeAnswer(node.rejectedAnswer);\n if (rejectedAnswer) out.rejectedAnswer = rejectedAnswer;\n const rejectedAt = toIso(node.rejectedDate);\n if (rejectedAt) out.rejectedAt = rejectedAt;\n if (node.reason !== undefined) out.reason = node.reason;\n if (node.reportReason !== undefined) out.reportReason = node.reportReason;\n const reportedAt = toIso(node.reportedDate);\n if (reportedAt) out.reportedAt = reportedAt;\n return out;\n}\n\n/**\n * Trendyol customer Q&A management. Customers post product questions on\n * Trendyol; sellers reply with `questions.answer()`.\n */\nexport class QuestionsResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 500, intervalMs: 60_000 });\n }\n\n /** Fetch a single question by its numeric ID. */\n async get(questionId: string | number): Promise<Question> {\n const data = await this.transport.request<WireQuestion>({\n method: 'GET',\n path: `/integration/qna/sellers/${this.transport.sellerId}/questions/${encodeURIComponent(String(questionId))}`,\n rateLimiter: this.limiter,\n });\n return normalizeQuestion(data);\n }\n\n /**\n * Filter questions by barcode / date range / status. Page-based\n * pagination internally; SDK exposes the opaque-cursor convention.\n */\n async list(params: ListQuestionsParams = {}): Promise<CursorPage<Question>> {\n const size = Math.min(params.limit ?? 50, 200);\n const page = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n const query: Record<string, string | number | undefined> = { page, size };\n if (params.barcode) query.barcode = params.barcode;\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n if (params.status) query.status = params.status;\n\n interface WireResponse {\n totalElements?: number;\n totalPages?: number;\n content?: WireQuestion[];\n }\n const data = await this.transport.request<WireResponse>({\n method: 'GET',\n path: `/integration/qna/sellers/${this.transport.sellerId}/questions/filter`,\n query,\n rateLimiter: this.limiter,\n });\n\n const items = (data.content ?? []).map(normalizeQuestion);\n const result: CursorPage<Question> = { items };\n const totalPages = typeof data.totalPages === 'number' ? data.totalPages : 0;\n if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n\n /**\n * Reply to a question. Trendyol enforces 10–2000 characters on the\n * answer text; the SDK pre-validates client-side.\n *\n * @throws {ValidationError} when `text` is outside the 10–2000 char range.\n */\n async answer(questionId: string | number, text: string): Promise<unknown> {\n if (typeof text !== 'string' || text.length < 10) {\n throw new ValidationError({\n message: `questions.answer: text must be at least 10 chars (got ${text?.length ?? 0})`,\n });\n }\n if (text.length > 2000) {\n throw new ValidationError({\n message: `questions.answer: text must be at most 2000 chars (got ${text.length})`,\n });\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/qna/sellers/${this.transport.sellerId}/questions/${encodeURIComponent(String(questionId))}/answers`,\n body: { text },\n rateLimiter: this.limiter,\n });\n }\n}\n","import { TokenBucketRateLimiter } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { SupplierAddress, SupplierAddressType } from '../types/supplier-address.js';\n\ninterface TrendyolSupplierAddressNode {\n id: number;\n name?: string;\n addressType?: string;\n isShipmentAddress?: boolean;\n isReturningAddress?: boolean;\n isInvoiceAddress?: boolean;\n isDefault?: boolean;\n address?: string;\n city?: string;\n district?: string;\n postCode?: string;\n fullName?: string;\n}\n\ninterface TrendyolSupplierAddressesResponse {\n supplierAddresses: TrendyolSupplierAddressNode[];\n}\n\nconst VALID_TYPES: ReadonlySet<SupplierAddressType> = new Set([\n 'SHIPMENT',\n 'RETURNING',\n 'INVOICE',\n 'WAREHOUSE',\n]);\n\nfunction normalizeAddressType(raw: string | undefined): SupplierAddressType {\n if (raw && VALID_TYPES.has(raw as SupplierAddressType)) {\n return raw as SupplierAddressType;\n }\n // Trendyol historically used suffixes like \"_ADDRESS\" — strip and re-check.\n const stripped = raw?.replace(/_ADDRESS$/, '');\n if (stripped && VALID_TYPES.has(stripped as SupplierAddressType)) {\n return stripped as SupplierAddressType;\n }\n return 'SHIPMENT';\n}\n\nfunction normalizeAddress(node: TrendyolSupplierAddressNode): SupplierAddress {\n return {\n id: String(node.id),\n name: node.name,\n addressType: normalizeAddressType(node.addressType),\n isShipmentAddress: node.isShipmentAddress ?? false,\n isReturningAddress: node.isReturningAddress ?? false,\n isInvoiceAddress: node.isInvoiceAddress ?? false,\n isDefault: node.isDefault ?? false,\n address: node.address,\n city: node.city,\n district: node.district,\n postCode: node.postCode,\n fullName: node.fullName,\n };\n}\n\n/** Default cache TTL: 1 hour, matching Trendyol's `1 req/hour` service limit. */\nconst DEFAULT_CACHE_TTL_MS = 60 * 60 * 1000;\n\nexport interface SuppliersResourceOptions {\n /** Override the in-memory cache TTL. Defaults to 1 hour. */\n cacheTtlMs?: number;\n}\n\ninterface CacheEntry {\n value: SupplierAddress[];\n expiresAt: number;\n}\n\n/**\n * Trendyol supplier address endpoints.\n *\n * **Critical:** Trendyol rate-limits `getSuppliersAddresses` to **1 request\n * per hour per seller**. This resource therefore wraps the endpoint with an\n * in-memory cache (default TTL: 1 hour) so callers can request addresses\n * as often as needed without tripping the limit.\n *\n * Use `{ forceRefresh: true }` or `invalidateCache()` only when you know the\n * address list changed in the Partner Panel.\n */\nexport class SuppliersResource {\n private cache: CacheEntry | null = null;\n private readonly cacheTtlMs: number;\n private readonly limiter: TokenBucketRateLimiter;\n private inflight: Promise<SupplierAddress[]> | null = null;\n\n constructor(\n private readonly transport: TrendyolTransport,\n options: SuppliersResourceOptions = {},\n ) {\n this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n this.limiter = new TokenBucketRateLimiter({\n capacity: 1,\n intervalMs: DEFAULT_CACHE_TTL_MS,\n });\n }\n\n /**\n * List the seller's registered addresses (shipment, returning, invoice, warehouse).\n *\n * Returns the cached value if it is still fresh. Concurrent calls share a\n * single in-flight request.\n */\n async getAddresses(options: { forceRefresh?: boolean } = {}): Promise<SupplierAddress[]> {\n if (!options.forceRefresh && this.cache && this.cache.expiresAt > Date.now()) {\n return this.cache.value;\n }\n if (this.inflight) return this.inflight;\n\n this.inflight = this.fetchFresh().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n /** Drop the cache; the next `getAddresses()` call hits the API. */\n invalidateCache(): void {\n this.cache = null;\n }\n\n private async fetchFresh(): Promise<SupplierAddress[]> {\n const data = await this.transport.request<TrendyolSupplierAddressesResponse>({\n method: 'GET',\n path: `/integration/sellers/${this.transport.sellerId}/addresses`,\n rateLimiter: this.limiter,\n });\n const items = data.supplierAddresses.map(normalizeAddress);\n this.cache = { value: items, expiresAt: Date.now() + this.cacheTtlMs };\n return items;\n }\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { CreateTestOrderInput, TestOrderStatus } from '../types/misc.js';\n\n/**\n * STAGE-only helper endpoints for creating + driving test orders /\n * test claims through their state machine. **Do not use in PROD** —\n * Trendyol's test endpoints are scoped to the test environment.\n */\nexport class TestOrdersResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 60, intervalMs: 60_000 });\n }\n\n /**\n * Create a test order with the given customer / addresses / lines. The\n * SDK forwards the typed payload verbatim — drill into Trendyol's\n * `createTestOrder` doc for inner field rules.\n *\n * @throws {ValidationError} when required top-level fields are missing.\n */\n async create(input: CreateTestOrderInput): Promise<unknown> {\n for (const k of ['customer', 'invoiceAddress', 'shippingAddress', 'seller', 'lines']) {\n if (!input?.[k]) {\n throw new ValidationError({ message: `testOrders.create: ${k} is required` });\n }\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/test/order/orders/core`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /** Push a test shipment package to the given status. */\n async updateStatus(packageId: string | number, status: TestOrderStatus): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'PUT',\n path: `/integration/test/order/sellers/${this.transport.sellerId}/shipment-packages/${encodeURIComponent(String(packageId))}/status`,\n body: { status },\n rateLimiter: this.limiter,\n });\n }\n\n /** Move test claims to the `WaitingInAction` state. */\n async setClaimsWaitingInAction(): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'PUT',\n path: `/integration/test/order/sellers/${this.transport.sellerId}/claims/waiting-in-action`,\n rateLimiter: this.limiter,\n });\n }\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { CreateVideoInput, ListVideosParams, SellerVideo } from '../types/video.js';\n\n/**\n * Trendyol Video API (`seller-integration-video-api`) — product video\n * uploads. Upload happens server-side from a URL the seller provides;\n * the SDK exposes the create + list endpoints.\n *\n * Base path: `/integration/video/sellers/{sellerId}/videos`.\n * Trendyol publishes per-endpoint rate limits — `create` at 200 req/min,\n * `list` at 1000 req/min — which the SDK provisions as two separate\n * token buckets so listing doesn't exhaust the create budget.\n */\nexport class VideosResource {\n private readonly createLimiter: TokenBucketRateLimiter;\n private readonly listLimiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n options: {\n createLimiter?: TokenBucketRateLimiter;\n listLimiter?: TokenBucketRateLimiter;\n } = {},\n ) {\n this.createLimiter =\n options.createLimiter ?? new TokenBucketRateLimiter({ capacity: 200, intervalMs: 60_000 });\n this.listLimiter =\n options.listLimiter ?? new TokenBucketRateLimiter({ capacity: 1000, intervalMs: 60_000 });\n }\n\n /**\n * Queue a video for upload. Trendyol downloads from the URL in the\n * body asynchronously; poll `list()` (filtered by id) for status.\n *\n * @throws {ValidationError} when `input` is empty / not an object.\n */\n async create(input: CreateVideoInput): Promise<unknown> {\n if (!input || typeof input !== 'object') {\n throw new ValidationError({ message: 'videos.create: input is required' });\n }\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/video/sellers/${this.transport.sellerId}/videos`,\n body: input,\n rateLimiter: this.createLimiter,\n });\n }\n\n /** List the seller's integration videos (optionally filtered by id / status). */\n async list(params: ListVideosParams = {}): Promise<SellerVideo[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/video/sellers/${this.transport.sellerId}/videos`,\n query: {\n id: params.id,\n sellerIntegrationStatus: params.sellerIntegrationStatus,\n page: params.offset,\n size: params.limit,\n },\n rateLimiter: this.listLimiter,\n });\n const rows = Array.isArray(data)\n ? data\n : Array.isArray((data as { content?: unknown[] })?.content)\n ? (data as { content: unknown[] }).content\n : Array.isArray((data as { items?: unknown[] })?.items)\n ? (data as { items: unknown[] }).items\n : [];\n return rows.map((r) => {\n const row = (r ?? {}) as Record<string, unknown>;\n const out: SellerVideo = { raw: row };\n if (typeof row.id === 'string') out.id = row.id;\n if (typeof row.status === 'string') out.status = row.status as SellerVideo['status'];\n return out;\n });\n }\n}\n","import { TokenBucketRateLimiter, ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { Webhook, WebhookInput } from '../types/webhook.js';\n\n/** Trendyol caps webhook subscriptions per seller. */\nconst MAX_WEBHOOKS_PER_SELLER = 15;\n\ninterface WireWebhook {\n id?: string | number;\n url?: string;\n authenticationType?: 'BASIC_AUTHENTICATION' | 'API_KEY';\n username?: string;\n apiKey?: string;\n subscribedStatuses?: string[];\n active?: boolean;\n isActive?: boolean;\n status?: string;\n [key: string]: unknown;\n}\n\nfunction normalizeWebhook(node: WireWebhook): Webhook {\n const out: Webhook = {\n id: node.id !== undefined ? String(node.id) : '',\n raw: node as Record<string, unknown>,\n };\n if (node.url !== undefined) out.url = node.url;\n if (node.authenticationType !== undefined) out.authenticationType = node.authenticationType;\n if (node.username !== undefined) out.username = node.username;\n if (node.apiKey !== undefined) out.apiKey = node.apiKey;\n if (node.subscribedStatuses !== undefined) out.subscribedStatuses = node.subscribedStatuses;\n // Trendyol's active flag has been seen as `active`, `isActive`, or `status: 'ACTIVE'` —\n // accept all defensively until we observe a single stable shape.\n if (typeof node.active === 'boolean') out.active = node.active;\n else if (typeof node.isActive === 'boolean') out.active = node.isActive;\n else if (typeof node.status === 'string') out.active = node.status.toUpperCase() === 'ACTIVE';\n return out;\n}\n\n/**\n * Trendyol webhook subscription management.\n *\n * Max **15 active webhooks per seller** (Trendyol-enforced). Webhooks\n * fire on shipment-package status events only — there is no webhook\n * support for product / stock changes.\n *\n * Trendyol's gateway authenticates **against your endpoint** with the\n * `authenticationType` you configure. Pick `API_KEY` over\n * `BASIC_AUTHENTICATION` so you can rotate the secret without redeploying.\n *\n * No HMAC signature — security relies entirely on the auth method you\n * pick + the secret you store with Trendyol.\n */\nexport class WebhooksResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n limiter?: TokenBucketRateLimiter,\n ) {\n this.limiter = limiter ?? new TokenBucketRateLimiter({ capacity: 50, intervalMs: 60_000 });\n }\n\n /**\n * Create a new webhook subscription. Trendyol caps subscriptions at 15\n * per seller — the SDK does NOT pre-check (you'd need to call `list()`\n * first), but Trendyol returns 400 when the cap is exceeded.\n *\n * @throws {ValidationError} when `url` or `authenticationType` is missing.\n */\n async create(input: WebhookInput): Promise<unknown> {\n this.validateInput(input, 'create');\n return this.transport.request<unknown>({\n method: 'POST',\n path: `/integration/sellers/${this.transport.sellerId}/webhooks`,\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /** List all registered webhook subscriptions. */\n async list(): Promise<Webhook[]> {\n const data = await this.transport.request<unknown>({\n method: 'GET',\n path: `/integration/sellers/${this.transport.sellerId}/webhooks`,\n rateLimiter: this.limiter,\n });\n const rows = Array.isArray(data)\n ? data\n : Array.isArray((data as { webhooks?: unknown[] })?.webhooks)\n ? (data as { webhooks: unknown[] }).webhooks\n : Array.isArray((data as { content?: unknown[] })?.content)\n ? (data as { content: unknown[] }).content\n : [];\n return rows.map((r) => normalizeWebhook(r as WireWebhook));\n }\n\n /**\n * Update a webhook subscription. Same input shape as `create`; replaces\n * the whole subscription (Trendyol does NOT partially update).\n */\n async update(webhookId: string | number, input: WebhookInput): Promise<unknown> {\n this.validateInput(input, 'update');\n return this.transport.request<unknown>({\n method: 'PUT',\n path: this.webhookPath(webhookId),\n body: input,\n rateLimiter: this.limiter,\n });\n }\n\n /** Permanently delete a webhook subscription. */\n async delete(webhookId: string | number): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'DELETE',\n path: this.webhookPath(webhookId),\n rateLimiter: this.limiter,\n });\n }\n\n /** Re-activate a previously-deactivated webhook subscription. */\n async activate(webhookId: string | number): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.webhookPath(webhookId)}/activate`,\n rateLimiter: this.limiter,\n });\n }\n\n /**\n * Deactivate a webhook subscription. Trendyol automatically deactivates\n * a subscription after persistent delivery failures (and sends 2 emails);\n * use `activate()` to bring it back online once your endpoint is healthy.\n */\n async deactivate(webhookId: string | number): Promise<unknown> {\n return this.transport.request<unknown>({\n method: 'PUT',\n path: `${this.webhookPath(webhookId)}/deactivate`,\n rateLimiter: this.limiter,\n });\n }\n\n private validateInput(input: WebhookInput, method: string): void {\n if (!input?.url || typeof input.url !== 'string') {\n throw new ValidationError({ message: `webhooks.${method}: url is required` });\n }\n if (\n input.authenticationType !== 'BASIC_AUTHENTICATION' &&\n input.authenticationType !== 'API_KEY'\n ) {\n throw new ValidationError({\n message: `webhooks.${method}: authenticationType must be 'BASIC_AUTHENTICATION' or 'API_KEY'`,\n });\n }\n if (input.authenticationType === 'BASIC_AUTHENTICATION') {\n if (!input.username || !input.password) {\n throw new ValidationError({\n message: `webhooks.${method}: BASIC_AUTHENTICATION requires username + password`,\n });\n }\n } else if (!input.apiKey) {\n throw new ValidationError({\n message: `webhooks.${method}: API_KEY requires apiKey`,\n });\n }\n if (input.subscribedStatuses && input.subscribedStatuses.length === 0) {\n // empty array is fine on Trendyol's side (treated as \"all\"), so no throw —\n // just a comment for readers.\n }\n // Soft check: surface Trendyol's 15-cap via JSDoc; not pre-checked here\n // because doing so would require an extra round-trip.\n void MAX_WEBHOOKS_PER_SELLER;\n }\n\n private webhookPath(webhookId: string | number): string {\n return `/integration/sellers/${this.transport.sellerId}/webhooks/${encodeURIComponent(String(webhookId))}`;\n }\n}\n","import type { MarketplaceCapabilities } from '@lonca/core';\n\n/**\n * Static feature-capability flags for the Trendyol marketplace, so consumers\n * can feature-detect instead of hard-coding marketplace quirks. Read them off\n * a client as `client.capabilities`.\n *\n * The flag *values* are marketplace-specific, but the const `satisfies` the\n * shared {@link MarketplaceCapabilities} contract so the key set can't drift\n * from the Hepsiburada SDK without a compile error. Kept `as const` so the\n * literal `true`/`false` values stay narrowed.\n */\nexport const trendyolCapabilities = {\n /** Trendyol has no time-bounded / scheduled pricing (`pricings[]`). */\n scheduledPricing: false,\n /** `inventory.update` accepts stock-only items (`quantity` with no price). */\n stockOnlyBatch: true,\n /** Products expose `updatedAt`, so last-write-wins guards are supported. */\n listingUpdatedAt: true,\n} as const satisfies MarketplaceCapabilities;\n\n/** Shape of {@link trendyolCapabilities}. */\nexport type TrendyolCapabilities = typeof trendyolCapabilities;\n","/** Build the HTTP Basic auth header value from Trendyol credentials. */\nexport function buildAuthHeader(apiKey: string, apiSecret: string): string {\n const token = Buffer.from(`${apiKey}:${apiSecret}`, 'utf8').toString('base64');\n return `Basic ${token}`;\n}\n\n/**\n * Build the `User-Agent` header value Trendyol expects.\n *\n * Per Trendyol's docs:\n * - Solo integrators: `\"<sellerId> - SelfIntegration\"`\n * - Integrator companies: `\"<sellerId> - <CompanyName>\"` (alphanumeric, max 30 chars)\n *\n * A missing or malformed `User-Agent` triggers HTTP 403.\n */\nexport function buildUserAgent(sellerId: number, integratorName: string): string {\n return `${sellerId} - ${integratorName}`;\n}\n","import {\n AuthError,\n LoncaError,\n type LoncaErrorIssue,\n normalizeIssueEntries,\n NotFoundError,\n parseRetryAfter,\n RateLimitError,\n ServerError,\n ValidationError,\n} from '@lonca/core';\n\n// Re-exported from `@lonca/core` so the transport (and existing imports) keep a\n// single, drift-free `Retry-After` parser shared with the Hepsiburada SDK.\nexport { parseRetryAfter };\n\n/**\n * Map a Trendyol HTTP response status to a `@lonca/core` error.\n *\n * - `401` → `AuthError` (bad credentials)\n * - `403` → `ValidationError` (usually missing/malformed `User-Agent` header, or wrong endpoint path)\n * - `404` → `NotFoundError`\n * - `429` → `RateLimitError` (carries `retryAfterMs` if the server provided `Retry-After`)\n * - `5xx` → `ServerError` (retryable)\n * - other → `LoncaError` with code `UNKNOWN` (non-retryable)\n */\nexport function mapHttpError(status: number, body: unknown, retryAfterMs?: number): LoncaError {\n const data = { body } as Record<string, unknown>;\n const issues = normalizeErrorIssues(body);\n switch (status) {\n case 401:\n return new AuthError({\n message: 'Trendyol authentication failed (check apiKey / apiSecret)',\n status,\n data,\n issues,\n });\n case 403:\n return new ValidationError({\n message: 'Trendyol forbidden (check User-Agent header or endpoint path)',\n status,\n data,\n issues,\n });\n case 404:\n return new NotFoundError({ message: 'Trendyol resource not found', status, data, issues });\n case 429:\n return new RateLimitError({\n message: 'Trendyol rate limit exceeded',\n status,\n retryAfterMs,\n data,\n issues,\n });\n case 500:\n case 502:\n case 503:\n case 504:\n return new ServerError({\n message: `Trendyol server error (${status})`,\n status,\n data,\n issues,\n });\n default:\n return new LoncaError({\n code: 'UNKNOWN',\n message: `Trendyol unexpected response (${status})`,\n status,\n data,\n issues,\n retryable: false,\n });\n }\n}\n\n/**\n * Normalize Trendyol's (inconsistent) error body into `LoncaErrorIssue[]`.\n * Trendyol returns either `{ errors: [{ field?, message }] }` or\n * `{ errors: [string] }`, sometimes nested under `{ body: { errors } }`.\n *\n * Only `{ field, code, message }` are copied — never the raw payload, which can\n * carry PII. The untouched body stays on `error.data` for debugging.\n */\nfunction normalizeErrorIssues(body: unknown): LoncaErrorIssue[] {\n const errors = extractErrorsArray(body);\n return errors ? normalizeIssueEntries(errors) : [];\n}\n\nfunction extractErrorsArray(body: unknown): unknown[] | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const b = body as Record<string, unknown>;\n if (Array.isArray(b.errors)) return b.errors;\n const nested = b.body;\n if (nested && typeof nested === 'object') {\n const n = nested as Record<string, unknown>;\n if (Array.isArray(n.errors)) return n.errors;\n }\n return undefined;\n}\n","import { createRequester, type BaseRequestOptions, type Logger } from '@lonca/core';\nimport { buildAuthHeader, buildUserAgent } from './auth.js';\nimport { mapHttpError } from './errors.js';\n\nconst BASE_URLS = {\n prod: 'https://apigw.trendyol.com',\n stage: 'https://stageapigw.trendyol.com',\n} as const;\n\nexport type TrendyolEnvironment = keyof typeof BASE_URLS;\n\nexport interface TransportConfig {\n sellerId: number;\n apiKey: string;\n apiSecret: string;\n env: TrendyolEnvironment;\n integratorName: string;\n clientIp?: string;\n logger?: Logger;\n /** Request timeout in ms. Default: 30_000. */\n timeoutMs?: number;\n /** Override the underlying `fetch` (tests inject a mock). */\n fetch?: typeof fetch;\n}\n\nexport interface RequestOptions extends BaseRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n /** Path beginning with `/` (e.g., `/sapigw/brands`). */\n path: string;\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nexport class TrendyolTransport {\n private readonly baseUrl: string;\n private readonly requester: <T>(opts: RequestOptions) => Promise<T>;\n\n constructor(private readonly config: TransportConfig) {\n this.baseUrl = BASE_URLS[config.env];\n this.requester = createRequester<RequestOptions>({\n fetch: config.fetch ?? fetch,\n logger: config.logger,\n timeoutMs: config.timeoutMs ?? 30_000,\n label: 'Trendyol',\n logPrefix: 'trendyol',\n buildUrl: (opts) => this.buildUrl(opts.path, opts.query),\n buildHeaders: (correlationId) => this.buildHeaders(correlationId),\n mapHttpError,\n });\n }\n\n /** Seller ID this transport is configured with. Resources read it for path-building. */\n get sellerId(): number {\n return this.config.sellerId;\n }\n\n request<T>(opts: RequestOptions): Promise<T> {\n return this.requester<T>(opts);\n }\n\n private buildUrl(path: string, query?: RequestOptions['query']): string {\n const url = new URL(path, this.baseUrl);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(correlationId: string): Record<string, string> {\n return {\n Authorization: buildAuthHeader(this.config.apiKey, this.config.apiSecret),\n 'x-clientip': this.config.clientIp ?? '127.0.0.1',\n 'x-correlationid': correlationId,\n 'x-agentname': this.config.integratorName,\n 'User-Agent': buildUserAgent(this.config.sellerId, this.config.integratorName),\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n}\n","import type { Logger } from '@lonca/core';\nimport { BrandsResource } from './resources/brands.js';\nimport { CategoriesResource } from './resources/categories.js';\nimport { ClaimsResource } from './resources/claims.js';\nimport { ExportCenterResource } from './resources/export-center.js';\nimport { FinanceResource } from './resources/finance.js';\nimport { InventoryResource } from './resources/inventory.js';\nimport { InvoicesResource } from './resources/invoices.js';\nimport { LabelsResource } from './resources/labels.js';\nimport { LocationsResource } from './resources/locations.js';\nimport { OrdersResource } from './resources/orders.js';\nimport { ProductsResource } from './resources/products.js';\nimport { QuestionsResource } from './resources/questions.js';\nimport { SuppliersResource } from './resources/suppliers.js';\nimport { TestOrdersResource } from './resources/test-orders.js';\nimport { VideosResource } from './resources/videos.js';\nimport { WebhooksResource } from './resources/webhooks.js';\nimport { trendyolCapabilities, type TrendyolCapabilities } from './capabilities.js';\nimport { TrendyolTransport, type TrendyolEnvironment } from './transport.js';\n\nexport interface CreateClientOptions {\n /** Trendyol seller (supplier) ID — visible in Partner Panel → Account Info. */\n sellerId: number;\n /** Trendyol API key. */\n apiKey: string;\n /** Trendyol API secret. */\n apiSecret: string;\n /** Which Trendyol environment to target. */\n env: TrendyolEnvironment;\n /**\n * Integrator company name to send in `User-Agent` / `x-agentname`. Required —\n * Trendyol uses this to attribute API traffic. Use `'SelfIntegration'` if\n * the seller owns the integration code, otherwise your company / product name.\n * Trendyol caps this at 30 alphanumeric characters.\n */\n integratorName: string;\n /**\n * IPv4 address to send in `x-clientip`.\n * Defaults to `'127.0.0.1'` — Trendyol does not validate this against the\n * request origin, the header just has to be present and IPv4-shaped.\n */\n clientIp?: string;\n /** Optional structured logger (`@lonca/core` `Logger`). Defaults to no-op. */\n logger?: Logger;\n /** Request timeout in ms. Default: 30_000. */\n timeoutMs?: number;\n}\n\nexport interface TrendyolClient {\n brands: BrandsResource;\n categories: CategoriesResource;\n suppliers: SuppliersResource;\n products: ProductsResource;\n inventory: InventoryResource;\n orders: OrdersResource;\n claims: ClaimsResource;\n webhooks: WebhooksResource;\n questions: QuestionsResource;\n invoices: InvoicesResource;\n finance: FinanceResource;\n labels: LabelsResource;\n testOrders: TestOrdersResource;\n locations: LocationsResource;\n exportCenter: ExportCenterResource;\n videos: VideosResource;\n /** Static feature-capability flags for feature detection. */\n capabilities: TrendyolCapabilities;\n}\n\n/**\n * Create a Trendyol Marketplace SDK client.\n *\n * @example\n * ```ts\n * import { createTrendyolClient } from '@lonca/trendyol';\n *\n * const client = createTrendyolClient({\n * sellerId: 12345,\n * apiKey: process.env.TRENDYOL_API_KEY!,\n * apiSecret: process.env.TRENDYOL_API_SECRET!,\n * env: 'stage',\n * });\n *\n * const page = await client.brands.list({ limit: 100 });\n * ```\n */\nexport function createTrendyolClient(opts: CreateClientOptions): TrendyolClient {\n const transport = new TrendyolTransport({\n sellerId: opts.sellerId,\n apiKey: opts.apiKey,\n apiSecret: opts.apiSecret,\n env: opts.env,\n integratorName: opts.integratorName,\n clientIp: opts.clientIp,\n logger: opts.logger,\n timeoutMs: opts.timeoutMs,\n });\n\n return buildClient(transport);\n}\n\n/**\n * Wire the full resource graph over a transport. Shared by\n * {@link createTrendyolClient} and the `@lonca/trendyol/testing` fake client so\n * both stay structurally identical. Not re-exported from the package entry.\n *\n * @internal\n */\nexport function buildClient(transport: TrendyolTransport): TrendyolClient {\n const products = new ProductsResource(transport);\n\n return {\n brands: new BrandsResource(transport),\n categories: new CategoriesResource(transport),\n suppliers: new SuppliersResource(transport),\n products,\n inventory: new InventoryResource(transport, (id) => products.getBatchStatus(id)),\n orders: new OrdersResource(transport),\n claims: new ClaimsResource(transport),\n webhooks: new WebhooksResource(transport),\n questions: new QuestionsResource(transport),\n invoices: new InvoicesResource(transport),\n finance: new FinanceResource(transport),\n labels: new LabelsResource(transport),\n testOrders: new TestOrdersResource(transport),\n locations: new LocationsResource(transport),\n exportCenter: new ExportCenterResource(transport),\n videos: new VideosResource(transport),\n capabilities: trendyolCapabilities,\n };\n}\n","import { buildClient, type TrendyolClient } from './client.js';\nimport { TrendyolTransport } from './transport.js';\nimport type { BatchRequestStatus } from './types/product.js';\n\n/** A request the fake client received, normalized for matching in a `handler`. */\nexport interface FakeTrendyolRequest {\n method: string;\n /** URL path only — no host, no query string. */\n path: string;\n /** Parsed query parameters. */\n query: URLSearchParams;\n /** Parsed JSON request body, when present. */\n body?: unknown;\n}\n\nexport interface TrendyolFakeSeed {\n /**\n * Return the raw JSON the Trendyol API would respond with for a request, or\n * `undefined` to fall through to the built-in hot-path defaults.\n */\n handler?: (req: FakeTrendyolRequest) => unknown;\n /** `batchRequestId` returned by `inventory.update` and echoed by `getBatchStatus`. Default: `'fake-batch-1'`. */\n batchRequestId?: string;\n /** Terminal status `getBatchStatus` reports. Default: `'COMPLETED'`. */\n batchStatus?: BatchRequestStatus;\n}\n\n/**\n * Build an in-memory {@link TrendyolClient} for unit tests.\n *\n * It is the real client graph wired over a fake `fetch`, so your tests exercise\n * the SDK's real request building and response normalization — no network, no\n * structural-compat guessing. The batch hot-path\n * (`inventory.update` → `products.getBatchStatus` → `inventory.updateAndWait`)\n * works out of the box; drive any other endpoint with `seed.handler`.\n *\n * @example\n * ```ts\n * const client = createFakeTrendyolClient({ batchRequestId: 'b1' });\n * const [result] = await client.inventory.updateAndWait(\n * [{ barcode: 'X', quantity: 1 }],\n * { pollIntervalMs: 1 },\n * );\n * result.status; // 'COMPLETED'\n * ```\n */\nexport function createFakeTrendyolClient(seed: TrendyolFakeSeed = {}): TrendyolClient {\n const batchRequestId = seed.batchRequestId ?? 'fake-batch-1';\n const batchStatus = seed.batchStatus ?? 'COMPLETED';\n\n const fakeFetch: typeof fetch = (input, init) => {\n const rawUrl =\n typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n const url = new URL(rawUrl);\n const req: FakeTrendyolRequest = {\n method: (init?.method ?? 'GET').toUpperCase(),\n path: url.pathname,\n query: url.searchParams,\n body: parseBody(init?.body),\n };\n\n const handled = seed.handler?.(req);\n const data =\n handled !== undefined ? handled : defaultResponse(req, batchRequestId, batchStatus);\n return Promise.resolve(jsonResponse(data));\n };\n\n const transport = new TrendyolTransport({\n sellerId: 1,\n apiKey: 'fake',\n apiSecret: 'fake',\n env: 'stage',\n integratorName: 'fake',\n fetch: fakeFetch,\n });\n\n return buildClient(transport);\n}\n\nfunction defaultResponse(\n req: FakeTrendyolRequest,\n batchRequestId: string,\n batchStatus: BatchRequestStatus,\n): unknown {\n if (req.method === 'POST' && req.path.endsWith('/products/price-and-inventory')) {\n return { batchRequestId };\n }\n if (req.method === 'GET' && req.path.includes('/products/batch-requests/')) {\n const id = decodeURIComponent(req.path.split('/').pop() ?? batchRequestId);\n return { batchRequestId: id, status: batchStatus, itemCount: 0, failedItemCount: 0, items: [] };\n }\n return {};\n}\n\nfunction parseBody(body: unknown): unknown {\n if (typeof body !== 'string') return undefined;\n try {\n return JSON.parse(body);\n } catch {\n return body;\n }\n}\n\nfunction jsonResponse(data: unknown): Response {\n return new Response(JSON.stringify(data), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n}\n"]}