@01.software/sdk 0.41.1 → 0.42.0

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.
Files changed (61) hide show
  1. package/CHANGELOG.md +208 -0
  2. package/README.md +81 -18
  3. package/dist/analytics/react.cjs +71 -3
  4. package/dist/analytics/react.cjs.map +1 -1
  5. package/dist/analytics/react.d.cts +18 -2
  6. package/dist/analytics/react.d.ts +18 -2
  7. package/dist/analytics/react.js +67 -3
  8. package/dist/analytics/react.js.map +1 -1
  9. package/dist/analytics.cjs +6 -2
  10. package/dist/analytics.cjs.map +1 -1
  11. package/dist/analytics.d.cts +17 -4
  12. package/dist/analytics.d.ts +17 -4
  13. package/dist/analytics.js +6 -2
  14. package/dist/analytics.js.map +1 -1
  15. package/dist/client.cjs +176 -32
  16. package/dist/client.cjs.map +1 -1
  17. package/dist/client.d.cts +6 -6
  18. package/dist/client.d.ts +6 -6
  19. package/dist/client.js +176 -32
  20. package/dist/client.js.map +1 -1
  21. package/dist/{collection-client-Bk--pNzW.d.cts → collection-client-B-qVIBnJ.d.cts} +3 -3
  22. package/dist/{collection-client-BdcxkW7l.d.ts → collection-client-BhCMwIus.d.ts} +3 -3
  23. package/dist/{const-qGGI7Uii.d.cts → const-BiDujixF.d.cts} +1 -1
  24. package/dist/{const-HwdntWtG.d.ts → const-pmHlwm3E.d.ts} +1 -1
  25. package/dist/{index-B1oW50RY.d.ts → index-B1UBDaKz.d.ts} +3 -3
  26. package/dist/{index-DiXtjVab.d.cts → index-D78ki6Ij.d.cts} +3 -3
  27. package/dist/index.cjs +156 -339
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +7 -7
  30. package/dist/index.d.ts +7 -7
  31. package/dist/index.js +156 -339
  32. package/dist/index.js.map +1 -1
  33. package/dist/{payload-types-CqJOgON7.d.cts → payload-types-C7Ul4ElL.d.cts} +181 -115
  34. package/dist/{payload-types-CqJOgON7.d.ts → payload-types-C7Ul4ElL.d.ts} +181 -115
  35. package/dist/query.d.cts +5 -5
  36. package/dist/query.d.ts +5 -5
  37. package/dist/realtime.cjs +1 -1
  38. package/dist/realtime.cjs.map +1 -1
  39. package/dist/realtime.d.cts +2 -2
  40. package/dist/realtime.d.ts +2 -2
  41. package/dist/realtime.js +1 -1
  42. package/dist/realtime.js.map +1 -1
  43. package/dist/server.cjs +230 -46
  44. package/dist/server.cjs.map +1 -1
  45. package/dist/server.d.cts +7 -7
  46. package/dist/server.d.ts +7 -7
  47. package/dist/server.js +230 -46
  48. package/dist/server.js.map +1 -1
  49. package/dist/{types-DgfXb7iV.d.ts → types-BL7M-EUV.d.cts} +138 -13
  50. package/dist/{types-BMI3M0nb.d.ts → types-Bf2iCjy8.d.ts} +1 -1
  51. package/dist/{types-ByLSG-O3.d.cts → types-ChV1t4ei.d.cts} +1 -1
  52. package/dist/{types-BKa9z9s2.d.cts → types-D5dSNIGs.d.ts} +138 -13
  53. package/dist/ui/canvas.cjs.map +1 -1
  54. package/dist/ui/canvas.js.map +1 -1
  55. package/dist/ui/form.d.cts +1 -1
  56. package/dist/ui/form.d.ts +1 -1
  57. package/dist/ui/video.d.cts +1 -1
  58. package/dist/ui/video.d.ts +1 -1
  59. package/dist/webhook.d.cts +4 -4
  60. package/dist/webhook.d.ts +4 -4
  61. package/package.json +1 -1
package/dist/client.cjs CHANGED
@@ -98,6 +98,26 @@ var TimeoutError = class extends SDKError {
98
98
  this.name = "TimeoutError";
99
99
  }
100
100
  };
101
+ var GoneError = class extends SDKError {
102
+ constructor(message = "The requested resource is no longer available.", details, userMessage, suggestion) {
103
+ super("GONE_ERROR", message, 410, details, userMessage, suggestion);
104
+ this.name = "GoneError";
105
+ }
106
+ };
107
+ var ServiceUnavailableError = class extends SDKError {
108
+ constructor(message = "Service temporarily unavailable.", retryAfter, details, userMessage, suggestion) {
109
+ super(
110
+ "SERVICE_UNAVAILABLE_ERROR",
111
+ message,
112
+ 503,
113
+ details,
114
+ userMessage,
115
+ suggestion
116
+ );
117
+ this.name = "ServiceUnavailableError";
118
+ this.retryAfter = retryAfter;
119
+ }
120
+ };
101
121
  var UsageLimitError = class extends SDKError {
102
122
  constructor(message, usage, details, userMessage, suggestion) {
103
123
  super("USAGE_LIMIT_ERROR", message, 429, details, userMessage, suggestion);
@@ -179,6 +199,14 @@ var createValidationError = (message, details, userMessage, suggestion, status)
179
199
  var createApiError = (message, status, details, userMessage, suggestion, requestId) => new ApiError(message, status, details, userMessage, suggestion, requestId);
180
200
  var createConfigError = (message, details, userMessage, suggestion) => new ConfigError(message, details, userMessage, suggestion);
181
201
  var createTimeoutError = (message, details, userMessage, suggestion) => new TimeoutError(message, details, userMessage, suggestion);
202
+ var createGoneError = (message, details, userMessage, suggestion) => new GoneError(message, details, userMessage, suggestion);
203
+ var createServiceUnavailableError = (message, retryAfter, details, userMessage, suggestion) => new ServiceUnavailableError(
204
+ message,
205
+ retryAfter,
206
+ details,
207
+ userMessage,
208
+ suggestion
209
+ );
182
210
  var createUsageLimitError = (message, usage, details, userMessage, suggestion) => new UsageLimitError(message, usage, details, userMessage, suggestion);
183
211
  var createAuthError = (message, details, userMessage, suggestion, requestId) => new AuthError(message, details, userMessage, suggestion, requestId);
184
212
  var createPermissionError = (message, details, userMessage, suggestion, requestId) => new PermissionError(message, details, userMessage, suggestion, requestId);
@@ -203,7 +231,7 @@ function requirePublishableKeyForSecret(apiName, publishableKey, secretKey) {
203
231
  return publishableKey ?? "";
204
232
  }
205
233
 
206
- // src/core/client/types.ts
234
+ // src/core/internal/utils/api-url.ts
207
235
  function resolveApiUrl(apiUrl) {
208
236
  if (apiUrl) {
209
237
  return apiUrl.replace(/\/$/, "");
@@ -220,7 +248,7 @@ function resolveApiUrl(apiUrl) {
220
248
  // src/core/internal/utils/http.ts
221
249
  var DEFAULT_TIMEOUT = 3e4;
222
250
  var STOREFRONT_BROWSER_TIMEOUT = 15e3;
223
- var DEFAULT_RETRYABLE_STATUSES = [408, 429, 500, 502, 503, 504];
251
+ var DEFAULT_RETRYABLE_STATUSES = [408, 500, 502, 503, 504];
224
252
  var NON_RETRYABLE_STATUSES = [400, 401, 403, 404, 409, 422];
225
253
  var SAFE_METHODS = ["GET", "HEAD", "OPTIONS"];
226
254
  var DEFAULT_MAX_RETRIES = 3;
@@ -337,7 +365,12 @@ function attachRequestId(err, id) {
337
365
  if (id) err.requestId = id;
338
366
  return err;
339
367
  }
340
- function createHttpStatusError(status, parsed, details, requestId) {
368
+ function parseRetryAfter(response) {
369
+ const raw = response.headers.get("Retry-After");
370
+ if (!raw) return void 0;
371
+ return parseInt(raw, 10) || void 0;
372
+ }
373
+ function mapResponseToError(status, parsed, details, requestId, retryAfter) {
341
374
  const errorDetails = {
342
375
  ...details,
343
376
  ...parsed.errors && { errors: parsed.errors },
@@ -400,6 +433,41 @@ function createHttpStatusError(status, parsed, details, requestId) {
400
433
  requestId
401
434
  );
402
435
  }
436
+ if (status === 410) {
437
+ return attachRequestId(
438
+ createGoneError(
439
+ parsed.errorMessage,
440
+ errorDetails,
441
+ parsed.userMessage,
442
+ suggestion
443
+ ),
444
+ requestId
445
+ );
446
+ }
447
+ if (status === 429) {
448
+ return attachRequestId(
449
+ createRateLimitError(
450
+ parsed.errorMessage,
451
+ retryAfter,
452
+ errorDetails,
453
+ parsed.userMessage,
454
+ suggestion
455
+ ),
456
+ requestId
457
+ );
458
+ }
459
+ if (status === 503) {
460
+ return attachRequestId(
461
+ createServiceUnavailableError(
462
+ parsed.errorMessage,
463
+ retryAfter,
464
+ errorDetails,
465
+ parsed.userMessage,
466
+ suggestion
467
+ ),
468
+ requestId
469
+ );
470
+ }
403
471
  return attachRequestId(
404
472
  createNetworkError(
405
473
  parsed.errorMessage,
@@ -518,26 +586,17 @@ async function httpFetch(url, options) {
518
586
  method: requestInit.method || "GET",
519
587
  attempt: attempt + 1
520
588
  };
521
- if (NON_RETRYABLE_STATUSES.includes(response.status)) {
522
- throw createHttpStatusError(
523
- response.status,
524
- parsed,
525
- details,
526
- requestId
527
- );
528
- }
529
- const error = attachRequestId(
530
- createNetworkError(
531
- parsed.errorMessage,
532
- response.status,
533
- details,
534
- parsed.userMessage,
535
- getErrorSuggestion(response.status)
536
- ),
537
- requestId
589
+ const retryAfter = parseRetryAfter(response);
590
+ const error = mapResponseToError(
591
+ response.status,
592
+ parsed,
593
+ details,
594
+ requestId,
595
+ retryAfter
538
596
  );
539
597
  const method2 = (requestInit.method || "GET").toUpperCase();
540
- if (attempt < retryConfig.maxRetries && SAFE_METHODS.includes(method2) && retryConfig.retryableStatuses.includes(response.status)) {
598
+ const isTerminal = error instanceof RateLimitError || error instanceof UsageLimitError;
599
+ if (attempt < retryConfig.maxRetries && SAFE_METHODS.includes(method2) && !isTerminal && !NON_RETRYABLE_STATUSES.includes(response.status) && retryConfig.retryableStatuses.includes(response.status)) {
541
600
  lastError = error;
542
601
  const retryDelay = retryConfig.retryDelay(attempt);
543
602
  debugLog(debug, "error", `Retrying in ${retryDelay}ms...`, error);
@@ -1547,42 +1606,123 @@ var CustomerNamespace = class {
1547
1606
  }
1548
1607
  };
1549
1608
 
1609
+ // src/core/api/endpoints.ts
1610
+ var COMMERCE_ENDPOINTS = {
1611
+ orders: {
1612
+ create: "/api/orders/create",
1613
+ update: "/api/orders/update",
1614
+ confirmPayment: "/api/orders/confirm-payment",
1615
+ byPayment: "/api/orders/by-payment",
1616
+ cancel: "/api/orders/cancel",
1617
+ resolveCancelRefund: "/api/orders/resolve-cancel-refund",
1618
+ checkout: "/api/orders/checkout",
1619
+ createFulfillment: "/api/orders/create-fulfillment",
1620
+ updateFulfillment: "/api/orders/update-fulfillment"
1621
+ },
1622
+ transactions: {
1623
+ update: "/api/transactions/update"
1624
+ },
1625
+ returns: {
1626
+ create: "/api/returns/create",
1627
+ update: "/api/returns/update",
1628
+ returnRefund: "/api/returns/return-refund"
1629
+ },
1630
+ fulfillmentOrders: {
1631
+ prepare: "/api/fulfillment-orders/prepare-fulfillment-order"
1632
+ },
1633
+ fulfillments: {
1634
+ bulkImport: "/api/fulfillments/bulk-import"
1635
+ },
1636
+ carts: {
1637
+ mine: "/api/carts/mine",
1638
+ merge: "/api/carts/merge",
1639
+ addItem: "/api/carts/add-item",
1640
+ updateItem: "/api/carts/update-item",
1641
+ removeItem: "/api/carts/remove-item",
1642
+ applyDiscount: "/api/carts/apply-discount",
1643
+ removeDiscount: "/api/carts/remove-discount",
1644
+ clear: "/api/carts/clear"
1645
+ }
1646
+ };
1647
+ var COMMERCE_ENDPOINT_PATHS = Object.values(
1648
+ COMMERCE_ENDPOINTS
1649
+ ).flatMap((group) => Object.values(group));
1650
+
1550
1651
  // src/core/api/cart-api.ts
1551
1652
  var CartApi = class extends CustomerScopedApi {
1552
1653
  constructor(options) {
1553
- super("CartApi", options);
1654
+ super("CartApi", { ...options, requiresCredential: false });
1554
1655
  }
1555
1656
  async execute(endpoint, method, body) {
1556
1657
  return this.request(endpoint, { method, body });
1557
1658
  }
1558
- getCart(cartId) {
1659
+ /**
1660
+ * Create a cart and receive its `cartToken`. Store the token and pass it to
1661
+ * every subsequent cart operation.
1662
+ */
1663
+ createCart(params = {}) {
1664
+ return this.execute("/api/carts/create", "POST", params);
1665
+ }
1666
+ getCart(cartToken) {
1667
+ return this.execute("/api/carts/get", "POST", { cartToken });
1668
+ }
1669
+ merge(params) {
1559
1670
  return this.execute(
1560
- `/api/carts/${cartId}?depth=0&joins=false`,
1561
- "GET"
1671
+ COMMERCE_ENDPOINTS.carts.merge,
1672
+ "POST",
1673
+ params
1674
+ );
1675
+ }
1676
+ /**
1677
+ * Resolve the authenticated customer's active cart by JWT (no `cartToken`
1678
+ * required). Returns the cart and its capability handle, or both `null` when
1679
+ * the customer has no active cart. Requires a customer token.
1680
+ */
1681
+ mine() {
1682
+ return this.execute(
1683
+ COMMERCE_ENDPOINTS.carts.mine,
1684
+ "POST",
1685
+ {}
1562
1686
  );
1563
1687
  }
1564
1688
  addItem(params) {
1565
- return this.execute("/api/carts/add-item", "POST", params);
1689
+ return this.execute(
1690
+ COMMERCE_ENDPOINTS.carts.addItem,
1691
+ "POST",
1692
+ params
1693
+ );
1566
1694
  }
1567
1695
  updateItem(params) {
1568
- return this.execute("/api/carts/update-item", "POST", params);
1696
+ return this.execute(
1697
+ COMMERCE_ENDPOINTS.carts.updateItem,
1698
+ "POST",
1699
+ params
1700
+ );
1569
1701
  }
1570
1702
  removeItem(params) {
1571
1703
  return this.execute(
1572
- "/api/carts/remove-item",
1704
+ COMMERCE_ENDPOINTS.carts.removeItem,
1573
1705
  "POST",
1574
1706
  params
1575
1707
  );
1576
1708
  }
1577
1709
  applyDiscount(params) {
1578
- return this.execute("/api/carts/apply-discount", "POST", params);
1710
+ return this.execute(
1711
+ COMMERCE_ENDPOINTS.carts.applyDiscount,
1712
+ "POST",
1713
+ params
1714
+ );
1579
1715
  }
1580
1716
  removeDiscount(params) {
1581
- return this.execute("/api/carts/remove-discount", "POST", params);
1717
+ return this.execute(
1718
+ COMMERCE_ENDPOINTS.carts.removeDiscount,
1719
+ "POST",
1720
+ params
1721
+ );
1582
1722
  }
1583
1723
  clearCart(params) {
1584
1724
  return this.execute(
1585
- "/api/carts/clear",
1725
+ COMMERCE_ENDPOINTS.carts.clear,
1586
1726
  "POST",
1587
1727
  params
1588
1728
  );
@@ -2393,6 +2533,7 @@ function compareVariantOrder(a, b) {
2393
2533
  function getVariantAvailableForSale(variant) {
2394
2534
  if (variant.isActive === false) return false;
2395
2535
  if (variant.isUnlimited) return true;
2536
+ if (variant.inventoryPolicy === "continue") return true;
2396
2537
  return (variant.stock ?? 0) - (variant.reservedStock ?? 0) > 0;
2397
2538
  }
2398
2539
  function isVariantAvailableForSale(variant) {
@@ -2770,13 +2911,16 @@ var CommerceClient = class {
2770
2911
  }
2771
2912
  };
2772
2913
  this.cart = {
2914
+ create: cartApi.createCart.bind(cartApi),
2773
2915
  get: cartApi.getCart.bind(cartApi),
2774
2916
  addItem: cartApi.addItem.bind(cartApi),
2775
2917
  updateItem: cartApi.updateItem.bind(cartApi),
2776
2918
  removeItem: cartApi.removeItem.bind(cartApi),
2777
2919
  applyDiscount: cartApi.applyDiscount.bind(cartApi),
2778
2920
  removeDiscount: cartApi.removeDiscount.bind(cartApi),
2779
- clear: cartApi.clearCart.bind(cartApi)
2921
+ clear: cartApi.clearCart.bind(cartApi),
2922
+ merge: cartApi.merge.bind(cartApi),
2923
+ mine: cartApi.mine.bind(cartApi)
2780
2924
  };
2781
2925
  this.orders = {
2782
2926
  checkout: (params) => {