@shoppexio/storefront 1.0.104 → 1.0.106

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.
@@ -1,4 +1,4 @@
1
- import { CustomerPortalAffiliateSummaryWire, CustomerPortalAffiliateCreateLinkWire, CustomerPortalAffiliateStatsWire, CustomerPortalAvatarWire, CustomerPortalDashboardWire, CustomerPortalProfileUpdateWire, CustomerPortalEmailPreferencesWire, CustomerPortalEmailPreferencesUpdateWire, CustomerPortalNotificationPreferencesWire, CustomerPortalOrderReviewWire, CustomerPortalLicenseResetWire, CustomerPortalLicenseRenewalWire, CustomerPortalWalletTopupQuoteWire, CustomerPortalWalletTopupResultWire, CustomerPortalSubscriptionBillingHistoryWire, CustomerPortalSubscriptionCancelWire, CustomerPortalSubscriptionStatusWire, CustomerLoyaltyWire, CustomerLoyaltyRedeemWire, CustomerWarrantyListWire, CustomerWarrantyClaimWire, CustomerPortalFavoritesWire, CustomerPortalFavoriteMutationWire, CustomerPortalSupportCreateWire, CustomerPortalSupportTicketDetailWire, CustomerResellerSummaryWire, CustomerResellerEnrollmentWire, CustomerResellerCatalogWire, CustomerResellerQuoteWire, CustomerResellerOrdersWire, CustomerResellerOrderWire, CustomerResellerWalletWire, CustomerResellerTopupWire, CustomerResellerApiKeysWire } from '@shoppex/contracts/customer-portal-wire';
1
+ import { CustomerPortalAffiliateSummaryWire, CustomerPortalAffiliateCreateLinkWire, CustomerPortalAffiliateStatsWire, CustomerPortalAvatarWire, CustomerPortalDashboardWire, CustomerPortalProfileUpdateWire, CustomerPortalEmailPreferencesWire, CustomerPortalEmailPreferencesUpdateWire, CustomerPortalNotificationPreferencesWire, CustomerPortalOrderReviewWire, CustomerPortalLicenseResetWire, CustomerPortalLicenseRenewalWire, CustomerPortalSubscriptionBillingHistoryWire, CustomerPortalSubscriptionCancelWire, CustomerPortalSubscriptionStatusWire, CustomerLoyaltyWire, CustomerLoyaltyRedeemWire, CustomerWarrantyListWire, CustomerWarrantyClaimWire, CustomerPortalFavoritesWire, CustomerPortalFavoriteMutationWire, CustomerPortalSupportCreateWire, CustomerPortalSupportTicketDetailWire, CustomerResellerSummaryWire, CustomerResellerEnrollmentWire, CustomerResellerCatalogWire, CustomerResellerQuoteWire, CustomerResellerOrdersWire, CustomerResellerOrderWire, CustomerResellerWalletWire, CustomerResellerApiKeysWire } from '@shoppex/contracts/customer-portal-wire';
2
2
 
3
3
  /**
4
4
  * Browser client for a customer account hosted outside Shoppex.
@@ -69,8 +69,6 @@ type HeadlessCustomerTicket = CustomerPortalSupportTicketDetailWire;
69
69
  type HeadlessCustomerTicketCreateResult = CustomerPortalSupportCreateWire;
70
70
  type HeadlessCustomerLicenseReset = CustomerPortalLicenseResetWire;
71
71
  type HeadlessCustomerLicenseRenewal = CustomerPortalLicenseRenewalWire;
72
- type HeadlessCustomerWalletTopupQuote = CustomerPortalWalletTopupQuoteWire;
73
- type HeadlessCustomerWalletTopup = CustomerPortalWalletTopupResultWire;
74
72
  type HeadlessCustomerSubscriptionBillingHistory = CustomerPortalSubscriptionBillingHistoryWire;
75
73
  type HeadlessCustomerSubscriptionCancel = CustomerPortalSubscriptionCancelWire;
76
74
  type HeadlessCustomerSubscriptionStatus = CustomerPortalSubscriptionStatusWire;
@@ -86,7 +84,6 @@ type HeadlessCustomerResellerOrders = CustomerResellerOrdersWire;
86
84
  type HeadlessCustomerResellerOrder = CustomerResellerOrderWire;
87
85
  type HeadlessCustomerResellerWallet = CustomerResellerWalletWire;
88
86
  type HeadlessCustomerResellerApiKeys = CustomerResellerApiKeysWire;
89
- type HeadlessCustomerResellerTopup = CustomerResellerTopupWire;
90
87
  interface HeadlessCustomerTicketInput {
91
88
  title?: string;
92
89
  message: string;
@@ -256,10 +253,9 @@ interface HeadlessCustomerOrder {
256
253
  payments: HeadlessCustomerPayment[];
257
254
  }
258
255
  /**
259
- * `code: 'RESPONSE_CONTRACT_VIOLATION'` (status 2xx) on `createWalletTopup`,
260
- * `createResellerTopup` or `redeemLoyaltyPoints` means the server completed the
261
- * call and withheld its answer. Re-read the account (`dashboard()`, `loyalty()`,
262
- * `resellerWallet()`) and show that; do not report a failure or call again.
256
+ * `code: 'RESPONSE_CONTRACT_VIOLATION'` (status 2xx) on `redeemLoyaltyPoints`
257
+ * means the server completed the call and withheld its answer. Re-read the
258
+ * account (`loyalty()`) and show that; do not report a failure or call again.
263
259
  */
264
260
  declare class HeadlessCustomerError extends Error {
265
261
  readonly status: number;
@@ -305,8 +301,6 @@ declare class HeadlessCustomerClient {
305
301
  download(orderId: string, fileIndex: number): Promise<HeadlessCustomerDownload>;
306
302
  resetLicenseHwid(licenseId: string): Promise<HeadlessCustomerLicenseReset>;
307
303
  renewLicense(licenseId: string): Promise<HeadlessCustomerLicenseRenewal>;
308
- walletTopupQuote(): Promise<HeadlessCustomerWalletTopupQuote>;
309
- createWalletTopup(amount: string): Promise<HeadlessCustomerWalletTopup>;
310
304
  subscriptionBillingHistory(subscriptionId: string): Promise<HeadlessCustomerSubscriptionBillingHistory>;
311
305
  cancelSubscription(subscriptionId: string, options?: HeadlessCustomerSubscriptionCancelOptions): Promise<HeadlessCustomerSubscriptionCancel>;
312
306
  pauseSubscription(subscriptionId: string): Promise<HeadlessCustomerSubscriptionStatus>;
@@ -340,11 +334,9 @@ declare class HeadlessCustomerClient {
340
334
  resellerOrders(options?: HeadlessCustomerResellerOrdersQuery): Promise<HeadlessCustomerResellerOrders>;
341
335
  resellerOrder(orderId: string): Promise<HeadlessCustomerResellerOrder>;
342
336
  resellerWallet(): Promise<HeadlessCustomerResellerWallet>;
343
- resellerTopupQuote(): Promise<HeadlessCustomerWalletTopupQuote>;
344
- createResellerTopup(amount: string): Promise<HeadlessCustomerResellerTopup>;
345
337
  resellerApiKeys(): Promise<HeadlessCustomerResellerApiKeys>;
346
338
  logout(): Promise<void>;
347
339
  }
348
340
  declare function createCustomerClient(config: HeadlessCustomerClientConfig): HeadlessCustomerClient;
349
341
 
350
- export { type HeadlessCustomerAffiliate, type HeadlessCustomerAffiliateLink, type HeadlessCustomerAffiliateLinkInput, type HeadlessCustomerAffiliateStats, type HeadlessCustomerAvatar, HeadlessCustomerClient, type HeadlessCustomerClientConfig, type HeadlessCustomerDashboard, type HeadlessCustomerDownload, type HeadlessCustomerEmailPreferences, type HeadlessCustomerEmailPreferencesPatch, type HeadlessCustomerEmailPreferencesUpdate, HeadlessCustomerError, type HeadlessCustomerFavoriteMutation, type HeadlessCustomerFavorites, type HeadlessCustomerLicenseRenewal, type HeadlessCustomerLicenseReset, type HeadlessCustomerLoyalty, type HeadlessCustomerLoyaltyRedeem, type HeadlessCustomerMe, type HeadlessCustomerNotificationPreferences, type HeadlessCustomerNotificationPreferencesPatch, type HeadlessCustomerOrder, type HeadlessCustomerOrderReview, type HeadlessCustomerOrderReviewInput, type HeadlessCustomerOrderSummary, type HeadlessCustomerOrders, type HeadlessCustomerOrdersQuery, type HeadlessCustomerPayment, type HeadlessCustomerProfileUpdate, type HeadlessCustomerReseller, type HeadlessCustomerResellerApiKeys, type HeadlessCustomerResellerCatalog, type HeadlessCustomerResellerCatalogQuery, type HeadlessCustomerResellerEnrollment, type HeadlessCustomerResellerOrder, type HeadlessCustomerResellerOrderItem, type HeadlessCustomerResellerOrders, type HeadlessCustomerResellerOrdersQuery, type HeadlessCustomerResellerQuote, type HeadlessCustomerResellerTopup, type HeadlessCustomerResellerWallet, type HeadlessCustomerSession, type HeadlessCustomerSubscriptionBillingHistory, type HeadlessCustomerSubscriptionCancel, type HeadlessCustomerSubscriptionCancelOptions, type HeadlessCustomerSubscriptionStatus, type HeadlessCustomerTicket, type HeadlessCustomerTicketCreateResult, type HeadlessCustomerTicketInput, type HeadlessCustomerVerifyOptions, type HeadlessCustomerWalletTopup, type HeadlessCustomerWalletTopupQuote, type HeadlessCustomerWarranties, type HeadlessCustomerWarrantyClaim, createCustomerClient };
342
+ export { type HeadlessCustomerAffiliate, type HeadlessCustomerAffiliateLink, type HeadlessCustomerAffiliateLinkInput, type HeadlessCustomerAffiliateStats, type HeadlessCustomerAvatar, HeadlessCustomerClient, type HeadlessCustomerClientConfig, type HeadlessCustomerDashboard, type HeadlessCustomerDownload, type HeadlessCustomerEmailPreferences, type HeadlessCustomerEmailPreferencesPatch, type HeadlessCustomerEmailPreferencesUpdate, HeadlessCustomerError, type HeadlessCustomerFavoriteMutation, type HeadlessCustomerFavorites, type HeadlessCustomerLicenseRenewal, type HeadlessCustomerLicenseReset, type HeadlessCustomerLoyalty, type HeadlessCustomerLoyaltyRedeem, type HeadlessCustomerMe, type HeadlessCustomerNotificationPreferences, type HeadlessCustomerNotificationPreferencesPatch, type HeadlessCustomerOrder, type HeadlessCustomerOrderReview, type HeadlessCustomerOrderReviewInput, type HeadlessCustomerOrderSummary, type HeadlessCustomerOrders, type HeadlessCustomerOrdersQuery, type HeadlessCustomerPayment, type HeadlessCustomerProfileUpdate, type HeadlessCustomerReseller, type HeadlessCustomerResellerApiKeys, type HeadlessCustomerResellerCatalog, type HeadlessCustomerResellerCatalogQuery, type HeadlessCustomerResellerEnrollment, type HeadlessCustomerResellerOrder, type HeadlessCustomerResellerOrderItem, type HeadlessCustomerResellerOrders, type HeadlessCustomerResellerOrdersQuery, type HeadlessCustomerResellerQuote, type HeadlessCustomerResellerWallet, type HeadlessCustomerSession, type HeadlessCustomerSubscriptionBillingHistory, type HeadlessCustomerSubscriptionCancel, type HeadlessCustomerSubscriptionCancelOptions, type HeadlessCustomerSubscriptionStatus, type HeadlessCustomerTicket, type HeadlessCustomerTicketCreateResult, type HeadlessCustomerTicketInput, type HeadlessCustomerVerifyOptions, type HeadlessCustomerWarranties, type HeadlessCustomerWarrantyClaim, createCustomerClient };
@@ -1,4 +1,4 @@
1
- import { CustomerPortalAffiliateSummaryWire, CustomerPortalAffiliateCreateLinkWire, CustomerPortalAffiliateStatsWire, CustomerPortalAvatarWire, CustomerPortalDashboardWire, CustomerPortalProfileUpdateWire, CustomerPortalEmailPreferencesWire, CustomerPortalEmailPreferencesUpdateWire, CustomerPortalNotificationPreferencesWire, CustomerPortalOrderReviewWire, CustomerPortalLicenseResetWire, CustomerPortalLicenseRenewalWire, CustomerPortalWalletTopupQuoteWire, CustomerPortalWalletTopupResultWire, CustomerPortalSubscriptionBillingHistoryWire, CustomerPortalSubscriptionCancelWire, CustomerPortalSubscriptionStatusWire, CustomerLoyaltyWire, CustomerLoyaltyRedeemWire, CustomerWarrantyListWire, CustomerWarrantyClaimWire, CustomerPortalFavoritesWire, CustomerPortalFavoriteMutationWire, CustomerPortalSupportCreateWire, CustomerPortalSupportTicketDetailWire, CustomerResellerSummaryWire, CustomerResellerEnrollmentWire, CustomerResellerCatalogWire, CustomerResellerQuoteWire, CustomerResellerOrdersWire, CustomerResellerOrderWire, CustomerResellerWalletWire, CustomerResellerTopupWire, CustomerResellerApiKeysWire } from '@shoppex/contracts/customer-portal-wire';
1
+ import { CustomerPortalAffiliateSummaryWire, CustomerPortalAffiliateCreateLinkWire, CustomerPortalAffiliateStatsWire, CustomerPortalAvatarWire, CustomerPortalDashboardWire, CustomerPortalProfileUpdateWire, CustomerPortalEmailPreferencesWire, CustomerPortalEmailPreferencesUpdateWire, CustomerPortalNotificationPreferencesWire, CustomerPortalOrderReviewWire, CustomerPortalLicenseResetWire, CustomerPortalLicenseRenewalWire, CustomerPortalSubscriptionBillingHistoryWire, CustomerPortalSubscriptionCancelWire, CustomerPortalSubscriptionStatusWire, CustomerLoyaltyWire, CustomerLoyaltyRedeemWire, CustomerWarrantyListWire, CustomerWarrantyClaimWire, CustomerPortalFavoritesWire, CustomerPortalFavoriteMutationWire, CustomerPortalSupportCreateWire, CustomerPortalSupportTicketDetailWire, CustomerResellerSummaryWire, CustomerResellerEnrollmentWire, CustomerResellerCatalogWire, CustomerResellerQuoteWire, CustomerResellerOrdersWire, CustomerResellerOrderWire, CustomerResellerWalletWire, CustomerResellerApiKeysWire } from '@shoppex/contracts/customer-portal-wire';
2
2
 
3
3
  /**
4
4
  * Browser client for a customer account hosted outside Shoppex.
@@ -69,8 +69,6 @@ type HeadlessCustomerTicket = CustomerPortalSupportTicketDetailWire;
69
69
  type HeadlessCustomerTicketCreateResult = CustomerPortalSupportCreateWire;
70
70
  type HeadlessCustomerLicenseReset = CustomerPortalLicenseResetWire;
71
71
  type HeadlessCustomerLicenseRenewal = CustomerPortalLicenseRenewalWire;
72
- type HeadlessCustomerWalletTopupQuote = CustomerPortalWalletTopupQuoteWire;
73
- type HeadlessCustomerWalletTopup = CustomerPortalWalletTopupResultWire;
74
72
  type HeadlessCustomerSubscriptionBillingHistory = CustomerPortalSubscriptionBillingHistoryWire;
75
73
  type HeadlessCustomerSubscriptionCancel = CustomerPortalSubscriptionCancelWire;
76
74
  type HeadlessCustomerSubscriptionStatus = CustomerPortalSubscriptionStatusWire;
@@ -86,7 +84,6 @@ type HeadlessCustomerResellerOrders = CustomerResellerOrdersWire;
86
84
  type HeadlessCustomerResellerOrder = CustomerResellerOrderWire;
87
85
  type HeadlessCustomerResellerWallet = CustomerResellerWalletWire;
88
86
  type HeadlessCustomerResellerApiKeys = CustomerResellerApiKeysWire;
89
- type HeadlessCustomerResellerTopup = CustomerResellerTopupWire;
90
87
  interface HeadlessCustomerTicketInput {
91
88
  title?: string;
92
89
  message: string;
@@ -256,10 +253,9 @@ interface HeadlessCustomerOrder {
256
253
  payments: HeadlessCustomerPayment[];
257
254
  }
258
255
  /**
259
- * `code: 'RESPONSE_CONTRACT_VIOLATION'` (status 2xx) on `createWalletTopup`,
260
- * `createResellerTopup` or `redeemLoyaltyPoints` means the server completed the
261
- * call and withheld its answer. Re-read the account (`dashboard()`, `loyalty()`,
262
- * `resellerWallet()`) and show that; do not report a failure or call again.
256
+ * `code: 'RESPONSE_CONTRACT_VIOLATION'` (status 2xx) on `redeemLoyaltyPoints`
257
+ * means the server completed the call and withheld its answer. Re-read the
258
+ * account (`loyalty()`) and show that; do not report a failure or call again.
263
259
  */
264
260
  declare class HeadlessCustomerError extends Error {
265
261
  readonly status: number;
@@ -305,8 +301,6 @@ declare class HeadlessCustomerClient {
305
301
  download(orderId: string, fileIndex: number): Promise<HeadlessCustomerDownload>;
306
302
  resetLicenseHwid(licenseId: string): Promise<HeadlessCustomerLicenseReset>;
307
303
  renewLicense(licenseId: string): Promise<HeadlessCustomerLicenseRenewal>;
308
- walletTopupQuote(): Promise<HeadlessCustomerWalletTopupQuote>;
309
- createWalletTopup(amount: string): Promise<HeadlessCustomerWalletTopup>;
310
304
  subscriptionBillingHistory(subscriptionId: string): Promise<HeadlessCustomerSubscriptionBillingHistory>;
311
305
  cancelSubscription(subscriptionId: string, options?: HeadlessCustomerSubscriptionCancelOptions): Promise<HeadlessCustomerSubscriptionCancel>;
312
306
  pauseSubscription(subscriptionId: string): Promise<HeadlessCustomerSubscriptionStatus>;
@@ -340,11 +334,9 @@ declare class HeadlessCustomerClient {
340
334
  resellerOrders(options?: HeadlessCustomerResellerOrdersQuery): Promise<HeadlessCustomerResellerOrders>;
341
335
  resellerOrder(orderId: string): Promise<HeadlessCustomerResellerOrder>;
342
336
  resellerWallet(): Promise<HeadlessCustomerResellerWallet>;
343
- resellerTopupQuote(): Promise<HeadlessCustomerWalletTopupQuote>;
344
- createResellerTopup(amount: string): Promise<HeadlessCustomerResellerTopup>;
345
337
  resellerApiKeys(): Promise<HeadlessCustomerResellerApiKeys>;
346
338
  logout(): Promise<void>;
347
339
  }
348
340
  declare function createCustomerClient(config: HeadlessCustomerClientConfig): HeadlessCustomerClient;
349
341
 
350
- export { type HeadlessCustomerAffiliate, type HeadlessCustomerAffiliateLink, type HeadlessCustomerAffiliateLinkInput, type HeadlessCustomerAffiliateStats, type HeadlessCustomerAvatar, HeadlessCustomerClient, type HeadlessCustomerClientConfig, type HeadlessCustomerDashboard, type HeadlessCustomerDownload, type HeadlessCustomerEmailPreferences, type HeadlessCustomerEmailPreferencesPatch, type HeadlessCustomerEmailPreferencesUpdate, HeadlessCustomerError, type HeadlessCustomerFavoriteMutation, type HeadlessCustomerFavorites, type HeadlessCustomerLicenseRenewal, type HeadlessCustomerLicenseReset, type HeadlessCustomerLoyalty, type HeadlessCustomerLoyaltyRedeem, type HeadlessCustomerMe, type HeadlessCustomerNotificationPreferences, type HeadlessCustomerNotificationPreferencesPatch, type HeadlessCustomerOrder, type HeadlessCustomerOrderReview, type HeadlessCustomerOrderReviewInput, type HeadlessCustomerOrderSummary, type HeadlessCustomerOrders, type HeadlessCustomerOrdersQuery, type HeadlessCustomerPayment, type HeadlessCustomerProfileUpdate, type HeadlessCustomerReseller, type HeadlessCustomerResellerApiKeys, type HeadlessCustomerResellerCatalog, type HeadlessCustomerResellerCatalogQuery, type HeadlessCustomerResellerEnrollment, type HeadlessCustomerResellerOrder, type HeadlessCustomerResellerOrderItem, type HeadlessCustomerResellerOrders, type HeadlessCustomerResellerOrdersQuery, type HeadlessCustomerResellerQuote, type HeadlessCustomerResellerTopup, type HeadlessCustomerResellerWallet, type HeadlessCustomerSession, type HeadlessCustomerSubscriptionBillingHistory, type HeadlessCustomerSubscriptionCancel, type HeadlessCustomerSubscriptionCancelOptions, type HeadlessCustomerSubscriptionStatus, type HeadlessCustomerTicket, type HeadlessCustomerTicketCreateResult, type HeadlessCustomerTicketInput, type HeadlessCustomerVerifyOptions, type HeadlessCustomerWalletTopup, type HeadlessCustomerWalletTopupQuote, type HeadlessCustomerWarranties, type HeadlessCustomerWarrantyClaim, createCustomerClient };
342
+ export { type HeadlessCustomerAffiliate, type HeadlessCustomerAffiliateLink, type HeadlessCustomerAffiliateLinkInput, type HeadlessCustomerAffiliateStats, type HeadlessCustomerAvatar, HeadlessCustomerClient, type HeadlessCustomerClientConfig, type HeadlessCustomerDashboard, type HeadlessCustomerDownload, type HeadlessCustomerEmailPreferences, type HeadlessCustomerEmailPreferencesPatch, type HeadlessCustomerEmailPreferencesUpdate, HeadlessCustomerError, type HeadlessCustomerFavoriteMutation, type HeadlessCustomerFavorites, type HeadlessCustomerLicenseRenewal, type HeadlessCustomerLicenseReset, type HeadlessCustomerLoyalty, type HeadlessCustomerLoyaltyRedeem, type HeadlessCustomerMe, type HeadlessCustomerNotificationPreferences, type HeadlessCustomerNotificationPreferencesPatch, type HeadlessCustomerOrder, type HeadlessCustomerOrderReview, type HeadlessCustomerOrderReviewInput, type HeadlessCustomerOrderSummary, type HeadlessCustomerOrders, type HeadlessCustomerOrdersQuery, type HeadlessCustomerPayment, type HeadlessCustomerProfileUpdate, type HeadlessCustomerReseller, type HeadlessCustomerResellerApiKeys, type HeadlessCustomerResellerCatalog, type HeadlessCustomerResellerCatalogQuery, type HeadlessCustomerResellerEnrollment, type HeadlessCustomerResellerOrder, type HeadlessCustomerResellerOrderItem, type HeadlessCustomerResellerOrders, type HeadlessCustomerResellerOrdersQuery, type HeadlessCustomerResellerQuote, type HeadlessCustomerResellerWallet, type HeadlessCustomerSession, type HeadlessCustomerSubscriptionBillingHistory, type HeadlessCustomerSubscriptionCancel, type HeadlessCustomerSubscriptionCancelOptions, type HeadlessCustomerSubscriptionStatus, type HeadlessCustomerTicket, type HeadlessCustomerTicketCreateResult, type HeadlessCustomerTicketInput, type HeadlessCustomerVerifyOptions, type HeadlessCustomerWarranties, type HeadlessCustomerWarrantyClaim, createCustomerClient };
package/dist/customer.js CHANGED
@@ -7,12 +7,13 @@ import {
7
7
  customerPortalDashboardSchema,
8
8
  customerPortalInvoiceDetailSchema,
9
9
  customerPortalNotificationPreferencesSchema,
10
+ customerPortalOrderReviewSchema,
10
11
  customerPortalPaginatedInvoicesSchema,
11
12
  customerWarrantyClaimSchema,
12
13
  customerWarrantyListSchema,
13
14
  external_exports,
14
15
  storefrontStorageKey
15
- } from "./chunk-BW2EO2WP.js";
16
+ } from "./chunk-INBEHRZN.js";
16
17
 
17
18
  // ../contracts/src/customer-portal-wire.ts
18
19
  var nullableStringSchema = external_exports.string().nullable();
@@ -33,18 +34,6 @@ var customerPortalMeSchema = external_exports.object({
33
34
  }),
34
35
  token: external_exports.null()
35
36
  });
36
- var customerPortalOrderReviewSchema = external_exports.object({
37
- can_review: external_exports.boolean(),
38
- already_submitted: external_exports.boolean(),
39
- feedback_uniqid: nullableStringSchema,
40
- product_title: nullableStringSchema,
41
- score: external_exports.union([external_exports.literal(1), external_exports.literal(3), external_exports.literal(5)]).nullable(),
42
- is_automated: external_exports.boolean(),
43
- message: nullableStringSchema,
44
- submitted_at: nullableStringSchema,
45
- reviewer_name: nullableStringSchema,
46
- anonymous: external_exports.boolean()
47
- });
48
37
  var customerPortalWalletTopupQuoteSchema = external_exports.object({
49
38
  quote: external_exports.object({
50
39
  enabled: external_exports.boolean(),
@@ -750,20 +739,6 @@ var HeadlessCustomerClient = class {
750
739
  schema: customerPortalLicenseRenewalSchema
751
740
  });
752
741
  }
753
- walletTopupQuote() {
754
- return this.request("/wallet/topup-quote", {
755
- authenticated: true,
756
- schema: customerPortalWalletTopupQuoteSchema
757
- });
758
- }
759
- createWalletTopup(amount) {
760
- return this.request("/wallet/topup", {
761
- method: "POST",
762
- authenticated: true,
763
- body: { amount },
764
- schema: customerPortalWalletTopupResultSchema
765
- });
766
- }
767
742
  subscriptionBillingHistory(subscriptionId) {
768
743
  return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/billing-history`, {
769
744
  authenticated: true,
@@ -984,20 +959,6 @@ var HeadlessCustomerClient = class {
984
959
  schema: customerResellerWalletSchema
985
960
  });
986
961
  }
987
- resellerTopupQuote() {
988
- return this.request("/reseller/wallet/topup-quote", {
989
- authenticated: true,
990
- schema: customerPortalWalletTopupQuoteSchema
991
- });
992
- }
993
- createResellerTopup(amount) {
994
- return this.request("/reseller/wallet/topup", {
995
- method: "POST",
996
- authenticated: true,
997
- body: { amount },
998
- schema: customerResellerTopupSchema
999
- });
1000
- }
1001
962
  resellerApiKeys() {
1002
963
  return this.request("/reseller/api-keys", {
1003
964
  authenticated: true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../contracts/src/customer-portal-wire.ts","../../sdk/src/headless-customer.ts"],"sourcesContent":["import { z } from 'zod';\nimport { customerPortalBrandingSchema } from './customer-account-wire.js';\n\n// The buyer account wire the storefront SDK validates lives in\n// ./customer-account-wire so storefront bundles do not ship the portal-only\n// schemas below. This module re-exports it: portal consumers keep one import.\nexport {\n customerLoyaltyRedeemSchema,\n customerLoyaltySchema,\n customerPortalAffiliateCreateLinkSchema,\n customerPortalAffiliateSummarySchema,\n customerPortalDashboardInvoiceSchema,\n customerPortalDashboardSchema,\n customerPortalInvoiceDetailSchema,\n customerPortalNotificationPreferencesSchema,\n customerPortalPaginatedInvoiceSchema,\n customerPortalPaginatedInvoicesSchema,\n customerPortalRewardActivityItemSchema,\n customerPortalRewardsSchema,\n customerPortalSubscriptionSummarySchema,\n customerWarrantyClaimSchema,\n customerWarrantyListSchema,\n} from './customer-account-wire.js';\nexport type {\n CustomerLoyaltyRedeemWire,\n CustomerLoyaltyWire,\n CustomerPortalAffiliateCreateLinkWire,\n CustomerPortalAffiliateSummaryWire,\n CustomerPortalDashboardWire,\n CustomerPortalInvoiceDetailWire,\n CustomerPortalInvoiceShippingWire,\n CustomerPortalNotificationPreferencesWire,\n CustomerPortalPaginatedInvoicesWire,\n CustomerPortalRewardActivityItemWire,\n CustomerPortalRewardsWire,\n CustomerPortalSubscriptionSummaryWire,\n CustomerWarrantyClaimWire,\n CustomerWarrantyListWire,\n} from './customer-account-wire.js';\n\nconst nullableStringSchema = z.string().nullable();\n\nexport const customerPortalMeSchema = z.object({\n customer: z.object({\n id: nullableStringSchema,\n email: z.string(),\n name: z.string(),\n avatar_url: nullableStringSchema,\n joined_at: nullableStringSchema,\n }),\n shop: z.object({\n id: z.string(),\n slug: z.string(),\n name: z.string(),\n currency: z.string(),\n branding: customerPortalBrandingSchema,\n }),\n token: z.null(),\n});\n\n/** Buyer-visible review state for one authenticated customer order. */\nexport const customerPortalOrderReviewSchema = z.object({\n can_review: z.boolean(),\n already_submitted: z.boolean(),\n feedback_uniqid: nullableStringSchema,\n product_title: nullableStringSchema,\n score: z.union([z.literal(1), z.literal(3), z.literal(5)]).nullable(),\n is_automated: z.boolean(),\n message: nullableStringSchema,\n submitted_at: nullableStringSchema,\n reviewer_name: nullableStringSchema,\n anonymous: z.boolean(),\n});\n\nexport const customerPortalWalletTopupQuoteSchema = z.object({\n quote: z.object({\n enabled: z.boolean(),\n currency: z.string(),\n min_amount: z.string(),\n max_amount: nullableStringSchema,\n bonus_tiers: z.array(z.object({\n min_amount: z.string(),\n bonus_percent: z.number(),\n })),\n }),\n});\n\nexport const customerPortalWalletTopupResultSchema = z.object({\n invoice_id: z.string(),\n url: z.string(),\n});\n\nexport const customerPortalAffiliateStatsSchema = z.object({\n window_days: z.number(),\n totals: z.object({\n clicks: z.number(),\n add_to_carts: z.number(),\n checkouts_started: z.number(),\n sales: z.number(),\n }),\n per_link: z.array(z.object({\n link_id: z.string(),\n code: z.string(),\n label: nullableStringSchema,\n clicks: z.number(),\n add_to_carts: z.number(),\n checkouts_started: z.number(),\n })),\n daily: z.array(z.object({\n date: z.string(),\n clicks: z.number(),\n add_to_carts: z.number(),\n checkouts_started: z.number(),\n })),\n});\n\n// ---------------------------------------------------------------------------\n// Headless customer-portal action contracts\n// ---------------------------------------------------------------------------\n\nexport const customerPortalProfileUpdateSchema = z.object({\n customer: z.object({\n id: z.string(),\n email: z.string(),\n name: z.string(),\n joined_at: nullableStringSchema,\n }),\n});\n\nexport const customerPortalAvatarSchema = z.object({\n avatar_url: nullableStringSchema,\n});\n\nexport const customerPortalEmailPreferencesSchema = z.object({\n global_unsubscribed: z.boolean(),\n lists: z.array(z.object({\n id: z.string(),\n name: z.string(),\n description: nullableStringSchema,\n subscribed: z.boolean(),\n })),\n});\n\nexport const customerPortalEmailPreferencesUpdateSchema = z.object({\n updated: z.boolean(),\n});\n\nexport const customerPortalFavoritesSchema = z.object({\n favorites: z.array(z.object({\n product_uniqid: z.string(),\n title: z.string(),\n slug: nullableStringSchema,\n image_url: nullableStringSchema,\n price_display: z.number(),\n unavailable: z.boolean(),\n created_at: z.string(),\n })),\n});\n\nexport const customerPortalFavoriteMutationSchema = z.union([\n z.object({ added: z.literal(true) }),\n z.object({ removed: z.literal(true) }),\n]);\n\nexport const customerPortalLicenseResetSchema = z.object({\n license: z.object({\n uniqid: z.string(),\n hardware_id: nullableStringSchema,\n }),\n});\n\nexport const customerPortalLicenseRenewalSchema = z.object({\n invoice_id: z.string(),\n checkout_url: z.string(),\n preferred_gateways: z.array(z.string()),\n license: z.object({\n uniqid: z.string(),\n product_title: z.string(),\n }),\n});\n\nexport const customerPortalSubscriptionBillingHistorySchema = z.object({\n invoices: z.array(z.object({\n id: z.string(),\n uniqid: z.string(),\n total: z.string(),\n currency: z.string(),\n status: z.string(),\n gateway: z.string(),\n created_at: z.string(),\n completed_at: z.string(),\n })),\n});\n\nexport const customerPortalSubscriptionCancelSchema = z.object({\n subscription: z.object({\n id: z.string(),\n status: z.string(),\n cancel_at_period_end: z.boolean(),\n cancel_reason: nullableStringSchema,\n canceled_at: nullableStringSchema,\n }),\n});\n\nexport const customerPortalSubscriptionStatusSchema = z.object({\n subscription: z.object({\n id: z.string(),\n status: z.string(),\n }),\n});\n\nexport const customerPortalSupportTicketDetailSchema = z.object({\n ticket: z.object({\n uniqid: z.string(),\n title: z.string(),\n status: z.string(),\n invoice_id: nullableStringSchema,\n created_at: z.string(),\n updated_at: z.string(),\n messages: z.array(z.object({\n id: z.string(),\n role: z.enum(['CUSTOMER', 'SHOP', 'SYSTEM']),\n message: z.string(),\n created_at: z.string(),\n })),\n }),\n});\n\nexport const customerPortalSupportCreateSchema = z.object({\n uniqid: z.string(),\n});\n\nconst customerResellerTierSchema = z.object({\n id: z.string(),\n name: nullableStringSchema,\n discount_percent: z.number().nullable(),\n});\n\nconst customerResellerRelationshipSchema = z.object({\n id: z.string(),\n status: z.enum(['INVITED', 'APPLIED', 'ACTIVE', 'SUSPENDED', 'REJECTED']),\n tier: customerResellerTierSchema.nullable(),\n application_note: nullableStringSchema,\n lifetime_revenue: z.string(),\n lifetime_orders: z.number(),\n approved_at: nullableStringSchema,\n created_at: z.string(),\n});\n\nexport const customerResellerSummarySchema = z.object({\n program_enabled: z.boolean(),\n api_enabled: z.boolean(),\n portal_purchasing_enabled: z.boolean(),\n enrollment_mode: z.enum(['MANUAL', 'APPLICATION', 'OPEN']),\n application_message: nullableStringSchema,\n require_application_note: z.boolean(),\n reseller: customerResellerRelationshipSchema.nullable(),\n});\n\nexport const customerResellerEnrollmentSchema = z.object({\n reseller: customerResellerRelationshipSchema,\n});\n\nconst customerResellerAppliedOverrideSchema = z.enum(['variant', 'product', 'tier']);\n\nconst customerResellerCatalogVariantSchema = z.object({\n variant_id: z.string(),\n title: z.string(),\n stock: z.number(),\n orderable: z.boolean(),\n base_price: z.string(),\n unit_price: z.string(),\n discount_percent: z.number(),\n applied_override: customerResellerAppliedOverrideSchema,\n});\n\n/**\n * A product custom field a wholesale order line answers in `items[].custom_fields`,\n * keyed by `name`. `format` is the check the server applies when there is no `regex`.\n */\nexport const customerResellerCustomFieldSchema = z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean(),\n placeholder: z.string(),\n default_value: z.string(),\n regex: nullableStringSchema,\n min_length: z.number().nullable(),\n format: z.enum(['number', 'discord_invite', 'url']).nullable(),\n /** Only on a `select`: the answer must be one of these labels. */\n options: z.array(z.string()).optional(),\n});\n\nexport const customerResellerCatalogSchema = z.object({\n tier: customerResellerTierSchema,\n catalog: z.object({\n currency: z.string(),\n total: z.number(),\n page: z.number(),\n per_page: z.number(),\n items: z.array(z.object({\n product_id: z.string(),\n uniqid: z.string(),\n title: z.string(),\n type: z.string(),\n stock: z.number(),\n orderable: z.boolean(),\n volume_discount_enabled: z.boolean(),\n base_price: z.string(),\n unit_price: z.string(),\n discount_percent: z.number(),\n applied_override: customerResellerAppliedOverrideSchema,\n /** Optional: a backend released before reseller custom fields does not send it. */\n custom_fields: z.array(customerResellerCustomFieldSchema).optional(),\n variants: z.array(customerResellerCatalogVariantSchema),\n })),\n }),\n});\n\nexport const customerResellerQuoteSchema = z.object({\n quote: z.object({\n currency: z.string(),\n tier: customerResellerTierSchema,\n items: z.array(z.object({\n product_id: z.string(),\n product_title: z.string(),\n product_type: z.string(),\n variant_id: nullableStringSchema,\n variant_title: nullableStringSchema,\n quantity: z.number(),\n base_price: z.string(),\n discount_percent: z.number(),\n unit_price: z.string(),\n line_total: z.string(),\n applied_override: customerResellerAppliedOverrideSchema,\n volume_discount_applied: z.string(),\n })),\n subtotal: z.string(),\n volume_discount_total: z.string(),\n total: z.string(),\n savings: z.string(),\n }),\n});\n\nexport const customerResellerOrdersSchema = z.object({\n orders: z.object({\n total: z.number(),\n page: z.number(),\n per_page: z.number(),\n items: z.array(z.object({\n uniqid: z.string(),\n status: z.string(),\n currency: z.string(),\n total: z.string(),\n item_count: z.number(),\n created_at: z.string(),\n })),\n }),\n});\n\nexport const customerResellerOrderSchema = z.object({\n order: z.object({\n uniqid: z.string(),\n status: z.string(),\n currency: z.string(),\n total: z.string(),\n item_count: z.number(),\n created_at: z.string(),\n tier_name: z.string(),\n tier_discount_percent: z.number(),\n partially_delivered: z.boolean(),\n refunded_amount: nullableStringSchema,\n lines: z.array(z.object({\n product_id: nullableStringSchema,\n product_title: z.string(),\n variant_id: nullableStringSchema,\n variant_title: nullableStringSchema,\n quantity: z.number(),\n unit_price: z.string(),\n total: z.string(),\n delivered: z.boolean(),\n delivered_at: nullableStringSchema,\n serials: z.array(z.string()),\n })),\n }),\n});\n\nexport const customerResellerWalletSchema = z.object({\n wallet: z.object({\n currency: z.string(),\n balance: z.string(),\n hold_balance: z.string(),\n available: z.string(),\n is_active: z.boolean(),\n }),\n});\n\nexport const customerResellerApiKeysSchema = z.object({\n api_keys: z.array(z.object({\n id: z.string(),\n name: z.string(),\n key_last4: z.string(),\n last_used_at: nullableStringSchema,\n revoked_at: nullableStringSchema,\n created_at: z.string(),\n })),\n});\n\nexport const customerResellerTopupSchema = z.object({\n topup: z.object({\n uniqid: z.string(),\n url: z.string(),\n }),\n});\n\nexport type CustomerPortalMeWire = z.infer<typeof customerPortalMeSchema>;\nexport type CustomerPortalAffiliateStatsWire = z.infer<typeof customerPortalAffiliateStatsSchema>;\nexport type CustomerPortalOrderReviewWire = z.infer<typeof customerPortalOrderReviewSchema>;\nexport type CustomerPortalWalletTopupQuoteWire = z.infer<typeof customerPortalWalletTopupQuoteSchema>;\nexport type CustomerPortalWalletTopupResultWire = z.infer<typeof customerPortalWalletTopupResultSchema>;\nexport type CustomerPortalProfileUpdateWire = z.infer<typeof customerPortalProfileUpdateSchema>;\nexport type CustomerPortalAvatarWire = z.infer<typeof customerPortalAvatarSchema>;\nexport type CustomerPortalEmailPreferencesWire = z.infer<typeof customerPortalEmailPreferencesSchema>;\nexport type CustomerPortalEmailPreferencesUpdateWire = z.infer<typeof customerPortalEmailPreferencesUpdateSchema>;\nexport type CustomerPortalFavoritesWire = z.infer<typeof customerPortalFavoritesSchema>;\nexport type CustomerPortalFavoriteMutationWire = z.infer<typeof customerPortalFavoriteMutationSchema>;\nexport type CustomerPortalLicenseResetWire = z.infer<typeof customerPortalLicenseResetSchema>;\nexport type CustomerPortalLicenseRenewalWire = z.infer<typeof customerPortalLicenseRenewalSchema>;\nexport type CustomerPortalSubscriptionBillingHistoryWire = z.infer<typeof customerPortalSubscriptionBillingHistorySchema>;\nexport type CustomerPortalSubscriptionCancelWire = z.infer<typeof customerPortalSubscriptionCancelSchema>;\nexport type CustomerPortalSubscriptionStatusWire = z.infer<typeof customerPortalSubscriptionStatusSchema>;\nexport type CustomerPortalSupportTicketDetailWire = z.infer<typeof customerPortalSupportTicketDetailSchema>;\nexport type CustomerPortalSupportCreateWire = z.infer<typeof customerPortalSupportCreateSchema>;\nexport type CustomerResellerSummaryWire = z.infer<typeof customerResellerSummarySchema>;\nexport type CustomerResellerEnrollmentWire = z.infer<typeof customerResellerEnrollmentSchema>;\nexport type CustomerResellerCatalogWire = z.infer<typeof customerResellerCatalogSchema>;\nexport type CustomerResellerQuoteWire = z.infer<typeof customerResellerQuoteSchema>;\nexport type CustomerResellerOrdersWire = z.infer<typeof customerResellerOrdersSchema>;\nexport type CustomerResellerOrderWire = z.infer<typeof customerResellerOrderSchema>;\nexport type CustomerResellerWalletWire = z.infer<typeof customerResellerWalletSchema>;\nexport type CustomerResellerApiKeysWire = z.infer<typeof customerResellerApiKeysSchema>;\nexport type CustomerResellerTopupWire = z.infer<typeof customerResellerTopupSchema>;\n","/**\n * Browser client for a customer account hosted outside Shoppex.\n *\n * The publishable key identifies the merchant and the dashboard origin\n * allowlist authorizes the browser origin. OTP verification returns a separate\n * short-lived `hcs_` token; the SDK never exposes Shoppex's BetterAuth token.\n */\nimport {\n customerLoyaltyRedeemSchema,\n customerLoyaltySchema,\n customerPortalAffiliateSummarySchema,\n customerPortalAffiliateStatsSchema,\n customerPortalAffiliateCreateLinkSchema,\n customerPortalAvatarSchema,\n customerPortalDashboardSchema,\n customerPortalEmailPreferencesSchema,\n customerPortalEmailPreferencesUpdateSchema,\n customerPortalFavoriteMutationSchema,\n customerPortalFavoritesSchema,\n customerPortalInvoiceDetailSchema,\n customerPortalLicenseResetSchema,\n customerPortalLicenseRenewalSchema,\n customerPortalMeSchema,\n customerPortalNotificationPreferencesSchema,\n customerPortalOrderReviewSchema,\n customerPortalPaginatedInvoicesSchema,\n customerPortalProfileUpdateSchema,\n customerPortalSubscriptionBillingHistorySchema,\n customerPortalSubscriptionCancelSchema,\n customerPortalSubscriptionStatusSchema,\n customerPortalSupportCreateSchema,\n customerPortalSupportTicketDetailSchema,\n customerPortalWalletTopupQuoteSchema,\n customerPortalWalletTopupResultSchema,\n customerResellerApiKeysSchema,\n customerResellerCatalogSchema,\n customerResellerEnrollmentSchema,\n customerResellerOrderSchema,\n customerResellerOrdersSchema,\n customerResellerQuoteSchema,\n customerResellerSummarySchema,\n customerResellerTopupSchema,\n customerResellerWalletSchema,\n customerWarrantyClaimSchema,\n customerWarrantyListSchema,\n type CustomerLoyaltyRedeemWire,\n type CustomerLoyaltyWire,\n type CustomerPortalAffiliateSummaryWire,\n type CustomerPortalAffiliateStatsWire,\n type CustomerPortalAffiliateCreateLinkWire,\n type CustomerPortalAvatarWire,\n type CustomerPortalDashboardWire,\n type CustomerPortalEmailPreferencesUpdateWire,\n type CustomerPortalEmailPreferencesWire,\n type CustomerPortalFavoriteMutationWire,\n type CustomerPortalFavoritesWire,\n type CustomerPortalLicenseResetWire,\n type CustomerPortalLicenseRenewalWire,\n type CustomerPortalNotificationPreferencesWire,\n type CustomerPortalOrderReviewWire,\n type CustomerPortalProfileUpdateWire,\n type CustomerPortalSubscriptionBillingHistoryWire,\n type CustomerPortalSubscriptionCancelWire,\n type CustomerPortalSubscriptionStatusWire,\n type CustomerPortalSupportCreateWire,\n type CustomerPortalSupportTicketDetailWire,\n type CustomerPortalWalletTopupQuoteWire,\n type CustomerPortalWalletTopupResultWire,\n type CustomerResellerApiKeysWire,\n type CustomerResellerCatalogWire,\n type CustomerResellerEnrollmentWire,\n type CustomerResellerOrderWire,\n type CustomerResellerOrdersWire,\n type CustomerResellerQuoteWire,\n type CustomerResellerSummaryWire,\n type CustomerResellerTopupWire,\n type CustomerResellerWalletWire,\n type CustomerWarrantyClaimWire,\n type CustomerWarrantyListWire,\n} from '@shoppex/contracts/customer-portal-wire';\nimport { storefrontStorageKey } from '@shoppex/contracts/storefront-storage-key';\n\nconst DEFAULT_API_ORIGIN = 'https://api.shoppex.io';\nconst SESSION_STORAGE_PREFIX = 'shoppex_headless_customer_session:';\n\ninterface CustomerPayloadSchema<T> {\n safeParse(value: unknown): { success: true; data: T } | { success: false };\n}\n\ninterface ApiEnvelope<T> {\n status: number;\n data: T | null;\n error: string | null;\n message?: string | null;\n error_code?: string | null;\n}\n\ninterface StoredSession {\n accessToken: string;\n expiresAt: string;\n savedAt: number;\n}\n\nexport interface HeadlessCustomerClientConfig {\n /** Shop slug or Shoppex storefront domain. */\n shop: string;\n /** Existing Headless Checkout publishable key (`pk_live_` / `pk_test_`). */\n publishableKey: string;\n /** API origin override. Defaults to https://api.shoppex.io. */\n apiBaseUrl?: string;\n /** Optional fetch override for tests or compatible runtimes. */\n fetchImpl?: typeof fetch;\n /** Optional session storage override. Defaults to browser sessionStorage. */\n storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n /** Optional persistent storage override. Defaults to browser localStorage. */\n persistentStorage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n}\n\nexport interface HeadlessCustomerSession {\n accessToken: string;\n expiresAt: string;\n}\n\nexport interface HeadlessCustomerVerifyOptions {\n /** Persist the customer session across browser restarts for up to 30 days. */\n rememberMe?: boolean;\n}\n\nexport interface HeadlessCustomerOrdersQuery {\n page?: number;\n limit?: number;\n status?: string;\n search?: string;\n}\n\nexport interface HeadlessCustomerDownload {\n blob: Blob;\n filename: string | null;\n contentType: string | null;\n}\n\ntype HeadlessCustomerDashboardDeliverable =\n CustomerPortalDashboardWire['deliverables'][number] & {\n /** Pass this value with `invoice_uniqid` to `customer.download()`. */\n downloadIndex?: number | null;\n };\n\nexport type HeadlessCustomerDashboard = Omit<CustomerPortalDashboardWire, 'deliverables'> & {\n deliverables: HeadlessCustomerDashboardDeliverable[];\n};\nexport type HeadlessCustomerProfileUpdate = CustomerPortalProfileUpdateWire;\nexport type HeadlessCustomerAvatar = CustomerPortalAvatarWire;\nexport type HeadlessCustomerEmailPreferences = CustomerPortalEmailPreferencesWire;\nexport type HeadlessCustomerEmailPreferencesUpdate = CustomerPortalEmailPreferencesUpdateWire;\nexport type HeadlessCustomerNotificationPreferences = CustomerPortalNotificationPreferencesWire;\n/**\n * `reviewer_name` and `anonymous` come with the backend of #3697, which deploys\n * after this SDK version is on npm (a theme-runtime pin is published before its\n * release PR). Until that deploy the API answers without them, so they are\n * optional here; tighten back to `CustomerPortalOrderReviewWire` once it shipped.\n */\nexport type HeadlessCustomerOrderReview = Omit<CustomerPortalOrderReviewWire, 'reviewer_name' | 'anonymous'>\n & Partial<Pick<CustomerPortalOrderReviewWire, 'reviewer_name' | 'anonymous'>>;\nconst orderReviewSchema = customerPortalOrderReviewSchema.partial({ reviewer_name: true, anonymous: true });\nexport type HeadlessCustomerFavorites = CustomerPortalFavoritesWire;\nexport type HeadlessCustomerFavoriteMutation = CustomerPortalFavoriteMutationWire;\nexport type HeadlessCustomerAffiliate = CustomerPortalAffiliateSummaryWire;\nexport type HeadlessCustomerAffiliateStats = CustomerPortalAffiliateStatsWire;\nexport type HeadlessCustomerAffiliateLink = CustomerPortalAffiliateCreateLinkWire;\nexport type HeadlessCustomerTicket = CustomerPortalSupportTicketDetailWire;\nexport type HeadlessCustomerTicketCreateResult = CustomerPortalSupportCreateWire;\nexport type HeadlessCustomerLicenseReset = CustomerPortalLicenseResetWire;\nexport type HeadlessCustomerLicenseRenewal = CustomerPortalLicenseRenewalWire;\nexport type HeadlessCustomerWalletTopupQuote = CustomerPortalWalletTopupQuoteWire;\nexport type HeadlessCustomerWalletTopup = CustomerPortalWalletTopupResultWire;\nexport type HeadlessCustomerSubscriptionBillingHistory = CustomerPortalSubscriptionBillingHistoryWire;\nexport type HeadlessCustomerSubscriptionCancel = CustomerPortalSubscriptionCancelWire;\nexport type HeadlessCustomerSubscriptionStatus = CustomerPortalSubscriptionStatusWire;\nexport type HeadlessCustomerLoyalty = CustomerLoyaltyWire;\nexport type HeadlessCustomerLoyaltyRedeem = CustomerLoyaltyRedeemWire;\nexport type HeadlessCustomerWarranties = CustomerWarrantyListWire;\nexport type HeadlessCustomerWarrantyClaim = CustomerWarrantyClaimWire;\nexport type HeadlessCustomerReseller = CustomerResellerSummaryWire;\nexport type HeadlessCustomerResellerEnrollment = CustomerResellerEnrollmentWire;\nexport type HeadlessCustomerResellerCatalog = CustomerResellerCatalogWire;\nexport type HeadlessCustomerResellerQuote = CustomerResellerQuoteWire;\nexport type HeadlessCustomerResellerOrders = CustomerResellerOrdersWire;\nexport type HeadlessCustomerResellerOrder = CustomerResellerOrderWire;\nexport type HeadlessCustomerResellerWallet = CustomerResellerWalletWire;\nexport type HeadlessCustomerResellerApiKeys = CustomerResellerApiKeysWire;\nexport type HeadlessCustomerResellerTopup = CustomerResellerTopupWire;\n\nexport interface HeadlessCustomerTicketInput {\n title?: string;\n message: string;\n invoiceId?: string;\n}\n\nexport interface HeadlessCustomerOrderReviewInput {\n score: 1 | 3 | 5;\n message: string;\n /**\n * Post without the buyer's name. Omitted = anonymous; pass `false` once the\n * buyer saw `orderReview().reviewer_name` and chose to show it (an API that\n * answers no `reviewer_name` saves the review anonymously either way).\n */\n anonymous?: boolean;\n}\n\nexport interface HeadlessCustomerAffiliateLinkInput {\n code: string;\n label: string;\n requestedRevenuePercent?: number | null;\n requestedCustomerDiscountPercent?: number | null;\n}\n\nexport interface HeadlessCustomerSubscriptionCancelOptions {\n cancelAtPeriodEnd?: boolean;\n reason?: string | null;\n}\n\nexport interface HeadlessCustomerEmailPreferencesPatch {\n globalUnsubscribed?: boolean;\n listSubscriptions?: Array<{ listId: string; subscribed: boolean }>;\n}\n\nexport interface HeadlessCustomerNotificationPreferencesPatch {\n orderCreatedEmails?: boolean;\n orderCompletedEmails?: boolean;\n paymentIssueEmails?: boolean;\n}\n\nexport interface HeadlessCustomerResellerCatalogQuery {\n search?: string;\n page?: number;\n perPage?: number;\n}\n\nexport interface HeadlessCustomerResellerOrdersQuery {\n page?: number;\n perPage?: number;\n}\n\nexport interface HeadlessCustomerResellerOrderItem {\n productId: string;\n variantId?: string;\n quantity: number;\n}\n\n/** Public DTOs mirror the producer-owned schemas imported above. Passing each\n * schema into `request<T>` makes TypeScript reject drift in required fields. */\nexport interface HeadlessCustomerMe {\n customer: {\n id: string | null;\n email: string;\n name: string;\n avatar_url: string | null;\n joined_at: string | null;\n };\n shop: {\n id: string;\n slug: string;\n name: string;\n currency: string;\n branding: {\n logo_url: string | null;\n primary_color: string;\n secondary_color: string;\n accent_color: string;\n };\n };\n}\n\ntype HeadlessCustomerMeWire = HeadlessCustomerMe & { token: string | null };\n\nexport interface HeadlessCustomerOrderSummary {\n uniqid: string;\n status: string;\n total: string;\n totalDisplay: string | null;\n currency: string;\n createdAt: string;\n lineItems: Array<{\n productTitle: string | null;\n quantity: number;\n product: {\n attachment_imageId: { cloudflareImageId: string | null } | null;\n } | null;\n }>;\n}\n\nexport interface HeadlessCustomerOrders {\n invoices: HeadlessCustomerOrderSummary[];\n pagination: {\n page: number;\n limit: number;\n total: number;\n has_more: boolean;\n };\n}\n\nexport interface HeadlessCustomerPayment {\n gateway: string;\n displayName: string | null;\n cryptoGateway?: string | null;\n blockchain: string | null;\n cryptoAddress: string | null;\n apmMethod: string | null;\n}\n\nexport interface HeadlessCustomerOrder {\n id: string;\n uniqid: string;\n status: string;\n statusDetails: string | null;\n total: string;\n totalDisplay: string | null;\n subtotal: string;\n discount: string;\n discountDisplay: string | null;\n tax: string;\n taxPercentage: string;\n currency: string;\n createdAt: string;\n updatedAt: string;\n gatewayUpdatedAt: string | null;\n customFields: Record<string, unknown> | null;\n balancePaidAmount: string;\n currentPaymentAttemptId: string | null;\n lineItems: Array<{\n id: string;\n productTitle: string;\n productType: string;\n variantTitle: string | null;\n unitPrice: string;\n quantity: number;\n total: string;\n deliveryText: string | null;\n deliverySummary: {\n codes: string[];\n links: Array<{\n label: string;\n value: string;\n /** External URL for non-Shoppex links. Portal-only download URLs are removed. */\n href?: string | null;\n /** Pass this value to `customer.download(orderId, downloadIndex)`. */\n downloadIndex?: number | null;\n }>;\n notes: string[];\n serials: Array<{ value: string; is_replacement: boolean; is_replaced: boolean }>;\n } | null;\n deliveredAt: string | null;\n deliveryStatus: 'PENDING' | 'AWAITING_FULFILLMENT' | 'DELIVERED' | 'FAILED';\n customFields: Record<string, unknown> | null;\n product: {\n uniqid: string;\n slug: string | null;\n serviceText: string | null;\n attachment_imageId: { cloudflareImageId: string | null } | null;\n } | null;\n }>;\n currentPayment: HeadlessCustomerPayment | null;\n payments: HeadlessCustomerPayment[];\n}\n\n/**\n * `code: 'RESPONSE_CONTRACT_VIOLATION'` (status 2xx) on `createWalletTopup`,\n * `createResellerTopup` or `redeemLoyaltyPoints` means the server completed the\n * call and withheld its answer. Re-read the account (`dashboard()`, `loyalty()`,\n * `resellerWallet()`) and show that; do not report a failure or call again.\n */\nexport class HeadlessCustomerError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly code?: string | null,\n ) {\n super(message);\n this.name = 'HeadlessCustomerError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseStoredSession(value: string | null): StoredSession | null {\n if (!value) return null;\n try {\n const parsed: unknown = JSON.parse(value);\n if (\n !isRecord(parsed)\n || typeof parsed.accessToken !== 'string'\n || !parsed.accessToken.startsWith('hcs_')\n || typeof parsed.expiresAt !== 'string'\n || typeof parsed.savedAt !== 'number'\n || !Number.isFinite(parsed.savedAt)\n ) {\n return null;\n }\n const expiresAtMs = Date.parse(parsed.expiresAt);\n if (!Number.isFinite(expiresAtMs) || expiresAtMs <= Date.now()) return null;\n return { accessToken: parsed.accessToken, expiresAt: parsed.expiresAt, savedAt: parsed.savedAt };\n } catch {\n return null;\n }\n}\n\nfunction readFilename(header: string | null): string | null {\n if (!header) return null;\n const utf8Match = header.match(/filename\\*=UTF-8''([^;]+)/i);\n if (utf8Match?.[1]) {\n try {\n return decodeURIComponent(utf8Match[1]);\n } catch {\n return utf8Match[1];\n }\n }\n return header.match(/filename=\"([^\"]+)\"/i)?.[1] ?? null;\n}\n\nfunction readPortalDownloadIndex(href: string | null | undefined): number | null {\n // Only relative URLs are owned by the Shoppex customer portal. An external\n // site may legitimately use the same pathname and must remain an external link.\n if (!href?.startsWith('/api/customer/')) return null;\n try {\n const url = new URL(href, 'https://headless-customer.invalid');\n if (!/^\\/api\\/customer\\/invoice\\/[^/]+\\/download$/.test(url.pathname)) return null;\n const rawIndex = url.searchParams.get('file_index');\n if (rawIndex === null || !/^\\d+$/.test(rawIndex)) return null;\n const index = Number(rawIndex);\n return Number.isSafeInteger(index) ? index : null;\n } catch {\n return null;\n }\n}\n\nfunction readBrowserStorage(name: 'sessionStorage' | 'localStorage'):\n Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null {\n try {\n return typeof window === 'undefined' ? null : window[name];\n } catch {\n return null;\n }\n}\n\nexport class HeadlessCustomerClient {\n private readonly base: string;\n private readonly shop: string;\n private readonly publishableKey: string;\n private readonly fetchImpl: typeof fetch;\n private readonly storage: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null;\n private readonly persistentStorage: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null;\n private readonly storageKey: string;\n private memorySession: StoredSession | null = null;\n\n constructor(config: HeadlessCustomerClientConfig) {\n if (!config.shop.trim()) throw new Error('HeadlessCustomerClient requires a shop.');\n if (!config.publishableKey.trim()) {\n throw new Error('HeadlessCustomerClient requires a publishableKey.');\n }\n this.shop = config.shop.trim();\n this.publishableKey = config.publishableKey.trim();\n this.base = (config.apiBaseUrl ?? DEFAULT_API_ORIGIN).replace(/\\/+$/, '');\n this.fetchImpl = config.fetchImpl ?? globalThis.fetch?.bind(globalThis);\n if (!this.fetchImpl) throw new Error('No fetch implementation available; pass fetchImpl.');\n this.storage = config.storage ?? readBrowserStorage('sessionStorage');\n this.persistentStorage = config.persistentStorage ?? readBrowserStorage('localStorage');\n this.storageKey = `${SESSION_STORAGE_PREFIX}${this.shop}`;\n }\n\n getSession(): HeadlessCustomerSession | null {\n const candidates: StoredSession[] = this.memorySession ? [this.memorySession] : [];\n if (this.storage) {\n try {\n const stored = parseStoredSession(this.storage.getItem(storefrontStorageKey(this.storageKey)));\n if (stored) candidates.push(stored);\n } catch {\n // Continue with memory and persistent storage.\n }\n }\n if (this.persistentStorage) {\n try {\n const stored = parseStoredSession(this.persistentStorage.getItem(storefrontStorageKey(this.storageKey)));\n if (stored) candidates.push(stored);\n } catch {\n // Continue with the other available stores.\n }\n }\n\n const stored = candidates.sort((left, right) => right.savedAt - left.savedAt)[0] ?? null;\n\n if (!stored) {\n this.clearSession();\n return null;\n }\n this.memorySession = stored;\n return { accessToken: stored.accessToken, expiresAt: stored.expiresAt };\n }\n\n clearSession(): void {\n this.memorySession = null;\n try {\n this.storage?.removeItem(storefrontStorageKey(this.storageKey));\n } catch {\n // Privacy-restricted browsers may reject storage access. Memory is still cleared.\n }\n try {\n this.persistentStorage?.removeItem(storefrontStorageKey(this.storageKey));\n } catch {\n // The two stores are cleared independently so one rejected access cannot block the other.\n }\n }\n\n private saveSession(session: HeadlessCustomerSession, rememberMe: boolean): void {\n const storedSession: StoredSession = { ...session, savedAt: Date.now() };\n this.memorySession = storedSession;\n const target = rememberMe ? this.persistentStorage : this.storage;\n const other = rememberMe ? this.storage : this.persistentStorage;\n try {\n target?.setItem(storefrontStorageKey(this.storageKey), JSON.stringify(storedSession));\n } catch {\n // Keep the session for this client instance when browser storage is unavailable.\n }\n try {\n other?.removeItem(storefrontStorageKey(this.storageKey));\n } catch {\n // A stale session in the other storage cannot override the in-memory session.\n }\n }\n\n private url(path: string, query: Record<string, string | undefined> = {}): string {\n const url = new URL(`${this.base}/v1/customer${path}`);\n url.searchParams.set('shop', this.shop);\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== '') url.searchParams.set(key, value);\n }\n return url.toString();\n }\n\n private async request<T>(\n path: string,\n options: {\n method?: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';\n body?: unknown;\n formData?: FormData;\n authenticated?: boolean;\n schema?: CustomerPayloadSchema<T>;\n query?: Record<string, string | undefined>;\n } = {},\n ): Promise<T> {\n if (options.body !== undefined && options.formData !== undefined) {\n throw new Error('Customer requests cannot send JSON and FormData together.');\n }\n const session = options.authenticated ? this.getSession() : null;\n if (options.authenticated && !session) {\n throw new HeadlessCustomerError(401, 'Customer session is missing or expired.', 'UNAUTHORIZED');\n }\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n 'x-shoppex-publishable-key': this.publishableKey,\n ...(options.body === undefined ? {} : { 'content-type': 'application/json' }),\n ...(session ? { authorization: `Bearer ${session.accessToken}` } : {}),\n };\n const requestBody = options.formData ?? (\n options.body === undefined ? undefined : JSON.stringify(options.body)\n );\n const response = await this.fetchImpl(this.url(path, options.query), {\n method: options.method ?? 'GET',\n headers,\n ...(requestBody === undefined ? {} : { body: requestBody }),\n cache: 'no-store',\n });\n\n let envelope: ApiEnvelope<unknown> | null = null;\n try {\n envelope = await response.json() as ApiEnvelope<unknown>;\n } catch {\n // Report a stable transport error below.\n }\n if (!response.ok || !envelope || envelope.error) {\n if (response.status === 401 && options.authenticated) this.clearSession();\n throw new HeadlessCustomerError(\n response.status,\n envelope?.error ?? `Request failed (${response.status})`,\n envelope?.error_code ?? null,\n );\n }\n\n if (!options.schema) return envelope.data as T;\n const parsed = options.schema.safeParse(envelope.data);\n if (!parsed.success) {\n throw new HeadlessCustomerError(response.status, 'Customer API response did not match the expected contract.');\n }\n return parsed.data;\n }\n\n private async requestFile(\n path: string,\n query: Record<string, string | undefined> = {},\n options: { rejectHtml?: boolean } = {},\n ): Promise<HeadlessCustomerDownload> {\n const session = this.getSession();\n if (!session) {\n throw new HeadlessCustomerError(401, 'Customer session is missing or expired.', 'UNAUTHORIZED');\n }\n\n const response = await this.fetchImpl(this.url(path, query), {\n method: 'GET',\n headers: {\n 'x-shoppex-publishable-key': this.publishableKey,\n authorization: `Bearer ${session.accessToken}`,\n },\n cache: 'no-store',\n });\n if (!response.ok) {\n if (response.status === 401) this.clearSession();\n let message = `Download failed (${response.status})`;\n try {\n const body = await response.json() as ApiEnvelope<unknown>;\n if (body.error) message = body.error;\n } catch {\n // Keep the stable status-based error.\n }\n throw new HeadlessCustomerError(response.status, message);\n }\n\n const contentType = response.headers.get('content-type');\n if (options.rejectHtml && contentType?.toLowerCase().startsWith('text/html')) {\n throw new HeadlessCustomerError(\n 502,\n 'Shoppex returned an unsafe aggregate download response.',\n 'UNSAFE_DOWNLOAD_RESPONSE',\n );\n }\n\n return {\n blob: await response.blob(),\n filename: readFilename(response.headers.get('content-disposition')),\n contentType,\n };\n }\n\n requestOtp(email: string): Promise<{ requested: boolean }> {\n return this.request('/auth/otp/request', {\n method: 'POST',\n body: { shop: this.shop, email },\n });\n }\n\n async verifyOtp(\n email: string,\n otp: string,\n options: HeadlessCustomerVerifyOptions = {},\n ): Promise<HeadlessCustomerSession> {\n const data = await this.request<{ access_token: string; expires_at: string }>('/auth/otp/verify', {\n method: 'POST',\n body: { shop: this.shop, email, otp, remember_me: options.rememberMe ?? false },\n });\n const expiresAtMs = typeof data?.expires_at === 'string' ? Date.parse(data.expires_at) : Number.NaN;\n if (\n typeof data?.access_token !== 'string'\n || !data.access_token.startsWith('hcs_')\n || typeof data.expires_at !== 'string'\n || !Number.isFinite(expiresAtMs)\n || expiresAtMs <= Date.now()\n ) {\n throw new HeadlessCustomerError(200, 'Customer API response did not match the expected contract.');\n }\n const session = { accessToken: data.access_token, expiresAt: data.expires_at };\n this.saveSession(session, options.rememberMe ?? false);\n return session;\n }\n\n async me(): Promise<HeadlessCustomerMe> {\n const data = await this.request<HeadlessCustomerMeWire>('/me', {\n authenticated: true,\n schema: customerPortalMeSchema,\n });\n if (data.token !== null) {\n // A raw BetterAuth token here would bypass the external route allowlist.\n // Reject the response instead of handing that credential to merchant JS.\n throw new HeadlessCustomerError(200, 'Customer API response did not match the expected contract.');\n }\n return { customer: data.customer, shop: data.shop };\n }\n\n async dashboard(): Promise<HeadlessCustomerDashboard> {\n const dashboard = await this.request<CustomerPortalDashboardWire>('/dashboard', {\n authenticated: true,\n schema: customerPortalDashboardSchema,\n });\n return {\n ...dashboard,\n deliverables: dashboard.deliverables.map((deliverable) => {\n const downloadIndex = readPortalDownloadIndex(deliverable.href);\n return downloadIndex === null\n ? deliverable\n : { ...deliverable, href: null, downloadIndex };\n }),\n };\n }\n\n updateProfile(input: { name: string }): Promise<HeadlessCustomerProfileUpdate> {\n return this.request('/profile', {\n method: 'POST',\n authenticated: true,\n body: { name: input.name },\n schema: customerPortalProfileUpdateSchema,\n });\n }\n\n updateAvatar(file: File): Promise<HeadlessCustomerAvatar> {\n const formData = new FormData();\n formData.append('file', file);\n return this.request('/profile/avatar', {\n method: 'POST',\n authenticated: true,\n formData,\n schema: customerPortalAvatarSchema,\n });\n }\n\n removeAvatar(): Promise<HeadlessCustomerAvatar> {\n return this.request('/profile/avatar', {\n method: 'DELETE',\n authenticated: true,\n schema: customerPortalAvatarSchema,\n });\n }\n\n emailPreferences(): Promise<HeadlessCustomerEmailPreferences> {\n return this.request('/email-marketing/preferences', {\n authenticated: true,\n schema: customerPortalEmailPreferencesSchema,\n });\n }\n\n updateEmailPreferences(\n patch: HeadlessCustomerEmailPreferencesPatch,\n ): Promise<HeadlessCustomerEmailPreferencesUpdate> {\n return this.request('/email-marketing/preferences', {\n method: 'PATCH',\n authenticated: true,\n body: {\n ...(patch.globalUnsubscribed === undefined\n ? {}\n : { global_unsubscribed: patch.globalUnsubscribed }),\n list_subscriptions: (patch.listSubscriptions ?? []).map((item) => ({\n list_id: item.listId,\n subscribed: item.subscribed,\n })),\n },\n schema: customerPortalEmailPreferencesUpdateSchema,\n });\n }\n\n notificationPreferences(): Promise<HeadlessCustomerNotificationPreferences> {\n return this.request('/notification-preferences', {\n authenticated: true,\n schema: customerPortalNotificationPreferencesSchema,\n });\n }\n\n updateNotificationPreferences(\n patch: HeadlessCustomerNotificationPreferencesPatch,\n ): Promise<HeadlessCustomerNotificationPreferences> {\n return this.request('/notification-preferences', {\n method: 'PATCH',\n authenticated: true,\n body: {\n ...(patch.orderCreatedEmails === undefined\n ? {}\n : { order_created_emails: patch.orderCreatedEmails }),\n ...(patch.orderCompletedEmails === undefined\n ? {}\n : { order_completed_emails: patch.orderCompletedEmails }),\n ...(patch.paymentIssueEmails === undefined\n ? {}\n : { payment_issue_emails: patch.paymentIssueEmails }),\n },\n schema: customerPortalNotificationPreferencesSchema,\n });\n }\n\n orders(options: HeadlessCustomerOrdersQuery = {}): Promise<HeadlessCustomerOrders> {\n return this.request<HeadlessCustomerOrders>('/invoices', {\n authenticated: true,\n schema: customerPortalPaginatedInvoicesSchema,\n query: {\n page: options.page === undefined ? undefined : String(options.page),\n limit: options.limit === undefined ? undefined : String(options.limit),\n status: options.status,\n q: options.search,\n },\n });\n }\n\n async order(id: string): Promise<HeadlessCustomerOrder> {\n const order = await this.request<HeadlessCustomerOrder>(`/invoice/${encodeURIComponent(id)}`, {\n authenticated: true,\n schema: customerPortalInvoiceDetailSchema,\n });\n return {\n ...order,\n lineItems: order.lineItems.map((lineItem) => ({\n ...lineItem,\n deliverySummary: lineItem.deliverySummary\n ? {\n ...lineItem.deliverySummary,\n links: lineItem.deliverySummary.links.map((link) => {\n const downloadIndex = readPortalDownloadIndex(link.href);\n return downloadIndex === null\n ? link\n : { ...link, href: null, downloadIndex };\n }),\n }\n : null,\n })),\n };\n }\n\n orderReview(orderId: string): Promise<HeadlessCustomerOrderReview> {\n return this.request(`/invoices/${encodeURIComponent(orderId)}/review`, {\n authenticated: true,\n schema: orderReviewSchema,\n });\n }\n\n submitOrderReview(\n orderId: string,\n input: HeadlessCustomerOrderReviewInput,\n ): Promise<HeadlessCustomerOrderReview> {\n return this.request(`/invoices/${encodeURIComponent(orderId)}/review`, {\n method: 'POST',\n authenticated: true,\n body: {\n score: input.score,\n message: input.message,\n ...(input.anonymous === undefined ? {} : { anonymous: input.anonymous }),\n },\n schema: orderReviewSchema,\n });\n }\n\n invoicePdf(orderId: string): Promise<HeadlessCustomerDownload> {\n return this.requestFile(`/invoices/${encodeURIComponent(orderId)}/pdf`);\n }\n\n async download(orderId: string, fileIndex: number): Promise<HeadlessCustomerDownload> {\n if (!Number.isSafeInteger(fileIndex) || fileIndex < 0) {\n throw new HeadlessCustomerError(\n 400,\n 'download requires a non-negative integer fileIndex from order().deliverySummary.links.',\n 'INVALID_FILE_INDEX',\n );\n }\n return this.requestFile(\n `/invoice/${encodeURIComponent(orderId)}/download`,\n { file_index: String(fileIndex) },\n { rejectHtml: true },\n );\n }\n\n resetLicenseHwid(licenseId: string): Promise<HeadlessCustomerLicenseReset> {\n return this.request(`/licenses/${encodeURIComponent(licenseId)}/reset-hwid`, {\n method: 'POST',\n authenticated: true,\n body: {},\n schema: customerPortalLicenseResetSchema,\n });\n }\n\n renewLicense(licenseId: string): Promise<HeadlessCustomerLicenseRenewal> {\n return this.request(`/licenses/${encodeURIComponent(licenseId)}/renew`, {\n method: 'POST',\n authenticated: true,\n // This established route requires shop in the body. The shared headless\n // gate independently verifies the same shop from the query and key.\n body: { shop: this.shop },\n schema: customerPortalLicenseRenewalSchema,\n });\n }\n\n walletTopupQuote(): Promise<HeadlessCustomerWalletTopupQuote> {\n return this.request('/wallet/topup-quote', {\n authenticated: true,\n schema: customerPortalWalletTopupQuoteSchema,\n });\n }\n\n createWalletTopup(amount: string): Promise<HeadlessCustomerWalletTopup> {\n return this.request('/wallet/topup', {\n method: 'POST',\n authenticated: true,\n body: { amount },\n schema: customerPortalWalletTopupResultSchema,\n });\n }\n\n subscriptionBillingHistory(\n subscriptionId: string,\n ): Promise<HeadlessCustomerSubscriptionBillingHistory> {\n return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/billing-history`, {\n authenticated: true,\n schema: customerPortalSubscriptionBillingHistorySchema,\n });\n }\n\n cancelSubscription(\n subscriptionId: string,\n options: HeadlessCustomerSubscriptionCancelOptions = {},\n ): Promise<HeadlessCustomerSubscriptionCancel> {\n return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/cancel`, {\n method: 'POST',\n authenticated: true,\n body: {\n ...(options.cancelAtPeriodEnd === undefined\n ? {}\n : { cancel_at_period_end: options.cancelAtPeriodEnd }),\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n },\n schema: customerPortalSubscriptionCancelSchema,\n });\n }\n\n pauseSubscription(subscriptionId: string): Promise<HeadlessCustomerSubscriptionStatus> {\n return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/pause`, {\n method: 'POST',\n authenticated: true,\n body: {},\n schema: customerPortalSubscriptionStatusSchema,\n });\n }\n\n resumeSubscription(subscriptionId: string): Promise<HeadlessCustomerSubscriptionStatus> {\n return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/resume`, {\n method: 'POST',\n authenticated: true,\n body: {},\n schema: customerPortalSubscriptionStatusSchema,\n });\n }\n\n /** Takes back a cancellation scheduled for the period end (`actions.can_undo_cancel`). */\n undoSubscriptionCancel(subscriptionId: string): Promise<HeadlessCustomerSubscriptionCancel> {\n return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/undo-cancel`, {\n method: 'POST',\n authenticated: true,\n body: {},\n schema: customerPortalSubscriptionCancelSchema,\n });\n }\n\n loyalty(): Promise<HeadlessCustomerLoyalty> {\n return this.request('/loyalty', {\n authenticated: true,\n schema: customerLoyaltySchema,\n });\n }\n\n redeemLoyaltyPoints(input: {\n points: number;\n idempotencyKey: string;\n }): Promise<HeadlessCustomerLoyaltyRedeem> {\n return this.request('/loyalty/redeem', {\n method: 'POST',\n authenticated: true,\n body: { points: input.points, idempotency_key: input.idempotencyKey },\n schema: customerLoyaltyRedeemSchema,\n });\n }\n\n warranties(invoiceId?: string): Promise<HeadlessCustomerWarranties> {\n return this.request('/warranties', {\n authenticated: true,\n query: { invoice: invoiceId },\n schema: customerWarrantyListSchema,\n });\n }\n\n claimWarranty(warrantyId: string, message?: string): Promise<HeadlessCustomerWarrantyClaim> {\n return this.request(`/warranties/${encodeURIComponent(warrantyId)}/claim`, {\n method: 'POST',\n authenticated: true,\n body: message ? { message } : {},\n schema: customerWarrantyClaimSchema,\n });\n }\n\n favorites(): Promise<HeadlessCustomerFavorites> {\n return this.request('/favorites', {\n authenticated: true,\n schema: customerPortalFavoritesSchema,\n });\n }\n\n addFavorite(productId: string): Promise<HeadlessCustomerFavoriteMutation> {\n return this.request(`/favorites/${encodeURIComponent(productId)}`, {\n method: 'PUT',\n authenticated: true,\n schema: customerPortalFavoriteMutationSchema,\n });\n }\n\n removeFavorite(productId: string): Promise<HeadlessCustomerFavoriteMutation> {\n return this.request(`/favorites/${encodeURIComponent(productId)}`, {\n method: 'DELETE',\n authenticated: true,\n schema: customerPortalFavoriteMutationSchema,\n });\n }\n\n affiliate(): Promise<HeadlessCustomerAffiliate> {\n return this.request('/affiliate', {\n authenticated: true,\n schema: customerPortalAffiliateSummarySchema,\n });\n }\n\n affiliateStats(input?: { days?: number }): Promise<HeadlessCustomerAffiliateStats> {\n return this.request('/affiliate/stats', {\n authenticated: true,\n schema: customerPortalAffiliateStatsSchema,\n query: input?.days === undefined ? {} : { days: String(input.days) },\n });\n }\n\n createAffiliateLink(\n input: HeadlessCustomerAffiliateLinkInput,\n ): Promise<HeadlessCustomerAffiliateLink> {\n return this.request('/affiliate/links', {\n method: 'POST',\n authenticated: true,\n body: {\n shop: this.shop,\n code: input.code,\n label: input.label,\n ...(input.requestedRevenuePercent === undefined\n ? {}\n : { requested_affiliate_revenue_percent: input.requestedRevenuePercent }),\n ...(input.requestedCustomerDiscountPercent === undefined\n ? {}\n : { requested_affiliate_customer_discount_percent: input.requestedCustomerDiscountPercent }),\n },\n schema: customerPortalAffiliateCreateLinkSchema,\n });\n }\n\n createTicket(input: HeadlessCustomerTicketInput): Promise<HeadlessCustomerTicketCreateResult> {\n return this.request('/tickets', {\n method: 'POST',\n authenticated: true,\n body: {\n ...(input.title === undefined ? {} : { title: input.title }),\n message: input.message,\n ...(input.invoiceId === undefined ? {} : { invoice_id: input.invoiceId }),\n },\n schema: customerPortalSupportCreateSchema,\n });\n }\n\n ticket(ticketId: string): Promise<HeadlessCustomerTicket> {\n return this.request(`/tickets/${encodeURIComponent(ticketId)}`, {\n authenticated: true,\n schema: customerPortalSupportTicketDetailSchema,\n });\n }\n\n async replyToTicket(ticketId: string, message: string): Promise<void> {\n await this.request<null>(`/tickets/${encodeURIComponent(ticketId)}/reply`, {\n method: 'POST',\n authenticated: true,\n body: { message },\n });\n }\n\n reseller(): Promise<HeadlessCustomerReseller> {\n return this.request('/reseller', {\n authenticated: true,\n schema: customerResellerSummarySchema,\n });\n }\n\n applyForReseller(note?: string): Promise<HeadlessCustomerResellerEnrollment> {\n return this.request('/reseller/apply', {\n method: 'POST',\n authenticated: true,\n body: note === undefined ? {} : { note },\n schema: customerResellerEnrollmentSchema,\n });\n }\n\n enrollAsReseller(): Promise<HeadlessCustomerResellerEnrollment> {\n return this.request('/reseller/enroll', {\n method: 'POST',\n authenticated: true,\n body: {},\n schema: customerResellerEnrollmentSchema,\n });\n }\n\n acceptResellerInvite(token: string): Promise<HeadlessCustomerResellerEnrollment> {\n return this.request('/reseller/accept-invite', {\n method: 'POST',\n authenticated: true,\n body: { token },\n schema: customerResellerEnrollmentSchema,\n });\n }\n\n resellerCatalog(\n options: HeadlessCustomerResellerCatalogQuery = {},\n ): Promise<HeadlessCustomerResellerCatalog> {\n return this.request('/reseller/catalog', {\n authenticated: true,\n query: {\n search: options.search,\n page: options.page === undefined ? undefined : String(options.page),\n per_page: options.perPage === undefined ? undefined : String(options.perPage),\n },\n schema: customerResellerCatalogSchema,\n });\n }\n\n quoteResellerOrder(\n items: HeadlessCustomerResellerOrderItem[],\n ): Promise<HeadlessCustomerResellerQuote> {\n return this.request('/reseller/orders/quote', {\n method: 'POST',\n authenticated: true,\n body: {\n items: items.map((item) => ({\n product_id: item.productId,\n ...(item.variantId === undefined ? {} : { variant_id: item.variantId }),\n quantity: item.quantity,\n })),\n },\n schema: customerResellerQuoteSchema,\n });\n }\n\n resellerOrders(\n options: HeadlessCustomerResellerOrdersQuery = {},\n ): Promise<HeadlessCustomerResellerOrders> {\n return this.request('/reseller/orders', {\n authenticated: true,\n query: {\n page: options.page === undefined ? undefined : String(options.page),\n per_page: options.perPage === undefined ? undefined : String(options.perPage),\n },\n schema: customerResellerOrdersSchema,\n });\n }\n\n resellerOrder(orderId: string): Promise<HeadlessCustomerResellerOrder> {\n return this.request(`/reseller/orders/${encodeURIComponent(orderId)}`, {\n authenticated: true,\n schema: customerResellerOrderSchema,\n });\n }\n\n resellerWallet(): Promise<HeadlessCustomerResellerWallet> {\n return this.request('/reseller/wallet', {\n authenticated: true,\n schema: customerResellerWalletSchema,\n });\n }\n\n resellerTopupQuote(): Promise<HeadlessCustomerWalletTopupQuote> {\n return this.request('/reseller/wallet/topup-quote', {\n authenticated: true,\n schema: customerPortalWalletTopupQuoteSchema,\n });\n }\n\n createResellerTopup(amount: string): Promise<HeadlessCustomerResellerTopup> {\n return this.request('/reseller/wallet/topup', {\n method: 'POST',\n authenticated: true,\n body: { amount },\n schema: customerResellerTopupSchema,\n });\n }\n\n resellerApiKeys(): Promise<HeadlessCustomerResellerApiKeys> {\n return this.request('/reseller/api-keys', {\n authenticated: true,\n schema: customerResellerApiKeysSchema,\n });\n }\n\n async logout(): Promise<void> {\n if (!this.getSession()) return;\n try {\n await this.request<null>('/auth/logout', { method: 'POST', authenticated: true });\n } catch (error) {\n if (error instanceof HeadlessCustomerError && error.status === 401) {\n // The server already considers the credential invalid. request() also\n // clears it, so logout is complete from the buyer's perspective.\n return;\n }\n // Keep the local token after a transient failure so the caller can retry\n // server-side revocation instead of leaving an unreachable live session.\n throw error;\n }\n this.clearSession();\n }\n}\n\nexport function createCustomerClient(config: HeadlessCustomerClientConfig): HeadlessCustomerClient {\n return new HeadlessCustomerClient(config);\n}\n"],"mappings":"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","names":["stored"]}
1
+ {"version":3,"sources":["../../contracts/src/customer-portal-wire.ts","../../sdk/src/headless-customer.ts"],"sourcesContent":["import { z } from 'zod';\nimport { customerPortalBrandingSchema } from './customer-account-wire.js';\n\n// The buyer account wire the storefront SDK validates lives in\n// ./customer-account-wire so storefront bundles do not ship the portal-only\n// schemas below. This module re-exports it: portal consumers keep one import.\nexport {\n customerLoyaltyRedeemSchema,\n customerLoyaltySchema,\n customerPortalAffiliateCreateLinkSchema,\n customerPortalAffiliateSummarySchema,\n customerPortalDashboardInvoiceSchema,\n customerPortalDashboardSchema,\n customerPortalInvoiceDetailSchema,\n customerPortalNotificationPreferencesSchema,\n customerPortalOrderReviewSchema,\n customerPortalPaginatedInvoiceSchema,\n customerPortalPaginatedInvoicesSchema,\n customerPortalRewardActivityItemSchema,\n customerPortalRewardsSchema,\n customerPortalSubscriptionSummarySchema,\n customerWarrantyClaimSchema,\n customerWarrantyListSchema,\n} from './customer-account-wire.js';\nexport type {\n CustomerLoyaltyRedeemWire,\n CustomerLoyaltyWire,\n CustomerPortalAffiliateCreateLinkWire,\n CustomerPortalAffiliateSummaryWire,\n CustomerPortalDashboardWire,\n CustomerPortalInvoiceDetailWire,\n CustomerPortalInvoiceShippingWire,\n CustomerPortalNotificationPreferencesWire,\n CustomerPortalOrderReviewWire,\n CustomerPortalPaginatedInvoicesWire,\n CustomerPortalRewardActivityItemWire,\n CustomerPortalRewardsWire,\n CustomerPortalSubscriptionSummaryWire,\n CustomerWarrantyClaimWire,\n CustomerWarrantyListWire,\n} from './customer-account-wire.js';\n\nconst nullableStringSchema = z.string().nullable();\n\nexport const customerPortalMeSchema = z.object({\n customer: z.object({\n id: nullableStringSchema,\n email: z.string(),\n name: z.string(),\n avatar_url: nullableStringSchema,\n joined_at: nullableStringSchema,\n }),\n shop: z.object({\n id: z.string(),\n slug: z.string(),\n name: z.string(),\n currency: z.string(),\n branding: customerPortalBrandingSchema,\n }),\n token: z.null(),\n});\n\nexport const customerPortalWalletTopupQuoteSchema = z.object({\n quote: z.object({\n enabled: z.boolean(),\n currency: z.string(),\n min_amount: z.string(),\n max_amount: nullableStringSchema,\n bonus_tiers: z.array(z.object({\n min_amount: z.string(),\n bonus_percent: z.number(),\n })),\n }),\n});\n\nexport const customerPortalWalletTopupResultSchema = z.object({\n invoice_id: z.string(),\n url: z.string(),\n});\n\nexport const customerPortalAffiliateStatsSchema = z.object({\n window_days: z.number(),\n totals: z.object({\n clicks: z.number(),\n add_to_carts: z.number(),\n checkouts_started: z.number(),\n sales: z.number(),\n }),\n per_link: z.array(z.object({\n link_id: z.string(),\n code: z.string(),\n label: nullableStringSchema,\n clicks: z.number(),\n add_to_carts: z.number(),\n checkouts_started: z.number(),\n })),\n daily: z.array(z.object({\n date: z.string(),\n clicks: z.number(),\n add_to_carts: z.number(),\n checkouts_started: z.number(),\n })),\n});\n\n// ---------------------------------------------------------------------------\n// Headless customer-portal action contracts\n// ---------------------------------------------------------------------------\n\nexport const customerPortalProfileUpdateSchema = z.object({\n customer: z.object({\n id: z.string(),\n email: z.string(),\n name: z.string(),\n joined_at: nullableStringSchema,\n }),\n});\n\nexport const customerPortalAvatarSchema = z.object({\n avatar_url: nullableStringSchema,\n});\n\nexport const customerPortalEmailPreferencesSchema = z.object({\n global_unsubscribed: z.boolean(),\n lists: z.array(z.object({\n id: z.string(),\n name: z.string(),\n description: nullableStringSchema,\n subscribed: z.boolean(),\n })),\n});\n\nexport const customerPortalEmailPreferencesUpdateSchema = z.object({\n updated: z.boolean(),\n});\n\nexport const customerPortalFavoritesSchema = z.object({\n favorites: z.array(z.object({\n product_uniqid: z.string(),\n title: z.string(),\n slug: nullableStringSchema,\n image_url: nullableStringSchema,\n price_display: z.number(),\n unavailable: z.boolean(),\n created_at: z.string(),\n })),\n});\n\nexport const customerPortalFavoriteMutationSchema = z.union([\n z.object({ added: z.literal(true) }),\n z.object({ removed: z.literal(true) }),\n]);\n\nexport const customerPortalLicenseResetSchema = z.object({\n license: z.object({\n uniqid: z.string(),\n hardware_id: nullableStringSchema,\n }),\n});\n\nexport const customerPortalLicenseRenewalSchema = z.object({\n invoice_id: z.string(),\n checkout_url: z.string(),\n preferred_gateways: z.array(z.string()),\n license: z.object({\n uniqid: z.string(),\n product_title: z.string(),\n }),\n});\n\nexport const customerPortalSubscriptionBillingHistorySchema = z.object({\n invoices: z.array(z.object({\n id: z.string(),\n uniqid: z.string(),\n total: z.string(),\n currency: z.string(),\n status: z.string(),\n gateway: z.string(),\n created_at: z.string(),\n completed_at: z.string(),\n })),\n});\n\nexport const customerPortalSubscriptionCancelSchema = z.object({\n subscription: z.object({\n id: z.string(),\n status: z.string(),\n cancel_at_period_end: z.boolean(),\n cancel_reason: nullableStringSchema,\n canceled_at: nullableStringSchema,\n }),\n});\n\nexport const customerPortalSubscriptionStatusSchema = z.object({\n subscription: z.object({\n id: z.string(),\n status: z.string(),\n }),\n});\n\nexport const customerPortalSupportTicketDetailSchema = z.object({\n ticket: z.object({\n uniqid: z.string(),\n title: z.string(),\n status: z.string(),\n invoice_id: nullableStringSchema,\n created_at: z.string(),\n updated_at: z.string(),\n messages: z.array(z.object({\n id: z.string(),\n role: z.enum(['CUSTOMER', 'SHOP', 'SYSTEM']),\n message: z.string(),\n created_at: z.string(),\n })),\n }),\n});\n\nexport const customerPortalSupportCreateSchema = z.object({\n uniqid: z.string(),\n});\n\nconst customerResellerTierSchema = z.object({\n id: z.string(),\n name: nullableStringSchema,\n discount_percent: z.number().nullable(),\n});\n\nconst customerResellerRelationshipSchema = z.object({\n id: z.string(),\n status: z.enum(['INVITED', 'APPLIED', 'ACTIVE', 'SUSPENDED', 'REJECTED']),\n tier: customerResellerTierSchema.nullable(),\n application_note: nullableStringSchema,\n lifetime_revenue: z.string(),\n lifetime_orders: z.number(),\n approved_at: nullableStringSchema,\n created_at: z.string(),\n});\n\nexport const customerResellerSummarySchema = z.object({\n program_enabled: z.boolean(),\n api_enabled: z.boolean(),\n portal_purchasing_enabled: z.boolean(),\n enrollment_mode: z.enum(['MANUAL', 'APPLICATION', 'OPEN']),\n application_message: nullableStringSchema,\n require_application_note: z.boolean(),\n reseller: customerResellerRelationshipSchema.nullable(),\n});\n\nexport const customerResellerEnrollmentSchema = z.object({\n reseller: customerResellerRelationshipSchema,\n});\n\nconst customerResellerAppliedOverrideSchema = z.enum(['variant', 'product', 'tier']);\n\nconst customerResellerCatalogVariantSchema = z.object({\n variant_id: z.string(),\n title: z.string(),\n stock: z.number(),\n orderable: z.boolean(),\n base_price: z.string(),\n unit_price: z.string(),\n discount_percent: z.number(),\n applied_override: customerResellerAppliedOverrideSchema,\n});\n\n/**\n * A product custom field a wholesale order line answers in `items[].custom_fields`,\n * keyed by `name`. `format` is the check the server applies when there is no `regex`.\n */\nexport const customerResellerCustomFieldSchema = z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean(),\n placeholder: z.string(),\n default_value: z.string(),\n regex: nullableStringSchema,\n min_length: z.number().nullable(),\n format: z.enum(['number', 'discord_invite', 'url']).nullable(),\n /** Only on a `select`: the answer must be one of these labels. */\n options: z.array(z.string()).optional(),\n});\n\nexport const customerResellerCatalogSchema = z.object({\n tier: customerResellerTierSchema,\n catalog: z.object({\n currency: z.string(),\n total: z.number(),\n page: z.number(),\n per_page: z.number(),\n items: z.array(z.object({\n product_id: z.string(),\n uniqid: z.string(),\n title: z.string(),\n type: z.string(),\n stock: z.number(),\n orderable: z.boolean(),\n volume_discount_enabled: z.boolean(),\n base_price: z.string(),\n unit_price: z.string(),\n discount_percent: z.number(),\n applied_override: customerResellerAppliedOverrideSchema,\n /** Optional: a backend released before reseller custom fields does not send it. */\n custom_fields: z.array(customerResellerCustomFieldSchema).optional(),\n variants: z.array(customerResellerCatalogVariantSchema),\n })),\n }),\n});\n\nexport const customerResellerQuoteSchema = z.object({\n quote: z.object({\n currency: z.string(),\n tier: customerResellerTierSchema,\n items: z.array(z.object({\n product_id: z.string(),\n product_title: z.string(),\n product_type: z.string(),\n variant_id: nullableStringSchema,\n variant_title: nullableStringSchema,\n quantity: z.number(),\n base_price: z.string(),\n discount_percent: z.number(),\n unit_price: z.string(),\n line_total: z.string(),\n applied_override: customerResellerAppliedOverrideSchema,\n volume_discount_applied: z.string(),\n })),\n subtotal: z.string(),\n volume_discount_total: z.string(),\n total: z.string(),\n savings: z.string(),\n }),\n});\n\nexport const customerResellerOrdersSchema = z.object({\n orders: z.object({\n total: z.number(),\n page: z.number(),\n per_page: z.number(),\n items: z.array(z.object({\n uniqid: z.string(),\n status: z.string(),\n currency: z.string(),\n total: z.string(),\n item_count: z.number(),\n created_at: z.string(),\n })),\n }),\n});\n\nexport const customerResellerOrderSchema = z.object({\n order: z.object({\n uniqid: z.string(),\n status: z.string(),\n currency: z.string(),\n total: z.string(),\n item_count: z.number(),\n created_at: z.string(),\n tier_name: z.string(),\n tier_discount_percent: z.number(),\n partially_delivered: z.boolean(),\n refunded_amount: nullableStringSchema,\n lines: z.array(z.object({\n product_id: nullableStringSchema,\n product_title: z.string(),\n variant_id: nullableStringSchema,\n variant_title: nullableStringSchema,\n quantity: z.number(),\n unit_price: z.string(),\n total: z.string(),\n delivered: z.boolean(),\n delivered_at: nullableStringSchema,\n serials: z.array(z.string()),\n })),\n }),\n});\n\nexport const customerResellerWalletSchema = z.object({\n wallet: z.object({\n currency: z.string(),\n balance: z.string(),\n hold_balance: z.string(),\n available: z.string(),\n is_active: z.boolean(),\n }),\n});\n\nexport const customerResellerApiKeysSchema = z.object({\n api_keys: z.array(z.object({\n id: z.string(),\n name: z.string(),\n key_last4: z.string(),\n last_used_at: nullableStringSchema,\n revoked_at: nullableStringSchema,\n created_at: z.string(),\n })),\n});\n\nexport const customerResellerTopupSchema = z.object({\n topup: z.object({\n uniqid: z.string(),\n url: z.string(),\n }),\n});\n\nexport type CustomerPortalMeWire = z.infer<typeof customerPortalMeSchema>;\nexport type CustomerPortalAffiliateStatsWire = z.infer<typeof customerPortalAffiliateStatsSchema>;\nexport type CustomerPortalWalletTopupQuoteWire = z.infer<typeof customerPortalWalletTopupQuoteSchema>;\nexport type CustomerPortalWalletTopupResultWire = z.infer<typeof customerPortalWalletTopupResultSchema>;\nexport type CustomerPortalProfileUpdateWire = z.infer<typeof customerPortalProfileUpdateSchema>;\nexport type CustomerPortalAvatarWire = z.infer<typeof customerPortalAvatarSchema>;\nexport type CustomerPortalEmailPreferencesWire = z.infer<typeof customerPortalEmailPreferencesSchema>;\nexport type CustomerPortalEmailPreferencesUpdateWire = z.infer<typeof customerPortalEmailPreferencesUpdateSchema>;\nexport type CustomerPortalFavoritesWire = z.infer<typeof customerPortalFavoritesSchema>;\nexport type CustomerPortalFavoriteMutationWire = z.infer<typeof customerPortalFavoriteMutationSchema>;\nexport type CustomerPortalLicenseResetWire = z.infer<typeof customerPortalLicenseResetSchema>;\nexport type CustomerPortalLicenseRenewalWire = z.infer<typeof customerPortalLicenseRenewalSchema>;\nexport type CustomerPortalSubscriptionBillingHistoryWire = z.infer<typeof customerPortalSubscriptionBillingHistorySchema>;\nexport type CustomerPortalSubscriptionCancelWire = z.infer<typeof customerPortalSubscriptionCancelSchema>;\nexport type CustomerPortalSubscriptionStatusWire = z.infer<typeof customerPortalSubscriptionStatusSchema>;\nexport type CustomerPortalSupportTicketDetailWire = z.infer<typeof customerPortalSupportTicketDetailSchema>;\nexport type CustomerPortalSupportCreateWire = z.infer<typeof customerPortalSupportCreateSchema>;\nexport type CustomerResellerSummaryWire = z.infer<typeof customerResellerSummarySchema>;\nexport type CustomerResellerEnrollmentWire = z.infer<typeof customerResellerEnrollmentSchema>;\nexport type CustomerResellerCatalogWire = z.infer<typeof customerResellerCatalogSchema>;\nexport type CustomerResellerQuoteWire = z.infer<typeof customerResellerQuoteSchema>;\nexport type CustomerResellerOrdersWire = z.infer<typeof customerResellerOrdersSchema>;\nexport type CustomerResellerOrderWire = z.infer<typeof customerResellerOrderSchema>;\nexport type CustomerResellerWalletWire = z.infer<typeof customerResellerWalletSchema>;\nexport type CustomerResellerApiKeysWire = z.infer<typeof customerResellerApiKeysSchema>;\nexport type CustomerResellerTopupWire = z.infer<typeof customerResellerTopupSchema>;\n","/**\n * Browser client for a customer account hosted outside Shoppex.\n *\n * The publishable key identifies the merchant and the dashboard origin\n * allowlist authorizes the browser origin. OTP verification returns a separate\n * short-lived `hcs_` token; the SDK never exposes Shoppex's BetterAuth token.\n */\nimport {\n customerLoyaltyRedeemSchema,\n customerLoyaltySchema,\n customerPortalAffiliateSummarySchema,\n customerPortalAffiliateStatsSchema,\n customerPortalAffiliateCreateLinkSchema,\n customerPortalAvatarSchema,\n customerPortalDashboardSchema,\n customerPortalEmailPreferencesSchema,\n customerPortalEmailPreferencesUpdateSchema,\n customerPortalFavoriteMutationSchema,\n customerPortalFavoritesSchema,\n customerPortalInvoiceDetailSchema,\n customerPortalLicenseResetSchema,\n customerPortalLicenseRenewalSchema,\n customerPortalMeSchema,\n customerPortalNotificationPreferencesSchema,\n customerPortalOrderReviewSchema,\n customerPortalPaginatedInvoicesSchema,\n customerPortalProfileUpdateSchema,\n customerPortalSubscriptionBillingHistorySchema,\n customerPortalSubscriptionCancelSchema,\n customerPortalSubscriptionStatusSchema,\n customerPortalSupportCreateSchema,\n customerPortalSupportTicketDetailSchema,\n customerResellerApiKeysSchema,\n customerResellerCatalogSchema,\n customerResellerEnrollmentSchema,\n customerResellerOrderSchema,\n customerResellerOrdersSchema,\n customerResellerQuoteSchema,\n customerResellerSummarySchema,\n customerResellerWalletSchema,\n customerWarrantyClaimSchema,\n customerWarrantyListSchema,\n type CustomerLoyaltyRedeemWire,\n type CustomerLoyaltyWire,\n type CustomerPortalAffiliateSummaryWire,\n type CustomerPortalAffiliateStatsWire,\n type CustomerPortalAffiliateCreateLinkWire,\n type CustomerPortalAvatarWire,\n type CustomerPortalDashboardWire,\n type CustomerPortalEmailPreferencesUpdateWire,\n type CustomerPortalEmailPreferencesWire,\n type CustomerPortalFavoriteMutationWire,\n type CustomerPortalFavoritesWire,\n type CustomerPortalLicenseResetWire,\n type CustomerPortalLicenseRenewalWire,\n type CustomerPortalNotificationPreferencesWire,\n type CustomerPortalOrderReviewWire,\n type CustomerPortalProfileUpdateWire,\n type CustomerPortalSubscriptionBillingHistoryWire,\n type CustomerPortalSubscriptionCancelWire,\n type CustomerPortalSubscriptionStatusWire,\n type CustomerPortalSupportCreateWire,\n type CustomerPortalSupportTicketDetailWire,\n type CustomerResellerApiKeysWire,\n type CustomerResellerCatalogWire,\n type CustomerResellerEnrollmentWire,\n type CustomerResellerOrderWire,\n type CustomerResellerOrdersWire,\n type CustomerResellerQuoteWire,\n type CustomerResellerSummaryWire,\n type CustomerResellerWalletWire,\n type CustomerWarrantyClaimWire,\n type CustomerWarrantyListWire,\n} from '@shoppex/contracts/customer-portal-wire';\nimport { storefrontStorageKey } from '@shoppex/contracts/storefront-storage-key';\n\nconst DEFAULT_API_ORIGIN = 'https://api.shoppex.io';\nconst SESSION_STORAGE_PREFIX = 'shoppex_headless_customer_session:';\n\ninterface CustomerPayloadSchema<T> {\n safeParse(value: unknown): { success: true; data: T } | { success: false };\n}\n\ninterface ApiEnvelope<T> {\n status: number;\n data: T | null;\n error: string | null;\n message?: string | null;\n error_code?: string | null;\n}\n\ninterface StoredSession {\n accessToken: string;\n expiresAt: string;\n savedAt: number;\n}\n\nexport interface HeadlessCustomerClientConfig {\n /** Shop slug or Shoppex storefront domain. */\n shop: string;\n /** Existing Headless Checkout publishable key (`pk_live_` / `pk_test_`). */\n publishableKey: string;\n /** API origin override. Defaults to https://api.shoppex.io. */\n apiBaseUrl?: string;\n /** Optional fetch override for tests or compatible runtimes. */\n fetchImpl?: typeof fetch;\n /** Optional session storage override. Defaults to browser sessionStorage. */\n storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n /** Optional persistent storage override. Defaults to browser localStorage. */\n persistentStorage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n}\n\nexport interface HeadlessCustomerSession {\n accessToken: string;\n expiresAt: string;\n}\n\nexport interface HeadlessCustomerVerifyOptions {\n /** Persist the customer session across browser restarts for up to 30 days. */\n rememberMe?: boolean;\n}\n\nexport interface HeadlessCustomerOrdersQuery {\n page?: number;\n limit?: number;\n status?: string;\n search?: string;\n}\n\nexport interface HeadlessCustomerDownload {\n blob: Blob;\n filename: string | null;\n contentType: string | null;\n}\n\ntype HeadlessCustomerDashboardDeliverable =\n CustomerPortalDashboardWire['deliverables'][number] & {\n /** Pass this value with `invoice_uniqid` to `customer.download()`. */\n downloadIndex?: number | null;\n };\n\nexport type HeadlessCustomerDashboard = Omit<CustomerPortalDashboardWire, 'deliverables'> & {\n deliverables: HeadlessCustomerDashboardDeliverable[];\n};\nexport type HeadlessCustomerProfileUpdate = CustomerPortalProfileUpdateWire;\nexport type HeadlessCustomerAvatar = CustomerPortalAvatarWire;\nexport type HeadlessCustomerEmailPreferences = CustomerPortalEmailPreferencesWire;\nexport type HeadlessCustomerEmailPreferencesUpdate = CustomerPortalEmailPreferencesUpdateWire;\nexport type HeadlessCustomerNotificationPreferences = CustomerPortalNotificationPreferencesWire;\n/**\n * `reviewer_name` and `anonymous` come with the backend of #3697, which deploys\n * after this SDK version is on npm (a theme-runtime pin is published before its\n * release PR). Until that deploy the API answers without them, so they are\n * optional here; tighten back to `CustomerPortalOrderReviewWire` once it shipped.\n */\nexport type HeadlessCustomerOrderReview = Omit<CustomerPortalOrderReviewWire, 'reviewer_name' | 'anonymous'>\n & Partial<Pick<CustomerPortalOrderReviewWire, 'reviewer_name' | 'anonymous'>>;\nconst orderReviewSchema = customerPortalOrderReviewSchema.partial({ reviewer_name: true, anonymous: true });\nexport type HeadlessCustomerFavorites = CustomerPortalFavoritesWire;\nexport type HeadlessCustomerFavoriteMutation = CustomerPortalFavoriteMutationWire;\nexport type HeadlessCustomerAffiliate = CustomerPortalAffiliateSummaryWire;\nexport type HeadlessCustomerAffiliateStats = CustomerPortalAffiliateStatsWire;\nexport type HeadlessCustomerAffiliateLink = CustomerPortalAffiliateCreateLinkWire;\nexport type HeadlessCustomerTicket = CustomerPortalSupportTicketDetailWire;\nexport type HeadlessCustomerTicketCreateResult = CustomerPortalSupportCreateWire;\nexport type HeadlessCustomerLicenseReset = CustomerPortalLicenseResetWire;\nexport type HeadlessCustomerLicenseRenewal = CustomerPortalLicenseRenewalWire;\nexport type HeadlessCustomerSubscriptionBillingHistory = CustomerPortalSubscriptionBillingHistoryWire;\nexport type HeadlessCustomerSubscriptionCancel = CustomerPortalSubscriptionCancelWire;\nexport type HeadlessCustomerSubscriptionStatus = CustomerPortalSubscriptionStatusWire;\nexport type HeadlessCustomerLoyalty = CustomerLoyaltyWire;\nexport type HeadlessCustomerLoyaltyRedeem = CustomerLoyaltyRedeemWire;\nexport type HeadlessCustomerWarranties = CustomerWarrantyListWire;\nexport type HeadlessCustomerWarrantyClaim = CustomerWarrantyClaimWire;\nexport type HeadlessCustomerReseller = CustomerResellerSummaryWire;\nexport type HeadlessCustomerResellerEnrollment = CustomerResellerEnrollmentWire;\nexport type HeadlessCustomerResellerCatalog = CustomerResellerCatalogWire;\nexport type HeadlessCustomerResellerQuote = CustomerResellerQuoteWire;\nexport type HeadlessCustomerResellerOrders = CustomerResellerOrdersWire;\nexport type HeadlessCustomerResellerOrder = CustomerResellerOrderWire;\nexport type HeadlessCustomerResellerWallet = CustomerResellerWalletWire;\nexport type HeadlessCustomerResellerApiKeys = CustomerResellerApiKeysWire;\n\nexport interface HeadlessCustomerTicketInput {\n title?: string;\n message: string;\n invoiceId?: string;\n}\n\nexport interface HeadlessCustomerOrderReviewInput {\n score: 1 | 3 | 5;\n message: string;\n /**\n * Post without the buyer's name. Omitted = anonymous; pass `false` once the\n * buyer saw `orderReview().reviewer_name` and chose to show it (an API that\n * answers no `reviewer_name` saves the review anonymously either way).\n */\n anonymous?: boolean;\n}\n\nexport interface HeadlessCustomerAffiliateLinkInput {\n code: string;\n label: string;\n requestedRevenuePercent?: number | null;\n requestedCustomerDiscountPercent?: number | null;\n}\n\nexport interface HeadlessCustomerSubscriptionCancelOptions {\n cancelAtPeriodEnd?: boolean;\n reason?: string | null;\n}\n\nexport interface HeadlessCustomerEmailPreferencesPatch {\n globalUnsubscribed?: boolean;\n listSubscriptions?: Array<{ listId: string; subscribed: boolean }>;\n}\n\nexport interface HeadlessCustomerNotificationPreferencesPatch {\n orderCreatedEmails?: boolean;\n orderCompletedEmails?: boolean;\n paymentIssueEmails?: boolean;\n}\n\nexport interface HeadlessCustomerResellerCatalogQuery {\n search?: string;\n page?: number;\n perPage?: number;\n}\n\nexport interface HeadlessCustomerResellerOrdersQuery {\n page?: number;\n perPage?: number;\n}\n\nexport interface HeadlessCustomerResellerOrderItem {\n productId: string;\n variantId?: string;\n quantity: number;\n}\n\n/** Public DTOs mirror the producer-owned schemas imported above. Passing each\n * schema into `request<T>` makes TypeScript reject drift in required fields. */\nexport interface HeadlessCustomerMe {\n customer: {\n id: string | null;\n email: string;\n name: string;\n avatar_url: string | null;\n joined_at: string | null;\n };\n shop: {\n id: string;\n slug: string;\n name: string;\n currency: string;\n branding: {\n logo_url: string | null;\n primary_color: string;\n secondary_color: string;\n accent_color: string;\n };\n };\n}\n\ntype HeadlessCustomerMeWire = HeadlessCustomerMe & { token: string | null };\n\nexport interface HeadlessCustomerOrderSummary {\n uniqid: string;\n status: string;\n total: string;\n totalDisplay: string | null;\n currency: string;\n createdAt: string;\n lineItems: Array<{\n productTitle: string | null;\n quantity: number;\n product: {\n attachment_imageId: { cloudflareImageId: string | null } | null;\n } | null;\n }>;\n}\n\nexport interface HeadlessCustomerOrders {\n invoices: HeadlessCustomerOrderSummary[];\n pagination: {\n page: number;\n limit: number;\n total: number;\n has_more: boolean;\n };\n}\n\nexport interface HeadlessCustomerPayment {\n gateway: string;\n displayName: string | null;\n cryptoGateway?: string | null;\n blockchain: string | null;\n cryptoAddress: string | null;\n apmMethod: string | null;\n}\n\nexport interface HeadlessCustomerOrder {\n id: string;\n uniqid: string;\n status: string;\n statusDetails: string | null;\n total: string;\n totalDisplay: string | null;\n subtotal: string;\n discount: string;\n discountDisplay: string | null;\n tax: string;\n taxPercentage: string;\n currency: string;\n createdAt: string;\n updatedAt: string;\n gatewayUpdatedAt: string | null;\n customFields: Record<string, unknown> | null;\n balancePaidAmount: string;\n currentPaymentAttemptId: string | null;\n lineItems: Array<{\n id: string;\n productTitle: string;\n productType: string;\n variantTitle: string | null;\n unitPrice: string;\n quantity: number;\n total: string;\n deliveryText: string | null;\n deliverySummary: {\n codes: string[];\n links: Array<{\n label: string;\n value: string;\n /** External URL for non-Shoppex links. Portal-only download URLs are removed. */\n href?: string | null;\n /** Pass this value to `customer.download(orderId, downloadIndex)`. */\n downloadIndex?: number | null;\n }>;\n notes: string[];\n serials: Array<{ value: string; is_replacement: boolean; is_replaced: boolean }>;\n } | null;\n deliveredAt: string | null;\n deliveryStatus: 'PENDING' | 'AWAITING_FULFILLMENT' | 'DELIVERED' | 'FAILED';\n customFields: Record<string, unknown> | null;\n product: {\n uniqid: string;\n slug: string | null;\n serviceText: string | null;\n attachment_imageId: { cloudflareImageId: string | null } | null;\n } | null;\n }>;\n currentPayment: HeadlessCustomerPayment | null;\n payments: HeadlessCustomerPayment[];\n}\n\n/**\n * `code: 'RESPONSE_CONTRACT_VIOLATION'` (status 2xx) on `redeemLoyaltyPoints`\n * means the server completed the call and withheld its answer. Re-read the\n * account (`loyalty()`) and show that; do not report a failure or call again.\n */\nexport class HeadlessCustomerError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly code?: string | null,\n ) {\n super(message);\n this.name = 'HeadlessCustomerError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseStoredSession(value: string | null): StoredSession | null {\n if (!value) return null;\n try {\n const parsed: unknown = JSON.parse(value);\n if (\n !isRecord(parsed)\n || typeof parsed.accessToken !== 'string'\n || !parsed.accessToken.startsWith('hcs_')\n || typeof parsed.expiresAt !== 'string'\n || typeof parsed.savedAt !== 'number'\n || !Number.isFinite(parsed.savedAt)\n ) {\n return null;\n }\n const expiresAtMs = Date.parse(parsed.expiresAt);\n if (!Number.isFinite(expiresAtMs) || expiresAtMs <= Date.now()) return null;\n return { accessToken: parsed.accessToken, expiresAt: parsed.expiresAt, savedAt: parsed.savedAt };\n } catch {\n return null;\n }\n}\n\nfunction readFilename(header: string | null): string | null {\n if (!header) return null;\n const utf8Match = header.match(/filename\\*=UTF-8''([^;]+)/i);\n if (utf8Match?.[1]) {\n try {\n return decodeURIComponent(utf8Match[1]);\n } catch {\n return utf8Match[1];\n }\n }\n return header.match(/filename=\"([^\"]+)\"/i)?.[1] ?? null;\n}\n\nfunction readPortalDownloadIndex(href: string | null | undefined): number | null {\n // Only relative URLs are owned by the Shoppex customer portal. An external\n // site may legitimately use the same pathname and must remain an external link.\n if (!href?.startsWith('/api/customer/')) return null;\n try {\n const url = new URL(href, 'https://headless-customer.invalid');\n if (!/^\\/api\\/customer\\/invoice\\/[^/]+\\/download$/.test(url.pathname)) return null;\n const rawIndex = url.searchParams.get('file_index');\n if (rawIndex === null || !/^\\d+$/.test(rawIndex)) return null;\n const index = Number(rawIndex);\n return Number.isSafeInteger(index) ? index : null;\n } catch {\n return null;\n }\n}\n\nfunction readBrowserStorage(name: 'sessionStorage' | 'localStorage'):\n Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null {\n try {\n return typeof window === 'undefined' ? null : window[name];\n } catch {\n return null;\n }\n}\n\nexport class HeadlessCustomerClient {\n private readonly base: string;\n private readonly shop: string;\n private readonly publishableKey: string;\n private readonly fetchImpl: typeof fetch;\n private readonly storage: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null;\n private readonly persistentStorage: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null;\n private readonly storageKey: string;\n private memorySession: StoredSession | null = null;\n\n constructor(config: HeadlessCustomerClientConfig) {\n if (!config.shop.trim()) throw new Error('HeadlessCustomerClient requires a shop.');\n if (!config.publishableKey.trim()) {\n throw new Error('HeadlessCustomerClient requires a publishableKey.');\n }\n this.shop = config.shop.trim();\n this.publishableKey = config.publishableKey.trim();\n this.base = (config.apiBaseUrl ?? DEFAULT_API_ORIGIN).replace(/\\/+$/, '');\n this.fetchImpl = config.fetchImpl ?? globalThis.fetch?.bind(globalThis);\n if (!this.fetchImpl) throw new Error('No fetch implementation available; pass fetchImpl.');\n this.storage = config.storage ?? readBrowserStorage('sessionStorage');\n this.persistentStorage = config.persistentStorage ?? readBrowserStorage('localStorage');\n this.storageKey = `${SESSION_STORAGE_PREFIX}${this.shop}`;\n }\n\n getSession(): HeadlessCustomerSession | null {\n const candidates: StoredSession[] = this.memorySession ? [this.memorySession] : [];\n if (this.storage) {\n try {\n const stored = parseStoredSession(this.storage.getItem(storefrontStorageKey(this.storageKey)));\n if (stored) candidates.push(stored);\n } catch {\n // Continue with memory and persistent storage.\n }\n }\n if (this.persistentStorage) {\n try {\n const stored = parseStoredSession(this.persistentStorage.getItem(storefrontStorageKey(this.storageKey)));\n if (stored) candidates.push(stored);\n } catch {\n // Continue with the other available stores.\n }\n }\n\n const stored = candidates.sort((left, right) => right.savedAt - left.savedAt)[0] ?? null;\n\n if (!stored) {\n this.clearSession();\n return null;\n }\n this.memorySession = stored;\n return { accessToken: stored.accessToken, expiresAt: stored.expiresAt };\n }\n\n clearSession(): void {\n this.memorySession = null;\n try {\n this.storage?.removeItem(storefrontStorageKey(this.storageKey));\n } catch {\n // Privacy-restricted browsers may reject storage access. Memory is still cleared.\n }\n try {\n this.persistentStorage?.removeItem(storefrontStorageKey(this.storageKey));\n } catch {\n // The two stores are cleared independently so one rejected access cannot block the other.\n }\n }\n\n private saveSession(session: HeadlessCustomerSession, rememberMe: boolean): void {\n const storedSession: StoredSession = { ...session, savedAt: Date.now() };\n this.memorySession = storedSession;\n const target = rememberMe ? this.persistentStorage : this.storage;\n const other = rememberMe ? this.storage : this.persistentStorage;\n try {\n target?.setItem(storefrontStorageKey(this.storageKey), JSON.stringify(storedSession));\n } catch {\n // Keep the session for this client instance when browser storage is unavailable.\n }\n try {\n other?.removeItem(storefrontStorageKey(this.storageKey));\n } catch {\n // A stale session in the other storage cannot override the in-memory session.\n }\n }\n\n private url(path: string, query: Record<string, string | undefined> = {}): string {\n const url = new URL(`${this.base}/v1/customer${path}`);\n url.searchParams.set('shop', this.shop);\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== '') url.searchParams.set(key, value);\n }\n return url.toString();\n }\n\n private async request<T>(\n path: string,\n options: {\n method?: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';\n body?: unknown;\n formData?: FormData;\n authenticated?: boolean;\n schema?: CustomerPayloadSchema<T>;\n query?: Record<string, string | undefined>;\n } = {},\n ): Promise<T> {\n if (options.body !== undefined && options.formData !== undefined) {\n throw new Error('Customer requests cannot send JSON and FormData together.');\n }\n const session = options.authenticated ? this.getSession() : null;\n if (options.authenticated && !session) {\n throw new HeadlessCustomerError(401, 'Customer session is missing or expired.', 'UNAUTHORIZED');\n }\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n 'x-shoppex-publishable-key': this.publishableKey,\n ...(options.body === undefined ? {} : { 'content-type': 'application/json' }),\n ...(session ? { authorization: `Bearer ${session.accessToken}` } : {}),\n };\n const requestBody = options.formData ?? (\n options.body === undefined ? undefined : JSON.stringify(options.body)\n );\n const response = await this.fetchImpl(this.url(path, options.query), {\n method: options.method ?? 'GET',\n headers,\n ...(requestBody === undefined ? {} : { body: requestBody }),\n cache: 'no-store',\n });\n\n let envelope: ApiEnvelope<unknown> | null = null;\n try {\n envelope = await response.json() as ApiEnvelope<unknown>;\n } catch {\n // Report a stable transport error below.\n }\n if (!response.ok || !envelope || envelope.error) {\n if (response.status === 401 && options.authenticated) this.clearSession();\n throw new HeadlessCustomerError(\n response.status,\n envelope?.error ?? `Request failed (${response.status})`,\n envelope?.error_code ?? null,\n );\n }\n\n if (!options.schema) return envelope.data as T;\n const parsed = options.schema.safeParse(envelope.data);\n if (!parsed.success) {\n throw new HeadlessCustomerError(response.status, 'Customer API response did not match the expected contract.');\n }\n return parsed.data;\n }\n\n private async requestFile(\n path: string,\n query: Record<string, string | undefined> = {},\n options: { rejectHtml?: boolean } = {},\n ): Promise<HeadlessCustomerDownload> {\n const session = this.getSession();\n if (!session) {\n throw new HeadlessCustomerError(401, 'Customer session is missing or expired.', 'UNAUTHORIZED');\n }\n\n const response = await this.fetchImpl(this.url(path, query), {\n method: 'GET',\n headers: {\n 'x-shoppex-publishable-key': this.publishableKey,\n authorization: `Bearer ${session.accessToken}`,\n },\n cache: 'no-store',\n });\n if (!response.ok) {\n if (response.status === 401) this.clearSession();\n let message = `Download failed (${response.status})`;\n try {\n const body = await response.json() as ApiEnvelope<unknown>;\n if (body.error) message = body.error;\n } catch {\n // Keep the stable status-based error.\n }\n throw new HeadlessCustomerError(response.status, message);\n }\n\n const contentType = response.headers.get('content-type');\n if (options.rejectHtml && contentType?.toLowerCase().startsWith('text/html')) {\n throw new HeadlessCustomerError(\n 502,\n 'Shoppex returned an unsafe aggregate download response.',\n 'UNSAFE_DOWNLOAD_RESPONSE',\n );\n }\n\n return {\n blob: await response.blob(),\n filename: readFilename(response.headers.get('content-disposition')),\n contentType,\n };\n }\n\n requestOtp(email: string): Promise<{ requested: boolean }> {\n return this.request('/auth/otp/request', {\n method: 'POST',\n body: { shop: this.shop, email },\n });\n }\n\n async verifyOtp(\n email: string,\n otp: string,\n options: HeadlessCustomerVerifyOptions = {},\n ): Promise<HeadlessCustomerSession> {\n const data = await this.request<{ access_token: string; expires_at: string }>('/auth/otp/verify', {\n method: 'POST',\n body: { shop: this.shop, email, otp, remember_me: options.rememberMe ?? false },\n });\n const expiresAtMs = typeof data?.expires_at === 'string' ? Date.parse(data.expires_at) : Number.NaN;\n if (\n typeof data?.access_token !== 'string'\n || !data.access_token.startsWith('hcs_')\n || typeof data.expires_at !== 'string'\n || !Number.isFinite(expiresAtMs)\n || expiresAtMs <= Date.now()\n ) {\n throw new HeadlessCustomerError(200, 'Customer API response did not match the expected contract.');\n }\n const session = { accessToken: data.access_token, expiresAt: data.expires_at };\n this.saveSession(session, options.rememberMe ?? false);\n return session;\n }\n\n async me(): Promise<HeadlessCustomerMe> {\n const data = await this.request<HeadlessCustomerMeWire>('/me', {\n authenticated: true,\n schema: customerPortalMeSchema,\n });\n if (data.token !== null) {\n // A raw BetterAuth token here would bypass the external route allowlist.\n // Reject the response instead of handing that credential to merchant JS.\n throw new HeadlessCustomerError(200, 'Customer API response did not match the expected contract.');\n }\n return { customer: data.customer, shop: data.shop };\n }\n\n async dashboard(): Promise<HeadlessCustomerDashboard> {\n const dashboard = await this.request<CustomerPortalDashboardWire>('/dashboard', {\n authenticated: true,\n schema: customerPortalDashboardSchema,\n });\n return {\n ...dashboard,\n deliverables: dashboard.deliverables.map((deliverable) => {\n const downloadIndex = readPortalDownloadIndex(deliverable.href);\n return downloadIndex === null\n ? deliverable\n : { ...deliverable, href: null, downloadIndex };\n }),\n };\n }\n\n updateProfile(input: { name: string }): Promise<HeadlessCustomerProfileUpdate> {\n return this.request('/profile', {\n method: 'POST',\n authenticated: true,\n body: { name: input.name },\n schema: customerPortalProfileUpdateSchema,\n });\n }\n\n updateAvatar(file: File): Promise<HeadlessCustomerAvatar> {\n const formData = new FormData();\n formData.append('file', file);\n return this.request('/profile/avatar', {\n method: 'POST',\n authenticated: true,\n formData,\n schema: customerPortalAvatarSchema,\n });\n }\n\n removeAvatar(): Promise<HeadlessCustomerAvatar> {\n return this.request('/profile/avatar', {\n method: 'DELETE',\n authenticated: true,\n schema: customerPortalAvatarSchema,\n });\n }\n\n emailPreferences(): Promise<HeadlessCustomerEmailPreferences> {\n return this.request('/email-marketing/preferences', {\n authenticated: true,\n schema: customerPortalEmailPreferencesSchema,\n });\n }\n\n updateEmailPreferences(\n patch: HeadlessCustomerEmailPreferencesPatch,\n ): Promise<HeadlessCustomerEmailPreferencesUpdate> {\n return this.request('/email-marketing/preferences', {\n method: 'PATCH',\n authenticated: true,\n body: {\n ...(patch.globalUnsubscribed === undefined\n ? {}\n : { global_unsubscribed: patch.globalUnsubscribed }),\n list_subscriptions: (patch.listSubscriptions ?? []).map((item) => ({\n list_id: item.listId,\n subscribed: item.subscribed,\n })),\n },\n schema: customerPortalEmailPreferencesUpdateSchema,\n });\n }\n\n notificationPreferences(): Promise<HeadlessCustomerNotificationPreferences> {\n return this.request('/notification-preferences', {\n authenticated: true,\n schema: customerPortalNotificationPreferencesSchema,\n });\n }\n\n updateNotificationPreferences(\n patch: HeadlessCustomerNotificationPreferencesPatch,\n ): Promise<HeadlessCustomerNotificationPreferences> {\n return this.request('/notification-preferences', {\n method: 'PATCH',\n authenticated: true,\n body: {\n ...(patch.orderCreatedEmails === undefined\n ? {}\n : { order_created_emails: patch.orderCreatedEmails }),\n ...(patch.orderCompletedEmails === undefined\n ? {}\n : { order_completed_emails: patch.orderCompletedEmails }),\n ...(patch.paymentIssueEmails === undefined\n ? {}\n : { payment_issue_emails: patch.paymentIssueEmails }),\n },\n schema: customerPortalNotificationPreferencesSchema,\n });\n }\n\n orders(options: HeadlessCustomerOrdersQuery = {}): Promise<HeadlessCustomerOrders> {\n return this.request<HeadlessCustomerOrders>('/invoices', {\n authenticated: true,\n schema: customerPortalPaginatedInvoicesSchema,\n query: {\n page: options.page === undefined ? undefined : String(options.page),\n limit: options.limit === undefined ? undefined : String(options.limit),\n status: options.status,\n q: options.search,\n },\n });\n }\n\n async order(id: string): Promise<HeadlessCustomerOrder> {\n const order = await this.request<HeadlessCustomerOrder>(`/invoice/${encodeURIComponent(id)}`, {\n authenticated: true,\n schema: customerPortalInvoiceDetailSchema,\n });\n return {\n ...order,\n lineItems: order.lineItems.map((lineItem) => ({\n ...lineItem,\n deliverySummary: lineItem.deliverySummary\n ? {\n ...lineItem.deliverySummary,\n links: lineItem.deliverySummary.links.map((link) => {\n const downloadIndex = readPortalDownloadIndex(link.href);\n return downloadIndex === null\n ? link\n : { ...link, href: null, downloadIndex };\n }),\n }\n : null,\n })),\n };\n }\n\n orderReview(orderId: string): Promise<HeadlessCustomerOrderReview> {\n return this.request(`/invoices/${encodeURIComponent(orderId)}/review`, {\n authenticated: true,\n schema: orderReviewSchema,\n });\n }\n\n submitOrderReview(\n orderId: string,\n input: HeadlessCustomerOrderReviewInput,\n ): Promise<HeadlessCustomerOrderReview> {\n return this.request(`/invoices/${encodeURIComponent(orderId)}/review`, {\n method: 'POST',\n authenticated: true,\n body: {\n score: input.score,\n message: input.message,\n ...(input.anonymous === undefined ? {} : { anonymous: input.anonymous }),\n },\n schema: orderReviewSchema,\n });\n }\n\n invoicePdf(orderId: string): Promise<HeadlessCustomerDownload> {\n return this.requestFile(`/invoices/${encodeURIComponent(orderId)}/pdf`);\n }\n\n async download(orderId: string, fileIndex: number): Promise<HeadlessCustomerDownload> {\n if (!Number.isSafeInteger(fileIndex) || fileIndex < 0) {\n throw new HeadlessCustomerError(\n 400,\n 'download requires a non-negative integer fileIndex from order().deliverySummary.links.',\n 'INVALID_FILE_INDEX',\n );\n }\n return this.requestFile(\n `/invoice/${encodeURIComponent(orderId)}/download`,\n { file_index: String(fileIndex) },\n { rejectHtml: true },\n );\n }\n\n resetLicenseHwid(licenseId: string): Promise<HeadlessCustomerLicenseReset> {\n return this.request(`/licenses/${encodeURIComponent(licenseId)}/reset-hwid`, {\n method: 'POST',\n authenticated: true,\n body: {},\n schema: customerPortalLicenseResetSchema,\n });\n }\n\n renewLicense(licenseId: string): Promise<HeadlessCustomerLicenseRenewal> {\n return this.request(`/licenses/${encodeURIComponent(licenseId)}/renew`, {\n method: 'POST',\n authenticated: true,\n // This established route requires shop in the body. The shared headless\n // gate independently verifies the same shop from the query and key.\n body: { shop: this.shop },\n schema: customerPortalLicenseRenewalSchema,\n });\n }\n\n subscriptionBillingHistory(\n subscriptionId: string,\n ): Promise<HeadlessCustomerSubscriptionBillingHistory> {\n return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/billing-history`, {\n authenticated: true,\n schema: customerPortalSubscriptionBillingHistorySchema,\n });\n }\n\n cancelSubscription(\n subscriptionId: string,\n options: HeadlessCustomerSubscriptionCancelOptions = {},\n ): Promise<HeadlessCustomerSubscriptionCancel> {\n return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/cancel`, {\n method: 'POST',\n authenticated: true,\n body: {\n ...(options.cancelAtPeriodEnd === undefined\n ? {}\n : { cancel_at_period_end: options.cancelAtPeriodEnd }),\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n },\n schema: customerPortalSubscriptionCancelSchema,\n });\n }\n\n pauseSubscription(subscriptionId: string): Promise<HeadlessCustomerSubscriptionStatus> {\n return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/pause`, {\n method: 'POST',\n authenticated: true,\n body: {},\n schema: customerPortalSubscriptionStatusSchema,\n });\n }\n\n resumeSubscription(subscriptionId: string): Promise<HeadlessCustomerSubscriptionStatus> {\n return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/resume`, {\n method: 'POST',\n authenticated: true,\n body: {},\n schema: customerPortalSubscriptionStatusSchema,\n });\n }\n\n /** Takes back a cancellation scheduled for the period end (`actions.can_undo_cancel`). */\n undoSubscriptionCancel(subscriptionId: string): Promise<HeadlessCustomerSubscriptionCancel> {\n return this.request(`/subscriptions/${encodeURIComponent(subscriptionId)}/undo-cancel`, {\n method: 'POST',\n authenticated: true,\n body: {},\n schema: customerPortalSubscriptionCancelSchema,\n });\n }\n\n loyalty(): Promise<HeadlessCustomerLoyalty> {\n return this.request('/loyalty', {\n authenticated: true,\n schema: customerLoyaltySchema,\n });\n }\n\n redeemLoyaltyPoints(input: {\n points: number;\n idempotencyKey: string;\n }): Promise<HeadlessCustomerLoyaltyRedeem> {\n return this.request('/loyalty/redeem', {\n method: 'POST',\n authenticated: true,\n body: { points: input.points, idempotency_key: input.idempotencyKey },\n schema: customerLoyaltyRedeemSchema,\n });\n }\n\n warranties(invoiceId?: string): Promise<HeadlessCustomerWarranties> {\n return this.request('/warranties', {\n authenticated: true,\n query: { invoice: invoiceId },\n schema: customerWarrantyListSchema,\n });\n }\n\n claimWarranty(warrantyId: string, message?: string): Promise<HeadlessCustomerWarrantyClaim> {\n return this.request(`/warranties/${encodeURIComponent(warrantyId)}/claim`, {\n method: 'POST',\n authenticated: true,\n body: message ? { message } : {},\n schema: customerWarrantyClaimSchema,\n });\n }\n\n favorites(): Promise<HeadlessCustomerFavorites> {\n return this.request('/favorites', {\n authenticated: true,\n schema: customerPortalFavoritesSchema,\n });\n }\n\n addFavorite(productId: string): Promise<HeadlessCustomerFavoriteMutation> {\n return this.request(`/favorites/${encodeURIComponent(productId)}`, {\n method: 'PUT',\n authenticated: true,\n schema: customerPortalFavoriteMutationSchema,\n });\n }\n\n removeFavorite(productId: string): Promise<HeadlessCustomerFavoriteMutation> {\n return this.request(`/favorites/${encodeURIComponent(productId)}`, {\n method: 'DELETE',\n authenticated: true,\n schema: customerPortalFavoriteMutationSchema,\n });\n }\n\n affiliate(): Promise<HeadlessCustomerAffiliate> {\n return this.request('/affiliate', {\n authenticated: true,\n schema: customerPortalAffiliateSummarySchema,\n });\n }\n\n affiliateStats(input?: { days?: number }): Promise<HeadlessCustomerAffiliateStats> {\n return this.request('/affiliate/stats', {\n authenticated: true,\n schema: customerPortalAffiliateStatsSchema,\n query: input?.days === undefined ? {} : { days: String(input.days) },\n });\n }\n\n createAffiliateLink(\n input: HeadlessCustomerAffiliateLinkInput,\n ): Promise<HeadlessCustomerAffiliateLink> {\n return this.request('/affiliate/links', {\n method: 'POST',\n authenticated: true,\n body: {\n shop: this.shop,\n code: input.code,\n label: input.label,\n ...(input.requestedRevenuePercent === undefined\n ? {}\n : { requested_affiliate_revenue_percent: input.requestedRevenuePercent }),\n ...(input.requestedCustomerDiscountPercent === undefined\n ? {}\n : { requested_affiliate_customer_discount_percent: input.requestedCustomerDiscountPercent }),\n },\n schema: customerPortalAffiliateCreateLinkSchema,\n });\n }\n\n createTicket(input: HeadlessCustomerTicketInput): Promise<HeadlessCustomerTicketCreateResult> {\n return this.request('/tickets', {\n method: 'POST',\n authenticated: true,\n body: {\n ...(input.title === undefined ? {} : { title: input.title }),\n message: input.message,\n ...(input.invoiceId === undefined ? {} : { invoice_id: input.invoiceId }),\n },\n schema: customerPortalSupportCreateSchema,\n });\n }\n\n ticket(ticketId: string): Promise<HeadlessCustomerTicket> {\n return this.request(`/tickets/${encodeURIComponent(ticketId)}`, {\n authenticated: true,\n schema: customerPortalSupportTicketDetailSchema,\n });\n }\n\n async replyToTicket(ticketId: string, message: string): Promise<void> {\n await this.request<null>(`/tickets/${encodeURIComponent(ticketId)}/reply`, {\n method: 'POST',\n authenticated: true,\n body: { message },\n });\n }\n\n reseller(): Promise<HeadlessCustomerReseller> {\n return this.request('/reseller', {\n authenticated: true,\n schema: customerResellerSummarySchema,\n });\n }\n\n applyForReseller(note?: string): Promise<HeadlessCustomerResellerEnrollment> {\n return this.request('/reseller/apply', {\n method: 'POST',\n authenticated: true,\n body: note === undefined ? {} : { note },\n schema: customerResellerEnrollmentSchema,\n });\n }\n\n enrollAsReseller(): Promise<HeadlessCustomerResellerEnrollment> {\n return this.request('/reseller/enroll', {\n method: 'POST',\n authenticated: true,\n body: {},\n schema: customerResellerEnrollmentSchema,\n });\n }\n\n acceptResellerInvite(token: string): Promise<HeadlessCustomerResellerEnrollment> {\n return this.request('/reseller/accept-invite', {\n method: 'POST',\n authenticated: true,\n body: { token },\n schema: customerResellerEnrollmentSchema,\n });\n }\n\n resellerCatalog(\n options: HeadlessCustomerResellerCatalogQuery = {},\n ): Promise<HeadlessCustomerResellerCatalog> {\n return this.request('/reseller/catalog', {\n authenticated: true,\n query: {\n search: options.search,\n page: options.page === undefined ? undefined : String(options.page),\n per_page: options.perPage === undefined ? undefined : String(options.perPage),\n },\n schema: customerResellerCatalogSchema,\n });\n }\n\n quoteResellerOrder(\n items: HeadlessCustomerResellerOrderItem[],\n ): Promise<HeadlessCustomerResellerQuote> {\n return this.request('/reseller/orders/quote', {\n method: 'POST',\n authenticated: true,\n body: {\n items: items.map((item) => ({\n product_id: item.productId,\n ...(item.variantId === undefined ? {} : { variant_id: item.variantId }),\n quantity: item.quantity,\n })),\n },\n schema: customerResellerQuoteSchema,\n });\n }\n\n resellerOrders(\n options: HeadlessCustomerResellerOrdersQuery = {},\n ): Promise<HeadlessCustomerResellerOrders> {\n return this.request('/reseller/orders', {\n authenticated: true,\n query: {\n page: options.page === undefined ? undefined : String(options.page),\n per_page: options.perPage === undefined ? undefined : String(options.perPage),\n },\n schema: customerResellerOrdersSchema,\n });\n }\n\n resellerOrder(orderId: string): Promise<HeadlessCustomerResellerOrder> {\n return this.request(`/reseller/orders/${encodeURIComponent(orderId)}`, {\n authenticated: true,\n schema: customerResellerOrderSchema,\n });\n }\n\n resellerWallet(): Promise<HeadlessCustomerResellerWallet> {\n return this.request('/reseller/wallet', {\n authenticated: true,\n schema: customerResellerWalletSchema,\n });\n }\n\n resellerApiKeys(): Promise<HeadlessCustomerResellerApiKeys> {\n return this.request('/reseller/api-keys', {\n authenticated: true,\n schema: customerResellerApiKeysSchema,\n });\n }\n\n async logout(): Promise<void> {\n if (!this.getSession()) return;\n try {\n await this.request<null>('/auth/logout', { method: 'POST', authenticated: true });\n } catch (error) {\n if (error instanceof HeadlessCustomerError && error.status === 401) {\n // The server already considers the credential invalid. request() also\n // clears it, so logout is complete from the buyer's perspective.\n return;\n }\n // Keep the local token after a transient failure so the caller can retry\n // server-side revocation instead of leaving an unreachable live session.\n throw error;\n }\n this.clearSession();\n }\n}\n\nexport function createCustomerClient(config: HeadlessCustomerClientConfig): HeadlessCustomerClient {\n return new HeadlessCustomerClient(config);\n}\n"],"mappings":"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","names":["stored"]}