@shware/analytics 2.6.2 → 2.8.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 (101) hide show
  1. package/README.md +4 -0
  2. package/dist/next/index.cjs +32 -32
  3. package/dist/next/index.cjs.map +1 -1
  4. package/dist/next/index.d.cts +8 -12
  5. package/dist/next/index.d.ts +8 -12
  6. package/dist/next/index.mjs +31 -29
  7. package/dist/next/index.mjs.map +1 -1
  8. package/dist/react-router/index.cjs +32 -32
  9. package/dist/react-router/index.cjs.map +1 -1
  10. package/dist/react-router/index.d.cts +8 -12
  11. package/dist/react-router/index.d.ts +8 -12
  12. package/dist/react-router/index.mjs +31 -29
  13. package/dist/react-router/index.mjs.map +1 -1
  14. package/dist/schema/index.cjs +85 -148
  15. package/dist/schema/index.cjs.map +1 -1
  16. package/dist/schema/index.d.cts +81 -1
  17. package/dist/schema/index.d.ts +81 -1
  18. package/dist/schema/index.mjs +83 -148
  19. package/dist/schema/index.mjs.map +1 -1
  20. package/dist/server/{conversions-api.cjs → meta-conversions-api.cjs} +5 -5
  21. package/dist/server/meta-conversions-api.cjs.map +1 -0
  22. package/dist/server/{conversions-api.mjs → meta-conversions-api.mjs} +2 -2
  23. package/dist/server/meta-conversions-api.mjs.map +1 -0
  24. package/dist/server/reddit-conversions-api.cjs +88 -0
  25. package/dist/server/reddit-conversions-api.cjs.map +1 -0
  26. package/dist/server/reddit-conversions-api.d.cts +75 -0
  27. package/dist/server/reddit-conversions-api.d.ts +75 -0
  28. package/dist/server/reddit-conversions-api.mjs +62 -0
  29. package/dist/server/reddit-conversions-api.mjs.map +1 -0
  30. package/dist/third-parties/google-analytics.cjs +48 -0
  31. package/dist/third-parties/google-analytics.cjs.map +1 -0
  32. package/dist/third-parties/google-analytics.d.cts +12 -0
  33. package/dist/third-parties/google-analytics.d.ts +12 -0
  34. package/dist/third-parties/google-analytics.mjs +22 -0
  35. package/dist/third-parties/google-analytics.mjs.map +1 -0
  36. package/dist/third-parties/hotjar.cjs +2 -0
  37. package/dist/third-parties/hotjar.cjs.map +1 -0
  38. package/dist/third-parties/hotjar.d.cts +2 -0
  39. package/dist/third-parties/hotjar.d.ts +2 -0
  40. package/dist/third-parties/hotjar.mjs +1 -0
  41. package/dist/third-parties/hotjar.mjs.map +1 -0
  42. package/dist/third-parties/index.cjs +43 -0
  43. package/dist/third-parties/index.cjs.map +1 -0
  44. package/dist/third-parties/index.d.cts +8 -0
  45. package/dist/third-parties/index.d.ts +8 -0
  46. package/dist/third-parties/index.mjs +13 -0
  47. package/dist/third-parties/index.mjs.map +1 -0
  48. package/dist/third-parties/meta-pixel.cjs +68 -0
  49. package/dist/third-parties/meta-pixel.cjs.map +1 -0
  50. package/dist/third-parties/meta-pixel.d.cts +13 -0
  51. package/dist/third-parties/meta-pixel.d.ts +13 -0
  52. package/dist/third-parties/meta-pixel.mjs +42 -0
  53. package/dist/third-parties/meta-pixel.mjs.map +1 -0
  54. package/dist/third-parties/reddit-pixel.cjs +60 -0
  55. package/dist/third-parties/reddit-pixel.cjs.map +1 -0
  56. package/dist/third-parties/reddit-pixel.d.cts +13 -0
  57. package/dist/third-parties/reddit-pixel.d.ts +13 -0
  58. package/dist/third-parties/reddit-pixel.mjs +34 -0
  59. package/dist/third-parties/reddit-pixel.mjs.map +1 -0
  60. package/dist/track/fbq.cjs.map +1 -1
  61. package/dist/track/fbq.d.cts +2 -2
  62. package/dist/track/fbq.d.ts +2 -2
  63. package/dist/track/fbq.mjs.map +1 -1
  64. package/dist/track/rdt.cjs +104 -0
  65. package/dist/track/rdt.cjs.map +1 -0
  66. package/dist/track/rdt.d.cts +94 -0
  67. package/dist/track/rdt.d.ts +94 -0
  68. package/dist/track/rdt.mjs +78 -0
  69. package/dist/track/rdt.mjs.map +1 -0
  70. package/dist/track/types.cjs.map +1 -1
  71. package/dist/track/types.d.cts +4 -3
  72. package/dist/track/types.d.ts +4 -3
  73. package/dist/{react/index.cjs → utils/field.cjs} +11 -9
  74. package/dist/utils/field.cjs.map +1 -0
  75. package/dist/utils/field.d.cts +3 -0
  76. package/dist/utils/field.d.ts +3 -0
  77. package/dist/utils/field.mjs +10 -0
  78. package/dist/utils/field.mjs.map +1 -0
  79. package/dist/visitor/index.cjs +2 -3
  80. package/dist/visitor/index.cjs.map +1 -1
  81. package/dist/visitor/index.d.cts +4 -2
  82. package/dist/visitor/index.d.ts +4 -2
  83. package/dist/visitor/index.mjs +2 -3
  84. package/dist/visitor/index.mjs.map +1 -1
  85. package/dist/visitor/types.cjs.map +1 -1
  86. package/dist/visitor/types.d.cts +5 -2
  87. package/dist/visitor/types.d.ts +5 -2
  88. package/dist/web/index.cjs +3 -0
  89. package/dist/web/index.cjs.map +1 -1
  90. package/dist/web/index.mjs +3 -0
  91. package/dist/web/index.mjs.map +1 -1
  92. package/package.json +15 -10
  93. package/dist/react/index.cjs.map +0 -1
  94. package/dist/react/index.d.cts +0 -3
  95. package/dist/react/index.d.ts +0 -3
  96. package/dist/react/index.mjs +0 -8
  97. package/dist/react/index.mjs.map +0 -1
  98. package/dist/server/conversions-api.cjs.map +0 -1
  99. package/dist/server/conversions-api.mjs.map +0 -1
  100. /package/dist/server/{conversions-api.d.cts → meta-conversions-api.d.cts} +0 -0
  101. /package/dist/server/{conversions-api.d.ts → meta-conversions-api.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/reddit-conversions-api.ts"],"sourcesContent":["import { mapRDTEvent } from '../track/rdt';\nimport { getFirst } from '../utils/field';\nimport type { StandardEvents } from '../track/rdt';\nimport type { TrackEvent, UserProvidedData } from '../track/types';\n\n/**\n * https://ads-api.reddit.com/docs/v3/operations/Post%20Conversion%20Events\n * https://business.reddithelp.com/s/article/map-a-catalog-to-a-signal-source\n */\nexport interface RedditEvent {\n /** Match keys: Share user identifiers to match conversions to a Reddit ad engagement. */\n click_id?: string;\n\n /** Unix epoch timestamp in milliseconds, event_at can't be older than seven days. */\n event_at: number;\n\n action_source: 'WEBSITE' | 'APP' | string;\n\n type: {\n tracking_type: Uppercase<keyof StandardEvents> | 'CUSTOM';\n custom_event_name?: string;\n };\n\n /**\n * Event metadata\n * Share as much additional information about your conversion event as you'd like. If you're\n * using the Conversions API with the pixel, conversion_id is required for deduplication.\n */\n metadata?: {\n conversion_id?: string;\n currency?: string; // ISO 4217 3-letter currency code\n item_count?: number;\n value?: number;\n products?: { id: string; name?: string; category?: string }[];\n };\n\n user?: {\n email?: string;\n external_id?: string;\n ip_address?: string;\n phone_number?: string;\n user_agent?: string;\n\n /** The Identifier for Advertisers (IDFA) of the user's Apple device. */\n idfa?: string;\n\n /** The Android Advertising ID (AAID) of the user's Android device. */\n aaid?: string;\n /**\n * The value from the first-party Pixel _rdt_uuid cookie on your domain. Note that it is in\n * the {timestamp}.{uuid} format. You may use the full value or just the UUID portion.\n * Example: 1684189007728.7c73f2ae-a433-4d7b-9838-f467da98f48e\n */\n uuid?: string;\n\n screen_dimensions?: { width: number; height: number };\n\n /**\n * A structure of data processing options to specify the processing type for the event\n * https://business.reddithelp.com/s/article/Limited-Data-Use\n */\n data_processing_options?: {\n country: string;\n region: string;\n modes: string[] | ['LDU'];\n };\n };\n}\n\nexport interface CreateRedditEventDTO {\n data: { test_id?: string; events: RedditEvent[] };\n}\n\nexport function getServerEvent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n event: TrackEvent<any>,\n data: UserProvidedData\n): RedditEvent {\n const { id, name, properties, tags } = event;\n const [type, params] = mapRDTEvent(name, properties, id);\n\n return {\n click_id: tags.rdt_cid,\n event_at: Date.now(),\n action_source: tags.source === 'web' ? 'WEBSITE' : tags.source === 'app' ? 'APP' : 'UNKNOWN',\n type: {\n tracking_type:\n type === 'Custom' ? 'CUSTOM' : (type.toUpperCase() as Uppercase<keyof StandardEvents>),\n custom_event_name: type === 'Custom' ? params.customEventName : undefined,\n },\n metadata: {\n conversion_id: id,\n currency:\n 'currency' in params && typeof params.currency === 'string'\n ? params.currency.toUpperCase()\n : undefined,\n item_count:\n 'itemCount' in params && typeof params.itemCount === 'number'\n ? params.itemCount\n : undefined,\n value: 'value' in params && typeof params.value === 'number' ? params.value : undefined,\n products:\n 'products' in params && Array.isArray(params.products) && params.products.length > 0\n ? params.products\n : undefined,\n },\n user: {\n email: getFirst(data.email),\n external_id: data.user_id,\n ip_address: data.ip_address,\n phone_number: getFirst(data.phone_number),\n user_agent: data.user_agent,\n idfa: tags.platform === 'ios' ? tags.advertising_id : undefined,\n aaid: tags.platform === 'android' ? tags.advertising_id : undefined,\n uuid: tags.rdt_uuid,\n screen_dimensions:\n tags.screen_width && tags.screen_height\n ? { width: tags.screen_width, height: tags.screen_height }\n : undefined,\n },\n };\n}\n\nexport async function sendEvents(\n accessToken: string,\n pixelId: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n events: TrackEvent<any>[],\n data: UserProvidedData = {},\n testId?: string\n) {\n const dto: CreateRedditEventDTO = {\n data: {\n test_id: testId,\n events: events.map((event) => getServerEvent(event, data)),\n },\n };\n\n const response = await fetch(\n `https://ads-api.reddit.com/api/v3/pixels/${pixelId}/conversion_events`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(dto),\n }\n );\n\n if (!response.ok) {\n console.error('Failed to send Reddit conversion events:', await response.text());\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA4B;AAC5B,mBAAyB;AAwElB,SAAS,eAEd,OACA,MACa;AACb,QAAM,EAAE,IAAI,MAAM,YAAY,KAAK,IAAI;AACvC,QAAM,CAAC,MAAM,MAAM,QAAI,wBAAY,MAAM,YAAY,EAAE;AAEvD,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,UAAU,KAAK,IAAI;AAAA,IACnB,eAAe,KAAK,WAAW,QAAQ,YAAY,KAAK,WAAW,QAAQ,QAAQ;AAAA,IACnF,MAAM;AAAA,MACJ,eACE,SAAS,WAAW,WAAY,KAAK,YAAY;AAAA,MACnD,mBAAmB,SAAS,WAAW,OAAO,kBAAkB;AAAA,IAClE;AAAA,IACA,UAAU;AAAA,MACR,eAAe;AAAA,MACf,UACE,cAAc,UAAU,OAAO,OAAO,aAAa,WAC/C,OAAO,SAAS,YAAY,IAC5B;AAAA,MACN,YACE,eAAe,UAAU,OAAO,OAAO,cAAc,WACjD,OAAO,YACP;AAAA,MACN,OAAO,WAAW,UAAU,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,MAC9E,UACE,cAAc,UAAU,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,IAC/E,OAAO,WACP;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,WAAO,uBAAS,KAAK,KAAK;AAAA,MAC1B,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,kBAAc,uBAAS,KAAK,YAAY;AAAA,MACxC,YAAY,KAAK;AAAA,MACjB,MAAM,KAAK,aAAa,QAAQ,KAAK,iBAAiB;AAAA,MACtD,MAAM,KAAK,aAAa,YAAY,KAAK,iBAAiB;AAAA,MAC1D,MAAM,KAAK;AAAA,MACX,mBACE,KAAK,gBAAgB,KAAK,gBACtB,EAAE,OAAO,KAAK,cAAc,QAAQ,KAAK,cAAc,IACvD;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAsB,WACpB,aACA,SAEA,QACA,OAAyB,CAAC,GAC1B,QACA;AACA,QAAM,MAA4B;AAAA,IAChC,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ,OAAO,IAAI,CAAC,UAAU,eAAe,OAAO,IAAI,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,WAAW,MAAM;AAAA,IACrB,4CAA4C,OAAO;AAAA,IACnD;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,eAAe,UAAU,WAAW;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,UAAU,GAAG;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,YAAQ,MAAM,4CAA4C,MAAM,SAAS,KAAK,CAAC;AAAA,EACjF;AACF;","names":[]}
@@ -0,0 +1,75 @@
1
+ import { StandardEvents } from '../track/rdt.cjs';
2
+ import { TrackEvent, UserProvidedData } from '../track/types.cjs';
3
+ import '../track/gtag.cjs';
4
+
5
+ /**
6
+ * https://ads-api.reddit.com/docs/v3/operations/Post%20Conversion%20Events
7
+ * https://business.reddithelp.com/s/article/map-a-catalog-to-a-signal-source
8
+ */
9
+ interface RedditEvent {
10
+ /** Match keys: Share user identifiers to match conversions to a Reddit ad engagement. */
11
+ click_id?: string;
12
+ /** Unix epoch timestamp in milliseconds, event_at can't be older than seven days. */
13
+ event_at: number;
14
+ action_source: 'WEBSITE' | 'APP' | string;
15
+ type: {
16
+ tracking_type: Uppercase<keyof StandardEvents> | 'CUSTOM';
17
+ custom_event_name?: string;
18
+ };
19
+ /**
20
+ * Event metadata
21
+ * Share as much additional information about your conversion event as you'd like. If you're
22
+ * using the Conversions API with the pixel, conversion_id is required for deduplication.
23
+ */
24
+ metadata?: {
25
+ conversion_id?: string;
26
+ currency?: string;
27
+ item_count?: number;
28
+ value?: number;
29
+ products?: {
30
+ id: string;
31
+ name?: string;
32
+ category?: string;
33
+ }[];
34
+ };
35
+ user?: {
36
+ email?: string;
37
+ external_id?: string;
38
+ ip_address?: string;
39
+ phone_number?: string;
40
+ user_agent?: string;
41
+ /** The Identifier for Advertisers (IDFA) of the user's Apple device. */
42
+ idfa?: string;
43
+ /** The Android Advertising ID (AAID) of the user's Android device. */
44
+ aaid?: string;
45
+ /**
46
+ * The value from the first-party Pixel _rdt_uuid cookie on your domain. Note that it is in
47
+ * the {timestamp}.{uuid} format. You may use the full value or just the UUID portion.
48
+ * Example: 1684189007728.7c73f2ae-a433-4d7b-9838-f467da98f48e
49
+ */
50
+ uuid?: string;
51
+ screen_dimensions?: {
52
+ width: number;
53
+ height: number;
54
+ };
55
+ /**
56
+ * A structure of data processing options to specify the processing type for the event
57
+ * https://business.reddithelp.com/s/article/Limited-Data-Use
58
+ */
59
+ data_processing_options?: {
60
+ country: string;
61
+ region: string;
62
+ modes: string[] | ['LDU'];
63
+ };
64
+ };
65
+ }
66
+ interface CreateRedditEventDTO {
67
+ data: {
68
+ test_id?: string;
69
+ events: RedditEvent[];
70
+ };
71
+ }
72
+ declare function getServerEvent(event: TrackEvent<any>, data: UserProvidedData): RedditEvent;
73
+ declare function sendEvents(accessToken: string, pixelId: string, events: TrackEvent<any>[], data?: UserProvidedData, testId?: string): Promise<void>;
74
+
75
+ export { type CreateRedditEventDTO, type RedditEvent, getServerEvent, sendEvents };
@@ -0,0 +1,75 @@
1
+ import { StandardEvents } from '../track/rdt.js';
2
+ import { TrackEvent, UserProvidedData } from '../track/types.js';
3
+ import '../track/gtag.js';
4
+
5
+ /**
6
+ * https://ads-api.reddit.com/docs/v3/operations/Post%20Conversion%20Events
7
+ * https://business.reddithelp.com/s/article/map-a-catalog-to-a-signal-source
8
+ */
9
+ interface RedditEvent {
10
+ /** Match keys: Share user identifiers to match conversions to a Reddit ad engagement. */
11
+ click_id?: string;
12
+ /** Unix epoch timestamp in milliseconds, event_at can't be older than seven days. */
13
+ event_at: number;
14
+ action_source: 'WEBSITE' | 'APP' | string;
15
+ type: {
16
+ tracking_type: Uppercase<keyof StandardEvents> | 'CUSTOM';
17
+ custom_event_name?: string;
18
+ };
19
+ /**
20
+ * Event metadata
21
+ * Share as much additional information about your conversion event as you'd like. If you're
22
+ * using the Conversions API with the pixel, conversion_id is required for deduplication.
23
+ */
24
+ metadata?: {
25
+ conversion_id?: string;
26
+ currency?: string;
27
+ item_count?: number;
28
+ value?: number;
29
+ products?: {
30
+ id: string;
31
+ name?: string;
32
+ category?: string;
33
+ }[];
34
+ };
35
+ user?: {
36
+ email?: string;
37
+ external_id?: string;
38
+ ip_address?: string;
39
+ phone_number?: string;
40
+ user_agent?: string;
41
+ /** The Identifier for Advertisers (IDFA) of the user's Apple device. */
42
+ idfa?: string;
43
+ /** The Android Advertising ID (AAID) of the user's Android device. */
44
+ aaid?: string;
45
+ /**
46
+ * The value from the first-party Pixel _rdt_uuid cookie on your domain. Note that it is in
47
+ * the {timestamp}.{uuid} format. You may use the full value or just the UUID portion.
48
+ * Example: 1684189007728.7c73f2ae-a433-4d7b-9838-f467da98f48e
49
+ */
50
+ uuid?: string;
51
+ screen_dimensions?: {
52
+ width: number;
53
+ height: number;
54
+ };
55
+ /**
56
+ * A structure of data processing options to specify the processing type for the event
57
+ * https://business.reddithelp.com/s/article/Limited-Data-Use
58
+ */
59
+ data_processing_options?: {
60
+ country: string;
61
+ region: string;
62
+ modes: string[] | ['LDU'];
63
+ };
64
+ };
65
+ }
66
+ interface CreateRedditEventDTO {
67
+ data: {
68
+ test_id?: string;
69
+ events: RedditEvent[];
70
+ };
71
+ }
72
+ declare function getServerEvent(event: TrackEvent<any>, data: UserProvidedData): RedditEvent;
73
+ declare function sendEvents(accessToken: string, pixelId: string, events: TrackEvent<any>[], data?: UserProvidedData, testId?: string): Promise<void>;
74
+
75
+ export { type CreateRedditEventDTO, type RedditEvent, getServerEvent, sendEvents };
@@ -0,0 +1,62 @@
1
+ // src/server/reddit-conversions-api.ts
2
+ import { mapRDTEvent } from "../track/rdt.mjs";
3
+ import { getFirst } from "../utils/field.mjs";
4
+ function getServerEvent(event, data) {
5
+ const { id, name, properties, tags } = event;
6
+ const [type, params] = mapRDTEvent(name, properties, id);
7
+ return {
8
+ click_id: tags.rdt_cid,
9
+ event_at: Date.now(),
10
+ action_source: tags.source === "web" ? "WEBSITE" : tags.source === "app" ? "APP" : "UNKNOWN",
11
+ type: {
12
+ tracking_type: type === "Custom" ? "CUSTOM" : type.toUpperCase(),
13
+ custom_event_name: type === "Custom" ? params.customEventName : void 0
14
+ },
15
+ metadata: {
16
+ conversion_id: id,
17
+ currency: "currency" in params && typeof params.currency === "string" ? params.currency.toUpperCase() : void 0,
18
+ item_count: "itemCount" in params && typeof params.itemCount === "number" ? params.itemCount : void 0,
19
+ value: "value" in params && typeof params.value === "number" ? params.value : void 0,
20
+ products: "products" in params && Array.isArray(params.products) && params.products.length > 0 ? params.products : void 0
21
+ },
22
+ user: {
23
+ email: getFirst(data.email),
24
+ external_id: data.user_id,
25
+ ip_address: data.ip_address,
26
+ phone_number: getFirst(data.phone_number),
27
+ user_agent: data.user_agent,
28
+ idfa: tags.platform === "ios" ? tags.advertising_id : void 0,
29
+ aaid: tags.platform === "android" ? tags.advertising_id : void 0,
30
+ uuid: tags.rdt_uuid,
31
+ screen_dimensions: tags.screen_width && tags.screen_height ? { width: tags.screen_width, height: tags.screen_height } : void 0
32
+ }
33
+ };
34
+ }
35
+ async function sendEvents(accessToken, pixelId, events, data = {}, testId) {
36
+ const dto = {
37
+ data: {
38
+ test_id: testId,
39
+ events: events.map((event) => getServerEvent(event, data))
40
+ }
41
+ };
42
+ const response = await fetch(
43
+ `https://ads-api.reddit.com/api/v3/pixels/${pixelId}/conversion_events`,
44
+ {
45
+ method: "POST",
46
+ headers: {
47
+ "Content-Type": "application/json",
48
+ Accept: "application/json",
49
+ Authorization: `Bearer ${accessToken}`
50
+ },
51
+ body: JSON.stringify(dto)
52
+ }
53
+ );
54
+ if (!response.ok) {
55
+ console.error("Failed to send Reddit conversion events:", await response.text());
56
+ }
57
+ }
58
+ export {
59
+ getServerEvent,
60
+ sendEvents
61
+ };
62
+ //# sourceMappingURL=reddit-conversions-api.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/reddit-conversions-api.ts"],"sourcesContent":["import { mapRDTEvent } from '../track/rdt';\nimport { getFirst } from '../utils/field';\nimport type { StandardEvents } from '../track/rdt';\nimport type { TrackEvent, UserProvidedData } from '../track/types';\n\n/**\n * https://ads-api.reddit.com/docs/v3/operations/Post%20Conversion%20Events\n * https://business.reddithelp.com/s/article/map-a-catalog-to-a-signal-source\n */\nexport interface RedditEvent {\n /** Match keys: Share user identifiers to match conversions to a Reddit ad engagement. */\n click_id?: string;\n\n /** Unix epoch timestamp in milliseconds, event_at can't be older than seven days. */\n event_at: number;\n\n action_source: 'WEBSITE' | 'APP' | string;\n\n type: {\n tracking_type: Uppercase<keyof StandardEvents> | 'CUSTOM';\n custom_event_name?: string;\n };\n\n /**\n * Event metadata\n * Share as much additional information about your conversion event as you'd like. If you're\n * using the Conversions API with the pixel, conversion_id is required for deduplication.\n */\n metadata?: {\n conversion_id?: string;\n currency?: string; // ISO 4217 3-letter currency code\n item_count?: number;\n value?: number;\n products?: { id: string; name?: string; category?: string }[];\n };\n\n user?: {\n email?: string;\n external_id?: string;\n ip_address?: string;\n phone_number?: string;\n user_agent?: string;\n\n /** The Identifier for Advertisers (IDFA) of the user's Apple device. */\n idfa?: string;\n\n /** The Android Advertising ID (AAID) of the user's Android device. */\n aaid?: string;\n /**\n * The value from the first-party Pixel _rdt_uuid cookie on your domain. Note that it is in\n * the {timestamp}.{uuid} format. You may use the full value or just the UUID portion.\n * Example: 1684189007728.7c73f2ae-a433-4d7b-9838-f467da98f48e\n */\n uuid?: string;\n\n screen_dimensions?: { width: number; height: number };\n\n /**\n * A structure of data processing options to specify the processing type for the event\n * https://business.reddithelp.com/s/article/Limited-Data-Use\n */\n data_processing_options?: {\n country: string;\n region: string;\n modes: string[] | ['LDU'];\n };\n };\n}\n\nexport interface CreateRedditEventDTO {\n data: { test_id?: string; events: RedditEvent[] };\n}\n\nexport function getServerEvent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n event: TrackEvent<any>,\n data: UserProvidedData\n): RedditEvent {\n const { id, name, properties, tags } = event;\n const [type, params] = mapRDTEvent(name, properties, id);\n\n return {\n click_id: tags.rdt_cid,\n event_at: Date.now(),\n action_source: tags.source === 'web' ? 'WEBSITE' : tags.source === 'app' ? 'APP' : 'UNKNOWN',\n type: {\n tracking_type:\n type === 'Custom' ? 'CUSTOM' : (type.toUpperCase() as Uppercase<keyof StandardEvents>),\n custom_event_name: type === 'Custom' ? params.customEventName : undefined,\n },\n metadata: {\n conversion_id: id,\n currency:\n 'currency' in params && typeof params.currency === 'string'\n ? params.currency.toUpperCase()\n : undefined,\n item_count:\n 'itemCount' in params && typeof params.itemCount === 'number'\n ? params.itemCount\n : undefined,\n value: 'value' in params && typeof params.value === 'number' ? params.value : undefined,\n products:\n 'products' in params && Array.isArray(params.products) && params.products.length > 0\n ? params.products\n : undefined,\n },\n user: {\n email: getFirst(data.email),\n external_id: data.user_id,\n ip_address: data.ip_address,\n phone_number: getFirst(data.phone_number),\n user_agent: data.user_agent,\n idfa: tags.platform === 'ios' ? tags.advertising_id : undefined,\n aaid: tags.platform === 'android' ? tags.advertising_id : undefined,\n uuid: tags.rdt_uuid,\n screen_dimensions:\n tags.screen_width && tags.screen_height\n ? { width: tags.screen_width, height: tags.screen_height }\n : undefined,\n },\n };\n}\n\nexport async function sendEvents(\n accessToken: string,\n pixelId: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n events: TrackEvent<any>[],\n data: UserProvidedData = {},\n testId?: string\n) {\n const dto: CreateRedditEventDTO = {\n data: {\n test_id: testId,\n events: events.map((event) => getServerEvent(event, data)),\n },\n };\n\n const response = await fetch(\n `https://ads-api.reddit.com/api/v3/pixels/${pixelId}/conversion_events`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(dto),\n }\n );\n\n if (!response.ok) {\n console.error('Failed to send Reddit conversion events:', await response.text());\n }\n}\n"],"mappings":";AAAA,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AAwElB,SAAS,eAEd,OACA,MACa;AACb,QAAM,EAAE,IAAI,MAAM,YAAY,KAAK,IAAI;AACvC,QAAM,CAAC,MAAM,MAAM,IAAI,YAAY,MAAM,YAAY,EAAE;AAEvD,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,UAAU,KAAK,IAAI;AAAA,IACnB,eAAe,KAAK,WAAW,QAAQ,YAAY,KAAK,WAAW,QAAQ,QAAQ;AAAA,IACnF,MAAM;AAAA,MACJ,eACE,SAAS,WAAW,WAAY,KAAK,YAAY;AAAA,MACnD,mBAAmB,SAAS,WAAW,OAAO,kBAAkB;AAAA,IAClE;AAAA,IACA,UAAU;AAAA,MACR,eAAe;AAAA,MACf,UACE,cAAc,UAAU,OAAO,OAAO,aAAa,WAC/C,OAAO,SAAS,YAAY,IAC5B;AAAA,MACN,YACE,eAAe,UAAU,OAAO,OAAO,cAAc,WACjD,OAAO,YACP;AAAA,MACN,OAAO,WAAW,UAAU,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,MAC9E,UACE,cAAc,UAAU,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,IAC/E,OAAO,WACP;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,OAAO,SAAS,KAAK,KAAK;AAAA,MAC1B,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,cAAc,SAAS,KAAK,YAAY;AAAA,MACxC,YAAY,KAAK;AAAA,MACjB,MAAM,KAAK,aAAa,QAAQ,KAAK,iBAAiB;AAAA,MACtD,MAAM,KAAK,aAAa,YAAY,KAAK,iBAAiB;AAAA,MAC1D,MAAM,KAAK;AAAA,MACX,mBACE,KAAK,gBAAgB,KAAK,gBACtB,EAAE,OAAO,KAAK,cAAc,QAAQ,KAAK,cAAc,IACvD;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAsB,WACpB,aACA,SAEA,QACA,OAAyB,CAAC,GAC1B,QACA;AACA,QAAM,MAA4B;AAAA,IAChC,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ,OAAO,IAAI,CAAC,UAAU,eAAe,OAAO,IAAI,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,WAAW,MAAM;AAAA,IACrB,4CAA4C,OAAO;AAAA,IACnD;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,eAAe,UAAU,WAAW;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,UAAU,GAAG;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,YAAQ,MAAM,4CAA4C,MAAM,SAAS,KAAK,CAAC;AAAA,EACjF;AACF;","names":[]}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/third-parties/google-analytics.ts
21
+ var google_analytics_exports = {};
22
+ __export(google_analytics_exports, {
23
+ sendGAEvent: () => sendGAEvent,
24
+ setGAUser: () => setGAUser
25
+ });
26
+ module.exports = __toCommonJS(google_analytics_exports);
27
+ function sendGAEvent(name, properties) {
28
+ if (!window.gtag) {
29
+ console.warn("GA has not been initialized");
30
+ return;
31
+ }
32
+ window.gtag("event", name, properties);
33
+ }
34
+ function setGAUser({ user_id, data, properties }) {
35
+ if (!window.gtag) {
36
+ console.warn("GA has not been initialized");
37
+ return;
38
+ }
39
+ if (user_id) window.gtag("set", "user_id", user_id);
40
+ if (data) window.gtag("set", "user_data", data);
41
+ if (properties) window.gtag("set", "user_properties", properties);
42
+ }
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ sendGAEvent,
46
+ setGAUser
47
+ });
48
+ //# sourceMappingURL=google-analytics.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/third-parties/google-analytics.ts"],"sourcesContent":["import type { Gtag } from '../track/gtag';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends Gtag {}\n}\n\nexport function sendGAEvent<T extends EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!window.gtag) {\n console.warn('GA has not been initialized');\n return;\n }\n window.gtag('event', name, properties);\n}\n\nexport function setGAUser({ user_id, data, properties }: UpdateVisitorDTO) {\n if (!window.gtag) {\n console.warn('GA has not been initialized');\n return;\n }\n if (user_id) window.gtag('set', 'user_id', user_id);\n if (data) window.gtag('set', 'user_data', data);\n if (properties) window.gtag('set', 'user_properties', properties);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQO,SAAS,YACd,MACA,YACA;AACA,MAAI,CAAC,OAAO,MAAM;AAChB,YAAQ,KAAK,6BAA6B;AAC1C;AAAA,EACF;AACA,SAAO,KAAK,SAAS,MAAM,UAAU;AACvC;AAEO,SAAS,UAAU,EAAE,SAAS,MAAM,WAAW,GAAqB;AACzE,MAAI,CAAC,OAAO,MAAM;AAChB,YAAQ,KAAK,6BAA6B;AAC1C;AAAA,EACF;AACA,MAAI,QAAS,QAAO,KAAK,OAAO,WAAW,OAAO;AAClD,MAAI,KAAM,QAAO,KAAK,OAAO,aAAa,IAAI;AAC9C,MAAI,WAAY,QAAO,KAAK,OAAO,mBAAmB,UAAU;AAClE;","names":[]}
@@ -0,0 +1,12 @@
1
+ import { Gtag } from '../track/gtag.cjs';
2
+ import { EventName, TrackName, TrackProperties } from '../track/types.cjs';
3
+ import { UpdateVisitorDTO } from '../visitor/types.cjs';
4
+
5
+ declare global {
6
+ interface Window extends Gtag {
7
+ }
8
+ }
9
+ declare function sendGAEvent<T extends EventName>(name: TrackName<T>, properties?: TrackProperties<T>): void;
10
+ declare function setGAUser({ user_id, data, properties }: UpdateVisitorDTO): void;
11
+
12
+ export { sendGAEvent, setGAUser };
@@ -0,0 +1,12 @@
1
+ import { Gtag } from '../track/gtag.js';
2
+ import { EventName, TrackName, TrackProperties } from '../track/types.js';
3
+ import { UpdateVisitorDTO } from '../visitor/types.js';
4
+
5
+ declare global {
6
+ interface Window extends Gtag {
7
+ }
8
+ }
9
+ declare function sendGAEvent<T extends EventName>(name: TrackName<T>, properties?: TrackProperties<T>): void;
10
+ declare function setGAUser({ user_id, data, properties }: UpdateVisitorDTO): void;
11
+
12
+ export { sendGAEvent, setGAUser };
@@ -0,0 +1,22 @@
1
+ // src/third-parties/google-analytics.ts
2
+ function sendGAEvent(name, properties) {
3
+ if (!window.gtag) {
4
+ console.warn("GA has not been initialized");
5
+ return;
6
+ }
7
+ window.gtag("event", name, properties);
8
+ }
9
+ function setGAUser({ user_id, data, properties }) {
10
+ if (!window.gtag) {
11
+ console.warn("GA has not been initialized");
12
+ return;
13
+ }
14
+ if (user_id) window.gtag("set", "user_id", user_id);
15
+ if (data) window.gtag("set", "user_data", data);
16
+ if (properties) window.gtag("set", "user_properties", properties);
17
+ }
18
+ export {
19
+ sendGAEvent,
20
+ setGAUser
21
+ };
22
+ //# sourceMappingURL=google-analytics.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/third-parties/google-analytics.ts"],"sourcesContent":["import type { Gtag } from '../track/gtag';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends Gtag {}\n}\n\nexport function sendGAEvent<T extends EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!window.gtag) {\n console.warn('GA has not been initialized');\n return;\n }\n window.gtag('event', name, properties);\n}\n\nexport function setGAUser({ user_id, data, properties }: UpdateVisitorDTO) {\n if (!window.gtag) {\n console.warn('GA has not been initialized');\n return;\n }\n if (user_id) window.gtag('set', 'user_id', user_id);\n if (data) window.gtag('set', 'user_data', data);\n if (properties) window.gtag('set', 'user_properties', properties);\n}\n"],"mappings":";AAQO,SAAS,YACd,MACA,YACA;AACA,MAAI,CAAC,OAAO,MAAM;AAChB,YAAQ,KAAK,6BAA6B;AAC1C;AAAA,EACF;AACA,SAAO,KAAK,SAAS,MAAM,UAAU;AACvC;AAEO,SAAS,UAAU,EAAE,SAAS,MAAM,WAAW,GAAqB;AACzE,MAAI,CAAC,OAAO,MAAM;AAChB,YAAQ,KAAK,6BAA6B;AAC1C;AAAA,EACF;AACA,MAAI,QAAS,QAAO,KAAK,OAAO,WAAW,OAAO;AAClD,MAAI,KAAM,QAAO,KAAK,OAAO,aAAa,IAAI;AAC9C,MAAI,WAAY,QAAO,KAAK,OAAO,mBAAmB,UAAU;AAClE;","names":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=hotjar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=hotjar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/third-parties/index.ts
21
+ var third_parties_exports = {};
22
+ __export(third_parties_exports, {
23
+ sendFBEvent: () => import_meta_pixel.sendFBEvent,
24
+ sendGAEvent: () => import_google_analytics.sendGAEvent,
25
+ sendRDTEvent: () => import_reddit_pixel.sendRDTEvent,
26
+ setFBUser: () => import_meta_pixel.setFBUser,
27
+ setGAUser: () => import_google_analytics.setGAUser,
28
+ setRDTUser: () => import_reddit_pixel.setRDTUser
29
+ });
30
+ module.exports = __toCommonJS(third_parties_exports);
31
+ var import_google_analytics = require("./google-analytics.cjs");
32
+ var import_meta_pixel = require("./meta-pixel.cjs");
33
+ var import_reddit_pixel = require("./reddit-pixel.cjs");
34
+ // Annotate the CommonJS export names for ESM import in node:
35
+ 0 && (module.exports = {
36
+ sendFBEvent,
37
+ sendGAEvent,
38
+ sendRDTEvent,
39
+ setFBUser,
40
+ setGAUser,
41
+ setRDTUser
42
+ });
43
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/third-parties/index.ts"],"sourcesContent":["export { sendGAEvent, setGAUser } from './google-analytics';\nexport { sendFBEvent, setFBUser } from './meta-pixel';\nexport { sendRDTEvent, setRDTUser } from './reddit-pixel';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAuC;AACvC,wBAAuC;AACvC,0BAAyC;","names":[]}
@@ -0,0 +1,8 @@
1
+ export { sendGAEvent, setGAUser } from './google-analytics.cjs';
2
+ export { sendFBEvent, setFBUser } from './meta-pixel.cjs';
3
+ export { sendRDTEvent, setRDTUser } from './reddit-pixel.cjs';
4
+ import '../track/gtag.cjs';
5
+ import '../track/types.cjs';
6
+ import '../visitor/types.cjs';
7
+ import '../track/fbq.cjs';
8
+ import '../track/rdt.cjs';
@@ -0,0 +1,8 @@
1
+ export { sendGAEvent, setGAUser } from './google-analytics.js';
2
+ export { sendFBEvent, setFBUser } from './meta-pixel.js';
3
+ export { sendRDTEvent, setRDTUser } from './reddit-pixel.js';
4
+ import '../track/gtag.js';
5
+ import '../track/types.js';
6
+ import '../visitor/types.js';
7
+ import '../track/fbq.js';
8
+ import '../track/rdt.js';
@@ -0,0 +1,13 @@
1
+ // src/third-parties/index.ts
2
+ import { sendGAEvent, setGAUser } from "./google-analytics.mjs";
3
+ import { sendFBEvent, setFBUser } from "./meta-pixel.mjs";
4
+ import { sendRDTEvent, setRDTUser } from "./reddit-pixel.mjs";
5
+ export {
6
+ sendFBEvent,
7
+ sendGAEvent,
8
+ sendRDTEvent,
9
+ setFBUser,
10
+ setGAUser,
11
+ setRDTUser
12
+ };
13
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/third-parties/index.ts"],"sourcesContent":["export { sendGAEvent, setGAUser } from './google-analytics';\nexport { sendFBEvent, setFBUser } from './meta-pixel';\nexport { sendRDTEvent, setRDTUser } from './reddit-pixel';\n"],"mappings":";AAAA,SAAS,aAAa,iBAAiB;AACvC,SAAS,aAAa,iBAAiB;AACvC,SAAS,cAAc,kBAAkB;","names":[]}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/third-parties/meta-pixel.ts
21
+ var meta_pixel_exports = {};
22
+ __export(meta_pixel_exports, {
23
+ sendFBEvent: () => sendFBEvent,
24
+ setFBUser: () => setFBUser
25
+ });
26
+ module.exports = __toCommonJS(meta_pixel_exports);
27
+ var import_fbq = require("../track/fbq.cjs");
28
+ var import_field = require("../utils/field.cjs");
29
+ function sendFBEvent(name, properties, event_id) {
30
+ if (typeof window === "undefined" || !window.fbq) {
31
+ console.warn("fbq has not been initialized");
32
+ return;
33
+ }
34
+ const { fbq } = window;
35
+ const options = { eventID: event_id };
36
+ const [type, fbEventName, fbEventProperties] = (0, import_fbq.mapFBEvent)(name, properties);
37
+ if (type === "track") {
38
+ fbq(type, fbEventName, fbEventProperties, options);
39
+ } else {
40
+ fbq(type, fbEventName, fbEventProperties, options);
41
+ }
42
+ }
43
+ function setFBUser(pixelId) {
44
+ return ({ user_id, data }) => {
45
+ if (typeof window === "undefined" || !window.fbq) {
46
+ console.warn("fbq has not been initialized");
47
+ return;
48
+ }
49
+ const address = (0, import_field.getFirst)(data == null ? void 0 : data.address);
50
+ window.fbq("init", pixelId, {
51
+ em: (0, import_field.getFirst)(data == null ? void 0 : data.email),
52
+ fn: address == null ? void 0 : address.first_name,
53
+ ln: address == null ? void 0 : address.last_name,
54
+ ph: (0, import_field.getFirst)(data == null ? void 0 : data.phone_number),
55
+ external_id: user_id,
56
+ ct: address == null ? void 0 : address.city,
57
+ st: address == null ? void 0 : address.street,
58
+ zp: address == null ? void 0 : address.postal_code,
59
+ country: address == null ? void 0 : address.country
60
+ });
61
+ };
62
+ }
63
+ // Annotate the CommonJS export names for ESM import in node:
64
+ 0 && (module.exports = {
65
+ sendFBEvent,
66
+ setFBUser
67
+ });
68
+ //# sourceMappingURL=meta-pixel.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/third-parties/meta-pixel.ts"],"sourcesContent":["import { PixelId, mapFBEvent } from '../track/fbq';\nimport { getFirst } from '../utils/field';\nimport type { FBQ } from '../track/fbq';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends FBQ {}\n}\n\nexport function sendFBEvent<T extends EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n event_id?: string\n) {\n if (typeof window === 'undefined' || !window.fbq) {\n console.warn('fbq has not been initialized');\n return;\n }\n const { fbq } = window;\n const options = { eventID: event_id };\n const [type, fbEventName, fbEventProperties] = mapFBEvent(name, properties);\n if (type === 'track') {\n fbq(type, fbEventName, fbEventProperties, options);\n } else {\n fbq(type, fbEventName, fbEventProperties, options);\n }\n}\n\nexport function setFBUser(pixelId: PixelId) {\n return ({ user_id, data }: UpdateVisitorDTO) => {\n if (typeof window === 'undefined' || !window.fbq) {\n console.warn('fbq has not been initialized');\n return;\n }\n\n const address = getFirst(data?.address);\n\n window.fbq('init', pixelId, {\n em: getFirst(data?.email),\n fn: address?.first_name,\n ln: address?.last_name,\n ph: getFirst(data?.phone_number),\n external_id: user_id,\n ct: address?.city,\n st: address?.street,\n zp: address?.postal_code,\n country: address?.country,\n });\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAoC;AACpC,mBAAyB;AASlB,SAAS,YACd,MACA,YACA,UACA;AACA,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,KAAK;AAChD,YAAQ,KAAK,8BAA8B;AAC3C;AAAA,EACF;AACA,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,UAAU,EAAE,SAAS,SAAS;AACpC,QAAM,CAAC,MAAM,aAAa,iBAAiB,QAAI,uBAAW,MAAM,UAAU;AAC1E,MAAI,SAAS,SAAS;AACpB,QAAI,MAAM,aAAa,mBAAmB,OAAO;AAAA,EACnD,OAAO;AACL,QAAI,MAAM,aAAa,mBAAmB,OAAO;AAAA,EACnD;AACF;AAEO,SAAS,UAAU,SAAkB;AAC1C,SAAO,CAAC,EAAE,SAAS,KAAK,MAAwB;AAC9C,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO,KAAK;AAChD,cAAQ,KAAK,8BAA8B;AAC3C;AAAA,IACF;AAEA,UAAM,cAAU,uBAAS,6BAAM,OAAO;AAEtC,WAAO,IAAI,QAAQ,SAAS;AAAA,MAC1B,QAAI,uBAAS,6BAAM,KAAK;AAAA,MACxB,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,QAAI,uBAAS,6BAAM,YAAY;AAAA,MAC/B,aAAa;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,SAAS,mCAAS;AAAA,IACpB,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,13 @@
1
+ import { FBQ, PixelId } from '../track/fbq.cjs';
2
+ import { EventName, TrackName, TrackProperties } from '../track/types.cjs';
3
+ import { UpdateVisitorDTO } from '../visitor/types.cjs';
4
+ import '../track/gtag.cjs';
5
+
6
+ declare global {
7
+ interface Window extends FBQ {
8
+ }
9
+ }
10
+ declare function sendFBEvent<T extends EventName>(name: TrackName<T>, properties?: TrackProperties<T>, event_id?: string): void;
11
+ declare function setFBUser(pixelId: PixelId): ({ user_id, data }: UpdateVisitorDTO) => void;
12
+
13
+ export { sendFBEvent, setFBUser };
@@ -0,0 +1,13 @@
1
+ import { FBQ, PixelId } from '../track/fbq.js';
2
+ import { EventName, TrackName, TrackProperties } from '../track/types.js';
3
+ import { UpdateVisitorDTO } from '../visitor/types.js';
4
+ import '../track/gtag.js';
5
+
6
+ declare global {
7
+ interface Window extends FBQ {
8
+ }
9
+ }
10
+ declare function sendFBEvent<T extends EventName>(name: TrackName<T>, properties?: TrackProperties<T>, event_id?: string): void;
11
+ declare function setFBUser(pixelId: PixelId): ({ user_id, data }: UpdateVisitorDTO) => void;
12
+
13
+ export { sendFBEvent, setFBUser };
@@ -0,0 +1,42 @@
1
+ // src/third-parties/meta-pixel.ts
2
+ import { mapFBEvent } from "../track/fbq.mjs";
3
+ import { getFirst } from "../utils/field.mjs";
4
+ function sendFBEvent(name, properties, event_id) {
5
+ if (typeof window === "undefined" || !window.fbq) {
6
+ console.warn("fbq has not been initialized");
7
+ return;
8
+ }
9
+ const { fbq } = window;
10
+ const options = { eventID: event_id };
11
+ const [type, fbEventName, fbEventProperties] = mapFBEvent(name, properties);
12
+ if (type === "track") {
13
+ fbq(type, fbEventName, fbEventProperties, options);
14
+ } else {
15
+ fbq(type, fbEventName, fbEventProperties, options);
16
+ }
17
+ }
18
+ function setFBUser(pixelId) {
19
+ return ({ user_id, data }) => {
20
+ if (typeof window === "undefined" || !window.fbq) {
21
+ console.warn("fbq has not been initialized");
22
+ return;
23
+ }
24
+ const address = getFirst(data == null ? void 0 : data.address);
25
+ window.fbq("init", pixelId, {
26
+ em: getFirst(data == null ? void 0 : data.email),
27
+ fn: address == null ? void 0 : address.first_name,
28
+ ln: address == null ? void 0 : address.last_name,
29
+ ph: getFirst(data == null ? void 0 : data.phone_number),
30
+ external_id: user_id,
31
+ ct: address == null ? void 0 : address.city,
32
+ st: address == null ? void 0 : address.street,
33
+ zp: address == null ? void 0 : address.postal_code,
34
+ country: address == null ? void 0 : address.country
35
+ });
36
+ };
37
+ }
38
+ export {
39
+ sendFBEvent,
40
+ setFBUser
41
+ };
42
+ //# sourceMappingURL=meta-pixel.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/third-parties/meta-pixel.ts"],"sourcesContent":["import { PixelId, mapFBEvent } from '../track/fbq';\nimport { getFirst } from '../utils/field';\nimport type { FBQ } from '../track/fbq';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends FBQ {}\n}\n\nexport function sendFBEvent<T extends EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n event_id?: string\n) {\n if (typeof window === 'undefined' || !window.fbq) {\n console.warn('fbq has not been initialized');\n return;\n }\n const { fbq } = window;\n const options = { eventID: event_id };\n const [type, fbEventName, fbEventProperties] = mapFBEvent(name, properties);\n if (type === 'track') {\n fbq(type, fbEventName, fbEventProperties, options);\n } else {\n fbq(type, fbEventName, fbEventProperties, options);\n }\n}\n\nexport function setFBUser(pixelId: PixelId) {\n return ({ user_id, data }: UpdateVisitorDTO) => {\n if (typeof window === 'undefined' || !window.fbq) {\n console.warn('fbq has not been initialized');\n return;\n }\n\n const address = getFirst(data?.address);\n\n window.fbq('init', pixelId, {\n em: getFirst(data?.email),\n fn: address?.first_name,\n ln: address?.last_name,\n ph: getFirst(data?.phone_number),\n external_id: user_id,\n ct: address?.city,\n st: address?.street,\n zp: address?.postal_code,\n country: address?.country,\n });\n };\n}\n"],"mappings":";AAAA,SAAkB,kBAAkB;AACpC,SAAS,gBAAgB;AASlB,SAAS,YACd,MACA,YACA,UACA;AACA,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,KAAK;AAChD,YAAQ,KAAK,8BAA8B;AAC3C;AAAA,EACF;AACA,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,UAAU,EAAE,SAAS,SAAS;AACpC,QAAM,CAAC,MAAM,aAAa,iBAAiB,IAAI,WAAW,MAAM,UAAU;AAC1E,MAAI,SAAS,SAAS;AACpB,QAAI,MAAM,aAAa,mBAAmB,OAAO;AAAA,EACnD,OAAO;AACL,QAAI,MAAM,aAAa,mBAAmB,OAAO;AAAA,EACnD;AACF;AAEO,SAAS,UAAU,SAAkB;AAC1C,SAAO,CAAC,EAAE,SAAS,KAAK,MAAwB;AAC9C,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO,KAAK;AAChD,cAAQ,KAAK,8BAA8B;AAC3C;AAAA,IACF;AAEA,UAAM,UAAU,SAAS,6BAAM,OAAO;AAEtC,WAAO,IAAI,QAAQ,SAAS;AAAA,MAC1B,IAAI,SAAS,6BAAM,KAAK;AAAA,MACxB,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,IAAI,SAAS,6BAAM,YAAY;AAAA,MAC/B,aAAa;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,SAAS,mCAAS;AAAA,IACpB,CAAC;AAAA,EACH;AACF;","names":[]}