@xedo/sdk 0.1.0 → 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 |
@@ -53,6 +70,13 @@ xedo.lastRateLimit; // { limit, remaining, reset } from the last call
53
70
  | `xedo.collections` | `list`, `listAll`, `retrieve`, `retrieveBySlug` |
54
71
  | `xedo.orders` | `list`, `listAll`, `retrieve`, `invoice` (PDF) |
55
72
  | `xedo.carts` | `list`, `listAll`, `retrieve`, `preview`, `create`, `pay`, `createAndPay` |
73
+ | `xedo.deliveryAreas` | `list` → `DeliveryArea[]` |
74
+ | `xedo.marketplace` | `retrieve` → `MarketplaceProfile` |
75
+
76
+ Every entity is fully typed (`Product`, `Order`, `Cart`, `Collection`, …). Note
77
+ that `list()`/`listAll()` return lightweight summary rows (`OrderListItem`,
78
+ `CartListItem`) while `retrieve()` returns the full detail object (`Order`,
79
+ `Cart`).
56
80
 
57
81
  ### Pagination
58
82
 
@@ -67,6 +91,13 @@ for await (const order of xedo.orders.listAll()) {
67
91
  }
68
92
  ```
69
93
 
94
+ ### Delivery areas & marketplace
95
+
96
+ ```ts
97
+ const profile = await xedo.marketplace.retrieve(); // payment config, business category…
98
+ const areas = await xedo.deliveryAreas.list(); // use area.id as delivery.deliveryAreaId
99
+ ```
100
+
70
101
  ### Checkout
71
102
 
72
103
  ```ts
package/dist/index.cjs CHANGED
@@ -150,8 +150,8 @@ async function* paginate(fetchPage, params) {
150
150
  // src/resources/carts.ts
151
151
  var Carts = class extends Resource {
152
152
  /**
153
- * `GET /v1/carts` — one page of carts. `DRAFT` carts are never exposed by
154
- * the API.
153
+ * `GET /v1/carts` — one page of carts (summary rows). `DRAFT` carts are
154
+ * never exposed by the API.
155
155
  */
156
156
  list(params = {}) {
157
157
  return this.transport.getPage("/v1/carts", {
@@ -159,7 +159,7 @@ var Carts = class extends Resource {
159
159
  signal: params.signal
160
160
  });
161
161
  }
162
- /** Async iterator over every cart across all pages. */
162
+ /** Async iterator over every cart (summary row) across all pages. */
163
163
  listAll(params = {}) {
164
164
  return paginate((p) => this.list(p), params);
165
165
  }
@@ -203,6 +203,10 @@ var Carts = class extends Resource {
203
203
  * the payment provider could not be reached (`PAYMENT_INIT_FAILED`), retry
204
204
  * `pay()` once with the same `returnUrl`. Stays transparent — it logs the
205
205
  * code and never swallows a definitive failure.
206
+ *
207
+ * Returns a {@link CheckoutResult} on the happy path, or a
208
+ * {@link CheckoutRetryResult} when the retry succeeded — both carry
209
+ * `checkoutUrl` and `payment`.
206
210
  */
207
211
  async createAndPay(input, opts = {}) {
208
212
  try {
@@ -250,16 +254,42 @@ var Collections = class extends Resource {
250
254
  }
251
255
  };
252
256
 
257
+ // src/resources/delivery-areas.ts
258
+ var DeliveryAreas = class extends Resource {
259
+ /**
260
+ * `GET /v1/delivery-areas` — every delivery area configured by the merchant.
261
+ * Use a returned `id` as `delivery.deliveryAreaId` when creating a cart.
262
+ */
263
+ list(opts = {}) {
264
+ return this.transport.getData("GET", "/v1/delivery-areas", {
265
+ signal: opts.signal
266
+ });
267
+ }
268
+ };
269
+
270
+ // src/resources/marketplace.ts
271
+ var Marketplace = class extends Resource {
272
+ /**
273
+ * `GET /v1/marketplace` — the merchant's marketplace profile: enabled
274
+ * payment methods, split-payment configuration, business category, …
275
+ */
276
+ retrieve(opts = {}) {
277
+ return this.transport.getData("GET", "/v1/marketplace", {
278
+ signal: opts.signal
279
+ });
280
+ }
281
+ };
282
+
253
283
  // src/resources/orders.ts
254
284
  var Orders = class extends Resource {
255
- /** `GET /v1/orders` — one page of paid orders. */
285
+ /** `GET /v1/orders` — one page of paid orders (summary rows). */
256
286
  list(params = {}) {
257
287
  return this.transport.getPage("/v1/orders", {
258
288
  query: toListQuery(params),
259
289
  signal: params.signal
260
290
  });
261
291
  }
262
- /** Async iterator over every order across all pages. */
292
+ /** Async iterator over every order (summary row) across all pages. */
263
293
  listAll(params = {}) {
264
294
  return paginate((p) => this.list(p), params);
265
295
  }
@@ -499,7 +529,8 @@ var Xedo = class {
499
529
  collections;
500
530
  orders;
501
531
  carts;
502
- apiKey;
532
+ deliveryAreas;
533
+ marketplace;
503
534
  transport;
504
535
  constructor(options) {
505
536
  if (!options?.apiKey) {
@@ -515,7 +546,7 @@ var Xedo = class {
515
546
  throw new XedoError({
516
547
  code: "BROWSER_ENV_DETECTED",
517
548
  status: 0,
518
- 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."
519
550
  });
520
551
  }
521
552
  const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
@@ -526,7 +557,6 @@ var Xedo = class {
526
557
  message: "Global fetch is unavailable (Node >= 18 required) \u2014 pass `options.fetch`."
527
558
  });
528
559
  }
529
- this.apiKey = options.apiKey;
530
560
  this.transport = new Transport({
531
561
  apiKey: options.apiKey,
532
562
  baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
@@ -538,15 +568,8 @@ var Xedo = class {
538
568
  this.collections = new Collections(this.transport);
539
569
  this.orders = new Orders(this.transport);
540
570
  this.carts = new Carts(this.transport);
541
- }
542
- /**
543
- * The environment inferred from the key prefix. The rest of the key is
544
- * treated as opaque.
545
- */
546
- get environment() {
547
- if (this.apiKey.startsWith("xdk_live_")) return "live";
548
- if (this.apiKey.startsWith("xdk_test_")) return "test";
549
- return "unknown";
571
+ this.deliveryAreas = new DeliveryAreas(this.transport);
572
+ this.marketplace = new Marketplace(this.transport);
550
573
  }
551
574
  /** Rate-limit headers from the most recent response, for monitoring. */
552
575
  get 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/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 PingResult,\n Product,\n Collection,\n Order,\n Cart,\n CheckoutPreview,\n CheckoutResult,\n ListParams,\n ProductListParams,\n CollectionListParams,\n OrderListParams,\n CartListParams,\n RetrieveOptions,\n RequestOptions,\n PaginatedResult,\n RateLimitInfo,\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 CartListParams,\n CheckoutCreateInput,\n CheckoutPreview,\n CheckoutPreviewInput,\n CheckoutResult,\n CheckoutRetryPayInput,\n PaginatedResult,\n RequestOptions,\n} from '../types/public';\n\nexport class Carts extends Resource {\n /**\n * `GET /v1/carts` — one page of carts. `DRAFT` carts are never exposed by\n * the API.\n */\n list(params: CartListParams = {}): Promise<PaginatedResult<Cart>> {\n return this.transport.getPage<Cart>('/v1/carts', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every cart across all pages. */\n listAll(params: CartListParams = {}): AsyncGenerator<Cart> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/carts/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Cart> {\n return this.transport.getData<Cart>('GET', `/v1/carts/${encodeURIComponent(publicId)}`, {\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/carts/preview` — compute totals without persisting anything. */\n preview(input: CheckoutPreviewInput, opts: RequestOptions = {}): Promise<CheckoutPreview> {\n return this.transport.getData<CheckoutPreview>('POST', '/v1/carts/preview', {\n body: input,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/carts` — create the cart (`PENDING_PAYMENT`) and return\n * `data.checkoutUrl`. On a `502 PAYMENT_INIT_FAILED` the cart is kept; retry\n * the payment with {@link Carts.pay} (or use {@link Carts.createAndPay}).\n */\n create(input: CheckoutCreateInput, opts: RequestOptions = {}): Promise<CheckoutResult> {\n return this.transport.getData<CheckoutResult>('POST', '/v1/carts', {\n body: input,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/carts/{publicId}/pay` — relaunch payment initialization after a\n * `502 PAYMENT_INIT_FAILED`.\n */\n pay(publicId: string, input: CheckoutRetryPayInput, opts: RequestOptions = {}): Promise<CheckoutResult> {\n return this.transport.getData<CheckoutResult>(\n 'POST',\n `/v1/carts/${encodeURIComponent(publicId)}/pay`,\n { body: input, signal: opts.signal },\n );\n }\n\n /**\n * Convenience wrapper around the 502 checkout flow: create the cart, and if\n * the payment provider could not be reached (`PAYMENT_INIT_FAILED`), retry\n * `pay()` once with the same `returnUrl`. Stays transparent — it logs the\n * code and never swallows a definitive failure.\n */\n async createAndPay(input: CheckoutCreateInput, opts: RequestOptions = {}): Promise<CheckoutResult> {\n try {\n return await this.create(input, opts);\n } catch (err) {\n if (err instanceof XedoPaymentInitError && err.cartPublicId) {\n console.warn(\n `[xedo] PAYMENT_INIT_FAILED for cart ${err.cartPublicId}; retrying once via pay().`,\n );\n return this.pay(err.cartPublicId, { returnUrl: input.returnUrl }, opts);\n }\n throw err;\n }\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { Collection, CollectionListParams, PaginatedResult, RequestOptions } from '../types/public';\n\nexport class Collections extends Resource {\n /** `GET /v1/collections` — one page of collections. */\n list(params: CollectionListParams = {}): Promise<PaginatedResult<Collection>> {\n return this.transport.getPage<Collection>('/v1/collections', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every collection across all pages. */\n listAll(params: CollectionListParams = {}): AsyncGenerator<Collection> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/collections/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Collection> {\n return this.transport.getData<Collection>(\n 'GET',\n `/v1/collections/${encodeURIComponent(publicId)}`,\n { signal: opts.signal },\n );\n }\n\n /** `GET /v1/collections/by-slug/{slug}`. */\n retrieveBySlug(slug: string, opts: RequestOptions = {}): Promise<Collection> {\n return this.transport.getData<Collection>(\n 'GET',\n `/v1/collections/by-slug/${encodeURIComponent(slug)}`,\n { signal: opts.signal },\n );\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { Order, OrderListParams, PaginatedResult, RequestOptions } from '../types/public';\n\nexport class Orders extends Resource {\n /** `GET /v1/orders` — one page of paid orders. */\n list(params: OrderListParams = {}): Promise<PaginatedResult<Order>> {\n return this.transport.getPage<Order>('/v1/orders', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every order across all pages. */\n listAll(params: OrderListParams = {}): AsyncGenerator<Order> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/orders/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Order> {\n return this.transport.getData<Order>('GET', `/v1/orders/${encodeURIComponent(publicId)}`, {\n signal: opts.signal,\n });\n }\n\n /**\n * `GET /v1/orders/{publicId}/invoice` — the invoice PDF as a binary\n * `ArrayBuffer` (not JSON). Throws {@link XedoNotFoundError} if the invoice\n * has not been generated yet.\n */\n invoice(publicId: string, opts: RequestOptions = {}): Promise<ArrayBuffer> {\n return this.transport.getBinary('GET', `/v1/orders/${encodeURIComponent(publicId)}/invoice`, {\n accept: 'application/pdf',\n signal: opts.signal,\n });\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { PaginatedResult, Product, ProductListParams, RetrieveOptions } from '../types/public';\n\nexport class Products extends Resource {\n /** `GET /v1/products` — one page of products. */\n list(params: ProductListParams = {}): Promise<PaginatedResult<Product>> {\n return this.transport.getPage<Product>('/v1/products', {\n query: {\n ...toListQuery(params),\n collection: params.collection,\n includeVariations: params.includeVariations,\n includeDisabled: params.includeDisabled,\n },\n signal: params.signal,\n });\n }\n\n /** Async iterator over every product across all pages. */\n listAll(params: ProductListParams = {}): AsyncGenerator<Product> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/products/{publicId}`. */\n retrieve(publicId: string, opts: RetrieveOptions = {}): Promise<Product> {\n return this.transport.getData<Product>('GET', `/v1/products/${encodeURIComponent(publicId)}`, {\n query: { includeDisabled: opts.includeDisabled },\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/products/by-slug/{slug}`. */\n retrieveBySlug(slug: string, opts: RetrieveOptions = {}): Promise<Product> {\n return this.transport.getData<Product>('GET', `/v1/products/by-slug/${encodeURIComponent(slug)}`, {\n query: { includeDisabled: opts.includeDisabled },\n signal: opts.signal,\n });\n }\n}\n","import { createXedoError, XedoConnectionError, type XedoErrorParams } from './errors';\nimport type { PaginatedResult, RateLimitInfo } from './types/public';\n\nexport type FetchLike = (\n input: string | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl: string;\n maxRetries: number;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}\n\nexport interface RequestConfig {\n query?: Record<string, unknown>;\n body?: unknown;\n signal?: AbortSignal;\n /** Accept header; defaults to `application/json`. */\n accept?: string;\n}\n\ntype HttpMethod = 'GET' | 'POST';\n\ninterface Envelope {\n success: boolean;\n code?: string;\n message?: string;\n errors?: Record<string, string[]>;\n data?: unknown;\n total?: number;\n start?: number;\n end?: number;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error('Aborted'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal?.reason ?? new Error('Aborted'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction parseHeaderInt(value: string | null): number | null {\n if (value == null) return null;\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\n/**\n * Owns the HTTP concern: auth header, query/body serialization, per-request\n * timeout + abort, automatic 429 retries, envelope parsing and error mapping.\n * Resources sit on top and never touch `fetch` directly.\n */\nexport class Transport {\n lastRateLimit: RateLimitInfo | null = null;\n\n constructor(private readonly opts: TransportOptions) {}\n\n // --- Public helpers used by resources --------------------------------------\n\n /** Run a request and return the unwrapped `data` payload, typed as `T`. */\n async getData<T>(method: HttpMethod, path: string, config: RequestConfig = {}): Promise<T> {\n const env = await this.requestJson(method, path, config);\n return env.data as T;\n }\n\n /** Run a GET list request and return `{ data, total, start, end }`. */\n async getPage<T>(path: string, config: RequestConfig = {}): Promise<PaginatedResult<T>> {\n const env = await this.requestJson('GET', path, config);\n return {\n data: (env.data as T[]) ?? [],\n total: env.total ?? 0,\n start: env.start ?? 0,\n end: env.end ?? 0,\n };\n }\n\n /** Run a request that returns a binary body (e.g. the invoice PDF). */\n async getBinary(method: HttpMethod, path: string, config: RequestConfig = {}): Promise<ArrayBuffer> {\n const res = await this.execute(method, path, config);\n if (!res.ok) {\n throw this.toError(res, await this.tryParseJson(res));\n }\n return res.arrayBuffer();\n }\n\n // --- Internals -------------------------------------------------------------\n\n private async requestJson(method: HttpMethod, path: string, config: RequestConfig): Promise<Envelope> {\n const res = await this.execute(method, path, config);\n const body = await this.tryParseJson(res);\n if (!res.ok || body?.success === false) {\n throw this.toError(res, body);\n }\n if (!body) {\n throw new XedoConnectionError({\n code: 'INVALID_RESPONSE',\n status: res.status,\n message: 'Expected a JSON response body but received none.',\n });\n }\n return body;\n }\n\n private async tryParseJson(res: Response): Promise<Envelope | undefined> {\n const text = await res.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text) as Envelope;\n } catch {\n return undefined;\n }\n }\n\n private toError(res: Response, body: Envelope | undefined): Error {\n const retryAfter = parseHeaderInt(res.headers.get('retry-after'));\n const params: XedoErrorParams = {\n code: body?.code ?? `HTTP_${res.status}`,\n message: body?.message ?? res.statusText ?? 'Request failed',\n status: res.status,\n errors: body?.errors,\n data: body?.data,\n requestId: res.headers.get('x-request-id') ?? undefined,\n retryAfter: retryAfter ?? undefined,\n };\n return createXedoError(params);\n }\n\n /** Fetch with retry on 429; returns the final {@link Response}. */\n private async execute(method: HttpMethod, path: string, config: RequestConfig): Promise<Response> {\n const url = this.buildUrl(path, config.query);\n let attempt = 0;\n for (;;) {\n const res = await this.fetchOnce(method, url, config);\n this.captureRateLimit(res);\n if (res.status === 429 && attempt < this.opts.maxRetries) {\n await sleep(this.retryDelayMs(res, attempt), config.signal);\n attempt += 1;\n continue;\n }\n return res;\n }\n }\n\n private async fetchOnce(method: HttpMethod, url: URL, config: RequestConfig): Promise<Response> {\n const controller = new AbortController();\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.opts.timeoutMs);\n\n const userSignal = config.signal;\n const onUserAbort = () => controller.abort();\n if (userSignal) {\n if (userSignal.aborted) controller.abort();\n else userSignal.addEventListener('abort', onUserAbort, { once: true });\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.opts.apiKey}`,\n Accept: config.accept ?? 'application/json',\n };\n let body: string | undefined;\n if (config.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(config.body);\n }\n\n try {\n return await this.opts.fetchImpl(url, { method, headers, body, signal: controller.signal });\n } catch (err) {\n if (timedOut) {\n throw new XedoConnectionError({\n code: 'TIMEOUT',\n status: 0,\n message: `Request to ${url.pathname} timed out after ${this.opts.timeoutMs}ms.`,\n });\n }\n // Genuine user-initiated cancellation: surface it untouched.\n if (userSignal?.aborted) throw err;\n throw new XedoConnectionError({\n code: 'CONNECTION_ERROR',\n status: 0,\n message: err instanceof Error ? err.message : 'Network request failed.',\n });\n } finally {\n clearTimeout(timer);\n userSignal?.removeEventListener('abort', onUserAbort);\n }\n }\n\n private buildUrl(path: string, query: Record<string, unknown> | undefined): URL {\n const url = new URL(this.opts.baseUrl.replace(/\\/+$/, '') + path);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url;\n }\n\n private captureRateLimit(res: Response): void {\n const limit = parseHeaderInt(res.headers.get('x-ratelimit-limit'));\n const remaining = parseHeaderInt(res.headers.get('x-ratelimit-remaining'));\n const reset = parseHeaderInt(res.headers.get('x-ratelimit-reset'));\n if (limit === null && remaining === null && reset === null) return;\n this.lastRateLimit = { limit, remaining, reset };\n }\n\n private retryDelayMs(res: Response, attempt: number): number {\n const retryAfter = parseHeaderInt(res.headers.get('retry-after'));\n if (retryAfter !== null) return retryAfter * 1000;\n // Exponential backoff with jitter: 500ms, 1s, 2s, … capped at 8s.\n const base = Math.min(8000, 500 * 2 ** attempt);\n return base + Math.random() * base * 0.25;\n }\n}\n","import { XedoConnectionError, XedoError } from './errors';\nimport { Carts } from './resources/carts';\nimport { Collections } from './resources/collections';\nimport { Orders } from './resources/orders';\nimport { Products } from './resources/products';\nimport { Transport, type FetchLike } from './transport';\nimport type { PingResult, RateLimitInfo, RequestOptions } from './types/public';\n\nconst DEFAULT_BASE_URL = 'https://systems.xedoapp.com/marketplace';\nconst DEFAULT_MAX_RETRIES = 4;\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport interface XedoOptions {\n /** Developer API key: `xdk_live_…` or `xdk_test_…`. */\n apiKey: string;\n /** Override the API base URL. Defaults to the production marketplace URL. */\n baseUrl?: string;\n /** Max automatic retries on `429`. Defaults to 4. */\n maxRetries?: number;\n /** Per-request timeout in milliseconds. Defaults to 30000. */\n timeoutMs?: number;\n /** Inject a custom fetch (tests, edge runtimes). Defaults to global fetch. */\n fetch?: FetchLike;\n /**\n * Escape hatch to run in a browser. Strongly discouraged: your\n * `xdk_live_…` key would be exposed in the client bundle.\n */\n dangerouslyAllowBrowser?: boolean;\n}\n\n/**\n * The Xedo Developer API client. Server-side only — see\n * `dangerouslyAllowBrowser`.\n *\n * ```ts\n * const xedo = new Xedo({ apiKey: process.env.XEDO_API_KEY! });\n * const { data } = await xedo.products.list({ perPage: 20 });\n * ```\n */\nexport class Xedo {\n readonly products: Products;\n readonly collections: Collections;\n readonly orders: Orders;\n readonly carts: Carts;\n\n private readonly apiKey: string;\n private readonly transport: Transport;\n\n constructor(options: XedoOptions) {\n if (!options?.apiKey) {\n throw new XedoError({\n code: 'MISSING_DEVELOPER_API_KEY',\n status: 0,\n message: 'A Xedo `apiKey` is required.',\n });\n }\n\n const maybeWindow = (globalThis as { window?: { document?: unknown } }).window;\n const isBrowser = typeof maybeWindow !== 'undefined' && typeof maybeWindow.document !== 'undefined';\n if (isBrowser && !options.dangerouslyAllowBrowser) {\n throw new XedoError({\n code: 'BROWSER_ENV_DETECTED',\n status: 0,\n message:\n 'The Xedo SDK is server-side only: running it in a browser would expose your ' +\n 'xdk_live_… key in the client bundle. Call it from a server (Next.js Server ' +\n 'Component / Route Handler, Express, a worker, …). See the README on authentication.',\n });\n }\n\n const fetchImpl: FetchLike =\n options.fetch ?? ((input, init) => globalThis.fetch(input, init));\n if (typeof globalThis.fetch !== 'function' && !options.fetch) {\n throw new XedoConnectionError({\n code: 'NO_FETCH',\n status: 0,\n message: 'Global fetch is unavailable (Node >= 18 required) — pass `options.fetch`.',\n });\n }\n\n this.apiKey = options.apiKey;\n this.transport = new Transport({\n apiKey: options.apiKey,\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n fetchImpl,\n });\n\n this.products = new Products(this.transport);\n this.collections = new Collections(this.transport);\n this.orders = new Orders(this.transport);\n this.carts = new Carts(this.transport);\n }\n\n /**\n * The environment inferred from the key prefix. The rest of the key is\n * treated as opaque.\n */\n get environment(): 'test' | 'live' | 'unknown' {\n if (this.apiKey.startsWith('xdk_live_')) return 'live';\n if (this.apiKey.startsWith('xdk_test_')) return 'test';\n return 'unknown';\n }\n\n /** Rate-limit headers from the most recent response, for monitoring. */\n get lastRateLimit(): RateLimitInfo | null {\n return this.transport.lastRateLimit;\n }\n\n /** `GET /v1/ping` — validate the API key end to end. */\n ping(opts: RequestOptions = {}): Promise<PingResult> {\n return this.transport.getData<PingResult>('GET', '/v1/ping', { signal: opts.signal });\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/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":[]}