@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,166 @@
1
+ import {
2
+ isFunction,
3
+ isPlainObject,
4
+ isString,
5
+ isNumber,
6
+ } from '../../plugins/validation'
7
+ import { Context } from '../context'
8
+ import {
9
+ Callback,
10
+ JSONObject,
11
+ Options,
12
+ EventProperties,
13
+ CustomerioEvent,
14
+ Traits,
15
+ GroupTraits,
16
+ UserTraits,
17
+ } from '../events'
18
+ import { ID, User } from '../user'
19
+
20
+ /**
21
+ * Helper for the track method
22
+ */
23
+ export function resolveArguments(
24
+ eventName: string | CustomerioEvent,
25
+ properties?: EventProperties | Callback,
26
+ options?: Options | Callback,
27
+ callback?: Callback
28
+ ): [string, EventProperties | Callback, Options, Callback | undefined] {
29
+ const args = [eventName, properties, options, callback]
30
+
31
+ const name = isPlainObject(eventName) ? eventName.event : eventName
32
+ if (!name || !isString(name)) {
33
+ throw new Error('Event missing')
34
+ }
35
+
36
+ const data = isPlainObject(eventName)
37
+ ? eventName.properties ?? {}
38
+ : isPlainObject(properties)
39
+ ? properties
40
+ : {}
41
+
42
+ let opts: Options = {}
43
+ if (!isFunction(options)) {
44
+ opts = options ?? {}
45
+ }
46
+
47
+ if (isPlainObject(eventName) && !isFunction(properties)) {
48
+ opts = properties ?? {}
49
+ }
50
+
51
+ const cb = args.find(isFunction) as Callback | undefined
52
+ return [name, data, opts, cb]
53
+ }
54
+
55
+ /**
56
+ * Helper for page, screen methods
57
+ */
58
+ export function resolvePageArguments(
59
+ category?: string | object,
60
+ name?: string | object | Callback,
61
+ properties?: EventProperties | Options | Callback | null,
62
+ options?: Options | Callback,
63
+ callback?: Callback
64
+ ): [
65
+ string | null,
66
+ string | null,
67
+ EventProperties,
68
+ Options,
69
+ Callback | undefined
70
+ ] {
71
+ let resolvedCategory: string | undefined | null = null
72
+ let resolvedName: string | undefined | null = null
73
+ const args = [category, name, properties, options, callback]
74
+
75
+ const strings = args.filter(isString)
76
+ if (strings[0] !== undefined && strings[1] !== undefined) {
77
+ resolvedCategory = strings[0]
78
+ resolvedName = strings[1]
79
+ }
80
+
81
+ if (strings.length === 1) {
82
+ resolvedCategory = null
83
+ resolvedName = strings[0]
84
+ }
85
+
86
+ const resolvedCallback = args.find(isFunction) as Callback | undefined
87
+
88
+ const objects = args.filter((obj) => {
89
+ if (resolvedName === null) {
90
+ return isPlainObject(obj)
91
+ }
92
+ return isPlainObject(obj) || obj === null
93
+ }) as Array<JSONObject | null>
94
+
95
+ const resolvedProperties = (objects[0] ?? {}) as EventProperties
96
+ const resolvedOptions = (objects[1] ?? {}) as Options
97
+
98
+ return [
99
+ resolvedCategory,
100
+ resolvedName,
101
+ resolvedProperties,
102
+ resolvedOptions,
103
+ resolvedCallback,
104
+ ]
105
+ }
106
+
107
+ /**
108
+ * Helper for group, identify methods
109
+ */
110
+ export const resolveUserArguments = <T extends Traits, U extends User>(
111
+ user: U
112
+ ): ResolveUser<T> => {
113
+ return (...args): ReturnType<ResolveUser<T>> => {
114
+ let id: string | ID | null = null
115
+ id = args.find(isString) ?? args.find(isNumber)?.toString() ?? user.id()
116
+
117
+ const objects = args.filter((obj) => {
118
+ if (id === null) {
119
+ return isPlainObject(obj)
120
+ }
121
+ return isPlainObject(obj) || obj === null
122
+ }) as Array<Traits | null>
123
+
124
+ const traits = (objects[0] ?? {}) as T
125
+ const opts = (objects[1] ?? {}) as Options
126
+
127
+ const resolvedCallback = args.find(isFunction) as Callback | undefined
128
+
129
+ return [id, traits, opts, resolvedCallback]
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Helper for alias method
135
+ */
136
+ export function resolveAliasArguments(
137
+ to: string | number,
138
+ from?: string | number | Options,
139
+ options?: Options | Callback,
140
+ callback?: Callback
141
+ ): [string, string | null, Options, Callback | undefined] {
142
+ if (isNumber(to)) to = to.toString() // Legacy behaviour - allow integers for alias calls
143
+ if (isNumber(from)) from = from.toString()
144
+ const args = [to, from, options, callback]
145
+
146
+ const [aliasTo = to, aliasFrom = null] = args.filter(isString)
147
+ const [opts = {}] = args.filter(isPlainObject)
148
+ const resolvedCallback = args.find(isFunction) as Callback | undefined
149
+
150
+ return [aliasTo, aliasFrom, opts, resolvedCallback]
151
+ }
152
+
153
+ type ResolveUser<T extends Traits> = (
154
+ id?: ID | object,
155
+ traits?: T | Callback | null,
156
+ options?: Options | Callback,
157
+ callback?: Callback
158
+ ) => [ID, T, Options, Callback | undefined]
159
+
160
+ export type IdentifyParams = Parameters<ResolveUser<UserTraits>>
161
+ export type GroupParams = Parameters<ResolveUser<GroupTraits>>
162
+ export type EventParams = Parameters<typeof resolveArguments>
163
+ export type PageParams = Parameters<typeof resolvePageArguments>
164
+ export type AliasParams = Parameters<typeof resolveAliasArguments>
165
+
166
+ export type DispatchedEvent = Context
@@ -0,0 +1,152 @@
1
+ import { Analytics } from './analytics'
2
+ import { EventProperties, Options } from './events'
3
+ import { pTimeout } from './callback'
4
+
5
+ // Check if a user is opening the link in a new tab
6
+ function userNewTab(event: Event): boolean {
7
+ const typedEvent = event as Event & {
8
+ ctrlKey: boolean
9
+ shiftKey: boolean
10
+ metaKey: boolean
11
+ button: number
12
+ }
13
+ if (
14
+ typedEvent.ctrlKey ||
15
+ typedEvent.shiftKey ||
16
+ typedEvent.metaKey ||
17
+ (typedEvent.button && typedEvent.button == 1)
18
+ ) {
19
+ return true
20
+ }
21
+ return false
22
+ }
23
+
24
+ // Check if the link opens in new tab
25
+ function linkNewTab(element: HTMLAnchorElement, href: string | null): boolean {
26
+ if (element.target === '_blank' && href) {
27
+ return true
28
+ }
29
+ return false
30
+ }
31
+
32
+ export interface JQueryShim<TElement = HTMLElement> {
33
+ toArray(): TElement[]
34
+ }
35
+
36
+ export function link(
37
+ this: Analytics,
38
+ links: Element | Array<Element> | JQueryShim | null,
39
+ event: string | Function,
40
+ properties?: EventProperties | Function,
41
+ options?: Options
42
+ ): Analytics {
43
+ let elements: Array<Element> = []
44
+ // always arrays, handles jquery
45
+ if (!links) {
46
+ return this
47
+ }
48
+ if (links instanceof Element) {
49
+ elements = [links]
50
+ } else if ('toArray' in links) {
51
+ elements = links.toArray()
52
+ } else {
53
+ elements = links
54
+ }
55
+
56
+ elements.forEach((el: Element) => {
57
+ el.addEventListener(
58
+ 'click',
59
+ (elementEvent: Event) => {
60
+ const ev = event instanceof Function ? event(el) : event
61
+ const props =
62
+ properties instanceof Function ? properties(el) : properties
63
+ const href =
64
+ el.getAttribute('href') ||
65
+ el.getAttributeNS('http://www.w3.org/1999/xlink', 'href') ||
66
+ el.getAttribute('xlink:href') ||
67
+ el.getElementsByTagName('a')[0]?.getAttribute('href')
68
+
69
+ const trackEvent = pTimeout(
70
+ this.track(ev, props, options ?? {}),
71
+ this.settings.timeout ?? 500
72
+ )
73
+
74
+ if (
75
+ !linkNewTab(el as HTMLAnchorElement, href) &&
76
+ !userNewTab(elementEvent)
77
+ ) {
78
+ if (href) {
79
+ elementEvent.preventDefault
80
+ ? elementEvent.preventDefault()
81
+ : (elementEvent.returnValue = false)
82
+ trackEvent
83
+ .catch(console.error)
84
+ .then(() => {
85
+ window.location.href = href
86
+ })
87
+ .catch(console.error)
88
+ }
89
+ }
90
+ },
91
+ false
92
+ )
93
+ })
94
+
95
+ return this
96
+ }
97
+
98
+ export type LinkArgs = Parameters<typeof link>
99
+
100
+ export function form(
101
+ this: Analytics,
102
+ forms: HTMLFormElement | Array<HTMLFormElement> | null,
103
+ event: string | Function,
104
+ properties?: EventProperties | Function,
105
+ options?: Options
106
+ ): Analytics {
107
+ // always arrays, handles jquery
108
+ if (!forms) return this
109
+ if (forms instanceof HTMLFormElement) forms = [forms]
110
+
111
+ const elements = forms
112
+
113
+ elements.forEach((el) => {
114
+ if (!(el instanceof Element))
115
+ throw new TypeError('Must pass HTMLElement to trackForm/trackSubmit.')
116
+ const handler = (elementEvent: Event): void => {
117
+ elementEvent.preventDefault
118
+ ? elementEvent.preventDefault()
119
+ : (elementEvent.returnValue = false)
120
+
121
+ const ev = event instanceof Function ? event(el) : event
122
+ const props = properties instanceof Function ? properties(el) : properties
123
+
124
+ const trackEvent = pTimeout(
125
+ this.track(ev, props, options ?? {}),
126
+ this.settings.timeout ?? 500
127
+ )
128
+
129
+ trackEvent
130
+ .catch(console.error)
131
+ .then(() => {
132
+ el.submit()
133
+ })
134
+ .catch(console.error)
135
+ }
136
+
137
+ // Support the events happening through jQuery or Zepto instead of through
138
+ // the normal DOM API, because `el.submit` doesn't bubble up events...
139
+
140
+ const $ = (window as any).jQuery || (window as any).Zepto
141
+ if ($) {
142
+ $(el).submit(handler)
143
+ } else {
144
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
145
+ el.addEventListener('submit', handler, false)
146
+ }
147
+ })
148
+
149
+ return this
150
+ }
151
+
152
+ export type FormArgs = Parameters<typeof form>
@@ -0,0 +1,289 @@
1
+ import { Analytics } from '../analytics'
2
+ import { Context } from '../context'
3
+ import { isThenable } from '../../lib/is-thenable'
4
+ import { AnalyticsBrowserCore } from '../analytics/interfaces'
5
+ import { version } from '../../generated/version'
6
+
7
+ /**
8
+ * The names of any AnalyticsBrowser methods that also exist on Analytics
9
+ */
10
+ export type PreInitMethodName =
11
+ | 'screen'
12
+ | 'register'
13
+ | 'deregister'
14
+ | 'user'
15
+ | 'trackSubmit'
16
+ | 'trackClick'
17
+ | 'trackLink'
18
+ | 'trackForm'
19
+ | 'pageview'
20
+ | 'identify'
21
+ | 'reset'
22
+ | 'group'
23
+ | 'track'
24
+ | 'ready'
25
+ | 'alias'
26
+ | 'debug'
27
+ | 'page'
28
+ | 'once'
29
+ | 'off'
30
+ | 'on'
31
+ | 'addSourceMiddleware'
32
+ | 'setAnonymousId'
33
+ | 'addDestinationMiddleware'
34
+
35
+ // Union of all analytics methods that _do not_ return a Promise
36
+ type SyncPreInitMethodName = {
37
+ [MethodName in PreInitMethodName]: ReturnType<
38
+ Analytics[MethodName]
39
+ > extends Promise<any>
40
+ ? never
41
+ : MethodName
42
+ }[PreInitMethodName]
43
+
44
+ const flushSyncAnalyticsCalls = (
45
+ name: SyncPreInitMethodName,
46
+ analytics: Analytics,
47
+ buffer: PreInitMethodCallBuffer
48
+ ): void => {
49
+ buffer.getCalls(name).forEach((c) => {
50
+ // While the underlying methods are synchronous, the callAnalyticsMethod returns a promise,
51
+ // which normalizes success and error states between async and non-async methods, with no perf penalty.
52
+ callAnalyticsMethod(analytics, c).catch(console.error)
53
+ })
54
+ }
55
+
56
+ export const flushAddSourceMiddleware = async (
57
+ analytics: Analytics,
58
+ buffer: PreInitMethodCallBuffer
59
+ ) => {
60
+ for (const c of buffer.getCalls('addSourceMiddleware')) {
61
+ await callAnalyticsMethod(analytics, c).catch(console.error)
62
+ }
63
+ }
64
+
65
+ export const flushOn = flushSyncAnalyticsCalls.bind(this, 'on')
66
+
67
+ export const flushSetAnonymousID = flushSyncAnalyticsCalls.bind(
68
+ this,
69
+ 'setAnonymousId'
70
+ )
71
+
72
+ export const flushAnalyticsCallsInNewTask = (
73
+ analytics: Analytics,
74
+ buffer: PreInitMethodCallBuffer
75
+ ): void => {
76
+ buffer.toArray().forEach((m) => {
77
+ setTimeout(() => {
78
+ callAnalyticsMethod(analytics, m).catch(console.error)
79
+ }, 0)
80
+ })
81
+ }
82
+
83
+ /**
84
+ * Represents a buffered method call that occurred before initialization.
85
+ */
86
+ export interface PreInitMethodCall<
87
+ MethodName extends PreInitMethodName = PreInitMethodName
88
+ > {
89
+ method: MethodName
90
+ args: PreInitMethodParams<MethodName>
91
+ called: boolean
92
+ resolve: (v: ReturnType<Analytics[MethodName]>) => void
93
+ reject: (reason: any) => void
94
+ }
95
+
96
+ export type PreInitMethodParams<MethodName extends PreInitMethodName> =
97
+ Parameters<Analytics[MethodName]>
98
+
99
+ /**
100
+ * Infer return type; if return type is promise, unwrap it.
101
+ */
102
+ type ReturnTypeUnwrap<Fn> = Fn extends (...args: any[]) => infer ReturnT
103
+ ? ReturnT extends PromiseLike<infer Unwrapped>
104
+ ? Unwrapped
105
+ : ReturnT
106
+ : never
107
+
108
+ type MethodCallMap = Partial<Record<PreInitMethodName, PreInitMethodCall[]>>
109
+
110
+ /**
111
+ * Represents any and all the buffered method calls that occurred before initialization.
112
+ */
113
+ export class PreInitMethodCallBuffer {
114
+ private _value = {} as MethodCallMap
115
+
116
+ toArray(): PreInitMethodCall[] {
117
+ return ([] as PreInitMethodCall[]).concat(...Object.values(this._value))
118
+ }
119
+
120
+ getCalls<T extends PreInitMethodName>(methodName: T): PreInitMethodCall<T>[] {
121
+ return (this._value[methodName] ?? []) as PreInitMethodCall<T>[]
122
+ }
123
+
124
+ push(...calls: PreInitMethodCall[]): PreInitMethodCallBuffer {
125
+ calls.forEach((call) => {
126
+ if (this._value[call.method]) {
127
+ this._value[call.method]!.push(call)
128
+ } else {
129
+ this._value[call.method] = [call]
130
+ }
131
+ })
132
+ return this
133
+ }
134
+
135
+ clear(): PreInitMethodCallBuffer {
136
+ this._value = {} as MethodCallMap
137
+ return this
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Call method and mark as "called"
143
+ * This function should never throw an error
144
+ */
145
+ export async function callAnalyticsMethod<T extends PreInitMethodName>(
146
+ analytics: Analytics,
147
+ call: PreInitMethodCall<T>
148
+ ): Promise<void> {
149
+ try {
150
+ if (call.called) {
151
+ return undefined
152
+ }
153
+ call.called = true
154
+
155
+ const result: ReturnType<Analytics[T]> = (
156
+ analytics[call.method] as Function
157
+ )(...call.args)
158
+
159
+ if (isThenable(result)) {
160
+ // do not defer for non-async methods
161
+ await result
162
+ }
163
+
164
+ call.resolve(result)
165
+ } catch (err) {
166
+ call.reject(err)
167
+ }
168
+ }
169
+
170
+ export type AnalyticsLoader = (
171
+ preInitBuffer: PreInitMethodCallBuffer
172
+ ) => Promise<[Analytics, Context]>
173
+
174
+ export class AnalyticsBuffered
175
+ implements PromiseLike<[Analytics, Context]>, AnalyticsBrowserCore
176
+ {
177
+ instance?: Analytics
178
+ ctx?: Context
179
+ private _preInitBuffer = new PreInitMethodCallBuffer()
180
+ private _promise: Promise<[Analytics, Context]>
181
+ constructor(loader: AnalyticsLoader) {
182
+ this._promise = loader(this._preInitBuffer)
183
+ this._promise
184
+ .then(([ajs, ctx]) => {
185
+ this.instance = ajs
186
+ this.ctx = ctx
187
+ })
188
+ .catch(() => {
189
+ // intentionally do nothing...
190
+ // this result of this promise will be caught by the 'catch' block on this class.
191
+ })
192
+ }
193
+
194
+ then<T1, T2 = never>(
195
+ ...args: [
196
+ onfulfilled:
197
+ | ((instance: [Analytics, Context]) => T1 | PromiseLike<T1>)
198
+ | null
199
+ | undefined,
200
+ onrejected?: (reason: unknown) => T2 | PromiseLike<T2>
201
+ ]
202
+ ) {
203
+ return this._promise.then(...args)
204
+ }
205
+
206
+ catch<TResult = never>(
207
+ ...args: [
208
+ onrejected?:
209
+ | ((reason: any) => TResult | PromiseLike<TResult>)
210
+ | undefined
211
+ | null
212
+ ]
213
+ ) {
214
+ return this._promise.catch(...args)
215
+ }
216
+
217
+ finally(...args: [onfinally?: (() => void) | undefined | null]) {
218
+ return this._promise.finally(...args)
219
+ }
220
+
221
+ trackSubmit = this._createMethod('trackSubmit')
222
+ trackClick = this._createMethod('trackClick')
223
+ trackLink = this._createMethod('trackLink')
224
+ pageView = this._createMethod('pageview')
225
+ identify = this._createMethod('identify')
226
+ reset = this._createMethod('reset')
227
+ group = this._createMethod('group') as AnalyticsBrowserCore['group']
228
+ track = this._createMethod('track')
229
+ ready = this._createMethod('ready')
230
+ alias = this._createMethod('alias')
231
+ debug = this._createChainableMethod('debug')
232
+ page = this._createMethod('page')
233
+ once = this._createChainableMethod('once')
234
+ off = this._createChainableMethod('off')
235
+ on = this._createChainableMethod('on')
236
+ addSourceMiddleware = this._createMethod('addSourceMiddleware')
237
+ setAnonymousId = this._createMethod('setAnonymousId')
238
+ addDestinationMiddleware = this._createMethod('addDestinationMiddleware')
239
+
240
+ screen = this._createMethod('screen')
241
+ register = this._createMethod('register')
242
+ deregister = this._createMethod('deregister')
243
+ user = this._createMethod('user')
244
+ readonly VERSION = version
245
+
246
+ private _createMethod<T extends PreInitMethodName>(methodName: T) {
247
+ return (
248
+ ...args: Parameters<Analytics[T]>
249
+ ): Promise<ReturnTypeUnwrap<Analytics[T]>> => {
250
+ if (this.instance) {
251
+ const result = (this.instance[methodName] as Function)(...args)
252
+ return Promise.resolve(result)
253
+ }
254
+
255
+ return new Promise((resolve, reject) => {
256
+ this._preInitBuffer.push({
257
+ method: methodName,
258
+ args,
259
+ resolve: resolve,
260
+ reject: reject,
261
+ called: false,
262
+ } as PreInitMethodCall)
263
+ })
264
+ }
265
+ }
266
+
267
+ /**
268
+ * These are for methods that where determining when the method gets "flushed" is not important.
269
+ * These methods will resolve when analytics is fully initialized, and return type (other than Analytics)will not be available.
270
+ */
271
+ private _createChainableMethod<T extends PreInitMethodName>(methodName: T) {
272
+ return (...args: Parameters<Analytics[T]>): AnalyticsBuffered => {
273
+ if (this.instance) {
274
+ void (this.instance[methodName] as Function)(...args)
275
+ return this
276
+ } else {
277
+ this._preInitBuffer.push({
278
+ method: methodName,
279
+ args,
280
+ resolve: () => {},
281
+ reject: console.error,
282
+ called: false,
283
+ } as PreInitMethodCall)
284
+ }
285
+
286
+ return this
287
+ }
288
+ }
289
+ }
@@ -0,0 +1,43 @@
1
+ import type {
2
+ PreInitMethodCall,
3
+ PreInitMethodName,
4
+ PreInitMethodParams,
5
+ } from '.'
6
+
7
+ export function transformSnippetCall([
8
+ methodName,
9
+ ...args
10
+ ]: SnippetWindowBufferedMethodCall): PreInitMethodCall {
11
+ return {
12
+ method: methodName,
13
+ resolve: () => {},
14
+ reject: console.error,
15
+ args,
16
+ called: false,
17
+ }
18
+ }
19
+
20
+ const normalizeSnippetBuffer = (buffer: SnippetBuffer): PreInitMethodCall[] => {
21
+ return buffer.map(transformSnippetCall)
22
+ }
23
+
24
+ type SnippetWindowBufferedMethodCall<
25
+ MethodName extends PreInitMethodName = PreInitMethodName
26
+ > = [MethodName, ...PreInitMethodParams<MethodName>]
27
+
28
+ /**
29
+ * A list of the method calls before initialization for snippet users
30
+ * For example, [["track", "foo", {bar: 123}], ["page"], ["on", "ready", function(){..}]
31
+ */
32
+ type SnippetBuffer = SnippetWindowBufferedMethodCall[]
33
+
34
+ /**
35
+ * Fetch the buffered method calls from the window object and normalize them.
36
+ * This removes existing buffered calls from the window object.
37
+ */
38
+ export const popSnippetWindowBuffer = (): PreInitMethodCall[] => {
39
+ const wa = window.analytics
40
+ if (!Array.isArray(wa)) return []
41
+ const buffered = wa.splice(0, wa.length)
42
+ return normalizeSnippetBuffer(buffered)
43
+ }
@@ -0,0 +1 @@
1
+ export { invokeCallback, pTimeout } from '@customerio/cdp-analytics-core'
@@ -0,0 +1,13 @@
1
+ import { isBrowser } from '../environment'
2
+
3
+ export function isOnline(): boolean {
4
+ if (isBrowser()) {
5
+ return window.navigator.onLine
6
+ }
7
+
8
+ return true
9
+ }
10
+
11
+ export function isOffline(): boolean {
12
+ return !isOnline()
13
+ }
@@ -0,0 +1,21 @@
1
+ import {
2
+ CoreContext,
3
+ ContextCancelation,
4
+ ContextFailedDelivery,
5
+ SerializedContext,
6
+ CancelationOptions,
7
+ } from '@customerio/cdp-analytics-core'
8
+ import { CustomerioEvent } from '../events/interfaces'
9
+ import { Stats } from '../stats'
10
+
11
+ export class Context extends CoreContext<CustomerioEvent> {
12
+ static override system() {
13
+ return new this({ type: 'track', event: 'system' })
14
+ }
15
+ constructor(event: CustomerioEvent, id?: string) {
16
+ super(event, id, new Stats())
17
+ }
18
+ }
19
+
20
+ export { ContextCancelation }
21
+ export type { ContextFailedDelivery, SerializedContext, CancelationOptions }
@@ -0,0 +1,7 @@
1
+ export function isBrowser(): boolean {
2
+ return typeof window !== 'undefined'
3
+ }
4
+
5
+ export function isServer(): boolean {
6
+ return !isBrowser()
7
+ }