@customerio/cdp-analytics-browser 0.0.1

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 (516) hide show
  1. package/LICENSE.MD +22 -0
  2. package/README.md +21 -0
  3. package/dist/cjs/browser/browser-umd.js +20 -0
  4. package/dist/cjs/browser/browser-umd.js.map +1 -0
  5. package/dist/cjs/browser/index.js +310 -0
  6. package/dist/cjs/browser/index.js.map +1 -0
  7. package/dist/cjs/browser/standalone-analytics.js +60 -0
  8. package/dist/cjs/browser/standalone-analytics.js.map +1 -0
  9. package/dist/cjs/browser/standalone.js +83 -0
  10. package/dist/cjs/browser/standalone.js.map +1 -0
  11. package/dist/cjs/core/analytics/index.js +544 -0
  12. package/dist/cjs/core/analytics/index.js.map +1 -0
  13. package/dist/cjs/core/analytics/interfaces.js +3 -0
  14. package/dist/cjs/core/analytics/interfaces.js.map +1 -0
  15. package/dist/cjs/core/arguments-resolver/index.js +106 -0
  16. package/dist/cjs/core/arguments-resolver/index.js.map +1 -0
  17. package/dist/cjs/core/auto-track.js +108 -0
  18. package/dist/cjs/core/auto-track.js.map +1 -0
  19. package/dist/cjs/core/buffer/index.js +237 -0
  20. package/dist/cjs/core/buffer/index.js.map +1 -0
  21. package/dist/cjs/core/buffer/snippet.js +30 -0
  22. package/dist/cjs/core/buffer/snippet.js.map +1 -0
  23. package/dist/cjs/core/callback/index.js +7 -0
  24. package/dist/cjs/core/callback/index.js.map +1 -0
  25. package/dist/cjs/core/connection/index.js +16 -0
  26. package/dist/cjs/core/connection/index.js.map +1 -0
  27. package/dist/cjs/core/context/index.js +19 -0
  28. package/dist/cjs/core/context/index.js.map +1 -0
  29. package/dist/cjs/core/environment/index.js +12 -0
  30. package/dist/cjs/core/environment/index.js.map +1 -0
  31. package/dist/cjs/core/events/index.js +134 -0
  32. package/dist/cjs/core/events/index.js.map +1 -0
  33. package/dist/cjs/core/events/interfaces.js +3 -0
  34. package/dist/cjs/core/events/interfaces.js.map +1 -0
  35. package/dist/cjs/core/inspector/index.js +14 -0
  36. package/dist/cjs/core/inspector/index.js.map +1 -0
  37. package/dist/cjs/core/plugin/index.js +3 -0
  38. package/dist/cjs/core/plugin/index.js.map +1 -0
  39. package/dist/cjs/core/query-string/gracefulDecodeURIComponent.js +20 -0
  40. package/dist/cjs/core/query-string/gracefulDecodeURIComponent.js.map +1 -0
  41. package/dist/cjs/core/query-string/index.js +48 -0
  42. package/dist/cjs/core/query-string/index.js.map +1 -0
  43. package/dist/cjs/core/query-string/pickPrefix.js +20 -0
  44. package/dist/cjs/core/query-string/pickPrefix.js.map +1 -0
  45. package/dist/cjs/core/queue/event-queue.js +15 -0
  46. package/dist/cjs/core/queue/event-queue.js.map +1 -0
  47. package/dist/cjs/core/stats/index.js +23 -0
  48. package/dist/cjs/core/stats/index.js.map +1 -0
  49. package/dist/cjs/core/stats/remote-metrics.js +107 -0
  50. package/dist/cjs/core/stats/remote-metrics.js.map +1 -0
  51. package/dist/cjs/core/user/index.js +422 -0
  52. package/dist/cjs/core/user/index.js.map +1 -0
  53. package/dist/cjs/core/user/tld.js +64 -0
  54. package/dist/cjs/core/user/tld.js.map +1 -0
  55. package/dist/cjs/generated/version.js +6 -0
  56. package/dist/cjs/generated/version.js.map +1 -0
  57. package/dist/cjs/index.js +11 -0
  58. package/dist/cjs/index.js.map +1 -0
  59. package/dist/cjs/lib/bind-all.js +17 -0
  60. package/dist/cjs/lib/bind-all.js.map +1 -0
  61. package/dist/cjs/lib/browser-polyfill.js +22 -0
  62. package/dist/cjs/lib/browser-polyfill.js.map +1 -0
  63. package/dist/cjs/lib/create-deferred.js +21 -0
  64. package/dist/cjs/lib/create-deferred.js.map +1 -0
  65. package/dist/cjs/lib/csp-detection.js +33 -0
  66. package/dist/cjs/lib/csp-detection.js.map +1 -0
  67. package/dist/cjs/lib/embedded-write-key.js +22 -0
  68. package/dist/cjs/lib/embedded-write-key.js.map +1 -0
  69. package/dist/cjs/lib/fetch.js +19 -0
  70. package/dist/cjs/lib/fetch.js.map +1 -0
  71. package/dist/cjs/lib/get-global.js +21 -0
  72. package/dist/cjs/lib/get-global.js.map +1 -0
  73. package/dist/cjs/lib/get-process-env.js +15 -0
  74. package/dist/cjs/lib/get-process-env.js.map +1 -0
  75. package/dist/cjs/lib/group-by.js +28 -0
  76. package/dist/cjs/lib/group-by.js.map +1 -0
  77. package/dist/cjs/lib/is-plan-event-enabled.js +20 -0
  78. package/dist/cjs/lib/is-plan-event-enabled.js.map +1 -0
  79. package/dist/cjs/lib/is-thenable.js +15 -0
  80. package/dist/cjs/lib/is-thenable.js.map +1 -0
  81. package/dist/cjs/lib/load-script.js +56 -0
  82. package/dist/cjs/lib/load-script.js.map +1 -0
  83. package/dist/cjs/lib/merged-options.js +31 -0
  84. package/dist/cjs/lib/merged-options.js.map +1 -0
  85. package/dist/cjs/lib/on-page-leave.js +35 -0
  86. package/dist/cjs/lib/on-page-leave.js.map +1 -0
  87. package/dist/cjs/lib/p-while.js +25 -0
  88. package/dist/cjs/lib/p-while.js.map +1 -0
  89. package/dist/cjs/lib/parse-cdn.js +79 -0
  90. package/dist/cjs/lib/parse-cdn.js.map +1 -0
  91. package/dist/cjs/lib/priority-queue/backoff.js +10 -0
  92. package/dist/cjs/lib/priority-queue/backoff.js.map +1 -0
  93. package/dist/cjs/lib/priority-queue/index.js +7 -0
  94. package/dist/cjs/lib/priority-queue/index.js.map +1 -0
  95. package/dist/cjs/lib/priority-queue/persisted.js +108 -0
  96. package/dist/cjs/lib/priority-queue/persisted.js.map +1 -0
  97. package/dist/cjs/lib/sleep.js +10 -0
  98. package/dist/cjs/lib/sleep.js.map +1 -0
  99. package/dist/cjs/lib/to-facade.js +32 -0
  100. package/dist/cjs/lib/to-facade.js.map +1 -0
  101. package/dist/cjs/node/index.js +43 -0
  102. package/dist/cjs/node/index.js.map +1 -0
  103. package/dist/cjs/node/node.browser.js +13 -0
  104. package/dist/cjs/node/node.browser.js.map +1 -0
  105. package/dist/cjs/plugins/ajs-destination/index.js +345 -0
  106. package/dist/cjs/plugins/ajs-destination/index.js.map +1 -0
  107. package/dist/cjs/plugins/ajs-destination/loader.js +110 -0
  108. package/dist/cjs/plugins/ajs-destination/loader.js.map +1 -0
  109. package/dist/cjs/plugins/ajs-destination/types.js +3 -0
  110. package/dist/cjs/plugins/ajs-destination/types.js.map +1 -0
  111. package/dist/cjs/plugins/ajs-destination/utils.js +23 -0
  112. package/dist/cjs/plugins/ajs-destination/utils.js.map +1 -0
  113. package/dist/cjs/plugins/analytics-node/index.js +65 -0
  114. package/dist/cjs/plugins/analytics-node/index.js.map +1 -0
  115. package/dist/cjs/plugins/customerio/batched-dispatcher.js +102 -0
  116. package/dist/cjs/plugins/customerio/batched-dispatcher.js.map +1 -0
  117. package/dist/cjs/plugins/customerio/fetch-dispatcher.js +18 -0
  118. package/dist/cjs/plugins/customerio/fetch-dispatcher.js.map +1 -0
  119. package/dist/cjs/plugins/customerio/index.js +97 -0
  120. package/dist/cjs/plugins/customerio/index.js.map +1 -0
  121. package/dist/cjs/plugins/customerio/normalize.js +176 -0
  122. package/dist/cjs/plugins/customerio/normalize.js.map +1 -0
  123. package/dist/cjs/plugins/customerio/schedule-flush.js +76 -0
  124. package/dist/cjs/plugins/customerio/schedule-flush.js.map +1 -0
  125. package/dist/cjs/plugins/legacy-video-plugins/index.js +25 -0
  126. package/dist/cjs/plugins/legacy-video-plugins/index.js.map +1 -0
  127. package/dist/cjs/plugins/middleware/index.js +124 -0
  128. package/dist/cjs/plugins/middleware/index.js.map +1 -0
  129. package/dist/cjs/plugins/page-enrichment/index.js +98 -0
  130. package/dist/cjs/plugins/page-enrichment/index.js.map +1 -0
  131. package/dist/cjs/plugins/remote-loader/index.js +211 -0
  132. package/dist/cjs/plugins/remote-loader/index.js.map +1 -0
  133. package/dist/cjs/plugins/remote-middleware/index.js +70 -0
  134. package/dist/cjs/plugins/remote-middleware/index.js.map +1 -0
  135. package/dist/cjs/plugins/routing-middleware/index.js +26 -0
  136. package/dist/cjs/plugins/routing-middleware/index.js.map +1 -0
  137. package/dist/cjs/plugins/schema-filter/index.js +67 -0
  138. package/dist/cjs/plugins/schema-filter/index.js.map +1 -0
  139. package/dist/cjs/plugins/validation/index.js +70 -0
  140. package/dist/cjs/plugins/validation/index.js.map +1 -0
  141. package/dist/pkg/browser/browser-umd.js +17 -0
  142. package/dist/pkg/browser/browser-umd.js.map +1 -0
  143. package/dist/pkg/browser/index.js +306 -0
  144. package/dist/pkg/browser/index.js.map +1 -0
  145. package/dist/pkg/browser/standalone-analytics.js +56 -0
  146. package/dist/pkg/browser/standalone-analytics.js.map +1 -0
  147. package/dist/pkg/browser/standalone.js +81 -0
  148. package/dist/pkg/browser/standalone.js.map +1 -0
  149. package/dist/pkg/core/analytics/index.js +541 -0
  150. package/dist/pkg/core/analytics/index.js.map +1 -0
  151. package/dist/pkg/core/analytics/interfaces.js +2 -0
  152. package/dist/pkg/core/analytics/interfaces.js.map +1 -0
  153. package/dist/pkg/core/arguments-resolver/index.js +99 -0
  154. package/dist/pkg/core/arguments-resolver/index.js.map +1 -0
  155. package/dist/pkg/core/auto-track.js +103 -0
  156. package/dist/pkg/core/auto-track.js.map +1 -0
  157. package/dist/pkg/core/buffer/index.js +231 -0
  158. package/dist/pkg/core/buffer/index.js.map +1 -0
  159. package/dist/pkg/core/buffer/snippet.js +25 -0
  160. package/dist/pkg/core/buffer/snippet.js.map +1 -0
  161. package/dist/pkg/core/callback/index.js +2 -0
  162. package/dist/pkg/core/callback/index.js.map +1 -0
  163. package/dist/pkg/core/connection/index.js +11 -0
  164. package/dist/pkg/core/connection/index.js.map +1 -0
  165. package/dist/pkg/core/context/index.js +16 -0
  166. package/dist/pkg/core/context/index.js.map +1 -0
  167. package/dist/pkg/core/environment/index.js +7 -0
  168. package/dist/pkg/core/environment/index.js.map +1 -0
  169. package/dist/pkg/core/events/index.js +131 -0
  170. package/dist/pkg/core/events/index.js.map +1 -0
  171. package/dist/pkg/core/events/interfaces.js +2 -0
  172. package/dist/pkg/core/events/interfaces.js.map +1 -0
  173. package/dist/pkg/core/inspector/index.js +10 -0
  174. package/dist/pkg/core/inspector/index.js.map +1 -0
  175. package/dist/pkg/core/plugin/index.js +2 -0
  176. package/dist/pkg/core/plugin/index.js.map +1 -0
  177. package/dist/pkg/core/query-string/gracefulDecodeURIComponent.js +16 -0
  178. package/dist/pkg/core/query-string/gracefulDecodeURIComponent.js.map +1 -0
  179. package/dist/pkg/core/query-string/index.js +44 -0
  180. package/dist/pkg/core/query-string/index.js.map +1 -0
  181. package/dist/pkg/core/query-string/pickPrefix.js +16 -0
  182. package/dist/pkg/core/query-string/pickPrefix.js.map +1 -0
  183. package/dist/pkg/core/queue/event-queue.js +12 -0
  184. package/dist/pkg/core/queue/event-queue.js.map +1 -0
  185. package/dist/pkg/core/stats/index.js +20 -0
  186. package/dist/pkg/core/stats/index.js.map +1 -0
  187. package/dist/pkg/core/stats/remote-metrics.js +104 -0
  188. package/dist/pkg/core/stats/remote-metrics.js.map +1 -0
  189. package/dist/pkg/core/user/index.js +418 -0
  190. package/dist/pkg/core/user/index.js.map +1 -0
  191. package/dist/pkg/core/user/tld.js +59 -0
  192. package/dist/pkg/core/user/tld.js.map +1 -0
  193. package/dist/pkg/generated/version.js +3 -0
  194. package/dist/pkg/generated/version.js.map +1 -0
  195. package/dist/pkg/index.js +8 -0
  196. package/dist/pkg/index.js.map +1 -0
  197. package/dist/pkg/lib/bind-all.js +14 -0
  198. package/dist/pkg/lib/bind-all.js.map +1 -0
  199. package/dist/pkg/lib/browser-polyfill.js +18 -0
  200. package/dist/pkg/lib/browser-polyfill.js.map +1 -0
  201. package/dist/pkg/lib/create-deferred.js +17 -0
  202. package/dist/pkg/lib/create-deferred.js.map +1 -0
  203. package/dist/pkg/lib/csp-detection.js +29 -0
  204. package/dist/pkg/lib/csp-detection.js.map +1 -0
  205. package/dist/pkg/lib/embedded-write-key.js +18 -0
  206. package/dist/pkg/lib/embedded-write-key.js.map +1 -0
  207. package/dist/pkg/lib/fetch.js +14 -0
  208. package/dist/pkg/lib/fetch.js.map +1 -0
  209. package/dist/pkg/lib/get-global.js +17 -0
  210. package/dist/pkg/lib/get-global.js.map +1 -0
  211. package/dist/pkg/lib/get-process-env.js +11 -0
  212. package/dist/pkg/lib/get-process-env.js.map +1 -0
  213. package/dist/pkg/lib/group-by.js +24 -0
  214. package/dist/pkg/lib/group-by.js.map +1 -0
  215. package/dist/pkg/lib/is-plan-event-enabled.js +16 -0
  216. package/dist/pkg/lib/is-plan-event-enabled.js.map +1 -0
  217. package/dist/pkg/lib/is-thenable.js +11 -0
  218. package/dist/pkg/lib/is-thenable.js.map +1 -0
  219. package/dist/pkg/lib/load-script.js +51 -0
  220. package/dist/pkg/lib/load-script.js.map +1 -0
  221. package/dist/pkg/lib/merged-options.js +27 -0
  222. package/dist/pkg/lib/merged-options.js.map +1 -0
  223. package/dist/pkg/lib/on-page-leave.js +31 -0
  224. package/dist/pkg/lib/on-page-leave.js.map +1 -0
  225. package/dist/pkg/lib/p-while.js +21 -0
  226. package/dist/pkg/lib/p-while.js.map +1 -0
  227. package/dist/pkg/lib/parse-cdn.js +72 -0
  228. package/dist/pkg/lib/parse-cdn.js.map +1 -0
  229. package/dist/pkg/lib/priority-queue/backoff.js +6 -0
  230. package/dist/pkg/lib/priority-queue/backoff.js.map +1 -0
  231. package/dist/pkg/lib/priority-queue/index.js +3 -0
  232. package/dist/pkg/lib/priority-queue/index.js.map +1 -0
  233. package/dist/pkg/lib/priority-queue/persisted.js +105 -0
  234. package/dist/pkg/lib/priority-queue/persisted.js.map +1 -0
  235. package/dist/pkg/lib/sleep.js +6 -0
  236. package/dist/pkg/lib/sleep.js.map +1 -0
  237. package/dist/pkg/lib/to-facade.js +28 -0
  238. package/dist/pkg/lib/to-facade.js.map +1 -0
  239. package/dist/pkg/node/index.js +40 -0
  240. package/dist/pkg/node/index.js.map +1 -0
  241. package/dist/pkg/node/node.browser.js +10 -0
  242. package/dist/pkg/node/node.browser.js.map +1 -0
  243. package/dist/pkg/plugins/ajs-destination/index.js +341 -0
  244. package/dist/pkg/plugins/ajs-destination/index.js.map +1 -0
  245. package/dist/pkg/plugins/ajs-destination/loader.js +102 -0
  246. package/dist/pkg/plugins/ajs-destination/loader.js.map +1 -0
  247. package/dist/pkg/plugins/ajs-destination/types.js +2 -0
  248. package/dist/pkg/plugins/ajs-destination/types.js.map +1 -0
  249. package/dist/pkg/plugins/ajs-destination/utils.js +18 -0
  250. package/dist/pkg/plugins/ajs-destination/utils.js.map +1 -0
  251. package/dist/pkg/plugins/analytics-node/index.js +60 -0
  252. package/dist/pkg/plugins/analytics-node/index.js.map +1 -0
  253. package/dist/pkg/plugins/customerio/batched-dispatcher.js +99 -0
  254. package/dist/pkg/plugins/customerio/batched-dispatcher.js.map +1 -0
  255. package/dist/pkg/plugins/customerio/fetch-dispatcher.js +15 -0
  256. package/dist/pkg/plugins/customerio/fetch-dispatcher.js.map +1 -0
  257. package/dist/pkg/plugins/customerio/index.js +93 -0
  258. package/dist/pkg/plugins/customerio/index.js.map +1 -0
  259. package/dist/pkg/plugins/customerio/normalize.js +168 -0
  260. package/dist/pkg/plugins/customerio/normalize.js.map +1 -0
  261. package/dist/pkg/plugins/customerio/schedule-flush.js +72 -0
  262. package/dist/pkg/plugins/customerio/schedule-flush.js.map +1 -0
  263. package/dist/pkg/plugins/legacy-video-plugins/index.js +25 -0
  264. package/dist/pkg/plugins/legacy-video-plugins/index.js.map +1 -0
  265. package/dist/pkg/plugins/middleware/index.js +119 -0
  266. package/dist/pkg/plugins/middleware/index.js.map +1 -0
  267. package/dist/pkg/plugins/page-enrichment/index.js +93 -0
  268. package/dist/pkg/plugins/page-enrichment/index.js.map +1 -0
  269. package/dist/pkg/plugins/remote-loader/index.js +207 -0
  270. package/dist/pkg/plugins/remote-loader/index.js.map +1 -0
  271. package/dist/pkg/plugins/remote-middleware/index.js +66 -0
  272. package/dist/pkg/plugins/remote-middleware/index.js.map +1 -0
  273. package/dist/pkg/plugins/routing-middleware/index.js +21 -0
  274. package/dist/pkg/plugins/routing-middleware/index.js.map +1 -0
  275. package/dist/pkg/plugins/schema-filter/index.js +63 -0
  276. package/dist/pkg/plugins/schema-filter/index.js.map +1 -0
  277. package/dist/pkg/plugins/validation/index.js +63 -0
  278. package/dist/pkg/plugins/validation/index.js.map +1 -0
  279. package/dist/types/browser/browser-umd.d.ts +2 -0
  280. package/dist/types/browser/browser-umd.d.ts.map +1 -0
  281. package/dist/types/browser/index.d.ts +86 -0
  282. package/dist/types/browser/index.d.ts.map +1 -0
  283. package/dist/types/browser/standalone-analytics.d.ts +16 -0
  284. package/dist/types/browser/standalone-analytics.d.ts.map +1 -0
  285. package/dist/types/browser/standalone.d.ts +2 -0
  286. package/dist/types/browser/standalone.d.ts.map +1 -0
  287. package/dist/types/core/analytics/index.d.ts +116 -0
  288. package/dist/types/core/analytics/index.d.ts.map +1 -0
  289. package/dist/types/core/analytics/interfaces.d.ts +77 -0
  290. package/dist/types/core/analytics/interfaces.d.ts.map +1 -0
  291. package/dist/types/core/arguments-resolver/index.d.ts +34 -0
  292. package/dist/types/core/arguments-resolver/index.d.ts.map +1 -0
  293. package/dist/types/core/auto-track.d.ts +10 -0
  294. package/dist/types/core/auto-track.d.ts.map +1 -0
  295. package/dist/types/core/buffer/index.d.ts +86 -0
  296. package/dist/types/core/buffer/index.d.ts.map +1 -0
  297. package/dist/types/core/buffer/snippet.d.ts +10 -0
  298. package/dist/types/core/buffer/snippet.d.ts.map +1 -0
  299. package/dist/types/core/callback/index.d.ts +2 -0
  300. package/dist/types/core/callback/index.d.ts.map +1 -0
  301. package/dist/types/core/connection/index.d.ts +3 -0
  302. package/dist/types/core/connection/index.d.ts.map +1 -0
  303. package/dist/types/core/context/index.d.ts +9 -0
  304. package/dist/types/core/context/index.d.ts.map +1 -0
  305. package/dist/types/core/environment/index.d.ts +3 -0
  306. package/dist/types/core/environment/index.d.ts.map +1 -0
  307. package/dist/types/core/events/index.d.ts +21 -0
  308. package/dist/types/core/events/index.d.ts.map +1 -0
  309. package/dist/types/core/events/interfaces.d.ts +9 -0
  310. package/dist/types/core/events/interfaces.d.ts.map +1 -0
  311. package/dist/types/core/inspector/index.d.ts +3 -0
  312. package/dist/types/core/inspector/index.d.ts.map +1 -0
  313. package/dist/types/core/plugin/index.d.ts +11 -0
  314. package/dist/types/core/plugin/index.d.ts.map +1 -0
  315. package/dist/types/core/query-string/gracefulDecodeURIComponent.d.ts +9 -0
  316. package/dist/types/core/query-string/gracefulDecodeURIComponent.d.ts.map +1 -0
  317. package/dist/types/core/query-string/index.d.ts +7 -0
  318. package/dist/types/core/query-string/index.d.ts.map +1 -0
  319. package/dist/types/core/query-string/pickPrefix.d.ts +9 -0
  320. package/dist/types/core/query-string/pickPrefix.d.ts.map +1 -0
  321. package/dist/types/core/queue/event-queue.d.ts +8 -0
  322. package/dist/types/core/queue/event-queue.d.ts.map +1 -0
  323. package/dist/types/core/stats/index.d.ts +7 -0
  324. package/dist/types/core/stats/index.d.ts.map +1 -0
  325. package/dist/types/core/stats/remote-metrics.d.ts +29 -0
  326. package/dist/types/core/stats/remote-metrics.d.ts.map +1 -0
  327. package/dist/types/core/user/index.d.ts +128 -0
  328. package/dist/types/core/user/index.d.ts.map +1 -0
  329. package/dist/types/core/user/tld.d.ts +2 -0
  330. package/dist/types/core/user/tld.d.ts.map +1 -0
  331. package/dist/types/generated/version.d.ts +2 -0
  332. package/dist/types/generated/version.d.ts.map +1 -0
  333. package/dist/types/index.d.ts +9 -0
  334. package/dist/types/index.d.ts.map +1 -0
  335. package/dist/types/lib/bind-all.d.ts +4 -0
  336. package/dist/types/lib/bind-all.d.ts.map +1 -0
  337. package/dist/types/lib/browser-polyfill.d.ts +2 -0
  338. package/dist/types/lib/browser-polyfill.d.ts.map +1 -0
  339. package/dist/types/lib/create-deferred.d.ts +9 -0
  340. package/dist/types/lib/create-deferred.d.ts.map +1 -0
  341. package/dist/types/lib/csp-detection.d.ts +4 -0
  342. package/dist/types/lib/csp-detection.d.ts.map +1 -0
  343. package/dist/types/lib/embedded-write-key.d.ts +7 -0
  344. package/dist/types/lib/embedded-write-key.d.ts.map +1 -0
  345. package/dist/types/lib/fetch.d.ts +5 -0
  346. package/dist/types/lib/fetch.d.ts.map +1 -0
  347. package/dist/types/lib/get-global.d.ts +2 -0
  348. package/dist/types/lib/get-global.d.ts.map +1 -0
  349. package/dist/types/lib/get-process-env.d.ts +8 -0
  350. package/dist/types/lib/get-process-env.d.ts.map +1 -0
  351. package/dist/types/lib/group-by.d.ts +4 -0
  352. package/dist/types/lib/group-by.d.ts.map +1 -0
  353. package/dist/types/lib/is-plan-event-enabled.d.ts +9 -0
  354. package/dist/types/lib/is-plan-event-enabled.d.ts.map +1 -0
  355. package/dist/types/lib/is-thenable.d.ts +6 -0
  356. package/dist/types/lib/is-thenable.d.ts.map +1 -0
  357. package/dist/types/lib/load-script.d.ts +3 -0
  358. package/dist/types/lib/load-script.d.ts.map +1 -0
  359. package/dist/types/lib/merged-options.d.ts +13 -0
  360. package/dist/types/lib/merged-options.d.ts.map +1 -0
  361. package/dist/types/lib/on-page-leave.d.ts +11 -0
  362. package/dist/types/lib/on-page-leave.d.ts.map +1 -0
  363. package/dist/types/lib/p-while.d.ts +2 -0
  364. package/dist/types/lib/p-while.d.ts.map +1 -0
  365. package/dist/types/lib/parse-cdn.d.ts +10 -0
  366. package/dist/types/lib/parse-cdn.d.ts.map +1 -0
  367. package/dist/types/lib/priority-queue/backoff.d.ts +13 -0
  368. package/dist/types/lib/priority-queue/backoff.d.ts.map +1 -0
  369. package/dist/types/lib/priority-queue/index.d.ts +3 -0
  370. package/dist/types/lib/priority-queue/index.d.ts.map +1 -0
  371. package/dist/types/lib/priority-queue/persisted.d.ts +6 -0
  372. package/dist/types/lib/priority-queue/persisted.d.ts.map +1 -0
  373. package/dist/types/lib/sleep.d.ts +2 -0
  374. package/dist/types/lib/sleep.d.ts.map +1 -0
  375. package/dist/types/lib/to-facade.d.ts +7 -0
  376. package/dist/types/lib/to-facade.d.ts.map +1 -0
  377. package/dist/types/node/index.d.ts +8 -0
  378. package/dist/types/node/index.d.ts.map +1 -0
  379. package/dist/types/node/node.browser.d.ts +4 -0
  380. package/dist/types/node/node.browser.d.ts.map +1 -0
  381. package/dist/types/plugins/ajs-destination/index.d.ts +42 -0
  382. package/dist/types/plugins/ajs-destination/index.d.ts.map +1 -0
  383. package/dist/types/plugins/ajs-destination/loader.d.ts +12 -0
  384. package/dist/types/plugins/ajs-destination/loader.d.ts.map +1 -0
  385. package/dist/types/plugins/ajs-destination/types.d.ts +36 -0
  386. package/dist/types/plugins/ajs-destination/types.d.ts.map +1 -0
  387. package/dist/types/plugins/ajs-destination/utils.d.ts +5 -0
  388. package/dist/types/plugins/ajs-destination/utils.d.ts.map +1 -0
  389. package/dist/types/plugins/analytics-node/index.d.ts +12 -0
  390. package/dist/types/plugins/analytics-node/index.d.ts.map +1 -0
  391. package/dist/types/plugins/customerio/batched-dispatcher.d.ts +8 -0
  392. package/dist/types/plugins/customerio/batched-dispatcher.d.ts.map +1 -0
  393. package/dist/types/plugins/customerio/fetch-dispatcher.d.ts +8 -0
  394. package/dist/types/plugins/customerio/fetch-dispatcher.d.ts.map +1 -0
  395. package/dist/types/plugins/customerio/index.d.ts +26 -0
  396. package/dist/types/plugins/customerio/index.d.ts.map +1 -0
  397. package/dist/types/plugins/customerio/normalize.d.ts +12 -0
  398. package/dist/types/plugins/customerio/normalize.d.ts.map +1 -0
  399. package/dist/types/plugins/customerio/schedule-flush.d.ts +5 -0
  400. package/dist/types/plugins/customerio/schedule-flush.d.ts.map +1 -0
  401. package/dist/types/plugins/legacy-video-plugins/index.d.ts +3 -0
  402. package/dist/types/plugins/legacy-video-plugins/index.d.ts.map +1 -0
  403. package/dist/types/plugins/middleware/index.d.ts +18 -0
  404. package/dist/types/plugins/middleware/index.d.ts.map +1 -0
  405. package/dist/types/plugins/page-enrichment/index.d.ts +21 -0
  406. package/dist/types/plugins/page-enrichment/index.d.ts.map +1 -0
  407. package/dist/types/plugins/remote-loader/index.d.ts +43 -0
  408. package/dist/types/plugins/remote-loader/index.d.ts.map +1 -0
  409. package/dist/types/plugins/remote-middleware/index.d.ts +5 -0
  410. package/dist/types/plugins/remote-middleware/index.d.ts.map +1 -0
  411. package/dist/types/plugins/routing-middleware/index.d.ts +13 -0
  412. package/dist/types/plugins/routing-middleware/index.d.ts.map +1 -0
  413. package/dist/types/plugins/schema-filter/index.d.ts +5 -0
  414. package/dist/types/plugins/schema-filter/index.d.ts.map +1 -0
  415. package/dist/types/plugins/validation/index.d.ts +7 -0
  416. package/dist/types/plugins/validation/index.d.ts.map +1 -0
  417. package/dist/umd/799.bundle.f804d7b881cf284fbd56.js +1 -0
  418. package/dist/umd/799.bundle.f804d7b881cf284fbd56.js.gz +0 -0
  419. package/dist/umd/870.bundle.e0b7bfa4797bb87217c9.js +1 -0
  420. package/dist/umd/870.bundle.e0b7bfa4797bb87217c9.js.gz +0 -0
  421. package/dist/umd/ajs-destination.bundle.847bf422720e5616c9d5.js +1 -0
  422. package/dist/umd/ajs-destination.bundle.847bf422720e5616c9d5.js.gz +0 -0
  423. package/dist/umd/auto-track.bundle.758629f7a47544af2d44.js +1 -0
  424. package/dist/umd/auto-track.bundle.758629f7a47544af2d44.js.gz +0 -0
  425. package/dist/umd/index.js +1 -0
  426. package/dist/umd/index.js.gz +0 -0
  427. package/dist/umd/legacyVideos.bundle.d7ac356ab28fab36e111.js +1 -0
  428. package/dist/umd/legacyVideos.bundle.d7ac356ab28fab36e111.js.gz +0 -0
  429. package/dist/umd/queryString.bundle.913501e40ce64ef92884.js +1 -0
  430. package/dist/umd/queryString.bundle.913501e40ce64ef92884.js.gz +0 -0
  431. package/dist/umd/remoteMiddleware.bundle.3bc569811c4c2c93d90c.js +1 -0
  432. package/dist/umd/remoteMiddleware.bundle.3bc569811c4c2c93d90c.js.gz +0 -0
  433. package/dist/umd/schemaFilter.bundle.bb8180ae95843c8f138e.js +1 -0
  434. package/dist/umd/schemaFilter.bundle.bb8180ae95843c8f138e.js.gz +0 -0
  435. package/dist/umd/standalone.js +1 -0
  436. package/dist/umd/standalone.js.gz +0 -0
  437. package/dist/umd/tsub-middleware.bundle.af0f402084ddd2b605cc.js +1 -0
  438. package/dist/umd/tsub-middleware.bundle.af0f402084ddd2b605cc.js.gz +0 -0
  439. package/package.json +103 -0
  440. package/src/browser/browser-umd.ts +19 -0
  441. package/src/browser/index.ts +397 -0
  442. package/src/browser/standalone-analytics.ts +74 -0
  443. package/src/browser/standalone.ts +78 -0
  444. package/src/core/analytics/index.ts +567 -0
  445. package/src/core/analytics/interfaces.ts +100 -0
  446. package/src/core/arguments-resolver/index.ts +166 -0
  447. package/src/core/auto-track.ts +152 -0
  448. package/src/core/buffer/index.ts +289 -0
  449. package/src/core/buffer/snippet.ts +43 -0
  450. package/src/core/callback/index.ts +1 -0
  451. package/src/core/connection/index.ts +13 -0
  452. package/src/core/context/index.ts +21 -0
  453. package/src/core/environment/index.ts +7 -0
  454. package/src/core/events/index.ts +254 -0
  455. package/src/core/events/interfaces.ts +36 -0
  456. package/src/core/inspector/index.ts +14 -0
  457. package/src/core/plugin/index.ts +12 -0
  458. package/src/core/query-string/gracefulDecodeURIComponent.ts +16 -0
  459. package/src/core/query-string/index.ts +64 -0
  460. package/src/core/query-string/pickPrefix.ts +20 -0
  461. package/src/core/queue/event-queue.ts +11 -0
  462. package/src/core/stats/index.ts +15 -0
  463. package/src/core/stats/remote-metrics.ts +137 -0
  464. package/src/core/user/index.ts +534 -0
  465. package/src/core/user/tld.ts +65 -0
  466. package/src/generated/version.ts +2 -0
  467. package/src/index.ts +10 -0
  468. package/src/lib/bind-all.ts +19 -0
  469. package/src/lib/browser-polyfill.ts +23 -0
  470. package/src/lib/create-deferred.ts +16 -0
  471. package/src/lib/csp-detection.ts +26 -0
  472. package/src/lib/embedded-write-key.ts +24 -0
  473. package/src/lib/fetch.ts +10 -0
  474. package/src/lib/get-global.ts +16 -0
  475. package/src/lib/get-process-env.ts +11 -0
  476. package/src/lib/group-by.ts +30 -0
  477. package/src/lib/is-plan-event-enabled.ts +20 -0
  478. package/src/lib/is-thenable.ts +9 -0
  479. package/src/lib/load-script.ts +66 -0
  480. package/src/lib/merged-options.ts +46 -0
  481. package/src/lib/on-page-leave.ts +29 -0
  482. package/src/lib/p-while.ts +12 -0
  483. package/src/lib/parse-cdn.ts +85 -0
  484. package/src/lib/priority-queue/backoff.ts +24 -0
  485. package/src/lib/priority-queue/index.ts +6 -0
  486. package/src/lib/priority-queue/persisted.ts +127 -0
  487. package/src/lib/sleep.ts +4 -0
  488. package/src/lib/to-facade.ts +53 -0
  489. package/src/node/index.ts +36 -0
  490. package/src/node/node.browser.ts +7 -0
  491. package/src/plugins/ajs-destination/index.ts +388 -0
  492. package/src/plugins/ajs-destination/loader.ts +127 -0
  493. package/src/plugins/ajs-destination/types.ts +44 -0
  494. package/src/plugins/ajs-destination/utils.ts +34 -0
  495. package/src/plugins/analytics-node/index.ts +64 -0
  496. package/src/plugins/customerio/batched-dispatcher.ts +115 -0
  497. package/src/plugins/customerio/fetch-dispatcher.ts +24 -0
  498. package/src/plugins/customerio/index.ts +142 -0
  499. package/src/plugins/customerio/normalize.ts +223 -0
  500. package/src/plugins/customerio/schedule-flush.ts +58 -0
  501. package/src/plugins/legacy-video-plugins/index.ts +16 -0
  502. package/src/plugins/middleware/index.ts +131 -0
  503. package/src/plugins/page-enrichment/index.ts +127 -0
  504. package/src/plugins/remote-loader/index.ts +240 -0
  505. package/src/plugins/remote-middleware/index.ts +44 -0
  506. package/src/plugins/routing-middleware/index.ts +37 -0
  507. package/src/plugins/schema-filter/index.ts +90 -0
  508. package/src/plugins/validation/index.ts +80 -0
  509. package/src/test-helpers/browser-storage.ts +72 -0
  510. package/src/test-helpers/factories.ts +18 -0
  511. package/src/test-helpers/fetch-parse.ts +8 -0
  512. package/src/test-helpers/fixtures/cdn-settings.ts +299 -0
  513. package/src/test-helpers/fixtures/classic-destination.ts +25 -0
  514. package/src/test-helpers/fixtures/create-fetch-method.ts +24 -0
  515. package/src/test-helpers/test-writekeys.ts +5 -0
  516. package/src/test-helpers/type-assertions.ts +11 -0
@@ -0,0 +1,388 @@
1
+ import { Integrations, JSONObject } from '../../core/events'
2
+ import { Alias, Facade, Group, Identify, Page, Track } from '@segment/facade'
3
+ import { Analytics, InitOptions } from '../../core/analytics'
4
+ import { LegacySettings } from '../../browser'
5
+ import { isOffline, isOnline } from '../../core/connection'
6
+ import { Context, ContextCancelation } from '../../core/context'
7
+ import { isServer } from '../../core/environment'
8
+ import { DestinationPlugin, Plugin } from '../../core/plugin'
9
+ import { attempt } from '@customerio/cdp-analytics-core'
10
+ import { isPlanEventEnabled } from '../../lib/is-plan-event-enabled'
11
+ import { mergedOptions } from '../../lib/merged-options'
12
+ import { pWhile } from '../../lib/p-while'
13
+ import { PriorityQueue } from '../../lib/priority-queue'
14
+ import { PersistedPriorityQueue } from '../../lib/priority-queue/persisted'
15
+ import {
16
+ applyDestinationMiddleware,
17
+ DestinationMiddlewareFunction,
18
+ } from '../middleware'
19
+ import {
20
+ buildIntegration,
21
+ loadIntegration,
22
+ resolveIntegrationNameFromSource,
23
+ resolveVersion,
24
+ unloadIntegration,
25
+ } from './loader'
26
+ import { LegacyIntegration, ClassicIntegrationSource } from './types'
27
+ import { isPlainObject } from '@customerio/cdp-analytics-core'
28
+ import {
29
+ isDisabledIntegration as shouldSkipIntegration,
30
+ isInstallableIntegration,
31
+ } from './utils'
32
+
33
+ export type ClassType<T> = new (...args: unknown[]) => T
34
+
35
+ async function flushQueue(
36
+ xt: Plugin,
37
+ queue: PriorityQueue<Context>
38
+ ): Promise<PriorityQueue<Context>> {
39
+ const failedQueue: Context[] = []
40
+
41
+ if (isOffline()) {
42
+ return queue
43
+ }
44
+
45
+ await pWhile(
46
+ () => queue.length > 0 && isOnline(),
47
+ async () => {
48
+ const ctx = queue.pop()
49
+ if (!ctx) {
50
+ return
51
+ }
52
+
53
+ const result = await attempt(ctx, xt)
54
+ const success = result instanceof Context
55
+ if (!success) {
56
+ failedQueue.push(ctx)
57
+ }
58
+ }
59
+ )
60
+
61
+ // re-add failed tasks
62
+ failedQueue.map((failed) => queue.pushWithBackoff(failed))
63
+ return queue
64
+ }
65
+
66
+ export class LegacyDestination implements DestinationPlugin {
67
+ name: string
68
+ version: string
69
+ settings: JSONObject
70
+ options: InitOptions = {}
71
+ type: Plugin['type'] = 'destination'
72
+ middleware: DestinationMiddlewareFunction[] = []
73
+
74
+ private _ready = false
75
+ private _initialized = false
76
+ private onReady: Promise<unknown> | undefined
77
+ private onInitialize: Promise<unknown> | undefined
78
+ private disableAutoISOConversion: boolean
79
+
80
+ integrationSource?: ClassicIntegrationSource
81
+ integration: LegacyIntegration | undefined
82
+
83
+ buffer: PriorityQueue<Context>
84
+ flushing = false
85
+
86
+ constructor(
87
+ name: string,
88
+ version: string,
89
+ settings: JSONObject = {},
90
+ options: InitOptions,
91
+ integrationSource?: ClassicIntegrationSource
92
+ ) {
93
+ this.name = name
94
+ this.version = version
95
+ this.settings = { ...settings }
96
+ this.disableAutoISOConversion = options.disableAutoISOConversion || false
97
+ this.integrationSource = integrationSource
98
+
99
+ // AJS-Renderer sets an extraneous `type` setting that clobbers
100
+ // existing type defaults. We need to remove it if it's present
101
+ if (this.settings['type'] && this.settings['type'] === 'browser') {
102
+ delete this.settings['type']
103
+ }
104
+
105
+ this.options = options
106
+ this.buffer = options.disableClientPersistence
107
+ ? new PriorityQueue(4, [])
108
+ : new PersistedPriorityQueue(4, `dest-${name}`)
109
+
110
+ this.scheduleFlush()
111
+ }
112
+
113
+ isLoaded(): boolean {
114
+ return this._ready
115
+ }
116
+
117
+ ready(): Promise<unknown> {
118
+ return this.onReady ?? Promise.resolve()
119
+ }
120
+
121
+ async load(ctx: Context, analyticsInstance: Analytics): Promise<void> {
122
+ if (this._ready || this.onReady !== undefined) {
123
+ return
124
+ }
125
+
126
+ const integrationSource =
127
+ this.integrationSource ??
128
+ (await loadIntegration(
129
+ ctx,
130
+ this.name,
131
+ this.version,
132
+ this.options.obfuscate
133
+ ))
134
+
135
+ this.integration = buildIntegration(
136
+ integrationSource,
137
+ this.settings,
138
+ analyticsInstance
139
+ )
140
+
141
+ this.onReady = new Promise((resolve) => {
142
+ const onReadyFn = (): void => {
143
+ this._ready = true
144
+ resolve(true)
145
+ }
146
+
147
+ this.integration!.once('ready', onReadyFn)
148
+ })
149
+
150
+ this.onInitialize = new Promise((resolve) => {
151
+ const onInit = (): void => {
152
+ this._initialized = true
153
+ resolve(true)
154
+ }
155
+
156
+ this.integration!.on('initialize', onInit)
157
+ })
158
+
159
+ try {
160
+ ctx.stats.increment('analytics_js.integration.invoke', 1, [
161
+ `method:initialize`,
162
+ `integration_name:${this.name}`,
163
+ ])
164
+
165
+ this.integration.initialize()
166
+ } catch (error) {
167
+ ctx.stats.increment('analytics_js.integration.invoke.error', 1, [
168
+ `method:initialize`,
169
+ `integration_name:${this.name}`,
170
+ ])
171
+
172
+ throw error
173
+ }
174
+ }
175
+
176
+ unload(_ctx: Context, _analyticsInstance: Analytics): Promise<void> {
177
+ return unloadIntegration(this.name, this.version, this.options.obfuscate)
178
+ }
179
+
180
+ addMiddleware(...fn: DestinationMiddlewareFunction[]): void {
181
+ this.middleware = this.middleware.concat(...fn)
182
+ }
183
+
184
+ shouldBuffer(ctx: Context): boolean {
185
+ return (
186
+ // page events can't be buffered because of destinations that automatically add page views
187
+ ctx.event.type !== 'page' &&
188
+ (isOffline() || this._ready === false || this._initialized === false)
189
+ )
190
+ }
191
+
192
+ private async send<T extends Facade>(
193
+ ctx: Context,
194
+ clz: ClassType<T>,
195
+ eventType: 'track' | 'identify' | 'page' | 'alias' | 'group'
196
+ ): Promise<Context> {
197
+ if (this.shouldBuffer(ctx)) {
198
+ this.buffer.push(ctx)
199
+ this.scheduleFlush()
200
+ return ctx
201
+ }
202
+
203
+ const plan = this.options?.plan?.track
204
+ const ev = ctx.event.event
205
+
206
+ if (plan && ev && this.name !== 'Customer.io Data Pipelines') {
207
+ const planEvent = plan[ev]
208
+ if (!isPlanEventEnabled(plan, planEvent)) {
209
+ ctx.updateEvent('integrations', {
210
+ ...ctx.event.integrations,
211
+ All: false,
212
+ 'Customer.io Data Pipelines': true,
213
+ })
214
+ ctx.cancel(
215
+ new ContextCancelation({
216
+ retry: false,
217
+ reason: `Event ${ev} disabled for integration ${this.name} in tracking plan`,
218
+ type: 'Dropped by plan',
219
+ })
220
+ )
221
+ return ctx
222
+ } else {
223
+ ctx.updateEvent('integrations', {
224
+ ...ctx.event.integrations,
225
+ ...planEvent?.integrations,
226
+ })
227
+ }
228
+
229
+ if (planEvent?.enabled && planEvent?.integrations![this.name] === false) {
230
+ ctx.cancel(
231
+ new ContextCancelation({
232
+ retry: false,
233
+ reason: `Event ${ev} disabled for integration ${this.name} in tracking plan`,
234
+ type: 'Dropped by plan',
235
+ })
236
+ )
237
+ return ctx
238
+ }
239
+ }
240
+
241
+ const afterMiddleware = await applyDestinationMiddleware(
242
+ this.name,
243
+ ctx.event,
244
+ this.middleware
245
+ )
246
+
247
+ if (afterMiddleware === null) {
248
+ return ctx
249
+ }
250
+
251
+ const event = new clz(afterMiddleware, {
252
+ traverse: !this.disableAutoISOConversion,
253
+ })
254
+
255
+ ctx.stats.increment('analytics_js.integration.invoke', 1, [
256
+ `method:${eventType}`,
257
+ `integration_name:${this.name}`,
258
+ ])
259
+
260
+ try {
261
+ if (this.integration) {
262
+ await this.integration.invoke.call(this.integration, eventType, event)
263
+ }
264
+ } catch (err) {
265
+ ctx.stats.increment('analytics_js.integration.invoke.error', 1, [
266
+ `method:${eventType}`,
267
+ `integration_name:${this.name}`,
268
+ ])
269
+ throw err
270
+ }
271
+
272
+ return ctx
273
+ }
274
+
275
+ async track(ctx: Context): Promise<Context> {
276
+ return this.send(ctx, Track as ClassType<Track>, 'track')
277
+ }
278
+
279
+ async page(ctx: Context): Promise<Context> {
280
+ if (this.integration?._assumesPageview && !this._initialized) {
281
+ this.integration.initialize()
282
+ }
283
+
284
+ return this.onInitialize!.then(() => {
285
+ return this.send(ctx, Page as ClassType<Page>, 'page')
286
+ })
287
+ }
288
+
289
+ async identify(ctx: Context): Promise<Context> {
290
+ return this.send(ctx, Identify as ClassType<Identify>, 'identify')
291
+ }
292
+
293
+ async alias(ctx: Context): Promise<Context> {
294
+ return this.send(ctx, Alias as ClassType<Alias>, 'alias')
295
+ }
296
+
297
+ async group(ctx: Context): Promise<Context> {
298
+ return this.send(ctx, Group as ClassType<Group>, 'group')
299
+ }
300
+
301
+ private scheduleFlush(): void {
302
+ if (this.flushing) {
303
+ return
304
+ }
305
+
306
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
307
+ setTimeout(async () => {
308
+ this.flushing = true
309
+ this.buffer = await flushQueue(this, this.buffer)
310
+ this.flushing = false
311
+
312
+ if (this.buffer.todo > 0) {
313
+ this.scheduleFlush()
314
+ }
315
+ }, Math.random() * 5000)
316
+ }
317
+ }
318
+
319
+ export function ajsDestinations(
320
+ settings: LegacySettings,
321
+ globalIntegrations: Integrations = {},
322
+ options: InitOptions = {},
323
+ routingMiddleware?: DestinationMiddlewareFunction,
324
+ legacyIntegrationSources?: ClassicIntegrationSource[]
325
+ ): LegacyDestination[] {
326
+ if (isServer()) {
327
+ return []
328
+ }
329
+
330
+ if (settings.plan) {
331
+ options = options ?? {}
332
+ options.plan = settings.plan
333
+ }
334
+
335
+ const routingRules = settings.middlewareSettings?.routingRules ?? []
336
+ const remoteIntegrationsConfig = settings.integrations
337
+ const localIntegrationsConfig = options.integrations
338
+ // merged remote CDN settings with user provided options
339
+ const integrationOptions = mergedOptions(settings, options ?? {}) as Record<
340
+ string,
341
+ JSONObject
342
+ >
343
+
344
+ const adhocIntegrationSources = legacyIntegrationSources?.reduce(
345
+ (acc, integrationSource) => ({
346
+ ...acc,
347
+ [resolveIntegrationNameFromSource(integrationSource)]: integrationSource,
348
+ }),
349
+ {} as Record<string, ClassicIntegrationSource>
350
+ )
351
+
352
+ const installableIntegrations = new Set([
353
+ // Remotely configured installable integrations
354
+ ...Object.keys(remoteIntegrationsConfig).filter((name) =>
355
+ isInstallableIntegration(name, remoteIntegrationsConfig[name])
356
+ ),
357
+
358
+ // Directly provided integration sources are only installable if settings for them are available
359
+ ...Object.keys(adhocIntegrationSources || {}).filter(
360
+ (name) =>
361
+ isPlainObject(remoteIntegrationsConfig[name]) ||
362
+ isPlainObject(localIntegrationsConfig?.[name])
363
+ ),
364
+ ])
365
+
366
+ return Array.from(installableIntegrations)
367
+ .filter((name) => !shouldSkipIntegration(name, globalIntegrations))
368
+ .map((name) => {
369
+ const integrationSettings = remoteIntegrationsConfig[name]
370
+ const version = resolveVersion(integrationSettings)
371
+ const destination = new LegacyDestination(
372
+ name,
373
+ version,
374
+ integrationOptions[name],
375
+ options,
376
+ adhocIntegrationSources?.[name]
377
+ )
378
+
379
+ const routing = routingRules.filter(
380
+ (rule) => rule.destinationName === name
381
+ )
382
+ if (routing.length > 0 && routingMiddleware) {
383
+ destination.addMiddleware(routingMiddleware)
384
+ }
385
+
386
+ return destination
387
+ })
388
+ }
@@ -0,0 +1,127 @@
1
+ import { Analytics } from '../../core/analytics'
2
+ import { LegacyIntegrationConfiguration } from '../../browser'
3
+ import { getNextIntegrationsURL } from '../../lib/parse-cdn'
4
+ import { Context } from '../../core/context'
5
+ import { User } from '../../core/user'
6
+ import { loadScript, unloadScript } from '../../lib/load-script'
7
+ import {
8
+ LegacyIntegration,
9
+ ClassicIntegrationBuilder,
10
+ ClassicIntegrationSource,
11
+ } from './types'
12
+
13
+ function normalizeName(name: string): string {
14
+ return name.toLowerCase().replace('.', '').replace(/\s+/g, '-')
15
+ }
16
+
17
+ function obfuscatePathName(pathName: string, obfuscate = false): string | void {
18
+ return obfuscate ? btoa(pathName).replace(/=/g, '') : undefined
19
+ }
20
+
21
+ export function resolveIntegrationNameFromSource(
22
+ integrationSource: ClassicIntegrationSource
23
+ ) {
24
+ return (
25
+ 'Integration' in integrationSource
26
+ ? integrationSource.Integration
27
+ : integrationSource
28
+ ).prototype.name
29
+ }
30
+
31
+ function recordLoadMetrics(fullPath: string, ctx: Context, name: string): void {
32
+ try {
33
+ const [metric] =
34
+ window?.performance?.getEntriesByName(fullPath, 'resource') ?? []
35
+ // we assume everything that took under 100ms is cached
36
+ metric &&
37
+ ctx.stats.gauge('legacy_destination_time', Math.round(metric.duration), [
38
+ name,
39
+ ...(metric.duration < 100 ? ['cached'] : []),
40
+ ])
41
+ } catch (_) {
42
+ // not available
43
+ }
44
+ }
45
+
46
+ export function buildIntegration(
47
+ integrationSource: ClassicIntegrationSource,
48
+ integrationSettings: { [key: string]: any },
49
+ analyticsInstance: Analytics
50
+ ): LegacyIntegration {
51
+ let integrationCtr: ClassicIntegrationBuilder
52
+ // GA and Appcues use a different interface to instantiating integrations
53
+ if ('Integration' in integrationSource) {
54
+ const analyticsStub = {
55
+ user: (): User => analyticsInstance.user(),
56
+ addIntegration: (): void => {},
57
+ }
58
+
59
+ integrationSource(analyticsStub)
60
+ integrationCtr = integrationSource.Integration
61
+ } else {
62
+ integrationCtr = integrationSource
63
+ }
64
+
65
+ const integration = new integrationCtr(integrationSettings)
66
+ integration.analytics = analyticsInstance
67
+ return integration
68
+ }
69
+
70
+ export async function loadIntegration(
71
+ ctx: Context,
72
+ name: string,
73
+ version: string,
74
+ obfuscate?: boolean
75
+ ): Promise<ClassicIntegrationSource> {
76
+ const pathName = normalizeName(name)
77
+ const obfuscatedPathName = obfuscatePathName(pathName, obfuscate)
78
+ const path = getNextIntegrationsURL()
79
+
80
+ const fullPath = `${path}/${obfuscatedPathName ?? pathName
81
+ }.js?version=${version}`
82
+
83
+ try {
84
+ await loadScript(fullPath)
85
+ recordLoadMetrics(fullPath, ctx, name)
86
+ } catch (err) {
87
+ ctx.stats.gauge('legacy_destination_time', -1, [`plugin:${name}`, `failed`])
88
+ throw err
89
+ }
90
+
91
+ // @ts-ignore
92
+ const deps: string[] = window[`${pathName}Deps`]
93
+ await Promise.all(deps.map((dep) => loadScript(path + dep + '.gz')))
94
+
95
+ // @ts-ignore
96
+ window[`${pathName}Loader`]()
97
+
98
+ return window[
99
+ // @ts-ignore
100
+ `${pathName}Integration`
101
+ ] as ClassicIntegrationSource
102
+ }
103
+
104
+ export async function unloadIntegration(
105
+ name: string,
106
+ version: string,
107
+ obfuscate?: boolean
108
+ ): Promise<void> {
109
+ const path = getNextIntegrationsURL()
110
+ const pathName = normalizeName(name)
111
+ const obfuscatedPathName = obfuscatePathName(name, obfuscate)
112
+
113
+ const fullPath = `${path}/${obfuscatedPathName ?? pathName
114
+ }.js?version=${version}`
115
+
116
+ return unloadScript(fullPath)
117
+ }
118
+
119
+ export function resolveVersion(
120
+ settings?: LegacyIntegrationConfiguration
121
+ ): string {
122
+ return (
123
+ settings?.versionSettings?.override ??
124
+ settings?.versionSettings?.version ??
125
+ 'latest'
126
+ )
127
+ }
@@ -0,0 +1,44 @@
1
+ import { Group, Identify, Track, Page, Alias } from '@segment/facade'
2
+ import { Analytics } from '../../core/analytics'
3
+ import { Emitter } from '@customerio/cdp-analytics-core'
4
+ import { User } from '../../core/user'
5
+
6
+ export interface LegacyIntegration extends Emitter {
7
+ name: string
8
+ analytics?: Analytics
9
+ initialize: () => void
10
+ loaded: () => boolean
11
+
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ invoke: (method: string, ...args: any[]) => unknown
14
+
15
+ track?: (event: Track) => void | Promise<void>
16
+ identify?: (event: Identify) => void | Promise<void>
17
+ page?: (event: Page) => void | Promise<void>
18
+ alias?: (event: Alias) => void | Promise<void>
19
+ group?: (event: Group) => void | Promise<void>
20
+
21
+ // Customer.io specific
22
+ ontrack?: (event: Track) => void | Promise<void>
23
+ onidentify?: (event: Identify) => void | Promise<void>
24
+ onpage?: (event: Page) => void | Promise<void>
25
+ onalias?: (event: Alias) => void | Promise<void>
26
+ ongroup?: (event: Group) => void | Promise<void>
27
+
28
+ _assumesPageview?: boolean
29
+ options?: object
30
+ }
31
+
32
+ export interface ClassicIntegrationBuilder {
33
+ new(options: object): LegacyIntegration
34
+ prototype: LegacyIntegration
35
+ }
36
+
37
+ export interface ClassicIntegrationGenerator {
38
+ (analytics: { user: () => User; addIntegration: () => void }): void
39
+ Integration: ClassicIntegrationBuilder
40
+ }
41
+
42
+ export type ClassicIntegrationSource =
43
+ | ClassicIntegrationGenerator
44
+ | ClassicIntegrationBuilder
@@ -0,0 +1,34 @@
1
+ import { Integrations } from '@customerio/cdp-analytics-core'
2
+ import { LegacyIntegrationConfiguration } from '../..'
3
+
4
+ export const isInstallableIntegration = (
5
+ name: string,
6
+ integrationSettings: LegacyIntegrationConfiguration
7
+ ) => {
8
+ const { type, bundlingStatus, versionSettings } = integrationSettings
9
+ // We use `!== 'unbundled'` (versus `=== 'bundled'`) to be inclusive of
10
+ // destinations without a defined value for `bundlingStatus`
11
+ const deviceMode =
12
+ bundlingStatus !== 'unbundled' &&
13
+ (type === 'browser' || versionSettings?.componentTypes?.includes('browser'))
14
+
15
+ // checking for iterable is a quick fix we need in place to prevent
16
+ // errors showing Iterable as a failed destiantion. Ideally, we should
17
+ // fix the Iterable metadata instead, but that's a longer process.
18
+ return (
19
+ name !== 'Customer.io Data Pipelines' && name !== 'Iterable' && deviceMode
20
+ )
21
+ }
22
+
23
+ export const isDisabledIntegration = (
24
+ integrationName: string,
25
+ globalIntegrations: Integrations
26
+ ) => {
27
+ const allDisableAndNotDefined =
28
+ globalIntegrations.All === false &&
29
+ globalIntegrations[integrationName] === undefined
30
+
31
+ return (
32
+ globalIntegrations[integrationName] === false || allDisableAndNotDefined
33
+ )
34
+ }
@@ -0,0 +1,64 @@
1
+ import { Plugin } from '../../core/plugin'
2
+ import { Context } from '../../core/context'
3
+ import { CustomerioEvent } from '../../core/events'
4
+ import fetch from 'node-fetch'
5
+ import { version } from '../../generated/version'
6
+
7
+ interface AnalyticsNodeSettings {
8
+ writeKey: string
9
+ name: string
10
+ type: Plugin['type']
11
+ version: string
12
+ }
13
+
14
+ const btoa = (val: string): string => Buffer.from(val).toString('base64')
15
+
16
+ export async function post(
17
+ event: CustomerioEvent,
18
+ writeKey: string
19
+ ): Promise<CustomerioEvent> {
20
+ const res = await fetch(`https://cdp.customer.io/v1/${event.type}`, {
21
+ method: 'POST',
22
+ headers: {
23
+ 'Content-Type': 'application/json',
24
+ 'User-Agent': 'analytics-node-next/latest',
25
+ Authorization: `Basic ${btoa(writeKey)}`,
26
+ },
27
+ body: JSON.stringify(event),
28
+ })
29
+
30
+ if (!res.ok) {
31
+ throw new Error('Message Rejected')
32
+ }
33
+
34
+ return event
35
+ }
36
+
37
+ export function analyticsNode(settings: AnalyticsNodeSettings): Plugin {
38
+ const send = async (ctx: Context): Promise<Context> => {
39
+ ctx.updateEvent('context.library.name', 'analytics-node-next')
40
+ ctx.updateEvent('context.library.version', version)
41
+ ctx.updateEvent('_metadata.nodeVersion', process.versions.node)
42
+
43
+ await post(ctx.event, settings.writeKey)
44
+ return ctx
45
+ }
46
+
47
+ const plugin: Plugin = {
48
+ name: settings.name,
49
+ type: settings.type,
50
+ version: settings.version,
51
+
52
+ load: (ctx) => Promise.resolve(ctx),
53
+ isLoaded: () => true,
54
+
55
+ track: send,
56
+ identify: send,
57
+ page: send,
58
+ alias: send,
59
+ group: send,
60
+ screen: send,
61
+ }
62
+
63
+ return plugin
64
+ }