@01.software/sdk 0.32.0 → 0.34.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 (70) hide show
  1. package/README.md +253 -38
  2. package/dist/analytics/react.cjs.map +1 -1
  3. package/dist/analytics/react.js.map +1 -1
  4. package/dist/analytics.cjs.map +1 -1
  5. package/dist/analytics.js.map +1 -1
  6. package/dist/client.cjs +368 -24
  7. package/dist/client.cjs.map +1 -1
  8. package/dist/client.d.cts +7 -6
  9. package/dist/client.d.ts +7 -6
  10. package/dist/client.js +368 -24
  11. package/dist/client.js.map +1 -1
  12. package/dist/{collection-client-CORhppPb.d.cts → collection-client-CR2B8c1v.d.cts} +7 -3
  13. package/dist/{collection-client-DPGXnhoF.d.ts → collection-client-DkREjhQ9.d.ts} +7 -3
  14. package/dist/{const-DcY2_z9O.d.ts → const-BTvdrXtY.d.cts} +5 -5
  15. package/dist/{const-Brk2Ff0q.d.cts → const-CdqCauHQ.d.ts} +5 -5
  16. package/dist/index-CjA3U6X3.d.cts +186 -0
  17. package/dist/index-DK8_NXkh.d.ts +186 -0
  18. package/dist/index.cjs +1651 -260
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +74 -9
  21. package/dist/index.d.ts +74 -9
  22. package/dist/index.js +1651 -260
  23. package/dist/index.js.map +1 -1
  24. package/dist/{payload-types-DVK1QCeU.d.cts → payload-types-C7tb7Xbs.d.cts} +2115 -1833
  25. package/dist/{payload-types-DVK1QCeU.d.ts → payload-types-C7tb7Xbs.d.ts} +2115 -1833
  26. package/dist/query.cjs +194 -35
  27. package/dist/query.cjs.map +1 -1
  28. package/dist/query.d.cts +45 -18
  29. package/dist/query.d.ts +45 -18
  30. package/dist/query.js +194 -35
  31. package/dist/query.js.map +1 -1
  32. package/dist/realtime.cjs.map +1 -1
  33. package/dist/realtime.d.cts +2 -2
  34. package/dist/realtime.d.ts +2 -2
  35. package/dist/realtime.js.map +1 -1
  36. package/dist/{server-CrsPyqEc.d.cts → server-nXOezi4b.d.cts} +22 -6
  37. package/dist/{server-CrsPyqEc.d.ts → server-nXOezi4b.d.ts} +22 -6
  38. package/dist/server.cjs +474 -36
  39. package/dist/server.cjs.map +1 -1
  40. package/dist/server.d.cts +11 -179
  41. package/dist/server.d.ts +11 -179
  42. package/dist/server.js +474 -36
  43. package/dist/server.js.map +1 -1
  44. package/dist/{types-DUPC7Xn6.d.ts → types-1ylMrCuW.d.ts} +1 -1
  45. package/dist/{types-ByMrR_Z_.d.cts → types-Bx558PU6.d.cts} +1 -1
  46. package/dist/{types-CYMSBkJC.d.ts → types-Byo_Rty4.d.ts} +728 -75
  47. package/dist/{types-CAkWqIr6.d.cts → types-DDhtZI6E.d.cts} +728 -75
  48. package/dist/ui/canvas/server.cjs +231 -38
  49. package/dist/ui/canvas/server.cjs.map +1 -1
  50. package/dist/ui/canvas/server.d.cts +1 -1
  51. package/dist/ui/canvas/server.d.ts +1 -1
  52. package/dist/ui/canvas/server.js +221 -38
  53. package/dist/ui/canvas/server.js.map +1 -1
  54. package/dist/ui/canvas.cjs +320 -257
  55. package/dist/ui/canvas.cjs.map +1 -1
  56. package/dist/ui/canvas.d.cts +5 -19
  57. package/dist/ui/canvas.d.ts +5 -19
  58. package/dist/ui/canvas.js +323 -260
  59. package/dist/ui/canvas.js.map +1 -1
  60. package/dist/ui/form.d.cts +1 -1
  61. package/dist/ui/form.d.ts +1 -1
  62. package/dist/ui/video.d.cts +1 -1
  63. package/dist/ui/video.d.ts +1 -1
  64. package/dist/webhook.cjs +95 -0
  65. package/dist/webhook.cjs.map +1 -1
  66. package/dist/webhook.d.cts +20 -104
  67. package/dist/webhook.d.ts +20 -104
  68. package/dist/webhook.js +95 -0
  69. package/dist/webhook.js.map +1 -1
  70. package/package.json +4 -5
package/dist/client.cjs CHANGED
@@ -218,9 +218,12 @@ function resolveApiUrl(apiUrl) {
218
218
 
219
219
  // src/core/internal/utils/http.ts
220
220
  var DEFAULT_TIMEOUT = 3e4;
221
+ var STOREFRONT_BROWSER_TIMEOUT = 15e3;
221
222
  var DEFAULT_RETRYABLE_STATUSES = [408, 429, 500, 502, 503, 504];
222
223
  var NON_RETRYABLE_STATUSES = [400, 401, 403, 404, 409, 422];
223
224
  var SAFE_METHODS = ["GET", "HEAD", "OPTIONS"];
225
+ var DEFAULT_MAX_RETRIES = 3;
226
+ var STOREFRONT_BROWSER_MAX_RETRIES = 1;
224
227
  function debugLog(debug, type, message, data) {
225
228
  if (!debug) return;
226
229
  const shouldLog = debug === true || type === "request" && debug.logRequests || type === "response" && debug.logResponses || type === "error" && debug.logErrors;
@@ -413,15 +416,18 @@ async function httpFetch(url, options) {
413
416
  publishableKey,
414
417
  secretKey,
415
418
  customerToken,
416
- timeout = DEFAULT_TIMEOUT,
419
+ timeout: timeoutOption = DEFAULT_TIMEOUT,
417
420
  debug,
418
421
  retry,
419
422
  onUnauthorized,
420
423
  ...requestInit
421
424
  } = options || {};
422
425
  const baseUrl = resolveApiUrl(apiUrl);
426
+ const method = (requestInit.method || "GET").toUpperCase();
427
+ const isPublishableKeyBrowserGet = typeof window !== "undefined" && !secretKey && !customerToken && Boolean(publishableKey) && SAFE_METHODS.includes(method);
428
+ const timeout = timeoutOption === DEFAULT_TIMEOUT && isPublishableKeyBrowserGet ? STOREFRONT_BROWSER_TIMEOUT : timeoutOption;
423
429
  const retryConfig = {
424
- maxRetries: retry?.maxRetries ?? 3,
430
+ maxRetries: retry?.maxRetries ?? (isPublishableKeyBrowserGet ? STOREFRONT_BROWSER_MAX_RETRIES : DEFAULT_MAX_RETRIES),
425
431
  retryableStatuses: retry?.retryableStatuses ?? DEFAULT_RETRYABLE_STATUSES,
426
432
  retryDelay: retry?.retryDelay ?? ((attempt) => Math.min(1e3 * 2 ** attempt, 1e4))
427
433
  };
@@ -529,8 +535,8 @@ async function httpFetch(url, options) {
529
535
  ),
530
536
  requestId
531
537
  );
532
- const method = (requestInit.method || "GET").toUpperCase();
533
- if (attempt < retryConfig.maxRetries && SAFE_METHODS.includes(method) && retryConfig.retryableStatuses.includes(response.status)) {
538
+ const method2 = (requestInit.method || "GET").toUpperCase();
539
+ if (attempt < retryConfig.maxRetries && SAFE_METHODS.includes(method2) && retryConfig.retryableStatuses.includes(response.status)) {
534
540
  lastError = error;
535
541
  const retryDelay = retryConfig.retryDelay(attempt);
536
542
  debugLog(debug, "error", `Retrying in ${retryDelay}ms...`, error);
@@ -542,8 +548,8 @@ async function httpFetch(url, options) {
542
548
  return response;
543
549
  } catch (error) {
544
550
  debugLog(debug, "error", url, error);
545
- const method = (requestInit.method || "GET").toUpperCase();
546
- const isSafe = SAFE_METHODS.includes(method);
551
+ const method2 = (requestInit.method || "GET").toUpperCase();
552
+ const isSafe = SAFE_METHODS.includes(method2);
547
553
  if (error instanceof Error && error.name === "AbortError") {
548
554
  const timeoutError = createTimeoutError(
549
555
  `Request timed out after ${timeout}ms.`,
@@ -602,6 +608,35 @@ async function httpFetch(url, options) {
602
608
  throw lastError ?? new NetworkError("Request failed after retries");
603
609
  }
604
610
 
611
+ // src/core/internal/utils/query-string.ts
612
+ function productDetailQuery(params) {
613
+ const search = new URLSearchParams();
614
+ if ("slug" in params) {
615
+ search.set("slug", params.slug);
616
+ } else {
617
+ search.set("id", params.id);
618
+ }
619
+ return `/api/products/detail?${search}`;
620
+ }
621
+ function productDetailCatalogQuery(params) {
622
+ const search = new URLSearchParams();
623
+ if ("slug" in params) {
624
+ search.set("slug", params.slug);
625
+ } else {
626
+ search.set("id", params.id);
627
+ }
628
+ return `/api/products/detail/catalog?${search}`;
629
+ }
630
+ function listingGroupsQuery(params) {
631
+ return `/api/products/listing-groups?ids=${params.productIds.map(encodeURIComponent).join(",")}`;
632
+ }
633
+ function listingGroupsCatalogQuery(params) {
634
+ return `/api/products/listing-groups/catalog?ids=${params.productIds.map(encodeURIComponent).join(",")}`;
635
+ }
636
+ function stockSnapshotQuery(params) {
637
+ return `/api/products/stock?variantIds=${params.variantIds.map(encodeURIComponent).join(",")}`;
638
+ }
639
+
605
640
  // src/core/collection/http-client.ts
606
641
  var HttpClient = class {
607
642
  constructor(publishableKey, secretKey, getCustomerToken, onUnauthorized, onRequestId, apiUrl) {
@@ -920,6 +955,8 @@ async function parseApiResponse(response, endpoint) {
920
955
  }
921
956
 
922
957
  // src/core/community/community-client.ts
958
+ var DEFAULT_POST_LIST_SORT = "-lastActivityAt";
959
+ var DEFAULT_COMMENT_LIST_SORT = "-createdAt";
923
960
  var CommunityClient = class {
924
961
  constructor(options) {
925
962
  this.publishableKey = requirePublishableKeyForSecret(
@@ -938,6 +975,40 @@ var CommunityClient = class {
938
975
  const entries = Object.entries(params).filter((e) => e[1] !== void 0).map(([k, v]) => [k, String(v)]);
939
976
  return entries.length ? `?${new URLSearchParams(entries).toString()}` : "";
940
977
  }
978
+ buildPostsListQuery(params) {
979
+ const urlParams = new URLSearchParams();
980
+ const sort = params?.sort ?? DEFAULT_POST_LIST_SORT;
981
+ urlParams.set("sort", sort);
982
+ if (params?.limit !== void 0) urlParams.set("limit", String(params.limit));
983
+ if (params?.page !== void 0) urlParams.set("page", String(params.page));
984
+ if (params?.categoryId !== void 0) {
985
+ urlParams.set("where[categories][in]", params.categoryId);
986
+ }
987
+ if (params?.tagId !== void 0) {
988
+ urlParams.set("where[tags][in]", params.tagId);
989
+ }
990
+ return `/api/posts?${urlParams.toString()}`;
991
+ }
992
+ buildCommentsListQuery(params) {
993
+ const urlParams = new URLSearchParams();
994
+ const sort = params.sort ?? DEFAULT_COMMENT_LIST_SORT;
995
+ urlParams.set("sort", sort);
996
+ if (params.postId !== void 0) {
997
+ urlParams.set("where[post][equals]", params.postId);
998
+ }
999
+ if (params.parentId !== void 0) {
1000
+ urlParams.set("where[parent][equals]", params.parentId);
1001
+ }
1002
+ if (params.rootComment !== void 0) {
1003
+ urlParams.set("where[rootComment][equals]", params.rootComment);
1004
+ }
1005
+ if (params.topLevelOnly) {
1006
+ urlParams.set("where[parent][exists]", "false");
1007
+ }
1008
+ if (params.limit !== void 0) urlParams.set("limit", String(params.limit));
1009
+ if (params.page !== void 0) urlParams.set("page", String(params.page));
1010
+ return `/api/comments?${urlParams.toString()}`;
1011
+ }
941
1012
  async execute(endpoint, method, body) {
942
1013
  const token = typeof this.customerToken === "function" ? this.customerToken() : this.customerToken;
943
1014
  try {
@@ -961,6 +1032,28 @@ var CommunityClient = class {
961
1032
  createPost(params) {
962
1033
  return this.execute("/api/posts", "POST", params);
963
1034
  }
1035
+ /**
1036
+ * Public post feed. Server applies the same visibility contract as
1037
+ * `communityPostRead` (published + visible + moderation-safe).
1038
+ */
1039
+ listPosts(params) {
1040
+ return this.execute(
1041
+ this.buildPostsListQuery(params),
1042
+ "GET"
1043
+ );
1044
+ }
1045
+ listPostCategories(params) {
1046
+ return this.execute(
1047
+ `/api/post-categories${this.buildQuery(params)}`,
1048
+ "GET"
1049
+ );
1050
+ }
1051
+ listPostTags(params) {
1052
+ return this.execute(
1053
+ `/api/post-tags${this.buildQuery(params)}`,
1054
+ "GET"
1055
+ );
1056
+ }
964
1057
  getMyPosts(params) {
965
1058
  return this.execute(
966
1059
  `/api/posts/my${this.buildQuery(params)}`,
@@ -996,16 +1089,37 @@ var CommunityClient = class {
996
1089
  }
997
1090
  return this.execute("/api/comments", "POST", body);
998
1091
  }
1092
+ /**
1093
+ * List comments for a post.
1094
+ *
1095
+ * - Default: all visible comments on the post (any depth).
1096
+ * - `topLevelOnly: true`: only root comments (`parent` unset).
1097
+ * - `rootComment`: comments belonging to a thread rooted at that comment.
1098
+ */
999
1099
  listComments(params) {
1000
- const { postId, page, limit, rootComment } = params;
1001
- const urlParams = new URLSearchParams();
1002
- urlParams.set("where[post][equals]", postId);
1003
- urlParams.set("sort", "-createdAt");
1004
- if (limit !== void 0) urlParams.set("limit", String(limit));
1005
- if (page !== void 0) urlParams.set("page", String(page));
1006
- if (rootComment !== void 0) urlParams.set("where[rootComment][equals]", rootComment);
1100
+ const { postId, page, limit, rootComment, topLevelOnly, sort } = params;
1101
+ return this.execute(
1102
+ this.buildCommentsListQuery({
1103
+ postId,
1104
+ page,
1105
+ limit,
1106
+ rootComment,
1107
+ topLevelOnly,
1108
+ sort
1109
+ }),
1110
+ "GET"
1111
+ );
1112
+ }
1113
+ /** Direct replies to a comment (`where[parent][equals]`). */
1114
+ listReplies(params) {
1115
+ const { commentId, page, limit, sort } = params;
1007
1116
  return this.execute(
1008
- `/api/comments?${urlParams.toString()}`,
1117
+ this.buildCommentsListQuery({
1118
+ parentId: commentId,
1119
+ page,
1120
+ limit,
1121
+ sort
1122
+ }),
1009
1123
  "GET"
1010
1124
  );
1011
1125
  }
@@ -1033,10 +1147,18 @@ var CommunityClient = class {
1033
1147
  }
1034
1148
  // Reactions
1035
1149
  addReaction(params) {
1036
- const { postId, type } = params;
1150
+ const { postId, typeSlug, type } = params;
1151
+ const reactionType = typeSlug ?? type;
1152
+ if (!reactionType) {
1153
+ throw new SDKError(
1154
+ "validation_failed",
1155
+ "addReaction requires typeSlug (or deprecated type)",
1156
+ 400
1157
+ );
1158
+ }
1037
1159
  return this.execute("/api/reactions", "POST", {
1038
1160
  post: postId,
1039
- type
1161
+ type: reactionType
1040
1162
  });
1041
1163
  }
1042
1164
  removeReaction(params) {
@@ -1047,10 +1169,18 @@ var CommunityClient = class {
1047
1169
  );
1048
1170
  }
1049
1171
  addCommentReaction(params) {
1050
- const { commentId, type } = params;
1172
+ const { commentId, typeSlug, type } = params;
1173
+ const reactionType = typeSlug ?? type;
1174
+ if (!reactionType) {
1175
+ throw new SDKError(
1176
+ "validation_failed",
1177
+ "addCommentReaction requires typeSlug (or deprecated type)",
1178
+ 400
1179
+ );
1180
+ }
1051
1181
  return this.execute("/api/reactions", "POST", {
1052
1182
  comment: commentId,
1053
- type
1183
+ type: reactionType
1054
1184
  });
1055
1185
  }
1056
1186
  removeCommentReaction(params) {
@@ -1066,6 +1196,12 @@ var CommunityClient = class {
1066
1196
  "GET"
1067
1197
  );
1068
1198
  }
1199
+ getCommentReactionSummary(params) {
1200
+ return this.execute(
1201
+ `/api/comments/${params.commentId}/reactions`,
1202
+ "GET"
1203
+ );
1204
+ }
1069
1205
  getReactionTypes() {
1070
1206
  return this.execute(
1071
1207
  "/api/reaction-types?limit=100",
@@ -1090,6 +1226,25 @@ var CommunityClient = class {
1090
1226
  "GET"
1091
1227
  );
1092
1228
  }
1229
+ // Profiles
1230
+ listProfileLists(params) {
1231
+ return this.execute(
1232
+ `/api/customer-profile-lists${this.buildQuery(params)}`,
1233
+ "GET"
1234
+ );
1235
+ }
1236
+ async getProfileList(params) {
1237
+ const query = "slug" in params ? `?where[slug][equals]=${encodeURIComponent(params.slug)}&limit=1` : `?where[id][equals]=${encodeURIComponent(params.id)}&limit=1`;
1238
+ const res = await this.execute(`/api/customer-profile-lists${query}`, "GET");
1239
+ return res.docs[0] ?? null;
1240
+ }
1241
+ updatePublicProfile(body) {
1242
+ return this.execute(
1243
+ "/api/customers/me/profile",
1244
+ "PATCH",
1245
+ body
1246
+ );
1247
+ }
1093
1248
  };
1094
1249
 
1095
1250
  // src/core/customer/customer-auth.ts
@@ -1375,6 +1530,39 @@ var CartApi = class {
1375
1530
  }
1376
1531
  };
1377
1532
 
1533
+ // src/core/api/product-api.ts
1534
+ var PRODUCT_DETAIL_UNAVAILABLE_REASONS = /* @__PURE__ */ new Set([
1535
+ "not_found",
1536
+ "not_published",
1537
+ "feature_disabled"
1538
+ ]);
1539
+ function isRecord(value) {
1540
+ return typeof value === "object" && value !== null;
1541
+ }
1542
+ function readProductDetailUnavailableReason(value) {
1543
+ if (!isRecord(value)) return void 0;
1544
+ const directReason = value.reason ?? value.code;
1545
+ if (typeof directReason === "string" && PRODUCT_DETAIL_UNAVAILABLE_REASONS.has(directReason)) {
1546
+ return directReason;
1547
+ }
1548
+ return readProductDetailUnavailableReason(value.body);
1549
+ }
1550
+ function productDetailResultFromError(error) {
1551
+ if (!(error instanceof SDKError) || error.status !== 404) return void 0;
1552
+ const reason = readProductDetailUnavailableReason(error.details);
1553
+ if (!reason) return void 0;
1554
+ return { found: false, reason };
1555
+ }
1556
+
1557
+ // src/core/api/order-api.ts
1558
+ function idempotencyRequestOptions(idempotencyKey) {
1559
+ return idempotencyKey ? { headers: { "X-Idempotency-Key": idempotencyKey } } : void 0;
1560
+ }
1561
+ function splitIdempotencyKey(params) {
1562
+ const { idempotencyKey, ...body } = params;
1563
+ return { body, idempotencyKey };
1564
+ }
1565
+
1378
1566
  // src/core/commerce/commerce-client.ts
1379
1567
  var CommerceClient = class {
1380
1568
  constructor(options) {
@@ -1385,7 +1573,7 @@ var CommerceClient = class {
1385
1573
  onUnauthorized: options.onUnauthorized,
1386
1574
  onRequestId: options.onRequestId
1387
1575
  });
1388
- const execute = async (endpoint, body) => {
1576
+ const execute = async (endpoint, body, requestOptions) => {
1389
1577
  const token = options.customerToken();
1390
1578
  try {
1391
1579
  const response = await httpFetch(endpoint, {
@@ -1394,7 +1582,26 @@ var CommerceClient = class {
1394
1582
  publishableKey: options.publishableKey,
1395
1583
  customerToken: token ?? void 0,
1396
1584
  ...token && options.onUnauthorized && { onUnauthorized: options.onUnauthorized },
1397
- body: JSON.stringify(body)
1585
+ body: JSON.stringify(body),
1586
+ ...requestOptions?.headers && { headers: requestOptions.headers }
1587
+ });
1588
+ options.onRequestId?.(response.headers.get("x-request-id") ?? null);
1589
+ return parseApiResponse(response, endpoint);
1590
+ } catch (err) {
1591
+ const id = err instanceof SDKError ? err.requestId ?? null : null;
1592
+ options.onRequestId?.(id);
1593
+ throw err;
1594
+ }
1595
+ };
1596
+ const executeGet = async (endpoint) => {
1597
+ const token = options.customerToken();
1598
+ try {
1599
+ const response = await httpFetch(endpoint, {
1600
+ method: "GET",
1601
+ apiUrl: options.apiUrl,
1602
+ publishableKey: options.publishableKey,
1603
+ customerToken: token ?? void 0,
1604
+ ...token && options.onUnauthorized && { onUnauthorized: options.onUnauthorized }
1398
1605
  });
1399
1606
  options.onRequestId?.(response.headers.get("x-request-id") ?? null);
1400
1607
  return parseApiResponse(response, endpoint);
@@ -1406,12 +1613,28 @@ var CommerceClient = class {
1406
1613
  };
1407
1614
  this.product = {
1408
1615
  stockCheck: (params) => execute("/api/products/stock-check", params),
1409
- listingGroups: (params) => execute("/api/products/listing-groups", params),
1616
+ stockSnapshot: (params) => executeGet(stockSnapshotQuery(params)),
1617
+ listingGroups: (params) => executeGet(listingGroupsQuery(params)),
1618
+ listingGroupsCatalog: (params) => executeGet(listingGroupsCatalogQuery(params)),
1410
1619
  detail: async (params) => {
1411
1620
  try {
1412
- return await execute("/api/products/detail", params);
1621
+ const product = await executeGet(productDetailQuery(params));
1622
+ return { found: true, product };
1413
1623
  } catch (err) {
1414
- if (err instanceof NotFoundError) return null;
1624
+ const notFoundResult = productDetailResultFromError(err);
1625
+ if (notFoundResult) return notFoundResult;
1626
+ throw err;
1627
+ }
1628
+ },
1629
+ detailCatalog: async (params) => {
1630
+ try {
1631
+ const product = await executeGet(
1632
+ productDetailCatalogQuery(params)
1633
+ );
1634
+ return { found: true, product };
1635
+ } catch (err) {
1636
+ const notFoundResult = productDetailResultFromError(err);
1637
+ if (notFoundResult?.found === false) return notFoundResult;
1415
1638
  throw err;
1416
1639
  }
1417
1640
  }
@@ -1426,7 +1649,14 @@ var CommerceClient = class {
1426
1649
  clear: cartApi.clearCart.bind(cartApi)
1427
1650
  };
1428
1651
  this.orders = {
1429
- checkout: (params) => execute("/api/orders/checkout", params),
1652
+ checkout: (params) => {
1653
+ const { body, idempotencyKey } = splitIdempotencyKey(params);
1654
+ return execute(
1655
+ "/api/orders/checkout",
1656
+ body,
1657
+ idempotencyRequestOptions(idempotencyKey)
1658
+ );
1659
+ },
1430
1660
  listMine: (params) => options.customerAuth.getMyOrders(params)
1431
1661
  };
1432
1662
  this.discounts = {
@@ -1438,6 +1668,113 @@ var CommerceClient = class {
1438
1668
  }
1439
1669
  };
1440
1670
 
1671
+ // src/core/events/events-client.ts
1672
+ var EventsClient = class {
1673
+ constructor(options) {
1674
+ const secretKey = options.secretKey;
1675
+ this.publishableKey = requirePublishableKeyForSecret(
1676
+ "EventsClient",
1677
+ options.publishableKey,
1678
+ secretKey
1679
+ );
1680
+ this.apiUrl = options.apiUrl;
1681
+ this.customerToken = options.customerToken;
1682
+ this.onUnauthorized = options.onUnauthorized;
1683
+ this.onRequestId = options.onRequestId;
1684
+ }
1685
+ getRange(params) {
1686
+ return this.execute(
1687
+ buildRangeEndpoint(params),
1688
+ "GET",
1689
+ void 0,
1690
+ { useCustomerAuth: false }
1691
+ );
1692
+ }
1693
+ register(params) {
1694
+ return this.execute(
1695
+ "/api/event-registrations/register",
1696
+ "POST",
1697
+ buildRegistrationRequestBody(params),
1698
+ { useCustomerAuth: true }
1699
+ );
1700
+ }
1701
+ getGuestRegistration(token) {
1702
+ return this.execute(
1703
+ "/api/event-registrations/guest/lookup",
1704
+ "POST",
1705
+ { token },
1706
+ { useCustomerAuth: false }
1707
+ );
1708
+ }
1709
+ cancelGuestRegistration(token, params = {}) {
1710
+ return this.execute(
1711
+ "/api/event-registrations/guest/cancel",
1712
+ "POST",
1713
+ buildGuestCancelRequestBody(token, params),
1714
+ { useCustomerAuth: false }
1715
+ );
1716
+ }
1717
+ async execute(endpoint, method, body, options = {}) {
1718
+ const useCustomerAuth = options.useCustomerAuth === true;
1719
+ const token = useCustomerAuth ? typeof this.customerToken === "function" ? this.customerToken() : this.customerToken : void 0;
1720
+ try {
1721
+ const response = await httpFetch(endpoint, {
1722
+ method,
1723
+ apiUrl: this.apiUrl,
1724
+ publishableKey: this.publishableKey,
1725
+ ...useCustomerAuth && token ? { customerToken: token } : {},
1726
+ ...useCustomerAuth && token && this.onUnauthorized && { onUnauthorized: this.onUnauthorized },
1727
+ ...body !== void 0 && { body: JSON.stringify(body) }
1728
+ });
1729
+ this.onRequestId?.(response.headers.get("x-request-id") ?? null);
1730
+ return parseApiResponse(response, endpoint);
1731
+ } catch (err) {
1732
+ const id = err instanceof SDKError ? err.requestId ?? null : null;
1733
+ this.onRequestId?.(id);
1734
+ throw err;
1735
+ }
1736
+ }
1737
+ };
1738
+ function buildRegistrationRequestBody(params) {
1739
+ return {
1740
+ event: params.event,
1741
+ occurrence: params.occurrence,
1742
+ ...params.quantity !== void 0 && { quantity: params.quantity },
1743
+ ...params.attendee !== void 0 && { attendee: params.attendee },
1744
+ ...params.answers !== void 0 && { answers: params.answers }
1745
+ };
1746
+ }
1747
+ function buildGuestCancelRequestBody(token, params) {
1748
+ return {
1749
+ token,
1750
+ ...params.reason !== void 0 && { reason: params.reason }
1751
+ };
1752
+ }
1753
+ function buildRangeEndpoint(params) {
1754
+ const urlParams = new URLSearchParams();
1755
+ urlParams.set("start", formatDateParam(params.start));
1756
+ urlParams.set("end", formatDateParam(params.end));
1757
+ if (params.limit !== void 0) urlParams.set("limit", String(params.limit));
1758
+ if (params.page !== void 0) urlParams.set("page", String(params.page));
1759
+ appendValues(urlParams, "calendar", params.calendar);
1760
+ appendValues(urlParams, "calendarSlug", params.calendarSlug);
1761
+ appendValues(urlParams, "category", params.category);
1762
+ appendValues(urlParams, "categorySlug", params.categorySlug);
1763
+ appendValues(urlParams, "tag", params.tag);
1764
+ appendValues(urlParams, "tagSlug", params.tagSlug);
1765
+ return `/api/event-occurrences/range?${urlParams.toString()}`;
1766
+ }
1767
+ function formatDateParam(value) {
1768
+ return value instanceof Date ? value.toISOString() : value;
1769
+ }
1770
+ function appendValues(params, key, value) {
1771
+ if (value === void 0) return;
1772
+ const values = Array.isArray(value) ? value : [value];
1773
+ for (const entry of values) {
1774
+ if (entry) params.append(key, entry);
1775
+ }
1776
+ }
1777
+
1441
1778
  // src/core/client/client.ts
1442
1779
  var Client = class {
1443
1780
  constructor(options) {
@@ -1483,6 +1820,13 @@ var Client = class {
1483
1820
  onUnauthorized,
1484
1821
  onRequestId
1485
1822
  });
1823
+ this.events = new EventsClient({
1824
+ publishableKey: this.config.publishableKey,
1825
+ apiUrl: this.config.apiUrl,
1826
+ customerToken: () => this.customer.auth.getToken(),
1827
+ onUnauthorized,
1828
+ onRequestId
1829
+ });
1486
1830
  this.collections = new ReadOnlyCollectionClient(
1487
1831
  this.config.publishableKey,
1488
1832
  void 0,