solometrics 0.0.0-stage → 0.1.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/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +295 -2
- package/dist/index.cjs +1163 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +846 -0
- package/dist/index.d.ts +846 -0
- package/dist/index.js +1130 -0
- package/dist/index.js.map +1 -0
- package/package.json +65 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/core.ts","../src/resources/shared.ts","../src/resources/goat.ts","../src/resources/inventory.ts","../src/resources/stockx/catalog.ts","../src/resources/stockx/costs.ts","../src/resources/stockx/listings.ts","../src/resources/stockx/market.ts","../src/resources/stockx/orders.ts","../src/resources/stockx/index.ts","../src/version.ts","../src/client.ts"],"sourcesContent":["/**\n * Error hierarchy for the SneakersRadar API.\n *\n * Every non-2xx response throws a subclass of {@link APIStatusError}, chosen by\n * status code. Network failures throw {@link APIConnectionError} (or its\n * {@link APITimeoutError} subclass).\n */\n\n/** Base class for every error thrown by this SDK. */\nexport class SolometricsError extends Error {\n constructor(message?: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\n/** An error talking to the API (network failure or non-2xx response). */\nexport class APIError extends SolometricsError {}\n\n/** The request never produced a response (DNS, TLS, connection reset, ...). */\nexport class APIConnectionError extends APIError {\n constructor(message = 'Connection error.', options?: { cause?: unknown }) {\n super(message, options);\n }\n}\n\n/** The request timed out on the client side. */\nexport class APITimeoutError extends APIConnectionError {\n constructor(options?: { cause?: unknown }) {\n super('Request timed out.', options);\n }\n}\n\n/** The caller's `AbortSignal` fired before the request (or job wait) finished. */\nexport class APIUserAbortError extends APIError {\n constructor(options?: { cause?: unknown }) {\n super('Request was aborted.', options);\n }\n}\n\n/** One entry of a 422 `detail` list. */\nexport interface ValidationErrorItem {\n loc?: (string | number)[];\n msg?: string;\n type?: string;\n [key: string]: unknown;\n}\n\n/**\n * The API returned a non-2xx status.\n *\n * - `status`: HTTP status code.\n * - `detail`: the `detail` field of the JSON error body: a message string, or\n * a list of field errors for 422. `null` if the body had none.\n * - `body`: the full decoded JSON body (or raw text if it was not JSON).\n * - `headers`: the response headers.\n */\nexport class APIStatusError extends APIError {\n readonly status: number;\n readonly detail: unknown;\n readonly body: unknown;\n readonly headers: Headers;\n\n constructor(message: string, init: { status: number; headers: Headers; body: unknown }) {\n super(`${init.status}: ${message}`);\n this.status = init.status;\n this.headers = init.headers;\n this.body = init.body;\n this.detail = isRecord(init.body) && 'detail' in init.body ? init.body.detail : null;\n }\n}\n\n/**\n * 400 — invalid request, plan pagination cap, bad CSV, no usable StockX\n * connection, or the connection's daily request cap was reached.\n */\nexport class BadRequestError extends APIStatusError {}\n\n/** 401 — the API key is missing, invalid or revoked. */\nexport class AuthenticationError extends APIStatusError {}\n\n/** 403 — the endpoint is not included in the account's plan. */\nexport class PermissionDeniedError extends APIStatusError {}\n\n/**\n * 404 — style code, size, SKU or record not found (cost endpoints also return\n * 404 when no StockX account is linked).\n */\nexport class NotFoundError extends APIStatusError {}\n\n/** 409 — keep-listing mode skipped the listing, or a GOAT account is needed but not linked. */\nexport class ConflictError extends APIStatusError {}\n\n/** 422 — a parameter has the wrong type or is out of range. `errors` holds the field errors. */\nexport class UnprocessableEntityError extends APIStatusError {\n get errors(): ValidationErrorItem[] {\n return Array.isArray(this.detail) ? (this.detail as ValidationErrorItem[]) : [];\n }\n}\n\n/** 429 — rate limit exceeded. `retryAfter` is the `Retry-After` header in seconds, when present. */\nexport class RateLimitError extends APIStatusError {\n get retryAfter(): number | null {\n return parseRetryAfter(this.headers);\n }\n}\n\n/** 5xx not covered by a more specific class. */\nexport class InternalServerError extends APIStatusError {}\n\n/** 502 — the request to StockX/GOAT failed; `detail` carries the upstream error. */\nexport class UpstreamError extends InternalServerError {}\n\n/** 504 — StockX did not respond in time. */\nexport class UpstreamTimeoutError extends InternalServerError {}\n\n/**\n * A `waitFor*` helper gave up before the background job finished.\n * `lastStatus` is the last status payload seen.\n */\nexport class JobTimeoutError extends SolometricsError {\n readonly taskId: string;\n readonly lastStatus: unknown;\n\n constructor(taskId: string, lastStatus: unknown) {\n const status = isRecord(lastStatus) ? lastStatus.status : lastStatus;\n super(`Job ${taskId} did not finish in time (last status: ${String(status)})`);\n this.taskId = taskId;\n this.lastStatus = lastStatus;\n }\n}\n\ntype StatusErrorClass = new (\n message: string,\n init: { status: number; headers: Headers; body: unknown },\n) => APIStatusError;\n\nconst STATUS_MAP: Record<number, StatusErrorClass> = {\n 400: BadRequestError,\n 401: AuthenticationError,\n 403: PermissionDeniedError,\n 404: NotFoundError,\n 409: ConflictError,\n 422: UnprocessableEntityError,\n 429: RateLimitError,\n 502: UpstreamError,\n 504: UpstreamTimeoutError,\n};\n\n/** @internal */\nexport function parseRetryAfter(headers: Headers): number | null {\n const raw = headers.get('retry-after');\n if (raw === null || raw.trim() === '') return null;\n const value = Number(raw);\n return Number.isFinite(value) && value >= 0 ? value : null;\n}\n\n/** @internal */\nexport function makeStatusError(status: number, statusText: string, headers: Headers, text: string): APIStatusError {\n let body: unknown;\n try {\n body = JSON.parse(text);\n } catch {\n body = text || null;\n }\n\n const detail = isRecord(body) ? body.detail : undefined;\n let message: string;\n if (typeof detail === 'string') {\n message = detail;\n } else if (Array.isArray(detail)) {\n const parts = detail.map((err) => {\n if (isRecord(err)) {\n const loc = Array.isArray(err.loc) ? err.loc.map(String).join('.') : '';\n return loc ? `${loc}: ${String(err.msg)}` : String(err.msg);\n }\n return String(err);\n });\n message = parts.join('; ') || 'Validation error';\n } else if (typeof body === 'string' && body) {\n message = body.slice(0, 500);\n } else {\n message = statusText || 'API error';\n }\n\n const cls = STATUS_MAP[status] ?? (status >= 500 ? InternalServerError : APIStatusError);\n return new cls(message, { status, headers, body });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","/** Transport-independent helpers shared by the client and the resources. @internal */\n\nimport { APIUserAbortError } from './errors';\n\nexport const DEFAULT_BASE_URL = 'https://api.sneakers.itbanque.com';\n/** Milliseconds. */\nexport const DEFAULT_TIMEOUT = 60_000;\nexport const DEFAULT_MAX_RETRIES = 2;\nexport const API_KEY_ENV = 'SOLOMETRICS_API_KEY';\nexport const BASE_URL_ENV = 'SOLOMETRICS_BASE_URL';\n\n/** Background-job statuses after which polling stops. */\nconst TERMINAL_JOB_STATUSES = new Set(['SUCCESS', 'FAILURE', 'CANCELLED']);\n\n/**\n * Methods the API treats as safe to repeat. POST is excluded: retrying a\n * create-listing call after a 502/504 could list the same pair twice.\n */\nconst IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'PUT', 'PATCH', 'DELETE']);\n\nconst MAX_BACKOFF_MS = 8_000;\nconst MAX_RETRY_AFTER_MS = 60_000;\n\n/** A price. Sent to the API as a string: `250`, `250.0` and `\"250\"` all become `\"250\"`. */\nexport type Amount = number | string | bigint;\n/** A shoe size, e.g. `10`, `\"10.5\"`, `\"10W\"`. */\nexport type Size = number | string;\n/** `\"2026-01-01\"` or a `Date` (formatted as its UTC calendar date). */\nexport type DateLike = string | Date;\n\nexport type QueryPrimitive = string | number | boolean | Date;\nexport type QueryValue = QueryPrimitive | readonly QueryPrimitive[] | null | undefined;\nexport type Query = Record<string, QueryValue>;\n\n/**\n * A CSV for an upload endpoint:\n *\n * - a file path (`string`);\n * - the CSV content as a `Uint8Array` / `Buffer` / `ArrayBuffer`;\n * - a `Blob` or `File` (a `File`'s name is kept);\n * - a Node readable stream (e.g. `fs.createReadStream(...)`), web `ReadableStream`, or any\n * async iterable of chunks;\n * - `{ rows }`: objects that become CSV rows (header = union of keys, in first-seen order).\n */\nexport type CsvSource =\n | string\n | Uint8Array\n | ArrayBuffer\n | Blob\n | ReadableStream<Uint8Array>\n | AsyncIterable<Uint8Array | string>\n | { rows: Iterable<CsvRow> };\n\nexport type CsvRow = Record<string, unknown>;\n\nexport interface CsvFile {\n name: string;\n content: Uint8Array;\n}\n\nexport function readEnv(name: string): string | undefined {\n const value = typeof process !== 'undefined' ? process.env?.[name] : undefined;\n return value || undefined;\n}\n\n// ----------------------------------------------------------------------- formatting\n\nexport function formatAmount(amount: Amount): string {\n if (typeof amount === 'boolean') throw new TypeError('amount must be a number or string, not boolean');\n if (typeof amount === 'number' && !Number.isFinite(amount)) throw new TypeError(`Invalid amount: ${amount}`);\n return String(amount);\n}\n\nexport function formatSize(size: Size): string {\n return String(size);\n}\n\nexport function formatDate(value: DateLike): string {\n return value instanceof Date ? value.toISOString().slice(0, 10) : value;\n}\n\nexport function formatDateTime(value: string | Date): string {\n return value instanceof Date ? value.toISOString() : value;\n}\n\n/** Percent-encode a value for use as a single path segment. */\nexport function pathSegment(value: string | number): string {\n return encodeURIComponent(String(value));\n}\n\nfunction queryString(value: QueryPrimitive): string {\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (value instanceof Date) return formatDate(value);\n return String(value);\n}\n\n/** Build `base + path` with the query string; `null`/`undefined` values are dropped. */\nexport function buildURL(baseURL: string, path: string, query: Query | undefined): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const item of value as readonly QueryPrimitive[]) params.append(key, queryString(item));\n } else {\n params.append(key, queryString(value as QueryPrimitive));\n }\n }\n const qs = params.toString();\n return `${baseURL}${path}${qs ? `?${qs}` : ''}`;\n}\n\n/**\n * Drop `undefined` and `null` values from a JSON body: no documented body field\n * accepts `null`.\n */\nexport function cleanBody(body: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(body)) {\n if (value !== undefined && value !== null) out[key] = value;\n }\n return out;\n}\n\nexport function joinStatuses(statuses: string | readonly string[] | undefined | null): string | undefined {\n if (statuses === undefined || statuses === null) return undefined;\n return typeof statuses === 'string' ? statuses : statuses.join(',');\n}\n\n// ----------------------------------------------------------------------- batch delete\n\n/**\n * A listing to delete: a listing ID, a `[listingId, variantId]` tuple, or an\n * object with `listingId`/`listing_id` and optional `variantId`/`variant_id`.\n */\nexport type BatchDeleteItem =\n | string\n | readonly [listingId: string, variantId?: string | null]\n | { listingId: string; variantId?: string | null }\n | { listing_id: string; variant_id?: string | null };\n\nexport function normalizeBatchDeleteItems(\n items: Iterable<BatchDeleteItem>,\n): { listingId: string; variantId?: string }[] {\n const out: { listingId: string; variantId?: string }[] = [];\n for (const item of items) {\n if (typeof item === 'string') {\n out.push({ listingId: item });\n continue;\n }\n let listingId: unknown;\n let variantId: unknown;\n if (Array.isArray(item)) {\n [listingId, variantId] = item as readonly unknown[];\n } else if (typeof item === 'object' && item !== null) {\n const obj = item as Record<string, unknown>;\n listingId = obj.listingId ?? obj.listing_id;\n variantId = obj.variantId ?? obj.variant_id;\n } else {\n throw new TypeError(`Unsupported batch-delete item: ${JSON.stringify(item)}`);\n }\n if (!listingId) throw new TypeError(`Batch-delete item is missing a listing ID: ${JSON.stringify(item)}`);\n const entry: { listingId: string; variantId?: string } = { listingId: String(listingId) };\n if (variantId) entry.variantId = String(variantId);\n out.push(entry);\n }\n if (out.length === 0) throw new TypeError('`items` is empty.');\n return out;\n}\n\n// ----------------------------------------------------------------------- CSV uploads\n\nconst encoder = new TextEncoder();\n\nfunction isRowsSource(source: CsvSource): source is { rows: Iterable<CsvRow> } {\n return (\n typeof source === 'object' &&\n source !== null &&\n !(source instanceof Uint8Array) &&\n !(source instanceof ArrayBuffer) &&\n !(typeof Blob !== 'undefined' && source instanceof Blob) &&\n 'rows' in source\n );\n}\n\nfunction basename(path: string): string {\n return path.split(/[\\\\/]/).pop() || path;\n}\n\nasync function collect(chunks: AsyncIterable<Uint8Array | string>): Promise<Uint8Array> {\n const parts: Uint8Array[] = [];\n let length = 0;\n for await (const chunk of chunks) {\n const bytes = typeof chunk === 'string' ? encoder.encode(chunk) : new Uint8Array(chunk);\n parts.push(bytes);\n length += bytes.length;\n }\n const out = new Uint8Array(length);\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.length;\n }\n return out;\n}\n\nasync function* readWebStream(stream: ReadableStream<Uint8Array>): AsyncGenerator<Uint8Array> {\n const reader = stream.getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) return;\n yield value;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Turn a {@link CsvSource} into an in-memory file, so the request can be\n * retried. The API only accepts file names ending in `.csv`.\n */\nexport async function prepareCsvUpload(source: CsvSource, defaultName: string): Promise<CsvFile> {\n if (source === undefined || source === null) {\n throw new TypeError('Pass a CSV file (path, bytes, Blob or stream) or `{ rows }`.');\n }\n\n let name = defaultName;\n let content: Uint8Array;\n\n if (typeof source === 'string') {\n const { readFile } = await import('node:fs/promises');\n content = new Uint8Array(await readFile(source));\n name = basename(source);\n } else if (source instanceof Uint8Array) {\n content = source;\n } else if (source instanceof ArrayBuffer) {\n content = new Uint8Array(source);\n } else if (typeof Blob !== 'undefined' && source instanceof Blob) {\n content = new Uint8Array(await source.arrayBuffer());\n const fileName = (source as { name?: unknown }).name;\n if (typeof fileName === 'string' && fileName) name = basename(fileName);\n } else if (isRowsSource(source)) {\n content = rowsToCsv(source.rows);\n } else if (typeof (source as ReadableStream).getReader === 'function') {\n content = await collect(readWebStream(source as ReadableStream<Uint8Array>));\n } else if (typeof (source as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function') {\n content = await collect(source as AsyncIterable<Uint8Array | string>);\n const path = (source as { path?: unknown }).path; // fs.ReadStream\n if (typeof path === 'string' && path) name = basename(path);\n } else {\n throw new TypeError(`Unsupported CSV source: ${Object.prototype.toString.call(source)}`);\n }\n\n if (!name.toLowerCase().endsWith('.csv')) name = `${name}.csv`;\n return { name, content };\n}\n\nfunction csvField(value: unknown): string {\n if (value === undefined || value === null) return '';\n const text = value instanceof Date ? value.toISOString() : String(value);\n return /[\",\\r\\n]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\nexport function rowsToCsv(rows: Iterable<CsvRow>): Uint8Array {\n const list = Array.from(rows);\n if (list.length === 0) throw new TypeError('`rows` is empty.');\n const header: string[] = [];\n const seen = new Set<string>();\n for (const row of list) {\n for (const key of Object.keys(row)) {\n if (!seen.has(key)) {\n seen.add(key);\n header.push(key);\n }\n }\n }\n const lines = [header.map(csvField).join(',')];\n for (const row of list) lines.push(header.map((key) => csvField(row[key])).join(','));\n return encoder.encode(`${lines.join('\\n')}\\n`);\n}\n\n// ----------------------------------------------------------------------- retries\n\n/** Why a request produced no response. */\nexport type NetworkErrorKind = 'connect' | 'timeout' | 'network';\n\n/** Error codes meaning the request never reached the server. */\nconst CONNECT_ERROR_CODES = new Set([\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'EAI_AGAIN',\n 'EHOSTUNREACH',\n 'ENETUNREACH',\n 'EADDRNOTAVAIL',\n 'UND_ERR_CONNECT_TIMEOUT',\n]);\n\nfunction errorCodes(err: unknown, depth = 0): string[] {\n if (typeof err !== 'object' || err === null || depth > 3) return [];\n const e = err as { code?: unknown; cause?: unknown; errors?: unknown };\n const codes = typeof e.code === 'string' ? [e.code] : [];\n if (Array.isArray(e.errors)) for (const inner of e.errors) codes.push(...errorCodes(inner, depth + 1));\n codes.push(...errorCodes(e.cause, depth + 1));\n return codes;\n}\n\n/** Classify an error thrown by `fetch` (or while reading the body). */\nexport function classifyNetworkError(err: unknown): NetworkErrorKind {\n const codes = errorCodes(err);\n if (codes.length > 0 && codes.every((code) => CONNECT_ERROR_CODES.has(code))) return 'connect';\n return 'network';\n}\n\nexport function shouldRetryStatus(method: string, status: number): boolean {\n if (status === 429) return true;\n if (status === 502 || status === 503 || status === 504) return IDEMPOTENT_METHODS.has(method.toUpperCase());\n return false;\n}\n\nexport function shouldRetryNetworkError(method: string, kind: NetworkErrorKind): boolean {\n // A connect failure means the request never reached the server, so it is\n // always safe to repeat. A timeout or dropped connection may have been\n // processed already.\n if (kind === 'connect') return true;\n return IDEMPOTENT_METHODS.has(method.toUpperCase());\n}\n\n/** Milliseconds to wait before retry number `attempt` (0-based). */\nexport function retryDelay(attempt: number, retryAfterSeconds: number | null): number {\n if (retryAfterSeconds !== null) return Math.min(retryAfterSeconds * 1000, MAX_RETRY_AFTER_MS);\n const base = Math.min(500 * 2 ** attempt, MAX_BACKOFF_MS);\n return base * (0.75 + Math.random() * 0.5);\n}\n\nexport function jobFinished(payload: unknown): boolean {\n const status = typeof payload === 'object' && payload !== null ? (payload as { status?: unknown }).status : undefined;\n return typeof status === 'string' && TERMINAL_JOB_STATUSES.has(status.toUpperCase());\n}\n\nfunction defaultSleep(ms: number, signal?: AbortSignal | null): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new APIUserAbortError({ cause: signal.reason }));\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n reject(new APIUserAbortError({ cause: signal?.reason }));\n };\n const timer = setTimeout(\n () => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n },\n Math.max(0, ms),\n );\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/** Indirection so tests can skip real waits. */\nexport const timing = {\n sleep: defaultSleep,\n};\n","import type { Client, FinalRequestOptions, HttpMethod, RequestOptions } from '../client';\nimport { jobFinished, timing } from '../core';\nimport type { CsvFile, Query } from '../core';\nimport { JobTimeoutError } from '../errors';\nimport type { JobStatus } from '../types';\n\n/** Options for endpoints that accept a StockX `connection_id`. */\nexport interface ConnectionOptions extends RequestOptions {\n /** StockX connection to use. Defaults to the client's `connectionId`. */\n connectionId?: number | null;\n}\n\n/** Options for the `waitFor*` job-polling helpers. */\nexport interface WaitOptions {\n /** Milliseconds between status polls. Default 5000. */\n pollInterval?: number;\n /**\n * Give up after this many milliseconds and throw {@link JobTimeoutError}.\n * Without it, waits indefinitely.\n */\n timeout?: number | null;\n /** Called with every status payload, including the final one. May return a promise. */\n onProgress?: (status: JobStatus) => unknown;\n /** Stop waiting; throws {@link APIUserAbortError}. */\n signal?: AbortSignal | null;\n}\n\nexport abstract class APIResource {\n protected readonly _client: Client;\n\n constructor(client: Client) {\n this._client = client;\n }\n\n protected _conn(connectionId: number | null | undefined): number | null {\n return connectionId ?? this._client.connectionId;\n }\n\n protected _get<T>(path: string, query?: Query, options?: RequestOptions): Promise<T> {\n return this._client._request<T>({ ...requestOptions(options), method: 'GET', path, query });\n }\n\n protected _send<T>(\n method: HttpMethod,\n path: string,\n init: { query?: Query; body?: unknown; file?: CsvFile } = {},\n options?: RequestOptions,\n ): Promise<T> {\n const final: FinalRequestOptions = { ...requestOptions(options), method, path, ...init };\n return this._client._request<T>(final);\n }\n\n protected async _wait(\n fetchStatus: (options: RequestOptions) => Promise<JobStatus>,\n taskId: string,\n { pollInterval = 5000, timeout = null, onProgress, signal }: WaitOptions = {},\n ): Promise<JobStatus> {\n const deadline = timeout === null ? null : performance.now() + timeout;\n for (;;) {\n const status = await fetchStatus({ signal });\n if (onProgress) await onProgress(status);\n if (jobFinished(status)) return status;\n if (deadline !== null && performance.now() + pollInterval > deadline) throw new JobTimeoutError(taskId, status);\n await timing.sleep(pollInterval, signal);\n }\n }\n}\n\n/** Pick the per-request transport options out of a method's options object. */\nexport function requestOptions(options: RequestOptions | undefined): RequestOptions {\n if (!options) return {};\n const out: RequestOptions = {};\n if (options.timeout !== undefined) out.timeout = options.timeout;\n if (options.maxRetries !== undefined) out.maxRetries = options.maxRetries;\n if (options.signal !== undefined) out.signal = options.signal;\n if (options.headers !== undefined) out.headers = options.headers;\n return out;\n}\n","import type { Client, RequestOptions } from '../client';\nimport type { MarketSearchResponse } from '../types';\nimport { APIResource } from './shared';\n\nexport class GoatMarketResource extends APIResource {\n /**\n * `GET /v2/goat/market/search` — per-size GOAT prices. Needs a linked GOAT\n * account (`ConflictError` otherwise).\n */\n search(styleId: string, options: RequestOptions = {}): Promise<MarketSearchResponse> {\n return this._get('/v2/goat/market/search', { style_id: styleId }, options);\n }\n}\n\nexport class GoatResource extends APIResource {\n readonly market: GoatMarketResource;\n\n constructor(client: Client) {\n super(client);\n this.market = new GoatMarketResource(client);\n }\n}\n","import type { RequestOptions } from '../client';\nimport { formatSize, pathSegment } from '../core';\nimport type { Size } from '../core';\nimport type { InventoryItem, InventorySearchResponse, SkuHistoryResponse } from '../types';\nimport { APIResource } from './shared';\n\nexport interface InventoryFilters extends RequestOptions {\n /** Broad search. */\n q?: string;\n /** Partial match. */\n styleColor?: string;\n /** Partial match. */\n brand?: string;\n /** Partial match. */\n retailer?: string;\n /** Exact match. */\n size?: Size;\n /** Partial match. */\n retailerSku?: string;\n /** Partial match. */\n supplierSku?: string;\n}\n\nexport interface InventorySearchParams extends InventoryFilters {\n /** Capped by your plan's `max_page_size`. */\n limit?: number;\n offset?: number;\n}\n\nexport interface InventoryIterParams extends InventoryFilters {\n /** Page size for each request (the API's `limit`). */\n pageSize?: number;\n /** Start offset. Default 0. */\n offset?: number;\n}\n\nexport interface SkuHistoryParams extends RequestOptions {\n /** Look-back window in hours, 1–8760 (default 168). */\n hours?: number;\n}\n\n/** Retailer inventory and SKU stock history. */\nexport class InventoryResource extends APIResource {\n /** `GET /v1/inventory/search` — one page of SKUs with stock per location. */\n search(params: InventorySearchParams = {}): Promise<InventorySearchResponse> {\n return this._get(\n '/v1/inventory/search',\n {\n q: params.q,\n style_color: params.styleColor,\n brand: params.brand,\n retailer: params.retailer,\n size: params.size === undefined || params.size === null ? undefined : formatSize(params.size),\n retailer_sku: params.retailerSku,\n supplier_sku: params.supplierSku,\n limit: params.limit,\n offset: params.offset,\n },\n params,\n );\n }\n\n /**\n * Iterate every matching SKU across pages.\n *\n * Stops at the last page. Without provider access for `retailer` the plan's\n * `max_page_number` cap applies, and going past it throws `BadRequestError`.\n */\n async *iterSearch(params: InventoryIterParams = {}): AsyncGenerator<InventoryItem, void, undefined> {\n const { pageSize, offset: start, ...rest } = params;\n let offset = start ?? 0;\n for (;;) {\n const page = await this.search({ ...rest, limit: pageSize, offset });\n const items = page.items ?? [];\n yield* items;\n if (!page.has_next_page || items.length === 0) return;\n offset += items.length;\n }\n }\n\n /**\n * `GET /v1/reporting/retailers/{retailer}/skus/{retailerSku}/history` —\n * stock history of one SKU, newest first.\n */\n history(retailer: string, retailerSku: string, params: SkuHistoryParams = {}): Promise<SkuHistoryResponse> {\n return this._get(\n `/v1/reporting/retailers/${pathSegment(retailer)}/skus/${pathSegment(retailerSku)}/history`,\n { hours: params.hours },\n params,\n );\n }\n}\n","import { pathSegment } from '../../core';\nimport type { StockXObject } from '../../types';\nimport { APIResource } from '../shared';\nimport type { ConnectionOptions } from '../shared';\n\nexport interface CatalogSearchParams extends ConnectionOptions {\n pageNumber?: number;\n pageSize?: number;\n}\n\nexport interface CatalogVariantsParams extends ConnectionOptions {\n /** Pass the style code so the product is cached for your account. */\n styleId?: string;\n}\n\nexport class StockXCatalogResource extends APIResource {\n /**\n * `GET /v2/stockx/catalog/search` — StockX catalog search (usually by style\n * code), returned as received from StockX.\n */\n search(q: string, params: CatalogSearchParams = {}): Promise<StockXObject> {\n return this._get(\n '/v2/stockx/catalog/search',\n {\n q,\n page_number: params.pageNumber,\n page_size: params.pageSize,\n connection_id: this._conn(params.connectionId),\n },\n params,\n );\n }\n\n /**\n * `GET /v2/stockx/catalog/products/{productId}/variants` — every size variant\n * of a product, as received from StockX.\n */\n variants(productId: string, params: CatalogVariantsParams = {}): Promise<StockXObject[]> {\n return this._get(\n `/v2/stockx/catalog/products/${pathSegment(productId)}/variants`,\n { style_id: params.styleId, connection_id: this._conn(params.connectionId) },\n params,\n );\n }\n}\n","import { cleanBody, formatSize, pathSegment, prepareCsvUpload } from '../../core';\nimport type { CsvSource, Size } from '../../core';\nimport type { CostClearResponse, CostImportResponse, CostListResponse, CostRecord, OkResponse } from '../../types';\nimport { APIResource } from '../shared';\nimport type { ConnectionOptions } from '../shared';\n\nexport interface ListCostsParams extends ConnectionOptions {\n page?: number;\n /** 1–200, default 50. */\n pageSize?: number;\n /** Partial match. */\n styleId?: string;\n}\n\nexport interface IterCostsParams extends ConnectionOptions {\n /** Default 200. */\n pageSize?: number;\n styleId?: string;\n}\n\nexport interface UpdateCostParams extends ConnectionOptions {\n cost?: number;\n /** `false` keeps the record but excludes it from profit and smart pricing. */\n isActive?: boolean;\n}\n\n/** Acquisition costs per style code / size / variant. Uses no StockX quota. */\nexport class StockXCostsResource extends APIResource {\n /** `PATCH /v2/stockx/cost` — create or overwrite the cost for one style/size/variant. Basic plan. */\n set(\n styleId: string,\n size: Size,\n variantId: string,\n cost: number,\n params: ConnectionOptions = {},\n ): Promise<OkResponse> {\n return this._send(\n 'PATCH',\n '/v2/stockx/cost',\n {\n query: { connection_id: this._conn(params.connectionId) },\n body: { styleId, size: formatSize(size), variantId, cost },\n },\n params,\n );\n }\n\n /** `GET /v2/stockx/costs` — cost records, newest first. */\n list(params: ListCostsParams = {}): Promise<CostListResponse> {\n return this._get(\n '/v2/stockx/costs',\n {\n page: params.page,\n page_size: params.pageSize,\n style_id: params.styleId,\n connection_id: this._conn(params.connectionId),\n },\n params,\n );\n }\n\n /** Iterate every cost record across pages. */\n async *iterList(params: IterCostsParams = {}): AsyncGenerator<CostRecord, void, undefined> {\n const { pageSize = 200, ...rest } = params;\n let seen = 0;\n for (let page = 1; ; page++) {\n const data = await this.list({ ...rest, page, pageSize });\n const items = data.items ?? [];\n yield* items;\n seen += items.length;\n if (items.length === 0 || seen >= Number(data.total ?? 0)) return;\n }\n }\n\n /**\n * `POST /v2/stockx/costs/import` — upsert costs from a CSV with\n * `style_id, size, variant_id, cost`. Synchronous. Advanced plan.\n */\n async importCsv(source: CsvSource, params: ConnectionOptions = {}): Promise<CostImportResponse> {\n const file = await prepareCsvUpload(source, 'costs.csv');\n return this._send(\n 'POST',\n '/v2/stockx/costs/import',\n { query: { connection_id: this._conn(params.connectionId) }, file },\n params,\n );\n }\n\n /** `PATCH /v2/stockx/costs/{costId}` — edit one record. Basic plan. */\n update(costId: number, params: UpdateCostParams = {}): Promise<OkResponse> {\n return this._send(\n 'PATCH',\n `/v2/stockx/costs/${pathSegment(costId)}`,\n {\n query: { connection_id: this._conn(params.connectionId) },\n body: cleanBody({ cost: params.cost, is_active: params.isActive }),\n },\n params,\n );\n }\n\n /** `DELETE /v2/stockx/costs` — delete EVERY cost record on the connection. Cannot be undone. Basic plan. */\n clear(params: ConnectionOptions = {}): Promise<CostClearResponse> {\n return this._send(\n 'DELETE',\n '/v2/stockx/costs',\n { query: { connection_id: this._conn(params.connectionId) } },\n params,\n );\n }\n}\n","import type { RequestOptions } from '../../client';\nimport {\n cleanBody,\n formatAmount,\n formatDateTime,\n formatSize,\n joinStatuses,\n normalizeBatchDeleteItems,\n pathSegment,\n prepareCsvUpload,\n} from '../../core';\nimport type { Amount, BatchDeleteItem, CsvSource, Size } from '../../core';\nimport type {\n CancelUnlistResponse,\n JobStatus,\n StockXObject,\n TaskQueuedResponse,\n UnlistJobResponse,\n UnmatchedResponse,\n UploadJobResponse,\n UploadValidationResponse,\n} from '../../types';\nimport { APIResource } from '../shared';\nimport type { ConnectionOptions, WaitOptions } from '../shared';\n\ninterface ListingFields extends ConnectionOptions {\n currencyCode?: string;\n /** ISO 8601 string or `Date`. */\n expiresAt?: string | Date;\n active?: boolean;\n inventoryType?: string;\n}\n\nexport interface CreateBySkuParams extends ListingFields {\n /** Acquisition cost, stored as a cost record for this style/size/variant. */\n cost?: number;\n}\n\nexport interface CreateListingParams extends ListingFields {\n /** Acquisition cost. Stored only together with `styleId` and `size`. */\n cost?: number;\n styleId?: string;\n size?: Size;\n}\n\nexport interface UpdateListingParams extends ConnectionOptions {\n amount?: Amount;\n currencyCode?: string;\n /** ISO 8601 string or `Date`. */\n expiresAt?: string | Date;\n}\n\nexport interface ListListingsParams extends ConnectionOptions {\n pageNumber?: number;\n pageSize?: number;\n /** Defaults to `ACTIVE` on the server; pass an array for several. */\n listingStatuses?: string | readonly string[];\n /** A style code already cached for your account (404 otherwise). */\n sku?: string;\n}\n\nexport interface ActivateListingParams extends ConnectionOptions {\n /** Relist at a new price. */\n amount?: Amount;\n}\n\nexport interface DeleteListingParams extends ConnectionOptions {\n /** Also delete the variant's cost records. */\n variantId?: string;\n}\n\nexport interface UploadParams extends RequestOptions {\n batchSize?: number;\n}\n\n/** Create, reprice and take down listings on your linked StockX account. */\nexport class StockXListingsResource extends APIResource {\n // -------------------------------------------------------------- single items\n\n /**\n * `POST /v2/stockx/simple-listing` — list by style code and size.\n *\n * The backend resolves the variant. Throws `NotFoundError` if no variant\n * matches and `ConflictError` when keep-listing mode skips it. Requires the\n * basic plan.\n */\n async createBySku(\n styleId: string,\n size: Size,\n amount: Amount,\n params: CreateBySkuParams = {},\n ): Promise<StockXObject> {\n return this._send(\n 'POST',\n '/v2/stockx/simple-listing',\n {\n query: { connection_id: this._conn(params.connectionId) },\n body: cleanBody({\n styleId,\n size: formatSize(size),\n amount: formatAmount(amount),\n cost: params.cost,\n currencyCode: params.currencyCode,\n expiresAt: params.expiresAt == null ? undefined : formatDateTime(params.expiresAt),\n active: params.active,\n inventoryType: params.inventoryType,\n }),\n },\n params,\n );\n }\n\n /**\n * `POST /v2/stockx/listings` — list a specific `variantId`.\n *\n * To store a cost record too, pass `cost`, `styleId` and `size` together (the\n * API silently skips the cost if one is missing, so the SDK throws a\n * `TypeError` instead). Requires the basic plan.\n */\n async create(variantId: string, amount: Amount, params: CreateListingParams = {}): Promise<StockXObject> {\n if (params.cost != null && (params.styleId == null || params.size == null)) {\n throw new TypeError('`cost` is only stored together with `styleId` and `size`; pass all three.');\n }\n return this._send(\n 'POST',\n '/v2/stockx/listings',\n {\n query: { connection_id: this._conn(params.connectionId) },\n body: cleanBody({\n variantId,\n amount: formatAmount(amount),\n currencyCode: params.currencyCode,\n expiresAt: params.expiresAt == null ? undefined : formatDateTime(params.expiresAt),\n active: params.active,\n inventoryType: params.inventoryType,\n cost: params.cost,\n styleId: params.styleId,\n size: params.size == null ? undefined : formatSize(params.size),\n }),\n },\n params,\n );\n }\n\n /** `PATCH /v2/stockx/listings/{listingId}` — reprice or change expiry. Requires the basic plan. */\n async update(listingId: string, params: UpdateListingParams = {}): Promise<StockXObject> {\n return this._send(\n 'PATCH',\n `/v2/stockx/listings/${pathSegment(listingId)}`,\n {\n query: { connection_id: this._conn(params.connectionId) },\n body: cleanBody({\n amount: params.amount == null ? undefined : formatAmount(params.amount),\n currencyCode: params.currencyCode,\n expiresAt: params.expiresAt == null ? undefined : formatDateTime(params.expiresAt),\n }),\n },\n params,\n );\n }\n\n /**\n * `GET /v2/stockx/listings` — your listings, fetched live from StockX.\n * ACTIVE listings carry `cost` and `netPrice`.\n */\n list(params: ListListingsParams = {}): Promise<StockXObject> {\n return this._get(\n '/v2/stockx/listings',\n {\n page_number: params.pageNumber,\n page_size: params.pageSize,\n listing_statuses: joinStatuses(params.listingStatuses),\n sku: params.sku,\n connection_id: this._conn(params.connectionId),\n },\n params,\n );\n }\n\n /** `GET /v2/stockx/listings/{listingId}` — one listing. */\n get(listingId: string, params: ConnectionOptions = {}): Promise<StockXObject> {\n return this._get(\n `/v2/stockx/listings/${pathSegment(listingId)}`,\n { connection_id: this._conn(params.connectionId) },\n params,\n );\n }\n\n /**\n * `GET /v2/stockx/listings/{listingId}/operations/{operationId}` — result of\n * an asynchronous StockX operation.\n */\n getOperation(listingId: string, operationId: string, params: ConnectionOptions = {}): Promise<StockXObject> {\n return this._get(\n `/v2/stockx/listings/${pathSegment(listingId)}/operations/${pathSegment(operationId)}`,\n { connection_id: this._conn(params.connectionId) },\n params,\n );\n }\n\n /** `PUT /v2/stockx/listings/{listingId}/deactivate` — take off market, keep the listing. Basic plan. */\n deactivate(listingId: string, params: ConnectionOptions = {}): Promise<StockXObject> {\n return this._send(\n 'PUT',\n `/v2/stockx/listings/${pathSegment(listingId)}/deactivate`,\n { query: { connection_id: this._conn(params.connectionId) } },\n params,\n );\n }\n\n /**\n * `PUT /v2/stockx/listings/{listingId}/activate` — put back on market,\n * optionally at a new `amount`. Basic plan.\n */\n async activate(listingId: string, params: ActivateListingParams = {}): Promise<StockXObject> {\n return this._send(\n 'PUT',\n `/v2/stockx/listings/${pathSegment(listingId)}/activate`,\n {\n query: { connection_id: this._conn(params.connectionId) },\n body: params.amount == null ? undefined : { amount: formatAmount(params.amount) },\n },\n params,\n );\n }\n\n /**\n * `DELETE /v2/stockx/listings/{listingId}` — permanent. With `variantId` the\n * variant's cost records are deleted too. Basic plan.\n */\n delete(listingId: string, params: DeleteListingParams = {}): Promise<StockXObject> {\n return this._send(\n 'DELETE',\n `/v2/stockx/listings/${pathSegment(listingId)}`,\n { query: { variant_id: params.variantId, connection_id: this._conn(params.connectionId) } },\n params,\n );\n }\n\n /**\n * `POST /v2/stockx/batch/delete-listing` — delete several listings in one\n * StockX batch. Advanced plan.\n *\n * `items` may be listing ID strings, `[listingId, variantId]` tuples, or\n * objects with `listingId`/`listing_id` and optional `variantId`/`variant_id`.\n */\n async batchDelete(items: Iterable<BatchDeleteItem>, params: ConnectionOptions = {}): Promise<StockXObject> {\n const normalized = normalizeBatchDeleteItems(items);\n return this._send(\n 'POST',\n '/v2/stockx/batch/delete-listing',\n { query: { connection_id: this._conn(params.connectionId) }, body: { items: normalized } },\n params,\n );\n }\n\n // -------------------------------------------------------------- CSV upload\n\n /**\n * `POST /v2/stockx/listings/upload` — start a bulk listing job.\n *\n * Pass a CSV (path, bytes, Blob or stream) or `{ rows }` with\n * `sku, size, quantity, amount, cost`. Returns a `taskId`; poll with\n * {@link uploadStatus} or {@link waitForUpload}. Advanced plan.\n */\n async upload(source: CsvSource, params: UploadParams = {}): Promise<UploadJobResponse> {\n const file = await prepareCsvUpload(source, 'listings.csv');\n return this._send('POST', '/v2/stockx/listings/upload', { query: { batch_size: params.batchSize }, file }, params);\n }\n\n /**\n * `POST /v2/stockx/listings/upload/validate` — count valid, invalid and\n * duplicate rows without listing anything.\n */\n async validateUpload(source: CsvSource, options: RequestOptions = {}): Promise<UploadValidationResponse> {\n const file = await prepareCsvUpload(source, 'listings.csv');\n return this._send('POST', '/v2/stockx/listings/upload/validate', { file }, options);\n }\n\n /** `GET /v2/stockx/listings/upload/{taskId}` */\n uploadStatus(taskId: string, options: RequestOptions = {}): Promise<JobStatus> {\n return this._get(`/v2/stockx/listings/upload/${pathSegment(taskId)}`, undefined, options);\n }\n\n /**\n * Poll {@link uploadStatus} until the job is SUCCESS, FAILURE or CANCELLED,\n * and return the final status. Throws `JobTimeoutError` after `timeout` ms.\n */\n waitForUpload(taskId: string, options: WaitOptions = {}): Promise<JobStatus> {\n return this._wait((o) => this.uploadStatus(taskId, o), taskId, options);\n }\n\n /** `GET /v2/stockx/listings/upload/unmatched` — uploaded rows that could not be matched to a variant. */\n unmatched(options: RequestOptions = {}): Promise<UnmatchedResponse> {\n return this._get('/v2/stockx/listings/upload/unmatched', undefined, options);\n }\n\n // -------------------------------------------------------------- CSV unlist\n\n /**\n * `POST /v2/stockx/listings/unlist` — start a bulk delist job.\n *\n * Rows carry `listing_id` (optionally `variant_id`), or `sku` (or `style_id`)\n * plus `size` to match ACTIVE listings. Advanced plan.\n */\n async unlist(source: CsvSource, options: RequestOptions = {}): Promise<UnlistJobResponse> {\n const file = await prepareCsvUpload(source, 'unlist.csv');\n return this._send('POST', '/v2/stockx/listings/unlist', { file }, options);\n }\n\n /** `GET /v2/stockx/listings/unlist/{taskId}` */\n unlistStatus(taskId: string, options: RequestOptions = {}): Promise<JobStatus> {\n return this._get(`/v2/stockx/listings/unlist/${pathSegment(taskId)}`, undefined, options);\n }\n\n /** Poll {@link unlistStatus} until the job finishes. */\n waitForUnlist(taskId: string, options: WaitOptions = {}): Promise<JobStatus> {\n return this._wait((o) => this.unlistStatus(taskId, o), taskId, options);\n }\n\n /** `POST /v2/stockx/listings/unlist/cancel` — cancel your running unlist job. */\n cancelUnlist(options: RequestOptions = {}): Promise<CancelUnlistResponse> {\n return this._send('POST', '/v2/stockx/listings/unlist/cancel', {}, options);\n }\n\n // -------------------------------------------------------------- clear all\n\n /**\n * `POST /v2/stockx/listings/clear-all` — delete EVERY active listing in the\n * account's `clear_all_scope`. Cannot be undone. Advanced plan.\n */\n clearAll(options: RequestOptions = {}): Promise<TaskQueuedResponse> {\n return this._send('POST', '/v2/stockx/listings/clear-all', {}, options);\n }\n\n /** `GET /v2/stockx/listings/clear-all/{taskId}` */\n clearAllStatus(taskId: string, options: RequestOptions = {}): Promise<JobStatus> {\n return this._get(`/v2/stockx/listings/clear-all/${pathSegment(taskId)}`, undefined, options);\n }\n\n /** Poll {@link clearAllStatus} until the job finishes. */\n waitForClearAll(taskId: string, options: WaitOptions = {}): Promise<JobStatus> {\n return this._wait((o) => this.clearAllStatus(taskId, o), taskId, options);\n }\n}\n","import type { RequestOptions } from '../../client';\nimport { formatSize, pathSegment } from '../../core';\nimport type { Size } from '../../core';\nimport type { HotStylesResponse, MarketSearchResponse, StockXObject } from '../../types';\nimport { APIResource } from '../shared';\nimport type { ConnectionOptions } from '../shared';\n\nexport interface MarketSearchParams extends RequestOptions {\n size?: Size;\n /** Skip the cache and spend StockX quota. */\n force?: boolean;\n}\n\nexport interface HotStylesParams extends RequestOptions {\n limit?: number;\n page?: number;\n}\n\nexport interface HotStylesIterParams extends RequestOptions {\n /** Default 100. */\n pageSize?: number;\n}\n\nexport interface VariantMarketParams extends ConnectionOptions {\n currencyCode?: string;\n}\n\nexport class StockXMarketResource extends APIResource {\n /**\n * `GET /v2/stockx/market/search` — lowest ask / highest bid per size.\n *\n * Served from cache when fresh; `force: true` skips the cache and spends\n * StockX quota. Check `fetched_at` for freshness.\n */\n search(styleId: string, params: MarketSearchParams = {}): Promise<MarketSearchResponse> {\n return this._get(\n '/v2/stockx/market/search',\n {\n style_id: styleId,\n size: params.size === undefined || params.size === null ? undefined : formatSize(params.size),\n force: params.force,\n },\n params,\n );\n }\n\n /** `GET /v2/stockx/market/hot` — style codes with recently cached quotes. */\n hot(params: HotStylesParams = {}): Promise<HotStylesResponse> {\n return this._get('/v2/stockx/market/hot', { limit: params.limit, page: params.page }, params);\n }\n\n /** Iterate every recently quoted style code across pages. */\n async *iterHot(params: HotStylesIterParams = {}): AsyncGenerator<string, void, undefined> {\n const { pageSize = 100, ...options } = params;\n for (let page = 1; ; page++) {\n const data = await this.hot({ ...options, limit: pageSize, page });\n yield* data.items ?? [];\n if (!data.has_next) return;\n }\n }\n\n /**\n * `GET /v2/stockx/catalog/products/{productId}/variants/{variantId}/market-data`\n *\n * Live quote for one size. Always calls StockX. Returns StockX's market data\n * object as received.\n */\n variant(productId: string, variantId: string, params: VariantMarketParams = {}): Promise<StockXObject> {\n return this._get(\n `/v2/stockx/catalog/products/${pathSegment(productId)}/variants/${pathSegment(variantId)}/market-data`,\n { currency_code: params.currencyCode, connection_id: this._conn(params.connectionId) },\n params,\n );\n }\n}\n","import type { RequestOptions } from '../../client';\nimport { formatDate } from '../../core';\nimport type { DateLike } from '../../core';\nimport type { Order, OrderAnalyticsResponse, OrderListResponse, OrderSyncResponse } from '../../types';\nimport { APIResource } from '../shared';\n\nexport interface OrderFilters extends RequestOptions {\n orderStatus?: string;\n /** `\"2026-01-01\"` or a `Date` (its UTC calendar date). */\n fromDate?: DateLike;\n toDate?: DateLike;\n search?: string;\n}\n\nexport interface ListOrdersParams extends OrderFilters {\n page?: number;\n pageSize?: number;\n}\n\nexport interface IterOrdersParams extends OrderFilters {\n /** Default 200. */\n pageSize?: number;\n}\n\nexport interface OrderAnalyticsParams extends RequestOptions {\n fromDate?: DateLike;\n toDate?: DateLike;\n /** Default `monthly`. */\n granularity?: 'daily' | 'weekly' | 'monthly';\n}\n\nconst date = (value: DateLike | null | undefined) => (value == null ? undefined : formatDate(value));\n\n/** Locally synced StockX orders. All endpoints need the advanced plan. */\nexport class StockXOrdersResource extends APIResource {\n /**\n * `POST /v2/stockx/orders/sync` — start a background sync from StockX. There\n * is no status endpoint; query again later.\n */\n sync(options: RequestOptions = {}): Promise<OrderSyncResponse> {\n return this._send('POST', '/v2/stockx/orders/sync', {}, options);\n }\n\n /** `GET /v2/stockx/orders` — synced orders, newest first. */\n list(params: ListOrdersParams = {}): Promise<OrderListResponse> {\n return this._get(\n '/v2/stockx/orders',\n {\n page: params.page,\n page_size: params.pageSize,\n order_status: params.orderStatus,\n from_date: date(params.fromDate),\n to_date: date(params.toDate),\n search: params.search,\n },\n params,\n );\n }\n\n /** Iterate every matching order across pages. */\n async *iterList(params: IterOrdersParams = {}): AsyncGenerator<Order, void, undefined> {\n const { pageSize = 200, ...rest } = params;\n let seen = 0;\n for (let page = 1; ; page++) {\n const data = await this.list({ ...rest, page, pageSize });\n const orders = data.orders ?? [];\n yield* orders;\n seen += orders.length;\n if (orders.length === 0 || seen >= Number(data.total ?? 0)) return;\n }\n }\n\n /**\n * `GET /v2/stockx/orders/analytics` — summary, top products/brands, sales\n * trend and status breakdown.\n */\n analytics(params: OrderAnalyticsParams = {}): Promise<OrderAnalyticsResponse> {\n return this._get(\n '/v2/stockx/orders/analytics',\n { from_date: date(params.fromDate), to_date: date(params.toDate), granularity: params.granularity },\n params,\n );\n }\n}\n","import type { Client } from '../../client';\nimport { APIResource } from '../shared';\nimport { StockXCatalogResource } from './catalog';\nimport { StockXCostsResource } from './costs';\nimport { StockXListingsResource } from './listings';\nimport { StockXMarketResource } from './market';\nimport { StockXOrdersResource } from './orders';\n\nexport class StockXResource extends APIResource {\n readonly market: StockXMarketResource;\n readonly catalog: StockXCatalogResource;\n readonly listings: StockXListingsResource;\n readonly costs: StockXCostsResource;\n readonly orders: StockXOrdersResource;\n\n constructor(client: Client) {\n super(client);\n this.market = new StockXMarketResource(client);\n this.catalog = new StockXCatalogResource(client);\n this.listings = new StockXListingsResource(client);\n this.costs = new StockXCostsResource(client);\n this.orders = new StockXOrdersResource(client);\n }\n}\n\nexport {\n StockXCatalogResource,\n StockXCostsResource,\n StockXListingsResource,\n StockXMarketResource,\n StockXOrdersResource,\n};\n","export const VERSION = '0.1.0';\n","import * as core from './core';\nimport type { CsvFile, Query } from './core';\nimport {\n APIConnectionError,\n APITimeoutError,\n APIUserAbortError,\n SolometricsError,\n makeStatusError,\n parseRetryAfter,\n} from './errors';\nimport { GoatResource } from './resources/goat';\nimport { InventoryResource } from './resources/inventory';\nimport { StockXResource } from './resources/stockx';\nimport { VERSION } from './version';\n\n/** A `fetch`-compatible function. */\nexport type Fetch = (url: string, init: RequestInit) => Promise<Response>;\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface ClientOptions {\n /** Your `sr_live_...` key. Defaults to `process.env.SOLOMETRICS_API_KEY`. */\n apiKey?: string;\n /** Defaults to `process.env.SOLOMETRICS_BASE_URL` or `https://api.sneakers.itbanque.com`. */\n baseURL?: string;\n /** Per-attempt timeout in milliseconds, including reading the body. Default 60 000. `null` disables it. */\n timeout?: number | null;\n /**\n * Retries for 429 (all methods), and for 502/503/504, timeouts and dropped\n * connections on idempotent methods. Default 2. `0` disables.\n */\n maxRetries?: number;\n /** Default StockX connection for endpoints that accept `connectionId`. Per-call values override it. */\n connectionId?: number | null;\n /** Extra headers sent with every request. */\n defaultHeaders?: Record<string, string>;\n /** Bring your own `fetch` (proxies, custom agents, instrumentation, ...). Defaults to `globalThis.fetch`. */\n fetch?: Fetch;\n}\n\n/** Per-call options accepted by every API method. */\nexport interface RequestOptions {\n /** Override the client's per-attempt timeout (milliseconds); `null` disables it. */\n timeout?: number | null;\n /** Override the client's `maxRetries`. */\n maxRetries?: number;\n /** Abort the request; throws {@link APIUserAbortError}. */\n signal?: AbortSignal | null;\n /** Extra headers for this request. */\n headers?: Record<string, string>;\n}\n\n/** Options for the low-level {@link Client.get} / {@link Client.post} / ... methods. */\nexport interface RawRequestOptions extends RequestOptions {\n query?: Query;\n /** JSON body. */\n body?: unknown;\n}\n\n/** @internal */\nexport interface FinalRequestOptions extends RequestOptions {\n method: HttpMethod;\n path: string;\n query?: Query;\n body?: unknown;\n file?: CsvFile;\n}\n\nconst MAX_TIMER_MS = 2 ** 31 - 1;\n\n/**\n * SneakersRadar API client.\n *\n * ```ts\n * const client = new Client({ apiKey: 'sr_live_...' }); // or set SOLOMETRICS_API_KEY\n * const quotes = await client.stockx.market.search('DZ5485-612');\n * ```\n *\n * There is nothing to close: requests go through `fetch`.\n */\nexport class Client {\n readonly baseURL: string;\n readonly timeout: number | null;\n readonly maxRetries: number;\n readonly connectionId: number | null;\n\n readonly inventory: InventoryResource;\n readonly stockx: StockXResource;\n readonly goat: GoatResource;\n\n readonly #apiKey: string;\n readonly #customHeaders: Record<string, string>;\n readonly #fetch: Fetch;\n\n constructor(options?: ClientOptions);\n constructor(apiKey: string, options?: Omit<ClientOptions, 'apiKey'>);\n constructor(apiKeyOrOptions: string | ClientOptions = {}, maybeOptions: Omit<ClientOptions, 'apiKey'> = {}) {\n const options: ClientOptions =\n typeof apiKeyOrOptions === 'string' ? { ...maybeOptions, apiKey: apiKeyOrOptions } : apiKeyOrOptions;\n\n const apiKey = options.apiKey || core.readEnv(core.API_KEY_ENV);\n if (!apiKey) {\n throw new SolometricsError(\n `No API key provided. Pass { apiKey: '...' } or set the ${core.API_KEY_ENV} environment variable.`,\n );\n }\n this.#apiKey = apiKey;\n this.baseURL = (options.baseURL || core.readEnv(core.BASE_URL_ENV) || core.DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = options.timeout === undefined ? core.DEFAULT_TIMEOUT : options.timeout;\n this.maxRetries = options.maxRetries ?? core.DEFAULT_MAX_RETRIES;\n this.connectionId = options.connectionId ?? null;\n this.#customHeaders = { ...options.defaultHeaders };\n\n if (options.fetch) {\n this.#fetch = options.fetch;\n } else if (typeof globalThis.fetch === 'function') {\n this.#fetch = (url, init) => globalThis.fetch(url, init);\n } else {\n throw new SolometricsError('`fetch` is not available; use Node.js 18+ or pass { fetch } in the client options.');\n }\n\n this.inventory = new InventoryResource(this);\n this.stockx = new StockXResource(this);\n this.goat = new GoatResource(this);\n }\n\n get apiKey(): string {\n return this.#apiKey;\n }\n\n /**\n * Return a copy with some options changed. The copy shares `fetch` and the\n * default headers. Pass `connectionId: null` to clear the default connection.\n */\n withOptions(options: Pick<ClientOptions, 'apiKey' | 'timeout' | 'maxRetries' | 'connectionId'>): Client {\n return new Client({\n apiKey: options.apiKey || this.#apiKey,\n baseURL: this.baseURL,\n timeout: options.timeout === undefined ? this.timeout : options.timeout,\n maxRetries: options.maxRetries ?? this.maxRetries,\n connectionId: options.connectionId === undefined ? this.connectionId : options.connectionId,\n defaultHeaders: this.#customHeaders,\n fetch: this.#fetch,\n });\n }\n\n // ------------------------------------------------------------------ low-level requests\n\n /** Low-level GET for endpoints the SDK does not wrap yet. */\n get<T = unknown>(path: string, options: RawRequestOptions = {}): Promise<T> {\n return this._request<T>({ ...options, method: 'GET', path });\n }\n\n post<T = unknown>(path: string, options: RawRequestOptions = {}): Promise<T> {\n return this._request<T>({ ...options, method: 'POST', path });\n }\n\n put<T = unknown>(path: string, options: RawRequestOptions = {}): Promise<T> {\n return this._request<T>({ ...options, method: 'PUT', path });\n }\n\n patch<T = unknown>(path: string, options: RawRequestOptions = {}): Promise<T> {\n return this._request<T>({ ...options, method: 'PATCH', path });\n }\n\n delete<T = unknown>(path: string, options: RawRequestOptions = {}): Promise<T> {\n return this._request<T>({ ...options, method: 'DELETE', path });\n }\n\n /** @internal */\n async _request<T>(options: FinalRequestOptions): Promise<T> {\n const maxRetries = options.maxRetries ?? this.maxRetries;\n const timeout = options.timeout === undefined ? this.timeout : options.timeout;\n const url = core.buildURL(this.baseURL, options.path, options.query);\n const userSignal = options.signal ?? undefined;\n\n for (let attempt = 0; ; attempt++) {\n if (userSignal?.aborted) throw new APIUserAbortError({ cause: userSignal.reason });\n\n const controller = new AbortController();\n let timedOut = false;\n const timer =\n timeout !== null && Number.isFinite(timeout)\n ? setTimeout(\n () => {\n timedOut = true;\n controller.abort();\n },\n Math.min(Math.max(timeout, 0), MAX_TIMER_MS),\n )\n : undefined;\n const onUserAbort = () => controller.abort(userSignal?.reason);\n userSignal?.addEventListener('abort', onUserAbort, { once: true });\n\n let response: Response;\n let text: string;\n try {\n response = await this.#fetch(url, {\n method: options.method,\n headers: this.#headers(options),\n body: this.#body(options),\n signal: controller.signal,\n });\n text = await response.text();\n } catch (err) {\n if (userSignal?.aborted) throw new APIUserAbortError({ cause: err });\n const kind: core.NetworkErrorKind = timedOut ? 'timeout' : core.classifyNetworkError(err);\n if (attempt < maxRetries && core.shouldRetryNetworkError(options.method, kind)) {\n await core.timing.sleep(core.retryDelay(attempt, null), userSignal);\n continue;\n }\n if (kind === 'timeout') throw new APITimeoutError({ cause: err });\n throw new APIConnectionError(connectionErrorMessage(err), { cause: err });\n } finally {\n clearTimeout(timer);\n userSignal?.removeEventListener('abort', onUserAbort);\n }\n\n if (response.ok) return parseBody(response.status, text) as T;\n\n if (attempt < maxRetries && core.shouldRetryStatus(options.method, response.status)) {\n const retryAfter = parseRetryAfter(response.headers);\n await core.timing.sleep(core.retryDelay(attempt, retryAfter), userSignal);\n continue;\n }\n throw makeStatusError(response.status, response.statusText, response.headers, text);\n }\n }\n\n #headers(options: FinalRequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n 'X-API-Key': this.#apiKey,\n Accept: 'application/json',\n 'User-Agent': `solometrics-node/${VERSION}`,\n };\n if (options.body !== undefined && !options.file) headers['Content-Type'] = 'application/json';\n return { ...headers, ...this.#customHeaders, ...options.headers };\n }\n\n /** Built per attempt, so a multipart body can be resent on retry. */\n #body(options: FinalRequestOptions): BodyInit | undefined {\n if (options.file) {\n const form = new FormData();\n form.append(\n 'file',\n new Blob([options.file.content as Uint8Array<ArrayBuffer>], { type: 'text/csv' }),\n options.file.name,\n );\n return form;\n }\n return options.body === undefined ? undefined : JSON.stringify(options.body);\n }\n\n toString(): string {\n return `Client { baseURL: '${this.baseURL}' }`;\n }\n\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return this.toString();\n }\n}\n\nfunction parseBody(status: number, text: string): unknown {\n if (status === 204 || text === '') return null;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction connectionErrorMessage(err: unknown): string {\n if (err instanceof Error) {\n const cause = err.cause instanceof Error ? `: ${err.cause.message}` : '';\n return `${err.message}${cause}` || 'Connection error.';\n }\n return 'Connection error.';\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,67 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "solometrics",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Node.js / TypeScript SDK for the SneakersRadar API: retail inventory, StockX/GOAT market data, and StockX listings, costs and orders.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"author": "Itbanque",
|
|
7
|
+
"homepage": "https://www.sneakers.itbanque.com",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/itbanque/solometrics-node.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/itbanque/solometrics-node/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"sneakers",
|
|
17
|
+
"stockx",
|
|
18
|
+
"goat",
|
|
19
|
+
"sneakersradar",
|
|
20
|
+
"api",
|
|
21
|
+
"sdk"
|
|
22
|
+
],
|
|
23
|
+
"type": "module",
|
|
24
|
+
"main": "./dist/index.cjs",
|
|
25
|
+
"module": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"import": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"default": "./dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"require": {
|
|
34
|
+
"types": "./dist/index.d.cts",
|
|
35
|
+
"default": "./dist/index.cjs"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"./package.json": "./package.json"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"LICENSE",
|
|
43
|
+
"NOTICE",
|
|
44
|
+
"README.md"
|
|
45
|
+
],
|
|
46
|
+
"sideEffects": false,
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=18"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsup",
|
|
52
|
+
"typecheck": "tsc",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"format": "prettier --write .",
|
|
55
|
+
"format:check": "prettier --check .",
|
|
56
|
+
"check": "npm run typecheck && npm run format:check && npm test",
|
|
57
|
+
"smoke": "node scripts/smoke.mjs && node scripts/smoke.cjs",
|
|
58
|
+
"prepublishOnly": "npm run build"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@types/node": "^22.20.5",
|
|
62
|
+
"prettier": "^3.9.10",
|
|
63
|
+
"tsup": "^8.5.1",
|
|
64
|
+
"typescript": "~5.9.3",
|
|
65
|
+
"vitest": "^3.2.7"
|
|
66
|
+
}
|
|
67
|
+
}
|