@asteby/storefront 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -266,6 +266,10 @@ type CartLine = {
266
266
  merchandise: CartLineMerchandise;
267
267
  /** Computed when the cart is read, before checkout. `null`/absent = fine. */
268
268
  problem?: CartLineProblem | null;
269
+ /** Ship date computed by OPS (`YYYY-MM-DD`). Absent/`null` = no date to show. */
270
+ ships_on?: string | null;
271
+ /** Availability of the line's variant; only used as a fallback for the ship date. */
272
+ availability?: Pick<Availability, 'status' | 'restock_eta' | 'preorder_release_at'>;
269
273
  cost: {
270
274
  total: Money;
271
275
  unit: Money;
@@ -729,6 +733,45 @@ type Shipment = {
729
733
  events: ShipmentEvent[];
730
734
  map?: ShipmentMap | null;
731
735
  };
736
+ /** A scan of the public tracking view. `lat` / `lng` only when the carrier reports coordinates (city precision at most). */
737
+ type TrackingEventView = ShipmentEvent & {
738
+ lat?: number | null;
739
+ lng?: number | null;
740
+ };
741
+ /**
742
+ * What the public "track my order" lookup returns: only the movement of the parcel. Never a name, an address, the lines
743
+ * or the totals of the order, and never a `label_url`. `events` is newest first.
744
+ */
745
+ type TrackingView = {
746
+ status: ShipmentStatus;
747
+ carrier?: string | null;
748
+ carrier_logo_key?: string | null;
749
+ tracking_number?: string | null;
750
+ /** `https` only. */
751
+ tracking_url?: string | null;
752
+ /** `YYYY-MM-DD` or an instant. */
753
+ eta?: string | null;
754
+ updated_at?: string | null;
755
+ events: TrackingEventView[];
756
+ map?: ShipmentMap | null;
757
+ };
758
+ /** Order number + the email of the order, or only the guide printed on the parcel. */
759
+ type TrackingLookupInput = {
760
+ order_number: string;
761
+ email: string;
762
+ } | {
763
+ tracking_number: string;
764
+ };
765
+ /** One shape for every failure so the answer never tells an existing order from a missing one. */
766
+ type TrackingLookupResult = {
767
+ status: 'found';
768
+ tracking: TrackingView;
769
+ } | {
770
+ status: 'not_found' | 'unavailable';
771
+ } | {
772
+ status: 'rate_limited';
773
+ retryAfter?: number;
774
+ };
732
775
  /** List-view summary of the shipments of an order. */
733
776
  type ShipmentsSummary = {
734
777
  count: number;
@@ -1840,4 +1883,4 @@ declare function dataExportBytes(file: Pick<DataExportFile, 'content_base64'>):
1840
1883
  /** A download filename that is safe in a `Content-Disposition` header: no path, quotes, control characters or spaces. */
1841
1884
  declare function safeExportFilename(name: unknown, fallback?: string): string;
1842
1885
 
1843
- export { type Facet as $, type AccountDeleteInput as A, type Collection as B, type Cart as C, type Connection as D, type Customer as E, type CustomerCapabilities as F, type CustomerEmailChangeConfirmInput as G, type CustomerEmailChangeInput as H, type CustomerEmailChangeRequested as I, type CustomerEmailCodeInput as J, type CustomerIdentifier as K, type CustomerPasswordLoginInput as L, type CustomerPreferences as M, type CustomerRegisterInput as N, type CustomerRegisterResult as O, type CustomerResetPasswordInput as P, type CustomerSession as Q, type CustomerSessionInfo as R, type CustomerSessionInput as S, type CustomerSetPasswordInput as T, type CustomerUpdateInput as U, type CustomerVerifyRegistrationInput as V, type DataExportFile as W, type DeclineCode as X, type DeliveryInput as Y, type DeliveryMethod as Z, type DeliveryOptions as _, type Address as a, type PaymentMethod as a$, type FacetValue as a0, type FiscalDocumentEvidence as a1, type FiscalDocumentSource as a2, type FiscalIdentity as a3, type FiscalIdentityInput as a4, type FiscalProfile as a5, type FiscalProfileInput as a6, type FiscalVerification as a7, type GeoHint as a8, type IdentityCapture as a9, type Money as aA, type MoneyRange as aB, type NearestLocation as aC, type NextAction as aD, type NextActionKind as aE, type Order as aF, type OrderLine as aG, type OrderPickup as aH, type OrderProblem as aI, type OrderProgress as aJ, type OrderProgressStep as aK, type OrderRef as aL, type OrderSection as aM, type OrderShippingService as aN, type OrderStage as aO, type OrderStepKey as aP, type OrderStepState as aQ, type Page as aR, type PageInfo as aS, type PaymentAction as aT, type PaymentAttemptResult as aU, type PaymentAttemptStatus as aV, type PaymentClient as aW, type PaymentClientCsp as aX, type PaymentConfig as aY, type PaymentFlow as aZ, type PaymentInfo as a_, type IdentityDocumentSpec as aa, type IdentityFieldRule as ab, type IdentityRulesV1 as ac, type IdentityStrategy as ad, type Image as ae, type InsufficientStockDetails as af, type InsufficientStockLine as ag, type InvoiceAction as ah, type InvoiceConnection as ai, type InvoiceDoc as aj, type InvoiceFile as ak, type InvoiceFileKind as al, type InvoiceListNode as am, type InvoiceReceiver as an, type InvoiceRequest as ao, type InvoiceResult as ap, type InvoiceStage as aq, type InvoiceSummary as ar, type InvoicingCapabilities as as, type Location as at, type LocationContacts as au, type LocationKind as av, type LocationListParams as aw, type LocationPickup as ax, type Menu as ay, type MenuItem as az, type AddressInput as b, type SubjectRef as b$, type PaymentMethods as b0, type PaymentNextStep as b1, type PaymentOption as b2, type PaymentOptionKey as b3, type PaymentPoint as b4, type PaymentSubmitInput as b5, type PaymentVoucher as b6, type PendingPayment as b7, type PendingPaymentVoucher as b8, type PickupOption as b9, type SelectedOption as bA, type Shipment as bB, type ShipmentConnection as bC, type ShipmentEvent as bD, type ShipmentKind as bE, type ShipmentListNode as bF, type ShipmentMap as bG, type ShipmentStatus as bH, type ShipmentsSummary as bI, type ShippingRate as bJ, type Shop as bK, type ShopBranch as bL, type ShopContact as bM, type ShopPolicies as bN, type StockLevel as bO, StorefrontError as bP, type StorefrontErrorBody as bQ, type StorefrontErrorCode as bR, type StorefrontErrorInit as bS, type Subject as bT, type SubjectCatalog as bU, type SubjectCatalogNode as bV, type SubjectField as bW, type SubjectFieldType as bX, type SubjectInput as bY, type SubjectKind as bZ, type SubjectPatch as b_, type Product as ba, type ProductAttributeValue as bb, type ProductCategory as bc, type ProductConnection as bd, type ProductOption as be, type ProductSort as bf, type ProductVariant as bg, type PromotionAnnouncement as bh, type PromotionReward as bi, type PromotionTier as bj, type PromotionsList as bk, type ReauthInput as bl, type ReauthResult as bm, type RecommendationPlacement as bn, type Refund as bo, type Region as bp, type RegionFiscalEntry as bq, type RegionFiscalId as br, type RegionPaymentMethod as bs, type RegionPostalCode as bt, type RestockSubscriptionInput as bu, type RestockSubscriptionResult as bv, type ReturnRequest as bw, type ReturnRequestInput as bx, type SEO as by, type Section as bz, type AddressSuggestion as c, type Theme as c0, type TokenIntrospection as c1, type UnavailableRateProvider as c2, dataExportBytes as c3, isAccountDeleteBlocked as c4, isReauthRequired as c5, isStorefrontError as c6, safeExportFilename as c7, type AddressSuggestions as d, type Article as e, type Availability as f, type AvailabilityStatus as g, type CartBuyer as h, type CartBuyerInput as i, type CartCost as j, type CartDelivery as k, type CartDiscountCode as l, type CartDiscountLine as m, type CartInvoice as n, type CartLine as o, type CartLineInput as p, type CartLineMerchandise as q, type CartLineProblem as r, type CartLineUpdateInput as s, type CartPromotions as t, type CartRecommendation as u, type CartRecommendations as v, type CheckoutInfo as w, type CheckoutInput as x, type CheckoutPayment as y, type CheckoutResult as z };
1886
+ export { type Facet as $, type AccountDeleteInput as A, type Collection as B, type Cart as C, type Connection as D, type Customer as E, type CustomerCapabilities as F, type CustomerEmailChangeConfirmInput as G, type CustomerEmailChangeInput as H, type CustomerEmailChangeRequested as I, type CustomerEmailCodeInput as J, type CustomerIdentifier as K, type CustomerPasswordLoginInput as L, type CustomerPreferences as M, type CustomerRegisterInput as N, type CustomerRegisterResult as O, type CustomerResetPasswordInput as P, type CustomerSession as Q, type CustomerSessionInfo as R, type CustomerSessionInput as S, type CustomerSetPasswordInput as T, type CustomerUpdateInput as U, type CustomerVerifyRegistrationInput as V, type DataExportFile as W, type DeclineCode as X, type DeliveryInput as Y, type DeliveryMethod as Z, type DeliveryOptions as _, type Address as a, type PaymentMethod as a$, type FacetValue as a0, type FiscalDocumentEvidence as a1, type FiscalDocumentSource as a2, type FiscalIdentity as a3, type FiscalIdentityInput as a4, type FiscalProfile as a5, type FiscalProfileInput as a6, type FiscalVerification as a7, type GeoHint as a8, type IdentityCapture as a9, type Money as aA, type MoneyRange as aB, type NearestLocation as aC, type NextAction as aD, type NextActionKind as aE, type Order as aF, type OrderLine as aG, type OrderPickup as aH, type OrderProblem as aI, type OrderProgress as aJ, type OrderProgressStep as aK, type OrderRef as aL, type OrderSection as aM, type OrderShippingService as aN, type OrderStage as aO, type OrderStepKey as aP, type OrderStepState as aQ, type Page as aR, type PageInfo as aS, type PaymentAction as aT, type PaymentAttemptResult as aU, type PaymentAttemptStatus as aV, type PaymentClient as aW, type PaymentClientCsp as aX, type PaymentConfig as aY, type PaymentFlow as aZ, type PaymentInfo as a_, type IdentityDocumentSpec as aa, type IdentityFieldRule as ab, type IdentityRulesV1 as ac, type IdentityStrategy as ad, type Image as ae, type InsufficientStockDetails as af, type InsufficientStockLine as ag, type InvoiceAction as ah, type InvoiceConnection as ai, type InvoiceDoc as aj, type InvoiceFile as ak, type InvoiceFileKind as al, type InvoiceListNode as am, type InvoiceReceiver as an, type InvoiceRequest as ao, type InvoiceResult as ap, type InvoiceStage as aq, type InvoiceSummary as ar, type InvoicingCapabilities as as, type Location as at, type LocationContacts as au, type LocationKind as av, type LocationListParams as aw, type LocationPickup as ax, type Menu as ay, type MenuItem as az, type AddressInput as b, type SubjectRef as b$, type PaymentMethods as b0, type PaymentNextStep as b1, type PaymentOption as b2, type PaymentOptionKey as b3, type PaymentPoint as b4, type PaymentSubmitInput as b5, type PaymentVoucher as b6, type PendingPayment as b7, type PendingPaymentVoucher as b8, type PickupOption as b9, type SelectedOption as bA, type Shipment as bB, type ShipmentConnection as bC, type ShipmentEvent as bD, type ShipmentKind as bE, type ShipmentListNode as bF, type ShipmentMap as bG, type ShipmentStatus as bH, type ShipmentsSummary as bI, type ShippingRate as bJ, type Shop as bK, type ShopBranch as bL, type ShopContact as bM, type ShopPolicies as bN, type StockLevel as bO, StorefrontError as bP, type StorefrontErrorBody as bQ, type StorefrontErrorCode as bR, type StorefrontErrorInit as bS, type Subject as bT, type SubjectCatalog as bU, type SubjectCatalogNode as bV, type SubjectField as bW, type SubjectFieldType as bX, type SubjectInput as bY, type SubjectKind as bZ, type SubjectPatch as b_, type Product as ba, type ProductAttributeValue as bb, type ProductCategory as bc, type ProductConnection as bd, type ProductOption as be, type ProductSort as bf, type ProductVariant as bg, type PromotionAnnouncement as bh, type PromotionReward as bi, type PromotionTier as bj, type PromotionsList as bk, type ReauthInput as bl, type ReauthResult as bm, type RecommendationPlacement as bn, type Refund as bo, type Region as bp, type RegionFiscalEntry as bq, type RegionFiscalId as br, type RegionPaymentMethod as bs, type RegionPostalCode as bt, type RestockSubscriptionInput as bu, type RestockSubscriptionResult as bv, type ReturnRequest as bw, type ReturnRequestInput as bx, type SEO as by, type Section as bz, type AddressSuggestion as c, type Theme as c0, type TokenIntrospection as c1, type TrackingEventView as c2, type TrackingLookupInput as c3, type TrackingLookupResult as c4, type TrackingView as c5, type UnavailableRateProvider as c6, dataExportBytes as c7, isAccountDeleteBlocked as c8, isReauthRequired as c9, isStorefrontError as ca, safeExportFilename as cb, type AddressSuggestions as d, type Article as e, type Availability as f, type AvailabilityStatus as g, type CartBuyer as h, type CartBuyerInput as i, type CartCost as j, type CartDelivery as k, type CartDiscountCode as l, type CartDiscountLine as m, type CartInvoice as n, type CartLine as o, type CartLineInput as p, type CartLineMerchandise as q, type CartLineProblem as r, type CartLineUpdateInput as s, type CartPromotions as t, type CartRecommendation as u, type CartRecommendations as v, type CheckoutInfo as w, type CheckoutInput as x, type CheckoutPayment as y, type CheckoutResult as z };
@@ -266,6 +266,10 @@ type CartLine = {
266
266
  merchandise: CartLineMerchandise;
267
267
  /** Computed when the cart is read, before checkout. `null`/absent = fine. */
268
268
  problem?: CartLineProblem | null;
269
+ /** Ship date computed by OPS (`YYYY-MM-DD`). Absent/`null` = no date to show. */
270
+ ships_on?: string | null;
271
+ /** Availability of the line's variant; only used as a fallback for the ship date. */
272
+ availability?: Pick<Availability, 'status' | 'restock_eta' | 'preorder_release_at'>;
269
273
  cost: {
270
274
  total: Money;
271
275
  unit: Money;
@@ -729,6 +733,45 @@ type Shipment = {
729
733
  events: ShipmentEvent[];
730
734
  map?: ShipmentMap | null;
731
735
  };
736
+ /** A scan of the public tracking view. `lat` / `lng` only when the carrier reports coordinates (city precision at most). */
737
+ type TrackingEventView = ShipmentEvent & {
738
+ lat?: number | null;
739
+ lng?: number | null;
740
+ };
741
+ /**
742
+ * What the public "track my order" lookup returns: only the movement of the parcel. Never a name, an address, the lines
743
+ * or the totals of the order, and never a `label_url`. `events` is newest first.
744
+ */
745
+ type TrackingView = {
746
+ status: ShipmentStatus;
747
+ carrier?: string | null;
748
+ carrier_logo_key?: string | null;
749
+ tracking_number?: string | null;
750
+ /** `https` only. */
751
+ tracking_url?: string | null;
752
+ /** `YYYY-MM-DD` or an instant. */
753
+ eta?: string | null;
754
+ updated_at?: string | null;
755
+ events: TrackingEventView[];
756
+ map?: ShipmentMap | null;
757
+ };
758
+ /** Order number + the email of the order, or only the guide printed on the parcel. */
759
+ type TrackingLookupInput = {
760
+ order_number: string;
761
+ email: string;
762
+ } | {
763
+ tracking_number: string;
764
+ };
765
+ /** One shape for every failure so the answer never tells an existing order from a missing one. */
766
+ type TrackingLookupResult = {
767
+ status: 'found';
768
+ tracking: TrackingView;
769
+ } | {
770
+ status: 'not_found' | 'unavailable';
771
+ } | {
772
+ status: 'rate_limited';
773
+ retryAfter?: number;
774
+ };
732
775
  /** List-view summary of the shipments of an order. */
733
776
  type ShipmentsSummary = {
734
777
  count: number;
@@ -1840,4 +1883,4 @@ declare function dataExportBytes(file: Pick<DataExportFile, 'content_base64'>):
1840
1883
  /** A download filename that is safe in a `Content-Disposition` header: no path, quotes, control characters or spaces. */
1841
1884
  declare function safeExportFilename(name: unknown, fallback?: string): string;
1842
1885
 
1843
- export { type Facet as $, type AccountDeleteInput as A, type Collection as B, type Cart as C, type Connection as D, type Customer as E, type CustomerCapabilities as F, type CustomerEmailChangeConfirmInput as G, type CustomerEmailChangeInput as H, type CustomerEmailChangeRequested as I, type CustomerEmailCodeInput as J, type CustomerIdentifier as K, type CustomerPasswordLoginInput as L, type CustomerPreferences as M, type CustomerRegisterInput as N, type CustomerRegisterResult as O, type CustomerResetPasswordInput as P, type CustomerSession as Q, type CustomerSessionInfo as R, type CustomerSessionInput as S, type CustomerSetPasswordInput as T, type CustomerUpdateInput as U, type CustomerVerifyRegistrationInput as V, type DataExportFile as W, type DeclineCode as X, type DeliveryInput as Y, type DeliveryMethod as Z, type DeliveryOptions as _, type Address as a, type PaymentMethod as a$, type FacetValue as a0, type FiscalDocumentEvidence as a1, type FiscalDocumentSource as a2, type FiscalIdentity as a3, type FiscalIdentityInput as a4, type FiscalProfile as a5, type FiscalProfileInput as a6, type FiscalVerification as a7, type GeoHint as a8, type IdentityCapture as a9, type Money as aA, type MoneyRange as aB, type NearestLocation as aC, type NextAction as aD, type NextActionKind as aE, type Order as aF, type OrderLine as aG, type OrderPickup as aH, type OrderProblem as aI, type OrderProgress as aJ, type OrderProgressStep as aK, type OrderRef as aL, type OrderSection as aM, type OrderShippingService as aN, type OrderStage as aO, type OrderStepKey as aP, type OrderStepState as aQ, type Page as aR, type PageInfo as aS, type PaymentAction as aT, type PaymentAttemptResult as aU, type PaymentAttemptStatus as aV, type PaymentClient as aW, type PaymentClientCsp as aX, type PaymentConfig as aY, type PaymentFlow as aZ, type PaymentInfo as a_, type IdentityDocumentSpec as aa, type IdentityFieldRule as ab, type IdentityRulesV1 as ac, type IdentityStrategy as ad, type Image as ae, type InsufficientStockDetails as af, type InsufficientStockLine as ag, type InvoiceAction as ah, type InvoiceConnection as ai, type InvoiceDoc as aj, type InvoiceFile as ak, type InvoiceFileKind as al, type InvoiceListNode as am, type InvoiceReceiver as an, type InvoiceRequest as ao, type InvoiceResult as ap, type InvoiceStage as aq, type InvoiceSummary as ar, type InvoicingCapabilities as as, type Location as at, type LocationContacts as au, type LocationKind as av, type LocationListParams as aw, type LocationPickup as ax, type Menu as ay, type MenuItem as az, type AddressInput as b, type SubjectRef as b$, type PaymentMethods as b0, type PaymentNextStep as b1, type PaymentOption as b2, type PaymentOptionKey as b3, type PaymentPoint as b4, type PaymentSubmitInput as b5, type PaymentVoucher as b6, type PendingPayment as b7, type PendingPaymentVoucher as b8, type PickupOption as b9, type SelectedOption as bA, type Shipment as bB, type ShipmentConnection as bC, type ShipmentEvent as bD, type ShipmentKind as bE, type ShipmentListNode as bF, type ShipmentMap as bG, type ShipmentStatus as bH, type ShipmentsSummary as bI, type ShippingRate as bJ, type Shop as bK, type ShopBranch as bL, type ShopContact as bM, type ShopPolicies as bN, type StockLevel as bO, StorefrontError as bP, type StorefrontErrorBody as bQ, type StorefrontErrorCode as bR, type StorefrontErrorInit as bS, type Subject as bT, type SubjectCatalog as bU, type SubjectCatalogNode as bV, type SubjectField as bW, type SubjectFieldType as bX, type SubjectInput as bY, type SubjectKind as bZ, type SubjectPatch as b_, type Product as ba, type ProductAttributeValue as bb, type ProductCategory as bc, type ProductConnection as bd, type ProductOption as be, type ProductSort as bf, type ProductVariant as bg, type PromotionAnnouncement as bh, type PromotionReward as bi, type PromotionTier as bj, type PromotionsList as bk, type ReauthInput as bl, type ReauthResult as bm, type RecommendationPlacement as bn, type Refund as bo, type Region as bp, type RegionFiscalEntry as bq, type RegionFiscalId as br, type RegionPaymentMethod as bs, type RegionPostalCode as bt, type RestockSubscriptionInput as bu, type RestockSubscriptionResult as bv, type ReturnRequest as bw, type ReturnRequestInput as bx, type SEO as by, type Section as bz, type AddressSuggestion as c, type Theme as c0, type TokenIntrospection as c1, type UnavailableRateProvider as c2, dataExportBytes as c3, isAccountDeleteBlocked as c4, isReauthRequired as c5, isStorefrontError as c6, safeExportFilename as c7, type AddressSuggestions as d, type Article as e, type Availability as f, type AvailabilityStatus as g, type CartBuyer as h, type CartBuyerInput as i, type CartCost as j, type CartDelivery as k, type CartDiscountCode as l, type CartDiscountLine as m, type CartInvoice as n, type CartLine as o, type CartLineInput as p, type CartLineMerchandise as q, type CartLineProblem as r, type CartLineUpdateInput as s, type CartPromotions as t, type CartRecommendation as u, type CartRecommendations as v, type CheckoutInfo as w, type CheckoutInput as x, type CheckoutPayment as y, type CheckoutResult as z };
1886
+ export { type Facet as $, type AccountDeleteInput as A, type Collection as B, type Cart as C, type Connection as D, type Customer as E, type CustomerCapabilities as F, type CustomerEmailChangeConfirmInput as G, type CustomerEmailChangeInput as H, type CustomerEmailChangeRequested as I, type CustomerEmailCodeInput as J, type CustomerIdentifier as K, type CustomerPasswordLoginInput as L, type CustomerPreferences as M, type CustomerRegisterInput as N, type CustomerRegisterResult as O, type CustomerResetPasswordInput as P, type CustomerSession as Q, type CustomerSessionInfo as R, type CustomerSessionInput as S, type CustomerSetPasswordInput as T, type CustomerUpdateInput as U, type CustomerVerifyRegistrationInput as V, type DataExportFile as W, type DeclineCode as X, type DeliveryInput as Y, type DeliveryMethod as Z, type DeliveryOptions as _, type Address as a, type PaymentMethod as a$, type FacetValue as a0, type FiscalDocumentEvidence as a1, type FiscalDocumentSource as a2, type FiscalIdentity as a3, type FiscalIdentityInput as a4, type FiscalProfile as a5, type FiscalProfileInput as a6, type FiscalVerification as a7, type GeoHint as a8, type IdentityCapture as a9, type Money as aA, type MoneyRange as aB, type NearestLocation as aC, type NextAction as aD, type NextActionKind as aE, type Order as aF, type OrderLine as aG, type OrderPickup as aH, type OrderProblem as aI, type OrderProgress as aJ, type OrderProgressStep as aK, type OrderRef as aL, type OrderSection as aM, type OrderShippingService as aN, type OrderStage as aO, type OrderStepKey as aP, type OrderStepState as aQ, type Page as aR, type PageInfo as aS, type PaymentAction as aT, type PaymentAttemptResult as aU, type PaymentAttemptStatus as aV, type PaymentClient as aW, type PaymentClientCsp as aX, type PaymentConfig as aY, type PaymentFlow as aZ, type PaymentInfo as a_, type IdentityDocumentSpec as aa, type IdentityFieldRule as ab, type IdentityRulesV1 as ac, type IdentityStrategy as ad, type Image as ae, type InsufficientStockDetails as af, type InsufficientStockLine as ag, type InvoiceAction as ah, type InvoiceConnection as ai, type InvoiceDoc as aj, type InvoiceFile as ak, type InvoiceFileKind as al, type InvoiceListNode as am, type InvoiceReceiver as an, type InvoiceRequest as ao, type InvoiceResult as ap, type InvoiceStage as aq, type InvoiceSummary as ar, type InvoicingCapabilities as as, type Location as at, type LocationContacts as au, type LocationKind as av, type LocationListParams as aw, type LocationPickup as ax, type Menu as ay, type MenuItem as az, type AddressInput as b, type SubjectRef as b$, type PaymentMethods as b0, type PaymentNextStep as b1, type PaymentOption as b2, type PaymentOptionKey as b3, type PaymentPoint as b4, type PaymentSubmitInput as b5, type PaymentVoucher as b6, type PendingPayment as b7, type PendingPaymentVoucher as b8, type PickupOption as b9, type SelectedOption as bA, type Shipment as bB, type ShipmentConnection as bC, type ShipmentEvent as bD, type ShipmentKind as bE, type ShipmentListNode as bF, type ShipmentMap as bG, type ShipmentStatus as bH, type ShipmentsSummary as bI, type ShippingRate as bJ, type Shop as bK, type ShopBranch as bL, type ShopContact as bM, type ShopPolicies as bN, type StockLevel as bO, StorefrontError as bP, type StorefrontErrorBody as bQ, type StorefrontErrorCode as bR, type StorefrontErrorInit as bS, type Subject as bT, type SubjectCatalog as bU, type SubjectCatalogNode as bV, type SubjectField as bW, type SubjectFieldType as bX, type SubjectInput as bY, type SubjectKind as bZ, type SubjectPatch as b_, type Product as ba, type ProductAttributeValue as bb, type ProductCategory as bc, type ProductConnection as bd, type ProductOption as be, type ProductSort as bf, type ProductVariant as bg, type PromotionAnnouncement as bh, type PromotionReward as bi, type PromotionTier as bj, type PromotionsList as bk, type ReauthInput as bl, type ReauthResult as bm, type RecommendationPlacement as bn, type Refund as bo, type Region as bp, type RegionFiscalEntry as bq, type RegionFiscalId as br, type RegionPaymentMethod as bs, type RegionPostalCode as bt, type RestockSubscriptionInput as bu, type RestockSubscriptionResult as bv, type ReturnRequest as bw, type ReturnRequestInput as bx, type SEO as by, type Section as bz, type AddressSuggestion as c, type Theme as c0, type TokenIntrospection as c1, type TrackingEventView as c2, type TrackingLookupInput as c3, type TrackingLookupResult as c4, type TrackingView as c5, type UnavailableRateProvider as c6, dataExportBytes as c7, isAccountDeleteBlocked as c8, isReauthRequired as c9, isStorefrontError as ca, safeExportFilename as cb, type AddressSuggestions as d, type Article as e, type Availability as f, type AvailabilityStatus as g, type CartBuyer as h, type CartBuyerInput as i, type CartCost as j, type CartDelivery as k, type CartDiscountCode as l, type CartDiscountLine as m, type CartInvoice as n, type CartLine as o, type CartLineInput as p, type CartLineMerchandise as q, type CartLineProblem as r, type CartLineUpdateInput as s, type CartPromotions as t, type CartRecommendation as u, type CartRecommendations as v, type CheckoutInfo as w, type CheckoutInput as x, type CheckoutPayment as y, type CheckoutResult as z };
@@ -82,6 +82,7 @@ var ES = {
82
82
  "status.preorder": "Preventa",
83
83
  "sub.backorder_eta": "Se env\xEDa a partir del {date}",
84
84
  "sub.preorder_date": "Sale a la venta el {date}",
85
+ "line.ships_on": "Se enviar\xE1 el: {date}",
85
86
  "cta.add": "Agregar al carrito",
86
87
  "cta.out_of_stock": "Agotado",
87
88
  "cta.backorder": "Pedir bajo pedido",
@@ -121,6 +122,7 @@ var EN = {
121
122
  "status.preorder": "Pre-order",
122
123
  "sub.backorder_eta": "Ships from {date}",
123
124
  "sub.preorder_date": "Available on {date}",
125
+ "line.ships_on": "Ships on: {date}",
124
126
  "cta.add": "Add to cart",
125
127
  "cta.out_of_stock": "Sold out",
126
128
  "cta.backorder": "Order now, ships later",
@@ -175,6 +177,18 @@ function formatDate(value, locale) {
175
177
  return value.slice(0, 10);
176
178
  }
177
179
  }
180
+ function lineShipDate(line) {
181
+ const day = (v) => {
182
+ const d = typeof v === "string" ? v.slice(0, 10) : "";
183
+ return /^\d{4}-\d{2}-\d{2}$/.test(d) ? d : null;
184
+ };
185
+ return day(line.ships_on) ?? day(line.availability?.restock_eta) ?? day(line.availability?.preorder_release_at);
186
+ }
187
+ function lineShipLabel(line, locale, overrides) {
188
+ const date = formatDate(lineShipDate(line), locale);
189
+ if (!date) return null;
190
+ return formatAvailabilityMessage(availabilityMessages(locale, overrides)["line.ships_on"], { date });
191
+ }
178
192
  function resolveAvailability(source, options = {}) {
179
193
  const a = source.availability;
180
194
  if (a && typeof a === "object" && typeof a.status === "string") return a;
@@ -834,6 +848,6 @@ function splitSubjectTree(tree, maxBytes = SUBJECT_CATALOG_PAGE_BYTES) {
834
848
  return parts;
835
849
  }
836
850
 
837
- export { DEFAULT_FIT_TAG_PREFIX, MAX_SUBJECT_YEAR, MIN_SUBJECT_YEAR, PICKUP_STEPS, PRIVATE_MASK, SHIPPING_STEPS, SUBJECT_CATALOG_PAGE_BYTES, StorefrontError, availabilityLocale, availabilityMessages, availabilityView, cartLineProblemView, coversYear, declineMessage, declineMessageKey, defaultCodeForStatus, fitTag, fitTagsAny, formatAvailabilityMessage, formatVoucherExpiry, isMasked, isStorefrontError, isTestInvoice, isTestShipment, nextAction, orderProgress, orderShipments, paymentErrorView, paymentIdempotencyKey, paymentMessages, paymentOutcome, productAvailability, reconcileSubjectValues, resolveAvailability, resolveSubject, safeHttpsUrl, safeTrackingUrl, schemaAvailability, shipmentsStatus, sortTrackingEvents, splitSubjectTree, subjectFields, subjectLevels, subjectOptions };
838
- //# sourceMappingURL=chunk-5BJRZIS3.js.map
839
- //# sourceMappingURL=chunk-5BJRZIS3.js.map
851
+ export { DEFAULT_FIT_TAG_PREFIX, MAX_SUBJECT_YEAR, MIN_SUBJECT_YEAR, PICKUP_STEPS, PRIVATE_MASK, SHIPPING_STEPS, SUBJECT_CATALOG_PAGE_BYTES, StorefrontError, availabilityLocale, availabilityMessages, availabilityView, cartLineProblemView, coversYear, declineMessage, declineMessageKey, defaultCodeForStatus, fitTag, fitTagsAny, formatAvailabilityMessage, formatVoucherExpiry, isMasked, isStorefrontError, isTestInvoice, isTestShipment, lineShipDate, lineShipLabel, nextAction, orderProgress, orderShipments, paymentErrorView, paymentIdempotencyKey, paymentMessages, paymentOutcome, productAvailability, reconcileSubjectValues, resolveAvailability, resolveSubject, safeHttpsUrl, safeTrackingUrl, schemaAvailability, shipmentsStatus, sortTrackingEvents, splitSubjectTree, subjectFields, subjectLevels, subjectOptions };
852
+ //# sourceMappingURL=chunk-ZLVXWHHQ.js.map
853
+ //# sourceMappingURL=chunk-ZLVXWHHQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/availability.ts","../src/payments.ts","../src/order-progress.ts","../src/subjects.ts"],"names":["ES","EN","CATALOG","path","key"],"mappings":"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","file":"chunk-ZLVXWHHQ.js","sourcesContent":["import type { InsufficientStockLine, StorefrontErrorCode } from './types.js'\n\nexport type StorefrontErrorInit = {\n status: number\n code: StorefrontErrorCode\n message: string\n field?: string\n /** Raw `error.details` from the body (untrusted shape). */\n details?: unknown\n /** Request URL that failed (without credentials). */\n url?: string\n cause?: unknown\n /** Scopes named by the gateway on a `403 insufficient_scope`. */\n requiredScopes?: string[]\n /** `error.retryable` as OPS declared it (payment failures). `undefined` = OPS did not say. */\n retryable?: boolean\n /** `error.retry_after` in seconds. */\n retryAfter?: number\n /** `error.checkout_id`: the checkout a refused cart write can resume. */\n checkoutId?: string\n /** `error.cost` of a `price_mismatch` (the cart's current cost; untrusted shape). */\n cost?: unknown\n /** `error.message_en`. */\n messageEn?: string\n}\n\n/**\n * Error thrown by the client for any non-2xx response, network failure,\n * timeout or abort. `status` is `0` when no HTTP response was received.\n */\nexport class StorefrontError extends Error {\n override readonly name = 'StorefrontError'\n readonly status: number\n readonly code: StorefrontErrorCode\n readonly field: string | undefined\n readonly details: unknown\n readonly url: string | undefined\n /** Scopes a `403 insufficient_scope` says the route needs (empty for any other error). */\n readonly requiredScopes: string[]\n /** `true`: repeating the request (same idempotency key) can succeed. `false`: not until someone fixes something. `undefined`: OPS did not say. */\n readonly retryable: boolean | undefined\n /** Seconds OPS asks to wait before retrying. */\n readonly retryAfter: number | undefined\n /** Checkout that a refused cart write can resume. */\n readonly checkoutId: string | undefined\n /** Current cart cost sent with a `price_mismatch` (untrusted shape). */\n readonly cost: unknown\n /** English version of `message`, when OPS sent one. */\n readonly messageEn: string | undefined\n\n constructor(init: StorefrontErrorInit) {\n super(init.message, init.cause === undefined ? undefined : { cause: init.cause })\n this.status = init.status\n this.code = init.code\n this.field = init.field\n this.details = init.details\n this.url = init.url\n this.requiredScopes = init.requiredScopes ?? []\n this.retryable = init.retryable\n this.retryAfter = init.retryAfter\n this.checkoutId = init.checkoutId\n this.cost = init.cost\n this.messageEn = init.messageEn\n }\n\n /**\n * Affected lines of a `409 insufficient_stock` (empty for any other error or a\n * server older than contract 1.1). The cart is untouched: show the lines and\n * let the buyer adjust or remove them.\n */\n get stockLines(): InsufficientStockLine[] {\n const lines = (this.details as { lines?: unknown } | null | undefined)?.lines\n if (this.code !== 'insufficient_stock' || !Array.isArray(lines)) return []\n return lines.filter((l): l is InsufficientStockLine => typeof l === 'object' && l !== null && typeof (l as { sku?: unknown }).sku === 'string')\n }\n\n toJSON() {\n return {\n name: this.name,\n status: this.status,\n code: this.code,\n message: this.message,\n field: this.field,\n ...(this.requiredScopes.length ? { requiredScopes: this.requiredScopes } : {}),\n ...(this.retryable !== undefined ? { retryable: this.retryable } : {}),\n ...(this.retryAfter !== undefined ? { retryAfter: this.retryAfter } : {}),\n ...(this.checkoutId ? { checkoutId: this.checkoutId } : {}),\n }\n }\n}\n\nexport function isStorefrontError(err: unknown): err is StorefrontError {\n return err instanceof StorefrontError || (typeof err === 'object' && err !== null && (err as { name?: unknown }).name === 'StorefrontError')\n}\n\nconst STATUS_CODES: Record<number, StorefrontErrorCode> = {\n 400: 'validation',\n 401: 'unauthorized',\n 403: 'forbidden',\n 404: 'not_found',\n 409: 'conflict',\n 422: 'invalid_state',\n 429: 'rate_limited',\n}\n\nexport function defaultCodeForStatus(status: number): StorefrontErrorCode {\n return STATUS_CODES[status] ?? (status >= 500 ? 'server_error' : 'invalid_response')\n}\n","/**\n * Availability presentation: the single source of the texts and states a\n * storefront shows for stock. Pure functions, no DOM: safe in loaders, SSR and\n * edge runtimes.\n *\n * The server decides the state (`Availability.status`, already filtered by the\n * shop's `show_stock`); this module only turns it into labels. Shops may\n * override texts by key (`messages`) but never the logic. Numbers shown here\n * (\"Quedan 3\") come from `availability.quantity`, which the server sends only\n * when the shop allows it and past its own threshold: there is no threshold in\n * this code.\n */\nimport type { Availability, AvailabilityStatus, CartLine, CartLineProblem, InsufficientStockLine, Product, ProductVariant } from './types.js'\n\nexport type AvailabilityTone = 'success' | 'warning' | 'danger' | 'info'\n\nexport type AvailabilityLocale = 'es' | 'en'\n\n/** Text keys, overridable per shop. `{n}` and `{date}` are replaced. */\nexport type AvailabilityMessageKey =\n | 'status.in_stock'\n | 'status.low_stock'\n | 'status.low_stock_n'\n | 'status.out_of_stock'\n | 'status.backorder'\n | 'status.preorder'\n | 'sub.backorder_eta'\n | 'sub.preorder_date'\n | 'line.ships_on'\n | 'cta.add'\n | 'cta.out_of_stock'\n | 'cta.backorder'\n | 'cta.preorder'\n | 'sr.in_stock'\n | 'sr.low_stock'\n | 'sr.low_stock_n'\n | 'sr.out_of_stock'\n | 'sr.backorder'\n | 'sr.preorder'\n | 'option.sold_out'\n | 'option.backorder'\n | 'option.preorder'\n | 'max_per_order'\n | 'notify.title'\n | 'notify.email'\n | 'notify.phone'\n | 'notify.consent'\n | 'notify.submit'\n | 'notify.done'\n | 'notify.error'\n | 'problem.out_of_stock'\n | 'problem.insufficient_stock'\n | 'problem.insufficient_stock_n'\n | 'problem.adjust'\n | 'problem.remove'\n | 'conflict.title'\n | 'conflict.body'\n | 'conflict.dismiss'\n\nexport type AvailabilityMessages = Record<AvailabilityMessageKey, string>\n\nconst ES: AvailabilityMessages = {\n 'status.in_stock': 'Disponible',\n 'status.low_stock': 'Pocas piezas',\n 'status.low_stock_n': 'Quedan {n}',\n 'status.out_of_stock': 'Agotado',\n 'status.backorder': 'Bajo pedido',\n 'status.preorder': 'Preventa',\n 'sub.backorder_eta': 'Se envía a partir del {date}',\n 'sub.preorder_date': 'Sale a la venta el {date}',\n 'line.ships_on': 'Se enviará el: {date}',\n 'cta.add': 'Agregar al carrito',\n 'cta.out_of_stock': 'Agotado',\n 'cta.backorder': 'Pedir bajo pedido',\n 'cta.preorder': 'Apartar en preventa',\n 'sr.in_stock': 'Disponible',\n 'sr.low_stock': 'Quedan pocas piezas',\n 'sr.low_stock_n': 'Quedan solo {n} piezas',\n 'sr.out_of_stock': 'Producto agotado',\n 'sr.backorder': 'Disponible bajo pedido',\n 'sr.preorder': 'Disponible en preventa',\n 'option.sold_out': 'agotado',\n 'option.backorder': 'bajo pedido',\n 'option.preorder': 'preventa',\n max_per_order: 'Máximo {n} por pedido',\n 'notify.title': 'Avísame cuando vuelva',\n 'notify.email': 'Correo electrónico',\n 'notify.phone': 'WhatsApp o teléfono',\n 'notify.consent': 'Acepto recibir un aviso cuando vuelva a estar disponible',\n 'notify.submit': 'Avísame',\n 'notify.done': 'Listo. Te avisaremos cuando vuelva a estar disponible.',\n 'notify.error': 'No pudimos guardar tu aviso. Revisa tus datos e inténtalo de nuevo.',\n 'problem.out_of_stock': 'Ya no hay existencias',\n 'problem.insufficient_stock': 'No hay suficientes piezas para esta cantidad',\n 'problem.insufficient_stock_n': 'Solo puedes llevar {n}',\n 'problem.adjust': 'Ajustar a {n}',\n 'problem.remove': 'Quitar',\n 'conflict.title': 'Algunos productos cambiaron de existencias',\n 'conflict.body': 'Revisa las líneas marcadas. Tu carrito y tus datos se conservaron; ajusta o quita lo que ya no está disponible y continúa.',\n 'conflict.dismiss': 'Entendido',\n}\n\nconst EN: AvailabilityMessages = {\n 'status.in_stock': 'In stock',\n 'status.low_stock': 'Low stock',\n 'status.low_stock_n': 'Only {n} left',\n 'status.out_of_stock': 'Sold out',\n 'status.backorder': 'Made to order',\n 'status.preorder': 'Pre-order',\n 'sub.backorder_eta': 'Ships from {date}',\n 'sub.preorder_date': 'Available on {date}',\n 'line.ships_on': 'Ships on: {date}',\n 'cta.add': 'Add to cart',\n 'cta.out_of_stock': 'Sold out',\n 'cta.backorder': 'Order now, ships later',\n 'cta.preorder': 'Pre-order',\n 'sr.in_stock': 'In stock',\n 'sr.low_stock': 'Low stock',\n 'sr.low_stock_n': 'Only {n} left in stock',\n 'sr.out_of_stock': 'Sold out',\n 'sr.backorder': 'Available to order, ships later',\n 'sr.preorder': 'Available for pre-order',\n 'option.sold_out': 'sold out',\n 'option.backorder': 'made to order',\n 'option.preorder': 'pre-order',\n max_per_order: 'Maximum {n} per order',\n 'notify.title': 'Notify me when it is back',\n 'notify.email': 'Email',\n 'notify.phone': 'WhatsApp or phone',\n 'notify.consent': 'I agree to receive a notice when it is back in stock',\n 'notify.submit': 'Notify me',\n 'notify.done': 'Done. We will let you know when it is back in stock.',\n 'notify.error': 'We could not save your request. Check your details and try again.',\n 'problem.out_of_stock': 'No longer in stock',\n 'problem.insufficient_stock': 'Not enough stock for this quantity',\n 'problem.insufficient_stock_n': 'You can take up to {n}',\n 'problem.adjust': 'Adjust to {n}',\n 'problem.remove': 'Remove',\n 'conflict.title': 'Some items changed stock',\n 'conflict.body': 'Review the marked lines. Your cart and your details were kept; adjust or remove what is no longer available and continue.',\n 'conflict.dismiss': 'Got it',\n}\n\nconst CATALOG: Record<AvailabilityLocale, AvailabilityMessages> = { es: ES, en: EN }\n\n/** `es-MX` -> `es`, `en-US` -> `en`; anything else falls back to Spanish. */\nexport function availabilityLocale(locale: string | null | undefined): AvailabilityLocale {\n return (locale ?? '').toLowerCase().startsWith('en') ? 'en' : 'es'\n}\n\n/** Catalog for a locale with the shop's per-key overrides applied. */\nexport function availabilityMessages(locale: string | null | undefined, overrides?: Partial<AvailabilityMessages> | null): AvailabilityMessages {\n const base = CATALOG[availabilityLocale(locale)]\n if (!overrides) return base\n const out = { ...base }\n for (const [k, v] of Object.entries(overrides)) if (typeof v === 'string' && k in base) out[k as AvailabilityMessageKey] = v\n return out\n}\n\n/** Replaces `{name}` placeholders. */\nexport function formatAvailabilityMessage(template: string, values: Record<string, string | number> = {}): string {\n return template.replace(/\\{(\\w+)\\}/g, (m, k: string) => (k in values ? String(values[k]) : m))\n}\n\nfunction formatDate(value: string | null | undefined, locale: string | null | undefined): string | null {\n if (!value) return null\n const d = /^\\d{4}-\\d{2}-\\d{2}$/.test(value) ? new Date(`${value}T00:00:00Z`) : new Date(value)\n if (Number.isNaN(d.getTime())) return null\n try {\n // UTC keeps server and client renders identical (no hydration mismatch).\n return new Intl.DateTimeFormat(locale || 'es', { dateStyle: 'long', timeZone: 'UTC' }).format(d)\n } catch {\n return value.slice(0, 10)\n }\n}\n\n/**\n * Ship date of a cart line, `YYYY-MM-DD`, or `null`. Pure: it only picks what the server\n * sent (`ships_on`, else `availability.restock_eta`, else the date part of `preorder_release_at`).\n */\nexport function lineShipDate(line: Pick<CartLine, 'ships_on' | 'availability'>): string | null {\n const day = (v: string | null | undefined) => {\n const d = typeof v === 'string' ? v.slice(0, 10) : ''\n return /^\\d{4}-\\d{2}-\\d{2}$/.test(d) ? d : null\n }\n return day(line.ships_on) ?? day(line.availability?.restock_eta) ?? day(line.availability?.preorder_release_at)\n}\n\n/** Localized \"Ships on: {date}\" for a cart line, or `null` without a date. */\nexport function lineShipLabel(\n line: Pick<CartLine, 'ships_on' | 'availability'>,\n locale: string | null | undefined,\n overrides?: Partial<AvailabilityMessages> | null,\n): string | null {\n const date = formatDate(lineShipDate(line), locale)\n if (!date) return null\n return formatAvailabilityMessage(availabilityMessages(locale, overrides)['line.ships_on'], { date })\n}\n\nexport type ResolveAvailabilityOptions = {\n /**\n * Polyfill only: shop-level \"low stock\" threshold to derive `low_stock` from\n * `quantity_available` on servers older than contract 1.1. Without it the\n * polyfill never reports `low_stock`. Ignored when the server sends `availability`.\n */\n lowStockThreshold?: number | null\n}\n\ntype AvailabilitySource = Pick<Product | ProductVariant, 'available_for_sale'> & {\n availability?: Availability | null\n quantity_available?: number | null\n}\n\n/**\n * The `Availability` of a variant or product. Uses the server's `availability`\n * when present; otherwise derives `in_stock | low_stock | out_of_stock` from\n * `available_for_sale` / `quantity_available` so storefronts can migrate before\n * the backend does. A malformed `availability` falls back to the polyfill.\n */\nexport function resolveAvailability(source: AvailabilitySource, options: ResolveAvailabilityOptions = {}): Availability {\n const a = source.availability\n if (a && typeof a === 'object' && typeof a.status === 'string') return a\n const qty = typeof source.quantity_available === 'number' ? source.quantity_available : null\n const sellable = source.available_for_sale && (qty === null || qty > 0)\n const threshold = options.lowStockThreshold\n const low = sellable && qty !== null && typeof threshold === 'number' && threshold > 0 && qty <= threshold\n const status: AvailabilityStatus = !sellable ? 'out_of_stock' : low ? 'low_stock' : 'in_stock'\n return {\n status,\n quantity: sellable ? qty : null,\n max_per_order: sellable ? qty : null,\n restock_eta: null,\n preorder_release_at: null,\n // Old servers have no subscription route: never offer a form that cannot work.\n notify_available: false,\n }\n}\n\nexport type AvailabilityView = {\n status: AvailabilityStatus\n tone: AvailabilityTone\n /** Short badge text: \"Agotado\", \"Quedan 3\", \"Bajo pedido\"... Never empty. */\n label: string\n /** ETA / release date text, or `null`. */\n sublabel: string | null\n /** Primary button text. */\n ctaLabel: string\n /** The primary button may be pressed (backorder/preorder are purchasable). */\n ctaEnabled: boolean\n /** Offer the \"Notify me when it is back\" form. */\n showNotify: boolean\n /** Full sentence for screen readers. */\n srText: string\n /** Units to cap the quantity picker at, or `null`. */\n maxPerOrder: number | null\n /** Show a badge on listing cards (everything but plain `in_stock`: do not clutter). */\n showOnCard: boolean\n}\n\nexport type AvailabilityViewOptions = {\n messages?: Partial<AvailabilityMessages> | null\n}\n\nconst TONES: Record<AvailabilityStatus, AvailabilityTone> = {\n in_stock: 'success',\n low_stock: 'warning',\n out_of_stock: 'danger',\n backorder: 'info',\n preorder: 'info',\n}\n\n/**\n * Texts and flags for one availability. `availability` accepts anything with an\n * unknown `status` (a future server): it is treated as `out_of_stock`.\n */\nexport function availabilityView(availability: Availability, locale: string | null | undefined, options: AvailabilityViewOptions = {}): AvailabilityView {\n const m = availabilityMessages(locale, options.messages)\n const known = (['in_stock', 'low_stock', 'out_of_stock', 'backorder', 'preorder'] as const).includes(availability.status)\n const status: AvailabilityStatus = known ? availability.status : 'out_of_stock'\n const qty = typeof availability.quantity === 'number' && availability.quantity > 0 ? availability.quantity : null\n const f = formatAvailabilityMessage\n\n let label: string\n let sr: string\n let cta: string\n let sublabel: string | null = null\n let enabled = true\n switch (status) {\n case 'in_stock':\n label = m['status.in_stock']\n sr = m['sr.in_stock']\n cta = m['cta.add']\n break\n case 'low_stock':\n // Without a visible quantity the server still says \"low\": no number is invented.\n label = qty !== null ? f(m['status.low_stock_n'], { n: qty }) : m['status.low_stock']\n sr = qty !== null ? f(m['sr.low_stock_n'], { n: qty }) : m['sr.low_stock']\n cta = m['cta.add']\n break\n case 'backorder': {\n label = m['status.backorder']\n sr = m['sr.backorder']\n cta = m['cta.backorder']\n const date = formatDate(availability.restock_eta, locale)\n if (date) sublabel = f(m['sub.backorder_eta'], { date })\n break\n }\n case 'preorder': {\n label = m['status.preorder']\n sr = m['sr.preorder']\n cta = m['cta.preorder']\n const date = formatDate(availability.preorder_release_at ?? availability.restock_eta, locale)\n if (date) sublabel = f(m['sub.preorder_date'], { date })\n break\n }\n default:\n label = m['status.out_of_stock']\n sr = m['sr.out_of_stock']\n cta = m['cta.out_of_stock']\n enabled = false\n }\n return {\n status,\n tone: TONES[status],\n label,\n sublabel,\n ctaLabel: cta,\n ctaEnabled: enabled,\n showNotify: status === 'out_of_stock' && availability.notify_available === true,\n srText: sublabel ? `${sr}. ${sublabel}` : sr,\n maxPerOrder: typeof availability.max_per_order === 'number' && availability.max_per_order > 0 ? availability.max_per_order : null,\n showOnCard: status !== 'in_stock',\n }\n}\n\nexport type CartLineProblemView = {\n code: CartLineProblem['code']\n /** \"Ya no hay existencias\" / \"Solo puedes llevar 2\". */\n message: string\n /** Quantity to adjust the line to, or `null` (remove only). */\n adjustTo: number | null\n adjustLabel: string | null\n removeLabel: string\n}\n\n/** Texts and actions for a cart line problem. Offers \"Adjust to N\" only when `max_quantity` is a positive number different from the line quantity (a refused change leaves the cart at its old quantity). */\nexport function cartLineProblemView(\n problem: CartLineProblem | InsufficientStockLine,\n locale: string | null | undefined,\n options: AvailabilityViewOptions & { lineQuantity?: number } = {},\n): CartLineProblemView {\n const m = availabilityMessages(locale, options.messages)\n const code: CartLineProblem['code'] = 'code' in problem ? problem.code : problem.status === 'out_of_stock' ? 'out_of_stock' : 'insufficient_stock'\n const max = typeof problem.max_quantity === 'number' && problem.max_quantity >= 0 ? problem.max_quantity : null\n const canAdjust = max !== null && max > 0 && (options.lineQuantity === undefined || max !== options.lineQuantity)\n const message =\n code === 'out_of_stock' || max === 0\n ? m['problem.out_of_stock']\n : max !== null\n ? formatAvailabilityMessage(m['problem.insufficient_stock_n'], { n: max })\n : m['problem.insufficient_stock']\n return {\n code,\n message,\n adjustTo: canAdjust ? max : null,\n adjustLabel: canAdjust ? formatAvailabilityMessage(m['problem.adjust'], { n: max }) : null,\n removeLabel: m['problem.remove'],\n }\n}\n\nconst SCHEMA_AVAILABILITY: Record<AvailabilityStatus, string> = {\n in_stock: 'https://schema.org/InStock',\n low_stock: 'https://schema.org/LimitedAvailability',\n out_of_stock: 'https://schema.org/OutOfStock',\n backorder: 'https://schema.org/BackOrder',\n preorder: 'https://schema.org/PreOrder',\n}\n\n/** schema.org `ItemAvailability` URL for a status (unknown -> `OutOfStock`). */\nexport function schemaAvailability(status: AvailabilityStatus | string): string {\n return SCHEMA_AVAILABILITY[status as AvailabilityStatus] ?? SCHEMA_AVAILABILITY.out_of_stock\n}\n\n/** Best state among variants for a product summary (when the server sends none). */\nexport function productAvailability(product: Pick<Product, 'variants' | 'available_for_sale' | 'availability'>, options: ResolveAvailabilityOptions = {}): Availability {\n if (product.availability) return product.availability\n const all = product.variants.map((v) => resolveAvailability(v, options))\n const rank: AvailabilityStatus[] = ['in_stock', 'low_stock', 'backorder', 'preorder', 'out_of_stock']\n const best = all.slice().sort((a, b) => rank.indexOf(a.status) - rank.indexOf(b.status))[0]\n return best ?? resolveAvailability(product, options)\n}\n","/**\n * Embedded payment presentation: the single source of the texts and states a\n * storefront shows around an in-page payment. Pure functions, no DOM: safe in\n * loaders, SSR and edge runtimes.\n *\n * Rules this module encodes (DISENO-PAGO-INTEGRADO-BRICKS):\n * - The server decides the outcome and the amount. Nothing here computes or\n * compares money; `expected_total` is the server's own number echoed back.\n * - A rejection is explained with an actionable text built from the neutral\n * `decline_code`. A raw provider code is never shown.\n * - Vouchers and redirects only trust https URLs.\n */\nimport { availabilityLocale, formatAvailabilityMessage, type AvailabilityLocale } from './availability.js'\nimport { StorefrontError } from './errors.js'\nimport type { DeclineCode, Money, PaymentAction, PaymentAttemptResult, PaymentNextStep, PaymentVoucher } from './types.js'\n\nexport type PaymentLocale = AvailabilityLocale\n\nexport type PaymentMessageKey =\n | `decline.${DeclineCode}`\n | 'state.loading'\n | 'state.processing'\n | 'state.approved'\n | 'state.in_review'\n | 'state.voucher'\n | 'state.challenge'\n | 'state.expired'\n | 'state.cancelled'\n | 'state.redirect'\n | 'state.fallback'\n | 'error.network'\n | 'error.card_data'\n | 'error.price_mismatch'\n | 'error.payment_in_progress'\n | 'error.expired'\n | 'error.too_many_attempts'\n | 'error.generic'\n | 'action.retry'\n | 'action.try_again'\n | 'action.pay'\n | 'action.cancel'\n | 'voucher.title'\n | 'voucher.point'\n | 'voucher.reference'\n | 'voucher.amount'\n | 'voucher.expires'\n | 'voucher.clabe'\n | 'voucher.barcode'\n | 'voucher.open'\n | 'voucher.email'\n | 'form.label'\n | 'challenge.title'\n | 'challenge.escape'\n | 'challenge.escape_hint'\n | 'challenge.left'\n\nexport type PaymentMessages = Record<PaymentMessageKey, string>\n\nconst ES: PaymentMessages = {\n 'decline.insufficient_funds': 'Tu tarjeta no tiene saldo suficiente. Prueba con otra tarjeta o paga en efectivo.',\n 'decline.invalid_cvc': 'El código de seguridad no es correcto. Revísalo e intenta de nuevo.',\n 'decline.invalid_expiry': 'La fecha de vencimiento no es correcta.',\n 'decline.invalid_card_data': 'Revisa los datos de tu tarjeta.',\n 'decline.call_issuer': 'Tu banco necesita que autorices este pago. Llama al número al reverso de tu tarjeta y vuelve a intentarlo.',\n 'decline.card_disabled': 'Tu tarjeta no está activa. Actívala con tu banco o usa otra.',\n 'decline.duplicate': 'Ya hiciste un pago igual hace un momento. Revisa tu correo antes de volver a pagar.',\n 'decline.max_attempts': 'Llegaste al límite de intentos con esta tarjeta. Usa otra o paga en efectivo.',\n 'decline.authentication_failed': 'Tu banco no pudo verificar el pago. Intenta de nuevo o usa otra tarjeta.',\n 'decline.declined': 'Tu banco rechazó el pago. Usa otra tarjeta o paga en efectivo.',\n 'state.loading': 'Cargando pago seguro…',\n 'state.processing': 'Procesando pago…',\n 'state.approved': '¡Pago aprobado!',\n 'state.in_review': 'Tu pago está en revisión. Te avisamos por correo en máximo 2 días hábiles. No vuelvas a pagar.',\n 'state.voucher': 'Tu ficha de pago está lista. El pedido se confirma cuando pagues.',\n 'state.challenge': 'Tu banco necesita verificar el pago. Termina la verificación para continuar.',\n 'state.expired': 'La ficha venció. Vuelve a armar tu carrito para pagar.',\n 'state.cancelled': 'El pago se canceló. Puedes intentarlo de nuevo.',\n 'state.redirect': 'Te llevamos a la página de pago…',\n 'state.fallback': 'No pudimos cargar el formulario seguro de tarjeta. Puedes pagar con tarjeta en el sitio del proveedor y regresar aquí.',\n 'error.network': 'No pudimos conectar. Revisa tu conexión e intenta de nuevo; no se te cobrará dos veces.',\n 'error.card_data': 'Revisa los datos de tu tarjeta.',\n 'error.price_mismatch': 'El total cambió. Revisa el nuevo total y vuelve a pagar.',\n 'error.payment_in_progress': 'Ya hay un pago en proceso para este pedido. No vuelvas a pagar; revisa tu correo.',\n 'error.expired': 'Tu apartado venció. Vuelve a armar tu carrito.',\n 'error.too_many_attempts': 'Por seguridad no podemos intentar con más tarjetas. Paga en efectivo o escríbenos.',\n 'error.generic': 'No pudimos procesar tu pago. Intenta de nuevo.',\n 'action.retry': 'Reintentar',\n 'action.try_again': 'Intentar de nuevo',\n 'action.pay': 'Pagar',\n 'action.cancel': 'Cancelar',\n 'voucher.title': 'Ficha de pago',\n 'voucher.point': 'Punto de pago',\n 'voucher.reference': 'Referencia',\n 'voucher.amount': 'Monto exacto',\n 'voucher.expires': 'Vence el {date}',\n 'voucher.clabe': 'CLABE',\n 'voucher.barcode': 'Código de barras',\n 'voucher.open': 'Ver o imprimir ficha',\n 'voucher.email': 'También te la enviamos a tu correo.',\n 'form.label': 'Datos de tu tarjeta',\n 'challenge.title': 'Verificación de tu banco',\n 'challenge.escape': 'Cancelar y volver al pago',\n 'challenge.escape_hint': '¿Tarda demasiado? Puedes cerrar la verificación. Si ya la aprobaste en tu banco, el pago aún puede completarse: te confirmamos aquí antes de dejarte pagar de nuevo.',\n 'challenge.left': 'Cerraste la verificación. Estamos confirmando con tu banco si el pago se completó; no vuelvas a pagar todavía.',\n}\n\nconst EN: PaymentMessages = {\n 'decline.insufficient_funds': 'Your card has insufficient funds. Try another card or pay in cash.',\n 'decline.invalid_cvc': 'The security code is not correct. Check it and try again.',\n 'decline.invalid_expiry': 'The expiry date is not correct.',\n 'decline.invalid_card_data': 'Check your card details.',\n 'decline.call_issuer': 'Your bank needs you to authorize this payment. Call the number on the back of your card and try again.',\n 'decline.card_disabled': 'Your card is not active. Activate it with your bank or use another one.',\n 'decline.duplicate': 'You already made the same payment a moment ago. Check your email before paying again.',\n 'decline.max_attempts': 'You reached the attempt limit for this card. Use another card or pay in cash.',\n 'decline.authentication_failed': 'Your bank could not verify the payment. Try again or use another card.',\n 'decline.declined': 'Your bank declined the payment. Use another card or pay in cash.',\n 'state.loading': 'Loading secure payment…',\n 'state.processing': 'Processing payment…',\n 'state.approved': 'Payment approved!',\n 'state.in_review': 'Your payment is under review. We will email you within 2 business days. Do not pay again.',\n 'state.voucher': 'Your payment voucher is ready. The order is confirmed once you pay.',\n 'state.challenge': 'Your bank needs to verify the payment. Finish the verification to continue.',\n 'state.expired': 'The voucher expired. Rebuild your cart to pay.',\n 'state.cancelled': 'The payment was cancelled. You can try again.',\n 'state.redirect': 'Taking you to the payment page…',\n 'state.fallback': 'We could not load the secure card form. You can pay by card on the provider site and come back here.',\n 'error.network': 'We could not connect. Check your connection and try again; you will not be charged twice.',\n 'error.card_data': 'Check your card details.',\n 'error.price_mismatch': 'The total changed. Review the new total and pay again.',\n 'error.payment_in_progress': 'A payment is already in progress for this order. Do not pay again; check your email.',\n 'error.expired': 'Your reservation expired. Rebuild your cart.',\n 'error.too_many_attempts': 'For security we cannot try more cards. Pay in cash or contact us.',\n 'error.generic': 'We could not process your payment. Please try again.',\n 'action.retry': 'Retry',\n 'action.try_again': 'Try again',\n 'action.pay': 'Pay',\n 'action.cancel': 'Cancel',\n 'voucher.title': 'Payment voucher',\n 'voucher.point': 'Payment point',\n 'voucher.reference': 'Reference',\n 'voucher.amount': 'Exact amount',\n 'voucher.expires': 'Expires on {date}',\n 'voucher.clabe': 'CLABE',\n 'voucher.barcode': 'Barcode',\n 'voucher.open': 'View or print voucher',\n 'voucher.email': 'We also emailed it to you.',\n 'form.label': 'Your card details',\n 'challenge.title': 'Your bank verification',\n 'challenge.escape': 'Cancel and go back to payment',\n 'challenge.escape_hint': 'Taking too long? You can close the verification. If you already approved it with your bank the payment may still go through: we confirm here before letting you pay again.',\n 'challenge.left': 'You closed the verification. We are checking with your bank whether the payment went through; do not pay again yet.',\n}\n\nconst CATALOG: Record<PaymentLocale, PaymentMessages> = { es: ES, en: EN }\n\n/** Catalog for a locale (`es-MX` -> es, `en-US` -> en) with the shop's per-key overrides applied. */\nexport function paymentMessages(locale: string | null | undefined, overrides?: Partial<PaymentMessages> | null): PaymentMessages {\n const base = CATALOG[availabilityLocale(locale)]\n if (!overrides) return base\n const out = { ...base }\n for (const [k, v] of Object.entries(overrides)) if (typeof v === 'string' && k in base) out[k as PaymentMessageKey] = v\n return out\n}\n\nconst DECLINE_CODES: ReadonlySet<string> = new Set<DeclineCode>([\n 'insufficient_funds',\n 'invalid_cvc',\n 'invalid_expiry',\n 'invalid_card_data',\n 'call_issuer',\n 'card_disabled',\n 'duplicate',\n 'max_attempts',\n 'authentication_failed',\n 'declined',\n])\n\n/** i18n key of a decline code; unknown or missing codes map to `declined` (never a raw provider code). */\nexport function declineMessageKey(code: string | null | undefined): `decline.${DeclineCode}` {\n return `decline.${code && DECLINE_CODES.has(code) ? (code as DeclineCode) : 'declined'}`\n}\n\n/** Actionable text for a decline code. */\nexport function declineMessage(code: string | null | undefined, locale?: string | null, overrides?: Partial<PaymentMessages> | null): string {\n return paymentMessages(locale, overrides)[declineMessageKey(code)]\n}\n\n/** The value only if it is an absolute `https:` URL without credentials; `null` otherwise. */\nexport function safeHttpsUrl(value: unknown): string | null {\n if (typeof value !== 'string' || value.length > 2048) return null\n try {\n const u = new URL(value)\n if (u.protocol !== 'https:' || u.username || u.password) return null\n return u.toString()\n } catch {\n return null\n }\n}\n\n/** What the UI should do with an attempt result. */\nexport type PaymentOutcomeKind =\n | 'approved' // paid: go to the thanks page\n | 'in_review' // pending without action: do not charge again\n | 'voucher' // cash/SPEI voucher with reference and expiry\n | 'challenge' // 3DS inside the page\n | 'redirect' // leave to the provider\n | 'rejected' // failed: show the reason and let the buyer retry\n | 'expired'\n | 'cancelled'\n\n/** A voucher ready to render: https-only link and the amount as `Money` (or `null` when the server sent none). */\nexport type PaymentOutcomeVoucher = Omit<PaymentVoucher, 'amount' | 'voucher_url' | 'currency'> & {\n voucher_url: string | null\n amount: Money | null\n}\n\nconst NEXT_STEP: Record<DeclineCode, PaymentNextStep> = {\n insufficient_funds: 'use_other_card',\n invalid_cvc: 'fix_card_data',\n invalid_expiry: 'fix_card_data',\n invalid_card_data: 'fix_card_data',\n call_issuer: 'contact_issuer',\n card_disabled: 'use_other_card',\n duplicate: 'check_email',\n max_attempts: 'use_other_card',\n authentication_failed: 'retry',\n declined: 'use_other_card',\n}\n\nfunction voucherMoney(v: PaymentVoucher): Money | null {\n const a = v.amount\n if (a && typeof a === 'object' && typeof a.amount === 'string') return a\n const text = typeof a === 'number' ? String(a) : typeof a === 'string' ? a : ''\n if (!text || !/^\\d+(\\.\\d+)?$/.test(text) || !v.currency) return null\n return { amount: text.includes('.') ? text : `${text}.00`, currency_code: v.currency }\n}\n\nexport type PaymentOutcome = {\n kind: PaymentOutcomeKind\n /** Text for the buyer (no codes). */\n message: string\n decline_code: DeclineCode | null\n /** `true` when the buyer can try again with the checkout still open. */\n retryable: boolean\n /** https-only. */\n redirect_url: string | null\n challenge: { url: string | null; creq: string | null } | null\n voucher: PaymentOutcomeVoucher | null\n attempts_left: number | null\n /** What to do next (server value, or derived from the decline code): fix the card, use another, rebuild the cart... */\n next_step: PaymentNextStep | null\n}\n\n/**\n * Classifies an attempt result. Unknown statuses are treated as `in_review`\n * (never as approved, never as a reason to charge again).\n */\nexport function paymentOutcome(result: PaymentAttemptResult, locale?: string | null, overrides?: Partial<PaymentMessages> | null): PaymentOutcome {\n const m = paymentMessages(locale, overrides)\n const p = result.payment\n const action: PaymentAction | null = p.action ?? null\n const base = {\n decline_code: null as DeclineCode | null,\n retryable: false,\n redirect_url: null as string | null,\n challenge: null as PaymentOutcome['challenge'],\n voucher: null as PaymentOutcome['voucher'],\n attempts_left: typeof result.attempts_left === 'number' ? result.attempts_left : null,\n next_step: (p.next_step ?? null) as PaymentNextStep | null,\n }\n const out = (kind: PaymentOutcomeKind, message: string, extra: Partial<PaymentOutcome> = {}): PaymentOutcome => ({ ...base, kind, message, ...extra })\n\n if (p.status === 'paid') return out('approved', m['state.approved'])\n if (p.status === 'failed') {\n const code = p.decline_code ?? 'declined'\n const known: DeclineCode = DECLINE_CODES.has(code) ? code : 'declined'\n return out('rejected', m[declineMessageKey(code)], {\n decline_code: known,\n next_step: p.next_step ?? NEXT_STEP[known],\n retryable: p.retryable !== false && base.attempts_left !== 0,\n })\n }\n if (p.status === 'expired') return out('expired', m['state.expired'], { next_step: 'rebuild_cart' })\n if (p.status === 'cancelled') return out('cancelled', m['state.cancelled'], { retryable: true, next_step: 'rebuild_cart' })\n\n if (action?.type === 'redirect') {\n const url = safeHttpsUrl(action.redirect_url)\n if (url) return out('redirect', m['state.redirect'], { redirect_url: url })\n }\n if (p.status === 'requires_action' || p.status === 'pending') {\n if (action?.type === 'voucher' && action.voucher) {\n const { amount: _a, currency: _c, voucher_url, ...rest } = action.voucher\n return out('voucher', m['state.voucher'], {\n next_step: 'pay_cash',\n voucher: { ...rest, voucher_url: safeHttpsUrl(voucher_url), amount: voucherMoney(action.voucher) },\n })\n }\n if (action?.type === 'challenge' && action.challenge) {\n return out('challenge', m['state.challenge'], {\n challenge: { url: safeHttpsUrl(action.challenge.url), creq: typeof action.challenge.creq === 'string' ? action.challenge.creq : null },\n })\n }\n }\n return out('in_review', m['state.in_review'])\n}\n\n/** Failures of `POST /payment` the form maps to a specific text and next step. */\nexport type PaymentErrorKind =\n | 'network' // no answer: retry with the SAME attempt (idempotent)\n | 'price_mismatch' // total changed: show it, remount, pay again with a NEW attempt\n | 'payment_in_progress' // 409 payment_in_progress: another attempt is paid/pending: do not retry\n | 'expired' // 409: reservation expired\n | 'too_many_attempts' // 429\n | 'generic'\n\nexport type PaymentErrorView = { kind: PaymentErrorKind; message: string; retrySameAttempt: boolean; canRetry: boolean }\n\n/**\n * Maps a transport error (a `StorefrontError` or anything with `status`/`code`)\n * to a view. Network failures and 502/503/504 are safe to retry with the same\n * idempotency key; 409/422/429 are answers, not outages.\n */\nexport function paymentErrorView(err: unknown, locale?: string | null, overrides?: Partial<PaymentMessages> | null): PaymentErrorView {\n const m = paymentMessages(locale, overrides)\n const e = (err ?? {}) as Partial<StorefrontError> & { status?: number; code?: string }\n const status = typeof e.status === 'number' ? e.status : 0\n const code = typeof e.code === 'string' ? e.code : ''\n if (code === 'price_mismatch') {\n return { kind: 'price_mismatch', message: m['error.price_mismatch'], retrySameAttempt: false, canRetry: true }\n }\n if (status === 409 && code === 'expired') return { kind: 'expired', message: m['error.expired'], retrySameAttempt: false, canRetry: false }\n if (status === 409 && code === 'payment_in_progress') {\n return { kind: 'payment_in_progress', message: m['error.payment_in_progress'], retrySameAttempt: false, canRetry: false }\n }\n // 409 conflict: that Idempotency-Key was already used with a DIFFERENT payment (e.g. a new card after a reload).\n // Not an outage and not \"in progress\": start a new attempt.\n if (status === 409) return { kind: 'generic', message: m['error.generic'], retrySameAttempt: false, canRetry: true }\n if (status === 429 || code === 'too_many_attempts') {\n return { kind: 'too_many_attempts', message: m['error.too_many_attempts'], retrySameAttempt: false, canRetry: false }\n }\n // What OPS declared wins over the status: `retryable:false` is an answer (generic), any other 5xx (also a 500 with no readable body) is an outage whose charge may have happened: same key.\n const declared = (e as { retryable?: unknown }).retryable\n if (status >= 500 && declared === false) return { kind: 'generic', message: m['error.generic'], retrySameAttempt: false, canRetry: true }\n if (status === 0 || status === 502 || status === 503 || status === 504 || code === 'network' || code === 'timeout' || status >= 500) {\n return { kind: 'network', message: m['error.network'], retrySameAttempt: true, canRetry: true }\n }\n return { kind: 'generic', message: m['error.generic'], retrySameAttempt: false, canRetry: true }\n}\n\n/** `Vence el 5 de noviembre de 2026, 18:00` style text for a voucher deadline; `null` when absent or invalid. */\nexport function formatVoucherExpiry(expiresAt: string | null | undefined, locale?: string | null, overrides?: Partial<PaymentMessages> | null): string | null {\n if (!expiresAt) return null\n const d = new Date(expiresAt)\n if (Number.isNaN(d.getTime())) return null\n let date: string\n try {\n date = new Intl.DateTimeFormat(locale ?? undefined, { dateStyle: 'long', timeStyle: 'short' }).format(d)\n } catch {\n date = d.toISOString()\n }\n return formatAvailabilityMessage(paymentMessages(locale, overrides)['voucher.expires'], { date })\n}\n\n/** Builds an idempotency key for a payment attempt: the same attempt always yields the same key. */\nexport function paymentIdempotencyKey(checkoutId: string, attempt: string): string {\n return `pay-${checkoutId}-${attempt}`\n}\n","/**\n * Pure helpers over an `Order` (contract 1.8): the unified progress, the one next action, shipment ordering and the\n * \"test\" rules. They READ what the server sent and only derive what an older server (no `progress` / `next_action`)\n * did not. Every enum is open: an unknown stage, step state or shipment status never throws, it is kept as is and the\n * UI shows its safe fallback.\n */\nimport { safeHttpsUrl } from './payments.js'\nimport type {\n InvoiceDoc,\n NextAction,\n Order,\n OrderProblem,\n OrderProgress,\n OrderProgressStep,\n OrderStage,\n OrderStepKey,\n Shipment,\n ShipmentEvent,\n ShipmentStatus,\n} from './types.js'\n\n/** Steps of an order that ships, in order. */\nexport const SHIPPING_STEPS = ['paid', 'preparing', 'shipped', 'in_transit', 'delivered'] as const\n/** Steps of an order the buyer picks up. */\nexport const PICKUP_STEPS = ['paid', 'preparing', 'ready_for_pickup', 'delivered'] as const\n\n/** Shipment statuses that mean the package is not where it should be. */\nconst SHIPMENT_PROBLEMS: Record<string, string> = { exception: 'delivery_exception', returned: 'returned', lost: 'lost' }\n\nconst RANK: Record<string, number> = { pending: 0, label_created: 1, in_transit: 2, out_for_delivery: 3, delivered: 4 }\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v)\n\n/** A shipment the buyer can be told about as real: not a sandbox one. */\nexport function isTestShipment(s: Pick<Shipment, 'test_mode' | 'environment'> | null | undefined): boolean {\n return !!s && (s.test_mode === true || s.environment === 'sandbox')\n}\n\n/** An invoice or credit note from a sandbox PAC. */\nexport function isTestInvoice(d: Pick<InvoiceDoc, 'test_mode' | 'environment'> | null | undefined): boolean {\n return !!d && (d.test_mode === true || d.environment === 'sandbox')\n}\n\n/** `https` URL with no credentials, or `null`. The only kind of link a tracking or voucher button may carry. */\nexport function safeTrackingUrl(value: unknown): string | null {\n return safeHttpsUrl(value)\n}\n\nfunction time(iso: string | null | undefined): number {\n const t = iso ? Date.parse(iso) : NaN\n return Number.isNaN(t) ? -Infinity : t\n}\n\n/** Newest first, invalid dates last, ties keep the server's order; at most `limit` (default 50, the contract's cap). */\nexport function sortTrackingEvents(events: readonly ShipmentEvent[] | null | undefined, limit = 50): ShipmentEvent[] {\n if (!Array.isArray(events)) return []\n return events\n .filter(isRecord as (e: unknown) => e is ShipmentEvent)\n .map((e, i) => ({ e, i }))\n .sort((a, b) => time(b.e.occurred_at) - time(a.e.occurred_at) || a.i - b.i)\n .slice(0, Math.max(0, limit))\n .map((x) => x.e)\n}\n\n/** The shipments of the order that count: outbound/pickup/local first, returns after; stable otherwise. */\nexport function orderShipments(order: Pick<Order, 'shipments'> | null | undefined): Shipment[] {\n const list = Array.isArray(order?.shipments) ? order!.shipments!.filter(isRecord as (s: unknown) => s is Shipment) : []\n return [...list.filter((s) => s.kind !== 'return'), ...list.filter((s) => s.kind === 'return')]\n}\n\nfunction validProgress(p: unknown): p is OrderProgress {\n return isRecord(p) && typeof p.stage === 'string' && Array.isArray(p.steps)\n}\n\nconst validStep = (s: unknown): s is OrderProgressStep => isRecord(s) && typeof s.key === 'string' && typeof s.state === 'string'\n\n/** The server's progress with anything malformed dropped: a bad step or problem never reaches the UI. */\nfunction cleanProgress(p: OrderProgress): OrderProgress {\n if (p.steps.every(validStep) && (p.problem === undefined || p.problem === null || (isRecord(p.problem) && typeof p.problem.code === 'string'))) return p\n const problem = isRecord(p.problem) && typeof p.problem.code === 'string' ? p.problem : null\n return { stage: p.stage, problem, steps: p.steps.filter(validStep) }\n}\n\n/** Shipments that tell the buyer something real about delivery: not returns, not sandbox. */\nconst liveShipments = (shipments: Shipment[]) => shipments.filter((s) => s.kind !== 'return' && !isTestShipment(s))\n\n/** The stage of an order from its legacy `status` / `payment_status` and its shipments (servers before contract 1.8). */\nfunction legacyStage(order: Order, shipments: Shipment[]): OrderStage {\n const status = typeof order.status === 'string' ? order.status.toLowerCase() : ''\n const pickup = order.delivery_method === 'pickup'\n if (status === 'cancelled' || status === 'canceled') return 'cancelled'\n if (status === 'refunded') return 'refunded'\n if (status === 'pending_payment' || order.payment_status === 'pending') return 'pending_payment'\n if (status === 'delivered' || status === 'fulfilled') return 'delivered'\n // The order is as far as its LEAST advanced live shipment (a partial delivery is not a delivered order); cancelled\n // legs and legs with a problem (flagged apart) do not hold it back. Same rule as the server.\n const live = liveShipments(shipments)\n const ranked = live.filter((s) => RANK[s.status] !== undefined)\n const least = ranked.reduce<string | null>((acc, s) => (acc === null || RANK[s.status]! < RANK[acc]! ? s.status : acc), null)\n if (least === 'delivered') return 'delivered'\n if (least === 'out_for_delivery') return 'out_for_delivery'\n if (least === 'in_transit') return 'in_transit'\n if (status === 'ready_for_pickup' || (status === 'ready' && pickup)) return 'ready_for_pickup'\n // A `shipped` status whose every shipment is a sandbox one: the package is not really on its way.\n const onlySandbox = shipments.some((s) => s.kind !== 'return') && live.length === 0\n if ((status === 'shipped' && !onlySandbox) || least === 'label_created') return 'shipped'\n if (status === 'fulfilling' || status === 'accepted' || status === 'ready' || status === 'shipped') return 'preparing'\n return 'paid'\n}\n\nconst STAGE_TO_STEP: Record<string, OrderStepKey> = {\n paid: 'paid',\n preparing: 'preparing',\n ready_for_pickup: 'ready_for_pickup',\n shipped: 'shipped',\n in_transit: 'in_transit',\n out_for_delivery: 'in_transit',\n delivered: 'delivered',\n}\n\n/** When the payment was confirmed (not when the order was placed: a cash voucher is paid days later), or `null`. */\nfunction paidAt(order: Order): string | null {\n const paid = Array.isArray(order.payments) ? order.payments.find((p) => isRecord(p) && typeof p.paid_at === 'string' && p.paid_at) : undefined\n return paid?.paid_at ?? null\n}\n\n/**\n * The unified progress. The server's `order.progress` wins when it is well formed; otherwise it is derived, so a store\n * on an older OPS still gets a timeline. Pending payment, cancelled and refunded orders have no steps to walk: `steps`\n * lists them as `pending` (or `[]` when cancelled/refunded) and the stage says why.\n */\nexport function orderProgress(order: Order): OrderProgress {\n if (validProgress(order.progress)) return cleanProgress(order.progress)\n const shipments = orderShipments(order)\n const stage = legacyStage(order, shipments)\n const keys: readonly string[] = order.delivery_method === 'pickup' ? PICKUP_STEPS : SHIPPING_STEPS\n const dead = stage === 'cancelled' || stage === 'refunded'\n const awaiting = stage === 'pending_payment'\n const current = STAGE_TO_STEP[stage] ?? 'paid'\n const at = keys.indexOf(current)\n const failed = liveShipments(shipments).find((s) => SHIPMENT_PROBLEMS[s.status])\n const problem: OrderProblem | null = failed\n ? { code: SHIPMENT_PROBLEMS[failed.status]!, at: sortTrackingEvents(failed.events)[0]?.occurred_at ?? null }\n : order.payment_status === 'failed'\n ? { code: 'payment_failed' }\n : null\n const steps: OrderProgressStep[] = dead\n ? []\n : keys.map((key, i) => {\n if (awaiting) return { key, state: 'pending', at: null }\n const state = i < at || stage === 'delivered' ? 'done' : i === at ? (problem && i >= keys.indexOf('shipped') ? 'problem' : 'current') : 'pending'\n return { key, state, at: key === 'paid' && state === 'done' ? paidAt(order) : null }\n })\n return { stage, problem, steps }\n}\n\n/**\n * The action to put first. The server's `next_action` wins (its `href` is re-checked: only `https`); an older server\n * gets one derived from the order and its invoice. Never `null`: `{ kind: 'none' }` means \"nothing to offer\".\n */\nexport function nextAction(order: Order): NextAction {\n // A 1.8 server that sends `next_action: null` means \"nothing to offer\"; only an older server (no key) is derived.\n if (order.next_action === null) return { kind: 'none', href: null, ref: null }\n if (isRecord(order.next_action) && typeof order.next_action.kind === 'string') {\n const href = safeTrackingUrl(order.next_action.href)\n return { kind: order.next_action.kind, href, ref: typeof order.next_action.ref === 'string' ? order.next_action.ref : null }\n }\n const progress = orderProgress(order)\n if (progress.stage === 'pending_payment') return { kind: 'pay', href: null, ref: null }\n if (progress.stage === 'cancelled' || progress.stage === 'refunded') return { kind: 'none', href: null, ref: null }\n const live = orderShipments(order).find((s) => s.kind !== 'return' && !isTestShipment(s) && s.status !== 'delivered' && s.status !== 'cancelled')\n const trackUrl = safeTrackingUrl(live?.tracking_url)\n if (live && trackUrl) return { kind: 'track', href: trackUrl, ref: live.id }\n if (progress.stage === 'ready_for_pickup') return { kind: 'pickup', href: null, ref: null }\n const inv = isRecord(order.invoice) ? order.invoice : undefined\n // The server's `action` wins over the stage: an issued invoice it does not offer (no file yet) is not a button.\n if (inv?.action === 'download' || (inv?.action === undefined && inv?.stage === 'issued')) {\n const docs = Array.isArray(order.invoices) ? order.invoices.filter((d) => isRecord(d) && d.kind === 'invoice' && d.status !== 'cancelled') : []\n const real = docs.find((d) => !isTestInvoice(d))\n // Detail with only sandbox invoices: never offer one as the buyer's invoice.\n if (docs.length === 0 || real) return { kind: 'download_invoice', href: null, ref: real?.id ?? null }\n }\n if (inv?.action === 'correct_data') return { kind: 'correct_invoice_data', href: null, ref: null }\n if (inv?.action === 'contact_store') return { kind: 'contact_store', href: null, ref: null }\n if (inv?.can_request === true && inv.stage !== 'requested') return { kind: 'request_invoice', href: null, ref: null }\n return { kind: 'none', href: null, ref: null }\n}\n\n/** Latest known status among the live (non-sandbox, non-return) shipments, or `null`. */\nexport function shipmentsStatus(order: Order): ShipmentStatus | null {\n if (order.shipments_summary && typeof order.shipments_summary.status === 'string') return order.shipments_summary.status\n const live = orderShipments(order).filter((s) => s.kind !== 'return' && !isTestShipment(s))\n return live.length ? live[0]!.status : null\n}\n","// «My items» (contract 1.9): the pure side. The cascade of options a form shows, the same validation the server runs\n// (the server is the authority; this gives the buyer the answer without a round trip), the compatibility key and the\n// product tags it filters with. No UI, no storage, no copy, and no kind is named here: a kind is data the organization\n// publishes (`content.subjectKinds()`), and what a field \"means\" (make, size, breed) is only its label.\n//\n// Privacy: a `private` field (a licence plate) is kept apart. It is never part of `label`, `fit_key` or any tag, and\n// `maskedValue` / `isMasked` are how the server's mask is recognized so it is never sent back as if it were a value.\n\nimport type { SubjectCatalogNode, SubjectField, SubjectKind } from './types.js'\n\nexport const MIN_SUBJECT_YEAR = 1900\nexport const MAX_SUBJECT_YEAR = 2100\nconst MAX_VALUE_LENGTH = 80\nconst MAX_LABEL_LENGTH = 120\nconst MAX_FIT_KEY_LENGTH = 100\n\nexport type SubjectOption = { value: string; label: string }\nexport type SubjectValues = Record<string, string | number | null | undefined>\n\n/** Why a value was refused (the server answers `422` with the field `attributes.<key>` and never the value). */\nexport type SubjectProblemCode = 'required' | 'unknown' | 'invalid' | 'not_in_catalog' | 'year_range' | 'catalog_unavailable'\nexport type SubjectProblems = Record<string, SubjectProblemCode>\n\nexport type ResolvedSubject = {\n /** Built from the labels of the catalog and the public values, in field order. */\n label: string\n /** `''` when a placeholder of the template has no value (the item then never matches a product). */\n fit_key: string\n /** Public values, as the server stores them in `attributes`. */\n attributes: Record<string, string | number>\n /** Private values: never in the label, the key or a tag. */\n private: Record<string, string>\n}\n\nconst isPresent = (v: unknown): boolean => v !== null && v !== undefined && v !== ''\n\nconst asYear = (v: unknown): number | null => {\n const n = typeof v === 'number' ? v : typeof v === 'string' && /^\\s*\\d+\\s*$/.test(v) ? Number(v) : NaN\n return Number.isInteger(n) && n >= MIN_SUBJECT_YEAR && n <= MAX_SUBJECT_YEAR ? n : null\n}\n\n/** Collapses whitespace; `null` for a non-string, a control character or a value over `max` characters. */\nconst cleanText = (v: unknown, max: number): string | null => {\n if (typeof v !== 'string') return null\n const s = v.split(/\\s+/).filter(Boolean).join(' ')\n // eslint-disable-next-line no-control-regex\n return [...s].length > max || /[\\u0000-\\u001f\\u007f-\\u009f]/.test(s) ? null : s\n}\n\nconst slug = (s: string): string => s.toLowerCase().replace(/[^a-z0-9._+-]+/g, '-').replace(/^-+|-+$/g, '')\n\n/** Does the option cover the model year? Declared `ranges` win; else `from`/`to`; an option with none covers any year. */\nexport function coversYear(node: Pick<SubjectCatalogNode, 'from' | 'to' | 'ranges'>, year: number): boolean {\n if (node.ranges && node.ranges.length > 0) return node.ranges.some(([a, b]) => year >= a && year <= b)\n if (node.from !== undefined && year < node.from) return false\n if (node.to !== undefined && year > node.to) return false\n return true\n}\n\nconst declaresYears = (n: SubjectCatalogNode): boolean => n.from !== undefined || n.to !== undefined || (n.ranges?.length ?? 0) > 0\n\n/** The catalog fields that make the tree's levels, in order: `source: catalog` and not a year. */\nexport function subjectLevels(kind: Pick<SubjectKind, 'fields'>): SubjectField[] {\n return kind.fields.filter((f) => f.source === 'catalog' && f.type !== 'year')\n}\n\n/** The visible fields of a form: everything the buyer fills in, in the order of the kind. */\nexport function subjectFields(kind: Pick<SubjectKind, 'fields'>): SubjectField[] {\n return kind.fields\n}\n\n/** Walks the chosen values down the tree; stops at the first level without a (valid) choice. */\nfunction walk(kind: SubjectKind, values: SubjectValues): { path: SubjectCatalogNode[]; ids: Record<string, string>; next: Record<string, SubjectCatalogNode> | undefined } {\n const path: SubjectCatalogNode[] = []\n const ids: Record<string, string> = {}\n let tree: Record<string, SubjectCatalogNode> | undefined = kind.catalog?.tree\n for (const f of subjectLevels(kind)) {\n const raw = values[f.key]\n const s = isPresent(raw) ? cleanText(raw, MAX_VALUE_LENGTH) : null\n const node: SubjectCatalogNode | undefined = s && tree ? (tree[s] ?? tree[s.toLowerCase()]) : undefined\n if (!s || !node) return { path, ids, next: tree }\n ids[f.key] = tree && tree[s] ? s : s.toLowerCase()\n path.push(node)\n tree = node.children\n if (!tree) return { path, ids, next: undefined }\n }\n return { path, ids, next: tree }\n}\n\nconst byLabel = (a: SubjectOption, b: SubjectOption) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base', numeric: true })\n\n/**\n * The options a catalog field offers given what is already chosen (a cascade: a level shows nothing until the previous\n * one is chosen). A level narrows by the chosen year when the option declares years; a year field offers the model\n * years the chosen options cover (newest first), or nothing when no option declares years (a free number then).\n */\nexport function subjectOptions(kind: SubjectKind, fieldKey: string, values: SubjectValues): SubjectOption[] {\n const field = kind.fields.find((f) => f.key === fieldKey)\n if (!field || field.source !== 'catalog' || !kind.catalog) return []\n if (field.type === 'year') {\n // Only the options chosen BEFORE the year constrain it (a stale choice after it is reconciled against the year).\n const upto = kind.fields.slice(0, kind.fields.indexOf(field))\n const { path } = walk({ ...kind, fields: upto }, values)\n const declared = path.filter(declaresYears)\n if (declared.length === 0) return []\n let lo = Infinity\n let hi = -Infinity\n for (const n of declared) {\n for (const [a, b] of n.ranges?.length ? n.ranges : [[n.from ?? MIN_SUBJECT_YEAR, n.to ?? MAX_SUBJECT_YEAR] as [number, number]]) {\n lo = Math.min(lo, a)\n hi = Math.max(hi, b)\n }\n }\n const out: SubjectOption[] = []\n for (let y = Math.min(hi, MAX_SUBJECT_YEAR); y >= Math.max(lo, MIN_SUBJECT_YEAR); y--) if (declared.every((n) => coversYear(n, y))) out.push({ value: String(y), label: String(y) })\n return out\n }\n const levels = subjectLevels(kind)\n const at = levels.findIndex((f) => f.key === fieldKey)\n if (at < 0) return []\n // Only the levels before this one must be chosen.\n const before = Object.fromEntries(levels.slice(0, at).map((f) => [f.key, values[f.key]]))\n const { path, next } = walk({ ...kind, fields: kind.fields.filter((f) => levels.slice(0, at).includes(f) || f.type === 'year') }, before)\n if (path.length < at || !next) return []\n const year = asYear(values[kind.fields.find((f) => f.type === 'year' && f.source === 'catalog')?.key ?? ''])\n return Object.entries(next)\n .filter(([, n]) => year === null || coversYear(n, year))\n .map(([value, n]) => ({ value, label: n.label }))\n .sort(byLabel)\n}\n\n/**\n * Drops what was chosen and is no longer valid after a change (a new make clears the model; a year the model does not\n * cover is cleared), in field order. Free values are never touched.\n */\nexport function reconcileSubjectValues(kind: SubjectKind, values: SubjectValues): SubjectValues {\n const out: SubjectValues = { ...values }\n for (const f of kind.fields) {\n if (f.source !== 'catalog' || !isPresent(out[f.key])) continue\n const options = subjectOptions(kind, f.key, out)\n const v = String(out[f.key])\n const ok = f.type === 'year' ? options.length === 0 || options.some((o) => o.value === v) : options.some((o) => o.value === v || o.value === v.toLowerCase())\n if (!ok) out[f.key] = ''\n }\n return out\n}\n\n/**\n * Validates and resolves the values the way the server does: unknown field, wrong type, a value missing from the\n * catalog and a year outside the chosen options' years are refused, naming the field only.\n */\nexport function resolveSubject(kind: SubjectKind, values: SubjectValues): { ok: true; subject: ResolvedSubject } | { ok: false; problems: SubjectProblems } {\n const problems: SubjectProblems = {}\n const known = new Set(kind.fields.map((f) => f.key))\n for (const key of Object.keys(values)) if (isPresent(values[key]) && !known.has(key)) problems[key] = 'unknown'\n\n const attributes: Record<string, string | number> = {}\n const priv: Record<string, string> = {}\n const display: Record<string, string> = {}\n const ids: Record<string, string> = {}\n const path: SubjectCatalogNode[] = []\n let tree: Record<string, SubjectCatalogNode> | undefined = kind.catalog?.tree\n const years: string[] = []\n const put = (f: SubjectField, v: string | number) => {\n if (f.private) priv[f.key] = String(v)\n else attributes[f.key] = v\n }\n for (const f of kind.fields) {\n const raw = values[f.key]\n if (!isPresent(raw)) {\n if (f.required) problems[f.key] = 'required'\n if (f.source === 'catalog' && f.type !== 'year') tree = undefined // a skipped level ends the walk\n continue\n }\n const max = f.max ?? MAX_VALUE_LENGTH\n if (f.type === 'year') {\n const y = asYear(raw)\n if (y === null) {\n problems[f.key] = 'invalid'\n continue\n }\n put(f, y)\n display[f.key] = ids[f.key] = String(y)\n if (f.source === 'catalog') years.push(f.key)\n } else if (f.source === 'catalog') {\n if (!kind.catalog) {\n problems[f.key] = 'catalog_unavailable'\n continue\n }\n const s = cleanText(raw, max)\n if (s === null) {\n problems[f.key] = 'invalid'\n continue\n }\n const node: SubjectCatalogNode | undefined = tree?.[s] ?? tree?.[s.toLowerCase()]\n if (!node) {\n problems[f.key] = 'not_in_catalog'\n continue\n }\n const id = tree?.[s] ? s : s.toLowerCase()\n path.push(node)\n tree = node.children\n put(f, id)\n display[f.key] = node.label\n ids[f.key] = id\n } else {\n const s = cleanText(raw, max)\n if (s === null) {\n problems[f.key] = 'invalid'\n continue\n }\n put(f, s)\n display[f.key] = s\n ids[f.key] = slug(s)\n }\n }\n for (const key of years) {\n const y = attributes[key] as number | undefined\n if (y !== undefined && !problems[key] && !path.every((n) => coversYear(n, y))) problems[key] = 'year_range'\n }\n if (Object.keys(problems).length > 0) return { ok: false, problems }\n\n const label = [...kind.fields.filter((f) => !f.private).map((f) => display[f.key]).filter(Boolean).join(' ')].slice(0, MAX_LABEL_LENGTH).join('').trim()\n if (!label) return { ok: false, problems: { _: 'required' } }\n let complete = true\n const key = kind.fit_key_template.replace(/\\{([a-z][a-z0-9_]*)\\}/g, (_m, name: string) => {\n const id = ids[name]\n if (!id) complete = false\n return id ?? ''\n })\n return { ok: true, subject: { label, fit_key: complete && key.length <= MAX_FIT_KEY_LENGTH ? key.toLowerCase() : '', attributes, private: priv } }\n}\n\n/** The mask the server puts in place of a private value («••34»). */\nexport const PRIVATE_MASK = '••'\nexport const isMasked = (v: unknown): boolean => typeof v === 'string' && v.startsWith(PRIVATE_MASK)\n\n/** Prefix of the tag that publishes compatibility (`<prefix><fit_key>`), as in `FitmentConfig.tagPrefix`. */\nexport const DEFAULT_FIT_TAG_PREFIX = 'fit:'\n\n/** The product tag that marks a part as fitting the item with this key. */\nexport const fitTag = (fitKey: string, prefix: string = DEFAULT_FIT_TAG_PREFIX): string => `${prefix}${fitKey}`\n\n/**\n * The `tags_any` of a listing \"only what fits my item\": its own tag plus the universal one (`<prefix>universal`).\n * `[]` when the item has no key (it does not resolve completely): ask for nothing rather than for the wrong thing.\n */\nexport function fitTagsAny(fitKey: string | null | undefined, opts: { prefix?: string; universal?: boolean } = {}): string[] {\n if (!fitKey) return []\n const prefix = opts.prefix ?? DEFAULT_FIT_TAG_PREFIX\n return opts.universal === false ? [fitTag(fitKey, prefix)] : [fitTag(fitKey, prefix), `${prefix}universal`]\n}\n\n/**\n * Budget of one catalog page, in bytes of the `tree` prop as OPS stores it (text, so every quote is escaped). Publishing\n * a page is ONE write of at most 64 KiB that carries the draft and the published copy: ~28 KB of tree per page.\n */\nexport const SUBJECT_CATALOG_PAGE_BYTES = 28 * 1024\n\nconst utf8Bytes = (s: string): number => new TextEncoder().encode(s).length\n\n/**\n * Splits a catalog tree by its first level into parts that each fit one page (`subject_catalog` section, prop `tree`).\n * Publish part `i` on its own page and name them all in the kind's `catalog_ref` (`[\"page:x-1\", \"page:x-2\", …]`); the\n * server joins them back. A real parts catalog (make → model → engine) does not fit in one page. Throws `RangeError`\n * when a single first-level option is larger than the budget on its own (split that level by hand, or trim labels).\n */\nexport function splitSubjectTree(\n tree: Record<string, SubjectCatalogNode>,\n maxBytes: number = SUBJECT_CATALOG_PAGE_BYTES,\n): Record<string, SubjectCatalogNode>[] {\n const size = (part: Record<string, SubjectCatalogNode>) => utf8Bytes(JSON.stringify(JSON.stringify(part)))\n const parts: Record<string, SubjectCatalogNode>[] = []\n let current: Record<string, SubjectCatalogNode> = {}\n for (const [id, node] of Object.entries(tree)) {\n if (size({ [id]: node }) > maxBytes) throw new RangeError(`splitSubjectTree: option ${id} alone exceeds ${maxBytes} bytes`)\n const next = { ...current, [id]: node }\n if (Object.keys(current).length > 0 && size(next) > maxBytes) {\n parts.push(current)\n current = { [id]: node }\n } else current = next\n }\n if (Object.keys(current).length > 0) parts.push(current)\n return parts\n}\n"]}
package/dist/cli.js CHANGED
@@ -458,6 +458,26 @@ function createStorefrontClient(config) {
458
458
  */
459
459
  get: (id, options) => getOrNull(`/storefront/checkouts/${enc(id)}`, void 0, options)
460
460
  },
461
+ /**
462
+ * Public "where is my order" lookup (`POST /storefront/customer/track`): by order number + email, or by the guide
463
+ * printed on the parcel. No buyer session. Every failure is one of three plain answers, so a miss never tells a
464
+ * real order from an unknown one: `not_found`, `rate_limited` (with `retryAfter` seconds when known) or
465
+ * `unavailable` (the server or the network failed). Needs the store to enable the route.
466
+ */
467
+ tracking: {
468
+ lookup: async (input, options) => {
469
+ try {
470
+ const tracking = await write("POST", "/storefront/customer/track", input, options);
471
+ return tracking && Array.isArray(tracking.events) ? { status: "found", tracking } : { status: "not_found" };
472
+ } catch (err) {
473
+ if (err instanceof StorefrontError) {
474
+ if (err.status === 429) return err.retryAfter ? { status: "rate_limited", retryAfter: err.retryAfter } : { status: "rate_limited" };
475
+ if (err.status === 400 || err.status === 404 || err.status === 422) return { status: "not_found" };
476
+ }
477
+ return { status: "unavailable" };
478
+ }
479
+ }
480
+ },
461
481
  customer: {
462
482
  /** Sends a one-time code by email or SMS/WhatsApp. */
463
483
  requestOtp: (identifier, options) => write("POST", "/storefront/customer/otp", identifier, options),
@@ -711,7 +731,7 @@ function repairPath(connectionName) {
711
731
  import { chmodSync, closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, statSync, unlinkSync, writeSync } from "fs";
712
732
  import { dirname, join, resolve } from "path";
713
733
  import { hostname } from "os";
714
- var SDK_VERSION = true ? "0.25.0" : "dev";
734
+ var SDK_VERSION = true ? "0.27.0" : "dev";
715
735
  function writeFileAtomic(file, content, mode = 384) {
716
736
  const dir = dirname(file);
717
737
  mkdirSync(dir, { recursive: true });
@@ -1,5 +1,5 @@
1
- import { a2 as FiscalDocumentSource, bq as RegionFiscalEntry, aa as IdentityDocumentSpec, a1 as FiscalDocumentEvidence, br as RegionFiscalId, ac as IdentityRulesV1 } from './account-settings-DOAM5mTk.cjs';
2
- export { a9 as IdentityCapture, ab as IdentityFieldRule, ad as IdentityStrategy } from './account-settings-DOAM5mTk.cjs';
1
+ import { a2 as FiscalDocumentSource, bq as RegionFiscalEntry, aa as IdentityDocumentSpec, a1 as FiscalDocumentEvidence, br as RegionFiscalId, ac as IdentityRulesV1 } from './account-settings-DghDmuaI.cjs';
2
+ export { a9 as IdentityCapture, ab as IdentityFieldRule, ad as IdentityStrategy } from './account-settings-DghDmuaI.cjs';
3
3
  import './geo.cjs';
4
4
 
5
5
  /** A value read from a document: text, or the codes of a catalog (`multiple` fields). */
@@ -1,5 +1,5 @@
1
- import { a2 as FiscalDocumentSource, bq as RegionFiscalEntry, aa as IdentityDocumentSpec, a1 as FiscalDocumentEvidence, br as RegionFiscalId, ac as IdentityRulesV1 } from './account-settings-mTEXvtfz.js';
2
- export { a9 as IdentityCapture, ab as IdentityFieldRule, ad as IdentityStrategy } from './account-settings-mTEXvtfz.js';
1
+ import { a2 as FiscalDocumentSource, bq as RegionFiscalEntry, aa as IdentityDocumentSpec, a1 as FiscalDocumentEvidence, br as RegionFiscalId, ac as IdentityRulesV1 } from './account-settings-Cio2mAvd.js';
2
+ export { a9 as IdentityCapture, ab as IdentityFieldRule, ad as IdentityStrategy } from './account-settings-Cio2mAvd.js';
3
3
  import './geo.js';
4
4
 
5
5
  /** A value read from a document: text, or the codes of a catalog (`multiple` fields). */
package/dist/index.cjs CHANGED
@@ -490,6 +490,26 @@ function createStorefrontClient(config) {
490
490
  */
491
491
  get: (id, options) => getOrNull(`/storefront/checkouts/${enc(id)}`, void 0, options)
492
492
  },
493
+ /**
494
+ * Public "where is my order" lookup (`POST /storefront/customer/track`): by order number + email, or by the guide
495
+ * printed on the parcel. No buyer session. Every failure is one of three plain answers, so a miss never tells a
496
+ * real order from an unknown one: `not_found`, `rate_limited` (with `retryAfter` seconds when known) or
497
+ * `unavailable` (the server or the network failed). Needs the store to enable the route.
498
+ */
499
+ tracking: {
500
+ lookup: async (input, options) => {
501
+ try {
502
+ const tracking = await write("POST", "/storefront/customer/track", input, options);
503
+ return tracking && Array.isArray(tracking.events) ? { status: "found", tracking } : { status: "not_found" };
504
+ } catch (err) {
505
+ if (err instanceof StorefrontError) {
506
+ if (err.status === 429) return err.retryAfter ? { status: "rate_limited", retryAfter: err.retryAfter } : { status: "rate_limited" };
507
+ if (err.status === 400 || err.status === 404 || err.status === 422) return { status: "not_found" };
508
+ }
509
+ return { status: "unavailable" };
510
+ }
511
+ }
512
+ },
493
513
  customer: {
494
514
  /** Sends a one-time code by email or SMS/WhatsApp. */
495
515
  requestOtp: (identifier, options) => write("POST", "/storefront/customer/otp", identifier, options),
@@ -807,6 +827,7 @@ var ES = {
807
827
  "status.preorder": "Preventa",
808
828
  "sub.backorder_eta": "Se env\xEDa a partir del {date}",
809
829
  "sub.preorder_date": "Sale a la venta el {date}",
830
+ "line.ships_on": "Se enviar\xE1 el: {date}",
810
831
  "cta.add": "Agregar al carrito",
811
832
  "cta.out_of_stock": "Agotado",
812
833
  "cta.backorder": "Pedir bajo pedido",
@@ -846,6 +867,7 @@ var EN = {
846
867
  "status.preorder": "Pre-order",
847
868
  "sub.backorder_eta": "Ships from {date}",
848
869
  "sub.preorder_date": "Available on {date}",
870
+ "line.ships_on": "Ships on: {date}",
849
871
  "cta.add": "Add to cart",
850
872
  "cta.out_of_stock": "Sold out",
851
873
  "cta.backorder": "Order now, ships later",
@@ -900,6 +922,18 @@ function formatDate(value, locale) {
900
922
  return value.slice(0, 10);
901
923
  }
902
924
  }
925
+ function lineShipDate(line) {
926
+ const day = (v) => {
927
+ const d = typeof v === "string" ? v.slice(0, 10) : "";
928
+ return /^\d{4}-\d{2}-\d{2}$/.test(d) ? d : null;
929
+ };
930
+ return day(line.ships_on) ?? day(line.availability?.restock_eta) ?? day(line.availability?.preorder_release_at);
931
+ }
932
+ function lineShipLabel(line, locale, overrides) {
933
+ const date = formatDate(lineShipDate(line), locale);
934
+ if (!date) return null;
935
+ return formatAvailabilityMessage(availabilityMessages(locale, overrides)["line.ships_on"], { date });
936
+ }
903
937
  function resolveAvailability(source, options = {}) {
904
938
  const a = source.availability;
905
939
  if (a && typeof a === "object" && typeof a.status === "string") return a;
@@ -2061,6 +2095,8 @@ exports.isStorefrontError = isStorefrontError;
2061
2095
  exports.isTestInvoice = isTestInvoice;
2062
2096
  exports.isTestShipment = isTestShipment;
2063
2097
  exports.isTokenPublishable = isTokenPublishable;
2098
+ exports.lineShipDate = lineShipDate;
2099
+ exports.lineShipLabel = lineShipLabel;
2064
2100
  exports.listApiParams = listApiParams;
2065
2101
  exports.listHref = listHref;
2066
2102
  exports.listQueryString = listQueryString;