@replohq/sdk 1.22.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/_vendor/replo-utils/lib/json.mjs +4 -5
  2. package/_vendor/replo-utils/lib/misc.mjs +4 -3
  3. package/_vendor/replo-utils/lib/object.d.ts +16 -1
  4. package/_vendor/replo-utils/lib/object.mjs +3 -4
  5. package/_vendor/schemas/contentEntry.mjs +3 -3
  6. package/_vendor/schemas/contentManifest.mjs +6 -6
  7. package/_vendor/schemas/errors.d.ts +3 -43
  8. package/_vendor/schemas/{money.d.ts → moneyFormat.d.ts} +1 -8
  9. package/_vendor/schemas/{money.mjs → moneyFormat.mjs} +5 -16
  10. package/_vendor/schemas/reploError.d.ts +43 -0
  11. package/_vendor/schemas/routing/locale.mjs +6 -4
  12. package/_vendor/schemas/routing/rules.mjs +6 -4
  13. package/analytics/analytics-sink.d.ts +126 -14
  14. package/analytics/combine-sinks.js +36 -13
  15. package/analytics/get-analytics-sinks.js +6 -4
  16. package/analytics/hooks/use-product-viewed-analytics.d.ts +1 -17
  17. package/analytics/hooks/use-product-viewed-analytics.js +5 -14
  18. package/analytics/legacy-checkout.d.ts +2 -0
  19. package/analytics/legacy-checkout.js +26 -0
  20. package/analytics/sinks/converge-event-mapper.d.ts +10 -11
  21. package/analytics/sinks/converge-event-mapper.js +50 -133
  22. package/analytics/sinks/converge-sink.d.ts +8 -7
  23. package/analytics/sinks/converge-sink.js +21 -3
  24. package/analytics/sinks/elevar-sink.d.ts +9 -7
  25. package/analytics/sinks/elevar-sink.js +37 -128
  26. package/analytics/sinks/ga4-sink.d.ts +9 -8
  27. package/analytics/sinks/ga4-sink.js +9 -8
  28. package/analytics/sinks/intelligems-sink.d.ts +9 -8
  29. package/analytics/sinks/intelligems-sink.js +3 -1
  30. package/analytics/sinks/meta-sink.d.ts +5 -4
  31. package/analytics/sinks/meta-sink.js +7 -3
  32. package/analytics/sinks/northbeam-sink.d.ts +1 -0
  33. package/analytics/sinks/northbeam-sink.js +2 -0
  34. package/analytics/sinks/pinterest-sink.d.ts +7 -6
  35. package/analytics/sinks/pinterest-sink.js +14 -20
  36. package/analytics/sinks/reddit-sink.d.ts +8 -7
  37. package/analytics/sinks/reddit-sink.js +13 -20
  38. package/analytics/sinks/replo-sink.d.ts +21 -9
  39. package/analytics/sinks/replo-sink.js +37 -39
  40. package/analytics/sinks/segment-event-mapper.d.ts +86 -0
  41. package/analytics/sinks/segment-event-mapper.js +71 -0
  42. package/analytics/sinks/segment-sink.d.ts +23 -0
  43. package/analytics/sinks/segment-sink.js +84 -0
  44. package/analytics/sinks/snapchat-sink.d.ts +6 -5
  45. package/analytics/sinks/snapchat-sink.js +8 -8
  46. package/analytics/sinks/tiktok-sink.d.ts +8 -7
  47. package/analytics/sinks/tiktok-sink.js +10 -15
  48. package/analytics/sinks/window-sink.d.ts +11 -9
  49. package/analytics/sinks/window-sink.js +5 -1
  50. package/analytics/sinks/x-sink.d.ts +5 -4
  51. package/analytics/sinks/x-sink.js +19 -50
  52. package/analytics/test-fixtures.d.ts +5 -0
  53. package/analytics/test-fixtures.js +18 -0
  54. package/analytics/utils/analytics-products.d.ts +0 -30
  55. package/analytics/utils/analytics-products.js +1 -51
  56. package/analytics/utils/collection-analytics.d.ts +2 -15
  57. package/analytics/utils/collection-analytics.js +14 -18
  58. package/analytics/utils/product-analytics.d.ts +23 -0
  59. package/analytics/utils/product-analytics.js +21 -0
  60. package/cart/hooks/use-add-to-cart.js +1 -1
  61. package/cart/utils/cart-analytics.d.ts +3 -23
  62. package/cart/utils/cart-analytics.js +1 -1
  63. package/cart/utils/cart-utils.js +1 -1
  64. package/cart/utils/variant-to-cart-line.js +1 -1
  65. package/chunk-CKRRL66R.mjs +28 -0
  66. package/{chunk-VVB7BEDE.mjs → chunk-O4QBR4QC.mjs} +9 -4
  67. package/{chunk-EUIVDITZ.mjs → chunk-OPKMOW43.mjs} +1 -1
  68. package/{chunk-C37TXOGI.mjs → chunk-PSYP2DYM.mjs} +1 -1
  69. package/{chunk-ACQS4AG5.mjs → chunk-TTEBDCWT.mjs} +272 -109
  70. package/{chunk-HFKL4ZR5.mjs → chunk-XGXJOHUY.mjs} +2 -1
  71. package/{chunk-AQG3256R.mjs → chunk-XSMYSAKY.mjs} +0 -26
  72. package/{chunk-SSBIMQES.mjs → chunk-XWWFRIXV.mjs} +36 -99
  73. package/chunk-ZPDXVFCR.mjs +66 -0
  74. package/hooks/use-formatted-price.js +1 -1
  75. package/lib/buildMetadata.js +3 -3
  76. package/loaders/collection-loader.js +8 -6
  77. package/loaders/collection-products-loader.js +8 -6
  78. package/loaders/contentful-entries-loader.js +5 -3
  79. package/loaders/contentful-entry-loader.js +5 -3
  80. package/loaders/integration-loader-schemas.d.ts +260 -0
  81. package/loaders/integration-loader-schemas.js +55 -0
  82. package/loaders/invoke-loader.d.ts +5 -0
  83. package/loaders/invoke-loader.js +1 -1
  84. package/loaders/judgeme-review-aggregate-loader.d.ts +1 -1
  85. package/loaders/judgeme-review-aggregate-loader.js +10 -6
  86. package/loaders/judgeme-reviews-loader.d.ts +1 -1
  87. package/loaders/judgeme-reviews-loader.js +5 -3
  88. package/loaders/kaching-bundles-loader.js +5 -3
  89. package/loaders/levanta-product-loader.js +8 -6
  90. package/loaders/loox-review-aggregate-loader.d.ts +1 -1
  91. package/loaders/loox-review-aggregate-loader.js +10 -6
  92. package/loaders/loox-reviews-loader.d.ts +1 -1
  93. package/loaders/loox-reviews-loader.js +8 -6
  94. package/loaders/metaobject-loader.js +5 -3
  95. package/loaders/metaobjects-loader.js +5 -3
  96. package/loaders/okendo-review-aggregate-loader.d.ts +2 -7
  97. package/loaders/okendo-review-aggregate-loader.js +8 -12
  98. package/loaders/okendo-reviews-loader.d.ts +2 -42
  99. package/loaders/okendo-reviews-loader.js +5 -8
  100. package/loaders/product-loader.js +5 -3
  101. package/loaders/rebuy-recommendations-loader.d.ts +2 -167
  102. package/loaders/rebuy-recommendations-loader.js +8 -10
  103. package/loaders/reviews-io-review-aggregate-loader.d.ts +1 -1
  104. package/loaders/reviews-io-review-aggregate-loader.js +5 -3
  105. package/loaders/reviews-io-reviews-loader.d.ts +1 -1
  106. package/loaders/reviews-io-reviews-loader.js +7 -3
  107. package/loaders/shopify-integration-details-loader.js +10 -6
  108. package/loaders/smile-earning-rules-loader.d.ts +2 -8
  109. package/loaders/smile-earning-rules-loader.js +8 -16
  110. package/loaders/smile-rewards-loader.d.ts +2 -8
  111. package/loaders/smile-rewards-loader.js +8 -16
  112. package/loaders/smile-vip-tiers-loader.d.ts +2 -7
  113. package/loaders/smile-vip-tiers-loader.js +8 -15
  114. package/loaders/statsig-experiment-loader.js +5 -3
  115. package/loaders/yotpo-review-aggregate-loader.d.ts +1 -1
  116. package/loaders/yotpo-review-aggregate-loader.js +10 -6
  117. package/loaders/yotpo-reviews-loader.d.ts +1 -1
  118. package/loaders/yotpo-reviews-loader.js +5 -3
  119. package/money.d.ts +1 -1
  120. package/money.js +1 -1
  121. package/package.json +8 -4
  122. package/chunk-CQYCPDPI.mjs +0 -166
@@ -1,5 +1,6 @@
1
- import type { AnalyticsSink, CustomEventPayload, DataPayload, PurchasePayload } from "../analytics-sink";
1
+ import type { AnalyticsSink, CartLineEventPayload, CartViewedPayload, CheckoutStartedPayload, ClickPayload, CollectionViewedPayload, CustomEventPayload, LegacyCheckoutStartedPayload, ProductViewedPayload, PurchasePayload } from "../analytics-sink";
2
2
  import type { PageMetadata } from "../utils/navigation-tracker";
3
+ /** Each mapping receives the event's typed payload. */
3
4
  export type IntelligemsEventMappings = {
4
5
  [Method in Exclude<keyof AnalyticsSink, "customEvent">]?: (...args: Parameters<AnalyticsSink[Method]>) => CustomEventPayload | null;
5
6
  };
@@ -19,11 +20,11 @@ export declare class IntelligemsSink implements AnalyticsSink {
19
20
  private send;
20
21
  pageView(metadata?: PageMetadata): Promise<void>;
21
22
  purchase(payload: PurchasePayload): Promise<void>;
22
- click(payload: DataPayload): Promise<void>;
23
- productViewed(payload: DataPayload): Promise<void>;
24
- addToCart(payload: DataPayload): Promise<void>;
25
- removeFromCart(payload: DataPayload): Promise<void>;
26
- viewCart(payload: DataPayload): Promise<void>;
27
- startCheckout(payload: DataPayload): Promise<void>;
28
- viewCollection(payload: DataPayload): Promise<void>;
23
+ click(payload: ClickPayload): Promise<void>;
24
+ productViewed(payload: ProductViewedPayload): Promise<void>;
25
+ addToCart(payload: CartLineEventPayload): Promise<void>;
26
+ removeFromCart(payload: CartLineEventPayload): Promise<void>;
27
+ viewCart(payload: CartViewedPayload): Promise<void>;
28
+ startCheckout(payload: CheckoutStartedPayload | LegacyCheckoutStartedPayload): Promise<void>;
29
+ viewCollection(payload: CollectionViewedPayload): Promise<void>;
29
30
  }
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { consentStore, isConsentAllowed } from "../../consent/consent-store";
3
+ import { toCheckoutStartedData } from "../legacy-checkout";
3
4
  class IntelligemsSink {
4
5
  constructor(options) {
5
6
  this.options = options;
@@ -55,7 +56,8 @@ class IntelligemsSink {
55
56
  await this.send(this.options.events?.viewCart?.(payload));
56
57
  }
57
58
  async startCheckout(payload) {
58
- await this.send(this.options.events?.startCheckout?.(payload));
59
+ const data = toCheckoutStartedData(payload.data);
60
+ await this.send(this.options.events?.startCheckout?.({ data }));
59
61
  }
60
62
  async viewCollection(payload) {
61
63
  await this.send(this.options.events?.viewCollection?.(payload));
@@ -1,14 +1,15 @@
1
- import type { AnalyticsSink, DataPayload, PurchasePayload } from "../analytics-sink";
1
+ import type { AnalyticsSink, CartLineEventPayload, CheckoutStartedPayload, LegacyCheckoutStartedPayload, ProductViewedPayload, PurchasePayload } from "../analytics-sink";
2
2
  export declare class MetaSink implements AnalyticsSink {
3
3
  private track;
4
4
  constructor();
5
+ customEvent(): Promise<void>;
5
6
  pageView(): Promise<void>;
6
7
  purchase({ amount, currency, data }: PurchasePayload): Promise<void>;
7
8
  click(): Promise<void>;
8
- productViewed({ data }: DataPayload): Promise<void>;
9
- addToCart({ data }: DataPayload): Promise<void>;
9
+ productViewed({ data }: ProductViewedPayload): Promise<void>;
10
+ addToCart({ data }: CartLineEventPayload): Promise<void>;
10
11
  removeFromCart(): Promise<void>;
11
12
  viewCart(): Promise<void>;
12
- startCheckout({ data }: DataPayload): Promise<void>;
13
+ startCheckout(payload: CheckoutStartedPayload | LegacyCheckoutStartedPayload): Promise<void>;
13
14
  viewCollection(): Promise<void>;
14
15
  }
@@ -1,3 +1,4 @@
1
+ import { toCheckoutStartedData } from "../legacy-checkout";
1
2
  import { createEventQueue } from "../utils/analytics-utils";
2
3
  class MetaSink {
3
4
  track;
@@ -11,6 +12,8 @@ class MetaSink {
11
12
  "Meta"
12
13
  );
13
14
  }
15
+ async customEvent() {
16
+ }
14
17
  async pageView() {
15
18
  this.track("PageView");
16
19
  }
@@ -37,10 +40,11 @@ class MetaSink {
37
40
  }
38
41
  async viewCart() {
39
42
  }
40
- async startCheckout({ data }) {
43
+ async startCheckout(payload) {
44
+ const data = toCheckoutStartedData(payload.data);
41
45
  this.track("InitiateCheckout", {
42
- value: data.totalPrice?.amount,
43
- currency: data.currencyCode,
46
+ value: data.total,
47
+ currency: data.currency,
44
48
  ...data
45
49
  });
46
50
  }
@@ -6,6 +6,7 @@ import type { PageMetadata } from "../utils/navigation-tracker";
6
6
  */
7
7
  export declare class NorthbeamSink implements AnalyticsSink {
8
8
  private call;
9
+ customEvent(): Promise<void>;
9
10
  pageView(metadata?: PageMetadata): Promise<void>;
10
11
  purchase(): Promise<void>;
11
12
  click(): Promise<void>;
@@ -9,6 +9,8 @@ class NorthbeamSink {
9
9
  call = createMethodQueue(northbeamPixel, {
10
10
  queueName: "Northbeam"
11
11
  });
12
+ async customEvent() {
13
+ }
12
14
  async pageView(metadata) {
13
15
  if (metadata?.navigationType === "initial") {
14
16
  return;
@@ -1,14 +1,15 @@
1
- import type { AnalyticsSink, DataPayload, PurchasePayload } from "../analytics-sink";
1
+ import type { AnalyticsSink, CartLineEventPayload, CheckoutStartedPayload, ClickPayload, CollectionViewedPayload, LegacyCheckoutStartedPayload, ProductViewedPayload, PurchasePayload } from "../analytics-sink";
2
2
  export declare class PinterestSink implements AnalyticsSink {
3
3
  private track;
4
4
  constructor();
5
+ customEvent(): Promise<void>;
5
6
  pageView(): Promise<void>;
6
7
  purchase({ amount, currency, data }: PurchasePayload): Promise<void>;
7
- click({ data }: DataPayload): Promise<void>;
8
- productViewed({ data }: DataPayload): Promise<void>;
9
- addToCart({ data }: DataPayload): Promise<void>;
8
+ click({ data }: ClickPayload): Promise<void>;
9
+ productViewed({ data }: ProductViewedPayload): Promise<void>;
10
+ addToCart({ data }: CartLineEventPayload): Promise<void>;
10
11
  removeFromCart(): Promise<void>;
11
12
  viewCart(): Promise<void>;
12
- startCheckout({ data }: DataPayload): Promise<void>;
13
- viewCollection({ data }: DataPayload): Promise<void>;
13
+ startCheckout(payload: CheckoutStartedPayload | LegacyCheckoutStartedPayload): Promise<void>;
14
+ viewCollection({ data }: CollectionViewedPayload): Promise<void>;
14
15
  }
@@ -1,8 +1,6 @@
1
- import {
2
- legacyResourceId,
3
- splitCollectionProducts,
4
- withoutUndefined
5
- } from "../utils/analytics-products";
1
+ import { filterUndefined } from "../../_vendor/replo-utils/lib/object.mjs";
2
+ import { toCheckoutStartedData } from "../legacy-checkout";
3
+ import { legacyResourceId } from "../utils/analytics-products";
6
4
  import { createEventQueue } from "../utils/analytics-utils";
7
5
  class PinterestSink {
8
6
  track;
@@ -16,6 +14,8 @@ class PinterestSink {
16
14
  "Pinterest"
17
15
  );
18
16
  }
17
+ async customEvent() {
18
+ }
19
19
  async pageView() {
20
20
  this.track("pagevisit");
21
21
  }
@@ -23,8 +23,8 @@ class PinterestSink {
23
23
  this.track("checkout", {
24
24
  value: amount,
25
25
  currency,
26
- order_quantity: data.quantity ?? 1,
27
- order_id: data.order_id,
26
+ order_quantity: data.itemCount ?? data.lineItems?.reduce((sum, line) => sum + line.quantity, 0) ?? 1,
27
+ order_id: data.orderId,
28
28
  ...data
29
29
  });
30
30
  }
@@ -33,9 +33,6 @@ class PinterestSink {
33
33
  }
34
34
  async productViewed({ data }) {
35
35
  this.track("pagevisit", {
36
- product_id: data.product_id,
37
- product_category: data.category,
38
- product_name: data.name,
39
36
  product_price: data.price,
40
37
  currency: data.currency,
41
38
  ...data
@@ -45,10 +42,7 @@ class PinterestSink {
45
42
  this.track("addtocart", {
46
43
  value: data.price,
47
44
  currency: data.currency,
48
- order_quantity: data.quantity ?? 1,
49
- product_id: data.product_id,
50
- product_category: data.category,
51
- product_name: data.name,
45
+ order_quantity: data.quantity,
52
46
  ...data
53
47
  });
54
48
  }
@@ -57,22 +51,22 @@ class PinterestSink {
57
51
  async viewCart() {
58
52
  this.track("pagevisit");
59
53
  }
60
- async startCheckout({ data }) {
54
+ async startCheckout(payload) {
55
+ const data = toCheckoutStartedData(payload.data);
61
56
  this.track("checkout", {
62
- value: data.price,
57
+ value: data.total,
63
58
  currency: data.currency,
64
- order_quantity: data.quantity,
59
+ order_quantity: data.itemCount,
65
60
  ...data
66
61
  });
67
62
  }
68
63
  async viewCollection({ data }) {
69
- const { products, rest } = splitCollectionProducts(data);
64
+ const { products, ...rest } = data;
70
65
  this.track("viewcategory", {
71
- product_category: data.category,
72
66
  currency: data.currency,
73
67
  ...products.length > 0 ? {
74
68
  line_items: products.map((product) => {
75
- return withoutUndefined({
69
+ return filterUndefined({
76
70
  product_id: legacyResourceId(product.productId),
77
71
  product_name: product.productTitle,
78
72
  product_price: product.price,
@@ -1,14 +1,15 @@
1
- import type { AnalyticsSink, DataPayload, PurchasePayload } from "../analytics-sink";
1
+ import type { AnalyticsSink, CartLineEventPayload, CartViewedPayload, CheckoutStartedPayload, ClickPayload, CollectionViewedPayload, LegacyCheckoutStartedPayload, ProductViewedPayload, PurchasePayload } from "../analytics-sink";
2
2
  export declare class RedditSink implements AnalyticsSink {
3
3
  private track;
4
4
  constructor();
5
+ customEvent(): Promise<void>;
5
6
  pageView(): Promise<void>;
6
7
  purchase({ amount, currency, data }: PurchasePayload): Promise<void>;
7
- click({ data }: DataPayload): Promise<void>;
8
- productViewed({ data }: DataPayload): Promise<void>;
9
- addToCart({ data }: DataPayload): Promise<void>;
8
+ click({ data }: ClickPayload): Promise<void>;
9
+ productViewed({ data }: ProductViewedPayload): Promise<void>;
10
+ addToCart({ data }: CartLineEventPayload): Promise<void>;
10
11
  removeFromCart(): Promise<void>;
11
- viewCart({ data }: DataPayload): Promise<void>;
12
- startCheckout({ data }: DataPayload): Promise<void>;
13
- viewCollection({ data }: DataPayload): Promise<void>;
12
+ viewCart({ data }: CartViewedPayload): Promise<void>;
13
+ startCheckout(payload: CheckoutStartedPayload | LegacyCheckoutStartedPayload): Promise<void>;
14
+ viewCollection({ data }: CollectionViewedPayload): Promise<void>;
14
15
  }
@@ -1,8 +1,6 @@
1
- import {
2
- legacyResourceId,
3
- splitCollectionProducts,
4
- withoutUndefined
5
- } from "../utils/analytics-products";
1
+ import { filterUndefined } from "../../_vendor/replo-utils/lib/object.mjs";
2
+ import { toCheckoutStartedData } from "../legacy-checkout";
3
+ import { legacyResourceId } from "../utils/analytics-products";
6
4
  import { createEventQueue } from "../utils/analytics-utils";
7
5
  class RedditSink {
8
6
  track;
@@ -16,6 +14,8 @@ class RedditSink {
16
14
  "Reddit"
17
15
  );
18
16
  }
17
+ async customEvent() {
18
+ }
19
19
  async pageView() {
20
20
  this.track("PageVisit");
21
21
  }
@@ -23,8 +23,8 @@ class RedditSink {
23
23
  this.track("Purchase", {
24
24
  value: amount,
25
25
  currency,
26
- itemCount: data.quantity ?? 1,
27
- transactionId: data.order_id,
26
+ itemCount: data.itemCount ?? data.lineItems?.reduce((sum, line) => sum + line.quantity, 0) ?? 1,
27
+ transactionId: data.orderId,
28
28
  ...data
29
29
  });
30
30
  }
@@ -35,9 +35,6 @@ class RedditSink {
35
35
  this.track("ViewContent", {
36
36
  value: data.price,
37
37
  currency: data.currency,
38
- content_category: data.category,
39
- content_name: data.name,
40
- content_ids: data.product_id ? [data.product_id] : void 0,
41
38
  ...data
42
39
  });
43
40
  }
@@ -45,10 +42,7 @@ class RedditSink {
45
42
  this.track("AddToCart", {
46
43
  value: data.price,
47
44
  currency: data.currency,
48
- itemCount: data.quantity ?? 1,
49
- content_category: data.category,
50
- content_name: data.name,
51
- content_ids: data.product_id ? [data.product_id] : void 0,
45
+ itemCount: data.quantity,
52
46
  ...data
53
47
  });
54
48
  }
@@ -60,23 +54,22 @@ class RedditSink {
60
54
  ...data
61
55
  });
62
56
  }
63
- async startCheckout({ data }) {
57
+ async startCheckout(payload) {
58
+ const data = toCheckoutStartedData(payload.data);
64
59
  this.track("Lead", {
65
- value: data.price,
60
+ value: data.total,
66
61
  currency: data.currency,
67
- itemCount: data.quantity,
68
62
  ...data
69
63
  });
70
64
  }
71
65
  async viewCollection({ data }) {
72
- const { products, rest } = splitCollectionProducts(data);
66
+ const { products, ...rest } = data;
73
67
  this.track("ViewContent", {
74
- content_category: data.category,
75
68
  content_type: "category",
76
69
  currency: data.currency,
77
70
  ...products.length > 0 ? {
78
71
  products: products.map((product) => {
79
- return withoutUndefined({
72
+ return filterUndefined({
80
73
  id: legacyResourceId(product.productId),
81
74
  name: product.productTitle
82
75
  });
@@ -1,14 +1,26 @@
1
- import type { AnalyticsSink, DataPayload, PurchasePayload } from "../analytics-sink";
1
+ import type { AnalyticsSink, CartLineEventPayload, CartViewedPayload, CheckoutStartedPayload, ClickPayload, CollectionViewedPayload, LegacyCheckoutStartedPayload, ProductViewedPayload, PurchasePayload } from "../analytics-sink";
2
+ /** The first-party pixel's client (`analytics-client`), which stores `data` as-is. */
3
+ type ReploPixelAnalytics = Omit<AnalyticsSink, "customEvent" | "pageView"> & {
4
+ pageView(): Promise<void>;
5
+ };
6
+ declare global {
7
+ interface Window {
8
+ ReploPixel?: {
9
+ analyticsInstance: ReploPixelAnalytics | null;
10
+ };
11
+ }
12
+ }
2
13
  export declare class ReploSink implements AnalyticsSink {
3
14
  private forward;
4
- constructor();
15
+ customEvent(): Promise<void>;
5
16
  pageView(): Promise<void>;
6
17
  purchase(payload: PurchasePayload): Promise<void>;
7
- click(payload: DataPayload): Promise<void>;
8
- productViewed(payload: DataPayload): Promise<void>;
9
- addToCart(payload: DataPayload): Promise<void>;
10
- removeFromCart(payload: DataPayload): Promise<void>;
11
- viewCart(payload: DataPayload): Promise<void>;
12
- startCheckout(payload: DataPayload): Promise<void>;
13
- viewCollection(payload: DataPayload): Promise<void>;
18
+ click(payload: ClickPayload): Promise<void>;
19
+ productViewed(payload: ProductViewedPayload): Promise<void>;
20
+ addToCart(payload: CartLineEventPayload): Promise<void>;
21
+ removeFromCart(payload: CartLineEventPayload): Promise<void>;
22
+ viewCart(payload: CartViewedPayload): Promise<void>;
23
+ startCheckout(payload: CheckoutStartedPayload | LegacyCheckoutStartedPayload): Promise<void>;
24
+ viewCollection(payload: CollectionViewedPayload): Promise<void>;
14
25
  }
26
+ export {};
@@ -1,53 +1,51 @@
1
- import { createMethodQueue } from "../utils/analytics-utils";
1
+ import { toCheckoutStartedData } from "../legacy-checkout";
2
+ import { createAnalyticsQueue } from "../utils/analytics-utils";
3
+ function findPixelAnalytics() {
4
+ if (typeof window === "undefined") {
5
+ return null;
6
+ }
7
+ return window.ReploPixel?.analyticsInstance ?? null;
8
+ }
2
9
  class ReploSink {
3
- forward;
4
- constructor() {
5
- this.forward = createMethodQueue(
6
- () => {
7
- if (typeof window === "undefined") {
8
- return null;
9
- }
10
- const pixel = window.ReploPixel;
11
- return pixel?.analyticsInstance ?? null;
12
- },
13
- { queueName: "Replo analytics sink" }
14
- );
10
+ forward = createAnalyticsQueue({
11
+ isReady: () => Boolean(findPixelAnalytics()),
12
+ send: (call) => {
13
+ const pixel = findPixelAnalytics();
14
+ if (pixel) {
15
+ void call(pixel);
16
+ }
17
+ },
18
+ queueName: "Replo analytics sink"
19
+ });
20
+ async customEvent() {
15
21
  }
16
22
  async pageView() {
17
- this.forward("pageView");
18
- return Promise.resolve();
23
+ this.forward((pixel) => pixel.pageView());
19
24
  }
20
- purchase(payload) {
21
- this.forward("purchase", payload);
22
- return Promise.resolve();
25
+ async purchase(payload) {
26
+ this.forward((pixel) => pixel.purchase(payload));
23
27
  }
24
- click(payload) {
25
- this.forward("click", payload);
26
- return Promise.resolve();
28
+ async click(payload) {
29
+ this.forward((pixel) => pixel.click(payload));
27
30
  }
28
- productViewed(payload) {
29
- this.forward("productViewed", payload);
30
- return Promise.resolve();
31
+ async productViewed(payload) {
32
+ this.forward((pixel) => pixel.productViewed(payload));
31
33
  }
32
- addToCart(payload) {
33
- this.forward("addToCart", payload);
34
- return Promise.resolve();
34
+ async addToCart(payload) {
35
+ this.forward((pixel) => pixel.addToCart(payload));
35
36
  }
36
- removeFromCart(payload) {
37
- this.forward("removeFromCart", payload);
38
- return Promise.resolve();
37
+ async removeFromCart(payload) {
38
+ this.forward((pixel) => pixel.removeFromCart(payload));
39
39
  }
40
- viewCart(payload) {
41
- this.forward("viewCart", payload);
42
- return Promise.resolve();
40
+ async viewCart(payload) {
41
+ this.forward((pixel) => pixel.viewCart(payload));
43
42
  }
44
- startCheckout(payload) {
45
- this.forward("startCheckout", payload);
46
- return Promise.resolve();
43
+ async startCheckout(payload) {
44
+ const data = toCheckoutStartedData(payload.data);
45
+ this.forward((pixel) => pixel.startCheckout({ data }));
47
46
  }
48
- viewCollection(payload) {
49
- this.forward("viewCollection", payload);
50
- return Promise.resolve();
47
+ async viewCollection(payload) {
48
+ this.forward((pixel) => pixel.viewCollection(payload));
51
49
  }
52
50
  }
53
51
  export {
@@ -0,0 +1,86 @@
1
+ import type { AnalyticsProductLine, CartLineData, CartViewedData, CheckoutStartedData, CollectionViewedData, PurchasePayload } from "../analytics-sink";
2
+ export declare function mapSegmentProduct(line: AnalyticsProductLine, currency: string | undefined): {
3
+ name?: string | undefined;
4
+ variant?: string | undefined;
5
+ variant_id?: string | undefined;
6
+ sku?: string | undefined;
7
+ price?: number | undefined;
8
+ quantity?: number | undefined;
9
+ currency?: string | undefined;
10
+ product_id: string;
11
+ };
12
+ export declare function mapSegmentCartLine(line: CartLineData): {
13
+ name?: string | undefined;
14
+ variant?: string | undefined;
15
+ variant_id?: string | undefined;
16
+ sku?: string | undefined;
17
+ price?: number | undefined;
18
+ quantity?: number | undefined;
19
+ currency?: string | undefined;
20
+ product_id: string;
21
+ };
22
+ export declare function mapSegmentCartViewed(data: CartViewedData): {
23
+ currency?: string | undefined;
24
+ value: number;
25
+ products: {
26
+ name?: string | undefined;
27
+ variant?: string | undefined;
28
+ variant_id?: string | undefined;
29
+ sku?: string | undefined;
30
+ price?: number | undefined;
31
+ quantity?: number | undefined;
32
+ currency?: string | undefined;
33
+ product_id: string;
34
+ }[];
35
+ };
36
+ export declare function mapSegmentCheckoutStarted(data: CheckoutStartedData): {
37
+ currency?: string | undefined;
38
+ value: number;
39
+ total: number;
40
+ revenue: number;
41
+ products: {
42
+ name?: string | undefined;
43
+ variant?: string | undefined;
44
+ variant_id?: string | undefined;
45
+ sku?: string | undefined;
46
+ price?: number | undefined;
47
+ quantity?: number | undefined;
48
+ currency?: string | undefined;
49
+ product_id: string;
50
+ }[];
51
+ };
52
+ export declare function mapSegmentProductList(data: CollectionViewedData): {
53
+ category?: string | undefined;
54
+ list_id: string;
55
+ products: {
56
+ name?: string | undefined;
57
+ variant?: string | undefined;
58
+ variant_id?: string | undefined;
59
+ sku?: string | undefined;
60
+ price?: number | undefined;
61
+ quantity?: number | undefined;
62
+ currency?: string | undefined;
63
+ product_id: string;
64
+ }[];
65
+ };
66
+ export declare function mapSegmentOrder({ amount, currency, data }: PurchasePayload): {
67
+ tax?: number | undefined;
68
+ shipping?: number | undefined;
69
+ order_id?: string | undefined;
70
+ discount?: number | undefined;
71
+ coupon?: string | undefined;
72
+ value: number;
73
+ total: number;
74
+ revenue: number;
75
+ currency: string;
76
+ products: {
77
+ name?: string | undefined;
78
+ variant?: string | undefined;
79
+ variant_id?: string | undefined;
80
+ sku?: string | undefined;
81
+ price?: number | undefined;
82
+ quantity?: number | undefined;
83
+ currency?: string | undefined;
84
+ product_id: string;
85
+ }[];
86
+ };
@@ -0,0 +1,71 @@
1
+ import { filterUndefined } from "../../_vendor/replo-utils/lib/object.mjs";
2
+ import { legacyResourceId } from "../utils/analytics-products";
3
+ function mapSegmentProduct(line, currency) {
4
+ return {
5
+ product_id: legacyResourceId(line.productId),
6
+ ...filterUndefined({
7
+ name: line.productTitle,
8
+ variant: line.variantTitle || void 0,
9
+ variant_id: line.variantId ? legacyResourceId(line.variantId) : void 0,
10
+ sku: line.variantSku || void 0,
11
+ price: line.price,
12
+ quantity: line.quantity,
13
+ currency: line.currency ?? currency
14
+ })
15
+ };
16
+ }
17
+ function mapProducts(lines, currency) {
18
+ return lines.map((line) => mapSegmentProduct(line, currency));
19
+ }
20
+ function mapSegmentCartLine(line) {
21
+ return mapSegmentProduct(line, void 0);
22
+ }
23
+ function mapSegmentCartViewed(data) {
24
+ return {
25
+ value: data.subtotal,
26
+ products: mapProducts(data.lineItems, data.currency),
27
+ ...filterUndefined({ currency: data.currency })
28
+ };
29
+ }
30
+ function mapSegmentCheckoutStarted(data) {
31
+ return {
32
+ value: data.total,
33
+ total: data.total,
34
+ revenue: data.subtotal,
35
+ products: mapProducts(data.lineItems, data.currency),
36
+ ...filterUndefined({ currency: data.currency })
37
+ };
38
+ }
39
+ function mapSegmentProductList(data) {
40
+ return {
41
+ list_id: legacyResourceId(data.collectionId),
42
+ products: mapProducts(data.products, data.currency),
43
+ ...filterUndefined({ category: data.collectionTitle })
44
+ };
45
+ }
46
+ function mapSegmentOrder({ amount, currency, data }) {
47
+ const tax = data.totalTax ?? 0;
48
+ const shipping = data.totalShipping ?? 0;
49
+ return {
50
+ value: amount,
51
+ total: amount,
52
+ revenue: Math.round((amount - tax - shipping) * 100) / 100,
53
+ currency,
54
+ products: mapProducts(data.lineItems ?? [], currency),
55
+ ...filterUndefined({
56
+ tax: data.totalTax,
57
+ shipping: data.totalShipping,
58
+ order_id: data.orderId,
59
+ discount: data.totalDiscount,
60
+ coupon: data.discountCodes?.join(",")
61
+ })
62
+ };
63
+ }
64
+ export {
65
+ mapSegmentCartLine,
66
+ mapSegmentCartViewed,
67
+ mapSegmentCheckoutStarted,
68
+ mapSegmentOrder,
69
+ mapSegmentProduct,
70
+ mapSegmentProductList
71
+ };
@@ -0,0 +1,23 @@
1
+ import type { AnalyticsSink, CartLineEventPayload, CartViewedPayload, CheckoutStartedPayload, ClickPayload, CollectionViewedPayload, CustomEventPayload, LegacyCheckoutStartedPayload, ProductViewedPayload, PurchasePayload } from "../analytics-sink";
2
+ import type { PageMetadata } from "../utils/navigation-tracker";
3
+ /**
4
+ * Sends Replo's analytics events to Segment as V2 E-Commerce spec `track`
5
+ * events, so a tracking plan written against the spec ("Product Added",
6
+ * "Order Completed") is met without page-level code. The consent-gated
7
+ * snippet sends the landing pageview; this sink adds a `page` call for each
8
+ * in-site navigation.
9
+ */
10
+ export declare class SegmentSink implements AnalyticsSink {
11
+ private send;
12
+ private track;
13
+ customEvent({ event, properties }: CustomEventPayload): Promise<void>;
14
+ pageView(metadata?: PageMetadata): Promise<void>;
15
+ purchase(payload: PurchasePayload): Promise<void>;
16
+ click({ data }: ClickPayload): Promise<void>;
17
+ productViewed({ data }: ProductViewedPayload): Promise<void>;
18
+ addToCart({ data }: CartLineEventPayload): Promise<void>;
19
+ removeFromCart({ data }: CartLineEventPayload): Promise<void>;
20
+ viewCart({ data }: CartViewedPayload): Promise<void>;
21
+ startCheckout(payload: CheckoutStartedPayload | LegacyCheckoutStartedPayload): Promise<void>;
22
+ viewCollection({ data }: CollectionViewedPayload): Promise<void>;
23
+ }