@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 +21 -4
- package/dist/index.cjs +1 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -9
- package/dist/index.d.ts +7 -9
- package/dist/index.js +1 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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! }); //
|
|
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 `
|
|
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
|
|
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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: `
|
|
1019
|
+
/** Developer API key: an opaque `xdk_…` string. */
|
|
1020
1020
|
apiKey: string;
|
|
1021
|
-
/**
|
|
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
|
-
* `
|
|
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: `
|
|
1019
|
+
/** Developer API key: an opaque `xdk_…` string. */
|
|
1020
1020
|
apiKey: string;
|
|
1021
|
-
/**
|
|
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
|
-
* `
|
|
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
|
|
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":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/resources/base.ts","../src/resources/carts.ts","../src/resources/collections.ts","../src/resources/delivery-areas.ts","../src/resources/marketplace.ts","../src/resources/orders.ts","../src/resources/products.ts","../src/transport.ts","../src/client.ts"],"sourcesContent":["/**\n * Typed error hierarchy. Every `success: false` response (and every transport\n * failure) is thrown as a {@link XedoError} or one of its subclasses. Route on\n * `error.code` (stable, machine-readable), never on `error.message` (French,\n * subject to change).\n */\n\nexport interface XedoErrorParams {\n message: string;\n /** Machine-readable code, e.g. \"PRODUCT_NOT_FOUND\". */\n code: string;\n /** HTTP status (0 for transport/connection errors). */\n status: number;\n /** Per-field validation details. */\n errors?: Record<string, string[]>;\n /** Extra context (e.g. `cartPublicId` on PAYMENT_INIT_FAILED). */\n data?: unknown;\n /** Request id, when the API returns one. */\n requestId?: string;\n /** `Retry-After` value in seconds, when present. */\n retryAfter?: number;\n}\n\nexport class XedoError extends Error {\n readonly code: string;\n readonly status: number;\n readonly errors?: Record<string, string[]>;\n readonly data?: unknown;\n readonly requestId?: string;\n\n constructor(params: XedoErrorParams) {\n super(params.message);\n // Keep the concrete subclass name on instances created via `new.target`.\n this.name = new.target.name;\n this.code = params.code;\n this.status = params.status;\n this.errors = params.errors;\n this.data = params.data;\n this.requestId = params.requestId;\n // Restore the prototype chain for `instanceof` under transpiled targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 — `MISSING_DEVELOPER_API_KEY`, `INVALID_DEVELOPER_API_KEY`. */\nexport class XedoAuthError extends XedoError {}\n\n/** 400 — bad request / invalid payment configuration. */\nexport class XedoValidationError extends XedoError {}\n\n/** 404 — product, combination, delivery area, cart or generic not found. */\nexport class XedoNotFoundError extends XedoError {}\n\n/** 422 — `INSUFFICIENT_STOCK` (per-product detail in `errors`). */\nexport class XedoStockError extends XedoError {}\n\n/** 409 — `CART_NOT_RETRYABLE`. */\nexport class XedoConflictError extends XedoError {}\n\n/** 429 — `RATE_LIMITED`. Exposes `retryAfter` (seconds). */\nexport class XedoRateLimitError extends XedoError {\n readonly retryAfter?: number;\n constructor(params: XedoErrorParams) {\n super(params);\n this.retryAfter = params.retryAfter;\n }\n}\n\n/**\n * 502 — `PAYMENT_INIT_FAILED`. The cart was kept; relaunch the payment via\n * `xedo.carts.pay(cartPublicId, …)`. Exposes `cartPublicId`.\n */\nexport class XedoPaymentInitError extends XedoError {\n readonly cartPublicId?: string;\n constructor(params: XedoErrorParams) {\n super(params);\n const data = params.data as { cartPublicId?: string } | undefined;\n this.cartPublicId = data?.cartPublicId;\n }\n}\n\n/** Transport-level failure (timeout, network, malformed response). */\nexport class XedoConnectionError extends XedoError {}\n\nconst CODE_MAP: Record<string, new (p: XedoErrorParams) => XedoError> = {\n MISSING_DEVELOPER_API_KEY: XedoAuthError,\n INVALID_DEVELOPER_API_KEY: XedoAuthError,\n BAD_REQUEST: XedoValidationError,\n INVALID_PAYMENT_METHOD: XedoValidationError,\n SPLIT_PAYMENT_NOT_ENABLED: XedoValidationError,\n COMBINATION_PRODUCT_MISMATCH: XedoValidationError,\n PRODUCT_NOT_FOUND: XedoNotFoundError,\n COMBINATION_NOT_FOUND: XedoNotFoundError,\n DELIVERY_AREA_NOT_FOUND: XedoNotFoundError,\n CART_NOT_FOUND: XedoNotFoundError,\n NOT_FOUND: XedoNotFoundError,\n INSUFFICIENT_STOCK: XedoStockError,\n CART_NOT_RETRYABLE: XedoConflictError,\n RATE_LIMITED: XedoRateLimitError,\n PAYMENT_INIT_FAILED: XedoPaymentInitError,\n};\n\nfunction fallbackByStatus(status: number): new (p: XedoErrorParams) => XedoError {\n switch (status) {\n case 400:\n return XedoValidationError;\n case 401:\n return XedoAuthError;\n case 404:\n return XedoNotFoundError;\n case 409:\n return XedoConflictError;\n case 422:\n return XedoStockError;\n case 429:\n return XedoRateLimitError;\n case 502:\n return XedoPaymentInitError;\n default:\n return XedoError;\n }\n}\n\n/** Build the most specific {@link XedoError} subclass for a failed response. */\nexport function createXedoError(params: XedoErrorParams): XedoError {\n const Ctor = CODE_MAP[params.code] ?? fallbackByStatus(params.status);\n return new Ctor(params);\n}\n","import type { Transport } from '../transport';\nimport type { ListParams, PaginatedResult } from '../types/public';\n\nexport abstract class Resource {\n constructor(protected readonly transport: Transport) {}\n}\n\n/** Map the SDK's camelCase list params to the API's wire query keys. */\nexport function toListQuery(params: ListParams): Record<string, unknown> {\n return {\n page: params.page,\n per_page: params.perPage,\n _sort: (params as { sort?: string }).sort,\n _order: params.order,\n search: params.search,\n };\n}\n\n/**\n * Walk every page of a list endpoint, yielding items one by one. Defaults to a\n * large page size to minimise round-trips; the transport's 429 retry provides\n * the throughput guard.\n */\nexport async function* paginate<T, P extends ListParams>(\n fetchPage: (params: P) => Promise<PaginatedResult<T>>,\n params: P,\n): AsyncGenerator<T> {\n let page = params.page ?? 1;\n const perPage = params.perPage ?? 100;\n for (;;) {\n const result = await fetchPage({ ...params, page, perPage });\n for (const item of result.data) yield item;\n if (result.data.length === 0 || result.end >= result.total) break;\n page += 1;\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport { XedoPaymentInitError } from '../errors';\nimport type {\n Cart,\n CartListItem,\n CartListParams,\n CheckoutCreateInput,\n CheckoutPreview,\n CheckoutPreviewInput,\n CheckoutResult,\n CheckoutRetryPayInput,\n CheckoutRetryResult,\n PaginatedResult,\n RequestOptions,\n} from '../types/public';\n\nexport class Carts extends Resource {\n /**\n * `GET /v1/carts` — one page of carts (summary rows). `DRAFT` carts are\n * never exposed by the API.\n */\n list(params: CartListParams = {}): Promise<PaginatedResult<CartListItem>> {\n return this.transport.getPage<CartListItem>('/v1/carts', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every cart (summary row) across all pages. */\n listAll(params: CartListParams = {}): AsyncGenerator<CartListItem> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/carts/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Cart> {\n return this.transport.getData<Cart>('GET', `/v1/carts/${encodeURIComponent(publicId)}`, {\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/carts/preview` — compute totals without persisting anything. */\n preview(input: CheckoutPreviewInput, opts: RequestOptions = {}): Promise<CheckoutPreview> {\n return this.transport.getData<CheckoutPreview>('POST', '/v1/carts/preview', {\n body: input,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/carts` — create the cart (`PENDING_PAYMENT`) and return\n * `data.checkoutUrl`. On a `502 PAYMENT_INIT_FAILED` the cart is kept; retry\n * the payment with {@link Carts.pay} (or use {@link Carts.createAndPay}).\n */\n create(input: CheckoutCreateInput, opts: RequestOptions = {}): Promise<CheckoutResult> {\n return this.transport.getData<CheckoutResult>('POST', '/v1/carts', {\n body: input,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/carts/{publicId}/pay` — relaunch payment initialization after a\n * `502 PAYMENT_INIT_FAILED`.\n */\n pay(publicId: string, input: CheckoutRetryPayInput, opts: RequestOptions = {}): Promise<CheckoutRetryResult> {\n return this.transport.getData<CheckoutRetryResult>(\n 'POST',\n `/v1/carts/${encodeURIComponent(publicId)}/pay`,\n { body: input, signal: opts.signal },\n );\n }\n\n /**\n * Convenience wrapper around the 502 checkout flow: create the cart, and if\n * the payment provider could not be reached (`PAYMENT_INIT_FAILED`), retry\n * `pay()` once with the same `returnUrl`. Stays transparent — it logs the\n * code and never swallows a definitive failure.\n *\n * Returns a {@link CheckoutResult} on the happy path, or a\n * {@link CheckoutRetryResult} when the retry succeeded — both carry\n * `checkoutUrl` and `payment`.\n */\n async createAndPay(\n input: CheckoutCreateInput,\n opts: RequestOptions = {},\n ): Promise<CheckoutResult | CheckoutRetryResult> {\n try {\n return await this.create(input, opts);\n } catch (err) {\n if (err instanceof XedoPaymentInitError && err.cartPublicId) {\n console.warn(\n `[xedo] PAYMENT_INIT_FAILED for cart ${err.cartPublicId}; retrying once via pay().`,\n );\n return this.pay(err.cartPublicId, { returnUrl: input.returnUrl }, opts);\n }\n throw err;\n }\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { Collection, CollectionListParams, PaginatedResult, RequestOptions } from '../types/public';\n\nexport class Collections extends Resource {\n /** `GET /v1/collections` — one page of collections. */\n list(params: CollectionListParams = {}): Promise<PaginatedResult<Collection>> {\n return this.transport.getPage<Collection>('/v1/collections', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every collection across all pages. */\n listAll(params: CollectionListParams = {}): AsyncGenerator<Collection> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/collections/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Collection> {\n return this.transport.getData<Collection>(\n 'GET',\n `/v1/collections/${encodeURIComponent(publicId)}`,\n { signal: opts.signal },\n );\n }\n\n /** `GET /v1/collections/by-slug/{slug}`. */\n retrieveBySlug(slug: string, opts: RequestOptions = {}): Promise<Collection> {\n return this.transport.getData<Collection>(\n 'GET',\n `/v1/collections/by-slug/${encodeURIComponent(slug)}`,\n { signal: opts.signal },\n );\n }\n}\n","import { Resource } from './base';\nimport type { DeliveryArea, RequestOptions } from '../types/public';\n\nexport class DeliveryAreas extends Resource {\n /**\n * `GET /v1/delivery-areas` — every delivery area configured by the merchant.\n * Use a returned `id` as `delivery.deliveryAreaId` when creating a cart.\n */\n list(opts: RequestOptions = {}): Promise<DeliveryArea[]> {\n return this.transport.getData<DeliveryArea[]>('GET', '/v1/delivery-areas', {\n signal: opts.signal,\n });\n }\n}\n","import { Resource } from './base';\nimport type { MarketplaceProfile, RequestOptions } from '../types/public';\n\nexport class Marketplace extends Resource {\n /**\n * `GET /v1/marketplace` — the merchant's marketplace profile: enabled\n * payment methods, split-payment configuration, business category, …\n */\n retrieve(opts: RequestOptions = {}): Promise<MarketplaceProfile> {\n return this.transport.getData<MarketplaceProfile>('GET', '/v1/marketplace', {\n signal: opts.signal,\n });\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { Order, OrderListItem, OrderListParams, PaginatedResult, RequestOptions } from '../types/public';\n\nexport class Orders extends Resource {\n /** `GET /v1/orders` — one page of paid orders (summary rows). */\n list(params: OrderListParams = {}): Promise<PaginatedResult<OrderListItem>> {\n return this.transport.getPage<OrderListItem>('/v1/orders', {\n query: toListQuery(params),\n signal: params.signal,\n });\n }\n\n /** Async iterator over every order (summary row) across all pages. */\n listAll(params: OrderListParams = {}): AsyncGenerator<OrderListItem> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/orders/{publicId}`. */\n retrieve(publicId: string, opts: RequestOptions = {}): Promise<Order> {\n return this.transport.getData<Order>('GET', `/v1/orders/${encodeURIComponent(publicId)}`, {\n signal: opts.signal,\n });\n }\n\n /**\n * `GET /v1/orders/{publicId}/invoice` — the invoice PDF as a binary\n * `ArrayBuffer` (not JSON). Throws {@link XedoNotFoundError} if the invoice\n * has not been generated yet.\n */\n invoice(publicId: string, opts: RequestOptions = {}): Promise<ArrayBuffer> {\n return this.transport.getBinary('GET', `/v1/orders/${encodeURIComponent(publicId)}/invoice`, {\n accept: 'application/pdf',\n signal: opts.signal,\n });\n }\n}\n","import { paginate, Resource, toListQuery } from './base';\nimport type { PaginatedResult, Product, ProductListParams, RetrieveOptions } from '../types/public';\n\nexport class Products extends Resource {\n /** `GET /v1/products` — one page of products. */\n list(params: ProductListParams = {}): Promise<PaginatedResult<Product>> {\n return this.transport.getPage<Product>('/v1/products', {\n query: {\n ...toListQuery(params),\n collection: params.collection,\n includeVariations: params.includeVariations,\n includeDisabled: params.includeDisabled,\n },\n signal: params.signal,\n });\n }\n\n /** Async iterator over every product across all pages. */\n listAll(params: ProductListParams = {}): AsyncGenerator<Product> {\n return paginate((p) => this.list(p), params);\n }\n\n /** `GET /v1/products/{publicId}`. */\n retrieve(publicId: string, opts: RetrieveOptions = {}): Promise<Product> {\n return this.transport.getData<Product>('GET', `/v1/products/${encodeURIComponent(publicId)}`, {\n query: { includeDisabled: opts.includeDisabled },\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/products/by-slug/{slug}`. */\n retrieveBySlug(slug: string, opts: RetrieveOptions = {}): Promise<Product> {\n return this.transport.getData<Product>('GET', `/v1/products/by-slug/${encodeURIComponent(slug)}`, {\n query: { includeDisabled: opts.includeDisabled },\n signal: opts.signal,\n });\n }\n}\n","import { createXedoError, XedoConnectionError, type XedoErrorParams } from './errors';\nimport type { PaginatedResult, RateLimitInfo } from './types/public';\n\nexport type FetchLike = (\n input: string | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl: string;\n maxRetries: number;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}\n\nexport interface RequestConfig {\n query?: Record<string, unknown>;\n body?: unknown;\n signal?: AbortSignal;\n /** Accept header; defaults to `application/json`. */\n accept?: string;\n}\n\ntype HttpMethod = 'GET' | 'POST';\n\ninterface Envelope {\n success: boolean;\n code?: string;\n message?: string;\n errors?: Record<string, string[]>;\n data?: unknown;\n total?: number;\n start?: number;\n end?: number;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error('Aborted'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal?.reason ?? new Error('Aborted'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction parseHeaderInt(value: string | null): number | null {\n if (value == null) return null;\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\n/**\n * Owns the HTTP concern: auth header, query/body serialization, per-request\n * timeout + abort, automatic 429 retries, envelope parsing and error mapping.\n * Resources sit on top and never touch `fetch` directly.\n */\nexport class Transport {\n lastRateLimit: RateLimitInfo | null = null;\n\n constructor(private readonly opts: TransportOptions) {}\n\n // --- Public helpers used by resources --------------------------------------\n\n /** Run a request and return the unwrapped `data` payload, typed as `T`. */\n async getData<T>(method: HttpMethod, path: string, config: RequestConfig = {}): Promise<T> {\n const env = await this.requestJson(method, path, config);\n return env.data as T;\n }\n\n /** Run a GET list request and return `{ data, total, start, end }`. */\n async getPage<T>(path: string, config: RequestConfig = {}): Promise<PaginatedResult<T>> {\n const env = await this.requestJson('GET', path, config);\n return {\n data: (env.data as T[]) ?? [],\n total: env.total ?? 0,\n start: env.start ?? 0,\n end: env.end ?? 0,\n };\n }\n\n /** Run a request that returns a binary body (e.g. the invoice PDF). */\n async getBinary(method: HttpMethod, path: string, config: RequestConfig = {}): Promise<ArrayBuffer> {\n const res = await this.execute(method, path, config);\n if (!res.ok) {\n throw this.toError(res, await this.tryParseJson(res));\n }\n return res.arrayBuffer();\n }\n\n // --- Internals -------------------------------------------------------------\n\n private async requestJson(method: HttpMethod, path: string, config: RequestConfig): Promise<Envelope> {\n const res = await this.execute(method, path, config);\n const body = await this.tryParseJson(res);\n if (!res.ok || body?.success === false) {\n throw this.toError(res, body);\n }\n if (!body) {\n throw new XedoConnectionError({\n code: 'INVALID_RESPONSE',\n status: res.status,\n message: 'Expected a JSON response body but received none.',\n });\n }\n return body;\n }\n\n private async tryParseJson(res: Response): Promise<Envelope | undefined> {\n const text = await res.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text) as Envelope;\n } catch {\n return undefined;\n }\n }\n\n private toError(res: Response, body: Envelope | undefined): Error {\n const retryAfter = parseHeaderInt(res.headers.get('retry-after'));\n const params: XedoErrorParams = {\n code: body?.code ?? `HTTP_${res.status}`,\n message: body?.message ?? res.statusText ?? 'Request failed',\n status: res.status,\n errors: body?.errors,\n data: body?.data,\n requestId: res.headers.get('x-request-id') ?? undefined,\n retryAfter: retryAfter ?? undefined,\n };\n return createXedoError(params);\n }\n\n /** Fetch with retry on 429; returns the final {@link Response}. */\n private async execute(method: HttpMethod, path: string, config: RequestConfig): Promise<Response> {\n const url = this.buildUrl(path, config.query);\n let attempt = 0;\n for (;;) {\n const res = await this.fetchOnce(method, url, config);\n this.captureRateLimit(res);\n if (res.status === 429 && attempt < this.opts.maxRetries) {\n await sleep(this.retryDelayMs(res, attempt), config.signal);\n attempt += 1;\n continue;\n }\n return res;\n }\n }\n\n private async fetchOnce(method: HttpMethod, url: URL, config: RequestConfig): Promise<Response> {\n const controller = new AbortController();\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.opts.timeoutMs);\n\n const userSignal = config.signal;\n const onUserAbort = () => controller.abort();\n if (userSignal) {\n if (userSignal.aborted) controller.abort();\n else userSignal.addEventListener('abort', onUserAbort, { once: true });\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.opts.apiKey}`,\n Accept: config.accept ?? 'application/json',\n };\n let body: string | undefined;\n if (config.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(config.body);\n }\n\n try {\n return await this.opts.fetchImpl(url, { method, headers, body, signal: controller.signal });\n } catch (err) {\n if (timedOut) {\n throw new XedoConnectionError({\n code: 'TIMEOUT',\n status: 0,\n message: `Request to ${url.pathname} timed out after ${this.opts.timeoutMs}ms.`,\n });\n }\n // Genuine user-initiated cancellation: surface it untouched.\n if (userSignal?.aborted) throw err;\n throw new XedoConnectionError({\n code: 'CONNECTION_ERROR',\n status: 0,\n message: err instanceof Error ? err.message : 'Network request failed.',\n });\n } finally {\n clearTimeout(timer);\n userSignal?.removeEventListener('abort', onUserAbort);\n }\n }\n\n private buildUrl(path: string, query: Record<string, unknown> | undefined): URL {\n const url = new URL(this.opts.baseUrl.replace(/\\/+$/, '') + path);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url;\n }\n\n private captureRateLimit(res: Response): void {\n const limit = parseHeaderInt(res.headers.get('x-ratelimit-limit'));\n const remaining = parseHeaderInt(res.headers.get('x-ratelimit-remaining'));\n const reset = parseHeaderInt(res.headers.get('x-ratelimit-reset'));\n if (limit === null && remaining === null && reset === null) return;\n this.lastRateLimit = { limit, remaining, reset };\n }\n\n private retryDelayMs(res: Response, attempt: number): number {\n const retryAfter = parseHeaderInt(res.headers.get('retry-after'));\n if (retryAfter !== null) return retryAfter * 1000;\n // Exponential backoff with jitter: 500ms, 1s, 2s, … capped at 8s.\n const base = Math.min(8000, 500 * 2 ** attempt);\n return base + Math.random() * base * 0.25;\n }\n}\n","import { XedoConnectionError, XedoError } from './errors';\nimport { Carts } from './resources/carts';\nimport { Collections } from './resources/collections';\nimport { DeliveryAreas } from './resources/delivery-areas';\nimport { Marketplace } from './resources/marketplace';\nimport { Orders } from './resources/orders';\nimport { Products } from './resources/products';\nimport { Transport, type FetchLike } from './transport';\nimport type { PingResult, RateLimitInfo, RequestOptions } from './types/public';\n\nconst DEFAULT_BASE_URL = 'https://systems.xedoapp.com/marketplace';\nconst DEFAULT_MAX_RETRIES = 4;\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport interface XedoOptions {\n /** Developer API key: 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