@xedo/sdk 0.2.2 → 0.2.3

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 CHANGED
@@ -15,7 +15,7 @@ npm install @xedo/sdk
15
15
  ```ts
16
16
  import { Xedo } from '@xedo/sdk';
17
17
 
18
- const xedo = new Xedo({ apiKey: process.env.XEDO_API_KEY! }); // xdk_live_or xdk_test_…
18
+ const xedo = new Xedo({ apiKey: process.env.XEDO_API_KEY! }); // opaque xdk_key
19
19
 
20
20
  await xedo.ping(); // validate the key
21
21
  const { data, total } = await xedo.products.list({ perPage: 20 });
@@ -23,7 +23,7 @@ const { data, total } = await xedo.products.list({ perPage: 20 });
23
23
 
24
24
  ## ⚠️ Server-side only
25
25
 
26
- The SDK sends your `xdk_live_…` key as a Bearer token. **Never import it into a
26
+ The SDK sends your `xdk_…` key as a Bearer token. **Never import it into a
27
27
  browser bundle** — your key would be exposed to anyone. Call it from a server:
28
28
  Next.js Server Components / Route Handlers, Express, workers, scripts. The
29
29
  constructor throws if it detects a browser environment (override only if you
@@ -34,16 +34,33 @@ truly know what you are doing via `dangerouslyAllowBrowser`).
34
34
  ```ts
35
35
  const xedo = new Xedo({
36
36
  apiKey: process.env.XEDO_API_KEY!,
37
- baseUrl: 'https://systems.xedoapp.com/marketplace', // default
37
+ baseUrl: 'https://systems.xedoapp.com/marketplace', // Production (default)
38
38
  maxRetries: 4, // auto-retry on 429 (default)
39
39
  timeoutMs: 30000, // per-request timeout
40
40
  fetch: customFetch, // optional injection (tests, edge)
41
41
  });
42
42
 
43
- xedo.environment; // 'test' | 'live' | 'unknown' (from key prefix)
44
43
  xedo.lastRateLimit; // { limit, remaining, reset } from the last call
45
44
  ```
46
45
 
46
+ ### Production vs Sandbox
47
+
48
+ The **`baseUrl`** selects the environment:
49
+
50
+ | Environment | `baseUrl` |
51
+ |---|---|
52
+ | Production (default) | `https://systems.xedoapp.com/marketplace` |
53
+ | Sandbox | `https://systems.xedotestnet.space/marketplace` |
54
+
55
+ ```ts
56
+ const sandbox = new Xedo({
57
+ apiKey: process.env.XEDO_API_KEY!,
58
+ baseUrl: 'https://systems.xedotestnet.space/marketplace',
59
+ });
60
+ ```
61
+
62
+ See the [Environments guide](https://developers.xedoapp.com/introduction/environments) for details.
63
+
47
64
  ## Resources
48
65
 
49
66
  | Resource | Methods |
package/dist/index.cjs CHANGED
@@ -531,7 +531,6 @@ var Xedo = class {
531
531
  carts;
532
532
  deliveryAreas;
533
533
  marketplace;
534
- apiKey;
535
534
  transport;
536
535
  constructor(options) {
537
536
  if (!options?.apiKey) {
@@ -547,7 +546,7 @@ var Xedo = class {
547
546
  throw new XedoError({
548
547
  code: "BROWSER_ENV_DETECTED",
549
548
  status: 0,
550
- message: "The Xedo SDK is server-side only: running it in a browser would expose your xdk_live_\u2026 key in the client bundle. Call it from a server (Next.js Server Component / Route Handler, Express, a worker, \u2026). See the README on authentication."
549
+ message: "The Xedo SDK is server-side only: running it in a browser would expose your xdk_\u2026 key in the client bundle. Call it from a server (Next.js Server Component / Route Handler, Express, a worker, \u2026). See the README on authentication."
551
550
  });
552
551
  }
553
552
  const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
@@ -558,7 +557,6 @@ var Xedo = class {
558
557
  message: "Global fetch is unavailable (Node >= 18 required) \u2014 pass `options.fetch`."
559
558
  });
560
559
  }
561
- this.apiKey = options.apiKey;
562
560
  this.transport = new Transport({
563
561
  apiKey: options.apiKey,
564
562
  baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
@@ -573,15 +571,6 @@ var Xedo = class {
573
571
  this.deliveryAreas = new DeliveryAreas(this.transport);
574
572
  this.marketplace = new Marketplace(this.transport);
575
573
  }
576
- /**
577
- * The environment inferred from the key prefix. The rest of the key is
578
- * treated as opaque.
579
- */
580
- get environment() {
581
- if (this.apiKey.startsWith("xdk_live_")) return "live";
582
- if (this.apiKey.startsWith("xdk_test_")) return "test";
583
- return "unknown";
584
- }
585
574
  /** Rate-limit headers from the most recent response, for monitoring. */
586
575
  get lastRateLimit() {
587
576
  return this.transport.lastRateLimit;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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":["export { Xedo, type XedoOptions } from './client';\nexport type { FetchLike } from './transport';\n\nexport {\n XedoError,\n XedoAuthError,\n XedoValidationError,\n XedoNotFoundError,\n XedoStockError,\n XedoConflictError,\n XedoRateLimitError,\n XedoPaymentInitError,\n XedoConnectionError,\n type XedoErrorParams,\n} from './errors';\n\nexport type {\n JsonObject,\n SortOrder,\n // Enums\n OrderStatus,\n CartStatus,\n FulfillmentStatus,\n DeliveryType,\n PaymentStatus,\n OrderPaymentMethod,\n PriceAdjustmentType,\n MediaType,\n // Entities\n PingResult,\n Product,\n ProductCollection,\n ProductGalleryMedia,\n ProductVariation,\n ProductVariationOption,\n ProductCombination,\n Collection,\n Order,\n OrderListItem,\n OrderCustomer,\n OrderPayment,\n OrderItem,\n OrderTotals,\n OrderDelivery,\n Cart,\n CartListItem,\n CartCustomer,\n CartItem,\n CartTotals,\n CartDelivery,\n CheckoutPreview,\n CheckoutTotals,\n CheckoutPayment,\n CheckoutResult,\n CheckoutRetryResult,\n DeliveryArea,\n BusinessCategory,\n MarketplaceProfile,\n // List / request params\n ListParams,\n ProductListParams,\n CollectionListParams,\n OrderListParams,\n CartListParams,\n RetrieveOptions,\n RequestOptions,\n PaginatedResult,\n RateLimitInfo,\n // Checkout inputs\n CheckoutItem,\n CheckoutDelivery,\n CheckoutCustomer,\n PaymentMethod,\n CheckoutPreviewInput,\n CheckoutCreateInput,\n CheckoutRetryPayInput,\n} from './types/public';\n","/**\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":[]}
1
+ {"version":3,"sources":["../src/index.ts","../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":["export { Xedo, type XedoOptions } from './client';\nexport type { FetchLike } from './transport';\n\nexport {\n XedoError,\n XedoAuthError,\n XedoValidationError,\n XedoNotFoundError,\n XedoStockError,\n XedoConflictError,\n XedoRateLimitError,\n XedoPaymentInitError,\n XedoConnectionError,\n type XedoErrorParams,\n} from './errors';\n\nexport type {\n JsonObject,\n SortOrder,\n // Enums\n OrderStatus,\n CartStatus,\n FulfillmentStatus,\n DeliveryType,\n PaymentStatus,\n OrderPaymentMethod,\n PriceAdjustmentType,\n MediaType,\n // Entities\n PingResult,\n Product,\n ProductCollection,\n ProductGalleryMedia,\n ProductVariation,\n ProductVariationOption,\n ProductCombination,\n Collection,\n Order,\n OrderListItem,\n OrderCustomer,\n OrderPayment,\n OrderItem,\n OrderTotals,\n OrderDelivery,\n Cart,\n CartListItem,\n CartCustomer,\n CartItem,\n CartTotals,\n CartDelivery,\n CheckoutPreview,\n CheckoutTotals,\n CheckoutPayment,\n CheckoutResult,\n CheckoutRetryResult,\n DeliveryArea,\n BusinessCategory,\n MarketplaceProfile,\n // List / request params\n ListParams,\n ProductListParams,\n CollectionListParams,\n OrderListParams,\n CartListParams,\n RetrieveOptions,\n RequestOptions,\n PaginatedResult,\n RateLimitInfo,\n // Checkout inputs\n CheckoutItem,\n CheckoutDelivery,\n CheckoutCustomer,\n PaymentMethod,\n CheckoutPreviewInput,\n CheckoutCreateInput,\n CheckoutRetryPayInput,\n} from './types/public';\n","/**\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: an opaque `xdk_…` string. */\n apiKey: string;\n /**\n * Override the API base URL. Defaults to the production marketplace URL.\n * The base URL alone selects Production vs Sandbox — the key is opaque and\n * carries no environment. See https://developers.xedoapp.com/introduction/environments\n */\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_…` 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 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_… 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.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 /** 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/dist/index.d.cts CHANGED
@@ -1016,9 +1016,13 @@ declare class Products extends Resource {
1016
1016
  }
1017
1017
 
1018
1018
  interface XedoOptions {
1019
- /** Developer API key: `xdk_live_…` or `xdk_test_…`. */
1019
+ /** Developer API key: an opaque `xdk_…` string. */
1020
1020
  apiKey: string;
1021
- /** Override the API base URL. Defaults to the production marketplace URL. */
1021
+ /**
1022
+ * Override the API base URL. Defaults to the production marketplace URL.
1023
+ * The base URL alone selects Production vs Sandbox — the key is opaque and
1024
+ * carries no environment. See https://developers.xedoapp.com/introduction/environments
1025
+ */
1022
1026
  baseUrl?: string;
1023
1027
  /** Max automatic retries on `429`. Defaults to 4. */
1024
1028
  maxRetries?: number;
@@ -1028,7 +1032,7 @@ interface XedoOptions {
1028
1032
  fetch?: FetchLike;
1029
1033
  /**
1030
1034
  * Escape hatch to run in a browser. Strongly discouraged: your
1031
- * `xdk_live_…` key would be exposed in the client bundle.
1035
+ * `xdk_…` key would be exposed in the client bundle.
1032
1036
  */
1033
1037
  dangerouslyAllowBrowser?: boolean;
1034
1038
  }
@@ -1048,14 +1052,8 @@ declare class Xedo {
1048
1052
  readonly carts: Carts;
1049
1053
  readonly deliveryAreas: DeliveryAreas;
1050
1054
  readonly marketplace: Marketplace;
1051
- private readonly apiKey;
1052
1055
  private readonly transport;
1053
1056
  constructor(options: XedoOptions);
1054
- /**
1055
- * The environment inferred from the key prefix. The rest of the key is
1056
- * treated as opaque.
1057
- */
1058
- get environment(): 'test' | 'live' | 'unknown';
1059
1057
  /** Rate-limit headers from the most recent response, for monitoring. */
1060
1058
  get lastRateLimit(): RateLimitInfo | null;
1061
1059
  /** `GET /v1/ping` — validate the API key end to end. */
package/dist/index.d.ts CHANGED
@@ -1016,9 +1016,13 @@ declare class Products extends Resource {
1016
1016
  }
1017
1017
 
1018
1018
  interface XedoOptions {
1019
- /** Developer API key: `xdk_live_…` or `xdk_test_…`. */
1019
+ /** Developer API key: an opaque `xdk_…` string. */
1020
1020
  apiKey: string;
1021
- /** Override the API base URL. Defaults to the production marketplace URL. */
1021
+ /**
1022
+ * Override the API base URL. Defaults to the production marketplace URL.
1023
+ * The base URL alone selects Production vs Sandbox — the key is opaque and
1024
+ * carries no environment. See https://developers.xedoapp.com/introduction/environments
1025
+ */
1022
1026
  baseUrl?: string;
1023
1027
  /** Max automatic retries on `429`. Defaults to 4. */
1024
1028
  maxRetries?: number;
@@ -1028,7 +1032,7 @@ interface XedoOptions {
1028
1032
  fetch?: FetchLike;
1029
1033
  /**
1030
1034
  * Escape hatch to run in a browser. Strongly discouraged: your
1031
- * `xdk_live_…` key would be exposed in the client bundle.
1035
+ * `xdk_…` key would be exposed in the client bundle.
1032
1036
  */
1033
1037
  dangerouslyAllowBrowser?: boolean;
1034
1038
  }
@@ -1048,14 +1052,8 @@ declare class Xedo {
1048
1052
  readonly carts: Carts;
1049
1053
  readonly deliveryAreas: DeliveryAreas;
1050
1054
  readonly marketplace: Marketplace;
1051
- private readonly apiKey;
1052
1055
  private readonly transport;
1053
1056
  constructor(options: XedoOptions);
1054
- /**
1055
- * The environment inferred from the key prefix. The rest of the key is
1056
- * treated as opaque.
1057
- */
1058
- get environment(): 'test' | 'live' | 'unknown';
1059
1057
  /** Rate-limit headers from the most recent response, for monitoring. */
1060
1058
  get lastRateLimit(): RateLimitInfo | null;
1061
1059
  /** `GET /v1/ping` — validate the API key end to end. */
package/dist/index.js CHANGED
@@ -496,7 +496,6 @@ var Xedo = class {
496
496
  carts;
497
497
  deliveryAreas;
498
498
  marketplace;
499
- apiKey;
500
499
  transport;
501
500
  constructor(options) {
502
501
  if (!options?.apiKey) {
@@ -512,7 +511,7 @@ var Xedo = class {
512
511
  throw new XedoError({
513
512
  code: "BROWSER_ENV_DETECTED",
514
513
  status: 0,
515
- message: "The Xedo SDK is server-side only: running it in a browser would expose your xdk_live_\u2026 key in the client bundle. Call it from a server (Next.js Server Component / Route Handler, Express, a worker, \u2026). See the README on authentication."
514
+ message: "The Xedo SDK is server-side only: running it in a browser would expose your xdk_\u2026 key in the client bundle. Call it from a server (Next.js Server Component / Route Handler, Express, a worker, \u2026). See the README on authentication."
516
515
  });
517
516
  }
518
517
  const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
@@ -523,7 +522,6 @@ var Xedo = class {
523
522
  message: "Global fetch is unavailable (Node >= 18 required) \u2014 pass `options.fetch`."
524
523
  });
525
524
  }
526
- this.apiKey = options.apiKey;
527
525
  this.transport = new Transport({
528
526
  apiKey: options.apiKey,
529
527
  baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
@@ -538,15 +536,6 @@ var Xedo = class {
538
536
  this.deliveryAreas = new DeliveryAreas(this.transport);
539
537
  this.marketplace = new Marketplace(this.transport);
540
538
  }
541
- /**
542
- * The environment inferred from the key prefix. The rest of the key is
543
- * treated as opaque.
544
- */
545
- get environment() {
546
- if (this.apiKey.startsWith("xdk_live_")) return "live";
547
- if (this.apiKey.startsWith("xdk_test_")) return "test";
548
- return "unknown";
549
- }
550
539
  /** Rate-limit headers from the most recent response, for monitoring. */
551
540
  get lastRateLimit() {
552
541
  return this.transport.lastRateLimit;
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/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":";AAuBO,IAAM,YAAN,cAAwB,MAAM;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAyB;AACnC,UAAM,OAAO,OAAO;AAEpB,SAAK,OAAO,WAAW;AACvB,SAAK,OAAO,OAAO;AACnB,SAAK,SAAS,OAAO;AACrB,SAAK,SAAS,OAAO;AACrB,SAAK,OAAO,OAAO;AACnB,SAAK,YAAY,OAAO;AAExB,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;AAGO,IAAM,gBAAN,cAA4B,UAAU;AAAC;AAGvC,IAAM,sBAAN,cAAkC,UAAU;AAAC;AAG7C,IAAM,oBAAN,cAAgC,UAAU;AAAC;AAG3C,IAAM,iBAAN,cAA6B,UAAU;AAAC;AAGxC,IAAM,oBAAN,cAAgC,UAAU;AAAC;AAG3C,IAAM,qBAAN,cAAiC,UAAU;AAAA,EACvC;AAAA,EACT,YAAY,QAAyB;AACnC,UAAM,MAAM;AACZ,SAAK,aAAa,OAAO;AAAA,EAC3B;AACF;AAMO,IAAM,uBAAN,cAAmC,UAAU;AAAA,EACzC;AAAA,EACT,YAAY,QAAyB;AACnC,UAAM,MAAM;AACZ,UAAM,OAAO,OAAO;AACpB,SAAK,eAAe,MAAM;AAAA,EAC5B;AACF;AAGO,IAAM,sBAAN,cAAkC,UAAU;AAAC;AAEpD,IAAM,WAAkE;AAAA,EACtE,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,8BAA8B;AAAA,EAC9B,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,qBAAqB;AACvB;AAEA,SAAS,iBAAiB,QAAuD;AAC/E,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGO,SAAS,gBAAgB,QAAoC;AAClE,QAAM,OAAO,SAAS,OAAO,IAAI,KAAK,iBAAiB,OAAO,MAAM;AACpE,SAAO,IAAI,KAAK,MAAM;AACxB;;;AC5HO,IAAe,WAAf,MAAwB;AAAA,EAC7B,YAA+B,WAAsB;AAAtB;AAAA,EAAuB;AAAA,EAAvB;AACjC;AAGO,SAAS,YAAY,QAA6C;AACvE,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,OAAQ,OAA6B;AAAA,IACrC,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,EACjB;AACF;AAOA,gBAAuB,SACrB,WACA,QACmB;AACnB,MAAI,OAAO,OAAO,QAAQ;AAC1B,QAAM,UAAU,OAAO,WAAW;AAClC,aAAS;AACP,UAAM,SAAS,MAAM,UAAU,EAAE,GAAG,QAAQ,MAAM,QAAQ,CAAC;AAC3D,eAAW,QAAQ,OAAO,KAAM,OAAM;AACtC,QAAI,OAAO,KAAK,WAAW,KAAK,OAAO,OAAO,OAAO,MAAO;AAC5D,YAAQ;AAAA,EACV;AACF;;;ACnBO,IAAM,QAAN,cAAoB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlC,KAAK,SAAyB,CAAC,GAA2C;AACxE,WAAO,KAAK,UAAU,QAAsB,aAAa;AAAA,MACvD,OAAO,YAAY,MAAM;AAAA,MACzB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAQ,SAAyB,CAAC,GAAiC;AACjE,WAAO,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,MAAM;AAAA,EAC7C;AAAA;AAAA,EAGA,SAAS,UAAkB,OAAuB,CAAC,GAAkB;AACnE,WAAO,KAAK,UAAU,QAAc,OAAO,aAAa,mBAAmB,QAAQ,CAAC,IAAI;AAAA,MACtF,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAQ,OAA6B,OAAuB,CAAC,GAA6B;AACxF,WAAO,KAAK,UAAU,QAAyB,QAAQ,qBAAqB;AAAA,MAC1E,MAAM;AAAA,MACN,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAA4B,OAAuB,CAAC,GAA4B;AACrF,WAAO,KAAK,UAAU,QAAwB,QAAQ,aAAa;AAAA,MACjE,MAAM;AAAA,MACN,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAkB,OAA8B,OAAuB,CAAC,GAAiC;AAC3G,WAAO,KAAK,UAAU;AAAA,MACpB;AAAA,MACA,aAAa,mBAAmB,QAAQ,CAAC;AAAA,MACzC,EAAE,MAAM,OAAO,QAAQ,KAAK,OAAO;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,aACJ,OACA,OAAuB,CAAC,GACuB;AAC/C,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,OAAO,IAAI;AAAA,IACtC,SAAS,KAAK;AACZ,UAAI,eAAe,wBAAwB,IAAI,cAAc;AAC3D,gBAAQ;AAAA,UACN,uCAAuC,IAAI,YAAY;AAAA,QACzD;AACA,eAAO,KAAK,IAAI,IAAI,cAAc,EAAE,WAAW,MAAM,UAAU,GAAG,IAAI;AAAA,MACxE;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AC/FO,IAAM,cAAN,cAA0B,SAAS;AAAA;AAAA,EAExC,KAAK,SAA+B,CAAC,GAAyC;AAC5E,WAAO,KAAK,UAAU,QAAoB,mBAAmB;AAAA,MAC3D,OAAO,YAAY,MAAM;AAAA,MACzB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAQ,SAA+B,CAAC,GAA+B;AACrE,WAAO,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,MAAM;AAAA,EAC7C;AAAA;AAAA,EAGA,SAAS,UAAkB,OAAuB,CAAC,GAAwB;AACzE,WAAO,KAAK,UAAU;AAAA,MACpB;AAAA,MACA,mBAAmB,mBAAmB,QAAQ,CAAC;AAAA,MAC/C,EAAE,QAAQ,KAAK,OAAO;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,eAAe,MAAc,OAAuB,CAAC,GAAwB;AAC3E,WAAO,KAAK,UAAU;AAAA,MACpB;AAAA,MACA,2BAA2B,mBAAmB,IAAI,CAAC;AAAA,MACnD,EAAE,QAAQ,KAAK,OAAO;AAAA,IACxB;AAAA,EACF;AACF;;;AC/BO,IAAM,gBAAN,cAA4B,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1C,KAAK,OAAuB,CAAC,GAA4B;AACvD,WAAO,KAAK,UAAU,QAAwB,OAAO,sBAAsB;AAAA,MACzE,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AACF;;;ACVO,IAAM,cAAN,cAA0B,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxC,SAAS,OAAuB,CAAC,GAAgC;AAC/D,WAAO,KAAK,UAAU,QAA4B,OAAO,mBAAmB;AAAA,MAC1E,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AACF;;;ACVO,IAAM,SAAN,cAAqB,SAAS;AAAA;AAAA,EAEnC,KAAK,SAA0B,CAAC,GAA4C;AAC1E,WAAO,KAAK,UAAU,QAAuB,cAAc;AAAA,MACzD,OAAO,YAAY,MAAM;AAAA,MACzB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAQ,SAA0B,CAAC,GAAkC;AACnE,WAAO,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,MAAM;AAAA,EAC7C;AAAA;AAAA,EAGA,SAAS,UAAkB,OAAuB,CAAC,GAAmB;AACpE,WAAO,KAAK,UAAU,QAAe,OAAO,cAAc,mBAAmB,QAAQ,CAAC,IAAI;AAAA,MACxF,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,UAAkB,OAAuB,CAAC,GAAyB;AACzE,WAAO,KAAK,UAAU,UAAU,OAAO,cAAc,mBAAmB,QAAQ,CAAC,YAAY;AAAA,MAC3F,QAAQ;AAAA,MACR,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AACF;;;AChCO,IAAM,WAAN,cAAuB,SAAS;AAAA;AAAA,EAErC,KAAK,SAA4B,CAAC,GAAsC;AACtE,WAAO,KAAK,UAAU,QAAiB,gBAAgB;AAAA,MACrD,OAAO;AAAA,QACL,GAAG,YAAY,MAAM;AAAA,QACrB,YAAY,OAAO;AAAA,QACnB,mBAAmB,OAAO;AAAA,QAC1B,iBAAiB,OAAO;AAAA,MAC1B;AAAA,MACA,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAQ,SAA4B,CAAC,GAA4B;AAC/D,WAAO,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,MAAM;AAAA,EAC7C;AAAA;AAAA,EAGA,SAAS,UAAkB,OAAwB,CAAC,GAAqB;AACvE,WAAO,KAAK,UAAU,QAAiB,OAAO,gBAAgB,mBAAmB,QAAQ,CAAC,IAAI;AAAA,MAC5F,OAAO,EAAE,iBAAiB,KAAK,gBAAgB;AAAA,MAC/C,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eAAe,MAAc,OAAwB,CAAC,GAAqB;AACzE,WAAO,KAAK,UAAU,QAAiB,OAAO,wBAAwB,mBAAmB,IAAI,CAAC,IAAI;AAAA,MAChG,OAAO,EAAE,iBAAiB,KAAK,gBAAgB;AAAA,MAC/C,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AACF;;;ACAA,SAAS,MAAM,IAAY,QAAqC;AAC9D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,QAAQ,SAAS;AACnB,aAAO,OAAO,UAAU,IAAI,MAAM,SAAS,CAAC;AAC5C;AAAA,IACF;AACA,UAAM,QAAQ,WAAW,MAAM;AAC7B,cAAQ,oBAAoB,SAAS,OAAO;AAC5C,cAAQ;AAAA,IACV,GAAG,EAAE;AACL,UAAM,UAAU,MAAM;AACpB,mBAAa,KAAK;AAClB,aAAO,QAAQ,UAAU,IAAI,MAAM,SAAS,CAAC;AAAA,IAC/C;AACA,YAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EAC3D,CAAC;AACH;AAEA,SAAS,eAAe,OAAqC;AAC3D,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,IAAI,OAAO,KAAK;AACtB,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAOO,IAAM,YAAN,MAAgB;AAAA,EAGrB,YAA6B,MAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAF7B,gBAAsC;AAAA;AAAA;AAAA,EAOtC,MAAM,QAAW,QAAoB,MAAc,SAAwB,CAAC,GAAe;AACzF,UAAM,MAAM,MAAM,KAAK,YAAY,QAAQ,MAAM,MAAM;AACvD,WAAO,IAAI;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,QAAW,MAAc,SAAwB,CAAC,GAAgC;AACtF,UAAM,MAAM,MAAM,KAAK,YAAY,OAAO,MAAM,MAAM;AACtD,WAAO;AAAA,MACL,MAAO,IAAI,QAAgB,CAAC;AAAA,MAC5B,OAAO,IAAI,SAAS;AAAA,MACpB,OAAO,IAAI,SAAS;AAAA,MACpB,KAAK,IAAI,OAAO;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAU,QAAoB,MAAc,SAAwB,CAAC,GAAyB;AAClG,UAAM,MAAM,MAAM,KAAK,QAAQ,QAAQ,MAAM,MAAM;AACnD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,KAAK,QAAQ,KAAK,MAAM,KAAK,aAAa,GAAG,CAAC;AAAA,IACtD;AACA,WAAO,IAAI,YAAY;AAAA,EACzB;AAAA;AAAA,EAIA,MAAc,YAAY,QAAoB,MAAc,QAA0C;AACpG,UAAM,MAAM,MAAM,KAAK,QAAQ,QAAQ,MAAM,MAAM;AACnD,UAAM,OAAO,MAAM,KAAK,aAAa,GAAG;AACxC,QAAI,CAAC,IAAI,MAAM,MAAM,YAAY,OAAO;AACtC,YAAM,KAAK,QAAQ,KAAK,IAAI;AAAA,IAC9B;AACA,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,QAAQ,IAAI;AAAA,QACZ,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,aAAa,KAA8C;AACvE,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,QAAQ,KAAe,MAAmC;AAChE,UAAM,aAAa,eAAe,IAAI,QAAQ,IAAI,aAAa,CAAC;AAChE,UAAM,SAA0B;AAAA,MAC9B,MAAM,MAAM,QAAQ,QAAQ,IAAI,MAAM;AAAA,MACtC,SAAS,MAAM,WAAW,IAAI,cAAc;AAAA,MAC5C,QAAQ,IAAI;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM;AAAA,MACZ,WAAW,IAAI,QAAQ,IAAI,cAAc,KAAK;AAAA,MAC9C,YAAY,cAAc;AAAA,IAC5B;AACA,WAAO,gBAAgB,MAAM;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAc,QAAQ,QAAoB,MAAc,QAA0C;AAChG,UAAM,MAAM,KAAK,SAAS,MAAM,OAAO,KAAK;AAC5C,QAAI,UAAU;AACd,eAAS;AACP,YAAM,MAAM,MAAM,KAAK,UAAU,QAAQ,KAAK,MAAM;AACpD,WAAK,iBAAiB,GAAG;AACzB,UAAI,IAAI,WAAW,OAAO,UAAU,KAAK,KAAK,YAAY;AACxD,cAAM,MAAM,KAAK,aAAa,KAAK,OAAO,GAAG,OAAO,MAAM;AAC1D,mBAAW;AACX;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,QAAoB,KAAU,QAA0C;AAC9F,UAAM,aAAa,IAAI,gBAAgB;AACvC,QAAI,WAAW;AACf,UAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAW;AACX,iBAAW,MAAM;AAAA,IACnB,GAAG,KAAK,KAAK,SAAS;AAEtB,UAAM,aAAa,OAAO;AAC1B,UAAM,cAAc,MAAM,WAAW,MAAM;AAC3C,QAAI,YAAY;AACd,UAAI,WAAW,QAAS,YAAW,MAAM;AAAA,UACpC,YAAW,iBAAiB,SAAS,aAAa,EAAE,MAAM,KAAK,CAAC;AAAA,IACvE;AAEA,UAAM,UAAkC;AAAA,MACtC,eAAe,UAAU,KAAK,KAAK,MAAM;AAAA,MACzC,QAAQ,OAAO,UAAU;AAAA,IAC3B;AACA,QAAI;AACJ,QAAI,OAAO,SAAS,QAAW;AAC7B,cAAQ,cAAc,IAAI;AAC1B,aAAO,KAAK,UAAU,OAAO,IAAI;AAAA,IACnC;AAEA,QAAI;AACF,aAAO,MAAM,KAAK,KAAK,UAAU,KAAK,EAAE,QAAQ,SAAS,MAAM,QAAQ,WAAW,OAAO,CAAC;AAAA,IAC5F,SAAS,KAAK;AACZ,UAAI,UAAU;AACZ,cAAM,IAAI,oBAAoB;AAAA,UAC5B,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,SAAS,cAAc,IAAI,QAAQ,oBAAoB,KAAK,KAAK,SAAS;AAAA,QAC5E,CAAC;AAAA,MACH;AAEA,UAAI,YAAY,QAAS,OAAM;AAC/B,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS,eAAe,QAAQ,IAAI,UAAU;AAAA,MAChD,CAAC;AAAA,IACH,UAAE;AACA,mBAAa,KAAK;AAClB,kBAAY,oBAAoB,SAAS,WAAW;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,SAAS,MAAc,OAAiD;AAC9E,UAAM,MAAM,IAAI,IAAI,KAAK,KAAK,QAAQ,QAAQ,QAAQ,EAAE,IAAI,IAAI;AAChE,QAAI,OAAO;AACT,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,YAAI,UAAU,UAAa,UAAU,KAAM;AAC3C,YAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,MACzC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,KAAqB;AAC5C,UAAM,QAAQ,eAAe,IAAI,QAAQ,IAAI,mBAAmB,CAAC;AACjE,UAAM,YAAY,eAAe,IAAI,QAAQ,IAAI,uBAAuB,CAAC;AACzE,UAAM,QAAQ,eAAe,IAAI,QAAQ,IAAI,mBAAmB,CAAC;AACjE,QAAI,UAAU,QAAQ,cAAc,QAAQ,UAAU,KAAM;AAC5D,SAAK,gBAAgB,EAAE,OAAO,WAAW,MAAM;AAAA,EACjD;AAAA,EAEQ,aAAa,KAAe,SAAyB;AAC3D,UAAM,aAAa,eAAe,IAAI,QAAQ,IAAI,aAAa,CAAC;AAChE,QAAI,eAAe,KAAM,QAAO,aAAa;AAE7C,UAAM,OAAO,KAAK,IAAI,KAAM,MAAM,KAAK,OAAO;AAC9C,WAAO,OAAO,KAAK,OAAO,IAAI,OAAO;AAAA,EACvC;AACF;;;AC7NA,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AA6BpB,IAAM,OAAN,MAAW;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEQ;AAAA,EACA;AAAA,EAEjB,YAAY,SAAsB;AAChC,QAAI,CAAC,SAAS,QAAQ;AACpB,YAAM,IAAI,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,cAAe,WAAmD;AACxE,UAAM,YAAY,OAAO,gBAAgB,eAAe,OAAO,YAAY,aAAa;AACxF,QAAI,aAAa,CAAC,QAAQ,yBAAyB;AACjD,YAAM,IAAI,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SACE;AAAA,MAGJ,CAAC;AAAA,IACH;AAEA,UAAM,YACJ,QAAQ,UAAU,CAAC,OAAO,SAAS,WAAW,MAAM,OAAO,IAAI;AACjE,QAAI,OAAO,WAAW,UAAU,cAAc,CAAC,QAAQ,OAAO;AAC5D,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,SAAK,SAAS,QAAQ;AACtB,SAAK,YAAY,IAAI,UAAU;AAAA,MAC7B,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ,WAAW;AAAA,MAC5B,YAAY,QAAQ,cAAc;AAAA,MAClC,WAAW,QAAQ,aAAa;AAAA,MAChC;AAAA,IACF,CAAC;AAED,SAAK,WAAW,IAAI,SAAS,KAAK,SAAS;AAC3C,SAAK,cAAc,IAAI,YAAY,KAAK,SAAS;AACjD,SAAK,SAAS,IAAI,OAAO,KAAK,SAAS;AACvC,SAAK,QAAQ,IAAI,MAAM,KAAK,SAAS;AACrC,SAAK,gBAAgB,IAAI,cAAc,KAAK,SAAS;AACrD,SAAK,cAAc,IAAI,YAAY,KAAK,SAAS;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,cAA2C;AAC7C,QAAI,KAAK,OAAO,WAAW,WAAW,EAAG,QAAO;AAChD,QAAI,KAAK,OAAO,WAAW,WAAW,EAAG,QAAO;AAChD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,gBAAsC;AACxC,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA;AAAA,EAGA,KAAK,OAAuB,CAAC,GAAwB;AACnD,WAAO,KAAK,UAAU,QAAoB,OAAO,YAAY,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,EACtF;AACF;","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: an opaque `xdk_…` string. */\n apiKey: string;\n /**\n * Override the API base URL. Defaults to the production marketplace URL.\n * The base URL alone selects Production vs Sandbox — the key is opaque and\n * carries no environment. See https://developers.xedoapp.com/introduction/environments\n */\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_…` 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 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_… 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.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 /** 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xedo/sdk",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "Official Node.js/TypeScript SDK for the Xedo Developer API v1 — typed client for products, collections, orders & checkout.",
5
5
  "license": "MIT",
6
6
  "author": "Xedo",