@shware/analytics 3.6.4 → 3.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 (407) hide show
  1. package/README.md +50 -3
  2. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  3. package/dist/constants/storage.cjs +12 -37
  4. package/dist/constants/storage.cjs.map +1 -1
  5. package/dist/constants/storage.d.cts +10 -8
  6. package/dist/constants/storage.d.cts.map +1 -0
  7. package/dist/constants/storage.d.mts +13 -0
  8. package/dist/constants/storage.d.mts.map +1 -0
  9. package/dist/constants/storage.mjs +12 -13
  10. package/dist/constants/storage.mjs.map +1 -1
  11. package/dist/feedback/index.cjs +14 -40
  12. package/dist/feedback/index.cjs.map +1 -1
  13. package/dist/feedback/index.d.cts +4 -4
  14. package/dist/feedback/index.d.cts.map +1 -0
  15. package/dist/feedback/index.d.mts +6 -0
  16. package/dist/feedback/index.d.mts.map +1 -0
  17. package/dist/feedback/index.mjs +12 -14
  18. package/dist/feedback/index.mjs.map +1 -1
  19. package/dist/hooks/use-app-analytics.cjs +46 -65
  20. package/dist/hooks/use-app-analytics.cjs.map +1 -1
  21. package/dist/hooks/use-app-analytics.d.cts +3 -1
  22. package/dist/hooks/use-app-analytics.d.cts.map +1 -0
  23. package/dist/hooks/use-app-analytics.d.mts +5 -0
  24. package/dist/hooks/use-app-analytics.d.mts.map +1 -0
  25. package/dist/hooks/use-app-analytics.mjs +41 -36
  26. package/dist/hooks/use-app-analytics.mjs.map +1 -1
  27. package/dist/hooks/use-click-id-persistence.cjs +43 -65
  28. package/dist/hooks/use-click-id-persistence.cjs.map +1 -1
  29. package/dist/hooks/use-click-id-persistence.d.cts +3 -1
  30. package/dist/hooks/use-click-id-persistence.d.cts.map +1 -0
  31. package/dist/hooks/use-click-id-persistence.d.mts +5 -0
  32. package/dist/hooks/use-click-id-persistence.d.mts.map +1 -0
  33. package/dist/hooks/use-click-id-persistence.mjs +40 -38
  34. package/dist/hooks/use-click-id-persistence.mjs.map +1 -1
  35. package/dist/hooks/use-outbound-click-analytics.cjs +33 -55
  36. package/dist/hooks/use-outbound-click-analytics.cjs.map +1 -1
  37. package/dist/hooks/use-outbound-click-analytics.d.cts +3 -1
  38. package/dist/hooks/use-outbound-click-analytics.d.cts.map +1 -0
  39. package/dist/hooks/{use-outbound-click-analytics.d.ts → use-outbound-click-analytics.d.mts} +3 -1
  40. package/dist/hooks/use-outbound-click-analytics.d.mts.map +1 -0
  41. package/dist/hooks/use-outbound-click-analytics.mjs +31 -29
  42. package/dist/hooks/use-outbound-click-analytics.mjs.map +1 -1
  43. package/dist/hooks/use-previous.cjs +11 -35
  44. package/dist/hooks/use-previous.cjs.map +1 -1
  45. package/dist/hooks/use-previous.d.cts +3 -1
  46. package/dist/hooks/use-previous.d.cts.map +1 -0
  47. package/dist/hooks/use-previous.d.mts +5 -0
  48. package/dist/hooks/use-previous.d.mts.map +1 -0
  49. package/dist/hooks/use-previous.mjs +9 -9
  50. package/dist/hooks/use-previous.mjs.map +1 -1
  51. package/dist/hooks/use-track-impression.cjs +24 -51
  52. package/dist/hooks/use-track-impression.cjs.map +1 -1
  53. package/dist/hooks/use-track-impression.d.cts +5 -6
  54. package/dist/hooks/use-track-impression.d.cts.map +1 -0
  55. package/dist/hooks/use-track-impression.d.mts +6 -0
  56. package/dist/hooks/use-track-impression.d.mts.map +1 -0
  57. package/dist/hooks/use-track-impression.mjs +22 -25
  58. package/dist/hooks/use-track-impression.mjs.map +1 -1
  59. package/dist/hooks/use-web-analytics.cjs +98 -109
  60. package/dist/hooks/use-web-analytics.cjs.map +1 -1
  61. package/dist/hooks/use-web-analytics.d.cts +3 -1
  62. package/dist/hooks/use-web-analytics.d.cts.map +1 -0
  63. package/dist/hooks/{use-web-analytics.d.ts → use-web-analytics.d.mts} +3 -1
  64. package/dist/hooks/use-web-analytics.d.mts.map +1 -0
  65. package/dist/hooks/use-web-analytics.mjs +93 -80
  66. package/dist/hooks/use-web-analytics.mjs.map +1 -1
  67. package/dist/index.cjs +28 -74
  68. package/dist/index.d.cts +11 -13
  69. package/dist/index.d.mts +11 -0
  70. package/dist/index.mjs +3 -34
  71. package/dist/link/index.cjs +31 -58
  72. package/dist/link/index.cjs.map +1 -1
  73. package/dist/link/index.d.cts +7 -7
  74. package/dist/link/index.d.cts.map +1 -0
  75. package/dist/link/index.d.mts +11 -0
  76. package/dist/link/index.d.mts.map +1 -0
  77. package/dist/link/index.mjs +28 -31
  78. package/dist/link/index.mjs.map +1 -1
  79. package/dist/native/fbsdk.cjs +12 -33
  80. package/dist/native/fbsdk.cjs.map +1 -1
  81. package/dist/native/fbsdk.d.cts +4 -4
  82. package/dist/native/fbsdk.d.cts.map +1 -0
  83. package/dist/native/{fbsdk.d.ts → fbsdk.d.mts} +4 -4
  84. package/dist/native/fbsdk.d.mts.map +1 -0
  85. package/dist/native/fbsdk.mjs +10 -7
  86. package/dist/native/fbsdk.mjs.map +1 -1
  87. package/dist/native/fingerprint.cjs +41 -64
  88. package/dist/native/fingerprint.cjs.map +1 -1
  89. package/dist/native/fingerprint.d.cts +22 -20
  90. package/dist/native/fingerprint.d.cts.map +1 -0
  91. package/dist/native/fingerprint.d.mts +28 -0
  92. package/dist/native/fingerprint.d.mts.map +1 -0
  93. package/dist/native/fingerprint.mjs +36 -42
  94. package/dist/native/fingerprint.mjs.map +1 -1
  95. package/dist/native/firebase.cjs +12 -39
  96. package/dist/native/firebase.cjs.map +1 -1
  97. package/dist/native/firebase.d.cts +4 -4
  98. package/dist/native/firebase.d.cts.map +1 -0
  99. package/dist/native/firebase.d.mts +6 -0
  100. package/dist/native/firebase.d.mts.map +1 -0
  101. package/dist/native/firebase.mjs +10 -13
  102. package/dist/native/firebase.mjs.map +1 -1
  103. package/dist/native/index.cjs +11 -45
  104. package/dist/native/index.d.cts +4 -7
  105. package/dist/native/index.d.mts +4 -0
  106. package/dist/native/index.mjs +2 -12
  107. package/dist/native/posthog.cjs +5 -30
  108. package/dist/native/posthog.cjs.map +1 -1
  109. package/dist/native/posthog.d.cts +3 -1
  110. package/dist/native/posthog.d.cts.map +1 -0
  111. package/dist/native/posthog.d.mts +5 -0
  112. package/dist/native/posthog.d.mts.map +1 -0
  113. package/dist/native/posthog.mjs +5 -6
  114. package/dist/native/posthog.mjs.map +1 -1
  115. package/dist/native/setup.cjs +91 -129
  116. package/dist/native/setup.cjs.map +1 -1
  117. package/dist/native/setup.d.cts +6 -6
  118. package/dist/native/setup.d.cts.map +1 -0
  119. package/dist/native/{setup.d.ts → setup.d.mts} +6 -6
  120. package/dist/native/setup.d.mts.map +1 -0
  121. package/dist/native/setup.mjs +83 -105
  122. package/dist/native/setup.mjs.map +1 -1
  123. package/dist/next/index.cjs +72 -145
  124. package/dist/next/index.cjs.map +1 -1
  125. package/dist/next/index.d.cts +18 -19
  126. package/dist/next/index.d.cts.map +1 -0
  127. package/dist/next/index.d.mts +21 -0
  128. package/dist/next/index.d.mts.map +1 -0
  129. package/dist/next/index.mjs +65 -107
  130. package/dist/next/index.mjs.map +1 -1
  131. package/dist/react-router/index.cjs +80 -144
  132. package/dist/react-router/index.cjs.map +1 -1
  133. package/dist/react-router/index.d.cts +18 -19
  134. package/dist/react-router/index.d.cts.map +1 -0
  135. package/dist/react-router/index.d.mts +21 -0
  136. package/dist/react-router/index.d.mts.map +1 -0
  137. package/dist/react-router/index.mjs +75 -115
  138. package/dist/react-router/index.mjs.map +1 -1
  139. package/dist/schema/index.cjs +189 -233
  140. package/dist/schema/index.cjs.map +1 -1
  141. package/dist/schema/index.d.cts +308 -231
  142. package/dist/schema/index.d.cts.map +1 -0
  143. package/dist/schema/index.d.mts +401 -0
  144. package/dist/schema/index.d.mts.map +1 -0
  145. package/dist/schema/index.mjs +179 -222
  146. package/dist/schema/index.mjs.map +1 -1
  147. package/dist/server/index.cjs +9 -40
  148. package/dist/server/index.d.cts +5 -9
  149. package/dist/server/index.d.mts +5 -0
  150. package/dist/server/index.mjs +5 -12
  151. package/dist/server/linkedin-conversions-api.cjs +66 -95
  152. package/dist/server/linkedin-conversions-api.cjs.map +1 -1
  153. package/dist/server/linkedin-conversions-api.d.cts +45 -45
  154. package/dist/server/linkedin-conversions-api.d.cts.map +1 -0
  155. package/dist/server/linkedin-conversions-api.d.mts +56 -0
  156. package/dist/server/linkedin-conversions-api.d.mts.map +1 -0
  157. package/dist/server/linkedin-conversions-api.mjs +63 -68
  158. package/dist/server/linkedin-conversions-api.mjs.map +1 -1
  159. package/dist/server/meta-conversions-api.cjs +157 -265
  160. package/dist/server/meta-conversions-api.cjs.map +1 -1
  161. package/dist/server/meta-conversions-api.d.cts +8 -9
  162. package/dist/server/meta-conversions-api.d.cts.map +1 -0
  163. package/dist/server/meta-conversions-api.d.mts +10 -0
  164. package/dist/server/meta-conversions-api.d.mts.map +1 -0
  165. package/dist/server/meta-conversions-api.mjs +151 -243
  166. package/dist/server/meta-conversions-api.mjs.map +1 -1
  167. package/dist/server/openai-conversions-api.cjs +69 -96
  168. package/dist/server/openai-conversions-api.cjs.map +1 -1
  169. package/dist/server/openai-conversions-api.d.cts +34 -34
  170. package/dist/server/openai-conversions-api.d.cts.map +1 -0
  171. package/dist/server/openai-conversions-api.d.mts +47 -0
  172. package/dist/server/openai-conversions-api.d.mts.map +1 -0
  173. package/dist/server/openai-conversions-api.mjs +65 -68
  174. package/dist/server/openai-conversions-api.mjs.map +1 -1
  175. package/dist/server/reddit-conversions-api.cjs +64 -91
  176. package/dist/server/reddit-conversions-api.cjs.map +1 -1
  177. package/dist/server/reddit-conversions-api.d.cts +61 -61
  178. package/dist/server/reddit-conversions-api.d.cts.map +1 -0
  179. package/dist/server/reddit-conversions-api.d.mts +75 -0
  180. package/dist/server/reddit-conversions-api.d.mts.map +1 -0
  181. package/dist/server/reddit-conversions-api.mjs +59 -62
  182. package/dist/server/reddit-conversions-api.mjs.map +1 -1
  183. package/dist/setup/index.cjs +34 -63
  184. package/dist/setup/index.cjs.map +1 -1
  185. package/dist/setup/index.d.cts +30 -30
  186. package/dist/setup/index.d.cts.map +1 -0
  187. package/dist/setup/index.d.mts +41 -0
  188. package/dist/setup/index.d.mts.map +1 -0
  189. package/dist/setup/index.mjs +31 -36
  190. package/dist/setup/index.mjs.map +1 -1
  191. package/dist/setup/session.cjs +70 -106
  192. package/dist/setup/session.cjs.map +1 -1
  193. package/dist/setup/session.d.cts +26 -24
  194. package/dist/setup/session.d.cts.map +1 -0
  195. package/dist/setup/session.d.mts +31 -0
  196. package/dist/setup/session.d.mts.map +1 -0
  197. package/dist/setup/session.mjs +68 -80
  198. package/dist/setup/session.mjs.map +1 -1
  199. package/dist/tanstack/index.cjs +86 -156
  200. package/dist/tanstack/index.cjs.map +1 -1
  201. package/dist/tanstack/index.d.cts +19 -20
  202. package/dist/tanstack/index.d.cts.map +1 -0
  203. package/dist/tanstack/index.d.mts +22 -0
  204. package/dist/tanstack/index.d.mts.map +1 -0
  205. package/dist/tanstack/index.mjs +81 -127
  206. package/dist/tanstack/index.mjs.map +1 -1
  207. package/dist/third-parties/google-analytics.cjs +18 -43
  208. package/dist/third-parties/google-analytics.cjs.map +1 -1
  209. package/dist/third-parties/google-analytics.d.cts +7 -7
  210. package/dist/third-parties/google-analytics.d.cts.map +1 -0
  211. package/dist/third-parties/google-analytics.d.mts +12 -0
  212. package/dist/third-parties/google-analytics.d.mts.map +1 -0
  213. package/dist/third-parties/google-analytics.mjs +16 -17
  214. package/dist/third-parties/google-analytics.mjs.map +1 -1
  215. package/dist/third-parties/ignored-events.cjs +35 -68
  216. package/dist/third-parties/ignored-events.cjs.map +1 -1
  217. package/dist/third-parties/ignored-events.d.cts +3 -1
  218. package/dist/third-parties/ignored-events.d.cts.map +1 -0
  219. package/dist/third-parties/ignored-events.d.mts +5 -0
  220. package/dist/third-parties/ignored-events.d.mts.map +1 -0
  221. package/dist/third-parties/ignored-events.mjs +34 -43
  222. package/dist/third-parties/ignored-events.mjs.map +1 -1
  223. package/dist/third-parties/index.cjs +16 -53
  224. package/dist/third-parties/index.d.cts +6 -12
  225. package/dist/third-parties/index.d.mts +6 -0
  226. package/dist/third-parties/index.mjs +1 -14
  227. package/dist/third-parties/linkedin-insight-tag.cjs +28 -50
  228. package/dist/third-parties/linkedin-insight-tag.cjs.map +1 -1
  229. package/dist/third-parties/linkedin-insight-tag.d.cts +8 -9
  230. package/dist/third-parties/linkedin-insight-tag.d.cts.map +1 -0
  231. package/dist/third-parties/{linkedin-insight-tag.d.ts → linkedin-insight-tag.d.mts} +8 -9
  232. package/dist/third-parties/linkedin-insight-tag.d.mts.map +1 -0
  233. package/dist/third-parties/linkedin-insight-tag.mjs +25 -23
  234. package/dist/third-parties/linkedin-insight-tag.mjs.map +1 -1
  235. package/dist/third-parties/meta-pixel.cjs +45 -66
  236. package/dist/third-parties/meta-pixel.cjs.map +1 -1
  237. package/dist/third-parties/meta-pixel.d.cts +7 -8
  238. package/dist/third-parties/meta-pixel.d.cts.map +1 -0
  239. package/dist/third-parties/meta-pixel.d.mts +12 -0
  240. package/dist/third-parties/meta-pixel.d.mts.map +1 -0
  241. package/dist/third-parties/meta-pixel.mjs +41 -38
  242. package/dist/third-parties/meta-pixel.mjs.map +1 -1
  243. package/dist/third-parties/openai-pixel.cjs +63 -68
  244. package/dist/third-parties/openai-pixel.cjs.map +1 -1
  245. package/dist/third-parties/openai-pixel.d.cts +7 -8
  246. package/dist/third-parties/openai-pixel.d.cts.map +1 -0
  247. package/dist/third-parties/{openai-pixel.d.ts → openai-pixel.d.mts} +7 -8
  248. package/dist/third-parties/openai-pixel.d.mts.map +1 -0
  249. package/dist/third-parties/openai-pixel.mjs +60 -41
  250. package/dist/third-parties/openai-pixel.mjs.map +1 -1
  251. package/dist/third-parties/posthog.cjs +23 -43
  252. package/dist/third-parties/posthog.cjs.map +1 -1
  253. package/dist/third-parties/posthog.d.cts +5 -5
  254. package/dist/third-parties/posthog.d.cts.map +1 -0
  255. package/dist/third-parties/{posthog.d.ts → posthog.d.mts} +5 -5
  256. package/dist/third-parties/posthog.d.mts.map +1 -0
  257. package/dist/third-parties/posthog.mjs +20 -16
  258. package/dist/third-parties/posthog.mjs.map +1 -1
  259. package/dist/third-parties/reddit-pixel.cjs +37 -58
  260. package/dist/third-parties/reddit-pixel.cjs.map +1 -1
  261. package/dist/third-parties/reddit-pixel.d.cts +7 -8
  262. package/dist/third-parties/reddit-pixel.d.cts.map +1 -0
  263. package/dist/third-parties/reddit-pixel.d.mts +12 -0
  264. package/dist/third-parties/reddit-pixel.d.mts.map +1 -0
  265. package/dist/third-parties/reddit-pixel.mjs +33 -30
  266. package/dist/third-parties/reddit-pixel.mjs.map +1 -1
  267. package/dist/track/fbq.cjs +179 -135
  268. package/dist/track/fbq.cjs.map +1 -1
  269. package/dist/track/fbq.d.cts +234 -233
  270. package/dist/track/fbq.d.cts.map +1 -0
  271. package/dist/track/fbq.d.mts +280 -0
  272. package/dist/track/fbq.d.mts.map +1 -0
  273. package/dist/track/fbq.mjs +176 -108
  274. package/dist/track/fbq.mjs.map +1 -1
  275. package/dist/track/gtag.cjs +63 -86
  276. package/dist/track/gtag.cjs.map +1 -1
  277. package/dist/track/gtag.d.cts +682 -682
  278. package/dist/track/gtag.d.cts.map +1 -0
  279. package/dist/track/gtag.d.mts +762 -0
  280. package/dist/track/gtag.d.mts.map +1 -0
  281. package/dist/track/gtag.mjs +62 -61
  282. package/dist/track/gtag.mjs.map +1 -1
  283. package/dist/track/index.cjs +111 -136
  284. package/dist/track/index.cjs.map +1 -1
  285. package/dist/track/index.d.cts +8 -8
  286. package/dist/track/index.d.cts.map +1 -0
  287. package/dist/track/{index.d.ts → index.d.mts} +8 -8
  288. package/dist/track/index.d.mts.map +1 -0
  289. package/dist/track/index.mjs +105 -106
  290. package/dist/track/index.mjs.map +1 -1
  291. package/dist/track/lintrk.cjs +0 -19
  292. package/dist/track/lintrk.d.cts +12 -10
  293. package/dist/track/lintrk.d.cts.map +1 -0
  294. package/dist/track/lintrk.d.mts +14 -0
  295. package/dist/track/lintrk.d.mts.map +1 -0
  296. package/dist/track/lintrk.mjs +1 -1
  297. package/dist/track/oaiq.cjs +153 -146
  298. package/dist/track/oaiq.cjs.map +1 -1
  299. package/dist/track/oaiq.d.cts +65 -64
  300. package/dist/track/oaiq.d.cts.map +1 -0
  301. package/dist/track/oaiq.d.mts +112 -0
  302. package/dist/track/oaiq.d.mts.map +1 -0
  303. package/dist/track/oaiq.mjs +149 -118
  304. package/dist/track/oaiq.mjs.map +1 -1
  305. package/dist/track/rdt.cjs +66 -110
  306. package/dist/track/rdt.cjs.map +1 -1
  307. package/dist/track/rdt.d.cts +74 -73
  308. package/dist/track/rdt.d.cts.map +1 -0
  309. package/dist/track/rdt.d.mts +97 -0
  310. package/dist/track/rdt.d.mts.map +1 -0
  311. package/dist/track/rdt.mjs +63 -83
  312. package/dist/track/rdt.mjs.map +1 -1
  313. package/dist/track/types.cjs +0 -19
  314. package/dist/track/types.d.cts +140 -111
  315. package/dist/track/types.d.cts.map +1 -0
  316. package/dist/track/types.d.mts +171 -0
  317. package/dist/track/types.d.mts.map +1 -0
  318. package/dist/track/types.mjs +1 -1
  319. package/dist/utils/field.cjs +8 -32
  320. package/dist/utils/field.cjs.map +1 -1
  321. package/dist/utils/field.d.cts +3 -1
  322. package/dist/utils/field.d.cts.map +1 -0
  323. package/dist/utils/{field.d.ts → field.d.mts} +3 -1
  324. package/dist/utils/field.d.mts.map +1 -0
  325. package/dist/utils/field.mjs +7 -7
  326. package/dist/utils/field.mjs.map +1 -1
  327. package/dist/utils/stripe.cjs +25 -49
  328. package/dist/utils/stripe.cjs.map +1 -1
  329. package/dist/utils/stripe.d.cts +3 -1
  330. package/dist/utils/stripe.d.cts.map +1 -0
  331. package/dist/utils/{stripe.d.ts → stripe.d.mts} +3 -1
  332. package/dist/utils/stripe.d.mts.map +1 -0
  333. package/dist/utils/stripe.mjs +23 -23
  334. package/dist/utils/stripe.mjs.map +1 -1
  335. package/dist/visitor/index.cjs +60 -86
  336. package/dist/visitor/index.cjs.map +1 -1
  337. package/dist/visitor/index.d.cts +4 -5
  338. package/dist/visitor/index.d.cts.map +1 -0
  339. package/dist/visitor/{index.d.ts → index.d.mts} +4 -5
  340. package/dist/visitor/index.d.mts.map +1 -0
  341. package/dist/visitor/index.mjs +57 -59
  342. package/dist/visitor/index.mjs.map +1 -1
  343. package/dist/visitor/types.cjs +0 -19
  344. package/dist/visitor/types.d.cts +14 -14
  345. package/dist/visitor/types.d.cts.map +1 -0
  346. package/dist/visitor/types.d.mts +20 -0
  347. package/dist/visitor/types.d.mts.map +1 -0
  348. package/dist/visitor/types.mjs +1 -1
  349. package/dist/web/index.cjs +108 -148
  350. package/dist/web/index.cjs.map +1 -1
  351. package/dist/web/index.d.cts +5 -6
  352. package/dist/web/index.d.cts.map +1 -0
  353. package/dist/web/index.d.mts +9 -0
  354. package/dist/web/index.d.mts.map +1 -0
  355. package/dist/web/index.mjs +101 -109
  356. package/dist/web/index.mjs.map +1 -1
  357. package/package.json +102 -49
  358. package/dist/constants/storage.d.ts +0 -11
  359. package/dist/feedback/index.d.ts +0 -6
  360. package/dist/hooks/use-app-analytics.d.ts +0 -3
  361. package/dist/hooks/use-click-id-persistence.d.ts +0 -3
  362. package/dist/hooks/use-previous.d.ts +0 -3
  363. package/dist/hooks/use-track-impression.d.ts +0 -7
  364. package/dist/index.cjs.map +0 -1
  365. package/dist/index.d.ts +0 -13
  366. package/dist/index.mjs.map +0 -1
  367. package/dist/link/index.d.ts +0 -11
  368. package/dist/native/fingerprint.d.ts +0 -26
  369. package/dist/native/firebase.d.ts +0 -6
  370. package/dist/native/index.cjs.map +0 -1
  371. package/dist/native/index.d.ts +0 -7
  372. package/dist/native/index.mjs.map +0 -1
  373. package/dist/native/posthog.d.ts +0 -3
  374. package/dist/next/index.d.ts +0 -22
  375. package/dist/react-router/index.d.ts +0 -22
  376. package/dist/schema/index.d.ts +0 -324
  377. package/dist/server/index.cjs.map +0 -1
  378. package/dist/server/index.d.ts +0 -9
  379. package/dist/server/index.mjs.map +0 -1
  380. package/dist/server/linkedin-conversions-api.d.ts +0 -56
  381. package/dist/server/meta-conversions-api.d.ts +0 -11
  382. package/dist/server/openai-conversions-api.d.ts +0 -47
  383. package/dist/server/reddit-conversions-api.d.ts +0 -75
  384. package/dist/setup/index.d.ts +0 -41
  385. package/dist/setup/session.d.ts +0 -29
  386. package/dist/tanstack/index.d.ts +0 -23
  387. package/dist/third-parties/google-analytics.d.ts +0 -12
  388. package/dist/third-parties/ignored-events.d.ts +0 -3
  389. package/dist/third-parties/index.cjs.map +0 -1
  390. package/dist/third-parties/index.d.ts +0 -12
  391. package/dist/third-parties/index.mjs.map +0 -1
  392. package/dist/third-parties/meta-pixel.d.ts +0 -13
  393. package/dist/third-parties/reddit-pixel.d.ts +0 -13
  394. package/dist/track/fbq.d.ts +0 -279
  395. package/dist/track/gtag.d.ts +0 -762
  396. package/dist/track/lintrk.cjs.map +0 -1
  397. package/dist/track/lintrk.d.ts +0 -12
  398. package/dist/track/lintrk.mjs.map +0 -1
  399. package/dist/track/oaiq.d.ts +0 -111
  400. package/dist/track/rdt.d.ts +0 -96
  401. package/dist/track/types.cjs.map +0 -1
  402. package/dist/track/types.d.ts +0 -142
  403. package/dist/track/types.mjs.map +0 -1
  404. package/dist/visitor/types.cjs.map +0 -1
  405. package/dist/visitor/types.d.ts +0 -20
  406. package/dist/visitor/types.mjs.map +0 -1
  407. package/dist/web/index.d.ts +0 -10
@@ -1,96 +1,69 @@
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/server/reddit-conversions-api.ts
21
- var reddit_conversions_api_exports = {};
22
- __export(reddit_conversions_api_exports, {
23
- getServerEvent: () => getServerEvent,
24
- sendEvents: () => sendEvents
25
- });
26
- module.exports = __toCommonJS(reddit_conversions_api_exports);
27
- var import_utils = require("@shware/utils");
28
- var import_ignored_events = require("../third-parties/ignored-events.cjs");
29
- var import_rdt = require("../track/rdt.cjs");
30
- var import_field = require("../utils/field.cjs");
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_third_parties_ignored_events = require("../third-parties/ignored-events.cjs");
3
+ const require_track_rdt = require("../track/rdt.cjs");
4
+ const require_utils_field = require("../utils/field.cjs");
5
+ let _shware_utils = require("@shware/utils");
6
+ //#region src/server/reddit-conversions-api.ts
31
7
  function getServerEvent(event, data) {
32
- const { id, name, properties, tags } = event;
33
- const [type, params] = (0, import_rdt.mapRDTEvent)(name, properties, id);
34
- return {
35
- click_id: tags.rdt_cid,
36
- event_at: Date.now(),
37
- action_source: tags.source === "web" ? "WEBSITE" : tags.source === "app" ? "APP" : "UNKNOWN",
38
- type: {
39
- tracking_type: type === "Custom" ? "CUSTOM" : (0, import_rdt.mapServerStandardEvent)(type),
40
- custom_event_name: type === "Custom" ? params.customEventName : void 0
41
- },
42
- metadata: {
43
- conversion_id: id,
44
- currency: "currency" in params && typeof params.currency === "string" ? params.currency.toUpperCase() : void 0,
45
- item_count: "itemCount" in params && typeof params.itemCount === "number" ? params.itemCount : void 0,
46
- value: "value" in params && typeof params.value === "number" ? params.value : void 0,
47
- products: "products" in params && Array.isArray(params.products) && params.products.length > 0 ? params.products : void 0
48
- },
49
- user: {
50
- email: (0, import_field.getFirst)(data.email),
51
- external_id: data.user_id,
52
- ip_address: data.ip_address,
53
- phone_number: (0, import_field.getFirst)(data.phone_number),
54
- user_agent: data.user_agent,
55
- idfa: tags.platform === "ios" ? tags.advertising_id : void 0,
56
- aaid: tags.platform === "android" ? tags.advertising_id : void 0,
57
- uuid: tags.rdt_uuid,
58
- screen_dimensions: tags.screen_width && tags.screen_height ? { width: tags.screen_width, height: tags.screen_height } : void 0
59
- }
60
- };
8
+ const { id, name, properties, tags } = event;
9
+ const [type, params] = require_track_rdt.mapRDTEvent(name, properties, id);
10
+ return {
11
+ click_id: tags.rdt_cid,
12
+ event_at: Date.now(),
13
+ action_source: tags.source === "web" ? "WEBSITE" : tags.source === "app" ? "APP" : "UNKNOWN",
14
+ type: {
15
+ tracking_type: type === "Custom" ? "CUSTOM" : require_track_rdt.mapServerStandardEvent(type),
16
+ custom_event_name: type === "Custom" ? params.customEventName : void 0
17
+ },
18
+ metadata: {
19
+ conversion_id: id,
20
+ currency: "currency" in params && typeof params.currency === "string" ? params.currency.toUpperCase() : void 0,
21
+ item_count: "itemCount" in params && typeof params.itemCount === "number" ? params.itemCount : void 0,
22
+ value: "value" in params && typeof params.value === "number" ? params.value : void 0,
23
+ products: "products" in params && Array.isArray(params.products) && params.products.length > 0 ? params.products : void 0
24
+ },
25
+ user: {
26
+ email: require_utils_field.getFirst(data.email),
27
+ external_id: data.user_id,
28
+ ip_address: data.ip_address,
29
+ phone_number: require_utils_field.getFirst(data.phone_number),
30
+ user_agent: data.user_agent,
31
+ idfa: tags.platform === "ios" ? tags.advertising_id : void 0,
32
+ aaid: tags.platform === "android" ? tags.advertising_id : void 0,
33
+ uuid: tags.rdt_uuid,
34
+ screen_dimensions: tags.screen_width && tags.screen_height ? {
35
+ width: tags.screen_width,
36
+ height: tags.screen_height
37
+ } : void 0
38
+ }
39
+ };
61
40
  }
62
41
  async function sendEvents(accessToken, pixelId, events, data = {}, testId) {
63
- const dto = {
64
- data: {
65
- test_id: testId,
66
- events: events.filter((event) => !import_ignored_events.IGNORED_EVENTS.includes(event.name)).map((event) => getServerEvent(event, data))
67
- }
68
- };
69
- if (dto.data.events.length === 0) return;
70
- try {
71
- const response = await (0, import_utils.fetch)(
72
- `https://ads-api.reddit.com/api/v3/pixels/${pixelId}/conversion_events`,
73
- {
74
- method: "POST",
75
- headers: {
76
- "Content-Type": "application/json",
77
- Accept: "application/json",
78
- Authorization: `Bearer ${accessToken}`
79
- },
80
- body: JSON.stringify(dto)
81
- }
82
- );
83
- if (response.ok) return;
84
- const { status } = response;
85
- const message = await response.text();
86
- console.error(`Failed to send Reddit conversion, status: ${status}, body: ${message}`);
87
- } catch (error) {
88
- console.error("Failed to send Reddit conversion, network error:", error);
89
- }
42
+ const dto = { data: {
43
+ test_id: testId,
44
+ events: events.filter((event) => !require_third_parties_ignored_events.IGNORED_EVENTS.includes(event.name)).map((event) => getServerEvent(event, data))
45
+ } };
46
+ if (dto.data.events.length === 0) return;
47
+ try {
48
+ const response = await (0, _shware_utils.fetch)(`https://ads-api.reddit.com/api/v3/pixels/${pixelId}/conversion_events`, {
49
+ method: "POST",
50
+ headers: {
51
+ "Content-Type": "application/json",
52
+ Accept: "application/json",
53
+ Authorization: `Bearer ${accessToken}`
54
+ },
55
+ body: JSON.stringify(dto)
56
+ });
57
+ if (response.ok) return;
58
+ const { status } = response;
59
+ const message = await response.text();
60
+ console.error(`Failed to send Reddit conversion, status: ${status}, body: ${message}`);
61
+ } catch (error) {
62
+ console.error("Failed to send Reddit conversion, network error:", error);
63
+ }
90
64
  }
91
- // Annotate the CommonJS export names for ESM import in node:
92
- 0 && (module.exports = {
93
- getServerEvent,
94
- sendEvents
95
- });
65
+ //#endregion
66
+ exports.getServerEvent = getServerEvent;
67
+ exports.sendEvents = sendEvents;
68
+
96
69
  //# sourceMappingURL=reddit-conversions-api.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/reddit-conversions-api.ts"],"sourcesContent":["import { fetch } from '@shware/utils';\nimport { IGNORED_EVENTS } from '../third-parties/ignored-events';\nimport { type ServerStandardEvent, mapRDTEvent, mapServerStandardEvent } from '../track/rdt';\nimport type { TrackEvent, UserProvidedData } from '../track/types';\nimport { getFirst } from '../utils/field';\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: ServerStandardEvent | '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 // oxlint-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: type === 'Custom' ? 'CUSTOM' : mapServerStandardEvent(type),\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 // oxlint-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\n .filter((event) => !IGNORED_EVENTS.includes(event.name))\n .map((event) => getServerEvent(event, data)),\n },\n };\n\n if (dto.data.events.length === 0) return;\n\n try {\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 if (response.ok) return;\n const { status } = response;\n const message = await response.text();\n console.error(`Failed to send Reddit conversion, status: ${status}, body: ${message}`);\n } catch (error) {\n console.error('Failed to send Reddit conversion, network error:', error);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAsB;AACtB,4BAA+B;AAC/B,iBAA8E;AAE9E,mBAAyB;AAsElB,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,eAAe,SAAS,WAAW,eAAW,mCAAuB,IAAI;AAAA,MACzE,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,OACL,OAAO,CAAC,UAAU,CAAC,qCAAe,SAAS,MAAM,IAAI,CAAC,EACtD,IAAI,CAAC,UAAU,eAAe,OAAO,IAAI,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,MAAI,IAAI,KAAK,OAAO,WAAW,EAAG;AAElC,MAAI;AACF,UAAM,WAAW,UAAM;AAAA,MACrB,4CAA4C,OAAO;AAAA,MACnD;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,eAAe,UAAU,WAAW;AAAA,QACtC;AAAA,QACA,MAAM,KAAK,UAAU,GAAG;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,SAAS,GAAI;AACjB,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,YAAQ,MAAM,6CAA6C,MAAM,WAAW,OAAO,EAAE;AAAA,EACvF,SAAS,OAAO;AACd,YAAQ,MAAM,oDAAoD,KAAK;AAAA,EACzE;AACF;","names":[]}
1
+ {"version":3,"file":"reddit-conversions-api.cjs","names":["mapRDTEvent","mapServerStandardEvent","getFirst","IGNORED_EVENTS"],"sources":["../../src/server/reddit-conversions-api.ts"],"sourcesContent":["import { fetch } from '@shware/utils';\nimport { IGNORED_EVENTS } from '../third-parties/ignored-events';\nimport { type ServerStandardEvent, mapRDTEvent, mapServerStandardEvent } from '../track/rdt';\nimport type { TrackEvent, UserProvidedData } from '../track/types';\nimport { getFirst } from '../utils/field';\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: ServerStandardEvent | '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 // oxlint-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: type === 'Custom' ? 'CUSTOM' : mapServerStandardEvent(type),\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 // oxlint-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\n .filter((event) => !IGNORED_EVENTS.includes(event.name))\n .map((event) => getServerEvent(event, data)),\n },\n };\n\n if (dto.data.events.length === 0) return;\n\n try {\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 if (response.ok) return;\n const { status } = response;\n const message = await response.text();\n console.error(`Failed to send Reddit conversion, status: ${status}, body: ${message}`);\n } catch (error) {\n console.error('Failed to send Reddit conversion, network error:', error);\n }\n}\n"],"mappings":";;;;;;AA0EA,SAAgB,eAEd,OACA,MACa;CACb,MAAM,EAAE,IAAI,MAAM,YAAY,SAAS;CACvC,MAAM,CAAC,MAAM,UAAUA,kBAAAA,YAAY,MAAM,YAAY,EAAE;CAEvD,OAAO;EACL,UAAU,KAAK;EACf,UAAU,KAAK,IAAI;EACnB,eAAe,KAAK,WAAW,QAAQ,YAAY,KAAK,WAAW,QAAQ,QAAQ;EACnF,MAAM;GACJ,eAAe,SAAS,WAAW,WAAWC,kBAAAA,uBAAuB,IAAI;GACzE,mBAAmB,SAAS,WAAW,OAAO,kBAAkB,KAAA;EAClE;EACA,UAAU;GACR,eAAe;GACf,UACE,cAAc,UAAU,OAAO,OAAO,aAAa,WAC/C,OAAO,SAAS,YAAY,IAC5B,KAAA;GACN,YACE,eAAe,UAAU,OAAO,OAAO,cAAc,WACjD,OAAO,YACP,KAAA;GACN,OAAO,WAAW,UAAU,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,KAAA;GAC9E,UACE,cAAc,UAAU,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,IAC/E,OAAO,WACP,KAAA;EACR;EACA,MAAM;GACJ,OAAOC,oBAAAA,SAAS,KAAK,KAAK;GAC1B,aAAa,KAAK;GAClB,YAAY,KAAK;GACjB,cAAcA,oBAAAA,SAAS,KAAK,YAAY;GACxC,YAAY,KAAK;GACjB,MAAM,KAAK,aAAa,QAAQ,KAAK,iBAAiB,KAAA;GACtD,MAAM,KAAK,aAAa,YAAY,KAAK,iBAAiB,KAAA;GAC1D,MAAM,KAAK;GACX,mBACE,KAAK,gBAAgB,KAAK,gBACtB;IAAE,OAAO,KAAK;IAAc,QAAQ,KAAK;GAAc,IACvD,KAAA;EACR;CACF;AACF;AAEA,eAAsB,WACpB,aACA,SAEA,QACA,OAAyB,CAAC,GAC1B,QACA;CACA,MAAM,MAA4B,EAChC,MAAM;EACJ,SAAS;EACT,QAAQ,OACL,QAAQ,UAAU,CAACC,qCAAAA,eAAe,SAAS,MAAM,IAAI,CAAC,CAAC,CACvD,KAAK,UAAU,eAAe,OAAO,IAAI,CAAC;CAC/C,EACF;CAEA,IAAI,IAAI,KAAK,OAAO,WAAW,GAAG;CAElC,IAAI;EACF,MAAM,WAAW,OAAA,GAAA,cAAA,MAAA,CACf,4CAA4C,QAAQ,qBACpD;GACE,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,QAAQ;IACR,eAAe,UAAU;GAC3B;GACA,MAAM,KAAK,UAAU,GAAG;EAC1B,CACF;EACA,IAAI,SAAS,IAAI;EACjB,MAAM,EAAE,WAAW;EACnB,MAAM,UAAU,MAAM,SAAS,KAAK;EACpC,QAAQ,MAAM,6CAA6C,OAAO,UAAU,SAAS;CACvF,SAAS,OAAO;EACd,QAAQ,MAAM,oDAAoD,KAAK;CACzE;AACF"}
@@ -1,75 +1,75 @@
1
- import { ServerStandardEvent } from '../track/rdt.cjs';
2
- import { TrackEvent, UserProvidedData } from '../track/types.cjs';
3
- import '../track/gtag.cjs';
4
-
1
+ import { TrackEvent, UserProvidedData } from "../track/types.cjs";
2
+ import { ServerStandardEvent } from "../track/rdt.cjs";
3
+ //#region src/server/reddit-conversions-api.d.ts
5
4
  /**
6
5
  * https://ads-api.reddit.com/docs/v3/operations/Post%20Conversion%20Events
7
6
  * https://business.reddithelp.com/s/article/map-a-catalog-to-a-signal-source
8
7
  */
9
8
  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: ServerStandardEvent | 'CUSTOM';
17
- custom_event_name?: string;
18
- };
9
+ /** Match keys: Share user identifiers to match conversions to a Reddit ad engagement. */
10
+ click_id?: string;
11
+ /** Unix epoch timestamp in milliseconds, event_at can't be older than seven days. */
12
+ event_at: number;
13
+ action_source: 'WEBSITE' | 'APP' | (string & {});
14
+ type: {
15
+ tracking_type: ServerStandardEvent | 'CUSTOM';
16
+ custom_event_name?: string;
17
+ };
18
+ /**
19
+ * Event metadata
20
+ * Share as much additional information about your conversion event as you'd like. If you're
21
+ * using the Conversions API with the pixel, conversion_id is required for deduplication.
22
+ */
23
+ metadata?: {
24
+ conversion_id?: string;
25
+ currency?: string;
26
+ item_count?: number;
27
+ value?: number;
28
+ products?: {
29
+ id: string;
30
+ name?: string;
31
+ category?: string;
32
+ }[];
33
+ };
34
+ user?: {
35
+ email?: string;
36
+ external_id?: string;
37
+ ip_address?: string;
38
+ phone_number?: string;
39
+ user_agent?: string;
40
+ /** The Identifier for Advertisers (IDFA) of the user's Apple device. */
41
+ idfa?: string;
42
+ /** The Android Advertising ID (AAID) of the user's Android device. */
43
+ aaid?: string;
19
44
  /**
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.
45
+ * The value from the first-party Pixel _rdt_uuid cookie on your domain. Note that it is in
46
+ * the {timestamp}.{uuid} format. You may use the full value or just the UUID portion.
47
+ * Example: 1684189007728.7c73f2ae-a433-4d7b-9838-f467da98f48e
23
48
  */
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
- }[];
49
+ uuid?: string;
50
+ screen_dimensions?: {
51
+ width: number;
52
+ height: number;
34
53
  };
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
- };
54
+ /**
55
+ * A structure of data processing options to specify the processing type for the event
56
+ * https://business.reddithelp.com/s/article/Limited-Data-Use
57
+ */
58
+ data_processing_options?: {
59
+ country: string;
60
+ region: string;
61
+ modes: string[] | ['LDU'];
64
62
  };
63
+ };
65
64
  }
66
65
  interface CreateRedditEventDTO {
67
- data: {
68
- test_id?: string;
69
- events: RedditEvent[];
70
- };
66
+ data: {
67
+ test_id?: string;
68
+ events: RedditEvent[];
69
+ };
71
70
  }
72
71
  declare function getServerEvent(event: TrackEvent<any>, data: UserProvidedData): RedditEvent;
73
72
  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 };
73
+ //#endregion
74
+ export { CreateRedditEventDTO, RedditEvent, getServerEvent, sendEvents };
75
+ //# sourceMappingURL=reddit-conversions-api.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reddit-conversions-api.d.cts","names":[],"sources":["../../src/server/reddit-conversions-api.ts"],"mappings":";;;;;;;UAUiB;;EAEf;;EAGA;EAEA;EAEA;IACE,eAAe;IACf;;;;;;;EAQF;IACE;IACA;IACA;IACA;IACA;MAAa;MAAY;MAAe;;;EAG1C;IACE;IACA;IACA;IACA;IACA;;IAGA;;IAGA;;;;;;IAMA;IAEA;MAAsB;MAAe;;;;;;IAMrC;MACE;MACA;MACA;;;;UAKW;EACf;IAAQ;IAAkB,QAAQ;;;iBAGpB,eAEd,OAAO,iBACP,MAAM,mBACL;iBA6CmB,WACpB,qBACA,iBAEA,QAAQ,mBACR,OAAM,kBACN,kBAAe"}
@@ -0,0 +1,75 @@
1
+ import { TrackEvent, UserProvidedData } from "../track/types.mjs";
2
+ import { ServerStandardEvent } from "../track/rdt.mjs";
3
+ //#region src/server/reddit-conversions-api.d.ts
4
+ /**
5
+ * https://ads-api.reddit.com/docs/v3/operations/Post%20Conversion%20Events
6
+ * https://business.reddithelp.com/s/article/map-a-catalog-to-a-signal-source
7
+ */
8
+ interface RedditEvent {
9
+ /** Match keys: Share user identifiers to match conversions to a Reddit ad engagement. */
10
+ click_id?: string;
11
+ /** Unix epoch timestamp in milliseconds, event_at can't be older than seven days. */
12
+ event_at: number;
13
+ action_source: 'WEBSITE' | 'APP' | (string & {});
14
+ type: {
15
+ tracking_type: ServerStandardEvent | 'CUSTOM';
16
+ custom_event_name?: string;
17
+ };
18
+ /**
19
+ * Event metadata
20
+ * Share as much additional information about your conversion event as you'd like. If you're
21
+ * using the Conversions API with the pixel, conversion_id is required for deduplication.
22
+ */
23
+ metadata?: {
24
+ conversion_id?: string;
25
+ currency?: string;
26
+ item_count?: number;
27
+ value?: number;
28
+ products?: {
29
+ id: string;
30
+ name?: string;
31
+ category?: string;
32
+ }[];
33
+ };
34
+ user?: {
35
+ email?: string;
36
+ external_id?: string;
37
+ ip_address?: string;
38
+ phone_number?: string;
39
+ user_agent?: string;
40
+ /** The Identifier for Advertisers (IDFA) of the user's Apple device. */
41
+ idfa?: string;
42
+ /** The Android Advertising ID (AAID) of the user's Android device. */
43
+ aaid?: string;
44
+ /**
45
+ * The value from the first-party Pixel _rdt_uuid cookie on your domain. Note that it is in
46
+ * the {timestamp}.{uuid} format. You may use the full value or just the UUID portion.
47
+ * Example: 1684189007728.7c73f2ae-a433-4d7b-9838-f467da98f48e
48
+ */
49
+ uuid?: string;
50
+ screen_dimensions?: {
51
+ width: number;
52
+ height: number;
53
+ };
54
+ /**
55
+ * A structure of data processing options to specify the processing type for the event
56
+ * https://business.reddithelp.com/s/article/Limited-Data-Use
57
+ */
58
+ data_processing_options?: {
59
+ country: string;
60
+ region: string;
61
+ modes: string[] | ['LDU'];
62
+ };
63
+ };
64
+ }
65
+ interface CreateRedditEventDTO {
66
+ data: {
67
+ test_id?: string;
68
+ events: RedditEvent[];
69
+ };
70
+ }
71
+ declare function getServerEvent(event: TrackEvent<any>, data: UserProvidedData): RedditEvent;
72
+ declare function sendEvents(accessToken: string, pixelId: string, events: TrackEvent<any>[], data?: UserProvidedData, testId?: string): Promise<void>;
73
+ //#endregion
74
+ export { CreateRedditEventDTO, RedditEvent, getServerEvent, sendEvents };
75
+ //# sourceMappingURL=reddit-conversions-api.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reddit-conversions-api.d.mts","names":[],"sources":["../../src/server/reddit-conversions-api.ts"],"mappings":";;;;;;;UAUiB;;EAEf;;EAGA;EAEA;EAEA;IACE,eAAe;IACf;;;;;;;EAQF;IACE;IACA;IACA;IACA;IACA;MAAa;MAAY;MAAe;;;EAG1C;IACE;IACA;IACA;IACA;IACA;;IAGA;;IAGA;;;;;;IAMA;IAEA;MAAsB;MAAe;;;;;;IAMrC;MACE;MACA;MACA;;;;UAKW;EACf;IAAQ;IAAkB,QAAQ;;;iBAGpB,eAEd,OAAO,iBACP,MAAM,mBACL;iBA6CmB,WACpB,qBACA,iBAEA,QAAQ,mBACR,OAAM,kBACN,kBAAe"}
@@ -1,70 +1,67 @@
1
- // src/server/reddit-conversions-api.ts
2
- import { fetch } from "@shware/utils";
3
1
  import { IGNORED_EVENTS } from "../third-parties/ignored-events.mjs";
4
2
  import { mapRDTEvent, mapServerStandardEvent } from "../track/rdt.mjs";
5
3
  import { getFirst } from "../utils/field.mjs";
4
+ import { fetch } from "@shware/utils";
5
+ //#region src/server/reddit-conversions-api.ts
6
6
  function getServerEvent(event, data) {
7
- const { id, name, properties, tags } = event;
8
- const [type, params] = mapRDTEvent(name, properties, id);
9
- return {
10
- click_id: tags.rdt_cid,
11
- event_at: Date.now(),
12
- action_source: tags.source === "web" ? "WEBSITE" : tags.source === "app" ? "APP" : "UNKNOWN",
13
- type: {
14
- tracking_type: type === "Custom" ? "CUSTOM" : mapServerStandardEvent(type),
15
- custom_event_name: type === "Custom" ? params.customEventName : void 0
16
- },
17
- metadata: {
18
- conversion_id: id,
19
- currency: "currency" in params && typeof params.currency === "string" ? params.currency.toUpperCase() : void 0,
20
- item_count: "itemCount" in params && typeof params.itemCount === "number" ? params.itemCount : void 0,
21
- value: "value" in params && typeof params.value === "number" ? params.value : void 0,
22
- products: "products" in params && Array.isArray(params.products) && params.products.length > 0 ? params.products : void 0
23
- },
24
- user: {
25
- email: getFirst(data.email),
26
- external_id: data.user_id,
27
- ip_address: data.ip_address,
28
- phone_number: getFirst(data.phone_number),
29
- user_agent: data.user_agent,
30
- idfa: tags.platform === "ios" ? tags.advertising_id : void 0,
31
- aaid: tags.platform === "android" ? tags.advertising_id : void 0,
32
- uuid: tags.rdt_uuid,
33
- screen_dimensions: tags.screen_width && tags.screen_height ? { width: tags.screen_width, height: tags.screen_height } : void 0
34
- }
35
- };
7
+ const { id, name, properties, tags } = event;
8
+ const [type, params] = mapRDTEvent(name, properties, id);
9
+ return {
10
+ click_id: tags.rdt_cid,
11
+ event_at: Date.now(),
12
+ action_source: tags.source === "web" ? "WEBSITE" : tags.source === "app" ? "APP" : "UNKNOWN",
13
+ type: {
14
+ tracking_type: type === "Custom" ? "CUSTOM" : mapServerStandardEvent(type),
15
+ custom_event_name: type === "Custom" ? params.customEventName : void 0
16
+ },
17
+ metadata: {
18
+ conversion_id: id,
19
+ currency: "currency" in params && typeof params.currency === "string" ? params.currency.toUpperCase() : void 0,
20
+ item_count: "itemCount" in params && typeof params.itemCount === "number" ? params.itemCount : void 0,
21
+ value: "value" in params && typeof params.value === "number" ? params.value : void 0,
22
+ products: "products" in params && Array.isArray(params.products) && params.products.length > 0 ? params.products : void 0
23
+ },
24
+ user: {
25
+ email: getFirst(data.email),
26
+ external_id: data.user_id,
27
+ ip_address: data.ip_address,
28
+ phone_number: getFirst(data.phone_number),
29
+ user_agent: data.user_agent,
30
+ idfa: tags.platform === "ios" ? tags.advertising_id : void 0,
31
+ aaid: tags.platform === "android" ? tags.advertising_id : void 0,
32
+ uuid: tags.rdt_uuid,
33
+ screen_dimensions: tags.screen_width && tags.screen_height ? {
34
+ width: tags.screen_width,
35
+ height: tags.screen_height
36
+ } : void 0
37
+ }
38
+ };
36
39
  }
37
40
  async function sendEvents(accessToken, pixelId, events, data = {}, testId) {
38
- const dto = {
39
- data: {
40
- test_id: testId,
41
- events: events.filter((event) => !IGNORED_EVENTS.includes(event.name)).map((event) => getServerEvent(event, data))
42
- }
43
- };
44
- if (dto.data.events.length === 0) return;
45
- try {
46
- const response = await fetch(
47
- `https://ads-api.reddit.com/api/v3/pixels/${pixelId}/conversion_events`,
48
- {
49
- method: "POST",
50
- headers: {
51
- "Content-Type": "application/json",
52
- Accept: "application/json",
53
- Authorization: `Bearer ${accessToken}`
54
- },
55
- body: JSON.stringify(dto)
56
- }
57
- );
58
- if (response.ok) return;
59
- const { status } = response;
60
- const message = await response.text();
61
- console.error(`Failed to send Reddit conversion, status: ${status}, body: ${message}`);
62
- } catch (error) {
63
- console.error("Failed to send Reddit conversion, network error:", error);
64
- }
41
+ const dto = { data: {
42
+ test_id: testId,
43
+ events: events.filter((event) => !IGNORED_EVENTS.includes(event.name)).map((event) => getServerEvent(event, data))
44
+ } };
45
+ if (dto.data.events.length === 0) return;
46
+ try {
47
+ const response = await fetch(`https://ads-api.reddit.com/api/v3/pixels/${pixelId}/conversion_events`, {
48
+ method: "POST",
49
+ headers: {
50
+ "Content-Type": "application/json",
51
+ Accept: "application/json",
52
+ Authorization: `Bearer ${accessToken}`
53
+ },
54
+ body: JSON.stringify(dto)
55
+ });
56
+ if (response.ok) return;
57
+ const { status } = response;
58
+ const message = await response.text();
59
+ console.error(`Failed to send Reddit conversion, status: ${status}, body: ${message}`);
60
+ } catch (error) {
61
+ console.error("Failed to send Reddit conversion, network error:", error);
62
+ }
65
63
  }
66
- export {
67
- getServerEvent,
68
- sendEvents
69
- };
64
+ //#endregion
65
+ export { getServerEvent, sendEvents };
66
+
70
67
  //# sourceMappingURL=reddit-conversions-api.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/reddit-conversions-api.ts"],"sourcesContent":["import { fetch } from '@shware/utils';\nimport { IGNORED_EVENTS } from '../third-parties/ignored-events';\nimport { type ServerStandardEvent, mapRDTEvent, mapServerStandardEvent } from '../track/rdt';\nimport type { TrackEvent, UserProvidedData } from '../track/types';\nimport { getFirst } from '../utils/field';\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: ServerStandardEvent | '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 // oxlint-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: type === 'Custom' ? 'CUSTOM' : mapServerStandardEvent(type),\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 // oxlint-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\n .filter((event) => !IGNORED_EVENTS.includes(event.name))\n .map((event) => getServerEvent(event, data)),\n },\n };\n\n if (dto.data.events.length === 0) return;\n\n try {\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 if (response.ok) return;\n const { status } = response;\n const message = await response.text();\n console.error(`Failed to send Reddit conversion, status: ${status}, body: ${message}`);\n } catch (error) {\n console.error('Failed to send Reddit conversion, network error:', error);\n }\n}\n"],"mappings":";AAAA,SAAS,aAAa;AACtB,SAAS,sBAAsB;AAC/B,SAAmC,aAAa,8BAA8B;AAE9E,SAAS,gBAAgB;AAsElB,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,eAAe,SAAS,WAAW,WAAW,uBAAuB,IAAI;AAAA,MACzE,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,OACL,OAAO,CAAC,UAAU,CAAC,eAAe,SAAS,MAAM,IAAI,CAAC,EACtD,IAAI,CAAC,UAAU,eAAe,OAAO,IAAI,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,MAAI,IAAI,KAAK,OAAO,WAAW,EAAG;AAElC,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,MACrB,4CAA4C,OAAO;AAAA,MACnD;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,eAAe,UAAU,WAAW;AAAA,QACtC;AAAA,QACA,MAAM,KAAK,UAAU,GAAG;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,SAAS,GAAI;AACjB,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,YAAQ,MAAM,6CAA6C,MAAM,WAAW,OAAO,EAAE;AAAA,EACvF,SAAS,OAAO;AACd,YAAQ,MAAM,oDAAoD,KAAK;AAAA,EACzE;AACF;","names":[]}
1
+ {"version":3,"file":"reddit-conversions-api.mjs","names":[],"sources":["../../src/server/reddit-conversions-api.ts"],"sourcesContent":["import { fetch } from '@shware/utils';\nimport { IGNORED_EVENTS } from '../third-parties/ignored-events';\nimport { type ServerStandardEvent, mapRDTEvent, mapServerStandardEvent } from '../track/rdt';\nimport type { TrackEvent, UserProvidedData } from '../track/types';\nimport { getFirst } from '../utils/field';\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: ServerStandardEvent | '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 // oxlint-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: type === 'Custom' ? 'CUSTOM' : mapServerStandardEvent(type),\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 // oxlint-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\n .filter((event) => !IGNORED_EVENTS.includes(event.name))\n .map((event) => getServerEvent(event, data)),\n },\n };\n\n if (dto.data.events.length === 0) return;\n\n try {\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 if (response.ok) return;\n const { status } = response;\n const message = await response.text();\n console.error(`Failed to send Reddit conversion, status: ${status}, body: ${message}`);\n } catch (error) {\n console.error('Failed to send Reddit conversion, network error:', error);\n }\n}\n"],"mappings":";;;;;AA0EA,SAAgB,eAEd,OACA,MACa;CACb,MAAM,EAAE,IAAI,MAAM,YAAY,SAAS;CACvC,MAAM,CAAC,MAAM,UAAU,YAAY,MAAM,YAAY,EAAE;CAEvD,OAAO;EACL,UAAU,KAAK;EACf,UAAU,KAAK,IAAI;EACnB,eAAe,KAAK,WAAW,QAAQ,YAAY,KAAK,WAAW,QAAQ,QAAQ;EACnF,MAAM;GACJ,eAAe,SAAS,WAAW,WAAW,uBAAuB,IAAI;GACzE,mBAAmB,SAAS,WAAW,OAAO,kBAAkB,KAAA;EAClE;EACA,UAAU;GACR,eAAe;GACf,UACE,cAAc,UAAU,OAAO,OAAO,aAAa,WAC/C,OAAO,SAAS,YAAY,IAC5B,KAAA;GACN,YACE,eAAe,UAAU,OAAO,OAAO,cAAc,WACjD,OAAO,YACP,KAAA;GACN,OAAO,WAAW,UAAU,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,KAAA;GAC9E,UACE,cAAc,UAAU,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,IAC/E,OAAO,WACP,KAAA;EACR;EACA,MAAM;GACJ,OAAO,SAAS,KAAK,KAAK;GAC1B,aAAa,KAAK;GAClB,YAAY,KAAK;GACjB,cAAc,SAAS,KAAK,YAAY;GACxC,YAAY,KAAK;GACjB,MAAM,KAAK,aAAa,QAAQ,KAAK,iBAAiB,KAAA;GACtD,MAAM,KAAK,aAAa,YAAY,KAAK,iBAAiB,KAAA;GAC1D,MAAM,KAAK;GACX,mBACE,KAAK,gBAAgB,KAAK,gBACtB;IAAE,OAAO,KAAK;IAAc,QAAQ,KAAK;GAAc,IACvD,KAAA;EACR;CACF;AACF;AAEA,eAAsB,WACpB,aACA,SAEA,QACA,OAAyB,CAAC,GAC1B,QACA;CACA,MAAM,MAA4B,EAChC,MAAM;EACJ,SAAS;EACT,QAAQ,OACL,QAAQ,UAAU,CAAC,eAAe,SAAS,MAAM,IAAI,CAAC,CAAC,CACvD,KAAK,UAAU,eAAe,OAAO,IAAI,CAAC;CAC/C,EACF;CAEA,IAAI,IAAI,KAAK,OAAO,WAAW,GAAG;CAElC,IAAI;EACF,MAAM,WAAW,MAAM,MACrB,4CAA4C,QAAQ,qBACpD;GACE,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,QAAQ;IACR,eAAe,UAAU;GAC3B;GACA,MAAM,KAAK,UAAU,GAAG;EAC1B,CACF;EACA,IAAI,SAAS,IAAI;EACjB,MAAM,EAAE,WAAW;EACnB,MAAM,UAAU,MAAM,SAAS,KAAK;EACpC,QAAQ,MAAM,6CAA6C,OAAO,UAAU,SAAS;CACvF,SAAS,OAAO;EACd,QAAQ,MAAM,oDAAoD,KAAK;CACzE;AACF"}