@spree/sdk 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -30,9 +30,12 @@ function shouldRetryOnNetworkError(method, config) {
30
30
  if (!config.retryOnNetworkError) return false;
31
31
  return method === "GET" || method === "HEAD";
32
32
  }
33
- function createRequestFn(config, basePath, auth) {
33
+ function createRequestFn(config, basePath, auth, defaults) {
34
34
  return async function request(method, path, options = {}) {
35
- const { token, orderToken, locale, currency, country, headers = {}, body, params } = options;
35
+ const { token, orderToken, headers = {}, body, params } = options;
36
+ const locale = options.locale ?? defaults?.locale;
37
+ const currency = options.currency ?? defaults?.currency;
38
+ const country = options.country ?? defaults?.country;
36
39
  const url = new URL(`${config.baseUrl}${basePath}${path}`);
37
40
  if (params) {
38
41
  Object.entries(params).forEach(([key, value]) => {
@@ -108,6 +111,30 @@ function createRequestFn(config, basePath, auth) {
108
111
  };
109
112
  }
110
113
 
114
+ // src/params.ts
115
+ var PASSTHROUGH_KEYS = /* @__PURE__ */ new Set(["page", "per_page", "includes", "include", "sort"]);
116
+ function transformListParams(params) {
117
+ const result = {};
118
+ for (const [key, value] of Object.entries(params)) {
119
+ if (value === void 0) continue;
120
+ if (PASSTHROUGH_KEYS.has(key)) {
121
+ result[key] = Array.isArray(value) ? value.join(",") : value;
122
+ continue;
123
+ }
124
+ if (key.startsWith("q[")) {
125
+ result[key] = value;
126
+ continue;
127
+ }
128
+ if (Array.isArray(value)) {
129
+ const base = key.endsWith("[]") ? key.slice(0, -2) : key;
130
+ result[`q[${base}][]`] = value;
131
+ } else {
132
+ result[`q[${key}]`] = value;
133
+ }
134
+ }
135
+ return result;
136
+ }
137
+
111
138
  // src/store-client.ts
112
139
  var StoreClient = class {
113
140
  request;
@@ -149,7 +176,7 @@ var StoreClient = class {
149
176
  */
150
177
  list: (params, options) => this.request("GET", "/products", {
151
178
  ...options,
152
- params
179
+ params: params ? transformListParams(params) : void 0
153
180
  }),
154
181
  /**
155
182
  * Get a product by ID or slug
@@ -192,7 +219,7 @@ var StoreClient = class {
192
219
  */
193
220
  list: (params, options) => this.request("GET", "/taxons", {
194
221
  ...options,
195
- params
222
+ params: params ? transformListParams(params) : void 0
196
223
  }),
197
224
  /**
198
225
  * Get a taxon by ID or permalink
@@ -214,7 +241,7 @@ var StoreClient = class {
214
241
  `/taxons/${taxonId}/products`,
215
242
  {
216
243
  ...options,
217
- params
244
+ params: params ? transformListParams(params) : void 0
218
245
  }
219
246
  )
220
247
  }
@@ -299,11 +326,19 @@ var StoreClient = class {
299
326
  /**
300
327
  * Advance through all checkout steps
301
328
  */
302
- advance: (idOrNumber, options) => this.request("PATCH", `/orders/${idOrNumber}/advance`, options),
329
+ advance: (idOrNumber, options) => this.request(
330
+ "PATCH",
331
+ `/orders/${idOrNumber}/advance`,
332
+ options
333
+ ),
303
334
  /**
304
335
  * Complete the order
305
336
  */
306
- complete: (idOrNumber, options) => this.request("PATCH", `/orders/${idOrNumber}/complete`, options),
337
+ complete: (idOrNumber, options) => this.request(
338
+ "PATCH",
339
+ `/orders/${idOrNumber}/complete`,
340
+ options
341
+ ),
307
342
  /**
308
343
  * Add store credit to order
309
344
  */
@@ -314,7 +349,11 @@ var StoreClient = class {
314
349
  /**
315
350
  * Remove store credit from order
316
351
  */
317
- removeStoreCredit: (idOrNumber, options) => this.request("DELETE", `/orders/${idOrNumber}/store_credits`, options),
352
+ removeStoreCredit: (idOrNumber, options) => this.request(
353
+ "DELETE",
354
+ `/orders/${idOrNumber}/store_credits`,
355
+ options
356
+ ),
318
357
  /**
319
358
  * Nested resource: Line items
320
359
  */
@@ -569,7 +608,7 @@ var StoreClient = class {
569
608
  */
570
609
  list: (params, options) => this.request("GET", "/customer/orders", {
571
610
  ...options,
572
- params
611
+ params: params ? transformListParams(params) : void 0
573
612
  })
574
613
  },
575
614
  /**
@@ -683,9 +722,15 @@ var SpreeClient = class {
683
722
  store;
684
723
  /** Admin API — administrative endpoints (manage orders, products, settings) */
685
724
  admin;
725
+ _defaults;
686
726
  constructor(config) {
687
727
  const baseUrl = config.baseUrl.replace(/\/$/, "");
688
728
  const fetchFn = config.fetch || fetch.bind(globalThis);
729
+ this._defaults = {
730
+ locale: config.locale,
731
+ currency: config.currency,
732
+ country: config.country
733
+ };
689
734
  let retryConfig;
690
735
  if (config.retry === false) {
691
736
  retryConfig = false;
@@ -702,7 +747,8 @@ var SpreeClient = class {
702
747
  const storeRequestFn = createRequestFn(
703
748
  requestConfig,
704
749
  "/api/v3/store",
705
- { headerName: "x-spree-api-key", headerValue: config.publishableKey }
750
+ { headerName: "x-spree-api-key", headerValue: config.publishableKey },
751
+ this._defaults
706
752
  );
707
753
  const adminRequestFn = createRequestFn(
708
754
  requestConfig,
@@ -710,11 +756,24 @@ var SpreeClient = class {
710
756
  {
711
757
  headerName: "Authorization",
712
758
  headerValue: config.secretKey ? `Bearer ${config.secretKey}` : ""
713
- }
759
+ },
760
+ this._defaults
714
761
  );
715
762
  this.store = new StoreClient(storeRequestFn);
716
763
  this.admin = new AdminClient(adminRequestFn);
717
764
  }
765
+ /** Set default locale for all subsequent requests */
766
+ setLocale(locale) {
767
+ this._defaults.locale = locale;
768
+ }
769
+ /** Set default currency for all subsequent requests */
770
+ setCurrency(currency) {
771
+ this._defaults.currency = currency;
772
+ }
773
+ /** Set default country for all subsequent requests */
774
+ setCountry(country) {
775
+ this._defaults.country = country;
776
+ }
718
777
  };
719
778
  function createSpreeClient(config) {
720
779
  return new SpreeClient(config);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/request.ts","../src/store-client.ts","../src/admin-client.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ErrorResponse } from './types';\n\nexport interface RetryConfig {\n /** Maximum number of retries (default: 2) */\n maxRetries?: number;\n /** HTTP status codes to retry on (default: [429, 500, 502, 503, 504]) */\n retryOnStatus?: number[];\n /** Base delay in ms for exponential backoff (default: 300) */\n baseDelay?: number;\n /** Maximum delay in ms (default: 10000) */\n maxDelay?: number;\n /** Whether to retry on network errors (default: true) */\n retryOnNetworkError?: boolean;\n}\n\nexport interface RequestOptions {\n /** Bearer token for authenticated requests */\n token?: string;\n /** Order token for guest checkout */\n orderToken?: string;\n /** Locale for translated content (e.g., 'en', 'fr') */\n locale?: string;\n /** Currency for prices (e.g., 'USD', 'EUR') */\n currency?: string;\n /** Country ISO code for market resolution (e.g., 'US', 'DE') */\n country?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\nexport interface InternalRequestOptions extends RequestOptions {\n body?: unknown;\n params?: Record<string, string | number | undefined>;\n}\n\nexport class SpreeError extends Error {\n public readonly code: string;\n public readonly status: number;\n public readonly details?: Record<string, string[]>;\n\n constructor(response: ErrorResponse, status: number) {\n super(response.error.message);\n this.name = 'SpreeError';\n this.code = response.error.code;\n this.status = status;\n this.details = response.error.details;\n }\n}\n\nexport type RequestFn = <T>(\n method: string,\n path: string,\n options?: InternalRequestOptions\n) => Promise<T>;\n\nfunction calculateDelay(attempt: number, config: Required<RetryConfig>): number {\n const exponentialDelay = config.baseDelay * Math.pow(2, attempt);\n const jitter = Math.random() * config.baseDelay;\n return Math.min(exponentialDelay + jitter, config.maxDelay);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction shouldRetryOnStatus(method: string, status: number, config: Required<RetryConfig>): boolean {\n const isIdempotent = method === 'GET' || method === 'HEAD';\n if (isIdempotent) {\n return config.retryOnStatus.includes(status);\n }\n return status === 429;\n}\n\nfunction shouldRetryOnNetworkError(method: string, config: Required<RetryConfig>): boolean {\n if (!config.retryOnNetworkError) return false;\n return method === 'GET' || method === 'HEAD';\n}\n\nexport interface RequestConfig {\n baseUrl: string;\n fetchFn: typeof fetch;\n retryConfig: Required<RetryConfig> | false;\n}\n\nexport interface AuthConfig {\n headerName: string;\n headerValue: string;\n}\n\n/**\n * Creates a bound request function for a specific API scope (store or admin).\n */\nexport function createRequestFn(\n config: RequestConfig,\n basePath: string,\n auth: AuthConfig\n): RequestFn {\n return async function request<T>(\n method: string,\n path: string,\n options: InternalRequestOptions = {}\n ): Promise<T> {\n const { token, orderToken, locale, currency, country, headers = {}, body, params } = options;\n\n // Build URL with query params\n const url = new URL(`${config.baseUrl}${basePath}${path}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n value.forEach((v) => url.searchParams.append(key, String(v)));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n }\n if (orderToken) {\n url.searchParams.set('order_token', orderToken);\n }\n\n // Build headers\n const requestHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n [auth.headerName]: auth.headerValue,\n ...headers,\n };\n\n if (token) {\n requestHeaders['Authorization'] = `Bearer ${token}`;\n }\n\n if (orderToken) {\n requestHeaders['x-spree-order-token'] = orderToken;\n }\n\n if (locale) {\n requestHeaders['x-spree-locale'] = locale;\n }\n\n if (currency) {\n requestHeaders['x-spree-currency'] = currency;\n }\n\n if (country) {\n requestHeaders['x-spree-country'] = country;\n }\n\n const maxAttempts = config.retryConfig ? config.retryConfig.maxRetries + 1 : 1;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await config.fetchFn(url.toString(), {\n method,\n headers: requestHeaders,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const isLastAttempt = attempt >= maxAttempts - 1;\n\n if (!isLastAttempt && config.retryConfig && shouldRetryOnStatus(method, response.status, config.retryConfig)) {\n const retryAfter = response.headers.get('Retry-After');\n const delay = retryAfter\n ? Math.min(parseInt(retryAfter, 10) * 1000, config.retryConfig.maxDelay)\n : calculateDelay(attempt, config.retryConfig);\n await sleep(delay);\n continue;\n }\n\n const errorBody = await response.json() as ErrorResponse;\n throw new SpreeError(errorBody, response.status);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n if (error instanceof SpreeError) {\n throw error;\n }\n\n const isLastAttempt = attempt >= maxAttempts - 1;\n\n if (!isLastAttempt && config.retryConfig && shouldRetryOnNetworkError(method, config.retryConfig)) {\n const delay = calculateDelay(attempt, config.retryConfig);\n await sleep(delay);\n continue;\n }\n\n throw error;\n }\n }\n\n // This should never be reached, but TypeScript needs it\n throw new Error('Unexpected end of retry loop');\n };\n}\n","import type { RequestFn, RequestOptions } from './request';\nimport type {\n AuthTokens,\n LoginCredentials,\n RegisterParams,\n PaginatedResponse,\n ListParams,\n ProductListParams,\n ProductFiltersParams,\n ProductFiltersResponse,\n TaxonListParams,\n OrderListParams,\n CreateCartParams,\n AddLineItemParams,\n UpdateLineItemParams,\n UpdateOrderParams,\n AddressParams,\n CreatePaymentSessionParams,\n UpdatePaymentSessionParams,\n CompletePaymentSessionParams,\n CreatePaymentSetupSessionParams,\n CompletePaymentSetupSessionParams,\n StoreCreditCard,\n StoreGiftCard,\n StoreProduct,\n StoreOrder,\n StoreCountry,\n StoreCurrency,\n StoreLocale,\n StoreTaxonomy,\n StoreTaxon,\n StorePayment,\n StorePaymentMethod,\n StorePaymentSession,\n StorePaymentSetupSession,\n StoreShipment,\n StoreStore,\n StoreWishlist,\n StoreWishedItem,\n StoreAddress,\n StoreCustomer,\n} from './types';\n\nexport class StoreClient {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n // ============================================\n // Authentication\n // ============================================\n\n readonly auth = {\n /**\n * Login with email and password\n */\n login: (credentials: LoginCredentials): Promise<AuthTokens> =>\n this.request<AuthTokens>('POST', '/auth/login', { body: credentials }),\n\n /**\n * Register a new customer account\n */\n register: (params: RegisterParams): Promise<AuthTokens> =>\n this.request<AuthTokens>('POST', '/auth/register', { body: params }),\n\n /**\n * Refresh access token (requires valid Bearer token)\n */\n refresh: (options: RequestOptions): Promise<AuthTokens> =>\n this.request<AuthTokens>('POST', '/auth/refresh', options),\n };\n\n // ============================================\n // Store\n // ============================================\n\n readonly store = {\n /**\n * Get current store information\n */\n get: (options?: RequestOptions): Promise<StoreStore> =>\n this.request<StoreStore>('GET', '/store', options),\n };\n\n // ============================================\n // Products\n // ============================================\n\n readonly products = {\n /**\n * List products\n */\n list: (\n params?: ProductListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreProduct>> =>\n this.request<PaginatedResponse<StoreProduct>>('GET', '/products', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n\n /**\n * Get a product by ID or slug\n */\n get: (\n idOrSlug: string,\n params?: { includes?: string },\n options?: RequestOptions\n ): Promise<StoreProduct> =>\n this.request<StoreProduct>('GET', `/products/${idOrSlug}`, {\n ...options,\n params,\n }),\n\n /**\n * Get available filters for products\n * Returns filter options (price range, availability, option types, taxons) with counts\n */\n filters: (\n params?: ProductFiltersParams,\n options?: RequestOptions\n ): Promise<ProductFiltersResponse> =>\n this.request<ProductFiltersResponse>('GET', '/products/filters', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n };\n\n // ============================================\n // Taxonomies & Taxons\n // ============================================\n\n readonly taxonomies = {\n /**\n * List taxonomies\n */\n list: (\n params?: ListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreTaxonomy>> =>\n this.request<PaginatedResponse<StoreTaxonomy>>('GET', '/taxonomies', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n\n /**\n * Get a taxonomy by ID\n */\n get: (\n id: string,\n params?: { includes?: string },\n options?: RequestOptions\n ): Promise<StoreTaxonomy> =>\n this.request<StoreTaxonomy>('GET', `/taxonomies/${id}`, {\n ...options,\n params,\n }),\n };\n\n readonly taxons = {\n /**\n * List taxons\n */\n list: (\n params?: TaxonListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreTaxon>> =>\n this.request<PaginatedResponse<StoreTaxon>>('GET', '/taxons', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n\n /**\n * Get a taxon by ID or permalink\n */\n get: (\n idOrPermalink: string,\n params?: { includes?: string },\n options?: RequestOptions\n ): Promise<StoreTaxon> =>\n this.request<StoreTaxon>('GET', `/taxons/${idOrPermalink}`, {\n ...options,\n params,\n }),\n\n /**\n * Nested resource: Products in a taxon\n */\n products: {\n /**\n * List products in a taxon\n * @param taxonId - Taxon ID (prefix_id) or permalink\n */\n list: (\n taxonId: string,\n params?: ProductListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreProduct>> =>\n this.request<PaginatedResponse<StoreProduct>>(\n 'GET',\n `/taxons/${taxonId}/products`,\n {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }\n ),\n },\n };\n\n // ============================================\n // Countries, Currencies & Locales\n // ============================================\n\n readonly countries = {\n /**\n * List countries available in the store\n * Each country includes currency and default_locale derived from its market\n */\n list: (options?: RequestOptions): Promise<{ data: StoreCountry[] }> =>\n this.request<{ data: StoreCountry[] }>('GET', '/countries', options),\n\n /**\n * Get a country by ISO code\n * Use `?include=states` to include states for address forms\n * @param iso - ISO 3166-1 alpha-2 code (e.g., \"US\", \"DE\")\n */\n get: (\n iso: string,\n params?: { include?: string },\n options?: RequestOptions\n ): Promise<StoreCountry> =>\n this.request<StoreCountry>('GET', `/countries/${iso}`, {\n ...options,\n params,\n }),\n };\n\n readonly currencies = {\n /**\n * List currencies supported by the store (derived from markets)\n */\n list: (options?: RequestOptions): Promise<{ data: StoreCurrency[] }> =>\n this.request<{ data: StoreCurrency[] }>('GET', '/currencies', options),\n };\n\n readonly locales = {\n /**\n * List locales supported by the store (derived from markets)\n */\n list: (options?: RequestOptions): Promise<{ data: StoreLocale[] }> =>\n this.request<{ data: StoreLocale[] }>('GET', '/locales', options),\n };\n\n // ============================================\n // Cart (convenience wrapper for current incomplete order)\n // ============================================\n\n readonly cart = {\n /**\n * Get current cart (returns null if none exists)\n * Pass orderToken for guest checkout, or use JWT for authenticated users\n */\n get: (options?: RequestOptions): Promise<StoreOrder & { token: string }> =>\n this.request<StoreOrder & { token: string }>('GET', '/cart', options),\n\n /**\n * Create a new cart\n * @param params - Optional cart parameters (e.g., metadata)\n */\n create: (params?: CreateCartParams, options?: RequestOptions): Promise<StoreOrder & { token: string }> =>\n this.request<StoreOrder & { token: string }>('POST', '/cart', {\n ...options,\n body: params,\n }),\n\n /**\n * Associate a guest cart with the currently authenticated user\n * Requires both JWT token (for authentication) and orderToken (to identify the cart)\n * @param options - Must include both `token` (JWT) and `orderToken` (guest cart token)\n */\n associate: (options: RequestOptions): Promise<StoreOrder & { token: string }> =>\n this.request<StoreOrder & { token: string }>('PATCH', '/cart/associate', options),\n };\n\n // ============================================\n // Orders (individual order management & checkout)\n // ============================================\n\n readonly orders = {\n /**\n * Get an order by ID or number\n */\n get: (\n idOrNumber: string,\n params?: { includes?: string },\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('GET', `/orders/${idOrNumber}`, {\n ...options,\n params,\n }),\n\n /**\n * Update an order\n */\n update: (\n idOrNumber: string,\n params: UpdateOrderParams,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('PATCH', `/orders/${idOrNumber}`, {\n ...options,\n body: params,\n }),\n\n /**\n * Advance order to next checkout step\n */\n next: (idOrNumber: string, options?: RequestOptions): Promise<StoreOrder> =>\n this.request<StoreOrder>('PATCH', `/orders/${idOrNumber}/next`, options),\n\n /**\n * Advance through all checkout steps\n */\n advance: (idOrNumber: string, options?: RequestOptions): Promise<StoreOrder> =>\n this.request<StoreOrder>('PATCH', `/orders/${idOrNumber}/advance`, options),\n\n /**\n * Complete the order\n */\n complete: (idOrNumber: string, options?: RequestOptions): Promise<StoreOrder> =>\n this.request<StoreOrder>('PATCH', `/orders/${idOrNumber}/complete`, options),\n\n /**\n * Add store credit to order\n */\n addStoreCredit: (\n idOrNumber: string,\n amount?: number,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('POST', `/orders/${idOrNumber}/store_credits`, {\n ...options,\n body: amount ? { amount } : undefined,\n }),\n\n /**\n * Remove store credit from order\n */\n removeStoreCredit: (\n idOrNumber: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('DELETE', `/orders/${idOrNumber}/store_credits`, options),\n\n /**\n * Nested resource: Line items\n */\n lineItems: {\n /**\n * Add a line item to an order.\n * Returns the updated order with recalculated totals.\n */\n create: (\n orderId: string,\n params: AddLineItemParams,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('POST', `/orders/${orderId}/line_items`, {\n ...options,\n body: params,\n }),\n\n /**\n * Update a line item quantity.\n * Returns the updated order with recalculated totals.\n */\n update: (\n orderId: string,\n lineItemId: string,\n params: UpdateLineItemParams,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'PATCH',\n `/orders/${orderId}/line_items/${lineItemId}`,\n { ...options, body: params }\n ),\n\n /**\n * Remove a line item from an order.\n * Returns the updated order with recalculated totals.\n */\n delete: (\n orderId: string,\n lineItemId: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'DELETE',\n `/orders/${orderId}/line_items/${lineItemId}`,\n options\n ),\n },\n\n /**\n * Nested resource: Payments\n */\n payments: {\n /**\n * List payments for an order\n */\n list: (\n orderId: string,\n options?: RequestOptions\n ): Promise<{ data: StorePayment[]; meta: object }> =>\n this.request<{ data: StorePayment[]; meta: object }>(\n 'GET',\n `/orders/${orderId}/payments`,\n options\n ),\n\n /**\n * Get a payment by ID\n */\n get: (\n orderId: string,\n paymentId: string,\n options?: RequestOptions\n ): Promise<StorePayment> =>\n this.request<StorePayment>(\n 'GET',\n `/orders/${orderId}/payments/${paymentId}`,\n options\n ),\n },\n\n /**\n * Nested resource: Payment methods\n */\n paymentMethods: {\n /**\n * List available payment methods for an order\n */\n list: (\n orderId: string,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StorePaymentMethod>> =>\n this.request<PaginatedResponse<StorePaymentMethod>>(\n 'GET',\n `/orders/${orderId}/payment_methods`,\n options\n ),\n },\n\n /**\n * Nested resource: Payment sessions\n */\n paymentSessions: {\n /**\n * Create a payment session for an order\n * Delegates to the payment gateway to initialize a provider-specific session\n */\n create: (\n orderId: string,\n params: CreatePaymentSessionParams,\n options?: RequestOptions\n ): Promise<StorePaymentSession> =>\n this.request<StorePaymentSession>(\n 'POST',\n `/orders/${orderId}/payment_sessions`,\n { ...options, body: params }\n ),\n\n /**\n * Get a payment session by ID\n */\n get: (\n orderId: string,\n sessionId: string,\n options?: RequestOptions\n ): Promise<StorePaymentSession> =>\n this.request<StorePaymentSession>(\n 'GET',\n `/orders/${orderId}/payment_sessions/${sessionId}`,\n options\n ),\n\n /**\n * Update a payment session\n * Delegates to the payment gateway to sync changes with the provider\n */\n update: (\n orderId: string,\n sessionId: string,\n params: UpdatePaymentSessionParams,\n options?: RequestOptions\n ): Promise<StorePaymentSession> =>\n this.request<StorePaymentSession>(\n 'PATCH',\n `/orders/${orderId}/payment_sessions/${sessionId}`,\n { ...options, body: params }\n ),\n\n /**\n * Complete a payment session\n * Confirms the payment with the provider, triggering capture/authorization\n */\n complete: (\n orderId: string,\n sessionId: string,\n params?: CompletePaymentSessionParams,\n options?: RequestOptions\n ): Promise<StorePaymentSession> =>\n this.request<StorePaymentSession>(\n 'PATCH',\n `/orders/${orderId}/payment_sessions/${sessionId}/complete`,\n { ...options, body: params }\n ),\n },\n\n /**\n * Nested resource: Coupon codes\n */\n couponCodes: {\n /**\n * Apply a coupon code to an order\n */\n apply: (\n orderId: string,\n code: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('POST', `/orders/${orderId}/coupon_codes`, {\n ...options,\n body: { code },\n }),\n\n /**\n * Remove a coupon code from an order\n * @param promotionId - The promotion prefix_id (e.g., 'promo_xxx')\n */\n remove: (\n orderId: string,\n promotionId: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'DELETE',\n `/orders/${orderId}/coupon_codes/${promotionId}`,\n options\n ),\n },\n\n /**\n * Nested resource: Shipments\n */\n shipments: {\n /**\n * List shipments for an order\n */\n list: (\n orderId: string,\n options?: RequestOptions\n ): Promise<{ data: StoreShipment[] }> =>\n this.request<{ data: StoreShipment[] }>(\n 'GET',\n `/orders/${orderId}/shipments`,\n options\n ),\n\n /**\n * Select a shipping rate for a shipment.\n * Returns the updated order with recalculated totals.\n */\n update: (\n orderId: string,\n shipmentId: string,\n params: { selected_shipping_rate_id: string },\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'PATCH',\n `/orders/${orderId}/shipments/${shipmentId}`,\n { ...options, body: params }\n ),\n },\n };\n\n // ============================================\n // Customer\n // ============================================\n\n readonly customer = {\n /**\n * Get current customer profile\n */\n get: (options?: RequestOptions): Promise<StoreCustomer> =>\n this.request<StoreCustomer>('GET', '/customer', options),\n\n /**\n * Update current customer profile\n */\n update: (\n params: {\n first_name?: string\n last_name?: string\n email?: string\n password?: string\n password_confirmation?: string\n accepts_email_marketing?: boolean\n phone?: string\n },\n options?: RequestOptions\n ): Promise<StoreCustomer> =>\n this.request<StoreCustomer>('PATCH', '/customer', {\n ...options,\n body: params,\n }),\n\n /**\n * Nested resource: Addresses\n */\n addresses: {\n /**\n * List customer addresses\n */\n list: (\n params?: ListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreAddress>> =>\n this.request<PaginatedResponse<StoreAddress>>(\n 'GET',\n '/customer/addresses',\n { ...options, params: params as Record<string, string | number | undefined> }\n ),\n\n /**\n * Get an address by ID\n */\n get: (id: string, options?: RequestOptions): Promise<StoreAddress> =>\n this.request<StoreAddress>('GET', `/customer/addresses/${id}`, options),\n\n /**\n * Create an address\n */\n create: (\n params: AddressParams,\n options?: RequestOptions\n ): Promise<StoreAddress> =>\n this.request<StoreAddress>('POST', '/customer/addresses', {\n ...options,\n body: params,\n }),\n\n /**\n * Update an address\n */\n update: (\n id: string,\n params: Partial<AddressParams>,\n options?: RequestOptions\n ): Promise<StoreAddress> =>\n this.request<StoreAddress>('PATCH', `/customer/addresses/${id}`, {\n ...options,\n body: params,\n }),\n\n /**\n * Delete an address\n */\n delete: (id: string, options?: RequestOptions): Promise<void> =>\n this.request<void>('DELETE', `/customer/addresses/${id}`, options),\n\n /**\n * Mark an address as default billing or shipping\n */\n markAsDefault: (\n id: string,\n kind: 'billing' | 'shipping',\n options?: RequestOptions\n ): Promise<StoreAddress> =>\n this.request<StoreAddress>('PATCH', `/customer/addresses/${id}/mark_as_default`, {\n ...options,\n body: { kind },\n }),\n },\n\n /**\n * Nested resource: Credit Cards\n */\n creditCards: {\n /**\n * List customer credit cards\n */\n list: (\n params?: ListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreCreditCard>> =>\n this.request<PaginatedResponse<StoreCreditCard>>(\n 'GET',\n '/customer/credit_cards',\n { ...options, params: params as Record<string, string | number | undefined> }\n ),\n\n /**\n * Get a credit card by ID\n */\n get: (id: string, options?: RequestOptions): Promise<StoreCreditCard> =>\n this.request<StoreCreditCard>('GET', `/customer/credit_cards/${id}`, options),\n\n /**\n * Delete a credit card\n */\n delete: (id: string, options?: RequestOptions): Promise<void> =>\n this.request<void>('DELETE', `/customer/credit_cards/${id}`, options),\n },\n\n /**\n * Nested resource: Gift Cards\n */\n giftCards: {\n /**\n * List customer gift cards\n * Returns gift cards associated with the current user, ordered by newest first\n */\n list: (\n params?: ListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreGiftCard>> =>\n this.request<PaginatedResponse<StoreGiftCard>>(\n 'GET',\n '/customer/gift_cards',\n { ...options, params: params as Record<string, string | number | undefined> }\n ),\n\n /**\n * Get a gift card by ID\n */\n get: (id: string, options?: RequestOptions): Promise<StoreGiftCard> =>\n this.request<StoreGiftCard>('GET', `/customer/gift_cards/${id}`, options),\n },\n\n /**\n * Nested resource: Orders (customer order history)\n */\n orders: {\n /**\n * List orders for the authenticated customer\n */\n list: (\n params?: OrderListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreOrder>> =>\n this.request<PaginatedResponse<StoreOrder>>('GET', '/customer/orders', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n },\n\n /**\n * Nested resource: Payment Setup Sessions (save payment methods for future use)\n */\n paymentSetupSessions: {\n /**\n * Create a payment setup session\n * Delegates to the payment gateway to initialize a setup flow for saving a payment method\n */\n create: (\n params: CreatePaymentSetupSessionParams,\n options?: RequestOptions\n ): Promise<StorePaymentSetupSession> =>\n this.request<StorePaymentSetupSession>(\n 'POST',\n '/customer/payment_setup_sessions',\n { ...options, body: params }\n ),\n\n /**\n * Get a payment setup session by ID\n */\n get: (id: string, options?: RequestOptions): Promise<StorePaymentSetupSession> =>\n this.request<StorePaymentSetupSession>('GET', `/customer/payment_setup_sessions/${id}`, options),\n\n /**\n * Complete a payment setup session\n * Confirms the setup with the provider, resulting in a saved payment method\n */\n complete: (\n id: string,\n params?: CompletePaymentSetupSessionParams,\n options?: RequestOptions\n ): Promise<StorePaymentSetupSession> =>\n this.request<StorePaymentSetupSession>(\n 'PATCH',\n `/customer/payment_setup_sessions/${id}/complete`,\n { ...options, body: params }\n ),\n },\n };\n\n // ============================================\n // Wishlists\n // ============================================\n\n readonly wishlists = {\n /**\n * List wishlists\n */\n list: (\n params?: ListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreWishlist>> =>\n this.request<PaginatedResponse<StoreWishlist>>('GET', '/wishlists', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n\n /**\n * Get a wishlist by ID\n */\n get: (\n id: string,\n params?: { includes?: string },\n options?: RequestOptions\n ): Promise<StoreWishlist> =>\n this.request<StoreWishlist>('GET', `/wishlists/${id}`, {\n ...options,\n params,\n }),\n\n /**\n * Create a wishlist\n */\n create: (\n params: { name: string; is_private?: boolean; is_default?: boolean },\n options?: RequestOptions\n ): Promise<StoreWishlist> =>\n this.request<StoreWishlist>('POST', '/wishlists', {\n ...options,\n body: params,\n }),\n\n /**\n * Update a wishlist\n */\n update: (\n id: string,\n params: { name?: string; is_private?: boolean; is_default?: boolean },\n options?: RequestOptions\n ): Promise<StoreWishlist> =>\n this.request<StoreWishlist>('PATCH', `/wishlists/${id}`, {\n ...options,\n body: params,\n }),\n\n /**\n * Delete a wishlist\n */\n delete: (id: string, options?: RequestOptions): Promise<void> =>\n this.request<void>('DELETE', `/wishlists/${id}`, options),\n\n /**\n * Nested resource: Wishlist items\n */\n items: {\n /**\n * Add an item to a wishlist\n */\n create: (\n wishlistId: string,\n params: { variant_id: string; quantity?: number },\n options?: RequestOptions\n ): Promise<StoreWishedItem> =>\n this.request<StoreWishedItem>('POST', `/wishlists/${wishlistId}/items`, {\n ...options,\n body: params,\n }),\n\n /**\n * Update a wishlist item\n */\n update: (\n wishlistId: string,\n itemId: string,\n params: { quantity: number },\n options?: RequestOptions\n ): Promise<StoreWishedItem> =>\n this.request<StoreWishedItem>(\n 'PATCH',\n `/wishlists/${wishlistId}/items/${itemId}`,\n { ...options, body: params }\n ),\n\n /**\n * Remove an item from a wishlist\n */\n delete: (\n wishlistId: string,\n itemId: string,\n options?: RequestOptions\n ): Promise<void> =>\n this.request<void>(\n 'DELETE',\n `/wishlists/${wishlistId}/items/${itemId}`,\n options\n ),\n },\n };\n}\n","import type { RequestFn } from './request';\n\nexport class AdminClient {\n /** @internal */\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n\n // Prevent \"unused\" TS error — will be used as admin endpoints are added\n void this.request;\n }\n}\n","import { createRequestFn } from './request';\nimport type { RetryConfig, RequestConfig } from './request';\nimport { StoreClient } from './store-client';\nimport { AdminClient } from './admin-client';\n\n// Re-export types for convenience\nexport type { AddressParams, StoreCreditCard } from './types';\n\nexport interface SpreeClientConfig {\n /** Base URL of the Spree API (e.g., 'https://api.mystore.com') */\n baseUrl: string;\n /** Publishable API key for Store API access */\n publishableKey: string;\n /** Secret API key for Admin API access (optional) */\n secretKey?: string;\n /** Custom fetch implementation (optional, defaults to global fetch) */\n fetch?: typeof fetch;\n /** Retry configuration. Enabled by default. Pass false to disable. */\n retry?: RetryConfig | false;\n}\n\nexport class SpreeClient {\n /** Store API — customer-facing endpoints (products, cart, checkout, account) */\n readonly store: StoreClient;\n /** Admin API — administrative endpoints (manage orders, products, settings) */\n readonly admin: AdminClient;\n\n constructor(config: SpreeClientConfig) {\n const baseUrl = config.baseUrl.replace(/\\/$/, '');\n // Bind fetch to globalThis to avoid \"Illegal invocation\" errors in browsers\n const fetchFn = config.fetch || fetch.bind(globalThis);\n\n let retryConfig: Required<RetryConfig> | false;\n if (config.retry === false) {\n retryConfig = false;\n } else {\n retryConfig = {\n maxRetries: config.retry?.maxRetries ?? 2,\n retryOnStatus: config.retry?.retryOnStatus ?? [429, 500, 502, 503, 504],\n baseDelay: config.retry?.baseDelay ?? 300,\n maxDelay: config.retry?.maxDelay ?? 10000,\n retryOnNetworkError: config.retry?.retryOnNetworkError ?? true,\n };\n }\n\n const requestConfig: RequestConfig = { baseUrl, fetchFn, retryConfig };\n\n const storeRequestFn = createRequestFn(\n requestConfig,\n '/api/v3/store',\n { headerName: 'x-spree-api-key', headerValue: config.publishableKey }\n );\n\n const adminRequestFn = createRequestFn(\n requestConfig,\n '/api/v3/admin',\n {\n headerName: 'Authorization',\n headerValue: config.secretKey ? `Bearer ${config.secretKey}` : '',\n }\n );\n\n this.store = new StoreClient(storeRequestFn);\n this.admin = new AdminClient(adminRequestFn);\n }\n}\n\n/**\n * Create a new Spree SDK client\n */\nexport function createSpreeClient(config: SpreeClientConfig): SpreeClient {\n return new SpreeClient(config);\n}\n"]}
1
+ {"version":3,"sources":["../src/request.ts","../src/params.ts","../src/store-client.ts","../src/admin-client.ts","../src/client.ts"],"names":[],"mappings":";AAmCO,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA,EACpB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAEhB,WAAA,CAAY,UAAyB,MAAA,EAAgB;AACnD,IAAA,KAAA,CAAM,QAAA,CAAS,MAAM,OAAO,CAAA;AAC5B,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,SAAS,KAAA,CAAM,IAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,SAAS,KAAA,CAAM,OAAA;AAAA,EAChC;AACF;AAQA,SAAS,cAAA,CAAe,SAAiB,MAAA,EAAuC;AAC9E,EAAA,MAAM,mBAAmB,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAO,GAAI,MAAA,CAAO,SAAA;AACtC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,gBAAA,GAAmB,MAAA,EAAQ,OAAO,QAAQ,CAAA;AAC5D;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,SAAS,mBAAA,CAAoB,MAAA,EAAgB,MAAA,EAAgB,MAAA,EAAwC;AACnG,EAAA,MAAM,YAAA,GAAe,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,MAAA;AACpD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,MAAA,CAAO,aAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,MAAA,KAAW,GAAA;AACpB;AAEA,SAAS,yBAAA,CAA0B,QAAgB,MAAA,EAAwC;AACzF,EAAA,IAAI,CAAC,MAAA,CAAO,mBAAA,EAAqB,OAAO,KAAA;AACxC,EAAA,OAAO,MAAA,KAAW,SAAS,MAAA,KAAW,MAAA;AACxC;AAgBO,SAAS,eAAA,CACd,MAAA,EACA,QAAA,EACA,IAAA,EACA,QAAA,EACW;AACX,EAAA,OAAO,eAAe,OAAA,CACpB,MAAA,EACA,IAAA,EACA,OAAA,GAAkC,EAAC,EACvB;AACZ,IAAA,MAAM,EAAE,OAAO,UAAA,EAAY,OAAA,GAAU,EAAC,EAAG,IAAA,EAAM,QAAO,GAAI,OAAA;AAG1D,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,QAAA,EAAU,MAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,QAAA,EAAU,QAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,QAAA,EAAU,OAAA;AAG7C,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AACzD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC/C,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,YAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAA,CAAI,YAAA,CAAa,OAAO,GAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,UAC9D,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACzC;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,aAAA,EAAe,UAAU,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,cAAA,GAAyC;AAAA,MAC7C,cAAA,EAAgB,kBAAA;AAAA,MAChB,CAAC,IAAA,CAAK,UAAU,GAAG,IAAA,CAAK,WAAA;AAAA,MACxB,GAAG;AAAA,KACL;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,cAAA,CAAe,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,IACnD;AAEA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,cAAA,CAAe,qBAAqB,CAAA,GAAI,UAAA;AAAA,IAC1C;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,cAAA,CAAe,gBAAgB,CAAA,GAAI,MAAA;AAAA,IACrC;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,cAAA,CAAe,kBAAkB,CAAA,GAAI,QAAA;AAAA,IACvC;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,cAAA,CAAe,iBAAiB,CAAA,GAAI,OAAA;AAAA,IACtC;AAEA,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,WAAA,CAAY,aAAa,CAAA,GAAI,CAAA;AAE7E,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,WAAA,EAAa,OAAA,EAAA,EAAW;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,UAAS,EAAG;AAAA,UACpD,MAAA;AAAA,UACA,OAAA,EAAS,cAAA;AAAA,UACT,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA;AAAA,SACrC,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,aAAA,GAAgB,WAAW,WAAA,GAAc,CAAA;AAE/C,UAAA,IAAI,CAAC,aAAA,IAAiB,MAAA,CAAO,WAAA,IAAe,mBAAA,CAAoB,QAAQ,QAAA,CAAS,MAAA,EAAQ,MAAA,CAAO,WAAW,CAAA,EAAG;AAC5G,YAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrD,YAAA,MAAM,QAAQ,UAAA,GACV,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,YAAY,EAAE,CAAA,GAAI,GAAA,EAAM,MAAA,CAAO,YAAY,QAAQ,CAAA,GACrE,cAAA,CAAe,OAAA,EAAS,OAAO,WAAW,CAAA;AAC9C,YAAA,MAAM,MAAM,KAAK,CAAA;AACjB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,UAAA,MAAM,IAAI,UAAA,CAAW,SAAA,EAAW,QAAA,CAAS,MAAM,CAAA;AAAA,QACjD;AAGA,QAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,UAAA,OAAO,KAAA,CAAA;AAAA,QACT;AAEA,QAAA,OAAO,SAAS,IAAA,EAAK;AAAA,MACvB,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,MAAM,aAAA,GAAgB,WAAW,WAAA,GAAc,CAAA;AAE/C,QAAA,IAAI,CAAC,iBAAiB,MAAA,CAAO,WAAA,IAAe,0BAA0B,MAAA,EAAQ,MAAA,CAAO,WAAW,CAAA,EAAG;AACjG,UAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,OAAA,EAAS,MAAA,CAAO,WAAW,CAAA;AACxD,UAAA,MAAM,MAAM,KAAK,CAAA;AACjB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAGA,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,EAChD,CAAA;AACF;;;AC3MA,IAAM,gBAAA,uBAAuB,GAAA,CAAI,CAAC,QAAQ,UAAA,EAAY,UAAA,EAAY,SAAA,EAAW,MAAM,CAAC,CAAA;AAW7E,SAAS,oBACd,MAAA,EAC4B;AAC5B,EAAA,MAAM,SAAqC,EAAC;AAE5C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,UAAU,MAAA,EAAW;AAEzB,IAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAA,EAAG;AAE7B,MAAA,MAAA,CAAO,GAAG,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,KAAA,CAA8B,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAChF,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AACd,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,IAAI,IAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AACrD,MAAA,MAAA,CAAO,CAAA,EAAA,EAAK,IAAI,CAAA,GAAA,CAAK,CAAA,GAAI,KAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA,GAAI,KAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACAO,IAAM,cAAN,MAAkB;AAAA,EACN,OAAA;AAAA,EAEjB,YAAY,OAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAMS,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA,IAId,KAAA,EAAO,CAAC,WAAA,KACN,IAAA,CAAK,OAAA,CAAoB,QAAQ,aAAA,EAAe,EAAE,IAAA,EAAM,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA,IAKvE,QAAA,EAAU,CAAC,MAAA,KACT,IAAA,CAAK,OAAA,CAAoB,QAAQ,gBAAA,EAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,IAKrE,SAAS,CAAC,OAAA,KACR,KAAK,OAAA,CAAoB,MAAA,EAAQ,iBAAiB,OAAO;AAAA,GAC7D;AAAA;AAAA;AAAA;AAAA,EAMS,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA,IAIf,KAAK,CAAC,OAAA,KACJ,KAAK,OAAA,CAAoB,KAAA,EAAO,UAAU,OAAO;AAAA,GACrD;AAAA;AAAA;AAAA;AAAA,EAMS,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA,IAIlB,MAAM,CACJ,MAAA,EACA,YAEA,IAAA,CAAK,OAAA,CAAyC,OAAO,WAAA,EAAa;AAAA,MAChE,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ,MAAA,GAAS,mBAAA,CAAoB,MAAM,CAAA,GAAI;AAAA,KAChD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,GAAA,EAAK,CACH,QAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAsB,KAAA,EAAO,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAA,EAAI;AAAA,MACzD,GAAG,OAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMH,SAAS,CACP,MAAA,EACA,YAEA,IAAA,CAAK,OAAA,CAAgC,OAAO,mBAAA,EAAqB;AAAA,MAC/D,GAAG,OAAA;AAAA,MACH;AAAA,KACD;AAAA,GACL;AAAA;AAAA;AAAA;AAAA,EAMS,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA,IAIpB,MAAM,CACJ,MAAA,EACA,YAEA,IAAA,CAAK,OAAA,CAA0C,OAAO,aAAA,EAAe;AAAA,MACnE,GAAG,OAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,GAAA,EAAK,CACH,EAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAuB,KAAA,EAAO,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,EAAI;AAAA,MACtD,GAAG,OAAA;AAAA,MACH;AAAA,KACD;AAAA,GACL;AAAA,EAES,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA,IAIhB,MAAM,CACJ,MAAA,EACA,YAEA,IAAA,CAAK,OAAA,CAAuC,OAAO,SAAA,EAAW;AAAA,MAC5D,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ,MAAA,GAAS,mBAAA,CAAoB,MAAM,CAAA,GAAI;AAAA,KAChD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,GAAA,EAAK,CACH,aAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAoB,KAAA,EAAO,CAAA,QAAA,EAAW,aAAa,CAAA,CAAA,EAAI;AAAA,MAC1D,GAAG,OAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA,MAKR,IAAA,EAAM,CACJ,OAAA,EACA,MAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,KAAA;AAAA,QACA,WAAW,OAAO,CAAA,SAAA,CAAA;AAAA,QAClB;AAAA,UACE,GAAG,OAAA;AAAA,UACH,MAAA,EAAQ,MAAA,GAAS,mBAAA,CAAoB,MAAM,CAAA,GAAI;AAAA;AACjD;AACF;AACJ,GACF;AAAA;AAAA;AAAA;AAAA,EAMS,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA,IAKnB,MAAM,CAAC,OAAA,KACL,KAAK,OAAA,CAAkC,KAAA,EAAO,cAAc,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOrE,GAAA,EAAK,CACH,GAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAsB,KAAA,EAAO,CAAA,WAAA,EAAc,GAAG,CAAA,CAAA,EAAI;AAAA,MACrD,GAAG,OAAA;AAAA,MACH;AAAA,KACD;AAAA,GACL;AAAA,EAES,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA,IAIpB,MAAM,CAAC,OAAA,KACL,KAAK,OAAA,CAAmC,KAAA,EAAO,eAAe,OAAO;AAAA,GACzE;AAAA,EAES,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,IAIjB,MAAM,CAAC,OAAA,KACL,KAAK,OAAA,CAAiC,KAAA,EAAO,YAAY,OAAO;AAAA,GACpE;AAAA;AAAA;AAAA;AAAA,EAMS,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKd,KAAK,CAAC,OAAA,KACJ,KAAK,OAAA,CAAwC,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMtE,QAAQ,CAAC,MAAA,EAA2B,YAClC,IAAA,CAAK,OAAA,CAAwC,QAAQ,OAAA,EAAS;AAAA,MAC5D,GAAG,OAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOH,WAAW,CAAC,OAAA,KACV,KAAK,OAAA,CAAwC,OAAA,EAAS,mBAAmB,OAAO;AAAA,GACpF;AAAA;AAAA;AAAA;AAAA,EAMS,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA,IAIhB,GAAA,EAAK,CACH,UAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAoB,KAAA,EAAO,CAAA,QAAA,EAAW,UAAU,CAAA,CAAA,EAAI;AAAA,MACvD,GAAG,OAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,MAAA,EAAQ,CACN,UAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAoB,OAAA,EAAS,CAAA,QAAA,EAAW,UAAU,CAAA,CAAA,EAAI;AAAA,MACzD,GAAG,OAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,IAAA,EAAM,CACJ,UAAA,EACA,OAAA,KAEA,IAAA,CAAK,QAAoB,OAAA,EAAS,CAAA,QAAA,EAAW,UAAU,CAAA,KAAA,CAAA,EAAS,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,IAKzE,OAAA,EAAS,CACP,UAAA,EACA,OAAA,KAEA,IAAA,CAAK,OAAA;AAAA,MACH,OAAA;AAAA,MACA,WAAW,UAAU,CAAA,QAAA,CAAA;AAAA,MACrB;AAAA,KACF;AAAA;AAAA;AAAA;AAAA,IAKF,QAAA,EAAU,CACR,UAAA,EACA,OAAA,KAEA,IAAA,CAAK,OAAA;AAAA,MACH,OAAA;AAAA,MACA,WAAW,UAAU,CAAA,SAAA,CAAA;AAAA,MACrB;AAAA,KACF;AAAA;AAAA;AAAA;AAAA,IAKF,cAAA,EAAgB,CACd,UAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAoB,MAAA,EAAQ,CAAA,QAAA,EAAW,UAAU,CAAA,cAAA,CAAA,EAAkB;AAAA,MACtE,GAAG,OAAA;AAAA,MACH,IAAA,EAAM,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI;AAAA,KAC7B,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,iBAAA,EAAmB,CACjB,UAAA,EACA,OAAA,KAEA,IAAA,CAAK,OAAA;AAAA,MACH,QAAA;AAAA,MACA,WAAW,UAAU,CAAA,cAAA,CAAA;AAAA,MACrB;AAAA,KACF;AAAA;AAAA;AAAA;AAAA,IAKF,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA,MAKT,MAAA,EAAQ,CACN,OAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAoB,MAAA,EAAQ,CAAA,QAAA,EAAW,OAAO,CAAA,WAAA,CAAA,EAAe;AAAA,QAChE,GAAG,OAAA;AAAA,QACH,IAAA,EAAM;AAAA,OACP,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMH,QAAQ,CACN,OAAA,EACA,UAAA,EACA,MAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,OAAA;AAAA,QACA,CAAA,QAAA,EAAW,OAAO,CAAA,YAAA,EAAe,UAAU,CAAA,CAAA;AAAA,QAC3C,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,MAAA;AAAO,OAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,MAMF,MAAA,EAAQ,CACN,OAAA,EACA,UAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,QAAA;AAAA,QACA,CAAA,QAAA,EAAW,OAAO,CAAA,YAAA,EAAe,UAAU,CAAA,CAAA;AAAA,QAC3C;AAAA;AACF,KACJ;AAAA;AAAA;AAAA;AAAA,IAKA,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA,MAIR,IAAA,EAAM,CACJ,OAAA,EACA,OAAA,KAEA,IAAA,CAAK,OAAA;AAAA,QACH,KAAA;AAAA,QACA,WAAW,OAAO,CAAA,SAAA,CAAA;AAAA,QAClB;AAAA,OACF;AAAA;AAAA;AAAA;AAAA,MAKF,GAAA,EAAK,CACH,OAAA,EACA,SAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,KAAA;AAAA,QACA,CAAA,QAAA,EAAW,OAAO,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA;AAAA,QACxC;AAAA;AACF,KACJ;AAAA;AAAA;AAAA;AAAA,IAKA,cAAA,EAAgB;AAAA;AAAA;AAAA;AAAA,MAId,IAAA,EAAM,CACJ,OAAA,EACA,OAAA,KAEA,IAAA,CAAK,OAAA;AAAA,QACH,KAAA;AAAA,QACA,WAAW,OAAO,CAAA,gBAAA,CAAA;AAAA,QAClB;AAAA;AACF,KACJ;AAAA;AAAA;AAAA;AAAA,IAKA,eAAA,EAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKf,MAAA,EAAQ,CACN,OAAA,EACA,MAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,MAAA;AAAA,QACA,WAAW,OAAO,CAAA,iBAAA,CAAA;AAAA,QAClB,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,MAAA;AAAO,OAC7B;AAAA;AAAA;AAAA;AAAA,MAKF,GAAA,EAAK,CACH,OAAA,EACA,SAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,KAAA;AAAA,QACA,CAAA,QAAA,EAAW,OAAO,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAA;AAAA,QAChD;AAAA,OACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMF,QAAQ,CACN,OAAA,EACA,SAAA,EACA,MAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,OAAA;AAAA,QACA,CAAA,QAAA,EAAW,OAAO,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAA;AAAA,QAChD,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,MAAA;AAAO,OAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,MAMF,UAAU,CACR,OAAA,EACA,SAAA,EACA,MAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,OAAA;AAAA,QACA,CAAA,QAAA,EAAW,OAAO,CAAA,kBAAA,EAAqB,SAAS,CAAA,SAAA,CAAA;AAAA,QAChD,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,MAAA;AAAO;AAC7B,KACJ;AAAA;AAAA;AAAA;AAAA,IAKA,WAAA,EAAa;AAAA;AAAA;AAAA;AAAA,MAIX,KAAA,EAAO,CACL,OAAA,EACA,IAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAoB,MAAA,EAAQ,CAAA,QAAA,EAAW,OAAO,CAAA,aAAA,CAAA,EAAiB;AAAA,QAClE,GAAG,OAAA;AAAA,QACH,IAAA,EAAM,EAAE,IAAA;AAAK,OACd,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMH,MAAA,EAAQ,CACN,OAAA,EACA,WAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,QAAA;AAAA,QACA,CAAA,QAAA,EAAW,OAAO,CAAA,cAAA,EAAiB,WAAW,CAAA,CAAA;AAAA,QAC9C;AAAA;AACF,KACJ;AAAA;AAAA;AAAA;AAAA,IAKA,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA,MAIT,IAAA,EAAM,CACJ,OAAA,EACA,OAAA,KAEA,IAAA,CAAK,OAAA;AAAA,QACH,KAAA;AAAA,QACA,WAAW,OAAO,CAAA,UAAA,CAAA;AAAA,QAClB;AAAA,OACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMF,QAAQ,CACN,OAAA,EACA,UAAA,EACA,MAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,OAAA;AAAA,QACA,CAAA,QAAA,EAAW,OAAO,CAAA,WAAA,EAAc,UAAU,CAAA,CAAA;AAAA,QAC1C,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,MAAA;AAAO;AAC7B;AACJ,GACF;AAAA;AAAA;AAAA;AAAA,EAMS,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA,IAIlB,KAAK,CAAC,OAAA,KACJ,KAAK,OAAA,CAAuB,KAAA,EAAO,aAAa,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,IAKzD,QAAQ,CACN,MAAA,EASA,YAEA,IAAA,CAAK,OAAA,CAAuB,SAAS,WAAA,EAAa;AAAA,MAChD,GAAG,OAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA,MAIT,IAAA,EAAM,CACJ,MAAA,EACA,OAAA,KAEA,IAAA,CAAK,OAAA;AAAA,QACH,KAAA;AAAA,QACA,qBAAA;AAAA,QACA,EAAE,GAAG,OAAA,EAAS,MAAA;AAA8D,OAC9E;AAAA;AAAA;AAAA;AAAA,MAKF,GAAA,EAAK,CAAC,EAAA,EAAY,OAAA,KAChB,IAAA,CAAK,QAAsB,KAAA,EAAO,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,MAKxE,QAAQ,CACN,MAAA,EACA,YAEA,IAAA,CAAK,OAAA,CAAsB,QAAQ,qBAAA,EAAuB;AAAA,QACxD,GAAG,OAAA;AAAA,QACH,IAAA,EAAM;AAAA,OACP,CAAA;AAAA;AAAA;AAAA;AAAA,MAKH,MAAA,EAAQ,CACN,EAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAsB,OAAA,EAAS,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAA,EAAI;AAAA,QAC/D,GAAG,OAAA;AAAA,QACH,IAAA,EAAM;AAAA,OACP,CAAA;AAAA;AAAA;AAAA;AAAA,MAKH,MAAA,EAAQ,CAAC,EAAA,EAAY,OAAA,KACnB,IAAA,CAAK,QAAc,QAAA,EAAU,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,MAKnE,aAAA,EAAe,CACb,EAAA,EACA,IAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAsB,OAAA,EAAS,CAAA,oBAAA,EAAuB,EAAE,CAAA,gBAAA,CAAA,EAAoB;AAAA,QAC/E,GAAG,OAAA;AAAA,QACH,IAAA,EAAM,EAAE,IAAA;AAAK,OACd;AAAA,KACL;AAAA;AAAA;AAAA;AAAA,IAKA,WAAA,EAAa;AAAA;AAAA;AAAA;AAAA,MAIX,IAAA,EAAM,CACJ,MAAA,EACA,OAAA,KAEA,IAAA,CAAK,OAAA;AAAA,QACH,KAAA;AAAA,QACA,wBAAA;AAAA,QACA,EAAE,GAAG,OAAA,EAAS,MAAA;AAA8D,OAC9E;AAAA;AAAA;AAAA;AAAA,MAKF,GAAA,EAAK,CAAC,EAAA,EAAY,OAAA,KAChB,IAAA,CAAK,QAAyB,KAAA,EAAO,CAAA,uBAAA,EAA0B,EAAE,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,MAK9E,MAAA,EAAQ,CAAC,EAAA,EAAY,OAAA,KACnB,IAAA,CAAK,QAAc,QAAA,EAAU,CAAA,uBAAA,EAA0B,EAAE,CAAA,CAAA,EAAI,OAAO;AAAA,KACxE;AAAA;AAAA;AAAA;AAAA,IAKA,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA,MAKT,IAAA,EAAM,CACJ,MAAA,EACA,OAAA,KAEA,IAAA,CAAK,OAAA;AAAA,QACH,KAAA;AAAA,QACA,sBAAA;AAAA,QACA,EAAE,GAAG,OAAA,EAAS,MAAA;AAA8D,OAC9E;AAAA;AAAA;AAAA;AAAA,MAKF,GAAA,EAAK,CAAC,EAAA,EAAY,OAAA,KAChB,IAAA,CAAK,QAAuB,KAAA,EAAO,CAAA,qBAAA,EAAwB,EAAE,CAAA,CAAA,EAAI,OAAO;AAAA,KAC5E;AAAA;AAAA;AAAA;AAAA,IAKA,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,MAIN,MAAM,CACJ,MAAA,EACA,YAEA,IAAA,CAAK,OAAA,CAAuC,OAAO,kBAAA,EAAoB;AAAA,QACrE,GAAG,OAAA;AAAA,QACH,MAAA,EAAQ,MAAA,GAAS,mBAAA,CAAoB,MAAM,CAAA,GAAI;AAAA,OAChD;AAAA,KACL;AAAA;AAAA;AAAA;AAAA,IAKA,oBAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKpB,MAAA,EAAQ,CACN,MAAA,EACA,OAAA,KAEA,IAAA,CAAK,OAAA;AAAA,QACH,MAAA;AAAA,QACA,kCAAA;AAAA,QACA,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,MAAA;AAAO,OAC7B;AAAA;AAAA;AAAA;AAAA,MAKF,GAAA,EAAK,CAAC,EAAA,EAAY,OAAA,KAChB,IAAA,CAAK,QAAkC,KAAA,EAAO,CAAA,iCAAA,EAAoC,EAAE,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMjG,QAAA,EAAU,CACR,EAAA,EACA,MAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,OAAA;AAAA,QACA,oCAAoC,EAAE,CAAA,SAAA,CAAA;AAAA,QACtC,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,MAAA;AAAO;AAC7B;AACJ,GACF;AAAA;AAAA;AAAA;AAAA,EAMS,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA,IAInB,MAAM,CACJ,MAAA,EACA,YAEA,IAAA,CAAK,OAAA,CAA0C,OAAO,YAAA,EAAc;AAAA,MAClE,GAAG,OAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,GAAA,EAAK,CACH,EAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAuB,KAAA,EAAO,CAAA,WAAA,EAAc,EAAE,CAAA,CAAA,EAAI;AAAA,MACrD,GAAG,OAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,QAAQ,CACN,MAAA,EACA,YAEA,IAAA,CAAK,OAAA,CAAuB,QAAQ,YAAA,EAAc;AAAA,MAChD,GAAG,OAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,MAAA,EAAQ,CACN,EAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAuB,OAAA,EAAS,CAAA,WAAA,EAAc,EAAE,CAAA,CAAA,EAAI;AAAA,MACvD,GAAG,OAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,MAAA,EAAQ,CAAC,EAAA,EAAY,OAAA,KACnB,IAAA,CAAK,QAAc,QAAA,EAAU,CAAA,WAAA,EAAc,EAAE,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,IAK1D,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA,MAIL,MAAA,EAAQ,CACN,UAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAyB,MAAA,EAAQ,CAAA,WAAA,EAAc,UAAU,CAAA,MAAA,CAAA,EAAU;AAAA,QACtE,GAAG,OAAA;AAAA,QACH,IAAA,EAAM;AAAA,OACP,CAAA;AAAA;AAAA;AAAA;AAAA,MAKH,QAAQ,CACN,UAAA,EACA,MAAA,EACA,MAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,OAAA;AAAA,QACA,CAAA,WAAA,EAAc,UAAU,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAA,QACxC,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,MAAA;AAAO,OAC7B;AAAA;AAAA;AAAA;AAAA,MAKF,MAAA,EAAQ,CACN,UAAA,EACA,MAAA,EACA,YAEA,IAAA,CAAK,OAAA;AAAA,QACH,QAAA;AAAA,QACA,CAAA,WAAA,EAAc,UAAU,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAA,QACxC;AAAA;AACF;AACJ,GACF;AACF;;;ACn6BO,IAAM,cAAN,MAAkB;AAAA;AAAA,EAEN,OAAA;AAAA,EAEjB,YAAY,OAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAGf,IAAA,KAAK,IAAA,CAAK,OAAA;AAAA,EACZ;AACF;;;ACgBO,IAAM,cAAN,MAAkB;AAAA;AAAA,EAEd,KAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EAEQ,SAAA;AAAA,EAEjB,YAAY,MAAA,EAA2B;AACrC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAEhD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,IAAS,KAAA,CAAM,KAAK,UAAU,CAAA;AAErD,IAAA,IAAA,CAAK,SAAA,GAAY;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,SAAS,MAAA,CAAO;AAAA,KAClB;AAEA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,MAAA,CAAO,UAAU,KAAA,EAAO;AAC1B,MAAA,WAAA,GAAc,KAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,WAAA,GAAc;AAAA,QACZ,UAAA,EAAY,MAAA,CAAO,KAAA,EAAO,UAAA,IAAc,CAAA;AAAA,QACxC,aAAA,EAAe,OAAO,KAAA,EAAO,aAAA,IAAiB,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAA,QACtE,SAAA,EAAW,MAAA,CAAO,KAAA,EAAO,SAAA,IAAa,GAAA;AAAA,QACtC,QAAA,EAAU,MAAA,CAAO,KAAA,EAAO,QAAA,IAAY,GAAA;AAAA,QACpC,mBAAA,EAAqB,MAAA,CAAO,KAAA,EAAO,mBAAA,IAAuB;AAAA,OAC5D;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAA+B,EAAE,OAAA,EAAS,OAAA,EAAS,WAAA,EAAY;AAErE,IAAA,MAAM,cAAA,GAAiB,eAAA;AAAA,MACrB,aAAA;AAAA,MACA,eAAA;AAAA,MACA,EAAE,UAAA,EAAY,iBAAA,EAAmB,WAAA,EAAa,OAAO,cAAA,EAAe;AAAA,MACpE,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,MAAM,cAAA,GAAiB,eAAA;AAAA,MACrB,aAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,QACE,UAAA,EAAY,eAAA;AAAA,QACZ,aAAa,MAAA,CAAO,SAAA,GAAY,CAAA,OAAA,EAAU,MAAA,CAAO,SAAS,CAAA,CAAA,GAAK;AAAA,OACjE;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,cAAc,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,cAAc,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,UAAU,MAAA,GAAS,MAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,YAAY,QAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,UAAU,QAAA,GAAW,QAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,WAAW,OAAA,EAAuB;AAChC,IAAA,IAAA,CAAK,UAAU,OAAA,GAAU,OAAA;AAAA,EAC3B;AACF;AAKO,SAAS,kBAAkB,MAAA,EAAwC;AACxE,EAAA,OAAO,IAAI,YAAY,MAAM,CAAA;AAC/B","file":"index.js","sourcesContent":["import type { ErrorResponse, LocaleDefaults } from './types';\n\nexport interface RetryConfig {\n /** Maximum number of retries (default: 2) */\n maxRetries?: number;\n /** HTTP status codes to retry on (default: [429, 500, 502, 503, 504]) */\n retryOnStatus?: number[];\n /** Base delay in ms for exponential backoff (default: 300) */\n baseDelay?: number;\n /** Maximum delay in ms (default: 10000) */\n maxDelay?: number;\n /** Whether to retry on network errors (default: true) */\n retryOnNetworkError?: boolean;\n}\n\nexport interface RequestOptions {\n /** Bearer token for authenticated requests */\n token?: string;\n /** Order token for guest checkout */\n orderToken?: string;\n /** Locale for translated content (e.g., 'en', 'fr') */\n locale?: string;\n /** Currency for prices (e.g., 'USD', 'EUR') */\n currency?: string;\n /** Country ISO code for market resolution (e.g., 'US', 'DE') */\n country?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\nexport interface InternalRequestOptions extends RequestOptions {\n body?: unknown;\n params?: Record<string, string | number | boolean | (string | number)[] | undefined>;\n}\n\nexport class SpreeError extends Error {\n public readonly code: string;\n public readonly status: number;\n public readonly details?: Record<string, string[]>;\n\n constructor(response: ErrorResponse, status: number) {\n super(response.error.message);\n this.name = 'SpreeError';\n this.code = response.error.code;\n this.status = status;\n this.details = response.error.details;\n }\n}\n\nexport type RequestFn = <T>(\n method: string,\n path: string,\n options?: InternalRequestOptions\n) => Promise<T>;\n\nfunction calculateDelay(attempt: number, config: Required<RetryConfig>): number {\n const exponentialDelay = config.baseDelay * Math.pow(2, attempt);\n const jitter = Math.random() * config.baseDelay;\n return Math.min(exponentialDelay + jitter, config.maxDelay);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction shouldRetryOnStatus(method: string, status: number, config: Required<RetryConfig>): boolean {\n const isIdempotent = method === 'GET' || method === 'HEAD';\n if (isIdempotent) {\n return config.retryOnStatus.includes(status);\n }\n return status === 429;\n}\n\nfunction shouldRetryOnNetworkError(method: string, config: Required<RetryConfig>): boolean {\n if (!config.retryOnNetworkError) return false;\n return method === 'GET' || method === 'HEAD';\n}\n\nexport interface RequestConfig {\n baseUrl: string;\n fetchFn: typeof fetch;\n retryConfig: Required<RetryConfig> | false;\n}\n\nexport interface AuthConfig {\n headerName: string;\n headerValue: string;\n}\n\n/**\n * Creates a bound request function for a specific API scope (store or admin).\n */\nexport function createRequestFn(\n config: RequestConfig,\n basePath: string,\n auth: AuthConfig,\n defaults?: LocaleDefaults\n): RequestFn {\n return async function request<T>(\n method: string,\n path: string,\n options: InternalRequestOptions = {}\n ): Promise<T> {\n const { token, orderToken, headers = {}, body, params } = options;\n\n // Per-request options override client-level defaults\n const locale = options.locale ?? defaults?.locale;\n const currency = options.currency ?? defaults?.currency;\n const country = options.country ?? defaults?.country;\n\n // Build URL with query params\n const url = new URL(`${config.baseUrl}${basePath}${path}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n value.forEach((v) => url.searchParams.append(key, String(v)));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n }\n if (orderToken) {\n url.searchParams.set('order_token', orderToken);\n }\n\n // Build headers\n const requestHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n [auth.headerName]: auth.headerValue,\n ...headers,\n };\n\n if (token) {\n requestHeaders['Authorization'] = `Bearer ${token}`;\n }\n\n if (orderToken) {\n requestHeaders['x-spree-order-token'] = orderToken;\n }\n\n if (locale) {\n requestHeaders['x-spree-locale'] = locale;\n }\n\n if (currency) {\n requestHeaders['x-spree-currency'] = currency;\n }\n\n if (country) {\n requestHeaders['x-spree-country'] = country;\n }\n\n const maxAttempts = config.retryConfig ? config.retryConfig.maxRetries + 1 : 1;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await config.fetchFn(url.toString(), {\n method,\n headers: requestHeaders,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const isLastAttempt = attempt >= maxAttempts - 1;\n\n if (!isLastAttempt && config.retryConfig && shouldRetryOnStatus(method, response.status, config.retryConfig)) {\n const retryAfter = response.headers.get('Retry-After');\n const delay = retryAfter\n ? Math.min(parseInt(retryAfter, 10) * 1000, config.retryConfig.maxDelay)\n : calculateDelay(attempt, config.retryConfig);\n await sleep(delay);\n continue;\n }\n\n const errorBody = await response.json() as ErrorResponse;\n throw new SpreeError(errorBody, response.status);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n if (error instanceof SpreeError) {\n throw error;\n }\n\n const isLastAttempt = attempt >= maxAttempts - 1;\n\n if (!isLastAttempt && config.retryConfig && shouldRetryOnNetworkError(method, config.retryConfig)) {\n const delay = calculateDelay(attempt, config.retryConfig);\n await sleep(delay);\n continue;\n }\n\n throw error;\n }\n }\n\n // This should never be reached, but TypeScript needs it\n throw new Error('Unexpected end of retry loop');\n };\n}\n","/**\n * Keys that are passed through to the API without wrapping in q[...].\n */\nconst PASSTHROUGH_KEYS = new Set(['page', 'per_page', 'includes', 'include', 'sort']);\n\ntype ParamValue = string | number | boolean | (string | number)[] | undefined;\n\n/**\n * Transforms flat SDK params into Ransack-compatible query params.\n *\n * - `page`, `per_page`, `includes`, `include`, `sort` pass through unchanged\n * - Keys already in `q[...]` format pass through (backward compat)\n * - All other keys are wrapped: `name_cont` → `q[name_cont]`\n */\nexport function transformListParams(\n params: Record<string, unknown>\n): Record<string, ParamValue> {\n const result: Record<string, ParamValue> = {};\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n\n if (PASSTHROUGH_KEYS.has(key)) {\n // Join arrays for passthrough keys (e.g., includes: ['variants', 'images'] → 'variants,images')\n result[key] = Array.isArray(value) ? (value as (string | number)[]).join(',') : value as ParamValue;\n continue;\n }\n\n // Backward compat: already-wrapped q[...] keys pass through\n if (key.startsWith('q[')) {\n result[key] = value as ParamValue;\n continue;\n }\n\n // Array values get [] suffix automatically: `foo: [1,2]` → `q[foo][]`\n if (Array.isArray(value)) {\n const base = key.endsWith('[]') ? key.slice(0, -2) : key;\n result[`q[${base}][]`] = value as ParamValue;\n } else {\n result[`q[${key}]`] = value as ParamValue;\n }\n }\n\n return result;\n}\n","import type { RequestFn, RequestOptions } from './request';\nimport { transformListParams } from './params';\nimport type {\n AuthTokens,\n LoginCredentials,\n RegisterParams,\n PaginatedResponse,\n ListParams,\n ProductListParams,\n ProductFiltersParams,\n ProductFiltersResponse,\n TaxonListParams,\n OrderListParams,\n CreateCartParams,\n AddLineItemParams,\n UpdateLineItemParams,\n UpdateOrderParams,\n AddressParams,\n CreatePaymentSessionParams,\n UpdatePaymentSessionParams,\n CompletePaymentSessionParams,\n CreatePaymentSetupSessionParams,\n CompletePaymentSetupSessionParams,\n StoreCreditCard,\n StoreGiftCard,\n StoreProduct,\n StoreOrder,\n StoreCountry,\n StoreCurrency,\n StoreLocale,\n StoreTaxonomy,\n StoreTaxon,\n StorePayment,\n StorePaymentMethod,\n StorePaymentSession,\n StorePaymentSetupSession,\n StoreShipment,\n StoreStore,\n StoreWishlist,\n StoreWishedItem,\n StoreAddress,\n StoreCustomer,\n} from './types';\n\nexport class StoreClient {\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n\n // ============================================\n // Authentication\n // ============================================\n\n readonly auth = {\n /**\n * Login with email and password\n */\n login: (credentials: LoginCredentials): Promise<AuthTokens> =>\n this.request<AuthTokens>('POST', '/auth/login', { body: credentials }),\n\n /**\n * Register a new customer account\n */\n register: (params: RegisterParams): Promise<AuthTokens> =>\n this.request<AuthTokens>('POST', '/auth/register', { body: params }),\n\n /**\n * Refresh access token (requires valid Bearer token)\n */\n refresh: (options: RequestOptions): Promise<AuthTokens> =>\n this.request<AuthTokens>('POST', '/auth/refresh', options),\n };\n\n // ============================================\n // Store\n // ============================================\n\n readonly store = {\n /**\n * Get current store information\n */\n get: (options?: RequestOptions): Promise<StoreStore> =>\n this.request<StoreStore>('GET', '/store', options),\n };\n\n // ============================================\n // Products\n // ============================================\n\n readonly products = {\n /**\n * List products\n */\n list: (\n params?: ProductListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreProduct>> =>\n this.request<PaginatedResponse<StoreProduct>>('GET', '/products', {\n ...options,\n params: params ? transformListParams(params) : undefined,\n }),\n\n /**\n * Get a product by ID or slug\n */\n get: (\n idOrSlug: string,\n params?: { includes?: string },\n options?: RequestOptions\n ): Promise<StoreProduct> =>\n this.request<StoreProduct>('GET', `/products/${idOrSlug}`, {\n ...options,\n params,\n }),\n\n /**\n * Get available filters for products\n * Returns filter options (price range, availability, option types, taxons) with counts\n */\n filters: (\n params?: ProductFiltersParams,\n options?: RequestOptions\n ): Promise<ProductFiltersResponse> =>\n this.request<ProductFiltersResponse>('GET', '/products/filters', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n };\n\n // ============================================\n // Taxonomies & Taxons\n // ============================================\n\n readonly taxonomies = {\n /**\n * List taxonomies\n */\n list: (\n params?: ListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreTaxonomy>> =>\n this.request<PaginatedResponse<StoreTaxonomy>>('GET', '/taxonomies', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n\n /**\n * Get a taxonomy by ID\n */\n get: (\n id: string,\n params?: { includes?: string },\n options?: RequestOptions\n ): Promise<StoreTaxonomy> =>\n this.request<StoreTaxonomy>('GET', `/taxonomies/${id}`, {\n ...options,\n params,\n }),\n };\n\n readonly taxons = {\n /**\n * List taxons\n */\n list: (\n params?: TaxonListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreTaxon>> =>\n this.request<PaginatedResponse<StoreTaxon>>('GET', '/taxons', {\n ...options,\n params: params ? transformListParams(params) : undefined,\n }),\n\n /**\n * Get a taxon by ID or permalink\n */\n get: (\n idOrPermalink: string,\n params?: { includes?: string },\n options?: RequestOptions\n ): Promise<StoreTaxon> =>\n this.request<StoreTaxon>('GET', `/taxons/${idOrPermalink}`, {\n ...options,\n params,\n }),\n\n /**\n * Nested resource: Products in a taxon\n */\n products: {\n /**\n * List products in a taxon\n * @param taxonId - Taxon ID (prefix_id) or permalink\n */\n list: (\n taxonId: string,\n params?: ProductListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreProduct>> =>\n this.request<PaginatedResponse<StoreProduct>>(\n 'GET',\n `/taxons/${taxonId}/products`,\n {\n ...options,\n params: params ? transformListParams(params) : undefined,\n }\n ),\n },\n };\n\n // ============================================\n // Countries, Currencies & Locales\n // ============================================\n\n readonly countries = {\n /**\n * List countries available in the store\n * Each country includes currency and default_locale derived from its market\n */\n list: (options?: RequestOptions): Promise<{ data: StoreCountry[] }> =>\n this.request<{ data: StoreCountry[] }>('GET', '/countries', options),\n\n /**\n * Get a country by ISO code\n * Use `?include=states` to include states for address forms\n * @param iso - ISO 3166-1 alpha-2 code (e.g., \"US\", \"DE\")\n */\n get: (\n iso: string,\n params?: { include?: string },\n options?: RequestOptions\n ): Promise<StoreCountry> =>\n this.request<StoreCountry>('GET', `/countries/${iso}`, {\n ...options,\n params,\n }),\n };\n\n readonly currencies = {\n /**\n * List currencies supported by the store (derived from markets)\n */\n list: (options?: RequestOptions): Promise<{ data: StoreCurrency[] }> =>\n this.request<{ data: StoreCurrency[] }>('GET', '/currencies', options),\n };\n\n readonly locales = {\n /**\n * List locales supported by the store (derived from markets)\n */\n list: (options?: RequestOptions): Promise<{ data: StoreLocale[] }> =>\n this.request<{ data: StoreLocale[] }>('GET', '/locales', options),\n };\n\n // ============================================\n // Cart (convenience wrapper for current incomplete order)\n // ============================================\n\n readonly cart = {\n /**\n * Get current cart (returns null if none exists)\n * Pass orderToken for guest checkout, or use JWT for authenticated users\n */\n get: (options?: RequestOptions): Promise<StoreOrder & { token: string }> =>\n this.request<StoreOrder & { token: string }>('GET', '/cart', options),\n\n /**\n * Create a new cart\n * @param params - Optional cart parameters (e.g., metadata)\n */\n create: (params?: CreateCartParams, options?: RequestOptions): Promise<StoreOrder & { token: string }> =>\n this.request<StoreOrder & { token: string }>('POST', '/cart', {\n ...options,\n body: params,\n }),\n\n /**\n * Associate a guest cart with the currently authenticated user\n * Requires both JWT token (for authentication) and orderToken (to identify the cart)\n * @param options - Must include both `token` (JWT) and `orderToken` (guest cart token)\n */\n associate: (options: RequestOptions): Promise<StoreOrder & { token: string }> =>\n this.request<StoreOrder & { token: string }>('PATCH', '/cart/associate', options),\n };\n\n // ============================================\n // Orders (individual order management & checkout)\n // ============================================\n\n readonly orders = {\n /**\n * Get an order by ID or number\n */\n get: (\n idOrNumber: string,\n params?: { includes?: string },\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('GET', `/orders/${idOrNumber}`, {\n ...options,\n params,\n }),\n\n /**\n * Update an order\n */\n update: (\n idOrNumber: string,\n params: UpdateOrderParams,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('PATCH', `/orders/${idOrNumber}`, {\n ...options,\n body: params,\n }),\n\n /**\n * Advance order to next checkout step\n */\n next: (\n idOrNumber: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('PATCH', `/orders/${idOrNumber}/next`, options),\n\n /**\n * Advance through all checkout steps\n */\n advance: (\n idOrNumber: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'PATCH',\n `/orders/${idOrNumber}/advance`,\n options\n ),\n\n /**\n * Complete the order\n */\n complete: (\n idOrNumber: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'PATCH',\n `/orders/${idOrNumber}/complete`,\n options\n ),\n\n /**\n * Add store credit to order\n */\n addStoreCredit: (\n idOrNumber: string,\n amount?: number,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('POST', `/orders/${idOrNumber}/store_credits`, {\n ...options,\n body: amount ? { amount } : undefined,\n }),\n\n /**\n * Remove store credit from order\n */\n removeStoreCredit: (\n idOrNumber: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'DELETE',\n `/orders/${idOrNumber}/store_credits`,\n options\n ),\n\n /**\n * Nested resource: Line items\n */\n lineItems: {\n /**\n * Add a line item to an order.\n * Returns the updated order with recalculated totals.\n */\n create: (\n orderId: string,\n params: AddLineItemParams,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('POST', `/orders/${orderId}/line_items`, {\n ...options,\n body: params,\n }),\n\n /**\n * Update a line item quantity.\n * Returns the updated order with recalculated totals.\n */\n update: (\n orderId: string,\n lineItemId: string,\n params: UpdateLineItemParams,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'PATCH',\n `/orders/${orderId}/line_items/${lineItemId}`,\n { ...options, body: params }\n ),\n\n /**\n * Remove a line item from an order.\n * Returns the updated order with recalculated totals.\n */\n delete: (\n orderId: string,\n lineItemId: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'DELETE',\n `/orders/${orderId}/line_items/${lineItemId}`,\n options\n ),\n },\n\n /**\n * Nested resource: Payments\n */\n payments: {\n /**\n * List payments for an order\n */\n list: (\n orderId: string,\n options?: RequestOptions\n ): Promise<{ data: StorePayment[]; meta: object }> =>\n this.request<{ data: StorePayment[]; meta: object }>(\n 'GET',\n `/orders/${orderId}/payments`,\n options\n ),\n\n /**\n * Get a payment by ID\n */\n get: (\n orderId: string,\n paymentId: string,\n options?: RequestOptions\n ): Promise<StorePayment> =>\n this.request<StorePayment>(\n 'GET',\n `/orders/${orderId}/payments/${paymentId}`,\n options\n ),\n },\n\n /**\n * Nested resource: Payment methods\n */\n paymentMethods: {\n /**\n * List available payment methods for an order\n */\n list: (\n orderId: string,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StorePaymentMethod>> =>\n this.request<PaginatedResponse<StorePaymentMethod>>(\n 'GET',\n `/orders/${orderId}/payment_methods`,\n options\n ),\n },\n\n /**\n * Nested resource: Payment sessions\n */\n paymentSessions: {\n /**\n * Create a payment session for an order\n * Delegates to the payment gateway to initialize a provider-specific session\n */\n create: (\n orderId: string,\n params: CreatePaymentSessionParams,\n options?: RequestOptions\n ): Promise<StorePaymentSession> =>\n this.request<StorePaymentSession>(\n 'POST',\n `/orders/${orderId}/payment_sessions`,\n { ...options, body: params }\n ),\n\n /**\n * Get a payment session by ID\n */\n get: (\n orderId: string,\n sessionId: string,\n options?: RequestOptions\n ): Promise<StorePaymentSession> =>\n this.request<StorePaymentSession>(\n 'GET',\n `/orders/${orderId}/payment_sessions/${sessionId}`,\n options\n ),\n\n /**\n * Update a payment session\n * Delegates to the payment gateway to sync changes with the provider\n */\n update: (\n orderId: string,\n sessionId: string,\n params: UpdatePaymentSessionParams,\n options?: RequestOptions\n ): Promise<StorePaymentSession> =>\n this.request<StorePaymentSession>(\n 'PATCH',\n `/orders/${orderId}/payment_sessions/${sessionId}`,\n { ...options, body: params }\n ),\n\n /**\n * Complete a payment session\n * Confirms the payment with the provider, triggering capture/authorization\n */\n complete: (\n orderId: string,\n sessionId: string,\n params?: CompletePaymentSessionParams,\n options?: RequestOptions\n ): Promise<StorePaymentSession> =>\n this.request<StorePaymentSession>(\n 'PATCH',\n `/orders/${orderId}/payment_sessions/${sessionId}/complete`,\n { ...options, body: params }\n ),\n },\n\n /**\n * Nested resource: Coupon codes\n */\n couponCodes: {\n /**\n * Apply a coupon code to an order\n */\n apply: (\n orderId: string,\n code: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>('POST', `/orders/${orderId}/coupon_codes`, {\n ...options,\n body: { code },\n }),\n\n /**\n * Remove a coupon code from an order\n * @param promotionId - The promotion prefix_id (e.g., 'promo_xxx')\n */\n remove: (\n orderId: string,\n promotionId: string,\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'DELETE',\n `/orders/${orderId}/coupon_codes/${promotionId}`,\n options\n ),\n },\n\n /**\n * Nested resource: Shipments\n */\n shipments: {\n /**\n * List shipments for an order\n */\n list: (\n orderId: string,\n options?: RequestOptions\n ): Promise<{ data: StoreShipment[] }> =>\n this.request<{ data: StoreShipment[] }>(\n 'GET',\n `/orders/${orderId}/shipments`,\n options\n ),\n\n /**\n * Select a shipping rate for a shipment.\n * Returns the updated order with recalculated totals.\n */\n update: (\n orderId: string,\n shipmentId: string,\n params: { selected_shipping_rate_id: string },\n options?: RequestOptions\n ): Promise<StoreOrder> =>\n this.request<StoreOrder>(\n 'PATCH',\n `/orders/${orderId}/shipments/${shipmentId}`,\n { ...options, body: params }\n ),\n },\n };\n\n // ============================================\n // Customer\n // ============================================\n\n readonly customer = {\n /**\n * Get current customer profile\n */\n get: (options?: RequestOptions): Promise<StoreCustomer> =>\n this.request<StoreCustomer>('GET', '/customer', options),\n\n /**\n * Update current customer profile\n */\n update: (\n params: {\n first_name?: string\n last_name?: string\n email?: string\n password?: string\n password_confirmation?: string\n accepts_email_marketing?: boolean\n phone?: string\n },\n options?: RequestOptions\n ): Promise<StoreCustomer> =>\n this.request<StoreCustomer>('PATCH', '/customer', {\n ...options,\n body: params,\n }),\n\n /**\n * Nested resource: Addresses\n */\n addresses: {\n /**\n * List customer addresses\n */\n list: (\n params?: ListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreAddress>> =>\n this.request<PaginatedResponse<StoreAddress>>(\n 'GET',\n '/customer/addresses',\n { ...options, params: params as Record<string, string | number | undefined> }\n ),\n\n /**\n * Get an address by ID\n */\n get: (id: string, options?: RequestOptions): Promise<StoreAddress> =>\n this.request<StoreAddress>('GET', `/customer/addresses/${id}`, options),\n\n /**\n * Create an address\n */\n create: (\n params: AddressParams,\n options?: RequestOptions\n ): Promise<StoreAddress> =>\n this.request<StoreAddress>('POST', '/customer/addresses', {\n ...options,\n body: params,\n }),\n\n /**\n * Update an address\n */\n update: (\n id: string,\n params: Partial<AddressParams>,\n options?: RequestOptions\n ): Promise<StoreAddress> =>\n this.request<StoreAddress>('PATCH', `/customer/addresses/${id}`, {\n ...options,\n body: params,\n }),\n\n /**\n * Delete an address\n */\n delete: (id: string, options?: RequestOptions): Promise<void> =>\n this.request<void>('DELETE', `/customer/addresses/${id}`, options),\n\n /**\n * Mark an address as default billing or shipping\n */\n markAsDefault: (\n id: string,\n kind: 'billing' | 'shipping',\n options?: RequestOptions\n ): Promise<StoreAddress> =>\n this.request<StoreAddress>('PATCH', `/customer/addresses/${id}/mark_as_default`, {\n ...options,\n body: { kind },\n }),\n },\n\n /**\n * Nested resource: Credit Cards\n */\n creditCards: {\n /**\n * List customer credit cards\n */\n list: (\n params?: ListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreCreditCard>> =>\n this.request<PaginatedResponse<StoreCreditCard>>(\n 'GET',\n '/customer/credit_cards',\n { ...options, params: params as Record<string, string | number | undefined> }\n ),\n\n /**\n * Get a credit card by ID\n */\n get: (id: string, options?: RequestOptions): Promise<StoreCreditCard> =>\n this.request<StoreCreditCard>('GET', `/customer/credit_cards/${id}`, options),\n\n /**\n * Delete a credit card\n */\n delete: (id: string, options?: RequestOptions): Promise<void> =>\n this.request<void>('DELETE', `/customer/credit_cards/${id}`, options),\n },\n\n /**\n * Nested resource: Gift Cards\n */\n giftCards: {\n /**\n * List customer gift cards\n * Returns gift cards associated with the current user, ordered by newest first\n */\n list: (\n params?: ListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreGiftCard>> =>\n this.request<PaginatedResponse<StoreGiftCard>>(\n 'GET',\n '/customer/gift_cards',\n { ...options, params: params as Record<string, string | number | undefined> }\n ),\n\n /**\n * Get a gift card by ID\n */\n get: (id: string, options?: RequestOptions): Promise<StoreGiftCard> =>\n this.request<StoreGiftCard>('GET', `/customer/gift_cards/${id}`, options),\n },\n\n /**\n * Nested resource: Orders (customer order history)\n */\n orders: {\n /**\n * List orders for the authenticated customer\n */\n list: (\n params?: OrderListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreOrder>> =>\n this.request<PaginatedResponse<StoreOrder>>('GET', '/customer/orders', {\n ...options,\n params: params ? transformListParams(params) : undefined,\n }),\n },\n\n /**\n * Nested resource: Payment Setup Sessions (save payment methods for future use)\n */\n paymentSetupSessions: {\n /**\n * Create a payment setup session\n * Delegates to the payment gateway to initialize a setup flow for saving a payment method\n */\n create: (\n params: CreatePaymentSetupSessionParams,\n options?: RequestOptions\n ): Promise<StorePaymentSetupSession> =>\n this.request<StorePaymentSetupSession>(\n 'POST',\n '/customer/payment_setup_sessions',\n { ...options, body: params }\n ),\n\n /**\n * Get a payment setup session by ID\n */\n get: (id: string, options?: RequestOptions): Promise<StorePaymentSetupSession> =>\n this.request<StorePaymentSetupSession>('GET', `/customer/payment_setup_sessions/${id}`, options),\n\n /**\n * Complete a payment setup session\n * Confirms the setup with the provider, resulting in a saved payment method\n */\n complete: (\n id: string,\n params?: CompletePaymentSetupSessionParams,\n options?: RequestOptions\n ): Promise<StorePaymentSetupSession> =>\n this.request<StorePaymentSetupSession>(\n 'PATCH',\n `/customer/payment_setup_sessions/${id}/complete`,\n { ...options, body: params }\n ),\n },\n };\n\n // ============================================\n // Wishlists\n // ============================================\n\n readonly wishlists = {\n /**\n * List wishlists\n */\n list: (\n params?: ListParams,\n options?: RequestOptions\n ): Promise<PaginatedResponse<StoreWishlist>> =>\n this.request<PaginatedResponse<StoreWishlist>>('GET', '/wishlists', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n\n /**\n * Get a wishlist by ID\n */\n get: (\n id: string,\n params?: { includes?: string },\n options?: RequestOptions\n ): Promise<StoreWishlist> =>\n this.request<StoreWishlist>('GET', `/wishlists/${id}`, {\n ...options,\n params,\n }),\n\n /**\n * Create a wishlist\n */\n create: (\n params: { name: string; is_private?: boolean; is_default?: boolean },\n options?: RequestOptions\n ): Promise<StoreWishlist> =>\n this.request<StoreWishlist>('POST', '/wishlists', {\n ...options,\n body: params,\n }),\n\n /**\n * Update a wishlist\n */\n update: (\n id: string,\n params: { name?: string; is_private?: boolean; is_default?: boolean },\n options?: RequestOptions\n ): Promise<StoreWishlist> =>\n this.request<StoreWishlist>('PATCH', `/wishlists/${id}`, {\n ...options,\n body: params,\n }),\n\n /**\n * Delete a wishlist\n */\n delete: (id: string, options?: RequestOptions): Promise<void> =>\n this.request<void>('DELETE', `/wishlists/${id}`, options),\n\n /**\n * Nested resource: Wishlist items\n */\n items: {\n /**\n * Add an item to a wishlist\n */\n create: (\n wishlistId: string,\n params: { variant_id: string; quantity?: number },\n options?: RequestOptions\n ): Promise<StoreWishedItem> =>\n this.request<StoreWishedItem>('POST', `/wishlists/${wishlistId}/items`, {\n ...options,\n body: params,\n }),\n\n /**\n * Update a wishlist item\n */\n update: (\n wishlistId: string,\n itemId: string,\n params: { quantity: number },\n options?: RequestOptions\n ): Promise<StoreWishedItem> =>\n this.request<StoreWishedItem>(\n 'PATCH',\n `/wishlists/${wishlistId}/items/${itemId}`,\n { ...options, body: params }\n ),\n\n /**\n * Remove an item from a wishlist\n */\n delete: (\n wishlistId: string,\n itemId: string,\n options?: RequestOptions\n ): Promise<void> =>\n this.request<void>(\n 'DELETE',\n `/wishlists/${wishlistId}/items/${itemId}`,\n options\n ),\n },\n };\n}\n","import type { RequestFn } from './request';\n\nexport class AdminClient {\n /** @internal */\n private readonly request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n\n // Prevent \"unused\" TS error — will be used as admin endpoints are added\n void this.request;\n }\n}\n","import { createRequestFn } from './request';\nimport type { RetryConfig, RequestConfig } from './request';\nimport type { LocaleDefaults } from './types';\nimport { StoreClient } from './store-client';\nimport { AdminClient } from './admin-client';\n\n// Re-export types for convenience\nexport type { AddressParams, StoreCreditCard, LocaleDefaults } from './types';\n\nexport interface SpreeClientConfig {\n /** Base URL of the Spree API (e.g., 'https://api.mystore.com') */\n baseUrl: string;\n /** Publishable API key for Store API access */\n publishableKey: string;\n /** Secret API key for Admin API access (optional) */\n secretKey?: string;\n /** Custom fetch implementation (optional, defaults to global fetch) */\n fetch?: typeof fetch;\n /** Retry configuration. Enabled by default. Pass false to disable. */\n retry?: RetryConfig | false;\n /** Default locale for API requests (e.g., 'fr') */\n locale?: string;\n /** Default currency for API requests (e.g., 'EUR') */\n currency?: string;\n /** Default country ISO code for market resolution (e.g., 'FR') */\n country?: string;\n}\n\nexport class SpreeClient {\n /** Store API — customer-facing endpoints (products, cart, checkout, account) */\n readonly store: StoreClient;\n /** Admin API — administrative endpoints (manage orders, products, settings) */\n readonly admin: AdminClient;\n\n private readonly _defaults: LocaleDefaults;\n\n constructor(config: SpreeClientConfig) {\n const baseUrl = config.baseUrl.replace(/\\/$/, '');\n // Bind fetch to globalThis to avoid \"Illegal invocation\" errors in browsers\n const fetchFn = config.fetch || fetch.bind(globalThis);\n\n this._defaults = {\n locale: config.locale,\n currency: config.currency,\n country: config.country,\n };\n\n let retryConfig: Required<RetryConfig> | false;\n if (config.retry === false) {\n retryConfig = false;\n } else {\n retryConfig = {\n maxRetries: config.retry?.maxRetries ?? 2,\n retryOnStatus: config.retry?.retryOnStatus ?? [429, 500, 502, 503, 504],\n baseDelay: config.retry?.baseDelay ?? 300,\n maxDelay: config.retry?.maxDelay ?? 10000,\n retryOnNetworkError: config.retry?.retryOnNetworkError ?? true,\n };\n }\n\n const requestConfig: RequestConfig = { baseUrl, fetchFn, retryConfig };\n\n const storeRequestFn = createRequestFn(\n requestConfig,\n '/api/v3/store',\n { headerName: 'x-spree-api-key', headerValue: config.publishableKey },\n this._defaults\n );\n\n const adminRequestFn = createRequestFn(\n requestConfig,\n '/api/v3/admin',\n {\n headerName: 'Authorization',\n headerValue: config.secretKey ? `Bearer ${config.secretKey}` : '',\n },\n this._defaults\n );\n\n this.store = new StoreClient(storeRequestFn);\n this.admin = new AdminClient(adminRequestFn);\n }\n\n /** Set default locale for all subsequent requests */\n setLocale(locale: string): void {\n this._defaults.locale = locale;\n }\n\n /** Set default currency for all subsequent requests */\n setCurrency(currency: string): void {\n this._defaults.currency = currency;\n }\n\n /** Set default country for all subsequent requests */\n setCountry(country: string): void {\n this._defaults.country = country;\n }\n}\n\n/**\n * Create a new Spree SDK client\n */\nexport function createSpreeClient(config: SpreeClientConfig): SpreeClient {\n return new SpreeClient(config);\n}\n"]}
@@ -13,6 +13,7 @@ type StoreAddress = {
13
13
  country_iso: string;
14
14
  state_text: string | null;
15
15
  state_abbr: string | null;
16
+ quick_checkout: boolean;
16
17
  state_name: string | null;
17
18
  };
18
19
 
@@ -91,6 +92,7 @@ type AdminOrder = {
91
92
  currency: string;
92
93
  locale: string | null;
93
94
  item_count: number;
95
+ state_lock_version: number;
94
96
  shipment_state: string | null;
95
97
  payment_state: string | null;
96
98
  item_total: string;
@@ -536,6 +538,7 @@ type StoreOrder = {
536
538
  currency: string;
537
539
  locale: string | null;
538
540
  item_count: number;
541
+ state_lock_version: number;
539
542
  shipment_state: string | null;
540
543
  payment_state: string | null;
541
544
  item_total: string;
@@ -627,27 +630,6 @@ type StorePaymentSource = {
627
630
  gateway_payment_profile_id: string | null;
628
631
  };
629
632
 
630
- type StorePostCategory = {
631
- id: string;
632
- title: string;
633
- slug: string;
634
- created_at: string;
635
- updated_at: string;
636
- };
637
-
638
- type StorePost = {
639
- id: string;
640
- title: string;
641
- slug: string;
642
- meta_title: string | null;
643
- meta_description: string | null;
644
- published_at: string | null;
645
- created_at: string;
646
- updated_at: string;
647
- author_id: string | null;
648
- post_category_id: string | null;
649
- };
650
-
651
633
  type StorePrice = {
652
634
  id: string;
653
635
  amount: string | null;
@@ -967,6 +949,11 @@ type StoreWishlist = {
967
949
  items?: Array<StoreWishedItem>;
968
950
  };
969
951
 
952
+ interface LocaleDefaults {
953
+ locale?: string;
954
+ currency?: string;
955
+ country?: string;
956
+ }
970
957
  interface PaginationMeta {
971
958
  page: number;
972
959
  limit: number;
@@ -1007,24 +994,52 @@ interface RegisterParams {
1007
994
  interface ListParams {
1008
995
  page?: number;
1009
996
  per_page?: number;
1010
- includes?: string;
997
+ /** Associations to include. Accepts array or comma-separated string. */
998
+ includes?: string[] | string;
1011
999
  }
1012
1000
  interface ProductListParams extends ListParams {
1013
- 'q[name_cont]'?: string;
1014
- 'q[price_gte]'?: number;
1015
- 'q[price_lte]'?: number;
1016
- 'q[taxons_id_eq]'?: string;
1001
+ /** Sort: 'price asc', 'price desc', 'best_selling', 'name asc', 'name desc', 'available_on desc', 'available_on asc' */
1002
+ sort?: string;
1003
+ /** Full-text search across name and SKU */
1004
+ multi_search?: string;
1005
+ /** Filter: name contains */
1006
+ name_cont?: string;
1007
+ /** Filter: price >= value */
1008
+ price_gte?: number;
1009
+ /** Filter: price <= value */
1010
+ price_lte?: number;
1011
+ /** Filter by option value prefix IDs */
1012
+ with_option_value_ids?: string[];
1013
+ /** Filter: only in-stock products */
1014
+ in_stock?: boolean;
1015
+ /** Filter: only out-of-stock products */
1016
+ out_of_stock?: boolean;
1017
+ /** Filter: products in taxon */
1018
+ taxons_id_eq?: string;
1019
+ /** Any additional Ransack predicate */
1020
+ [key: string]: string | number | boolean | (string | number)[] | undefined;
1017
1021
  }
1018
1022
  interface TaxonListParams extends ListParams {
1019
- 'q[taxonomy_id_eq]'?: string | number;
1020
- 'q[parent_id_eq]'?: string | number;
1021
- 'q[depth_eq]'?: number;
1022
- 'q[name_cont]'?: string;
1023
+ /** Sort order, e.g. 'name asc', 'created_at desc' */
1024
+ sort?: string;
1025
+ /** Filter: name contains */
1026
+ name_cont?: string;
1027
+ taxonomy_id_eq?: string | number;
1028
+ parent_id_eq?: string | number;
1029
+ depth_eq?: number;
1030
+ /** Any additional Ransack predicate */
1031
+ [key: string]: string | number | boolean | (string | number)[] | undefined;
1023
1032
  }
1024
1033
  interface OrderListParams extends ListParams {
1025
- 'q[state_eq]'?: string;
1026
- 'q[completed_at_gte]'?: string;
1027
- 'q[completed_at_lte]'?: string;
1034
+ /** Sort order, e.g. 'completed_at desc' */
1035
+ sort?: string;
1036
+ /** Full-text search across number, email, customer name */
1037
+ multi_search?: string;
1038
+ state_eq?: string;
1039
+ completed_at_gte?: string;
1040
+ completed_at_lte?: string;
1041
+ /** Any additional Ransack predicate */
1042
+ [key: string]: string | number | boolean | (string | number)[] | undefined;
1028
1043
  }
1029
1044
  interface CreateCartParams {
1030
1045
  /** Arbitrary key-value metadata (stored, not returned in responses) */
@@ -1056,6 +1071,8 @@ interface AddressParams {
1056
1071
  state_abbr?: string;
1057
1072
  /** State name - used for countries without predefined states */
1058
1073
  state_name?: string;
1074
+ /** When true, relaxes validation requirements (name, phone, zipcode, street) */
1075
+ quick_checkout?: boolean;
1059
1076
  }
1060
1077
  interface UpdateOrderParams {
1061
1078
  email?: string;
@@ -1095,20 +1112,22 @@ interface CompletePaymentSetupSessionParams {
1095
1112
  }
1096
1113
  interface FilterOption {
1097
1114
  id: string;
1098
- label: string;
1099
1115
  count: number;
1100
1116
  }
1101
1117
  interface OptionFilterOption extends FilterOption {
1102
1118
  name: string;
1119
+ presentation: string;
1103
1120
  position: number;
1104
1121
  }
1105
- interface TaxonFilterOption extends FilterOption {
1122
+ interface TaxonFilterOption {
1123
+ id: string;
1124
+ name: string;
1106
1125
  permalink: string;
1126
+ count: number;
1107
1127
  }
1108
1128
  interface PriceRangeFilter {
1109
1129
  id: 'price';
1110
1130
  type: 'price_range';
1111
- label: string;
1112
1131
  min: number;
1113
1132
  max: number;
1114
1133
  currency: string;
@@ -1116,26 +1135,23 @@ interface PriceRangeFilter {
1116
1135
  interface AvailabilityFilter {
1117
1136
  id: 'availability';
1118
1137
  type: 'availability';
1119
- label: string;
1120
1138
  options: FilterOption[];
1121
1139
  }
1122
1140
  interface OptionFilter {
1123
1141
  id: string;
1124
1142
  type: 'option';
1125
- label: string;
1126
1143
  name: string;
1144
+ presentation: string;
1127
1145
  options: OptionFilterOption[];
1128
1146
  }
1129
1147
  interface TaxonFilter {
1130
1148
  id: 'taxons';
1131
1149
  type: 'taxon';
1132
- label: string;
1133
1150
  options: TaxonFilterOption[];
1134
1151
  }
1135
1152
  type ProductFilter = PriceRangeFilter | AvailabilityFilter | OptionFilter | TaxonFilter;
1136
1153
  interface SortOption {
1137
1154
  id: string;
1138
- label: string;
1139
1155
  }
1140
1156
  interface ProductFiltersResponse {
1141
1157
  filters: ProductFilter[];
@@ -1148,4 +1164,4 @@ interface ProductFiltersParams {
1148
1164
  q?: Record<string, unknown>;
1149
1165
  }
1150
1166
 
1151
- export type { AddLineItemParams, AddressParams, AdminCustomer, AdminLineItem, AdminMetafield, AdminOrder, AdminPrice, AdminProduct, AdminTaxon, AdminTaxonomy, AdminVariant, AuthTokens, AvailabilityFilter, CompletePaymentSessionParams, CompletePaymentSetupSessionParams, CreateCartParams, CreatePaymentSessionParams, CreatePaymentSetupSessionParams, ErrorResponse, FilterOption, ListParams, LoginCredentials, OptionFilter, OptionFilterOption, OrderListParams, PaginatedResponse, PaginationMeta, PriceRangeFilter, ProductFilter, ProductFiltersParams, ProductFiltersResponse, ProductListParams, RegisterParams, SortOption, StoreAddress, StoreAsset, StoreBase, StoreCountry, StoreCreditCard, StoreCurrency, StoreCustomer, StoreCustomerReturn, StoreDigital, StoreDigitalLink, StoreExport, StoreGiftCard, StoreGiftCardBatch, StoreImage, StoreImport, StoreImportRow, StoreInvitation, StoreLineItem, StoreLocale, StoreMetafield, StoreNewsletterSubscriber, StoreOptionType, StoreOptionValue, StoreOrder, StoreOrderPromotion, StorePayment, StorePaymentMethod, StorePaymentSession, StorePaymentSetupSession, StorePaymentSource, StorePost, StorePostCategory, StorePrice, StoreProduct, StorePromotion, StoreRefund, StoreReimbursement, StoreReport, StoreReturnAuthorization, StoreReturnItem, StoreShipment, StoreShippingMethod, StoreShippingRate, StoreState, StoreStockItem, StoreStockLocation, StoreStockMovement, StoreStockTransfer, StoreStore, StoreStoreCredit, StoreTaxon, StoreTaxonomy, StoreVariant, StoreWishedItem, StoreWishlist, TaxonFilter, TaxonFilterOption, TaxonListParams, UpdateLineItemParams, UpdateOrderParams, UpdatePaymentSessionParams };
1167
+ export type { AddLineItemParams, AddressParams, AdminCustomer, AdminLineItem, AdminMetafield, AdminOrder, AdminPrice, AdminProduct, AdminTaxon, AdminTaxonomy, AdminVariant, AuthTokens, AvailabilityFilter, CompletePaymentSessionParams, CompletePaymentSetupSessionParams, CreateCartParams, CreatePaymentSessionParams, CreatePaymentSetupSessionParams, ErrorResponse, FilterOption, ListParams, LocaleDefaults, LoginCredentials, OptionFilter, OptionFilterOption, OrderListParams, PaginatedResponse, PaginationMeta, PriceRangeFilter, ProductFilter, ProductFiltersParams, ProductFiltersResponse, ProductListParams, RegisterParams, SortOption, StoreAddress, StoreAsset, StoreBase, StoreCountry, StoreCreditCard, StoreCurrency, StoreCustomer, StoreCustomerReturn, StoreDigital, StoreDigitalLink, StoreExport, StoreGiftCard, StoreGiftCardBatch, StoreImage, StoreImport, StoreImportRow, StoreInvitation, StoreLineItem, StoreLocale, StoreMetafield, StoreNewsletterSubscriber, StoreOptionType, StoreOptionValue, StoreOrder, StoreOrderPromotion, StorePayment, StorePaymentMethod, StorePaymentSession, StorePaymentSetupSession, StorePaymentSource, StorePrice, StoreProduct, StorePromotion, StoreRefund, StoreReimbursement, StoreReport, StoreReturnAuthorization, StoreReturnItem, StoreShipment, StoreShippingMethod, StoreShippingRate, StoreState, StoreStockItem, StoreStockLocation, StoreStockMovement, StoreStockTransfer, StoreStore, StoreStoreCredit, StoreTaxon, StoreTaxonomy, StoreVariant, StoreWishedItem, StoreWishlist, TaxonFilter, TaxonFilterOption, TaxonListParams, UpdateLineItemParams, UpdateOrderParams, UpdatePaymentSessionParams };