@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.
- package/_vendor/replo-utils/lib/json.mjs +4 -5
- package/_vendor/replo-utils/lib/misc.mjs +4 -3
- package/_vendor/replo-utils/lib/object.d.ts +16 -1
- package/_vendor/replo-utils/lib/object.mjs +3 -4
- package/_vendor/schemas/contentEntry.mjs +3 -3
- package/_vendor/schemas/contentManifest.mjs +6 -6
- package/_vendor/schemas/errors.d.ts +3 -43
- package/_vendor/schemas/{money.d.ts → moneyFormat.d.ts} +1 -8
- package/_vendor/schemas/{money.mjs → moneyFormat.mjs} +5 -16
- package/_vendor/schemas/reploError.d.ts +43 -0
- package/_vendor/schemas/routing/locale.mjs +6 -4
- package/_vendor/schemas/routing/rules.mjs +6 -4
- package/analytics/analytics-sink.d.ts +126 -14
- package/analytics/combine-sinks.js +36 -13
- package/analytics/get-analytics-sinks.js +6 -4
- package/analytics/hooks/use-product-viewed-analytics.d.ts +1 -17
- package/analytics/hooks/use-product-viewed-analytics.js +5 -14
- package/analytics/legacy-checkout.d.ts +2 -0
- package/analytics/legacy-checkout.js +26 -0
- package/analytics/sinks/converge-event-mapper.d.ts +10 -11
- package/analytics/sinks/converge-event-mapper.js +50 -133
- package/analytics/sinks/converge-sink.d.ts +8 -7
- package/analytics/sinks/converge-sink.js +21 -3
- package/analytics/sinks/elevar-sink.d.ts +9 -7
- package/analytics/sinks/elevar-sink.js +37 -128
- package/analytics/sinks/ga4-sink.d.ts +9 -8
- package/analytics/sinks/ga4-sink.js +9 -8
- package/analytics/sinks/intelligems-sink.d.ts +9 -8
- package/analytics/sinks/intelligems-sink.js +3 -1
- package/analytics/sinks/meta-sink.d.ts +5 -4
- package/analytics/sinks/meta-sink.js +7 -3
- package/analytics/sinks/northbeam-sink.d.ts +1 -0
- package/analytics/sinks/northbeam-sink.js +2 -0
- package/analytics/sinks/pinterest-sink.d.ts +7 -6
- package/analytics/sinks/pinterest-sink.js +14 -20
- package/analytics/sinks/reddit-sink.d.ts +8 -7
- package/analytics/sinks/reddit-sink.js +13 -20
- package/analytics/sinks/replo-sink.d.ts +21 -9
- package/analytics/sinks/replo-sink.js +37 -39
- package/analytics/sinks/segment-event-mapper.d.ts +86 -0
- package/analytics/sinks/segment-event-mapper.js +71 -0
- package/analytics/sinks/segment-sink.d.ts +23 -0
- package/analytics/sinks/segment-sink.js +84 -0
- package/analytics/sinks/snapchat-sink.d.ts +6 -5
- package/analytics/sinks/snapchat-sink.js +8 -8
- package/analytics/sinks/tiktok-sink.d.ts +8 -7
- package/analytics/sinks/tiktok-sink.js +10 -15
- package/analytics/sinks/window-sink.d.ts +11 -9
- package/analytics/sinks/window-sink.js +5 -1
- package/analytics/sinks/x-sink.d.ts +5 -4
- package/analytics/sinks/x-sink.js +19 -50
- package/analytics/test-fixtures.d.ts +5 -0
- package/analytics/test-fixtures.js +18 -0
- package/analytics/utils/analytics-products.d.ts +0 -30
- package/analytics/utils/analytics-products.js +1 -51
- package/analytics/utils/collection-analytics.d.ts +2 -15
- package/analytics/utils/collection-analytics.js +14 -18
- package/analytics/utils/product-analytics.d.ts +23 -0
- package/analytics/utils/product-analytics.js +21 -0
- package/cart/hooks/use-add-to-cart.js +1 -1
- package/cart/utils/cart-analytics.d.ts +3 -23
- package/cart/utils/cart-analytics.js +1 -1
- package/cart/utils/cart-utils.js +1 -1
- package/cart/utils/variant-to-cart-line.js +1 -1
- package/chunk-CKRRL66R.mjs +28 -0
- package/{chunk-VVB7BEDE.mjs → chunk-O4QBR4QC.mjs} +9 -4
- package/{chunk-EUIVDITZ.mjs → chunk-OPKMOW43.mjs} +1 -1
- package/{chunk-C37TXOGI.mjs → chunk-PSYP2DYM.mjs} +1 -1
- package/{chunk-ACQS4AG5.mjs → chunk-TTEBDCWT.mjs} +272 -109
- package/{chunk-HFKL4ZR5.mjs → chunk-XGXJOHUY.mjs} +2 -1
- package/{chunk-AQG3256R.mjs → chunk-XSMYSAKY.mjs} +0 -26
- package/{chunk-SSBIMQES.mjs → chunk-XWWFRIXV.mjs} +36 -99
- package/chunk-ZPDXVFCR.mjs +66 -0
- package/hooks/use-formatted-price.js +1 -1
- package/lib/buildMetadata.js +3 -3
- package/loaders/collection-loader.js +8 -6
- package/loaders/collection-products-loader.js +8 -6
- package/loaders/contentful-entries-loader.js +5 -3
- package/loaders/contentful-entry-loader.js +5 -3
- package/loaders/integration-loader-schemas.d.ts +260 -0
- package/loaders/integration-loader-schemas.js +55 -0
- package/loaders/invoke-loader.d.ts +5 -0
- package/loaders/invoke-loader.js +1 -1
- package/loaders/judgeme-review-aggregate-loader.d.ts +1 -1
- package/loaders/judgeme-review-aggregate-loader.js +10 -6
- package/loaders/judgeme-reviews-loader.d.ts +1 -1
- package/loaders/judgeme-reviews-loader.js +5 -3
- package/loaders/kaching-bundles-loader.js +5 -3
- package/loaders/levanta-product-loader.js +8 -6
- package/loaders/loox-review-aggregate-loader.d.ts +1 -1
- package/loaders/loox-review-aggregate-loader.js +10 -6
- package/loaders/loox-reviews-loader.d.ts +1 -1
- package/loaders/loox-reviews-loader.js +8 -6
- package/loaders/metaobject-loader.js +5 -3
- package/loaders/metaobjects-loader.js +5 -3
- package/loaders/okendo-review-aggregate-loader.d.ts +2 -7
- package/loaders/okendo-review-aggregate-loader.js +8 -12
- package/loaders/okendo-reviews-loader.d.ts +2 -42
- package/loaders/okendo-reviews-loader.js +5 -8
- package/loaders/product-loader.js +5 -3
- package/loaders/rebuy-recommendations-loader.d.ts +2 -167
- package/loaders/rebuy-recommendations-loader.js +8 -10
- package/loaders/reviews-io-review-aggregate-loader.d.ts +1 -1
- package/loaders/reviews-io-review-aggregate-loader.js +5 -3
- package/loaders/reviews-io-reviews-loader.d.ts +1 -1
- package/loaders/reviews-io-reviews-loader.js +7 -3
- package/loaders/shopify-integration-details-loader.js +10 -6
- package/loaders/smile-earning-rules-loader.d.ts +2 -8
- package/loaders/smile-earning-rules-loader.js +8 -16
- package/loaders/smile-rewards-loader.d.ts +2 -8
- package/loaders/smile-rewards-loader.js +8 -16
- package/loaders/smile-vip-tiers-loader.d.ts +2 -7
- package/loaders/smile-vip-tiers-loader.js +8 -15
- package/loaders/statsig-experiment-loader.js +5 -3
- package/loaders/yotpo-review-aggregate-loader.d.ts +1 -1
- package/loaders/yotpo-review-aggregate-loader.js +10 -6
- package/loaders/yotpo-reviews-loader.d.ts +1 -1
- package/loaders/yotpo-reviews-loader.js +5 -3
- package/money.d.ts +1 -1
- package/money.js +1 -1
- package/package.json +8 -4
- package/chunk-CQYCPDPI.mjs +0 -166
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { AnalyticsSink, CustomEventPayload,
|
|
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:
|
|
23
|
-
productViewed(payload:
|
|
24
|
-
addToCart(payload:
|
|
25
|
-
removeFromCart(payload:
|
|
26
|
-
viewCart(payload:
|
|
27
|
-
startCheckout(payload:
|
|
28
|
-
viewCollection(payload:
|
|
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
|
-
|
|
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,
|
|
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 }:
|
|
9
|
-
addToCart({ data }:
|
|
9
|
+
productViewed({ data }: ProductViewedPayload): Promise<void>;
|
|
10
|
+
addToCart({ data }: CartLineEventPayload): Promise<void>;
|
|
10
11
|
removeFromCart(): Promise<void>;
|
|
11
12
|
viewCart(): Promise<void>;
|
|
12
|
-
startCheckout(
|
|
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(
|
|
43
|
+
async startCheckout(payload) {
|
|
44
|
+
const data = toCheckoutStartedData(payload.data);
|
|
41
45
|
this.track("InitiateCheckout", {
|
|
42
|
-
value: data.
|
|
43
|
-
currency: data.
|
|
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>;
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import type { AnalyticsSink,
|
|
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 }:
|
|
8
|
-
productViewed({ data }:
|
|
9
|
-
addToCart({ data }:
|
|
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(
|
|
13
|
-
viewCollection({ data }:
|
|
13
|
+
startCheckout(payload: CheckoutStartedPayload | LegacyCheckoutStartedPayload): Promise<void>;
|
|
14
|
+
viewCollection({ data }: CollectionViewedPayload): Promise<void>;
|
|
14
15
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
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.
|
|
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
|
|
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(
|
|
54
|
+
async startCheckout(payload) {
|
|
55
|
+
const data = toCheckoutStartedData(payload.data);
|
|
61
56
|
this.track("checkout", {
|
|
62
|
-
value: data.
|
|
57
|
+
value: data.total,
|
|
63
58
|
currency: data.currency,
|
|
64
|
-
order_quantity: data.
|
|
59
|
+
order_quantity: data.itemCount,
|
|
65
60
|
...data
|
|
66
61
|
});
|
|
67
62
|
}
|
|
68
63
|
async viewCollection({ data }) {
|
|
69
|
-
const { products, rest } =
|
|
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
|
|
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,
|
|
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 }:
|
|
8
|
-
productViewed({ data }:
|
|
9
|
-
addToCart({ data }:
|
|
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 }:
|
|
12
|
-
startCheckout(
|
|
13
|
-
viewCollection({ data }:
|
|
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
|
-
|
|
3
|
-
|
|
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.
|
|
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
|
|
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(
|
|
57
|
+
async startCheckout(payload) {
|
|
58
|
+
const data = toCheckoutStartedData(payload.data);
|
|
64
59
|
this.track("Lead", {
|
|
65
|
-
value: data.
|
|
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 } =
|
|
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
|
|
72
|
+
return filterUndefined({
|
|
80
73
|
id: legacyResourceId(product.productId),
|
|
81
74
|
name: product.productTitle
|
|
82
75
|
});
|
|
@@ -1,14 +1,26 @@
|
|
|
1
|
-
import type { AnalyticsSink,
|
|
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
|
-
|
|
15
|
+
customEvent(): Promise<void>;
|
|
5
16
|
pageView(): Promise<void>;
|
|
6
17
|
purchase(payload: PurchasePayload): Promise<void>;
|
|
7
|
-
click(payload:
|
|
8
|
-
productViewed(payload:
|
|
9
|
-
addToCart(payload:
|
|
10
|
-
removeFromCart(payload:
|
|
11
|
-
viewCart(payload:
|
|
12
|
-
startCheckout(payload:
|
|
13
|
-
viewCollection(payload:
|
|
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 {
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
()
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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(
|
|
18
|
-
return Promise.resolve();
|
|
23
|
+
this.forward((pixel) => pixel.pageView());
|
|
19
24
|
}
|
|
20
|
-
purchase(payload) {
|
|
21
|
-
this.forward(
|
|
22
|
-
return Promise.resolve();
|
|
25
|
+
async purchase(payload) {
|
|
26
|
+
this.forward((pixel) => pixel.purchase(payload));
|
|
23
27
|
}
|
|
24
|
-
click(payload) {
|
|
25
|
-
this.forward(
|
|
26
|
-
return Promise.resolve();
|
|
28
|
+
async click(payload) {
|
|
29
|
+
this.forward((pixel) => pixel.click(payload));
|
|
27
30
|
}
|
|
28
|
-
productViewed(payload) {
|
|
29
|
-
this.forward(
|
|
30
|
-
return Promise.resolve();
|
|
31
|
+
async productViewed(payload) {
|
|
32
|
+
this.forward((pixel) => pixel.productViewed(payload));
|
|
31
33
|
}
|
|
32
|
-
addToCart(payload) {
|
|
33
|
-
this.forward(
|
|
34
|
-
return Promise.resolve();
|
|
34
|
+
async addToCart(payload) {
|
|
35
|
+
this.forward((pixel) => pixel.addToCart(payload));
|
|
35
36
|
}
|
|
36
|
-
removeFromCart(payload) {
|
|
37
|
-
this.forward(
|
|
38
|
-
return Promise.resolve();
|
|
37
|
+
async removeFromCart(payload) {
|
|
38
|
+
this.forward((pixel) => pixel.removeFromCart(payload));
|
|
39
39
|
}
|
|
40
|
-
viewCart(payload) {
|
|
41
|
-
this.forward(
|
|
42
|
-
return Promise.resolve();
|
|
40
|
+
async viewCart(payload) {
|
|
41
|
+
this.forward((pixel) => pixel.viewCart(payload));
|
|
43
42
|
}
|
|
44
|
-
startCheckout(payload) {
|
|
45
|
-
|
|
46
|
-
|
|
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(
|
|
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
|
+
}
|