{"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 {\n  TokenBucketRateLimiter,\n  ValidationError,\n  type CursorPage,\n  type MutationResult,\n} 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<MutationResult> {\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 {\n      raw: await 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  /**\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<MutationResult> {\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 {\n      raw: await 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  /**\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(\n    claimId: string,\n    input: ApproveClaimLineItemsInput,\n  ): Promise<MutationResult> {\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 {\n      raw: await 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  /**\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, type MutationResult } 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<MutationResult> {\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 {\n      raw: await 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\n  /** Register an invoice URL with Trendyol (alternative to uploading the file). */\n  async sendLink(input: SendInvoiceLinkInput): Promise<MutationResult> {\n    if (!input?.invoiceLink) {\n      throw new ValidationError({ message: 'invoices.sendLink: invoiceLink is required' });\n    }\n    return {\n      raw: await 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\n  /** Remove a previously-registered invoice link. */\n  async deleteLink(input: DeleteInvoiceLinkInput): Promise<MutationResult> {\n    return {\n      raw: await 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}\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   * **Approved only:** this endpoint silently excludes products still in review\n   * or rejected — use {@link listUnapproved} for those. Date fields on the\n   * returned {@link Product} (`createdAt` / `updatedAt`) are ISO 8601 UTC\n   * **strings**, not `Date` objects.\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"]}