@aranova/tracking-react 1.0.0 → 1.2.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.
package/dist/index.mjs CHANGED
@@ -226,6 +226,7 @@ var TRACKING_CAPABILITIES = [
226
226
  "consent_controls",
227
227
  "conversion_goals_auto",
228
228
  "conversion_goals_manual",
229
+ "cross_site_linker",
229
230
  "cta_click_capture",
230
231
  "form_capture",
231
232
  "phone_click_capture",
@@ -252,6 +253,9 @@ function readDomMarkers() {
252
253
  return found;
253
254
  }
254
255
 
256
+ // ../tracking-core/src/cross-site-link.ts
257
+ import * as z from "zod/mini";
258
+
255
259
  // ../tracking-core/src/tracking.ts
256
260
  var TRACKING_COOKIE_MAX_AGE_SECONDS = 7776e3;
257
261
  var TRACKING_PARAM_KEYS = [
@@ -496,6 +500,43 @@ function buildLandingPayloadFields(sessionId, override) {
496
500
  };
497
501
  }
498
502
 
503
+ // ../tracking-core/src/cross-site-link.ts
504
+ var LINK_PARAM = "_arv";
505
+ var LINK_TOKEN_TTL_MS = 5 * 60 * 1e3;
506
+ var FUTURE_SKEW_MS = 60 * 1e3;
507
+ var CARRIED_KEYS = {
508
+ g: "gclid",
509
+ w: "wbraid",
510
+ gb: "gbraid",
511
+ f: "fbclid",
512
+ y: "ylpcid"
513
+ };
514
+ var CARRIED_ENTRIES = Object.entries(CARRIED_KEYS);
515
+ var identifier = z.string().check(z.minLength(1), z.maxLength(128));
516
+ var optionalIdentifier = z.optional(identifier);
517
+ var linkTokenSchema = z.object({
518
+ v: identifier,
519
+ s: identifier,
520
+ // Epoch ms in base36.
521
+ t: z.string().check(z.regex(/^[0-9a-z]{1,12}$/)),
522
+ g: optionalIdentifier,
523
+ w: optionalIdentifier,
524
+ gb: optionalIdentifier,
525
+ f: optionalIdentifier,
526
+ fc: optionalIdentifier,
527
+ y: optionalIdentifier
528
+ });
529
+ function stripLinkParam(url) {
530
+ try {
531
+ const parsed = new URL(url, typeof window === "undefined" ? void 0 : window.location.href);
532
+ if (!parsed.searchParams.has(LINK_PARAM)) return url;
533
+ parsed.searchParams.delete(LINK_PARAM);
534
+ return parsed.href;
535
+ } catch {
536
+ return url;
537
+ }
538
+ }
539
+
499
540
  // ../tracking-core/src/payloads.ts
500
541
  function createTrackingClientContext(surface, input = {}) {
501
542
  return {
@@ -535,6 +576,7 @@ function createTrackingSessionUpsertPayload(trackingParams, input, context) {
535
576
  };
536
577
  }
537
578
  function createTrackingEventCreatePayload(trackingParams, input, context) {
579
+ const pageUrl = input.pageUrl ?? (typeof window === "undefined" ? null : window.location.href);
538
580
  return {
539
581
  session_id: input.sessionId,
540
582
  event_type: input.eventType,
@@ -545,7 +587,7 @@ function createTrackingEventCreatePayload(trackingParams, input, context) {
545
587
  fbclid: trackingParams.fbclid,
546
588
  fbc: getFbcCookie(),
547
589
  fbp: getFbpCookie(),
548
- page_url: input.pageUrl ?? (typeof window === "undefined" ? null : window.location.href),
590
+ page_url: pageUrl === null ? null : stripLinkParam(pageUrl),
549
591
  metadata: input.metadata ?? null,
550
592
  context
551
593
  };
@@ -657,7 +699,8 @@ function parseConversionConfig(raw) {
657
699
  gtag_ids: isStringMap(obj.gtag_ids) ? obj.gtag_ids : {},
658
700
  meta_pixel_ids: isStringMap(obj.meta_pixel_ids) ? obj.meta_pixel_ids : {},
659
701
  services,
660
- goals
702
+ goals,
703
+ linked_hostnames: Array.isArray(obj.linked_hostnames) ? obj.linked_hostnames.filter((h) => typeof h === "string" && h.length > 0) : []
661
704
  };
662
705
  }
663
706
  var CACHE_PREFIX = "_aranova_cfg_";
@@ -741,6 +784,7 @@ function resolveConversionConfig(options) {
741
784
  getFiring: (key) => goalsByKey.get(key)?.firing ?? null,
742
785
  getGoal: (key) => goalsByKey.get(key) ?? null,
743
786
  listGoals: () => [...goalsByKey.values()],
787
+ linkedHostnames: () => current?.linked_hostnames ?? [],
744
788
  current: () => current,
745
789
  isReady: () => current !== null,
746
790
  onResolve: (listener) => {
@@ -948,7 +992,7 @@ function validateConfig(config, ref) {
948
992
  function pageViewSnapshot() {
949
993
  if (typeof window === "undefined" || typeof document === "undefined") return null;
950
994
  return {
951
- href: window.location.href,
995
+ href: stripLinkParam(window.location.href),
952
996
  title: document.title || null,
953
997
  referrer: document.referrer || null
954
998
  };
@@ -1099,6 +1143,10 @@ var TrackingConfigRuntime = class {
1099
1143
  listGoals() {
1100
1144
  return this.current?.goals ?? [];
1101
1145
  }
1146
+ /** Sibling hostnames for the linker — read from the cached object even while unconfirmed. */
1147
+ linkedHostnames() {
1148
+ return this.current?.linked_hostnames ?? [];
1149
+ }
1102
1150
  async revalidateNow() {
1103
1151
  try {
1104
1152
  const headers = {};
@@ -1342,6 +1390,18 @@ var EVENT_SEMANTICS = {
1342
1390
  category: "engagement",
1343
1391
  outcomeRole: "engagement",
1344
1392
  clientVisibility: "simple"
1393
+ },
1394
+ site_link_click: {
1395
+ label: "Left for sibling site",
1396
+ category: "page",
1397
+ outcomeRole: "navigation",
1398
+ clientVisibility: "detailed"
1399
+ },
1400
+ site_link_arrival: {
1401
+ label: "Arrived from sibling site",
1402
+ category: "page",
1403
+ outcomeRole: "navigation",
1404
+ clientVisibility: "simple"
1345
1405
  }
1346
1406
  };
1347
1407
  function getEventSemantics(eventName) {
@@ -1583,11 +1643,11 @@ function createSalesClient(config) {
1583
1643
  }
1584
1644
 
1585
1645
  // ../tracking-core/src/resources/sales/schema.ts
1586
- import * as z2 from "zod/mini";
1646
+ import * as z3 from "zod/mini";
1587
1647
 
1588
1648
  // ../tracking-core/src/resources/sales/generated/zod.gen.ts
1589
- import * as z from "zod/mini";
1590
- var zErrorCode = z.enum([
1649
+ import * as z2 from "zod/mini";
1650
+ var zErrorCode = z2.enum([
1591
1651
  "missing_credentials",
1592
1652
  "invalid_api_key",
1593
1653
  "not_authenticated",
@@ -1602,9 +1662,19 @@ var zErrorCode = z.enum([
1602
1662
  "bad_request",
1603
1663
  "not_found",
1604
1664
  "conflict",
1665
+ "gone",
1605
1666
  "incompatible_payload",
1606
1667
  "repeat_confirmation_required",
1607
1668
  "idempotency_conflict",
1669
+ "slot_unavailable",
1670
+ "calendar_not_connected",
1671
+ "calendar_disconnected",
1672
+ "booking_not_found",
1673
+ "booking_not_cancellable",
1674
+ "booking_not_reschedulable",
1675
+ "manage_token_invalid",
1676
+ "google_error",
1677
+ "calendar_not_owned",
1608
1678
  "validation_error",
1609
1679
  "unknown_service",
1610
1680
  "invalid_sale_properties",
@@ -1612,36 +1682,36 @@ var zErrorCode = z.enum([
1612
1682
  "rate_limited",
1613
1683
  "internal_error"
1614
1684
  ]);
1615
- var zSaleItemEntitySchema = z.object({
1616
- category: z.nullable(z.string()),
1617
- external_item_id: z.nullable(z.string()),
1618
- id: z.uuid(),
1619
- name: z.nullable(z.string()),
1620
- quantity: z.string().check(z.regex(/^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$/)),
1621
- unit_cost_cents: z.nullable(z.int()),
1622
- unit_price_cents: z.int()
1685
+ var zSaleItemEntitySchema = z2.object({
1686
+ category: z2.nullable(z2.string()),
1687
+ external_item_id: z2.nullable(z2.string()),
1688
+ id: z2.uuid(),
1689
+ name: z2.nullable(z2.string()),
1690
+ quantity: z2.string().check(z2.regex(/^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$/)),
1691
+ unit_cost_cents: z2.nullable(z2.int()),
1692
+ unit_price_cents: z2.int()
1623
1693
  });
1624
- var zSaleItemInputSchema = z.strictObject({
1625
- category: z.nullish(z.string()),
1626
- external_item_id: z.nullish(z.string()),
1627
- name: z.nullish(z.string()),
1628
- quantity: z.string().check(z.regex(/^\d+(\.\d{1,3})?$/)),
1629
- unit_cost_cents: z.nullish(z.int().check(z.gte(0))),
1630
- unit_price_cents: z.int().check(z.gte(0))
1694
+ var zSaleItemInputSchema = z2.strictObject({
1695
+ category: z2.nullish(z2.string()),
1696
+ external_item_id: z2.nullish(z2.string()),
1697
+ name: z2.nullish(z2.string()),
1698
+ quantity: z2.string().check(z2.regex(/^\d+(\.\d{1,3})?$/)),
1699
+ unit_cost_cents: z2.nullish(z2.int().check(z2.gte(0))),
1700
+ unit_price_cents: z2.int().check(z2.gte(0))
1631
1701
  });
1632
- var zSaleServiceEntitySchema = z.object({
1633
- amount_cents: z.int(),
1634
- id: z.uuid(),
1635
- mapped: z.nullable(z.boolean()),
1636
- service_id: z.uuid(),
1637
- service_key: z.string(),
1638
- service_label: z.string()
1702
+ var zSaleServiceEntitySchema = z2.object({
1703
+ amount_cents: z2.int(),
1704
+ id: z2.uuid(),
1705
+ mapped: z2.nullable(z2.boolean()),
1706
+ service_id: z2.uuid(),
1707
+ service_key: z2.string(),
1708
+ service_label: z2.string()
1639
1709
  });
1640
- var zSaleServiceInputSchema = z.strictObject({
1641
- amount_cents: z.int().check(z.gte(0)),
1642
- service: z.string()
1710
+ var zSaleServiceInputSchema = z2.strictObject({
1711
+ amount_cents: z2.int().check(z2.gte(0)),
1712
+ service: z2.string()
1643
1713
  });
1644
- var zSmsAutomationState = z.enum([
1714
+ var zSmsAutomationState = z2.enum([
1645
1715
  "needs_check",
1646
1716
  "failed",
1647
1717
  "undelivered",
@@ -1653,7 +1723,7 @@ var zSmsAutomationState = z.enum([
1653
1723
  "eligible",
1654
1724
  "not_applicable"
1655
1725
  ]);
1656
- var zSmsWithheldReason = z.enum([
1726
+ var zSmsWithheldReason = z2.enum([
1657
1727
  "automation_disabled",
1658
1728
  "sms_disabled",
1659
1729
  "no_phone",
@@ -1666,77 +1736,83 @@ var zSmsWithheldReason = z.enum([
1666
1736
  "sender_not_ready",
1667
1737
  "missing_review_url",
1668
1738
  "no_handler",
1669
- "dispatch_already_recorded"
1739
+ "dispatch_already_recorded",
1740
+ "text_back_disabled",
1741
+ "number_text_back_disabled",
1742
+ "number_not_active",
1743
+ "a2p_registration_required",
1744
+ "alert_recipient_cannot_receive_sms",
1745
+ "line_type_unresolved"
1670
1746
  ]);
1671
- var zSaleSmsStatusSchema = z.object({
1672
- can_send_now: z._default(z.boolean(), false),
1673
- last_message_at: z.nullable(z.iso.datetime({ offset: true })),
1674
- reason_detail: z.nullable(z.string()),
1747
+ var zSaleSmsStatusSchema = z2.object({
1748
+ can_send_now: z2._default(z2.boolean(), false),
1749
+ last_message_at: z2.nullable(z2.iso.datetime({ offset: true })),
1750
+ reason_detail: z2.nullable(z2.string()),
1675
1751
  state: zSmsAutomationState,
1676
- suppressed_by_other_sale: z._default(z.boolean(), false),
1677
- withheld_reason: z.nullable(zSmsWithheldReason)
1752
+ suppressed_by_other_sale: z2._default(z2.boolean(), false),
1753
+ withheld_reason: z2.nullable(zSmsWithheldReason)
1678
1754
  });
1679
- var zSupportedCurrency = z.enum(["USD", "CAD"]);
1680
- var zTrackingEnvironment = z.enum(["production", "development"]);
1681
- var zSaleCreateSchema = z.strictObject({
1682
- amount_total_cents: z.nullish(z.int().check(z.gte(0))),
1755
+ var zSupportedCurrency = z2.enum(["USD", "CAD"]);
1756
+ var zTrackingEnvironment = z2.enum(["production", "development"]);
1757
+ var zSaleCreateSchema = z2.strictObject({
1758
+ amount_total_cents: z2.nullish(z2.int().check(z2.gte(0))),
1683
1759
  currency: zSupportedCurrency,
1684
- customer_email: z.nullish(z.email().check(z.maxLength(320))),
1685
- customer_name: z.nullish(z.string().check(z.maxLength(200))),
1686
- customer_phone: z.nullish(z.string().check(z.maxLength(64))),
1687
- description: z.nullish(z.string()),
1688
- environment: z._default(z.optional(zTrackingEnvironment), "production"),
1689
- external_id: z.nullish(z.string()),
1690
- items: z.optional(z.array(zSaleItemInputSchema)),
1691
- metadata: z.nullish(z.record(z.string(), z.unknown())),
1692
- occurred_at: z.iso.datetime({ offset: true }),
1693
- service: z.nullish(z.string()),
1694
- services: z.nullish(z.array(zSaleServiceInputSchema)),
1695
- sms_consent: z.nullish(z.boolean())
1760
+ customer_email: z2.nullish(z2.email().check(z2.maxLength(320))),
1761
+ customer_name: z2.nullish(z2.string().check(z2.maxLength(200))),
1762
+ customer_phone: z2.nullish(z2.string().check(z2.maxLength(64))),
1763
+ description: z2.nullish(z2.string()),
1764
+ environment: z2._default(z2.optional(zTrackingEnvironment), "production"),
1765
+ external_id: z2.nullish(z2.string()),
1766
+ items: z2.optional(z2.array(zSaleItemInputSchema)),
1767
+ metadata: z2.nullish(z2.record(z2.string(), z2.unknown())),
1768
+ occurred_at: z2.iso.datetime({ offset: true }),
1769
+ service: z2.nullish(z2.string()),
1770
+ services: z2.nullish(z2.array(zSaleServiceInputSchema)),
1771
+ sms_consent: z2.nullish(z2.boolean())
1696
1772
  });
1697
- var zValidationError = z.object({
1698
- ctx: z.optional(z.record(z.string(), z.unknown())),
1699
- input: z.optional(z.unknown()),
1700
- loc: z.array(z.union([z.string(), z.int()])),
1701
- msg: z.string(),
1702
- type: z.string()
1773
+ var zValidationError = z2.object({
1774
+ ctx: z2.optional(z2.record(z2.string(), z2.unknown())),
1775
+ input: z2.optional(z2.unknown()),
1776
+ loc: z2.array(z2.union([z2.string(), z2.int()])),
1777
+ msg: z2.string(),
1778
+ type: z2.string()
1703
1779
  });
1704
- var zHttpValidationError = z.object({
1705
- detail: z.optional(z.array(zValidationError))
1780
+ var zHttpValidationError = z2.object({
1781
+ detail: z2.optional(z2.array(zValidationError))
1706
1782
  });
1707
- var zValidationErrorItem = z.object({
1708
- loc: z.array(z.union([z.string(), z.int()])),
1709
- msg: z.string(),
1710
- type: z.string()
1783
+ var zValidationErrorItem = z2.object({
1784
+ loc: z2.array(z2.union([z2.string(), z2.int()])),
1785
+ msg: z2.string(),
1786
+ type: z2.string()
1711
1787
  });
1712
- var zApiErrorSchema = z.object({
1788
+ var zApiErrorSchema = z2.object({
1713
1789
  code: zErrorCode,
1714
- context: z._default(z.nullish(z.record(z.string(), z.unknown())), null),
1715
- detail: z.string(),
1716
- errors: z._default(z.nullish(z.array(zValidationErrorItem)), null),
1717
- request_id: z._default(z.nullish(z.string()), null)
1790
+ context: z2._default(z2.nullish(z2.record(z2.string(), z2.unknown())), null),
1791
+ detail: z2.string(),
1792
+ errors: z2._default(z2.nullish(z2.array(zValidationErrorItem)), null),
1793
+ request_id: z2._default(z2.nullish(z2.string()), null)
1718
1794
  });
1719
- var zWritebackEmailSource = z.enum(["NONE", "SALE", "CUSTOMER", "HARVESTED"]);
1720
- var zWritebackEnrichmentStatus = z.enum(["NONE", "MATCHED", "AMBIGUOUS"]);
1721
- var zWritebackSaleUploadCounts = z.object({
1722
- failed: z._default(z.int(), 0),
1723
- pending: z._default(z.int(), 0),
1724
- skipped: z._default(z.int(), 0),
1725
- submitted: z._default(z.int(), 0),
1726
- total: z._default(z.int(), 0),
1727
- uploaded: z._default(z.int(), 0)
1795
+ var zWritebackEmailSource = z2.enum(["NONE", "SALE", "CUSTOMER", "HARVESTED"]);
1796
+ var zWritebackEnrichmentStatus = z2.enum(["NONE", "MATCHED", "AMBIGUOUS"]);
1797
+ var zWritebackSaleUploadCounts = z2.object({
1798
+ failed: z2._default(z2.int(), 0),
1799
+ pending: z2._default(z2.int(), 0),
1800
+ skipped: z2._default(z2.int(), 0),
1801
+ submitted: z2._default(z2.int(), 0),
1802
+ total: z2._default(z2.int(), 0),
1803
+ uploaded: z2._default(z2.int(), 0)
1728
1804
  });
1729
- var zSaleWritebackStatusSchema = z.object({
1730
- blocked_reason: z.nullable(z.string()),
1731
- can_dispatch: z._default(z.boolean(), false),
1732
- email_source: z.nullable(zWritebackEmailSource),
1733
- enrichment_status: z.nullable(zWritebackEnrichmentStatus),
1734
- gclid_attached: z._default(z.boolean(), false),
1735
- identifiers_sent: z.nullable(z.string()),
1736
- mapped_service_ids: z.array(z.uuid()),
1737
- matched_submit_count: z.nullable(z.int()),
1738
- needs_force: z._default(z.boolean(), false),
1739
- rollup: z.enum([
1805
+ var zSaleWritebackStatusSchema = z2.object({
1806
+ blocked_reason: z2.nullable(z2.string()),
1807
+ can_dispatch: z2._default(z2.boolean(), false),
1808
+ email_source: z2.nullable(zWritebackEmailSource),
1809
+ enrichment_status: z2.nullable(zWritebackEnrichmentStatus),
1810
+ gclid_attached: z2._default(z2.boolean(), false),
1811
+ identifiers_sent: z2.nullable(z2.string()),
1812
+ mapped_service_ids: z2.array(z2.uuid()),
1813
+ matched_submit_count: z2.nullable(z2.int()),
1814
+ needs_force: z2._default(z2.boolean(), false),
1815
+ rollup: z2.enum([
1740
1816
  "failed",
1741
1817
  "skipped",
1742
1818
  "pending",
@@ -1746,37 +1822,37 @@ var zSaleWritebackStatusSchema = z.object({
1746
1822
  "out_of_window",
1747
1823
  "blocked"
1748
1824
  ]),
1749
- stale: z._default(z.boolean(), false),
1750
- uncovered_service_ids: z.array(z.uuid()),
1825
+ stale: z2._default(z2.boolean(), false),
1826
+ uncovered_service_ids: z2.array(z2.uuid()),
1751
1827
  uploads: zWritebackSaleUploadCounts
1752
1828
  });
1753
- var zSaleEntitySchema = z.object({
1754
- amount_total_cents: z.int(),
1755
- business_id: z.uuid(),
1756
- business_name: z.nullable(z.string()),
1757
- created_at: z.iso.datetime({ offset: true }),
1758
- currency: z.string(),
1759
- customer_email: z.nullable(z.string()),
1760
- customer_name: z.nullable(z.string()),
1761
- customer_name_placeholder_confirmed: z._default(z.boolean(), false),
1762
- customer_name_placeholder_confirmed_at: z.nullable(z.iso.datetime({ offset: true })),
1763
- customer_phone: z.nullable(z.string()),
1764
- description: z.nullable(z.string()),
1829
+ var zSaleEntitySchema = z2.object({
1830
+ amount_total_cents: z2.int(),
1831
+ business_id: z2.uuid(),
1832
+ business_name: z2.nullable(z2.string()),
1833
+ created_at: z2.iso.datetime({ offset: true }),
1834
+ currency: z2.string(),
1835
+ customer_email: z2.nullable(z2.string()),
1836
+ customer_name: z2.nullable(z2.string()),
1837
+ customer_name_placeholder_confirmed: z2._default(z2.boolean(), false),
1838
+ customer_name_placeholder_confirmed_at: z2.nullable(z2.iso.datetime({ offset: true })),
1839
+ customer_phone: z2.nullable(z2.string()),
1840
+ description: z2.nullable(z2.string()),
1765
1841
  environment: zTrackingEnvironment,
1766
- external_id: z.nullable(z.string()),
1767
- id: z.uuid(),
1768
- items: z.array(zSaleItemEntitySchema),
1769
- metadata: z.nullable(z.record(z.string(), z.unknown())),
1770
- occurred_at: z.iso.datetime({ offset: true }),
1771
- service_id: z.nullable(z.uuid()),
1772
- service_key: z.nullable(z.string()),
1773
- service_label: z.nullable(z.string()),
1774
- services: z.array(zSaleServiceEntitySchema),
1775
- sms_automation: z.nullable(zSaleSmsStatusSchema),
1776
- sms_consent: z._default(z.boolean(), false),
1777
- sms_consent_granted_at: z.nullable(z.iso.datetime({ offset: true })),
1778
- updated_at: z.iso.datetime({ offset: true }),
1779
- writeback: z.nullable(zSaleWritebackStatusSchema)
1842
+ external_id: z2.nullable(z2.string()),
1843
+ id: z2.uuid(),
1844
+ items: z2.array(zSaleItemEntitySchema),
1845
+ metadata: z2.nullable(z2.record(z2.string(), z2.unknown())),
1846
+ occurred_at: z2.iso.datetime({ offset: true }),
1847
+ service_id: z2.nullable(z2.uuid()),
1848
+ service_key: z2.nullable(z2.string()),
1849
+ service_label: z2.nullable(z2.string()),
1850
+ services: z2.array(zSaleServiceEntitySchema),
1851
+ sms_automation: z2.nullable(zSaleSmsStatusSchema),
1852
+ sms_consent: z2._default(z2.boolean(), false),
1853
+ sms_consent_granted_at: z2.nullable(z2.iso.datetime({ offset: true })),
1854
+ updated_at: z2.iso.datetime({ offset: true }),
1855
+ writeback: z2.nullable(zSaleWritebackStatusSchema)
1780
1856
  });
1781
1857
 
1782
1858
  // ../tracking-core/src/resources/sales/schema.ts
@@ -1784,11 +1860,11 @@ var saleItemSchema = zSaleItemInputSchema;
1784
1860
  var saleServiceSchema = zSaleServiceInputSchema;
1785
1861
  var currencySchema = zSupportedCurrency;
1786
1862
  var SUPPORTED_CURRENCIES = currencySchema.options;
1787
- var centsSchema = z2.int().check(z2.gte(0));
1788
- var metadataSchema = z2.record(z2.string(), z2.unknown());
1789
- var customerNameSchema = z2.string().check(z2.maxLength(200));
1790
- var customerPhoneSchema = z2.string().check(z2.maxLength(64));
1791
- var customerEmailSchema = z2.email().check(z2.maxLength(320));
1863
+ var centsSchema = z3.int().check(z3.gte(0));
1864
+ var metadataSchema = z3.record(z3.string(), z3.unknown());
1865
+ var customerNameSchema = z3.string().check(z3.maxLength(200));
1866
+ var customerPhoneSchema = z3.string().check(z3.maxLength(64));
1867
+ var customerEmailSchema = z3.email().check(z3.maxLength(320));
1792
1868
  function addIssue(ctx, path, message) {
1793
1869
  ctx.issues.push({ code: "custom", input: ctx.value, path, message });
1794
1870
  }
@@ -1822,24 +1898,24 @@ function refineServiceXor(val, ctx, { requireAmount }) {
1822
1898
  );
1823
1899
  }
1824
1900
  }
1825
- var saleCreateSchema = z2.extend(zSaleCreateSchema, { items: z2._default(z2.array(saleItemSchema), []) }).check((ctx) => refineServiceXor(ctx.value, ctx, { requireAmount: true }));
1826
- var saleUpdateSchema = z2.strictObject({
1827
- description: z2.nullish(z2.string()),
1828
- service: z2.nullish(z2.string()),
1829
- services: z2.nullish(z2.array(saleServiceSchema)),
1830
- currency: z2.optional(currencySchema),
1831
- amount_total_cents: z2.optional(centsSchema),
1832
- occurred_at: z2.optional(z2.iso.datetime()),
1833
- items: z2.optional(z2.array(saleItemSchema)),
1834
- metadata: z2.nullish(metadataSchema),
1835
- customer_name: z2.nullish(customerNameSchema),
1901
+ var saleCreateSchema = z3.extend(zSaleCreateSchema, { items: z3._default(z3.array(saleItemSchema), []) }).check((ctx) => refineServiceXor(ctx.value, ctx, { requireAmount: true }));
1902
+ var saleUpdateSchema = z3.strictObject({
1903
+ description: z3.nullish(z3.string()),
1904
+ service: z3.nullish(z3.string()),
1905
+ services: z3.nullish(z3.array(saleServiceSchema)),
1906
+ currency: z3.optional(currencySchema),
1907
+ amount_total_cents: z3.optional(centsSchema),
1908
+ occurred_at: z3.optional(z3.iso.datetime()),
1909
+ items: z3.optional(z3.array(saleItemSchema)),
1910
+ metadata: z3.nullish(metadataSchema),
1911
+ customer_name: z3.nullish(customerNameSchema),
1836
1912
  // Re-attest when changing a filler-looking name; the server clears the
1837
1913
  // prior attestation whenever `customer_name` changes.
1838
- customer_name_placeholder_confirmed: z2.optional(z2.boolean()),
1839
- customer_phone: z2.nullish(customerPhoneSchema),
1840
- customer_email: z2.nullish(customerEmailSchema),
1914
+ customer_name_placeholder_confirmed: z3.optional(z3.boolean()),
1915
+ customer_phone: z3.nullish(customerPhoneSchema),
1916
+ customer_email: z3.nullish(customerEmailSchema),
1841
1917
  // NOT NULL server-side: omit to leave unchanged (explicit null is rejected).
1842
- sms_consent: z2.optional(z2.boolean())
1918
+ sms_consent: z3.optional(z3.boolean())
1843
1919
  }).check((ctx) => refineServiceXor(ctx.value, ctx, { requireAmount: false }));
1844
1920
  var TRACKING_RANGES = ["24h", "7d", "30d"];
1845
1921
  var NAMED_RANGES = [