@xedo/sdk 0.1.0 → 0.2.2
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/README.md +14 -0
- package/dist/index.cjs +39 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +839 -75
- package/dist/index.d.ts +839 -75
- package/dist/index.js +39 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -115,8 +115,8 @@ async function* paginate(fetchPage, params) {
|
|
|
115
115
|
// src/resources/carts.ts
|
|
116
116
|
var Carts = class extends Resource {
|
|
117
117
|
/**
|
|
118
|
-
* `GET /v1/carts` — one page of carts. `DRAFT` carts are
|
|
119
|
-
* the API.
|
|
118
|
+
* `GET /v1/carts` — one page of carts (summary rows). `DRAFT` carts are
|
|
119
|
+
* never exposed by the API.
|
|
120
120
|
*/
|
|
121
121
|
list(params = {}) {
|
|
122
122
|
return this.transport.getPage("/v1/carts", {
|
|
@@ -124,7 +124,7 @@ var Carts = class extends Resource {
|
|
|
124
124
|
signal: params.signal
|
|
125
125
|
});
|
|
126
126
|
}
|
|
127
|
-
/** Async iterator over every cart across all pages. */
|
|
127
|
+
/** Async iterator over every cart (summary row) across all pages. */
|
|
128
128
|
listAll(params = {}) {
|
|
129
129
|
return paginate((p) => this.list(p), params);
|
|
130
130
|
}
|
|
@@ -168,6 +168,10 @@ var Carts = class extends Resource {
|
|
|
168
168
|
* the payment provider could not be reached (`PAYMENT_INIT_FAILED`), retry
|
|
169
169
|
* `pay()` once with the same `returnUrl`. Stays transparent — it logs the
|
|
170
170
|
* code and never swallows a definitive failure.
|
|
171
|
+
*
|
|
172
|
+
* Returns a {@link CheckoutResult} on the happy path, or a
|
|
173
|
+
* {@link CheckoutRetryResult} when the retry succeeded — both carry
|
|
174
|
+
* `checkoutUrl` and `payment`.
|
|
171
175
|
*/
|
|
172
176
|
async createAndPay(input, opts = {}) {
|
|
173
177
|
try {
|
|
@@ -215,16 +219,42 @@ var Collections = class extends Resource {
|
|
|
215
219
|
}
|
|
216
220
|
};
|
|
217
221
|
|
|
222
|
+
// src/resources/delivery-areas.ts
|
|
223
|
+
var DeliveryAreas = class extends Resource {
|
|
224
|
+
/**
|
|
225
|
+
* `GET /v1/delivery-areas` — every delivery area configured by the merchant.
|
|
226
|
+
* Use a returned `id` as `delivery.deliveryAreaId` when creating a cart.
|
|
227
|
+
*/
|
|
228
|
+
list(opts = {}) {
|
|
229
|
+
return this.transport.getData("GET", "/v1/delivery-areas", {
|
|
230
|
+
signal: opts.signal
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
// src/resources/marketplace.ts
|
|
236
|
+
var Marketplace = class extends Resource {
|
|
237
|
+
/**
|
|
238
|
+
* `GET /v1/marketplace` — the merchant's marketplace profile: enabled
|
|
239
|
+
* payment methods, split-payment configuration, business category, …
|
|
240
|
+
*/
|
|
241
|
+
retrieve(opts = {}) {
|
|
242
|
+
return this.transport.getData("GET", "/v1/marketplace", {
|
|
243
|
+
signal: opts.signal
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
|
|
218
248
|
// src/resources/orders.ts
|
|
219
249
|
var Orders = class extends Resource {
|
|
220
|
-
/** `GET /v1/orders` — one page of paid orders. */
|
|
250
|
+
/** `GET /v1/orders` — one page of paid orders (summary rows). */
|
|
221
251
|
list(params = {}) {
|
|
222
252
|
return this.transport.getPage("/v1/orders", {
|
|
223
253
|
query: toListQuery(params),
|
|
224
254
|
signal: params.signal
|
|
225
255
|
});
|
|
226
256
|
}
|
|
227
|
-
/** Async iterator over every order across all pages. */
|
|
257
|
+
/** Async iterator over every order (summary row) across all pages. */
|
|
228
258
|
listAll(params = {}) {
|
|
229
259
|
return paginate((p) => this.list(p), params);
|
|
230
260
|
}
|
|
@@ -464,6 +494,8 @@ var Xedo = class {
|
|
|
464
494
|
collections;
|
|
465
495
|
orders;
|
|
466
496
|
carts;
|
|
497
|
+
deliveryAreas;
|
|
498
|
+
marketplace;
|
|
467
499
|
apiKey;
|
|
468
500
|
transport;
|
|
469
501
|
constructor(options) {
|
|
@@ -503,6 +535,8 @@ var Xedo = class {
|
|
|
503
535
|
this.collections = new Collections(this.transport);
|
|
504
536
|
this.orders = new Orders(this.transport);
|
|
505
537
|
this.carts = new Carts(this.transport);
|
|
538
|
+
this.deliveryAreas = new DeliveryAreas(this.transport);
|
|
539
|
+
this.marketplace = new Marketplace(this.transport);
|
|
506
540
|
}
|
|
507
541
|
/**
|
|
508
542
|
* The environment inferred from the key prefix. The rest of the key is
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/resources/base.ts","../src/resources/carts.ts","../src/resources/collections.ts","../src/resources/orders.ts","../src/resources/products.ts","../src/transport.ts","../src/client.ts"],"sourcesContent":["/**\n * Typed error hierarchy. Every `success: false` response (and every transport\n * failure) is thrown as a {@link XedoError} or one of its subclasses. Route on\n * `error.code` (stable, machine-readable), never on `error.message` (French,\n * subject to change).\n */\n\nexport interface XedoErrorParams {\n message: string;\n /** Machine-readable code, e.g. \"PRODUCT_NOT_FOUND\". */\n code: string;\n /** HTTP status (0 for transport/connection errors). */\n status: number;\n /** Per-field validation details. */\n errors?: Record<string, string[]>;\n /** Extra context (e.g. `cartPublicId` on PAYMENT_INIT_FAILED). */\n data?: unknown;\n /** Request id, when the API returns one. */\n requestId?: string;\n /** `Retry-After` value in seconds, when present. */\n retryAfter?: number;\n}\n\nexport class XedoError extends Error {\n readonly code: string;\n readonly status: number;\n readonly errors?: Record<string, string[]>;\n readonly data?: unknown;\n readonly requestId?: string;\n\n constructor(params: XedoErrorParams) {\n super(params.message);\n // Keep the concrete subclass name on instances created via `new.target`.\n this.name = new.target.name;\n this.code = params.code;\n this.status = params.status;\n this.errors = params.errors;\n this.data = params.data;\n this.requestId = params.requestId;\n // Restore the prototype chain for `instanceof` under transpiled targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 — `MISSING_DEVELOPER_API_KEY`, `INVALID_DEVELOPER_API_KEY`. */\nexport class XedoAuthError extends XedoError {}\n\n/** 400 — bad request / invalid payment configuration. */\nexport class XedoValidationError extends XedoError {}\n\n/** 404 — product, combination, delivery area, cart or generic not found. */\nexport class XedoNotFoundError extends XedoError {}\n\n/** 422 — `INSUFFICIENT_STOCK` (per-product detail in `errors`). */\nexport class XedoStockError extends XedoError {}\n\n/** 409 — `CART_NOT_RETRYABLE`. */\nexport class XedoConflictError extends XedoError {}\n\n/** 429 — `RATE_LIMITED`. Exposes `retryAfter` (seconds). */\nexport class XedoRateLimitError extends XedoError {\n readonly retryAfter?: number;\n constructor(params: XedoErrorParams) {\n super(params);\n this.retryAfter = params.retryAfter;\n }\n}\n\n/**\n * 502 — `PAYMENT_INIT_FAILED`. The cart was kept; relaunch the payment via\n * `xedo.carts.pay(cartPublicId, …)`. Exposes `cartPublicId`.\n */\nexport class XedoPaymentInitError extends XedoError {\n readonly cartPublicId?: string;\n constructor(params: XedoErrorParams) {\n super(params);\n const data = params.data as { cartPublicId?: string } | undefined;\n this.cartPublicId = data?.cartPublicId;\n }\n}\n\n/** Transport-level failure (timeout, network, malformed response). */\nexport class XedoConnectionError extends XedoError {}\n\nconst CODE_MAP: Record<string, new (p: XedoErrorParams) => XedoError> = {\n MISSING_DEVELOPER_API_KEY: XedoAuthError,\n INVALID_DEVELOPER_API_KEY: XedoAuthError,\n BAD_REQUEST: XedoValidationError,\n INVALID_PAYMENT_METHOD: XedoValidationError,\n SPLIT_PAYMENT_NOT_ENABLED: XedoValidationError,\n COMBINATION_PRODUCT_MISMATCH: XedoValidationError,\n PRODUCT_NOT_FOUND: XedoNotFoundError,\n COMBINATION_NOT_FOUND: XedoNotFoundError,\n DELIVERY_AREA_NOT_FOUND: XedoNotFoundError,\n CART_NOT_FOUND: XedoNotFoundError,\n NOT_FOUND: XedoNotFoundError,\n INSUFFICIENT_STOCK: XedoStockError,\n CART_NOT_RETRYABLE: XedoConflictError,\n RATE_LIMITED: XedoRateLimitError,\n PAYMENT_INIT_FAILED: XedoPaymentInitError,\n};\n\nfunction fallbackByStatus(status: number): new (p: XedoErrorParams) => XedoError {\n switch (status) {\n case 400:\n return XedoValidationError;\n case 401:\n return XedoAuthError;\n case 404:\n return XedoNotFoundError;\n case 409:\n return XedoConflictError;\n case 422:\n return XedoStockError;\n case 429:\n return XedoRateLimitError;\n case 502:\n return XedoPaymentInitError;\n default:\n return XedoError;\n }\n}\n\n/** Build the most specific {@link XedoError} subclass for a failed response. */\nexport function createXedoError(params: XedoErrorParams): XedoError {\n const Ctor = CODE_MAP[params.code] ?? fallbackByStatus(params.status);\n return new Ctor(params);\n}\n","import type { Transport } from '../transport';\nimport type { ListParams, PaginatedResult } from '../types/public';\n\nexport abstract class Resource {\n constructor(protected readonly transport: Transport) {}\n}\n\n/** Map the SDK's camelCase list params to the API's wire query keys. */\nexport function toListQuery(params: ListParams): Record<string, unknown> {\n return {\n page: params.page,\n per_page: params.perPage,\n _sort: (params as { sort?: string }).sort,\n _order: params.order,\n search: params.search,\n };\n}\n\n/**\n * Walk every page of a list endpoint, yielding items one by one. Defaults to a\n * large page size to minimise round-trips; the transport's 429 retry provides\n * the throughput guard.\n */\nexport async function* paginate<T, P extends ListParams>(\n fetchPage: (params: P) => Promise<PaginatedResult<T>>,\n params: P,\n): AsyncGenerator<T> {\n let page = params.page ?? 1;\n const perPage = params.perPage ?? 100;\n for (;;) {\n const result = await fetchPage({ ...params, page, perPage });\n for (const item of result.data) yield item;\n if (result.data.length === 0 || result.end >= result.total) break;\n page += 1;\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport { XedoPaymentInitError } from '../errors';\nimport type {\n Cart,\n CartListParams,\n CheckoutCreateInput,\n CheckoutPreview,\n CheckoutPreviewInput,\n CheckoutResult,\n CheckoutRetryPayInput,\n PaginatedResult,\n RequestOptions,\n} from '../types/public';\n\nexport class Carts extends Resource {\n /**\n * `GET /v1/carts` — one page of carts. `DRAFT` carts are never exposed by\n * the API.\n */\n list(params: CartListParams = {}): Promise<PaginatedResult<Cart>> {\n return this.transport.getPage<Cart>('/v1/carts', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every cart across all pages. */\n listAll(params: CartListParams = {}): AsyncGenerator<Cart> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/carts/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Cart> {\n return this.transport.getData<Cart>('GET', `/v1/carts/${encodeURIComponent(publicId)}`, {\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/carts/preview` — compute totals without persisting anything. */\n preview(input: CheckoutPreviewInput, opts: RequestOptions = {}): Promise<CheckoutPreview> {\n return this.transport.getData<CheckoutPreview>('POST', '/v1/carts/preview', {\n body: input,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/carts` — create the cart (`PENDING_PAYMENT`) and return\n * `data.checkoutUrl`. On a `502 PAYMENT_INIT_FAILED` the cart is kept; retry\n * the payment with {@link Carts.pay} (or use {@link Carts.createAndPay}).\n */\n create(input: CheckoutCreateInput, opts: RequestOptions = {}): Promise<CheckoutResult> {\n return this.transport.getData<CheckoutResult>('POST', '/v1/carts', {\n body: input,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/carts/{publicId}/pay` — relaunch payment initialization after a\n * `502 PAYMENT_INIT_FAILED`.\n */\n pay(publicId: string, input: CheckoutRetryPayInput, opts: RequestOptions = {}): Promise<CheckoutResult> {\n return this.transport.getData<CheckoutResult>(\n 'POST',\n `/v1/carts/${encodeURIComponent(publicId)}/pay`,\n { body: input, signal: opts.signal },\n );\n }\n\n /**\n * Convenience wrapper around the 502 checkout flow: create the cart, and if\n * the payment provider could not be reached (`PAYMENT_INIT_FAILED`), retry\n * `pay()` once with the same `returnUrl`. Stays transparent — it logs the\n * code and never swallows a definitive failure.\n */\n async createAndPay(input: CheckoutCreateInput, opts: RequestOptions = {}): Promise<CheckoutResult> {\n try {\n return await this.create(input, opts);\n } catch (err) {\n if (err instanceof XedoPaymentInitError && err.cartPublicId) {\n console.warn(\n `[xedo] PAYMENT_INIT_FAILED for cart ${err.cartPublicId}; retrying once via pay().`,\n );\n return this.pay(err.cartPublicId, { returnUrl: input.returnUrl }, opts);\n }\n throw err;\n }\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { Collection, CollectionListParams, PaginatedResult, RequestOptions } from '../types/public';\n\nexport class Collections extends Resource {\n /** `GET /v1/collections` — one page of collections. */\n list(params: CollectionListParams = {}): Promise<PaginatedResult<Collection>> {\n return this.transport.getPage<Collection>('/v1/collections', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every collection across all pages. */\n listAll(params: CollectionListParams = {}): AsyncGenerator<Collection> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/collections/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Collection> {\n return this.transport.getData<Collection>(\n 'GET',\n `/v1/collections/${encodeURIComponent(publicId)}`,\n { signal: opts.signal },\n );\n }\n\n /** `GET /v1/collections/by-slug/{slug}`. */\n retrieveBySlug(slug: string, opts: RequestOptions = {}): Promise<Collection> {\n return this.transport.getData<Collection>(\n 'GET',\n `/v1/collections/by-slug/${encodeURIComponent(slug)}`,\n { signal: opts.signal },\n );\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { Order, OrderListParams, PaginatedResult, RequestOptions } from '../types/public';\n\nexport class Orders extends Resource {\n /** `GET /v1/orders` — one page of paid orders. */\n list(params: OrderListParams = {}): Promise<PaginatedResult<Order>> {\n return this.transport.getPage<Order>('/v1/orders', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every order across all pages. */\n listAll(params: OrderListParams = {}): AsyncGenerator<Order> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/orders/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Order> {\n return this.transport.getData<Order>('GET', `/v1/orders/${encodeURIComponent(publicId)}`, {\n signal: opts.signal,\n });\n }\n\n /**\n * `GET /v1/orders/{publicId}/invoice` — the invoice PDF as a binary\n * `ArrayBuffer` (not JSON). Throws {@link XedoNotFoundError} if the invoice\n * has not been generated yet.\n */\n invoice(publicId: string, opts: RequestOptions = {}): Promise<ArrayBuffer> {\n return this.transport.getBinary('GET', `/v1/orders/${encodeURIComponent(publicId)}/invoice`, {\n accept: 'application/pdf',\n signal: opts.signal,\n });\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { PaginatedResult, Product, ProductListParams, RetrieveOptions } from '../types/public';\n\nexport class Products extends Resource {\n /** `GET /v1/products` — one page of products. */\n list(params: ProductListParams = {}): Promise<PaginatedResult<Product>> {\n return this.transport.getPage<Product>('/v1/products', {\n query: {\n ...toListQuery(params),\n collection: params.collection,\n includeVariations: params.includeVariations,\n includeDisabled: params.includeDisabled,\n },\n signal: params.signal,\n });\n }\n\n /** Async iterator over every product across all pages. */\n listAll(params: ProductListParams = {}): AsyncGenerator<Product> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/products/{publicId}`. */\n retrieve(publicId: string, opts: RetrieveOptions = {}): Promise<Product> {\n return this.transport.getData<Product>('GET', `/v1/products/${encodeURIComponent(publicId)}`, {\n query: { includeDisabled: opts.includeDisabled },\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/products/by-slug/{slug}`. */\n retrieveBySlug(slug: string, opts: RetrieveOptions = {}): Promise<Product> {\n return this.transport.getData<Product>('GET', `/v1/products/by-slug/${encodeURIComponent(slug)}`, {\n query: { includeDisabled: opts.includeDisabled },\n signal: opts.signal,\n });\n }\n}\n","import { createXedoError, XedoConnectionError, type XedoErrorParams } from './errors';\nimport type { PaginatedResult, RateLimitInfo } from './types/public';\n\nexport type FetchLike = (\n input: string | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl: string;\n maxRetries: number;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}\n\nexport interface RequestConfig {\n query?: Record<string, unknown>;\n body?: unknown;\n signal?: AbortSignal;\n /** Accept header; defaults to `application/json`. */\n accept?: string;\n}\n\ntype HttpMethod = 'GET' | 'POST';\n\ninterface Envelope {\n success: boolean;\n code?: string;\n message?: string;\n errors?: Record<string, string[]>;\n data?: unknown;\n total?: number;\n start?: number;\n end?: number;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error('Aborted'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal?.reason ?? new Error('Aborted'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction parseHeaderInt(value: string | null): number | null {\n if (value == null) return null;\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\n/**\n * Owns the HTTP concern: auth header, query/body serialization, per-request\n * timeout + abort, automatic 429 retries, envelope parsing and error mapping.\n * Resources sit on top and never touch `fetch` directly.\n */\nexport class Transport {\n lastRateLimit: RateLimitInfo | null = null;\n\n constructor(private readonly opts: TransportOptions) {}\n\n // --- Public helpers used by resources --------------------------------------\n\n /** Run a request and return the unwrapped `data` payload, typed as `T`. */\n async getData<T>(method: HttpMethod, path: string, config: RequestConfig = {}): Promise<T> {\n const env = await this.requestJson(method, path, config);\n return env.data as T;\n }\n\n /** Run a GET list request and return `{ data, total, start, end }`. */\n async getPage<T>(path: string, config: RequestConfig = {}): Promise<PaginatedResult<T>> {\n const env = await this.requestJson('GET', path, config);\n return {\n data: (env.data as T[]) ?? [],\n total: env.total ?? 0,\n start: env.start ?? 0,\n end: env.end ?? 0,\n };\n }\n\n /** Run a request that returns a binary body (e.g. the invoice PDF). */\n async getBinary(method: HttpMethod, path: string, config: RequestConfig = {}): Promise<ArrayBuffer> {\n const res = await this.execute(method, path, config);\n if (!res.ok) {\n throw this.toError(res, await this.tryParseJson(res));\n }\n return res.arrayBuffer();\n }\n\n // --- Internals -------------------------------------------------------------\n\n private async requestJson(method: HttpMethod, path: string, config: RequestConfig): Promise<Envelope> {\n const res = await this.execute(method, path, config);\n const body = await this.tryParseJson(res);\n if (!res.ok || body?.success === false) {\n throw this.toError(res, body);\n }\n if (!body) {\n throw new XedoConnectionError({\n code: 'INVALID_RESPONSE',\n status: res.status,\n message: 'Expected a JSON response body but received none.',\n });\n }\n return body;\n }\n\n private async tryParseJson(res: Response): Promise<Envelope | undefined> {\n const text = await res.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text) as Envelope;\n } catch {\n return undefined;\n }\n }\n\n private toError(res: Response, body: Envelope | undefined): Error {\n const retryAfter = parseHeaderInt(res.headers.get('retry-after'));\n const params: XedoErrorParams = {\n code: body?.code ?? `HTTP_${res.status}`,\n message: body?.message ?? res.statusText ?? 'Request failed',\n status: res.status,\n errors: body?.errors,\n data: body?.data,\n requestId: res.headers.get('x-request-id') ?? undefined,\n retryAfter: retryAfter ?? undefined,\n };\n return createXedoError(params);\n }\n\n /** Fetch with retry on 429; returns the final {@link Response}. */\n private async execute(method: HttpMethod, path: string, config: RequestConfig): Promise<Response> {\n const url = this.buildUrl(path, config.query);\n let attempt = 0;\n for (;;) {\n const res = await this.fetchOnce(method, url, config);\n this.captureRateLimit(res);\n if (res.status === 429 && attempt < this.opts.maxRetries) {\n await sleep(this.retryDelayMs(res, attempt), config.signal);\n attempt += 1;\n continue;\n }\n return res;\n }\n }\n\n private async fetchOnce(method: HttpMethod, url: URL, config: RequestConfig): Promise<Response> {\n const controller = new AbortController();\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.opts.timeoutMs);\n\n const userSignal = config.signal;\n const onUserAbort = () => controller.abort();\n if (userSignal) {\n if (userSignal.aborted) controller.abort();\n else userSignal.addEventListener('abort', onUserAbort, { once: true });\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.opts.apiKey}`,\n Accept: config.accept ?? 'application/json',\n };\n let body: string | undefined;\n if (config.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(config.body);\n }\n\n try {\n return await this.opts.fetchImpl(url, { method, headers, body, signal: controller.signal });\n } catch (err) {\n if (timedOut) {\n throw new XedoConnectionError({\n code: 'TIMEOUT',\n status: 0,\n message: `Request to ${url.pathname} timed out after ${this.opts.timeoutMs}ms.`,\n });\n }\n // Genuine user-initiated cancellation: surface it untouched.\n if (userSignal?.aborted) throw err;\n throw new XedoConnectionError({\n code: 'CONNECTION_ERROR',\n status: 0,\n message: err instanceof Error ? err.message : 'Network request failed.',\n });\n } finally {\n clearTimeout(timer);\n userSignal?.removeEventListener('abort', onUserAbort);\n }\n }\n\n private buildUrl(path: string, query: Record<string, unknown> | undefined): URL {\n const url = new URL(this.opts.baseUrl.replace(/\\/+$/, '') + path);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url;\n }\n\n private captureRateLimit(res: Response): void {\n const limit = parseHeaderInt(res.headers.get('x-ratelimit-limit'));\n const remaining = parseHeaderInt(res.headers.get('x-ratelimit-remaining'));\n const reset = parseHeaderInt(res.headers.get('x-ratelimit-reset'));\n if (limit === null && remaining === null && reset === null) return;\n this.lastRateLimit = { limit, remaining, reset };\n }\n\n private retryDelayMs(res: Response, attempt: number): number {\n const retryAfter = parseHeaderInt(res.headers.get('retry-after'));\n if (retryAfter !== null) return retryAfter * 1000;\n // Exponential backoff with jitter: 500ms, 1s, 2s, … capped at 8s.\n const base = Math.min(8000, 500 * 2 ** attempt);\n return base + Math.random() * base * 0.25;\n }\n}\n","import { XedoConnectionError, XedoError } from './errors';\nimport { Carts } from './resources/carts';\nimport { Collections } from './resources/collections';\nimport { Orders } from './resources/orders';\nimport { Products } from './resources/products';\nimport { Transport, type FetchLike } from './transport';\nimport type { PingResult, RateLimitInfo, RequestOptions } from './types/public';\n\nconst DEFAULT_BASE_URL = 'https://systems.xedoapp.com/marketplace';\nconst DEFAULT_MAX_RETRIES = 4;\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport interface XedoOptions {\n /** Developer API key: `xdk_live_…` or `xdk_test_…`. */\n apiKey: string;\n /** Override the API base URL. Defaults to the production marketplace URL. */\n baseUrl?: string;\n /** Max automatic retries on `429`. Defaults to 4. */\n maxRetries?: number;\n /** Per-request timeout in milliseconds. Defaults to 30000. */\n timeoutMs?: number;\n /** Inject a custom fetch (tests, edge runtimes). Defaults to global fetch. */\n fetch?: FetchLike;\n /**\n * Escape hatch to run in a browser. Strongly discouraged: your\n * `xdk_live_…` key would be exposed in the client bundle.\n */\n dangerouslyAllowBrowser?: boolean;\n}\n\n/**\n * The Xedo Developer API client. Server-side only — see\n * `dangerouslyAllowBrowser`.\n *\n * ```ts\n * const xedo = new Xedo({ apiKey: process.env.XEDO_API_KEY! });\n * const { data } = await xedo.products.list({ perPage: 20 });\n * ```\n */\nexport class Xedo {\n readonly products: Products;\n readonly collections: Collections;\n readonly orders: Orders;\n readonly carts: Carts;\n\n private readonly apiKey: string;\n private readonly transport: Transport;\n\n constructor(options: XedoOptions) {\n if (!options?.apiKey) {\n throw new XedoError({\n code: 'MISSING_DEVELOPER_API_KEY',\n status: 0,\n message: 'A Xedo `apiKey` is required.',\n });\n }\n\n const maybeWindow = (globalThis as { window?: { document?: unknown } }).window;\n const isBrowser = typeof maybeWindow !== 'undefined' && typeof maybeWindow.document !== 'undefined';\n if (isBrowser && !options.dangerouslyAllowBrowser) {\n throw new XedoError({\n code: 'BROWSER_ENV_DETECTED',\n status: 0,\n message:\n 'The Xedo SDK is server-side only: running it in a browser would expose your ' +\n 'xdk_live_… key in the client bundle. Call it from a server (Next.js Server ' +\n 'Component / Route Handler, Express, a worker, …). See the README on authentication.',\n });\n }\n\n const fetchImpl: FetchLike =\n options.fetch ?? ((input, init) => globalThis.fetch(input, init));\n if (typeof globalThis.fetch !== 'function' && !options.fetch) {\n throw new XedoConnectionError({\n code: 'NO_FETCH',\n status: 0,\n message: 'Global fetch is unavailable (Node >= 18 required) — pass `options.fetch`.',\n });\n }\n\n this.apiKey = options.apiKey;\n this.transport = new Transport({\n apiKey: options.apiKey,\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n fetchImpl,\n });\n\n this.products = new Products(this.transport);\n this.collections = new Collections(this.transport);\n this.orders = new Orders(this.transport);\n this.carts = new Carts(this.transport);\n }\n\n /**\n * The environment inferred from the key prefix. The rest of the key is\n * treated as opaque.\n */\n get environment(): 'test' | 'live' | 'unknown' {\n if (this.apiKey.startsWith('xdk_live_')) return 'live';\n if (this.apiKey.startsWith('xdk_test_')) return 'test';\n return 'unknown';\n }\n\n /** Rate-limit headers from the most recent response, for monitoring. */\n get lastRateLimit(): RateLimitInfo | null {\n return this.transport.lastRateLimit;\n }\n\n /** `GET /v1/ping` — validate the API key end to end. */\n ping(opts: RequestOptions = {}): Promise<PingResult> {\n return this.transport.getData<PingResult>('GET', '/v1/ping', { signal: opts.signal });\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/resources/base.ts","../src/resources/carts.ts","../src/resources/collections.ts","../src/resources/delivery-areas.ts","../src/resources/marketplace.ts","../src/resources/orders.ts","../src/resources/products.ts","../src/transport.ts","../src/client.ts"],"sourcesContent":["/**\n * Typed error hierarchy. Every `success: false` response (and every transport\n * failure) is thrown as a {@link XedoError} or one of its subclasses. Route on\n * `error.code` (stable, machine-readable), never on `error.message` (French,\n * subject to change).\n */\n\nexport interface XedoErrorParams {\n message: string;\n /** Machine-readable code, e.g. \"PRODUCT_NOT_FOUND\". */\n code: string;\n /** HTTP status (0 for transport/connection errors). */\n status: number;\n /** Per-field validation details. */\n errors?: Record<string, string[]>;\n /** Extra context (e.g. `cartPublicId` on PAYMENT_INIT_FAILED). */\n data?: unknown;\n /** Request id, when the API returns one. */\n requestId?: string;\n /** `Retry-After` value in seconds, when present. */\n retryAfter?: number;\n}\n\nexport class XedoError extends Error {\n readonly code: string;\n readonly status: number;\n readonly errors?: Record<string, string[]>;\n readonly data?: unknown;\n readonly requestId?: string;\n\n constructor(params: XedoErrorParams) {\n super(params.message);\n // Keep the concrete subclass name on instances created via `new.target`.\n this.name = new.target.name;\n this.code = params.code;\n this.status = params.status;\n this.errors = params.errors;\n this.data = params.data;\n this.requestId = params.requestId;\n // Restore the prototype chain for `instanceof` under transpiled targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 — `MISSING_DEVELOPER_API_KEY`, `INVALID_DEVELOPER_API_KEY`. */\nexport class XedoAuthError extends XedoError {}\n\n/** 400 — bad request / invalid payment configuration. */\nexport class XedoValidationError extends XedoError {}\n\n/** 404 — product, combination, delivery area, cart or generic not found. */\nexport class XedoNotFoundError extends XedoError {}\n\n/** 422 — `INSUFFICIENT_STOCK` (per-product detail in `errors`). */\nexport class XedoStockError extends XedoError {}\n\n/** 409 — `CART_NOT_RETRYABLE`. */\nexport class XedoConflictError extends XedoError {}\n\n/** 429 — `RATE_LIMITED`. Exposes `retryAfter` (seconds). */\nexport class XedoRateLimitError extends XedoError {\n readonly retryAfter?: number;\n constructor(params: XedoErrorParams) {\n super(params);\n this.retryAfter = params.retryAfter;\n }\n}\n\n/**\n * 502 — `PAYMENT_INIT_FAILED`. The cart was kept; relaunch the payment via\n * `xedo.carts.pay(cartPublicId, …)`. Exposes `cartPublicId`.\n */\nexport class XedoPaymentInitError extends XedoError {\n readonly cartPublicId?: string;\n constructor(params: XedoErrorParams) {\n super(params);\n const data = params.data as { cartPublicId?: string } | undefined;\n this.cartPublicId = data?.cartPublicId;\n }\n}\n\n/** Transport-level failure (timeout, network, malformed response). */\nexport class XedoConnectionError extends XedoError {}\n\nconst CODE_MAP: Record<string, new (p: XedoErrorParams) => XedoError> = {\n MISSING_DEVELOPER_API_KEY: XedoAuthError,\n INVALID_DEVELOPER_API_KEY: XedoAuthError,\n BAD_REQUEST: XedoValidationError,\n INVALID_PAYMENT_METHOD: XedoValidationError,\n SPLIT_PAYMENT_NOT_ENABLED: XedoValidationError,\n COMBINATION_PRODUCT_MISMATCH: XedoValidationError,\n PRODUCT_NOT_FOUND: XedoNotFoundError,\n COMBINATION_NOT_FOUND: XedoNotFoundError,\n DELIVERY_AREA_NOT_FOUND: XedoNotFoundError,\n CART_NOT_FOUND: XedoNotFoundError,\n NOT_FOUND: XedoNotFoundError,\n INSUFFICIENT_STOCK: XedoStockError,\n CART_NOT_RETRYABLE: XedoConflictError,\n RATE_LIMITED: XedoRateLimitError,\n PAYMENT_INIT_FAILED: XedoPaymentInitError,\n};\n\nfunction fallbackByStatus(status: number): new (p: XedoErrorParams) => XedoError {\n switch (status) {\n case 400:\n return XedoValidationError;\n case 401:\n return XedoAuthError;\n case 404:\n return XedoNotFoundError;\n case 409:\n return XedoConflictError;\n case 422:\n return XedoStockError;\n case 429:\n return XedoRateLimitError;\n case 502:\n return XedoPaymentInitError;\n default:\n return XedoError;\n }\n}\n\n/** Build the most specific {@link XedoError} subclass for a failed response. */\nexport function createXedoError(params: XedoErrorParams): XedoError {\n const Ctor = CODE_MAP[params.code] ?? fallbackByStatus(params.status);\n return new Ctor(params);\n}\n","import type { Transport } from '../transport';\nimport type { ListParams, PaginatedResult } from '../types/public';\n\nexport abstract class Resource {\n constructor(protected readonly transport: Transport) {}\n}\n\n/** Map the SDK's camelCase list params to the API's wire query keys. */\nexport function toListQuery(params: ListParams): Record<string, unknown> {\n return {\n page: params.page,\n per_page: params.perPage,\n _sort: (params as { sort?: string }).sort,\n _order: params.order,\n search: params.search,\n };\n}\n\n/**\n * Walk every page of a list endpoint, yielding items one by one. Defaults to a\n * large page size to minimise round-trips; the transport's 429 retry provides\n * the throughput guard.\n */\nexport async function* paginate<T, P extends ListParams>(\n fetchPage: (params: P) => Promise<PaginatedResult<T>>,\n params: P,\n): AsyncGenerator<T> {\n let page = params.page ?? 1;\n const perPage = params.perPage ?? 100;\n for (;;) {\n const result = await fetchPage({ ...params, page, perPage });\n for (const item of result.data) yield item;\n if (result.data.length === 0 || result.end >= result.total) break;\n page += 1;\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport { XedoPaymentInitError } from '../errors';\nimport type {\n Cart,\n CartListItem,\n CartListParams,\n CheckoutCreateInput,\n CheckoutPreview,\n CheckoutPreviewInput,\n CheckoutResult,\n CheckoutRetryPayInput,\n CheckoutRetryResult,\n PaginatedResult,\n RequestOptions,\n} from '../types/public';\n\nexport class Carts extends Resource {\n /**\n * `GET /v1/carts` — one page of carts (summary rows). `DRAFT` carts are\n * never exposed by the API.\n */\n list(params: CartListParams = {}): Promise<PaginatedResult<CartListItem>> {\n return this.transport.getPage<CartListItem>('/v1/carts', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every cart (summary row) across all pages. */\n listAll(params: CartListParams = {}): AsyncGenerator<CartListItem> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/carts/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Cart> {\n return this.transport.getData<Cart>('GET', `/v1/carts/${encodeURIComponent(publicId)}`, {\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/carts/preview` — compute totals without persisting anything. */\n preview(input: CheckoutPreviewInput, opts: RequestOptions = {}): Promise<CheckoutPreview> {\n return this.transport.getData<CheckoutPreview>('POST', '/v1/carts/preview', {\n body: input,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/carts` — create the cart (`PENDING_PAYMENT`) and return\n * `data.checkoutUrl`. On a `502 PAYMENT_INIT_FAILED` the cart is kept; retry\n * the payment with {@link Carts.pay} (or use {@link Carts.createAndPay}).\n */\n create(input: CheckoutCreateInput, opts: RequestOptions = {}): Promise<CheckoutResult> {\n return this.transport.getData<CheckoutResult>('POST', '/v1/carts', {\n body: input,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/carts/{publicId}/pay` — relaunch payment initialization after a\n * `502 PAYMENT_INIT_FAILED`.\n */\n pay(publicId: string, input: CheckoutRetryPayInput, opts: RequestOptions = {}): Promise<CheckoutRetryResult> {\n return this.transport.getData<CheckoutRetryResult>(\n 'POST',\n `/v1/carts/${encodeURIComponent(publicId)}/pay`,\n { body: input, signal: opts.signal },\n );\n }\n\n /**\n * Convenience wrapper around the 502 checkout flow: create the cart, and if\n * the payment provider could not be reached (`PAYMENT_INIT_FAILED`), retry\n * `pay()` once with the same `returnUrl`. Stays transparent — it logs the\n * code and never swallows a definitive failure.\n *\n * Returns a {@link CheckoutResult} on the happy path, or a\n * {@link CheckoutRetryResult} when the retry succeeded — both carry\n * `checkoutUrl` and `payment`.\n */\n async createAndPay(\n input: CheckoutCreateInput,\n opts: RequestOptions = {},\n ): Promise<CheckoutResult | CheckoutRetryResult> {\n try {\n return await this.create(input, opts);\n } catch (err) {\n if (err instanceof XedoPaymentInitError && err.cartPublicId) {\n console.warn(\n `[xedo] PAYMENT_INIT_FAILED for cart ${err.cartPublicId}; retrying once via pay().`,\n );\n return this.pay(err.cartPublicId, { returnUrl: input.returnUrl }, opts);\n }\n throw err;\n }\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { Collection, CollectionListParams, PaginatedResult, RequestOptions } from '../types/public';\n\nexport class Collections extends Resource {\n /** `GET /v1/collections` — one page of collections. */\n list(params: CollectionListParams = {}): Promise<PaginatedResult<Collection>> {\n return this.transport.getPage<Collection>('/v1/collections', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every collection across all pages. */\n listAll(params: CollectionListParams = {}): AsyncGenerator<Collection> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/collections/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Collection> {\n return this.transport.getData<Collection>(\n 'GET',\n `/v1/collections/${encodeURIComponent(publicId)}`,\n { signal: opts.signal },\n );\n }\n\n /** `GET /v1/collections/by-slug/{slug}`. */\n retrieveBySlug(slug: string, opts: RequestOptions = {}): Promise<Collection> {\n return this.transport.getData<Collection>(\n 'GET',\n `/v1/collections/by-slug/${encodeURIComponent(slug)}`,\n { signal: opts.signal },\n );\n }\n}\n","import { Resource } from './base';\nimport type { DeliveryArea, RequestOptions } from '../types/public';\n\nexport class DeliveryAreas extends Resource {\n /**\n * `GET /v1/delivery-areas` — every delivery area configured by the merchant.\n * Use a returned `id` as `delivery.deliveryAreaId` when creating a cart.\n */\n list(opts: RequestOptions = {}): Promise<DeliveryArea[]> {\n return this.transport.getData<DeliveryArea[]>('GET', '/v1/delivery-areas', {\n signal: opts.signal,\n });\n }\n}\n","import { Resource } from './base';\nimport type { MarketplaceProfile, RequestOptions } from '../types/public';\n\nexport class Marketplace extends Resource {\n /**\n * `GET /v1/marketplace` — the merchant's marketplace profile: enabled\n * payment methods, split-payment configuration, business category, …\n */\n retrieve(opts: RequestOptions = {}): Promise<MarketplaceProfile> {\n return this.transport.getData<MarketplaceProfile>('GET', '/v1/marketplace', {\n signal: opts.signal,\n });\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { Order, OrderListItem, OrderListParams, PaginatedResult, RequestOptions } from '../types/public';\n\nexport class Orders extends Resource {\n /** `GET /v1/orders` — one page of paid orders (summary rows). */\n list(params: OrderListParams = {}): Promise<PaginatedResult<OrderListItem>> {\n return this.transport.getPage<OrderListItem>('/v1/orders', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every order (summary row) across all pages. */\n listAll(params: OrderListParams = {}): AsyncGenerator<OrderListItem> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/orders/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Order> {\n return this.transport.getData<Order>('GET', `/v1/orders/${encodeURIComponent(publicId)}`, {\n signal: opts.signal,\n });\n }\n\n /**\n * `GET /v1/orders/{publicId}/invoice` — the invoice PDF as a binary\n * `ArrayBuffer` (not JSON). Throws {@link XedoNotFoundError} if the invoice\n * has not been generated yet.\n */\n invoice(publicId: string, opts: RequestOptions = {}): Promise<ArrayBuffer> {\n return this.transport.getBinary('GET', `/v1/orders/${encodeURIComponent(publicId)}/invoice`, {\n accept: 'application/pdf',\n signal: opts.signal,\n });\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { PaginatedResult, Product, ProductListParams, RetrieveOptions } from '../types/public';\n\nexport class Products extends Resource {\n /** `GET /v1/products` — one page of products. */\n list(params: ProductListParams = {}): Promise<PaginatedResult<Product>> {\n return this.transport.getPage<Product>('/v1/products', {\n query: {\n ...toListQuery(params),\n collection: params.collection,\n includeVariations: params.includeVariations,\n includeDisabled: params.includeDisabled,\n },\n signal: params.signal,\n });\n }\n\n /** Async iterator over every product across all pages. */\n listAll(params: ProductListParams = {}): AsyncGenerator<Product> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/products/{publicId}`. */\n retrieve(publicId: string, opts: RetrieveOptions = {}): Promise<Product> {\n return this.transport.getData<Product>('GET', `/v1/products/${encodeURIComponent(publicId)}`, {\n query: { includeDisabled: opts.includeDisabled },\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/products/by-slug/{slug}`. */\n retrieveBySlug(slug: string, opts: RetrieveOptions = {}): Promise<Product> {\n return this.transport.getData<Product>('GET', `/v1/products/by-slug/${encodeURIComponent(slug)}`, {\n query: { includeDisabled: opts.includeDisabled },\n signal: opts.signal,\n });\n }\n}\n","import { createXedoError, XedoConnectionError, type XedoErrorParams } from './errors';\nimport type { PaginatedResult, RateLimitInfo } from './types/public';\n\nexport type FetchLike = (\n input: string | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl: string;\n maxRetries: number;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}\n\nexport interface RequestConfig {\n query?: Record<string, unknown>;\n body?: unknown;\n signal?: AbortSignal;\n /** Accept header; defaults to `application/json`. */\n accept?: string;\n}\n\ntype HttpMethod = 'GET' | 'POST';\n\ninterface Envelope {\n success: boolean;\n code?: string;\n message?: string;\n errors?: Record<string, string[]>;\n data?: unknown;\n total?: number;\n start?: number;\n end?: number;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error('Aborted'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal?.reason ?? new Error('Aborted'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction parseHeaderInt(value: string | null): number | null {\n if (value == null) return null;\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\n/**\n * Owns the HTTP concern: auth header, query/body serialization, per-request\n * timeout + abort, automatic 429 retries, envelope parsing and error mapping.\n * Resources sit on top and never touch `fetch` directly.\n */\nexport class Transport {\n lastRateLimit: RateLimitInfo | null = null;\n\n constructor(private readonly opts: TransportOptions) {}\n\n // --- Public helpers used by resources --------------------------------------\n\n /** Run a request and return the unwrapped `data` payload, typed as `T`. */\n async getData<T>(method: HttpMethod, path: string, config: RequestConfig = {}): Promise<T> {\n const env = await this.requestJson(method, path, config);\n return env.data as T;\n }\n\n /** Run a GET list request and return `{ data, total, start, end }`. */\n async getPage<T>(path: string, config: RequestConfig = {}): Promise<PaginatedResult<T>> {\n const env = await this.requestJson('GET', path, config);\n return {\n data: (env.data as T[]) ?? [],\n total: env.total ?? 0,\n start: env.start ?? 0,\n end: env.end ?? 0,\n };\n }\n\n /** Run a request that returns a binary body (e.g. the invoice PDF). */\n async getBinary(method: HttpMethod, path: string, config: RequestConfig = {}): Promise<ArrayBuffer> {\n const res = await this.execute(method, path, config);\n if (!res.ok) {\n throw this.toError(res, await this.tryParseJson(res));\n }\n return res.arrayBuffer();\n }\n\n // --- Internals -------------------------------------------------------------\n\n private async requestJson(method: HttpMethod, path: string, config: RequestConfig): Promise<Envelope> {\n const res = await this.execute(method, path, config);\n const body = await this.tryParseJson(res);\n if (!res.ok || body?.success === false) {\n throw this.toError(res, body);\n }\n if (!body) {\n throw new XedoConnectionError({\n code: 'INVALID_RESPONSE',\n status: res.status,\n message: 'Expected a JSON response body but received none.',\n });\n }\n return body;\n }\n\n private async tryParseJson(res: Response): Promise<Envelope | undefined> {\n const text = await res.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text) as Envelope;\n } catch {\n return undefined;\n }\n }\n\n private toError(res: Response, body: Envelope | undefined): Error {\n const retryAfter = parseHeaderInt(res.headers.get('retry-after'));\n const params: XedoErrorParams = {\n code: body?.code ?? `HTTP_${res.status}`,\n message: body?.message ?? res.statusText ?? 'Request failed',\n status: res.status,\n errors: body?.errors,\n data: body?.data,\n requestId: res.headers.get('x-request-id') ?? undefined,\n retryAfter: retryAfter ?? undefined,\n };\n return createXedoError(params);\n }\n\n /** Fetch with retry on 429; returns the final {@link Response}. */\n private async execute(method: HttpMethod, path: string, config: RequestConfig): Promise<Response> {\n const url = this.buildUrl(path, config.query);\n let attempt = 0;\n for (;;) {\n const res = await this.fetchOnce(method, url, config);\n this.captureRateLimit(res);\n if (res.status === 429 && attempt < this.opts.maxRetries) {\n await sleep(this.retryDelayMs(res, attempt), config.signal);\n attempt += 1;\n continue;\n }\n return res;\n }\n }\n\n private async fetchOnce(method: HttpMethod, url: URL, config: RequestConfig): Promise<Response> {\n const controller = new AbortController();\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.opts.timeoutMs);\n\n const userSignal = config.signal;\n const onUserAbort = () => controller.abort();\n if (userSignal) {\n if (userSignal.aborted) controller.abort();\n else userSignal.addEventListener('abort', onUserAbort, { once: true });\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.opts.apiKey}`,\n Accept: config.accept ?? 'application/json',\n };\n let body: string | undefined;\n if (config.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(config.body);\n }\n\n try {\n return await this.opts.fetchImpl(url, { method, headers, body, signal: controller.signal });\n } catch (err) {\n if (timedOut) {\n throw new XedoConnectionError({\n code: 'TIMEOUT',\n status: 0,\n message: `Request to ${url.pathname} timed out after ${this.opts.timeoutMs}ms.`,\n });\n }\n // Genuine user-initiated cancellation: surface it untouched.\n if (userSignal?.aborted) throw err;\n throw new XedoConnectionError({\n code: 'CONNECTION_ERROR',\n status: 0,\n message: err instanceof Error ? err.message : 'Network request failed.',\n });\n } finally {\n clearTimeout(timer);\n userSignal?.removeEventListener('abort', onUserAbort);\n }\n }\n\n private buildUrl(path: string, query: Record<string, unknown> | undefined): URL {\n const url = new URL(this.opts.baseUrl.replace(/\\/+$/, '') + path);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url;\n }\n\n private captureRateLimit(res: Response): void {\n const limit = parseHeaderInt(res.headers.get('x-ratelimit-limit'));\n const remaining = parseHeaderInt(res.headers.get('x-ratelimit-remaining'));\n const reset = parseHeaderInt(res.headers.get('x-ratelimit-reset'));\n if (limit === null && remaining === null && reset === null) return;\n this.lastRateLimit = { limit, remaining, reset };\n }\n\n private retryDelayMs(res: Response, attempt: number): number {\n const retryAfter = parseHeaderInt(res.headers.get('retry-after'));\n if (retryAfter !== null) return retryAfter * 1000;\n // Exponential backoff with jitter: 500ms, 1s, 2s, … capped at 8s.\n const base = Math.min(8000, 500 * 2 ** attempt);\n return base + Math.random() * base * 0.25;\n }\n}\n","import { XedoConnectionError, XedoError } from './errors';\nimport { Carts } from './resources/carts';\nimport { Collections } from './resources/collections';\nimport { DeliveryAreas } from './resources/delivery-areas';\nimport { Marketplace } from './resources/marketplace';\nimport { Orders } from './resources/orders';\nimport { Products } from './resources/products';\nimport { Transport, type FetchLike } from './transport';\nimport type { PingResult, RateLimitInfo, RequestOptions } from './types/public';\n\nconst DEFAULT_BASE_URL = 'https://systems.xedoapp.com/marketplace';\nconst DEFAULT_MAX_RETRIES = 4;\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport interface XedoOptions {\n /** Developer API key: `xdk_live_…` or `xdk_test_…`. */\n apiKey: string;\n /** Override the API base URL. Defaults to the production marketplace URL. */\n baseUrl?: string;\n /** Max automatic retries on `429`. Defaults to 4. */\n maxRetries?: number;\n /** Per-request timeout in milliseconds. Defaults to 30000. */\n timeoutMs?: number;\n /** Inject a custom fetch (tests, edge runtimes). Defaults to global fetch. */\n fetch?: FetchLike;\n /**\n * Escape hatch to run in a browser. Strongly discouraged: your\n * `xdk_live_…` key would be exposed in the client bundle.\n */\n dangerouslyAllowBrowser?: boolean;\n}\n\n/**\n * The Xedo Developer API client. Server-side only — see\n * `dangerouslyAllowBrowser`.\n *\n * ```ts\n * const xedo = new Xedo({ apiKey: process.env.XEDO_API_KEY! });\n * const { data } = await xedo.products.list({ perPage: 20 });\n * ```\n */\nexport class Xedo {\n readonly products: Products;\n readonly collections: Collections;\n readonly orders: Orders;\n readonly carts: Carts;\n readonly deliveryAreas: DeliveryAreas;\n readonly marketplace: Marketplace;\n\n private readonly apiKey: string;\n private readonly transport: Transport;\n\n constructor(options: XedoOptions) {\n if (!options?.apiKey) {\n throw new XedoError({\n code: 'MISSING_DEVELOPER_API_KEY',\n status: 0,\n message: 'A Xedo `apiKey` is required.',\n });\n }\n\n const maybeWindow = (globalThis as { window?: { document?: unknown } }).window;\n const isBrowser = typeof maybeWindow !== 'undefined' && typeof maybeWindow.document !== 'undefined';\n if (isBrowser && !options.dangerouslyAllowBrowser) {\n throw new XedoError({\n code: 'BROWSER_ENV_DETECTED',\n status: 0,\n message:\n 'The Xedo SDK is server-side only: running it in a browser would expose your ' +\n 'xdk_live_… key in the client bundle. Call it from a server (Next.js Server ' +\n 'Component / Route Handler, Express, a worker, …). See the README on authentication.',\n });\n }\n\n const fetchImpl: FetchLike =\n options.fetch ?? ((input, init) => globalThis.fetch(input, init));\n if (typeof globalThis.fetch !== 'function' && !options.fetch) {\n throw new XedoConnectionError({\n code: 'NO_FETCH',\n status: 0,\n message: 'Global fetch is unavailable (Node >= 18 required) — pass `options.fetch`.',\n });\n }\n\n this.apiKey = options.apiKey;\n this.transport = new Transport({\n apiKey: options.apiKey,\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n fetchImpl,\n });\n\n this.products = new Products(this.transport);\n this.collections = new Collections(this.transport);\n this.orders = new Orders(this.transport);\n this.carts = new Carts(this.transport);\n this.deliveryAreas = new DeliveryAreas(this.transport);\n this.marketplace = new Marketplace(this.transport);\n }\n\n /**\n * The environment inferred from the key prefix. The rest of the key is\n * treated as opaque.\n */\n get environment(): 'test' | 'live' | 'unknown' {\n if (this.apiKey.startsWith('xdk_live_')) return 'live';\n if (this.apiKey.startsWith('xdk_test_')) return 'test';\n return 'unknown';\n }\n\n /** Rate-limit headers from the most recent response, for monitoring. */\n get lastRateLimit(): RateLimitInfo | null {\n return this.transport.lastRateLimit;\n }\n\n /** `GET /v1/ping` — validate the API key end to end. */\n ping(opts: RequestOptions = {}): Promise<PingResult> {\n return this.transport.getData<PingResult>('GET', '/v1/ping', { signal: opts.signal });\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED