@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,24 @@
1
+ declare global {
2
+ interface Window {
3
+ analyticsWriteKey?: string
4
+ }
5
+ }
6
+
7
+ // This variable is used as an optional fallback for when customers
8
+ // host or proxy their own analytics.js.
9
+ try {
10
+ window.analyticsWriteKey = '__WRITE_KEY__'
11
+ } catch (_) {
12
+ // @ eslint-disable-next-line
13
+ }
14
+
15
+ export function embeddedWriteKey(): string | undefined {
16
+ if (window.analyticsWriteKey === undefined) {
17
+ return undefined
18
+ }
19
+
20
+ // this is done so that we don't accidentally override every reference to __write_key__
21
+ return window.analyticsWriteKey !== ['__', 'WRITE', '_', 'KEY', '__'].join('')
22
+ ? window.analyticsWriteKey
23
+ : undefined
24
+ }
@@ -0,0 +1,10 @@
1
+ import unfetch from 'unfetch'
2
+ import { getGlobal } from './get-global'
3
+
4
+ /**
5
+ * Wrapper around native `fetch` containing `unfetch` fallback.
6
+ */
7
+ export const fetch: typeof global.fetch = (...args) => {
8
+ const global = getGlobal()
9
+ return ((global && global.fetch) || unfetch)(...args)
10
+ }
@@ -0,0 +1,16 @@
1
+ // This an imperfect polyfill for globalThis
2
+ export const getGlobal = () => {
3
+ if (typeof globalThis !== 'undefined') {
4
+ return globalThis
5
+ }
6
+ if (typeof self !== 'undefined') {
7
+ return self
8
+ }
9
+ if (typeof window !== 'undefined') {
10
+ return window
11
+ }
12
+ if (typeof global !== 'undefined') {
13
+ return global
14
+ }
15
+ return null
16
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Returns `process.env` if it is available in the environment.
3
+ * Always returns an object make it similarly easy to use as `process.env`.
4
+ */
5
+ export function getProcessEnv(): { [key: string]: string | undefined } {
6
+ if (typeof process === 'undefined' || !process.env) {
7
+ return {}
8
+ }
9
+
10
+ return process.env
11
+ }
@@ -0,0 +1,30 @@
1
+ type Grouper<T> = (obj: T) => string | number
2
+
3
+ export function groupBy<T>(
4
+ collection: T[],
5
+ grouper: keyof T | Grouper<T>
6
+ ): Record<string, T[]> {
7
+ const results: Record<string, T[]> = {}
8
+
9
+ collection.forEach((item) => {
10
+ let key: string | number | undefined = undefined
11
+
12
+ if (typeof grouper === 'string') {
13
+ const suggestedKey = item[grouper]
14
+ key =
15
+ typeof suggestedKey !== 'string'
16
+ ? JSON.stringify(suggestedKey)
17
+ : suggestedKey
18
+ } else if (grouper instanceof Function) {
19
+ key = grouper(item)
20
+ }
21
+
22
+ if (key === undefined) {
23
+ return
24
+ }
25
+
26
+ results[key] = [...(results[key] ?? []), item]
27
+ })
28
+
29
+ return results
30
+ }
@@ -0,0 +1,20 @@
1
+ import { PlanEvent, TrackPlan } from '../core/events/interfaces'
2
+
3
+ /**
4
+ * Determines whether a track event is allowed to be sent based on the
5
+ * user's tracking plan.
6
+ * If the user does not have a tracking plan or the event is allowed based
7
+ * on the tracking plan configuration, returns true.
8
+ */
9
+ export function isPlanEventEnabled(
10
+ plan: TrackPlan | undefined,
11
+ planEvent: PlanEvent | undefined
12
+ ): boolean {
13
+ // Always prioritize the event's `enabled` status
14
+ if (typeof planEvent?.enabled === 'boolean') {
15
+ return planEvent.enabled
16
+ }
17
+
18
+ // Assume absence of a tracking plan means events are enabled
19
+ return plan?.__default?.enabled ?? true
20
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Check if thenable
3
+ * (instanceof Promise doesn't respect realms)
4
+ */
5
+ export const isThenable = (value: unknown): boolean =>
6
+ typeof value === 'object' &&
7
+ value !== null &&
8
+ 'then' in value &&
9
+ typeof (value as any).then === 'function'
@@ -0,0 +1,66 @@
1
+ function findScript(src: string): HTMLScriptElement | undefined {
2
+ const scripts = Array.prototype.slice.call(
3
+ window.document.querySelectorAll('script')
4
+ )
5
+ return scripts.find((s) => s.src === src)
6
+ }
7
+
8
+ export function loadScript(
9
+ src: string,
10
+ attributes?: Record<string, string>
11
+ ): Promise<HTMLScriptElement> {
12
+ const found = findScript(src)
13
+
14
+ if (found !== undefined) {
15
+ const status = found?.getAttribute('status')
16
+
17
+ if (status === 'loaded') {
18
+ return Promise.resolve(found)
19
+ }
20
+
21
+ if (status === 'loading') {
22
+ return new Promise((resolve, reject) => {
23
+ found.addEventListener('load', () => resolve(found))
24
+ found.addEventListener('error', (err) => reject(err))
25
+ })
26
+ }
27
+ }
28
+
29
+ return new Promise((resolve, reject) => {
30
+ const script = window.document.createElement('script')
31
+
32
+ script.type = 'text/javascript'
33
+ script.src = src
34
+ script.async = true
35
+
36
+ script.setAttribute('status', 'loading')
37
+ for (const [k, v] of Object.entries(attributes ?? {})) {
38
+ script.setAttribute(k, v)
39
+ }
40
+
41
+ script.onload = (): void => {
42
+ script.onerror = script.onload = null
43
+ script.setAttribute('status', 'loaded')
44
+ resolve(script)
45
+ }
46
+
47
+ script.onerror = (): void => {
48
+ script.onerror = script.onload = null
49
+ script.setAttribute('status', 'error')
50
+ reject(new Error(`Failed to load ${src}`))
51
+ }
52
+
53
+ const tag = window.document.getElementsByTagName('script')[0]
54
+ tag.parentElement?.insertBefore(script, tag)
55
+ })
56
+ }
57
+
58
+ export function unloadScript(src: string): Promise<void> {
59
+ const found = findScript(src)
60
+
61
+ if (found !== undefined) {
62
+ found.remove()
63
+ }
64
+
65
+ return Promise.resolve()
66
+ }
@@ -0,0 +1,46 @@
1
+ import { JSONObject, Options } from '../core/events/interfaces'
2
+ import { LegacySettings } from '../browser'
3
+
4
+ /**
5
+ * Merge legacy settings and initialized Integration option overrides.
6
+ *
7
+ * This will merge any options that were passed from initialization into
8
+ * overrides for settings that are returned by the CDN.
9
+ *
10
+ * i.e. this allows for passing options directly into destinations from
11
+ * the Analytics constructor.
12
+ */
13
+ export function mergedOptions(
14
+ settings: LegacySettings,
15
+ options: Options
16
+ ): Record<string, JSONObject> {
17
+ const optionOverrides = Object.entries(options.integrations ?? {}).reduce(
18
+ (overrides, [integration, options]) => {
19
+ if (typeof options === 'object') {
20
+ return {
21
+ ...overrides,
22
+ [integration]: options,
23
+ }
24
+ }
25
+
26
+ return {
27
+ ...overrides,
28
+ [integration]: {},
29
+ }
30
+ },
31
+ {} as Record<string, JSONObject>
32
+ )
33
+
34
+ return Object.entries(settings.integrations).reduce(
35
+ (integrationSettings, [integration, settings]) => {
36
+ return {
37
+ ...integrationSettings,
38
+ [integration]: {
39
+ ...settings,
40
+ ...optionOverrides[integration],
41
+ },
42
+ }
43
+ },
44
+ {} as Record<string, JSONObject>
45
+ )
46
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Register event listener on document that fires when:
3
+ * * tab change or tab close (in mobile or desktop)
4
+ * * click back / forward button
5
+ * * click any link or perform any other navigation action
6
+ * * soft refresh / hard refresh
7
+ *
8
+ * adapted from https://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad/52864508#52864508,
9
+ */
10
+ export const onPageLeave = (cb: (...args: unknown[]) => void) => {
11
+ let unloaded = false // prevents double firing if both are supported
12
+
13
+ window.addEventListener('pagehide', () => {
14
+ if (unloaded) return
15
+ unloaded = true
16
+ cb()
17
+ })
18
+
19
+ // using document instead of window because of bug affecting browsers before safari 14 (detail in footnotes https://caniuse.com/?search=visibilitychange)
20
+ document.addEventListener('visibilitychange', () => {
21
+ if (document.visibilityState == 'hidden') {
22
+ if (unloaded) return
23
+ unloaded = true
24
+ cb()
25
+ } else {
26
+ unloaded = false
27
+ }
28
+ })
29
+ }
@@ -0,0 +1,12 @@
1
+ export const pWhile = async <T>(
2
+ condition: (value: T | undefined) => boolean,
3
+ action: () => T | PromiseLike<T>
4
+ ): Promise<void> => {
5
+ const loop = async (actionResult: T | undefined): Promise<void> => {
6
+ if (condition(actionResult)) {
7
+ return loop(await action())
8
+ }
9
+ }
10
+
11
+ return loop(undefined)
12
+ }
@@ -0,0 +1,85 @@
1
+ import { embeddedWriteKey } from './embedded-write-key'
2
+
3
+ const analyticsScriptRegex =
4
+ /(https:\/\/.*)\/analytics\.js\/v1\/(?:.*?)\/(?:platform|analytics.*)?/
5
+ const getCDNUrlFromScriptTag = (): string | undefined => {
6
+ let cdn: string | undefined
7
+ const scripts = Array.prototype.slice.call(
8
+ document.querySelectorAll('script')
9
+ )
10
+ scripts.forEach((s) => {
11
+ const src = s.getAttribute('src') ?? ''
12
+ const result = analyticsScriptRegex.exec(src)
13
+
14
+ if (result && result[1]) {
15
+ cdn = result[1]
16
+ }
17
+ })
18
+ return cdn
19
+ }
20
+
21
+ let _globalCDN: string | undefined // set globalCDN as in-memory singleton
22
+ const getGlobalCDNUrl = (): string | undefined => {
23
+ const result = _globalCDN ?? window.analytics?._cdn
24
+ return result
25
+ }
26
+
27
+ export const setGlobalCDNUrl = (cdn: string) => {
28
+ if (window.analytics) {
29
+ window.analytics._cdn = cdn
30
+ }
31
+ _globalCDN = cdn
32
+ }
33
+
34
+ export const getCDN = (): string => {
35
+ const globalCdnUrl = getGlobalCDNUrl()
36
+
37
+ if (globalCdnUrl) return globalCdnUrl
38
+
39
+ const cdnFromScriptTag = getCDNUrlFromScriptTag()
40
+
41
+ if (cdnFromScriptTag) {
42
+ return cdnFromScriptTag
43
+ } else {
44
+ // it's possible that the CDN is not found in the page because:
45
+ // - the script is loaded through a proxy
46
+ // - the script is removed after execution
47
+ // in this case, we fall back to the default CDN
48
+ return `https://cdp.customer.io`
49
+ }
50
+ }
51
+
52
+ export const getNextIntegrationsURL = () => {
53
+ const cdn = getCDN()
54
+ return `${cdn}/v1/analytics-js/actions`
55
+ }
56
+
57
+ /**
58
+ * Replaces the CDN URL in the script tag with the one from Analytics.js 1.0
59
+ *
60
+ * @returns the path to Analytics JS 1.0
61
+ **/
62
+ export function getLegacyAJSPath(): string {
63
+ const writeKey = embeddedWriteKey() ?? window.analytics._writeKey
64
+
65
+ const scripts = Array.prototype.slice.call(
66
+ document.querySelectorAll('script')
67
+ )
68
+ let path: string | undefined = undefined
69
+
70
+ for (const s of scripts) {
71
+ const src = s.getAttribute('src') ?? ''
72
+ const result = analyticsScriptRegex.exec(src)
73
+
74
+ if (result && result[1]) {
75
+ path = src
76
+ break
77
+ }
78
+ }
79
+
80
+ if (path) {
81
+ return path.replace('analytics.min.js', 'analytics.classic.js')
82
+ }
83
+
84
+ return `https://cdp.customer.io/analytics.js/v1/${writeKey}/analytics.classic.js`
85
+ }
@@ -0,0 +1,24 @@
1
+ type BackoffParams = {
2
+ /** The number of milliseconds before starting the first retry. Default is 500 */
3
+ minTimeout?: number
4
+
5
+ /** The maximum number of milliseconds between two retries. Default is Infinity */
6
+ maxTimeout?: number
7
+
8
+ /** The exponential factor to use. Default is 2. */
9
+ factor?: number
10
+
11
+ /** The current attempt */
12
+ attempt: number
13
+ }
14
+
15
+ export function backoff(params: BackoffParams): number {
16
+ const random = Math.random() + 1
17
+ const {
18
+ minTimeout = 500,
19
+ factor = 2,
20
+ attempt,
21
+ maxTimeout = Infinity,
22
+ } = params
23
+ return Math.min(random * minTimeout * Math.pow(factor, attempt), maxTimeout)
24
+ }
@@ -0,0 +1,6 @@
1
+ import {
2
+ PriorityQueue,
3
+ ON_REMOVE_FROM_FUTURE,
4
+ } from '@customerio/cdp-analytics-core'
5
+
6
+ export { PriorityQueue, ON_REMOVE_FROM_FUTURE }
@@ -0,0 +1,127 @@
1
+ import { PriorityQueue } from '.'
2
+ import { Context, SerializedContext } from '../../core/context'
3
+ import { isBrowser } from '../../core/environment'
4
+
5
+ let loc:
6
+ | Storage
7
+ | { getItem: () => void; setItem: () => void; removeItem: () => void } = {
8
+ getItem() {},
9
+ setItem() {},
10
+ removeItem() {},
11
+ }
12
+
13
+ try {
14
+ loc = isBrowser() && window.localStorage ? window.localStorage : loc
15
+ } catch (err) {
16
+ console.warn('Unable to access localStorage', err)
17
+ }
18
+
19
+ function persisted(key: string): Context[] {
20
+ const items = loc.getItem(key)
21
+ return (items ? JSON.parse(items) : []).map(
22
+ (p: SerializedContext) => new Context(p.event, p.id)
23
+ )
24
+ }
25
+
26
+ function persistItems(key: string, items: Context[]): void {
27
+ const existing = persisted(key)
28
+ const all = [...items, ...existing]
29
+
30
+ const merged = all.reduce((acc, item) => {
31
+ return {
32
+ ...acc,
33
+ [item.id]: item,
34
+ }
35
+ }, {} as Record<string, Context>)
36
+
37
+ loc.setItem(key, JSON.stringify(Object.values(merged)))
38
+ }
39
+
40
+ function seen(key: string): Record<string, number> {
41
+ const stored = loc.getItem(key)
42
+ return stored ? JSON.parse(stored) : {}
43
+ }
44
+
45
+ function persistSeen(key: string, memory: Record<string, number>): void {
46
+ const stored = seen(key)
47
+
48
+ loc.setItem(
49
+ key,
50
+ JSON.stringify({
51
+ ...stored,
52
+ ...memory,
53
+ })
54
+ )
55
+ }
56
+
57
+ function remove(key: string): void {
58
+ loc.removeItem(key)
59
+ }
60
+
61
+ const now = (): number => new Date().getTime()
62
+
63
+ function mutex(key: string, onUnlock: Function, attempt = 0): void {
64
+ const lockTimeout = 50
65
+ const lockKey = `persisted-queue:v1:${key}:lock`
66
+
67
+ const expired = (lock: number): boolean => new Date().getTime() > lock
68
+ const rawLock = loc.getItem(lockKey)
69
+ const lock = rawLock ? (JSON.parse(rawLock) as number) : null
70
+
71
+ const allowed = lock === null || expired(lock)
72
+ if (allowed) {
73
+ loc.setItem(lockKey, JSON.stringify(now() + lockTimeout))
74
+ onUnlock()
75
+ loc.removeItem(lockKey)
76
+ return
77
+ }
78
+
79
+ if (!allowed && attempt < 3) {
80
+ setTimeout(() => {
81
+ mutex(key, onUnlock, attempt + 1)
82
+ }, lockTimeout)
83
+ } else {
84
+ console.error('Unable to retrieve lock')
85
+ }
86
+ }
87
+
88
+ export class PersistedPriorityQueue extends PriorityQueue<Context> {
89
+ constructor(maxAttempts: number, key: string) {
90
+ super(maxAttempts, [])
91
+
92
+ const itemsKey = `persisted-queue:v1:${key}:items`
93
+ const seenKey = `persisted-queue:v1:${key}:seen`
94
+
95
+ let saved: Context[] = []
96
+ let lastSeen: Record<string, number> = {}
97
+
98
+ mutex(key, () => {
99
+ try {
100
+ saved = persisted(itemsKey)
101
+ lastSeen = seen(seenKey)
102
+ remove(itemsKey)
103
+ remove(seenKey)
104
+
105
+ this.queue = [...saved, ...this.queue]
106
+ this.seen = { ...lastSeen, ...this.seen }
107
+ } catch (err) {
108
+ console.error(err)
109
+ }
110
+ })
111
+
112
+ window.addEventListener('pagehide', () => {
113
+ // we deliberately want to use the less powerful 'pagehide' API to only persist on events where the analytics instance gets destroyed, and not on tab away.
114
+ if (this.todo > 0) {
115
+ const items = [...this.queue, ...this.future]
116
+ try {
117
+ mutex(key, () => {
118
+ persistItems(itemsKey, items)
119
+ persistSeen(seenKey, this.seen)
120
+ })
121
+ } catch (err) {
122
+ console.error(err)
123
+ }
124
+ }
125
+ })
126
+ }
127
+ }
@@ -0,0 +1,4 @@
1
+ export const sleep = (time: number): Promise<void> =>
2
+ new Promise((resolve) => {
3
+ setTimeout(resolve, time)
4
+ })
@@ -0,0 +1,53 @@
1
+ import {
2
+ Alias,
3
+ Facade,
4
+ Group,
5
+ Identify,
6
+ Options,
7
+ Page,
8
+ Screen,
9
+ Track,
10
+ } from '@segment/facade'
11
+ import { CustomerioEvent } from '../core/events'
12
+
13
+ export type CustomerioFacade = Facade<CustomerioEvent> & {
14
+ obj: CustomerioEvent
15
+ }
16
+
17
+ export function toFacade(
18
+ evt: CustomerioEvent,
19
+ options?: Options
20
+ ): CustomerioFacade {
21
+ let fcd = new Facade(evt, options)
22
+
23
+ if (evt.type === 'track') {
24
+ fcd = new Track(evt, options)
25
+ }
26
+
27
+ if (evt.type === 'identify') {
28
+ fcd = new Identify(evt, options)
29
+ }
30
+
31
+ if (evt.type === 'page') {
32
+ fcd = new Page(evt, options)
33
+ }
34
+
35
+ if (evt.type === 'alias') {
36
+ fcd = new Alias(evt, options)
37
+ }
38
+
39
+ if (evt.type === 'group') {
40
+ fcd = new Group(evt, options)
41
+ }
42
+
43
+ if (evt.type === 'screen') {
44
+ fcd = new Screen(evt, options)
45
+ }
46
+
47
+ Object.defineProperty(fcd, 'obj', {
48
+ value: evt,
49
+ writable: true,
50
+ })
51
+
52
+ return fcd as CustomerioFacade
53
+ }
@@ -0,0 +1,36 @@
1
+ import { Analytics } from '../core/analytics'
2
+ import { Context } from '../core/context'
3
+ import { validation } from '../plugins/validation'
4
+ import { analyticsNode } from '../plugins/analytics-node'
5
+ import { Plugin } from '../core/plugin'
6
+ import { EventQueue } from '../core/queue/event-queue'
7
+ import { PriorityQueue } from '../lib/priority-queue'
8
+
9
+ export class AnalyticsNode {
10
+ static async load(settings: {
11
+ writeKey: string
12
+ }): Promise<[Analytics, Context]> {
13
+ const cookieOptions = {
14
+ persist: false,
15
+ }
16
+
17
+ const queue = new EventQueue(new PriorityQueue(3, []))
18
+ const options = { user: cookieOptions, group: cookieOptions }
19
+ const analytics = new Analytics(settings, options, queue)
20
+
21
+ const nodeSettings = {
22
+ writeKey: settings.writeKey,
23
+ name: 'analytics-node-next',
24
+ type: 'after' as Plugin['type'],
25
+ version: 'latest',
26
+ }
27
+
28
+ const ctx = await analytics.register(
29
+ validation,
30
+ analyticsNode(nodeSettings)
31
+ )
32
+ analytics.emit('initialize', settings, cookieOptions ?? {})
33
+
34
+ return [analytics, ctx]
35
+ }
36
+ }
@@ -0,0 +1,7 @@
1
+ export class AnalyticsNode {
2
+ static load(): Promise<never> {
3
+ return Promise.reject(
4
+ new Error('AnalyticsNode is not available in browsers.')
5
+ )
6
+ }
7
+ }