@spree/sdk 0.1.8 → 0.2.1

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.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { LoginCredentials, AuthTokens, RegisterParams, StoreStore, ProductListParams, PaginatedResponse, StoreProduct, ProductFiltersParams, ProductFiltersResponse, ListParams, StoreTaxonomy, TaxonListParams, StoreTaxon, StoreCountry, StoreOrder, OrderListParams, UpdateOrderParams, AddLineItemParams, StoreLineItem, UpdateLineItemParams, StorePayment, StorePaymentMethod, StoreShipment, StoreCustomer, StoreAddress, AddressParams, StoreCreditCard, StoreGiftCard, StoreWishlist, StoreWishedItem, ErrorResponse } from './types/index.js';
1
+ import { ErrorResponse, LoginCredentials, AuthTokens, RegisterParams, StoreStore, ProductListParams, PaginatedResponse, StoreProduct, ProductFiltersParams, ProductFiltersResponse, ListParams, StoreTaxonomy, TaxonListParams, StoreTaxon, StoreCountry, StoreOrder, OrderListParams, UpdateOrderParams, AddLineItemParams, StoreLineItem, UpdateLineItemParams, StorePayment, StorePaymentMethod, CreatePaymentSessionParams, StorePaymentSession, UpdatePaymentSessionParams, CompletePaymentSessionParams, StoreShipment, StoreCustomer, StoreAddress, AddressParams, StoreCreditCard, StoreGiftCard, StoreWishlist, StoreWishedItem } from './types/index.js';
2
2
  export { AdminCustomer, AdminMetafield, AdminOrder, AdminPrice, AdminProduct, AdminTaxon, AdminTaxonomy, AdminVariant, AvailabilityFilter, FilterOption, OptionFilter, OptionFilterOption, PaginationMeta, PriceRangeFilter, ProductFilter, SortOption, StoreBase, StoreDigitalLink, StoreImage, StoreMetafield, StoreOptionType, StoreOptionValue, StoreOrderPromotion, StorePrice, StoreShippingMethod, StoreShippingRate, StoreState, StoreStockLocation, StoreVariant, TaxonFilter, TaxonFilterOption } from './types/index.js';
3
3
 
4
4
  interface RetryConfig {
@@ -13,16 +13,6 @@ interface RetryConfig {
13
13
  /** Whether to retry on network errors (default: true) */
14
14
  retryOnNetworkError?: boolean;
15
15
  }
16
- interface SpreeClientConfig {
17
- /** Base URL of the Spree API (e.g., 'https://api.mystore.com') */
18
- baseUrl: string;
19
- /** Publishable API key for store access */
20
- apiKey: string;
21
- /** Custom fetch implementation (optional, defaults to global fetch) */
22
- fetch?: typeof fetch;
23
- /** Retry configuration. Enabled by default. Pass false to disable. */
24
- retry?: RetryConfig | false;
25
- }
26
16
  interface RequestOptions {
27
17
  /** Bearer token for authenticated requests */
28
18
  token?: string;
@@ -35,23 +25,21 @@ interface RequestOptions {
35
25
  /** Custom headers */
36
26
  headers?: Record<string, string>;
37
27
  }
28
+ interface InternalRequestOptions extends RequestOptions {
29
+ body?: unknown;
30
+ params?: Record<string, string | number | undefined>;
31
+ }
38
32
  declare class SpreeError extends Error {
39
33
  readonly code: string;
40
34
  readonly status: number;
41
35
  readonly details?: Record<string, string[]>;
42
36
  constructor(response: ErrorResponse, status: number);
43
37
  }
44
- declare class SpreeClient {
45
- private readonly baseUrl;
46
- private readonly apiKey;
47
- private readonly fetchFn;
48
- private readonly retryConfig;
49
- constructor(config: SpreeClientConfig);
50
- private calculateDelay;
51
- private sleep;
52
- private shouldRetryOnStatus;
53
- private shouldRetryOnNetworkError;
54
- private request;
38
+ type RequestFn = <T>(method: string, path: string, options?: InternalRequestOptions) => Promise<T>;
39
+
40
+ declare class StoreClient {
41
+ private readonly request;
42
+ constructor(request: RequestFn);
55
43
  readonly auth: {
56
44
  /**
57
45
  * Login with email and password
@@ -243,6 +231,30 @@ declare class SpreeClient {
243
231
  */
244
232
  list: (orderId: string, options?: RequestOptions) => Promise<PaginatedResponse<StorePaymentMethod>>;
245
233
  };
234
+ /**
235
+ * Nested resource: Payment sessions
236
+ */
237
+ paymentSessions: {
238
+ /**
239
+ * Create a payment session for an order
240
+ * Delegates to the payment gateway to initialize a provider-specific session
241
+ */
242
+ create: (orderId: string, params: CreatePaymentSessionParams, options?: RequestOptions) => Promise<StorePaymentSession>;
243
+ /**
244
+ * Get a payment session by ID
245
+ */
246
+ get: (orderId: string, sessionId: string, options?: RequestOptions) => Promise<StorePaymentSession>;
247
+ /**
248
+ * Update a payment session
249
+ * Delegates to the payment gateway to sync changes with the provider
250
+ */
251
+ update: (orderId: string, sessionId: string, params: UpdatePaymentSessionParams, options?: RequestOptions) => Promise<StorePaymentSession>;
252
+ /**
253
+ * Complete a payment session
254
+ * Confirms the payment with the provider, triggering capture/authorization
255
+ */
256
+ complete: (orderId: string, sessionId: string, params?: CompletePaymentSessionParams, options?: RequestOptions) => Promise<StorePaymentSession>;
257
+ };
246
258
  /**
247
259
  * Nested resource: Coupon codes
248
260
  */
@@ -408,9 +420,35 @@ declare class SpreeClient {
408
420
  };
409
421
  };
410
422
  }
423
+
424
+ declare class AdminClient {
425
+ /** @internal */
426
+ private readonly request;
427
+ constructor(request: RequestFn);
428
+ }
429
+
430
+ interface SpreeClientConfig {
431
+ /** Base URL of the Spree API (e.g., 'https://api.mystore.com') */
432
+ baseUrl: string;
433
+ /** Publishable API key for Store API access */
434
+ publishableKey: string;
435
+ /** Secret API key for Admin API access (optional) */
436
+ secretKey?: string;
437
+ /** Custom fetch implementation (optional, defaults to global fetch) */
438
+ fetch?: typeof fetch;
439
+ /** Retry configuration. Enabled by default. Pass false to disable. */
440
+ retry?: RetryConfig | false;
441
+ }
442
+ declare class SpreeClient {
443
+ /** Store API — customer-facing endpoints (products, cart, checkout, account) */
444
+ readonly store: StoreClient;
445
+ /** Admin API — administrative endpoints (manage orders, products, settings) */
446
+ readonly admin: AdminClient;
447
+ constructor(config: SpreeClientConfig);
448
+ }
411
449
  /**
412
450
  * Create a new Spree SDK client
413
451
  */
414
452
  declare function createSpreeClient(config: SpreeClientConfig): SpreeClient;
415
453
 
416
- export { AddLineItemParams, AddressParams, AuthTokens, ErrorResponse, ListParams, LoginCredentials, OrderListParams, PaginatedResponse, ProductFiltersParams, ProductFiltersResponse, ProductListParams, RegisterParams, type RequestOptions, type RetryConfig, SpreeClient, type SpreeClientConfig, SpreeError, StoreAddress, StoreCountry, StoreCreditCard, StoreCustomer, StoreGiftCard, StoreLineItem, StoreOrder, StorePayment, StorePaymentMethod, StoreProduct, StoreShipment, StoreStore, StoreTaxon, StoreTaxonomy, StoreWishedItem, StoreWishlist, TaxonListParams, UpdateLineItemParams, UpdateOrderParams, createSpreeClient };
454
+ export { AddLineItemParams, AddressParams, AdminClient, AuthTokens, CompletePaymentSessionParams, CreatePaymentSessionParams, ErrorResponse, ListParams, LoginCredentials, OrderListParams, PaginatedResponse, ProductFiltersParams, ProductFiltersResponse, ProductListParams, RegisterParams, type RequestOptions, type RetryConfig, SpreeClient, type SpreeClientConfig, SpreeError, StoreAddress, StoreClient, StoreCountry, StoreCreditCard, StoreCustomer, StoreGiftCard, StoreLineItem, StoreOrder, StorePayment, StorePaymentMethod, StorePaymentSession, StoreProduct, StoreShipment, StoreStore, StoreTaxon, StoreTaxonomy, StoreWishedItem, StoreWishlist, TaxonListParams, UpdateLineItemParams, UpdateOrderParams, UpdatePaymentSessionParams, createSpreeClient };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // src/client.ts
1
+ // src/request.ts
2
2
  var SpreeError = class extends Error {
3
3
  code;
4
4
  status;
@@ -11,49 +11,29 @@ var SpreeError = class extends Error {
11
11
  this.details = response.error.details;
12
12
  }
13
13
  };
14
- var SpreeClient = class {
15
- baseUrl;
16
- apiKey;
17
- fetchFn;
18
- retryConfig;
19
- constructor(config) {
20
- this.baseUrl = config.baseUrl.replace(/\/$/, "");
21
- this.apiKey = config.apiKey;
22
- this.fetchFn = config.fetch || fetch.bind(globalThis);
23
- if (config.retry === false) {
24
- this.retryConfig = false;
25
- } else {
26
- this.retryConfig = {
27
- maxRetries: config.retry?.maxRetries ?? 2,
28
- retryOnStatus: config.retry?.retryOnStatus ?? [429, 500, 502, 503, 504],
29
- baseDelay: config.retry?.baseDelay ?? 300,
30
- maxDelay: config.retry?.maxDelay ?? 1e4,
31
- retryOnNetworkError: config.retry?.retryOnNetworkError ?? true
32
- };
33
- }
34
- }
35
- calculateDelay(attempt, config) {
36
- const exponentialDelay = config.baseDelay * Math.pow(2, attempt);
37
- const jitter = Math.random() * config.baseDelay;
38
- return Math.min(exponentialDelay + jitter, config.maxDelay);
39
- }
40
- sleep(ms) {
41
- return new Promise((resolve) => setTimeout(resolve, ms));
42
- }
43
- shouldRetryOnStatus(method, status, config) {
44
- const isIdempotent = method === "GET" || method === "HEAD";
45
- if (isIdempotent) {
46
- return config.retryOnStatus.includes(status);
47
- }
48
- return status === 429;
49
- }
50
- shouldRetryOnNetworkError(method, config) {
51
- if (!config.retryOnNetworkError) return false;
52
- return method === "GET" || method === "HEAD";
14
+ function calculateDelay(attempt, config) {
15
+ const exponentialDelay = config.baseDelay * Math.pow(2, attempt);
16
+ const jitter = Math.random() * config.baseDelay;
17
+ return Math.min(exponentialDelay + jitter, config.maxDelay);
18
+ }
19
+ function sleep(ms) {
20
+ return new Promise((resolve) => setTimeout(resolve, ms));
21
+ }
22
+ function shouldRetryOnStatus(method, status, config) {
23
+ const isIdempotent = method === "GET" || method === "HEAD";
24
+ if (isIdempotent) {
25
+ return config.retryOnStatus.includes(status);
53
26
  }
54
- async request(method, path, options = {}) {
27
+ return status === 429;
28
+ }
29
+ function shouldRetryOnNetworkError(method, config) {
30
+ if (!config.retryOnNetworkError) return false;
31
+ return method === "GET" || method === "HEAD";
32
+ }
33
+ function createRequestFn(config, basePath, auth) {
34
+ return async function request(method, path, options = {}) {
55
35
  const { token, orderToken, locale, currency, headers = {}, body, params } = options;
56
- const url = new URL(`${this.baseUrl}/api/v3/store${path}`);
36
+ const url = new URL(`${config.baseUrl}${basePath}${path}`);
57
37
  if (params) {
58
38
  Object.entries(params).forEach(([key, value]) => {
59
39
  if (value !== void 0) {
@@ -70,7 +50,7 @@ var SpreeClient = class {
70
50
  }
71
51
  const requestHeaders = {
72
52
  "Content-Type": "application/json",
73
- "x-spree-api-key": this.apiKey,
53
+ [auth.headerName]: auth.headerValue,
74
54
  ...headers
75
55
  };
76
56
  if (token) {
@@ -85,20 +65,20 @@ var SpreeClient = class {
85
65
  if (currency) {
86
66
  requestHeaders["x-spree-currency"] = currency;
87
67
  }
88
- const maxAttempts = this.retryConfig ? this.retryConfig.maxRetries + 1 : 1;
68
+ const maxAttempts = config.retryConfig ? config.retryConfig.maxRetries + 1 : 1;
89
69
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
90
70
  try {
91
- const response = await this.fetchFn(url.toString(), {
71
+ const response = await config.fetchFn(url.toString(), {
92
72
  method,
93
73
  headers: requestHeaders,
94
74
  body: body ? JSON.stringify(body) : void 0
95
75
  });
96
76
  if (!response.ok) {
97
77
  const isLastAttempt = attempt >= maxAttempts - 1;
98
- if (!isLastAttempt && this.retryConfig && this.shouldRetryOnStatus(method, response.status, this.retryConfig)) {
78
+ if (!isLastAttempt && config.retryConfig && shouldRetryOnStatus(method, response.status, config.retryConfig)) {
99
79
  const retryAfter = response.headers.get("Retry-After");
100
- const delay = retryAfter ? Math.min(parseInt(retryAfter, 10) * 1e3, this.retryConfig.maxDelay) : this.calculateDelay(attempt, this.retryConfig);
101
- await this.sleep(delay);
80
+ const delay = retryAfter ? Math.min(parseInt(retryAfter, 10) * 1e3, config.retryConfig.maxDelay) : calculateDelay(attempt, config.retryConfig);
81
+ await sleep(delay);
102
82
  continue;
103
83
  }
104
84
  const errorBody = await response.json();
@@ -113,15 +93,23 @@ var SpreeClient = class {
113
93
  throw error;
114
94
  }
115
95
  const isLastAttempt = attempt >= maxAttempts - 1;
116
- if (!isLastAttempt && this.retryConfig && this.shouldRetryOnNetworkError(method, this.retryConfig)) {
117
- const delay = this.calculateDelay(attempt, this.retryConfig);
118
- await this.sleep(delay);
96
+ if (!isLastAttempt && config.retryConfig && shouldRetryOnNetworkError(method, config.retryConfig)) {
97
+ const delay = calculateDelay(attempt, config.retryConfig);
98
+ await sleep(delay);
119
99
  continue;
120
100
  }
121
101
  throw error;
122
102
  }
123
103
  }
124
104
  throw new Error("Unexpected end of retry loop");
105
+ };
106
+ }
107
+
108
+ // src/store-client.ts
109
+ var StoreClient = class {
110
+ request;
111
+ constructor(request) {
112
+ this.request = request;
125
113
  }
126
114
  // ============================================
127
115
  // Authentication
@@ -377,6 +365,46 @@ var SpreeClient = class {
377
365
  options
378
366
  )
379
367
  },
368
+ /**
369
+ * Nested resource: Payment sessions
370
+ */
371
+ paymentSessions: {
372
+ /**
373
+ * Create a payment session for an order
374
+ * Delegates to the payment gateway to initialize a provider-specific session
375
+ */
376
+ create: (orderId, params, options) => this.request(
377
+ "POST",
378
+ `/orders/${orderId}/payment_sessions`,
379
+ { ...options, body: params }
380
+ ),
381
+ /**
382
+ * Get a payment session by ID
383
+ */
384
+ get: (orderId, sessionId, options) => this.request(
385
+ "GET",
386
+ `/orders/${orderId}/payment_sessions/${sessionId}`,
387
+ options
388
+ ),
389
+ /**
390
+ * Update a payment session
391
+ * Delegates to the payment gateway to sync changes with the provider
392
+ */
393
+ update: (orderId, sessionId, params, options) => this.request(
394
+ "PATCH",
395
+ `/orders/${orderId}/payment_sessions/${sessionId}`,
396
+ { ...options, body: params }
397
+ ),
398
+ /**
399
+ * Complete a payment session
400
+ * Confirms the payment with the provider, triggering capture/authorization
401
+ */
402
+ complete: (orderId, sessionId, params, options) => this.request(
403
+ "PATCH",
404
+ `/orders/${orderId}/payment_sessions/${sessionId}/complete`,
405
+ { ...options, body: params }
406
+ )
407
+ },
380
408
  /**
381
409
  * Nested resource: Coupon codes
382
410
  */
@@ -583,10 +611,60 @@ var SpreeClient = class {
583
611
  }
584
612
  };
585
613
  };
614
+
615
+ // src/admin-client.ts
616
+ var AdminClient = class {
617
+ /** @internal */
618
+ request;
619
+ constructor(request) {
620
+ this.request = request;
621
+ void this.request;
622
+ }
623
+ };
624
+
625
+ // src/client.ts
626
+ var SpreeClient = class {
627
+ /** Store API — customer-facing endpoints (products, cart, checkout, account) */
628
+ store;
629
+ /** Admin API — administrative endpoints (manage orders, products, settings) */
630
+ admin;
631
+ constructor(config) {
632
+ const baseUrl = config.baseUrl.replace(/\/$/, "");
633
+ const fetchFn = config.fetch || fetch.bind(globalThis);
634
+ let retryConfig;
635
+ if (config.retry === false) {
636
+ retryConfig = false;
637
+ } else {
638
+ retryConfig = {
639
+ maxRetries: config.retry?.maxRetries ?? 2,
640
+ retryOnStatus: config.retry?.retryOnStatus ?? [429, 500, 502, 503, 504],
641
+ baseDelay: config.retry?.baseDelay ?? 300,
642
+ maxDelay: config.retry?.maxDelay ?? 1e4,
643
+ retryOnNetworkError: config.retry?.retryOnNetworkError ?? true
644
+ };
645
+ }
646
+ const requestConfig = { baseUrl, fetchFn, retryConfig };
647
+ const storeRequestFn = createRequestFn(
648
+ requestConfig,
649
+ "/api/v3/store",
650
+ { headerName: "x-spree-api-key", headerValue: config.publishableKey }
651
+ );
652
+ const adminRequestFn = createRequestFn(
653
+ requestConfig,
654
+ "/api/v3/admin",
655
+ {
656
+ headerName: "Authorization",
657
+ headerValue: config.secretKey ? `Bearer ${config.secretKey}` : ""
658
+ }
659
+ );
660
+ this.store = new StoreClient(storeRequestFn);
661
+ this.admin = new AdminClient(adminRequestFn);
662
+ }
663
+ };
586
664
  function createSpreeClient(config) {
587
665
  return new SpreeClient(config);
588
666
  }
589
667
 
590
- export { SpreeClient, SpreeError, createSpreeClient };
668
+ export { AdminClient, SpreeClient, SpreeError, StoreClient, createSpreeClient };
591
669
  //# sourceMappingURL=index.js.map
592
670
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";AA0EO,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;AAEO,IAAM,cAAN,MAAkB;AAAA,EACN,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EAEjB,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAErB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,KAAA,IAAS,KAAA,CAAM,KAAK,UAAU,CAAA;AAEpD,IAAA,IAAI,MAAA,CAAO,UAAU,KAAA,EAAO;AAC1B,MAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,WAAA,GAAc;AAAA,QACjB,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;AAAA,EACF;AAAA,EAEQ,cAAA,CAAe,SAAiB,MAAA,EAAuC;AAC7E,IAAA,MAAM,mBAAmB,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAO,GAAI,MAAA,CAAO,SAAA;AACtC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,gBAAA,GAAmB,MAAA,EAAQ,OAAO,QAAQ,CAAA;AAAA,EAC5D;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA,EAEQ,mBAAA,CAAoB,MAAA,EAAgB,MAAA,EAAgB,MAAA,EAAwC;AAClG,IAAA,MAAM,YAAA,GAAe,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,MAAA;AAGpD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAO,MAAA,CAAO,aAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,MAAA,KAAW,GAAA;AAAA,EACpB;AAAA,EAEQ,yBAAA,CAA0B,QAAgB,MAAA,EAAwC;AACxF,IAAA,IAAI,CAAC,MAAA,CAAO,mBAAA,EAAqB,OAAO,KAAA;AACxC,IAAA,OAAO,MAAA,KAAW,SAAS,MAAA,KAAW,MAAA;AAAA,EACxC;AAAA,EAEA,MAAc,OAAA,CACZ,MAAA,EACA,IAAA,EACA,OAAA,GAGI,EAAC,EACO;AACZ,IAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,UAAU,EAAC,EAAG,IAAA,EAAM,MAAA,EAAO,GAAI,OAAA;AAG5E,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,aAAA,EAAgB,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;AAEvB,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,mBAAmB,IAAA,CAAK,MAAA;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,MAAM,cAAc,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,aAAa,CAAA,GAAI,CAAA;AAEzE,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,WAAA,EAAa,OAAA,EAAA,EAAW;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,UAAS,EAAG;AAAA,UAClD,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,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAA,EAAG;AAC7G,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,IAAA,CAAK,YAAY,QAAQ,CAAA,GACnE,KAAK,cAAA,CAAe,OAAA,EAAS,KAAK,WAAW,CAAA;AACjD,YAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AACtB,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,IAAA,CAAK,WAAA,IAAe,KAAK,yBAAA,CAA0B,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAA,EAAG;AAClG,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,KAAK,WAAW,CAAA;AAC3D,UAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AACtB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAGA,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,EAChD;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;AAAA,KACD,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;AAAA,KACD,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;AAAA;AACF;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,IAMrE,GAAA,EAAK,CAAC,GAAA,EAAa,OAAA,KACjB,IAAA,CAAK,QAAsB,KAAA,EAAO,CAAA,WAAA,EAAc,GAAG,CAAA,CAAA,EAAI,OAAO;AAAA,GAClE;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,IAKtE,QAAQ,CAAC,OAAA,KACP,KAAK,OAAA,CAAwC,MAAA,EAAQ,WAAW,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOzE,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,MAAM,CACJ,MAAA,EACA,YAEA,IAAA,CAAK,OAAA,CAAuC,OAAO,SAAA,EAAW;AAAA,MAC5D,GAAG,OAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,QAAQ,CAAC,OAAA,KACP,KAAK,OAAA,CAA8C,MAAA,EAAQ,WAAW,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,IAK/E,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,CAAC,UAAA,EAAoB,OAAA,KACzB,IAAA,CAAK,QAAoB,OAAA,EAAS,CAAA,QAAA,EAAW,UAAU,CAAA,KAAA,CAAA,EAAS,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,IAKzE,OAAA,EAAS,CAAC,UAAA,EAAoB,OAAA,KAC5B,IAAA,CAAK,QAAoB,OAAA,EAAS,CAAA,QAAA,EAAW,UAAU,CAAA,QAAA,CAAA,EAAY,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,IAK5E,QAAA,EAAU,CAAC,UAAA,EAAoB,OAAA,KAC7B,IAAA,CAAK,QAAoB,OAAA,EAAS,CAAA,QAAA,EAAW,UAAU,CAAA,SAAA,CAAA,EAAa,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,IAK7E,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,QAAoB,QAAA,EAAU,CAAA,QAAA,EAAW,UAAU,CAAA,cAAA,CAAA,EAAkB,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,IAKnF,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA,MAIT,MAAA,EAAQ,CACN,OAAA,EACA,MAAA,EACA,OAAA,KAEA,KAAK,OAAA,CAAuB,MAAA,EAAQ,CAAA,QAAA,EAAW,OAAO,CAAA,WAAA,CAAA,EAAe;AAAA,QACnE,GAAG,OAAA;AAAA,QACH,IAAA,EAAM;AAAA,OACP,CAAA;AAAA;AAAA;AAAA;AAAA,MAKH,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,MAKF,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,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,MAKF,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;AAC5E,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;AAKO,SAAS,kBAAkB,MAAA,EAAwC;AACxE,EAAA,OAAO,IAAI,YAAY,MAAM,CAAA;AAC/B","file":"index.js","sourcesContent":["import type {\n AuthTokens,\n LoginCredentials,\n RegisterParams,\n ErrorResponse,\n PaginatedResponse,\n ListParams,\n ProductListParams,\n ProductFiltersParams,\n ProductFiltersResponse,\n TaxonListParams,\n OrderListParams,\n AddLineItemParams,\n UpdateLineItemParams,\n UpdateOrderParams,\n AddressParams,\n StoreCreditCard,\n StoreGiftCard,\n StoreProduct,\n StoreOrder,\n StoreLineItem,\n StoreCountry,\n StoreTaxonomy,\n StoreTaxon,\n StorePayment,\n StorePaymentMethod,\n StoreShipment,\n StoreStore,\n StoreWishlist,\n StoreWishedItem,\n StoreAddress,\n StoreCustomer,\n} from './types';\n\n// Re-export types for convenience\nexport type { AddressParams, StoreCreditCard };\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 SpreeClientConfig {\n /** Base URL of the Spree API (e.g., 'https://api.mystore.com') */\n baseUrl: string;\n /** Publishable API key for store access */\n apiKey: 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 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 /** Custom headers */\n headers?: Record<string, string>;\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 class SpreeClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetchFn: typeof fetch;\n private readonly retryConfig: Required<RetryConfig> | false;\n\n constructor(config: SpreeClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.apiKey = config.apiKey;\n // Bind fetch to globalThis to avoid \"Illegal invocation\" errors in browsers\n this.fetchFn = config.fetch || fetch.bind(globalThis);\n\n if (config.retry === false) {\n this.retryConfig = false;\n } else {\n this.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\n private 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\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private shouldRetryOnStatus(method: string, status: number, config: Required<RetryConfig>): boolean {\n const isIdempotent = method === 'GET' || method === 'HEAD';\n // Idempotent methods: retry on all configured statuses\n // Non-idempotent: only retry on 429 (rate limit)\n if (isIdempotent) {\n return config.retryOnStatus.includes(status);\n }\n return status === 429;\n }\n\n private shouldRetryOnNetworkError(method: string, config: Required<RetryConfig>): boolean {\n if (!config.retryOnNetworkError) return false;\n return method === 'GET' || method === 'HEAD';\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: RequestOptions & {\n body?: unknown;\n params?: Record<string, string | number | undefined>;\n } = {}\n ): Promise<T> {\n const { token, orderToken, locale, currency, headers = {}, body, params } = options;\n\n // Build URL with query params\n const url = new URL(`${this.baseUrl}/api/v3/store${path}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n // Handle arrays by appending each value with the same key (Rails-style)\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 'x-spree-api-key': this.apiKey,\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 const maxAttempts = this.retryConfig ? this.retryConfig.maxRetries + 1 : 1;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await this.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 && this.retryConfig && this.shouldRetryOnStatus(method, response.status, this.retryConfig)) {\n const retryAfter = response.headers.get('Retry-After');\n const delay = retryAfter\n ? Math.min(parseInt(retryAfter, 10) * 1000, this.retryConfig.maxDelay)\n : this.calculateDelay(attempt, this.retryConfig);\n await this.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 && this.retryConfig && this.shouldRetryOnNetworkError(method, this.retryConfig)) {\n const delay = this.calculateDelay(attempt, this.retryConfig);\n await this.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 // 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 // Geography\n // ============================================\n\n readonly countries = {\n /**\n * List countries available for checkout\n * Returns countries from the store's checkout zone without states\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 with states\n * @param iso - ISO 3166-1 alpha-2 code (e.g., \"US\", \"DE\")\n */\n get: (iso: string, options?: RequestOptions): Promise<StoreCountry> =>\n this.request<StoreCountry>('GET', `/countries/${iso}`, 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 (alias for orders.create)\n */\n create: (options?: RequestOptions): Promise<StoreOrder & { token: string }> =>\n this.request<StoreOrder & { token: string }>('POST', '/orders', options),\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 (all orders - complete and incomplete)\n // ============================================\n\n readonly 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', '/orders', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n\n /**\n * Create a new order (cart)\n */\n create: (options?: RequestOptions): Promise<StoreOrder & { order_token: string }> =>\n this.request<StoreOrder & { order_token: string }>('POST', '/orders', options),\n\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 */\n create: (\n orderId: string,\n params: AddLineItemParams,\n options?: RequestOptions\n ): Promise<StoreLineItem> =>\n this.request<StoreLineItem>('POST', `/orders/${orderId}/line_items`, {\n ...options,\n body: params,\n }),\n\n /**\n * Update a line item\n */\n update: (\n orderId: string,\n lineItemId: string,\n params: UpdateLineItemParams,\n options?: RequestOptions\n ): Promise<StoreLineItem> =>\n this.request<StoreLineItem>(\n 'PATCH',\n `/orders/${orderId}/line_items/${lineItemId}`,\n { ...options, body: params }\n ),\n\n /**\n * Remove a line item from an order\n */\n delete: (\n orderId: string,\n lineItemId: string,\n options?: RequestOptions\n ): Promise<void> =>\n this.request<void>(\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: 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 * Update a shipment (e.g., select shipping rate)\n */\n update: (\n orderId: string,\n shipmentId: string,\n params: { selected_shipping_rate_id: string },\n options?: RequestOptions\n ): Promise<StoreShipment> =>\n this.request<StoreShipment>(\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 // ============================================\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\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/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 /** 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, 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 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 AddLineItemParams,\n UpdateLineItemParams,\n UpdateOrderParams,\n AddressParams,\n CreatePaymentSessionParams,\n UpdatePaymentSessionParams,\n CompletePaymentSessionParams,\n StoreCreditCard,\n StoreGiftCard,\n StoreProduct,\n StoreOrder,\n StoreLineItem,\n StoreCountry,\n StoreTaxonomy,\n StoreTaxon,\n StorePayment,\n StorePaymentMethod,\n StorePaymentSession,\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 // Geography\n // ============================================\n\n readonly countries = {\n /**\n * List countries available for checkout\n * Returns countries from the store's checkout zone without states\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 with states\n * @param iso - ISO 3166-1 alpha-2 code (e.g., \"US\", \"DE\")\n */\n get: (iso: string, options?: RequestOptions): Promise<StoreCountry> =>\n this.request<StoreCountry>('GET', `/countries/${iso}`, 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 (alias for orders.create)\n */\n create: (options?: RequestOptions): Promise<StoreOrder & { token: string }> =>\n this.request<StoreOrder & { token: string }>('POST', '/orders', options),\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 (all orders - complete and incomplete)\n // ============================================\n\n readonly 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', '/orders', {\n ...options,\n params: params as Record<string, string | number | undefined>,\n }),\n\n /**\n * Create a new order (cart)\n */\n create: (options?: RequestOptions): Promise<StoreOrder & { order_token: string }> =>\n this.request<StoreOrder & { order_token: string }>('POST', '/orders', options),\n\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 */\n create: (\n orderId: string,\n params: AddLineItemParams,\n options?: RequestOptions\n ): Promise<StoreLineItem> =>\n this.request<StoreLineItem>('POST', `/orders/${orderId}/line_items`, {\n ...options,\n body: params,\n }),\n\n /**\n * Update a line item\n */\n update: (\n orderId: string,\n lineItemId: string,\n params: UpdateLineItemParams,\n options?: RequestOptions\n ): Promise<StoreLineItem> =>\n this.request<StoreLineItem>(\n 'PATCH',\n `/orders/${orderId}/line_items/${lineItemId}`,\n { ...options, body: params }\n ),\n\n /**\n * Remove a line item from an order\n */\n delete: (\n orderId: string,\n lineItemId: string,\n options?: RequestOptions\n ): Promise<void> =>\n this.request<void>(\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 * Update a shipment (e.g., select shipping rate)\n */\n update: (\n orderId: string,\n shipmentId: string,\n params: { selected_shipping_rate_id: string },\n options?: RequestOptions\n ): Promise<StoreShipment> =>\n this.request<StoreShipment>(\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 // ============================================\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"]}