@lonca/trendyol 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resources/brands.ts","../src/auth.ts","../src/errors.ts","../src/transport.ts","../src/client.ts"],"names":["LoncaError"],"mappings":"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","file":"index.js","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/** Default page size when callers don't specify `limit`. Trendyol allows up to 1000. */\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: '/sapigw/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","/** 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 = 'SelfIntegration'): string {\n return `${sellerId} - ${integratorName}`;\n}\n","import {\n AuthError,\n LoncaError,\n NotFoundError,\n RateLimitError,\n ServerError,\n ValidationError,\n} from '@lonca/core';\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 switch (status) {\n case 401:\n return new AuthError({\n message: 'Trendyol authentication failed (check apiKey / apiSecret)',\n status,\n data,\n });\n case 403:\n return new ValidationError({\n message: 'Trendyol forbidden (check User-Agent header or endpoint path)',\n status,\n data,\n });\n case 404:\n return new NotFoundError({ message: 'Trendyol resource not found', status, data });\n case 429:\n return new RateLimitError({\n message: 'Trendyol rate limit exceeded',\n status,\n retryAfterMs,\n data,\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 });\n default:\n return new LoncaError({\n code: 'UNKNOWN',\n message: `Trendyol unexpected response (${status})`,\n status,\n data,\n retryable: false,\n });\n }\n}\n\n/** Parse a `Retry-After` header value (seconds OR HTTP-date) into milliseconds. */\nexport function parseRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined;\n const seconds = Number(header);\n if (!Number.isNaN(seconds)) return Math.max(0, seconds * 1000);\n const epoch = Date.parse(header);\n if (!Number.isNaN(epoch)) return Math.max(0, epoch - Date.now());\n return undefined;\n}\n","import { randomUUID } from 'node:crypto';\nimport {\n LoncaError,\n NetworkError,\n TimeoutError,\n retry,\n noopLogger,\n type Logger,\n type TokenBucketRateLimiter,\n} from '@lonca/core';\nimport { buildAuthHeader, buildUserAgent } from './auth.js';\nimport { mapHttpError, parseRetryAfter } 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 {\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 body?: unknown;\n signal?: AbortSignal;\n /** Per-endpoint rate limiter; acquire one token before each attempt. */\n rateLimiter?: TokenBucketRateLimiter;\n}\n\nexport class TrendyolTransport {\n private readonly baseUrl: string;\n private readonly logger: Logger;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly config: TransportConfig) {\n this.baseUrl = BASE_URLS[config.env];\n this.logger = config.logger ?? noopLogger;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n this.fetchImpl = config.fetch ?? fetch;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n return retry(\n async (attempt) => {\n if (opts.rateLimiter) await opts.rateLimiter.acquire(opts.signal);\n\n const url = this.buildUrl(opts.path, opts.query);\n const correlationId = randomUUID();\n const headers = this.buildHeaders(correlationId);\n const init: RequestInit = {\n method: opts.method,\n headers,\n signal: this.composeSignal(opts.signal),\n };\n if (opts.body !== undefined && opts.method !== 'GET') {\n init.body = JSON.stringify(opts.body);\n }\n\n this.logger.debug('trendyol.request', {\n method: opts.method,\n url,\n correlationId,\n attempt,\n });\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw new TimeoutError({\n message: `Trendyol request timed out after ${this.timeoutMs}ms`,\n cause: err,\n });\n }\n throw new NetworkError({\n message: 'Trendyol network failure',\n cause: err,\n });\n }\n\n if (!response.ok) {\n const body = await safeJson(response);\n const retryAfterMs = parseRetryAfter(response.headers.get('retry-after'));\n const error = mapHttpError(response.status, body, retryAfterMs);\n this.logger.warn('trendyol.error', {\n method: opts.method,\n url,\n correlationId,\n status: response.status,\n code: error.code,\n retryable: error.retryable,\n });\n throw error;\n }\n\n this.logger.debug('trendyol.response', {\n correlationId,\n status: response.status,\n });\n\n if (response.status === 204) return undefined as T;\n return (await safeJson(response)) as T;\n },\n {\n signal: opts.signal,\n onRetry: (err, attempt, delay) => {\n if (err instanceof LoncaError) {\n this.logger.warn('trendyol.retry', {\n attempt,\n delayMs: delay,\n code: err.code,\n status: err.status,\n });\n }\n },\n },\n );\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 const integratorName = this.config.integratorName ?? 'SelfIntegration';\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': integratorName,\n 'User-Agent': buildUserAgent(this.config.sellerId, integratorName),\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n\n private composeSignal(external?: AbortSignal): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(this.timeoutMs);\n if (!external) return timeoutSignal;\n return AbortSignal.any([external, timeoutSignal]);\n }\n}\n\nasync function safeJson(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","import type { Logger } from '@lonca/core';\nimport { BrandsResource } from './resources/brands.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`.\n * Defaults to `'SelfIntegration'` if the seller owns the integration code.\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}\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 {\n brands: new BrandsResource(transport),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/resources/brands.ts","../src/resources/categories.ts","../src/resources/inventory.ts","../src/resources/orders.ts","../src/resources/products.ts","../src/resources/suppliers.ts","../src/auth.ts","../src/errors.ts","../src/transport.ts","../src/client.ts"],"names":["TokenBucketRateLimiter","DEFAULT_PAGE_SIZE","MAX_PAGE_SIZE","normalizeAttribute","toIso","normalizeAddress","ValidationError","LoncaError"],"mappings":"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","file":"index.js","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","import { TokenBucketRateLimiter } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { Category, CategoryAttribute } 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\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/**\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 *\n * Both rate counters live on the same Trendyol service, so we share one\n * limiter across both endpoints.\n */\nexport class CategoriesResource {\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 * 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 // eslint-disable-next-line no-console\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\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 { ValidationError } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type { PriceInventoryUpdate, UpdatePriceInventoryResponse } from '../types/inventory.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/**\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. The response carries a `batchRequestId`\n * you can poll with `client.products.getBatchStatus(batchRequestId)` —\n * Trendyol retains the result for 4 hours.\n */\nexport class InventoryResource {\n constructor(\n private readonly transport: TrendyolTransport,\n private readonly sellerId: number,\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 */\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.sellerId}/products/price-and-inventory`,\n body: { items },\n });\n\n return { batchRequestId: data.batchRequestId ?? '' };\n }\n}\n","import { TokenBucketRateLimiter, type CursorPage, type CursorPaginationParams } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n OrderAddress,\n OrderCustomer,\n OrderLine,\n PackageHistoryEntry,\n ShipmentPackage,\n ShipmentPackageStatus,\n} from '../types/order.js';\n\n/** Trendyol caps `size` at 200; default 200. */\nconst MAX_PAGE_SIZE = 200;\nconst DEFAULT_PAGE_SIZE = 50;\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 shipmentPackageId?: 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\nfunction normalizePackage(node: TrendyolShipmentPackageNode): ShipmentPackage {\n const out: ShipmentPackage = {\n id: node.shipmentPackageId !== undefined ? String(node.shipmentPackageId) : '',\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): scheduled to tighten on 2026-05-15;\n * for now we set a generous default that the user can tune via the constructor.\n *\n * Pagination: Trendyol uses page-based pagination here (not nextPageToken).\n * The SDK still exposes `CursorPage<ShipmentPackage>` so the caller can\n * iterate with `paginate()` from `@lonca/core`; the opaque cursor encodes the\n * page index.\n */\nexport class OrdersResource {\n private readonly limiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n private readonly sellerId: number,\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 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.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 if (page + 1 < totalPages) {\n result.nextCursor = String(page + 1);\n }\n return result;\n }\n}\n","import { TokenBucketRateLimiter, type CursorPage, type CursorPaginationParams } from '@lonca/core';\nimport type { TrendyolTransport } from '../transport.js';\nimport type {\n BatchRequestItemResult,\n BatchRequestResult,\n NamedRef,\n Product,\n ProductAttribute,\n ProductVariant,\n} from '../types/product.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\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// ─── 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\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 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/**\n * Trendyol product list + batch-result endpoints.\n *\n * Rate limits (per Trendyol service limits):\n * - filterProducts: 2000 req/min\n * - getBatchRequestResult: 1000 req/min\n */\nexport class ProductsResource {\n private readonly filterLimiter: TokenBucketRateLimiter;\n private readonly batchLimiter: TokenBucketRateLimiter;\n\n constructor(\n private readonly transport: TrendyolTransport,\n private readonly sellerId: number,\n options: {\n filterLimiter?: TokenBucketRateLimiter;\n batchLimiter?: 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 }\n\n /**\n * List approved products. Use `paginate()` from `@lonca/core` to iterate\n * lazily across pages.\n *\n * Trendyol exposes both page-based and `nextPageToken`-based pagination\n * (the latter required when the dataset exceeds 10,000 items). The SDK\n * picks the right strategy automatically — pass our opaque `cursor` from\n * the previous response and we forward it as `nextPageToken`.\n *\n * @example\n * ```ts\n * import { paginate } from '@lonca/core';\n * for await (const product of paginate((p) => client.products.list(p))) {\n * for (const variant of product.variants) {\n * console.log(variant.barcode, product.title);\n * }\n * }\n * ```\n */\n async list(params: ListProductsParams = {}): Promise<CursorPage<Product>> {\n const size = Math.min(params.limit ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);\n const query: Record<string, string | number | undefined> = { size };\n if (params.cursor) {\n query.nextPageToken = params.cursor;\n } else {\n query.page = 0;\n }\n if (params.barcode) query.barcode = params.barcode;\n if (params.startDate) query.startDate = params.startDate.getTime();\n if (params.endDate) query.endDate = params.endDate.getTime();\n\n const data = await this.transport.request<TrendyolFilterResponse>({\n method: 'GET',\n path: `/integration/product/sellers/${this.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 * 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.sellerId}/products/batch-requests/${id}`,\n rateLimiter: this.batchLimiter,\n });\n return normalizeBatchResult(data);\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 private readonly sellerId: number,\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.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","/** 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 = 'SelfIntegration'): string {\n return `${sellerId} - ${integratorName}`;\n}\n","import {\n AuthError,\n LoncaError,\n NotFoundError,\n RateLimitError,\n ServerError,\n ValidationError,\n} from '@lonca/core';\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 switch (status) {\n case 401:\n return new AuthError({\n message: 'Trendyol authentication failed (check apiKey / apiSecret)',\n status,\n data,\n });\n case 403:\n return new ValidationError({\n message: 'Trendyol forbidden (check User-Agent header or endpoint path)',\n status,\n data,\n });\n case 404:\n return new NotFoundError({ message: 'Trendyol resource not found', status, data });\n case 429:\n return new RateLimitError({\n message: 'Trendyol rate limit exceeded',\n status,\n retryAfterMs,\n data,\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 });\n default:\n return new LoncaError({\n code: 'UNKNOWN',\n message: `Trendyol unexpected response (${status})`,\n status,\n data,\n retryable: false,\n });\n }\n}\n\n/** Parse a `Retry-After` header value (seconds OR HTTP-date) into milliseconds. */\nexport function parseRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined;\n const seconds = Number(header);\n if (!Number.isNaN(seconds)) return Math.max(0, seconds * 1000);\n const epoch = Date.parse(header);\n if (!Number.isNaN(epoch)) return Math.max(0, epoch - Date.now());\n return undefined;\n}\n","import { randomUUID } from 'node:crypto';\nimport {\n LoncaError,\n NetworkError,\n TimeoutError,\n retry,\n noopLogger,\n type Logger,\n type TokenBucketRateLimiter,\n} from '@lonca/core';\nimport { buildAuthHeader, buildUserAgent } from './auth.js';\nimport { mapHttpError, parseRetryAfter } 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 {\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 body?: unknown;\n signal?: AbortSignal;\n /** Per-endpoint rate limiter; acquire one token before each attempt. */\n rateLimiter?: TokenBucketRateLimiter;\n}\n\nexport class TrendyolTransport {\n private readonly baseUrl: string;\n private readonly logger: Logger;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly config: TransportConfig) {\n this.baseUrl = BASE_URLS[config.env];\n this.logger = config.logger ?? noopLogger;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n this.fetchImpl = config.fetch ?? fetch;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n return retry(\n async (attempt) => {\n if (opts.rateLimiter) await opts.rateLimiter.acquire(opts.signal);\n\n const url = this.buildUrl(opts.path, opts.query);\n const correlationId = randomUUID();\n const headers = this.buildHeaders(correlationId);\n const init: RequestInit = {\n method: opts.method,\n headers,\n signal: this.composeSignal(opts.signal),\n };\n if (opts.body !== undefined && opts.method !== 'GET') {\n init.body = JSON.stringify(opts.body);\n }\n\n this.logger.debug('trendyol.request', {\n method: opts.method,\n url,\n correlationId,\n attempt,\n });\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw new TimeoutError({\n message: `Trendyol request timed out after ${this.timeoutMs}ms`,\n cause: err,\n });\n }\n throw new NetworkError({\n message: 'Trendyol network failure',\n cause: err,\n });\n }\n\n if (!response.ok) {\n const body = await safeJson(response);\n const retryAfterMs = parseRetryAfter(response.headers.get('retry-after'));\n const error = mapHttpError(response.status, body, retryAfterMs);\n this.logger.warn('trendyol.error', {\n method: opts.method,\n url,\n correlationId,\n status: response.status,\n code: error.code,\n retryable: error.retryable,\n });\n throw error;\n }\n\n this.logger.debug('trendyol.response', {\n correlationId,\n status: response.status,\n });\n\n if (response.status === 204) return undefined as T;\n return (await safeJson(response)) as T;\n },\n {\n signal: opts.signal,\n onRetry: (err, attempt, delay) => {\n if (err instanceof LoncaError) {\n this.logger.warn('trendyol.retry', {\n attempt,\n delayMs: delay,\n code: err.code,\n status: err.status,\n });\n }\n },\n },\n );\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 const integratorName = this.config.integratorName ?? 'SelfIntegration';\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': integratorName,\n 'User-Agent': buildUserAgent(this.config.sellerId, integratorName),\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n\n private composeSignal(external?: AbortSignal): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(this.timeoutMs);\n if (!external) return timeoutSignal;\n return AbortSignal.any([external, timeoutSignal]);\n }\n}\n\nasync function safeJson(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","import type { Logger } from '@lonca/core';\nimport { BrandsResource } from './resources/brands.js';\nimport { CategoriesResource } from './resources/categories.js';\nimport { InventoryResource } from './resources/inventory.js';\nimport { OrdersResource } from './resources/orders.js';\nimport { ProductsResource } from './resources/products.js';\nimport { SuppliersResource } from './resources/suppliers.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`.\n * Defaults to `'SelfIntegration'` if the seller owns the integration code.\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}\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 {\n brands: new BrandsResource(transport),\n categories: new CategoriesResource(transport),\n suppliers: new SuppliersResource(transport, opts.sellerId),\n products: new ProductsResource(transport, opts.sellerId),\n inventory: new InventoryResource(transport, opts.sellerId),\n orders: new OrdersResource(transport, opts.sellerId),\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lonca/trendyol",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Type-safe TypeScript SDK for the Trendyol Marketplace API",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,6 +42,15 @@
42
42
  "engines": {
43
43
  "node": ">=22"
44
44
  },
45
+ "dependencies": {
46
+ "@lonca/core": "^0.1.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^24.0.0",
50
+ "tsup": "^8.3.5",
51
+ "typescript": "^6.0.3",
52
+ "vitest": "^4.1.7"
53
+ },
45
54
  "scripts": {
46
55
  "build": "tsup",
47
56
  "dev": "tsup --watch",
@@ -50,14 +59,5 @@
50
59
  "typecheck": "tsc --noEmit",
51
60
  "lint": "eslint .",
52
61
  "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true});require('fs').rmSync('.turbo',{recursive:true,force:true})\""
53
- },
54
- "dependencies": {
55
- "@lonca/core": "workspace:^"
56
- },
57
- "devDependencies": {
58
- "@types/node": "catalog:",
59
- "tsup": "catalog:",
60
- "typescript": "catalog:",
61
- "vitest": "catalog:"
62
62
  }
63
- }
63
+ }