@replohq/sdk 1.21.1 → 2.0.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 (119) 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/hooks/use-product-viewed-analytics.d.ts +1 -17
  16. package/analytics/hooks/use-product-viewed-analytics.js +5 -14
  17. package/analytics/legacy-checkout.d.ts +2 -0
  18. package/analytics/legacy-checkout.js +26 -0
  19. package/analytics/sinks/converge-event-mapper.d.ts +10 -11
  20. package/analytics/sinks/converge-event-mapper.js +50 -133
  21. package/analytics/sinks/converge-sink.d.ts +8 -7
  22. package/analytics/sinks/converge-sink.js +21 -3
  23. package/analytics/sinks/elevar-sink.d.ts +9 -7
  24. package/analytics/sinks/elevar-sink.js +37 -128
  25. package/analytics/sinks/ga4-sink.d.ts +9 -8
  26. package/analytics/sinks/ga4-sink.js +9 -8
  27. package/analytics/sinks/intelligems-sink.d.ts +9 -8
  28. package/analytics/sinks/intelligems-sink.js +3 -1
  29. package/analytics/sinks/meta-sink.d.ts +5 -4
  30. package/analytics/sinks/meta-sink.js +7 -3
  31. package/analytics/sinks/northbeam-sink.d.ts +1 -0
  32. package/analytics/sinks/northbeam-sink.js +2 -0
  33. package/analytics/sinks/pinterest-sink.d.ts +7 -6
  34. package/analytics/sinks/pinterest-sink.js +14 -20
  35. package/analytics/sinks/reddit-sink.d.ts +8 -7
  36. package/analytics/sinks/reddit-sink.js +13 -20
  37. package/analytics/sinks/replo-sink.d.ts +21 -9
  38. package/analytics/sinks/replo-sink.js +37 -39
  39. package/analytics/sinks/snapchat-sink.d.ts +6 -5
  40. package/analytics/sinks/snapchat-sink.js +8 -8
  41. package/analytics/sinks/tiktok-sink.d.ts +8 -7
  42. package/analytics/sinks/tiktok-sink.js +10 -15
  43. package/analytics/sinks/window-sink.d.ts +11 -9
  44. package/analytics/sinks/window-sink.js +5 -1
  45. package/analytics/sinks/x-sink.d.ts +5 -4
  46. package/analytics/sinks/x-sink.js +19 -50
  47. package/analytics/test-fixtures.d.ts +5 -0
  48. package/analytics/test-fixtures.js +18 -0
  49. package/analytics/utils/analytics-products.d.ts +0 -30
  50. package/analytics/utils/analytics-products.js +1 -51
  51. package/analytics/utils/collection-analytics.d.ts +2 -15
  52. package/analytics/utils/collection-analytics.js +14 -18
  53. package/analytics/utils/product-analytics.d.ts +23 -0
  54. package/analytics/utils/product-analytics.js +21 -0
  55. package/cart/hooks/use-add-to-cart.js +1 -1
  56. package/cart/utils/cart-analytics.d.ts +3 -23
  57. package/cart/utils/cart-analytics.js +1 -1
  58. package/cart/utils/cart-utils.js +1 -1
  59. package/cart/utils/variant-to-cart-line.js +1 -1
  60. package/chunk-CKRRL66R.mjs +28 -0
  61. package/{chunk-VVB7BEDE.mjs → chunk-O4QBR4QC.mjs} +9 -4
  62. package/{chunk-EUIVDITZ.mjs → chunk-OPKMOW43.mjs} +1 -1
  63. package/{chunk-C37TXOGI.mjs → chunk-PSYP2DYM.mjs} +1 -1
  64. package/{chunk-ACQS4AG5.mjs → chunk-TTEBDCWT.mjs} +272 -109
  65. package/{chunk-HFKL4ZR5.mjs → chunk-XGXJOHUY.mjs} +2 -1
  66. package/{chunk-AQG3256R.mjs → chunk-XSMYSAKY.mjs} +0 -26
  67. package/{chunk-SSBIMQES.mjs → chunk-XWWFRIXV.mjs} +36 -99
  68. package/chunk-ZPDXVFCR.mjs +66 -0
  69. package/hooks/use-formatted-price.js +1 -1
  70. package/lib/buildMetadata.js +3 -3
  71. package/loaders/collection-loader.js +8 -6
  72. package/loaders/collection-products-loader.js +8 -6
  73. package/loaders/contentful-entries-loader.js +5 -3
  74. package/loaders/contentful-entry-loader.js +5 -3
  75. package/loaders/integration-loader-schemas.d.ts +260 -0
  76. package/loaders/integration-loader-schemas.js +55 -0
  77. package/loaders/invoke-loader.d.ts +5 -0
  78. package/loaders/invoke-loader.js +1 -1
  79. package/loaders/judgeme-review-aggregate-loader.d.ts +1 -1
  80. package/loaders/judgeme-review-aggregate-loader.js +10 -6
  81. package/loaders/judgeme-reviews-loader.d.ts +1 -1
  82. package/loaders/judgeme-reviews-loader.js +5 -3
  83. package/loaders/kaching-bundles-loader.js +5 -3
  84. package/loaders/levanta-product-loader.js +8 -6
  85. package/loaders/loox-review-aggregate-loader.d.ts +1 -1
  86. package/loaders/loox-review-aggregate-loader.js +10 -6
  87. package/loaders/loox-reviews-loader.d.ts +1 -1
  88. package/loaders/loox-reviews-loader.js +8 -6
  89. package/loaders/metaobject-loader.js +5 -3
  90. package/loaders/metaobjects-loader.js +5 -3
  91. package/loaders/okendo-review-aggregate-loader.d.ts +2 -7
  92. package/loaders/okendo-review-aggregate-loader.js +8 -12
  93. package/loaders/okendo-reviews-loader.d.ts +2 -42
  94. package/loaders/okendo-reviews-loader.js +5 -8
  95. package/loaders/product-loader.js +5 -3
  96. package/loaders/rebuy-recommendations-loader.d.ts +2 -167
  97. package/loaders/rebuy-recommendations-loader.js +8 -10
  98. package/loaders/reviews-io-review-aggregate-loader.d.ts +1 -1
  99. package/loaders/reviews-io-review-aggregate-loader.js +5 -3
  100. package/loaders/reviews-io-reviews-loader.d.ts +1 -1
  101. package/loaders/reviews-io-reviews-loader.js +7 -3
  102. package/loaders/shopify-integration-details-loader.js +10 -6
  103. package/loaders/smile-earning-rules-loader.d.ts +2 -8
  104. package/loaders/smile-earning-rules-loader.js +8 -16
  105. package/loaders/smile-rewards-loader.d.ts +2 -8
  106. package/loaders/smile-rewards-loader.js +8 -16
  107. package/loaders/smile-vip-tiers-loader.d.ts +2 -7
  108. package/loaders/smile-vip-tiers-loader.js +8 -15
  109. package/loaders/statsig-experiment-loader.js +5 -3
  110. package/loaders/yotpo-review-aggregate-loader.d.ts +1 -1
  111. package/loaders/yotpo-review-aggregate-loader.js +10 -6
  112. package/loaders/yotpo-reviews-loader.d.ts +1 -1
  113. package/loaders/yotpo-reviews-loader.js +5 -3
  114. package/money.d.ts +1 -1
  115. package/money.js +1 -1
  116. package/next/config.js +4 -0
  117. package/next/image-loader.js +3 -3
  118. package/package.json +8 -4
  119. package/chunk-CQYCPDPI.mjs +0 -166
@@ -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 {
@@ -1,14 +1,15 @@
1
- import type { AnalyticsSink, DataPayload, PurchasePayload } from "../analytics-sink";
1
+ import type { AnalyticsSink, CartLineEventPayload, CheckoutStartedPayload, ClickPayload, LegacyCheckoutStartedPayload, ProductViewedPayload, PurchasePayload } from "../analytics-sink";
2
2
  export declare class SnapchatSink 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
+ 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 SnapchatSink {
3
4
  track;
@@ -11,6 +12,8 @@ class SnapchatSink {
11
12
  "Snapchat"
12
13
  );
13
14
  }
15
+ async customEvent() {
16
+ }
14
17
  async pageView() {
15
18
  this.track("PAGE_VIEW");
16
19
  }
@@ -26,20 +29,16 @@ class SnapchatSink {
26
29
  }
27
30
  async productViewed({ data }) {
28
31
  this.track("VIEW_CONTENT", {
29
- item_ids: data.product_id ? [data.product_id] : void 0,
30
32
  price: data.price,
31
33
  currency: data.currency,
32
- item_category: data.category,
33
34
  ...data
34
35
  });
35
36
  }
36
37
  async addToCart({ data }) {
37
38
  this.track("ADD_CART", {
38
- item_ids: data.product_id ? [data.product_id] : void 0,
39
39
  price: data.price,
40
- num_items: data.quantity ?? 1,
40
+ num_items: data.quantity,
41
41
  currency: data.currency,
42
- item_category: data.category,
43
42
  ...data
44
43
  });
45
44
  }
@@ -47,11 +46,12 @@ class SnapchatSink {
47
46
  }
48
47
  async viewCart() {
49
48
  }
50
- async startCheckout({ data }) {
49
+ async startCheckout(payload) {
50
+ const data = toCheckoutStartedData(payload.data);
51
51
  this.track("START_CHECKOUT", {
52
52
  currency: data.currency,
53
- number_items: data.quantity,
54
- price: data.price,
53
+ number_items: data.itemCount,
54
+ price: data.total,
55
55
  ...data
56
56
  });
57
57
  }
@@ -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 TikTokSink 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 TikTokSink {
8
6
  track;
@@ -16,6 +14,8 @@ class TikTokSink {
16
14
  "TikTok"
17
15
  );
18
16
  }
17
+ async customEvent() {
18
+ }
19
19
  async pageView() {
20
20
  this.track("PageView");
21
21
  }
@@ -33,21 +33,16 @@ class TikTokSink {
33
33
  async productViewed({ data }) {
34
34
  this.track("ViewContent", {
35
35
  content_type: "product",
36
- content_id: data.product_id,
37
36
  value: data.price,
38
37
  currency: data.currency,
39
- content_category: data.category,
40
38
  ...data
41
39
  });
42
40
  }
43
41
  async addToCart({ data }) {
44
42
  this.track("AddToCart", {
45
43
  content_type: "product",
46
- content_id: data.product_id,
47
44
  value: data.price,
48
45
  currency: data.currency,
49
- quantity: data.quantity ?? 1,
50
- content_category: data.category,
51
46
  ...data
52
47
  });
53
48
  }
@@ -59,23 +54,23 @@ class TikTokSink {
59
54
  ...data
60
55
  });
61
56
  }
62
- async startCheckout({ data }) {
57
+ async startCheckout(payload) {
58
+ const data = toCheckoutStartedData(payload.data);
63
59
  this.track("InitiateCheckout", {
64
- value: data.price,
60
+ value: data.total,
65
61
  currency: data.currency,
66
62
  content_type: "product",
67
63
  ...data
68
64
  });
69
65
  }
70
66
  async viewCollection({ data }) {
71
- const { products, rest } = splitCollectionProducts(data);
67
+ const { products, ...rest } = data;
72
68
  this.track("ViewContent", {
73
69
  content_type: "product_group",
74
- content_category: data.category,
75
70
  currency: data.currency,
76
71
  ...products.length > 0 ? {
77
72
  contents: products.map((product) => {
78
- return withoutUndefined({
73
+ return filterUndefined({
79
74
  content_id: legacyResourceId(product.productId),
80
75
  content_type: "product_group",
81
76
  content_name: product.productTitle,
@@ -1,4 +1,5 @@
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
+ import type { PageMetadata } from "../utils/navigation-tracker";
2
3
  /**
3
4
  * Dispatches CustomEvents to the global window object so 3rd-party scripts or
4
5
  * external tools can subscribe to analytics events without coupling directly to
@@ -6,13 +7,14 @@ import type { AnalyticsSink, DataPayload, PurchasePayload } from "../analytics-s
6
7
  */
7
8
  export declare class WindowSink implements AnalyticsSink {
8
9
  private dispatch;
9
- pageView(payload?: any): Promise<void>;
10
+ customEvent(): Promise<void>;
11
+ pageView(payload?: PageMetadata): Promise<void>;
10
12
  purchase(payload: PurchasePayload): Promise<void>;
11
- click(payload: DataPayload): Promise<void>;
12
- productViewed(payload: DataPayload): Promise<void>;
13
- addToCart(payload: DataPayload): Promise<void>;
14
- removeFromCart(payload: DataPayload): Promise<void>;
15
- viewCart(payload: DataPayload): Promise<void>;
16
- startCheckout(payload: DataPayload): Promise<void>;
17
- viewCollection(payload: DataPayload): Promise<void>;
13
+ click(payload: ClickPayload): Promise<void>;
14
+ productViewed(payload: ProductViewedPayload): Promise<void>;
15
+ addToCart(payload: CartLineEventPayload): Promise<void>;
16
+ removeFromCart(payload: CartLineEventPayload): Promise<void>;
17
+ viewCart(payload: CartViewedPayload): Promise<void>;
18
+ startCheckout(payload: CheckoutStartedPayload | LegacyCheckoutStartedPayload): Promise<void>;
19
+ viewCollection(payload: CollectionViewedPayload): Promise<void>;
18
20
  }
@@ -1,3 +1,4 @@
1
+ import { toCheckoutStartedData } from "../legacy-checkout";
1
2
  class WindowSink {
2
3
  dispatch(eventType, payload) {
3
4
  window.dispatchEvent(
@@ -10,6 +11,8 @@ class WindowSink {
10
11
  })
11
12
  );
12
13
  }
14
+ async customEvent() {
15
+ }
13
16
  async pageView(payload) {
14
17
  this.dispatch("page_viewed", payload);
15
18
  }
@@ -32,7 +35,8 @@ class WindowSink {
32
35
  this.dispatch("cart_viewed", payload);
33
36
  }
34
37
  async startCheckout(payload) {
35
- this.dispatch("checkout_started", payload);
38
+ const data = toCheckoutStartedData(payload.data);
39
+ this.dispatch("checkout_started", { data });
36
40
  }
37
41
  async viewCollection(payload) {
38
42
  this.dispatch("collection_viewed", payload);
@@ -1,5 +1,5 @@
1
1
  import type { XPixelEvents } from "../../_vendor/schemas/generated/consent";
2
- import type { AnalyticsSink, DataPayload, PurchasePayload } from "../analytics-sink";
2
+ import type { AnalyticsSink, CartLineEventPayload, CheckoutStartedPayload, LegacyCheckoutStartedPayload, ProductViewedPayload, PurchasePayload } from "../analytics-sink";
3
3
  import type { PageMetadata } from "../utils/navigation-tracker";
4
4
  declare global {
5
5
  interface Window {
@@ -20,13 +20,14 @@ export declare class XSink implements AnalyticsSink {
20
20
  events: XPixelEvents;
21
21
  });
22
22
  private track;
23
+ customEvent(): Promise<void>;
23
24
  pageView(metadata: PageMetadata | undefined): Promise<void>;
24
25
  purchase({ amount, currency, data }: PurchasePayload): Promise<void>;
25
26
  click(): Promise<void>;
26
- productViewed({ data }: DataPayload): Promise<void>;
27
- addToCart({ data }: DataPayload): Promise<void>;
27
+ productViewed({ data }: ProductViewedPayload): Promise<void>;
28
+ addToCart({ data }: CartLineEventPayload): Promise<void>;
28
29
  removeFromCart(): Promise<void>;
29
30
  viewCart(): Promise<void>;
30
- startCheckout({ data }: DataPayload): Promise<void>;
31
+ startCheckout(payload: CheckoutStartedPayload | LegacyCheckoutStartedPayload): Promise<void>;
31
32
  viewCollection(): Promise<void>;
32
33
  }