utneque 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/.editorconfig +10 -0
  2. package/.eslintrc.isomorphic.js +26 -0
  3. package/.eslintrc.js +86 -0
  4. package/.gitattributes +1 -0
  5. package/.github/workflows/ci.yml +33 -0
  6. package/.github/workflows/deploy-browser-cdn-candidate.yml +51 -0
  7. package/.github/workflows/deploy-releases.yml +178 -0
  8. package/.nvmrc +1 -0
  9. package/.prettierrc +7 -0
  10. package/.vscode/extensions.json +3 -0
  11. package/.vscode/launch.json +81 -0
  12. package/.vscode/settings.json +41 -0
  13. package/.yarn/plugins/@yarnpkg/plugin-constraints.cjs +52 -0
  14. package/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +546 -0
  15. package/.yarn/plugins/@yarnpkg/plugin-typescript.cjs +9 -0
  16. package/.yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs +28 -0
  17. package/.yarn/releases/yarn-3.4.1.cjs +873 -0
  18. package/.yarnrc.yml +15 -0
  19. package/jest.config.js +18 -0
  20. package/package.json +59 -0
  21. package/packages/browser/.eslintrc.js +9 -0
  22. package/packages/browser/.lintstagedrc.js +1 -0
  23. package/packages/browser/ARCHITECTURE.md +48 -0
  24. package/packages/browser/LICENSE.MD +45 -0
  25. package/packages/browser/Makefile +64 -0
  26. package/packages/browser/README.md +227 -0
  27. package/packages/browser/e2e-tests/local-server.ts +28 -0
  28. package/packages/browser/e2e-tests/performance/ajs-perf-browser.test.ts +75 -0
  29. package/packages/browser/jest.config.js +15 -0
  30. package/packages/browser/jest.setup.js +10 -0
  31. package/packages/browser/package.json +106 -0
  32. package/packages/browser/qa/README.md +41 -0
  33. package/packages/browser/qa/__fixtures__/snippets.ts +148 -0
  34. package/packages/browser/qa/__tests__/backwards-compatibility.test.ts +180 -0
  35. package/packages/browser/qa/__tests__/destinations.test.ts +101 -0
  36. package/packages/browser/qa/__tests__/smoke.test.ts +170 -0
  37. package/packages/browser/qa/lib/benchmark.ts +36 -0
  38. package/packages/browser/qa/lib/browser.ts +28 -0
  39. package/packages/browser/qa/lib/jest-reporter.js +57 -0
  40. package/packages/browser/qa/lib/runner.ts +142 -0
  41. package/packages/browser/qa/lib/schema.ts +59 -0
  42. package/packages/browser/qa/lib/server.ts +54 -0
  43. package/packages/browser/qa/lib/stats.ts +52 -0
  44. package/packages/browser/scripts/build-prep.sh +7 -0
  45. package/packages/browser/scripts/ci.sh +15 -0
  46. package/packages/browser/scripts/release.js +121 -0
  47. package/packages/browser/scripts/release.sh +9 -0
  48. package/packages/browser/scripts/run.sh +8 -0
  49. package/packages/browser/src/browser/__tests__/analytics-lazy-init.integration.test.ts +51 -0
  50. package/packages/browser/src/browser/__tests__/analytics-pre-init.integration.test.ts +440 -0
  51. package/packages/browser/src/browser/__tests__/anon-id-and-reset.integration.test.ts +73 -0
  52. package/packages/browser/src/browser/__tests__/cdn.test.ts +53 -0
  53. package/packages/browser/src/browser/__tests__/csp-detection.test.ts +140 -0
  54. package/packages/browser/src/browser/__tests__/inspector.integration.test.ts +121 -0
  55. package/packages/browser/src/browser/__tests__/integration.test.ts +1213 -0
  56. package/packages/browser/src/browser/__tests__/integrations.integration.test.ts +260 -0
  57. package/packages/browser/src/browser/__tests__/page-enrichment.integration.test.ts +216 -0
  58. package/packages/browser/src/browser/__tests__/query-string.integration.test.ts +116 -0
  59. package/packages/browser/src/browser/__tests__/standalone-analytics.test.ts +303 -0
  60. package/packages/browser/src/browser/__tests__/standalone-errors.test.ts +136 -0
  61. package/packages/browser/src/browser/__tests__/standalone.test.ts +97 -0
  62. package/packages/browser/src/browser/__tests__/typedef-tests/analytics-browser.ts +150 -0
  63. package/packages/browser/src/browser/__tests__/update-cdn-settings.test.ts +71 -0
  64. package/packages/browser/src/browser/browser-umd.ts +19 -0
  65. package/packages/browser/src/browser/index.ts +486 -0
  66. package/packages/browser/src/browser/standalone-analytics.ts +62 -0
  67. package/packages/browser/src/browser/standalone-interface.ts +11 -0
  68. package/packages/browser/src/browser/standalone.ts +92 -0
  69. package/packages/browser/src/core/__tests__/track-form.test.ts +193 -0
  70. package/packages/browser/src/core/__tests__/track-link.test.ts +252 -0
  71. package/packages/browser/src/core/analytics/__tests__/integration.test.ts +334 -0
  72. package/packages/browser/src/core/analytics/__tests__/test-plugins.ts +94 -0
  73. package/packages/browser/src/core/analytics/index.ts +672 -0
  74. package/packages/browser/src/core/analytics/interfaces.ts +100 -0
  75. package/packages/browser/src/core/arguments-resolver/__tests__/index.test.ts +524 -0
  76. package/packages/browser/src/core/arguments-resolver/index.ts +200 -0
  77. package/packages/browser/src/core/auto-track.ts +152 -0
  78. package/packages/browser/src/core/buffer/__tests__/index.test.ts +455 -0
  79. package/packages/browser/src/core/buffer/index.ts +371 -0
  80. package/packages/browser/src/core/callback/index.ts +1 -0
  81. package/packages/browser/src/core/connection/__tests__/index.test.ts +25 -0
  82. package/packages/browser/src/core/connection/index.ts +13 -0
  83. package/packages/browser/src/core/constants/index.ts +1 -0
  84. package/packages/browser/src/core/context/__tests__/index.test.ts +201 -0
  85. package/packages/browser/src/core/context/index.ts +21 -0
  86. package/packages/browser/src/core/environment/index.ts +7 -0
  87. package/packages/browser/src/core/events/__tests__/index.test.ts +450 -0
  88. package/packages/browser/src/core/events/index.ts +280 -0
  89. package/packages/browser/src/core/events/interfaces.ts +36 -0
  90. package/packages/browser/src/core/inspector/index.ts +14 -0
  91. package/packages/browser/src/core/page/__tests__/index.test.ts +130 -0
  92. package/packages/browser/src/core/page/add-page-context.ts +33 -0
  93. package/packages/browser/src/core/page/get-page-context.ts +140 -0
  94. package/packages/browser/src/core/page/index.ts +2 -0
  95. package/packages/browser/src/core/plugin/index.ts +12 -0
  96. package/packages/browser/src/core/query-string/__tests__/gracefulDecodeURIComponent.test.ts +17 -0
  97. package/packages/browser/src/core/query-string/__tests__/index.test.ts +149 -0
  98. package/packages/browser/src/core/query-string/__tests__/pickPrefix.test.ts +31 -0
  99. package/packages/browser/src/core/query-string/__tests__/useQueryString.test.ts +60 -0
  100. package/packages/browser/src/core/query-string/gracefulDecodeURIComponent.ts +16 -0
  101. package/packages/browser/src/core/query-string/index.ts +64 -0
  102. package/packages/browser/src/core/query-string/pickPrefix.ts +20 -0
  103. package/packages/browser/src/core/queue/__tests__/event-queue.test.ts +82 -0
  104. package/packages/browser/src/core/queue/event-queue.ts +22 -0
  105. package/packages/browser/src/core/session/__tests__/index.test.ts +41 -0
  106. package/packages/browser/src/core/session/index.ts +107 -0
  107. package/packages/browser/src/core/stats/__tests__/index.test.ts +15 -0
  108. package/packages/browser/src/core/stats/__tests__/remote-metrics.test.ts +189 -0
  109. package/packages/browser/src/core/stats/index.ts +15 -0
  110. package/packages/browser/src/core/stats/remote-metrics.ts +144 -0
  111. package/packages/browser/src/core/storage/__tests__/cookieStorage.test.ts +58 -0
  112. package/packages/browser/src/core/storage/__tests__/localStorage.test.ts +70 -0
  113. package/packages/browser/src/core/storage/__tests__/test-helpers.ts +26 -0
  114. package/packages/browser/src/core/storage/__tests__/universalStorage.test.ts +167 -0
  115. package/packages/browser/src/core/storage/cookieStorage.ts +80 -0
  116. package/packages/browser/src/core/storage/index.ts +64 -0
  117. package/packages/browser/src/core/storage/localStorage.ts +45 -0
  118. package/packages/browser/src/core/storage/memoryStorage.ts +22 -0
  119. package/packages/browser/src/core/storage/settings.ts +23 -0
  120. package/packages/browser/src/core/storage/types.ts +49 -0
  121. package/packages/browser/src/core/storage/universalStorage.ts +78 -0
  122. package/packages/browser/src/core/user/__tests__/index.test.ts +922 -0
  123. package/packages/browser/src/core/user/__tests__/migrate.test.ts +101 -0
  124. package/packages/browser/src/core/user/__tests__/session.test.ts +136 -0
  125. package/packages/browser/src/core/user/__tests__/tld.test.ts +36 -0
  126. package/packages/browser/src/core/user/index.ts +399 -0
  127. package/packages/browser/src/core/user/migrate.ts +126 -0
  128. package/packages/browser/src/core/user/tld.ts +65 -0
  129. package/packages/browser/src/core/user/vendor/crypto-es/LICENSE +53 -0
  130. package/packages/browser/src/core/user/vendor/crypto-es/lib/aes.ts +302 -0
  131. package/packages/browser/src/core/user/vendor/crypto-es/lib/cipher-core.ts +922 -0
  132. package/packages/browser/src/core/user/vendor/crypto-es/lib/core.ts +806 -0
  133. package/packages/browser/src/core/user/vendor/crypto-es/lib/enc-base64.ts +110 -0
  134. package/packages/browser/src/core/user/vendor/crypto-es/lib/evpkdf.ts +110 -0
  135. package/packages/browser/src/core/user/vendor/crypto-es/lib/md5.ts +238 -0
  136. package/packages/browser/src/core/user/vendor/readme.md +7 -0
  137. package/packages/browser/src/generated/__tests__/version.test.ts +18 -0
  138. package/packages/browser/src/generated/version.ts +2 -0
  139. package/packages/browser/src/index.ts +13 -0
  140. package/packages/browser/src/lib/__tests__/embedded-write-key.test.ts +15 -0
  141. package/packages/browser/src/lib/__tests__/fetch.test.ts +35 -0
  142. package/packages/browser/src/lib/__tests__/get-process-env.test.ts +5 -0
  143. package/packages/browser/src/lib/__tests__/group-by.test.ts +96 -0
  144. package/packages/browser/src/lib/__tests__/is-plan-event-enabled.test.ts +36 -0
  145. package/packages/browser/src/lib/__tests__/is-thenable.test.ts +39 -0
  146. package/packages/browser/src/lib/__tests__/merged-options.test.ts +123 -0
  147. package/packages/browser/src/lib/__tests__/on-page-change.test.ts +74 -0
  148. package/packages/browser/src/lib/__tests__/parse-cdn.test.ts +88 -0
  149. package/packages/browser/src/lib/__tests__/pick.test.ts +34 -0
  150. package/packages/browser/src/lib/__tests__/pick.typedef.ts +39 -0
  151. package/packages/browser/src/lib/bind-all.ts +19 -0
  152. package/packages/browser/src/lib/browser-polyfill.ts +23 -0
  153. package/packages/browser/src/lib/client-hints/__tests__/index.test.ts +66 -0
  154. package/packages/browser/src/lib/client-hints/index.ts +16 -0
  155. package/packages/browser/src/lib/client-hints/interfaces.ts +42 -0
  156. package/packages/browser/src/lib/create-deferred.ts +16 -0
  157. package/packages/browser/src/lib/csp-detection.ts +8 -0
  158. package/packages/browser/src/lib/embedded-write-key.ts +24 -0
  159. package/packages/browser/src/lib/fetch.ts +10 -0
  160. package/packages/browser/src/lib/get-global.ts +16 -0
  161. package/packages/browser/src/lib/get-process-env.ts +11 -0
  162. package/packages/browser/src/lib/global-analytics-helper.ts +31 -0
  163. package/packages/browser/src/lib/group-by.ts +30 -0
  164. package/packages/browser/src/lib/is-plan-event-enabled.ts +20 -0
  165. package/packages/browser/src/lib/is-thenable.ts +9 -0
  166. package/packages/browser/src/lib/load-script.ts +66 -0
  167. package/packages/browser/src/lib/merged-options.ts +46 -0
  168. package/packages/browser/src/lib/on-page-change.ts +29 -0
  169. package/packages/browser/src/lib/p-while.ts +12 -0
  170. package/packages/browser/src/lib/parse-cdn.ts +56 -0
  171. package/packages/browser/src/lib/pick.ts +28 -0
  172. package/packages/browser/src/lib/priority-queue/__tests__/backoff.test.ts +23 -0
  173. package/packages/browser/src/lib/priority-queue/__tests__/index.test.ts +158 -0
  174. package/packages/browser/src/lib/priority-queue/__tests__/persisted.test.ts +228 -0
  175. package/packages/browser/src/lib/priority-queue/backoff.ts +24 -0
  176. package/packages/browser/src/lib/priority-queue/index.ts +6 -0
  177. package/packages/browser/src/lib/priority-queue/persisted.ts +127 -0
  178. package/packages/browser/src/lib/sleep.ts +4 -0
  179. package/packages/browser/src/lib/to-facade.ts +53 -0
  180. package/packages/browser/src/lib/version-type.ts +10 -0
  181. package/packages/browser/src/node/__tests__/node-integration.test.ts +19 -0
  182. package/packages/browser/src/node/index.ts +36 -0
  183. package/packages/browser/src/node/node.browser.ts +7 -0
  184. package/packages/browser/src/plugins/ajs-destination/__tests__/index.test.ts +834 -0
  185. package/packages/browser/src/plugins/ajs-destination/index.ts +392 -0
  186. package/packages/browser/src/plugins/ajs-destination/loader.ts +129 -0
  187. package/packages/browser/src/plugins/ajs-destination/types.ts +44 -0
  188. package/packages/browser/src/plugins/ajs-destination/utils.ts +32 -0
  189. package/packages/browser/src/plugins/analytics-node/__tests__/index.test.ts +69 -0
  190. package/packages/browser/src/plugins/analytics-node/index.ts +67 -0
  191. package/packages/browser/src/plugins/env-enrichment/__tests__/index.test.ts +421 -0
  192. package/packages/browser/src/plugins/env-enrichment/index.ts +208 -0
  193. package/packages/browser/src/plugins/hightouchio/__tests__/batched-dispatcher.test.ts +299 -0
  194. package/packages/browser/src/plugins/hightouchio/__tests__/index.test.ts +317 -0
  195. package/packages/browser/src/plugins/hightouchio/__tests__/normalize.test.ts +181 -0
  196. package/packages/browser/src/plugins/hightouchio/__tests__/retries.test.ts +82 -0
  197. package/packages/browser/src/plugins/hightouchio/batched-dispatcher.ts +127 -0
  198. package/packages/browser/src/plugins/hightouchio/fetch-dispatcher.ts +27 -0
  199. package/packages/browser/src/plugins/hightouchio/index.ts +147 -0
  200. package/packages/browser/src/plugins/hightouchio/normalize.ts +71 -0
  201. package/packages/browser/src/plugins/hightouchio/schedule-flush.ts +58 -0
  202. package/packages/browser/src/plugins/legacy-video-plugins/__tests__/index.test.ts +48 -0
  203. package/packages/browser/src/plugins/legacy-video-plugins/index.ts +16 -0
  204. package/packages/browser/src/plugins/middleware/__tests__/index.test.ts +268 -0
  205. package/packages/browser/src/plugins/middleware/index.ts +131 -0
  206. package/packages/browser/src/plugins/remote-loader/__tests__/index.test.ts +943 -0
  207. package/packages/browser/src/plugins/remote-loader/index.ts +256 -0
  208. package/packages/browser/src/plugins/remote-middleware/__tests__/index.test.ts +116 -0
  209. package/packages/browser/src/plugins/remote-middleware/index.ts +44 -0
  210. package/packages/browser/src/plugins/routing-middleware/__tests__/index.test.ts +64 -0
  211. package/packages/browser/src/plugins/routing-middleware/index.ts +37 -0
  212. package/packages/browser/src/plugins/schema-filter/__tests__/index.test.ts +520 -0
  213. package/packages/browser/src/plugins/schema-filter/index.ts +90 -0
  214. package/packages/browser/src/plugins/validation/__tests__/index.test.ts +78 -0
  215. package/packages/browser/src/plugins/validation/index.ts +44 -0
  216. package/packages/browser/src/test-helpers/browser-storage.ts +75 -0
  217. package/packages/browser/src/test-helpers/factories.ts +18 -0
  218. package/packages/browser/src/test-helpers/fetch-parse.ts +8 -0
  219. package/packages/browser/src/test-helpers/fixtures/cdn-settings.ts +301 -0
  220. package/packages/browser/src/test-helpers/fixtures/classic-destination.ts +25 -0
  221. package/packages/browser/src/test-helpers/fixtures/client-hints.ts +28 -0
  222. package/packages/browser/src/test-helpers/fixtures/create-fetch-method.ts +30 -0
  223. package/packages/browser/src/test-helpers/fixtures/index.ts +4 -0
  224. package/packages/browser/src/test-helpers/fixtures/page-context.ts +11 -0
  225. package/packages/browser/src/test-helpers/test-writekeys.ts +5 -0
  226. package/packages/browser/src/test-helpers/type-assertions.ts +11 -0
  227. package/packages/browser/src/tester/__fixtures__/hightouch-snippet.ts +64 -0
  228. package/packages/browser/src/tester/__fixtures__/index.html +8 -0
  229. package/packages/browser/src/tester/ajs-perf.ts +30 -0
  230. package/packages/browser/src/tester/ajs-tester.ts +119 -0
  231. package/packages/browser/src/tester/server.js +16 -0
  232. package/packages/browser/tsconfig.build.json +9 -0
  233. package/packages/browser/tsconfig.json +13 -0
  234. package/packages/browser/webpack.config.js +106 -0
  235. package/packages/config/package.json +10 -0
  236. package/packages/config/src/index.js +4 -0
  237. package/packages/config/src/jest/config.js +50 -0
  238. package/packages/config/src/jest/get-module-map.js +34 -0
  239. package/packages/config/src/lint-staged/config.js +4 -0
  240. package/packages/config-webpack/package.json +20 -0
  241. package/packages/config-webpack/webpack.config.common.js +75 -0
  242. package/packages/consent/consent-tools/.eslintrc.js +7 -0
  243. package/packages/consent/consent-tools/.lintstagedrc.js +1 -0
  244. package/packages/consent/consent-tools/LICENSE +45 -0
  245. package/packages/consent/consent-tools/README.md +104 -0
  246. package/packages/consent/consent-tools/jest.config.js +6 -0
  247. package/packages/consent/consent-tools/jest.setup.js +4 -0
  248. package/packages/consent/consent-tools/package.json +48 -0
  249. package/packages/consent/consent-tools/src/domain/__tests__/assertions/integrations-assertions.ts +37 -0
  250. package/packages/consent/consent-tools/src/domain/__tests__/consent-stamping.test.ts +45 -0
  251. package/packages/consent/consent-tools/src/domain/__tests__/create-wrapper.test.ts +816 -0
  252. package/packages/consent/consent-tools/src/domain/__tests__/typedef-tests.ts +21 -0
  253. package/packages/consent/consent-tools/src/domain/consent-changed.ts +51 -0
  254. package/packages/consent/consent-tools/src/domain/consent-stamping.ts +19 -0
  255. package/packages/consent/consent-tools/src/domain/create-wrapper.ts +238 -0
  256. package/packages/consent/consent-tools/src/domain/get-initialized-analytics.ts +25 -0
  257. package/packages/consent/consent-tools/src/domain/load-cancellation.ts +31 -0
  258. package/packages/consent/consent-tools/src/domain/validation/__tests__/options-validators.test.ts +77 -0
  259. package/packages/consent/consent-tools/src/domain/validation/__tests__/validation-error.test.ts +15 -0
  260. package/packages/consent/consent-tools/src/domain/validation/common-validators.ts +19 -0
  261. package/packages/consent/consent-tools/src/domain/validation/index.ts +1 -0
  262. package/packages/consent/consent-tools/src/domain/validation/options-validators.ts +74 -0
  263. package/packages/consent/consent-tools/src/domain/validation/validation-error.ts +11 -0
  264. package/packages/consent/consent-tools/src/index.ts +16 -0
  265. package/packages/consent/consent-tools/src/types/errors.ts +14 -0
  266. package/packages/consent/consent-tools/src/types/index.ts +3 -0
  267. package/packages/consent/consent-tools/src/types/settings.ts +121 -0
  268. package/packages/consent/consent-tools/src/types/wrapper.ts +107 -0
  269. package/packages/consent/consent-tools/src/utils/index.ts +4 -0
  270. package/packages/consent/consent-tools/src/utils/pick.ts +18 -0
  271. package/packages/consent/consent-tools/src/utils/pipe.ts +14 -0
  272. package/packages/consent/consent-tools/src/utils/resolve-when.ts +32 -0
  273. package/packages/consent/consent-tools/src/utils/uniq.ts +4 -0
  274. package/packages/consent/consent-tools/tsconfig.build.json +9 -0
  275. package/packages/consent/consent-tools/tsconfig.json +12 -0
  276. package/packages/consent/consent-wrapper-onetrust/.eslintrc.js +7 -0
  277. package/packages/consent/consent-wrapper-onetrust/.lintstagedrc.js +1 -0
  278. package/packages/consent/consent-wrapper-onetrust/LICENSE +45 -0
  279. package/packages/consent/consent-wrapper-onetrust/README.md +125 -0
  280. package/packages/consent/consent-wrapper-onetrust/img/onetrust-cat-id.jpg +0 -0
  281. package/packages/consent/consent-wrapper-onetrust/img/onetrust-popup.jpg +0 -0
  282. package/packages/consent/consent-wrapper-onetrust/jest.config.js +6 -0
  283. package/packages/consent/consent-wrapper-onetrust/jest.setup.js +4 -0
  284. package/packages/consent/consent-wrapper-onetrust/package.json +60 -0
  285. package/packages/consent/consent-wrapper-onetrust/src/domain/__tests__/wrapper.test.ts +151 -0
  286. package/packages/consent/consent-wrapper-onetrust/src/domain/wrapper.ts +61 -0
  287. package/packages/consent/consent-wrapper-onetrust/src/index.ts +6 -0
  288. package/packages/consent/consent-wrapper-onetrust/src/index.umd.ts +11 -0
  289. package/packages/consent/consent-wrapper-onetrust/src/lib/__tests__/onetrust-api.test.ts +181 -0
  290. package/packages/consent/consent-wrapper-onetrust/src/lib/onetrust-api.ts +155 -0
  291. package/packages/consent/consent-wrapper-onetrust/src/lib/validation/index.ts +1 -0
  292. package/packages/consent/consent-wrapper-onetrust/src/lib/validation/onetrust-api-error.ts +11 -0
  293. package/packages/consent/consent-wrapper-onetrust/src/test-helpers/mocks.ts +23 -0
  294. package/packages/consent/consent-wrapper-onetrust/src/test-helpers/onetrust-globals.d.ts +11 -0
  295. package/packages/consent/consent-wrapper-onetrust/src/test-helpers/utils.ts +3 -0
  296. package/packages/consent/consent-wrapper-onetrust/tsconfig.build.json +9 -0
  297. package/packages/consent/consent-wrapper-onetrust/tsconfig.json +11 -0
  298. package/packages/consent/consent-wrapper-onetrust/webpack.config.js +25 -0
  299. package/packages/core/.eslintrc.js +4 -0
  300. package/packages/core/.lintstagedrc.js +1 -0
  301. package/packages/core/LICENSE.MD +45 -0
  302. package/packages/core/README.md +3 -0
  303. package/packages/core/jest.config.js +5 -0
  304. package/packages/core/jest.setup.js +10 -0
  305. package/packages/core/package.json +40 -0
  306. package/packages/core/src/analytics/__tests__/dispatch.test.ts +95 -0
  307. package/packages/core/src/analytics/dispatch.ts +58 -0
  308. package/packages/core/src/analytics/index.ts +11 -0
  309. package/packages/core/src/callback/__tests__/index.test.ts +85 -0
  310. package/packages/core/src/callback/index.ts +51 -0
  311. package/packages/core/src/context/index.ts +123 -0
  312. package/packages/core/src/emitter/__tests__/emitter.test.ts +74 -0
  313. package/packages/core/src/emitter/index.ts +65 -0
  314. package/packages/core/src/emitter/interface.ts +31 -0
  315. package/packages/core/src/events/__tests__/index.test.ts +394 -0
  316. package/packages/core/src/events/index.ts +280 -0
  317. package/packages/core/src/events/interfaces.ts +475 -0
  318. package/packages/core/src/index.ts +19 -0
  319. package/packages/core/src/logger/__tests__/index.test.ts +66 -0
  320. package/packages/core/src/logger/index.ts +74 -0
  321. package/packages/core/src/plugins/index.ts +43 -0
  322. package/packages/core/src/priority-queue/__tests__/backoff.test.ts +23 -0
  323. package/packages/core/src/priority-queue/__tests__/index.test.ts +158 -0
  324. package/packages/core/src/priority-queue/backoff.ts +24 -0
  325. package/packages/core/src/priority-queue/index.ts +103 -0
  326. package/packages/core/src/queue/__tests__/event-queue.test.ts +678 -0
  327. package/packages/core/src/queue/__tests__/extension-flushing.test.ts +416 -0
  328. package/packages/core/src/queue/delivery.ts +73 -0
  329. package/packages/core/src/queue/event-queue.ts +318 -0
  330. package/packages/core/src/stats/__tests__/index.test.ts +103 -0
  331. package/packages/core/src/stats/index.ts +88 -0
  332. package/packages/core/src/task/__tests__/task-group.test.ts +26 -0
  333. package/packages/core/src/task/task-group.ts +31 -0
  334. package/packages/core/src/user/index.ts +7 -0
  335. package/packages/core/src/utils/__tests__/group-by.test.ts +96 -0
  336. package/packages/core/src/utils/__tests__/is-plain-object.test.ts +27 -0
  337. package/packages/core/src/utils/__tests__/is-thenable.test.ts +39 -0
  338. package/packages/core/src/utils/bind-all.ts +19 -0
  339. package/packages/core/src/utils/get-global.ts +17 -0
  340. package/packages/core/src/utils/group-by.ts +30 -0
  341. package/packages/core/src/utils/has-properties.ts +7 -0
  342. package/packages/core/src/utils/is-plain-object.ts +26 -0
  343. package/packages/core/src/utils/is-thenable.ts +9 -0
  344. package/packages/core/src/utils/p-while.ts +12 -0
  345. package/packages/core/src/utils/pick.ts +8 -0
  346. package/packages/core/src/utils/ts-helpers.ts +13 -0
  347. package/packages/core/src/validation/__tests__/assertions.test.ts +155 -0
  348. package/packages/core/src/validation/assertions.ts +72 -0
  349. package/packages/core/src/validation/errors.ts +8 -0
  350. package/packages/core/src/validation/helpers.ts +23 -0
  351. package/packages/core/test-helpers/index.ts +2 -0
  352. package/packages/core/test-helpers/test-ctx.ts +7 -0
  353. package/packages/core/test-helpers/test-event-queue.ts +7 -0
  354. package/packages/core/tsconfig.build.json +9 -0
  355. package/packages/core/tsconfig.json +11 -0
  356. package/packages/node/.eslintrc.js +7 -0
  357. package/packages/node/.lintstagedrc.js +1 -0
  358. package/packages/node/LICENSE +45 -0
  359. package/packages/node/README.md +138 -0
  360. package/packages/node/jest.config.js +5 -0
  361. package/packages/node/jest.setup.js +4 -0
  362. package/packages/node/package.json +50 -0
  363. package/packages/node/scripts/version.sh +11 -0
  364. package/packages/node/src/__tests__/callback.test.ts +47 -0
  365. package/packages/node/src/__tests__/disable.integration.test.ts +42 -0
  366. package/packages/node/src/__tests__/emitter.integration.test.ts +45 -0
  367. package/packages/node/src/__tests__/graceful-shutdown-integration.test.ts +244 -0
  368. package/packages/node/src/__tests__/http-client.integration.test.ts +69 -0
  369. package/packages/node/src/__tests__/http-integration.test.ts +362 -0
  370. package/packages/node/src/__tests__/integration.test.ts +357 -0
  371. package/packages/node/src/__tests__/plugins.test.ts +16 -0
  372. package/packages/node/src/__tests__/settings.test.ts +9 -0
  373. package/packages/node/src/__tests__/test-helpers/assert-shape/http-request-event.ts +13 -0
  374. package/packages/node/src/__tests__/test-helpers/assert-shape/index.ts +2 -0
  375. package/packages/node/src/__tests__/test-helpers/assert-shape/segment-http-api.ts +43 -0
  376. package/packages/node/src/__tests__/test-helpers/create-test-analytics.ts +42 -0
  377. package/packages/node/src/__tests__/test-helpers/factories.ts +17 -0
  378. package/packages/node/src/__tests__/test-helpers/is-valid-date.ts +6 -0
  379. package/packages/node/src/__tests__/test-helpers/resolve-ctx.ts +19 -0
  380. package/packages/node/src/__tests__/test-helpers/resolve-emitter.ts +11 -0
  381. package/packages/node/src/__tests__/test-helpers/sleep.ts +3 -0
  382. package/packages/node/src/__tests__/test-helpers/test-plugin.ts +16 -0
  383. package/packages/node/src/__tests__/typedef-tests.ts +120 -0
  384. package/packages/node/src/app/analytics-node.ts +299 -0
  385. package/packages/node/src/app/context.ts +11 -0
  386. package/packages/node/src/app/dispatch-emit.ts +42 -0
  387. package/packages/node/src/app/emitter.ts +23 -0
  388. package/packages/node/src/app/event-factory.ts +20 -0
  389. package/packages/node/src/app/event-queue.ts +23 -0
  390. package/packages/node/src/app/settings.ts +49 -0
  391. package/packages/node/src/app/types/index.ts +3 -0
  392. package/packages/node/src/app/types/params.ts +76 -0
  393. package/packages/node/src/app/types/plugin.ts +5 -0
  394. package/packages/node/src/app/types/segment-event.ts +7 -0
  395. package/packages/node/src/generated/version.ts +2 -0
  396. package/packages/node/src/index.ts +26 -0
  397. package/packages/node/src/lib/__tests__/abort.test.ts +54 -0
  398. package/packages/node/src/lib/__tests__/create-url.test.ts +35 -0
  399. package/packages/node/src/lib/__tests__/env.test.ts +52 -0
  400. package/packages/node/src/lib/__tests__/get-message-id.test.ts +21 -0
  401. package/packages/node/src/lib/abort.ts +77 -0
  402. package/packages/node/src/lib/base-64-encode.ts +8 -0
  403. package/packages/node/src/lib/create-url.ts +11 -0
  404. package/packages/node/src/lib/env.ts +45 -0
  405. package/packages/node/src/lib/extract-promise-parts.ts +21 -0
  406. package/packages/node/src/lib/fetch.ts +16 -0
  407. package/packages/node/src/lib/get-message-id.ts +10 -0
  408. package/packages/node/src/lib/http-client.ts +95 -0
  409. package/packages/node/src/lib/uuid.ts +1 -0
  410. package/packages/node/src/plugins/segmentio/__tests__/methods.test.ts +223 -0
  411. package/packages/node/src/plugins/segmentio/__tests__/publisher.test.ts +411 -0
  412. package/packages/node/src/plugins/segmentio/context-batch.ts +71 -0
  413. package/packages/node/src/plugins/segmentio/index.ts +66 -0
  414. package/packages/node/src/plugins/segmentio/publisher.ts +265 -0
  415. package/packages/node/tsconfig.build.json +9 -0
  416. package/packages/node/tsconfig.json +10 -0
  417. package/packages/test-helpers/.eslintrc.js +7 -0
  418. package/packages/test-helpers/.lintstagedrc.js +1 -0
  419. package/packages/test-helpers/jest.config.js +3 -0
  420. package/packages/test-helpers/package.json +26 -0
  421. package/packages/test-helpers/src/analytics/cdn-settings-builder.ts +79 -0
  422. package/packages/test-helpers/src/analytics/index.ts +1 -0
  423. package/packages/test-helpers/src/index.ts +2 -0
  424. package/packages/test-helpers/src/utils/index.ts +1 -0
  425. package/packages/test-helpers/src/utils/sleep.ts +4 -0
  426. package/packages/test-helpers/tsconfig.build.json +9 -0
  427. package/packages/test-helpers/tsconfig.json +11 -0
  428. package/tsconfig.json +21 -0
  429. package/turbo.json +39 -0
  430. package/typings/get-monorepo-packages.d.ts +9 -0
  431. package/typings/spawn.d.ts +10 -0
@@ -0,0 +1,371 @@
1
+ import { Analytics } from '../analytics'
2
+ import { Context } from '../context'
3
+ import { isThenable } from '../../lib/is-thenable'
4
+ import { HtEventsBrowserCore } from '../analytics/interfaces'
5
+ import { version } from '../../generated/version'
6
+ import { getGlobalAnalytics } from '../../lib/global-analytics-helper'
7
+ import {
8
+ isBufferedPageContext,
9
+ BufferedPageContext,
10
+ getDefaultBufferedPageContext,
11
+ createPageContext,
12
+ PageContext,
13
+ } from '../page'
14
+
15
+ /**
16
+ * The names of any HtEventsBrowser methods that also exist on Analytics
17
+ */
18
+ export type PreInitMethodName =
19
+ | 'screen'
20
+ | 'register'
21
+ | 'deregister'
22
+ | 'user'
23
+ | 'trackSubmit'
24
+ | 'trackClick'
25
+ | 'trackLink'
26
+ | 'trackForm'
27
+ | 'pageview'
28
+ | 'identify'
29
+ | 'reset'
30
+ | 'group'
31
+ | 'track'
32
+ | 'ready'
33
+ | 'alias'
34
+ | 'debug'
35
+ | 'page'
36
+ | 'once'
37
+ | 'off'
38
+ | 'on'
39
+ | 'addSourceMiddleware'
40
+ | 'setAnonymousId'
41
+ | 'addDestinationMiddleware'
42
+
43
+ // Union of all analytics methods that _do not_ return a Promise
44
+ type SyncPreInitMethodName = {
45
+ [MethodName in PreInitMethodName]: ReturnType<
46
+ Analytics[MethodName]
47
+ > extends Promise<any>
48
+ ? never
49
+ : MethodName
50
+ }[PreInitMethodName]
51
+
52
+ const flushSyncAnalyticsCalls = (
53
+ name: SyncPreInitMethodName,
54
+ analytics: Analytics,
55
+ buffer: PreInitMethodCallBuffer
56
+ ): void => {
57
+ buffer.getCalls(name).forEach((c) => {
58
+ // While the underlying methods are synchronous, the callAnalyticsMethod returns a promise,
59
+ // which normalizes success and error states between async and non-async methods, with no perf penalty.
60
+ callAnalyticsMethod(analytics, c).catch(console.error)
61
+ })
62
+ }
63
+
64
+ export const flushAddSourceMiddleware = async (
65
+ analytics: Analytics,
66
+ buffer: PreInitMethodCallBuffer
67
+ ) => {
68
+ for (const c of buffer.getCalls('addSourceMiddleware')) {
69
+ await callAnalyticsMethod(analytics, c).catch(console.error)
70
+ }
71
+ }
72
+
73
+ export const flushOn = flushSyncAnalyticsCalls.bind(this, 'on')
74
+
75
+ export const flushSetAnonymousID = flushSyncAnalyticsCalls.bind(
76
+ this,
77
+ 'setAnonymousId'
78
+ )
79
+
80
+ export const flushAnalyticsCallsInNewTask = (
81
+ analytics: Analytics,
82
+ buffer: PreInitMethodCallBuffer
83
+ ): void => {
84
+ buffer.toArray().forEach((m) => {
85
+ setTimeout(() => {
86
+ callAnalyticsMethod(analytics, m).catch(console.error)
87
+ }, 0)
88
+ })
89
+ }
90
+
91
+ export const popPageContext = (args: unknown[]): PageContext | undefined => {
92
+ if (hasBufferedPageContextAsLastArg(args)) {
93
+ const ctx = args.pop() as BufferedPageContext
94
+ return createPageContext(ctx)
95
+ }
96
+ }
97
+
98
+ export const hasBufferedPageContextAsLastArg = (
99
+ args: unknown[]
100
+ ): args is [...unknown[], BufferedPageContext] | [BufferedPageContext] => {
101
+ const lastArg = args[args.length - 1]
102
+ return isBufferedPageContext(lastArg)
103
+ }
104
+
105
+ /**
106
+ * Represents a buffered method call that occurred before initialization.
107
+ */
108
+ export class PreInitMethodCall<
109
+ MethodName extends PreInitMethodName = PreInitMethodName
110
+ > {
111
+ method: MethodName
112
+ args: PreInitMethodParams<MethodName>
113
+ called: boolean
114
+ resolve: (v: ReturnType<Analytics[MethodName]>) => void
115
+ reject: (reason: any) => void
116
+ constructor(
117
+ method: PreInitMethodCall<MethodName>['method'],
118
+ args: PreInitMethodParams<MethodName>,
119
+ resolve: PreInitMethodCall<MethodName>['resolve'] = () => {},
120
+ reject: PreInitMethodCall<MethodName>['reject'] = console.error
121
+ ) {
122
+ this.method = method
123
+ this.resolve = resolve
124
+ this.reject = reject
125
+ this.called = false
126
+ this.args = args
127
+ }
128
+ }
129
+
130
+ export type PreInitMethodParams<MethodName extends PreInitMethodName> =
131
+ | [...Parameters<Analytics[MethodName]>, BufferedPageContext]
132
+ | Parameters<Analytics[MethodName]>
133
+
134
+ /**
135
+ * Infer return type; if return type is promise, unwrap it.
136
+ */
137
+ type ReturnTypeUnwrap<Fn> = Fn extends (...args: any[]) => infer ReturnT
138
+ ? ReturnT extends PromiseLike<infer Unwrapped>
139
+ ? Unwrapped
140
+ : ReturnT
141
+ : never
142
+
143
+ type MethodCallMap = Partial<Record<PreInitMethodName, PreInitMethodCall[]>>
144
+
145
+ type SnippetWindowBufferedMethodCall<
146
+ MethodName extends PreInitMethodName = PreInitMethodName
147
+ > = [MethodName, ...PreInitMethodParams<MethodName>]
148
+
149
+ /**
150
+ * A list of the method calls before initialization for snippet users
151
+ * For example, [["track", "foo", {bar: 123}], ["page"], ["on", "ready", function(){..}]
152
+ */
153
+ type SnippetBuffer = SnippetWindowBufferedMethodCall[]
154
+
155
+ /**
156
+ * Represents any and all the buffered method calls that occurred before initialization.
157
+ */
158
+ export class PreInitMethodCallBuffer {
159
+ private _callMap: MethodCallMap = {}
160
+
161
+ constructor(...calls: PreInitMethodCall[]) {
162
+ this.push(...calls)
163
+ }
164
+
165
+ /**
166
+ * Pull any buffered method calls from the window object, and use them to hydrate the instance buffer.
167
+ */
168
+ private get calls() {
169
+ this._pushSnippetWindowBuffer()
170
+ return this._callMap
171
+ }
172
+
173
+ private set calls(calls: MethodCallMap) {
174
+ this._callMap = calls
175
+ }
176
+
177
+ getCalls<T extends PreInitMethodName>(methodName: T): PreInitMethodCall<T>[] {
178
+ return (this.calls[methodName] ?? []) as PreInitMethodCall<T>[]
179
+ }
180
+
181
+ push(...calls: PreInitMethodCall[]): void {
182
+ calls.forEach((call) => {
183
+ const eventsExpectingPageContext: PreInitMethodName[] = [
184
+ 'track',
185
+ 'screen',
186
+ 'alias',
187
+ 'group',
188
+ 'page',
189
+ 'identify',
190
+ ]
191
+ if (
192
+ eventsExpectingPageContext.includes(call.method) &&
193
+ !hasBufferedPageContextAsLastArg(call.args)
194
+ ) {
195
+ call.args = [...call.args, getDefaultBufferedPageContext()]
196
+ }
197
+
198
+ if (this.calls[call.method]) {
199
+ this.calls[call.method]!.push(call)
200
+ } else {
201
+ this.calls[call.method] = [call]
202
+ }
203
+ })
204
+ }
205
+
206
+ clear(): void {
207
+ // clear calls in the global snippet buffered array.
208
+ this._pushSnippetWindowBuffer()
209
+ // clear calls in this instance
210
+ this.calls = {}
211
+ }
212
+
213
+ toArray(): PreInitMethodCall[] {
214
+ return ([] as PreInitMethodCall[]).concat(...Object.values(this.calls))
215
+ }
216
+
217
+ /**
218
+ * Fetch the buffered method calls from the window object,
219
+ * normalize them, and use them to hydrate the buffer.
220
+ * This removes existing buffered calls from the window object.
221
+ */
222
+ private _pushSnippetWindowBuffer(): void {
223
+ const wa = getGlobalAnalytics()
224
+ if (!Array.isArray(wa)) return undefined
225
+ const buffered: SnippetBuffer = wa.splice(0, wa.length)
226
+ const calls = buffered.map(
227
+ ([methodName, ...args]) => new PreInitMethodCall(methodName, args)
228
+ )
229
+ this.push(...calls)
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Call method and mark as "called"
235
+ * This function should never throw an error
236
+ */
237
+ export async function callAnalyticsMethod<T extends PreInitMethodName>(
238
+ analytics: Analytics,
239
+ call: PreInitMethodCall<T>
240
+ ): Promise<void> {
241
+ try {
242
+ if (call.called) {
243
+ return undefined
244
+ }
245
+ call.called = true
246
+
247
+ const result: ReturnType<Analytics[T]> = (
248
+ analytics[call.method] as Function
249
+ )(...call.args)
250
+
251
+ if (isThenable(result)) {
252
+ // do not defer for non-async methods
253
+ await result
254
+ }
255
+
256
+ call.resolve(result)
257
+ } catch (err) {
258
+ call.reject(err)
259
+ }
260
+ }
261
+
262
+ export type AnalyticsLoader = (
263
+ preInitBuffer: PreInitMethodCallBuffer
264
+ ) => Promise<[Analytics, Context]>
265
+
266
+ export class AnalyticsBuffered
267
+ implements PromiseLike<[Analytics, Context]>, HtEventsBrowserCore
268
+ {
269
+ instance?: Analytics
270
+ ctx?: Context
271
+ private _preInitBuffer: PreInitMethodCallBuffer
272
+ private _promise: Promise<[Analytics, Context]>
273
+ constructor(loader: AnalyticsLoader) {
274
+ this._preInitBuffer = new PreInitMethodCallBuffer()
275
+ this._promise = loader(this._preInitBuffer)
276
+ this._promise
277
+ .then(([ajs, ctx]) => {
278
+ this.instance = ajs
279
+ this.ctx = ctx
280
+ })
281
+ .catch(() => {
282
+ // intentionally do nothing...
283
+ // this result of this promise will be caught by the 'catch' block on this class.
284
+ })
285
+ }
286
+
287
+ then<T1, T2 = never>(
288
+ ...args: [
289
+ onfulfilled:
290
+ | ((instance: [Analytics, Context]) => T1 | PromiseLike<T1>)
291
+ | null
292
+ | undefined,
293
+ onrejected?: (reason: unknown) => T2 | PromiseLike<T2>
294
+ ]
295
+ ) {
296
+ return this._promise.then(...args)
297
+ }
298
+
299
+ catch<TResult = never>(
300
+ ...args: [
301
+ onrejected?:
302
+ | ((reason: any) => TResult | PromiseLike<TResult>)
303
+ | undefined
304
+ | null
305
+ ]
306
+ ) {
307
+ return this._promise.catch(...args)
308
+ }
309
+
310
+ finally(...args: [onfinally?: (() => void) | undefined | null]) {
311
+ return this._promise.finally(...args)
312
+ }
313
+
314
+ trackSubmit = this._createMethod('trackSubmit')
315
+ trackClick = this._createMethod('trackClick')
316
+ trackLink = this._createMethod('trackLink')
317
+ pageView = this._createMethod('pageview')
318
+ identify = this._createMethod('identify')
319
+ reset = this._createMethod('reset')
320
+ group = this._createMethod('group') as HtEventsBrowserCore['group']
321
+ track = this._createMethod('track')
322
+ ready = this._createMethod('ready')
323
+ alias = this._createMethod('alias')
324
+ debug = this._createChainableMethod('debug')
325
+ page = this._createMethod('page')
326
+ once = this._createChainableMethod('once')
327
+ off = this._createChainableMethod('off')
328
+ on = this._createChainableMethod('on')
329
+ addSourceMiddleware = this._createMethod('addSourceMiddleware')
330
+ setAnonymousId = this._createMethod('setAnonymousId')
331
+ addDestinationMiddleware = this._createMethod('addDestinationMiddleware')
332
+
333
+ screen = this._createMethod('screen')
334
+ register = this._createMethod('register')
335
+ deregister = this._createMethod('deregister')
336
+ user = this._createMethod('user')
337
+ readonly VERSION = version
338
+
339
+ private _createMethod<T extends PreInitMethodName>(methodName: T) {
340
+ return (
341
+ ...args: Parameters<Analytics[T]>
342
+ ): Promise<ReturnTypeUnwrap<Analytics[T]>> => {
343
+ if (this.instance) {
344
+ const result = (this.instance[methodName] as Function)(...args)
345
+ return Promise.resolve(result)
346
+ }
347
+ return new Promise((resolve, reject) => {
348
+ this._preInitBuffer.push(
349
+ new PreInitMethodCall(methodName, args, resolve as any, reject)
350
+ )
351
+ })
352
+ }
353
+ }
354
+
355
+ /**
356
+ * These are for methods that where determining when the method gets "flushed" is not important.
357
+ * These methods will resolve when analytics is fully initialized, and return type (other than Analytics)will not be available.
358
+ */
359
+ private _createChainableMethod<T extends PreInitMethodName>(methodName: T) {
360
+ return (...args: Parameters<Analytics[T]>): AnalyticsBuffered => {
361
+ if (this.instance) {
362
+ void (this.instance[methodName] as Function)(...args)
363
+ return this
364
+ } else {
365
+ this._preInitBuffer.push(new PreInitMethodCall(methodName, args))
366
+ }
367
+
368
+ return this
369
+ }
370
+ }
371
+ }
@@ -0,0 +1 @@
1
+ export { invokeCallback, pTimeout } from '@ht-sdks/events-sdk-js-core'
@@ -0,0 +1,25 @@
1
+ import { isOffline, isOnline } from '..'
2
+
3
+ describe('connection', () => {
4
+ let online = true
5
+
6
+ Object.defineProperty(window.navigator, 'onLine', {
7
+ get() {
8
+ return online
9
+ },
10
+ })
11
+
12
+ test('checks that the browser is online', () => {
13
+ online = true
14
+
15
+ expect(isOnline()).toBe(true)
16
+ expect(isOffline()).toBe(false)
17
+ })
18
+
19
+ test('checks that the browser is offline', () => {
20
+ online = false
21
+
22
+ expect(isOnline()).toBe(false)
23
+ expect(isOffline()).toBe(true)
24
+ })
25
+ })
@@ -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 @@
1
+ export const HIGHTOUCH_API_HOST = 'us-east-1.hightouch-events.com'
@@ -0,0 +1,201 @@
1
+ /* eslint-disable @typescript-eslint/unbound-method */
2
+ import { Context } from '..'
3
+ import { HightouchEvent } from '../../events'
4
+
5
+ describe(Context, () => {
6
+ // hide console spam when running tests
7
+ jest.spyOn(console, 'log').mockImplementation(() => {})
8
+ jest.spyOn(console, 'table').mockImplementation(() => {})
9
+
10
+ describe('.system', () => {
11
+ it('creates a system event', () => {
12
+ const ctx = Context.system()
13
+ expect(ctx.event.event).toEqual('system')
14
+ })
15
+ })
16
+
17
+ it('can log events', () => {
18
+ const ctx = new Context({ type: 'track' })
19
+ ctx.log('info', 'Log message', { test: 'test' })
20
+ ctx.log('error', 'Error message', { test: 'test' })
21
+
22
+ const logLines = ctx.logs()
23
+ expect(logLines.length).toBe(2)
24
+ expect(logLines[0].level).toEqual('info')
25
+ expect(logLines[0].message).toEqual('Log message')
26
+
27
+ jest.spyOn(ctx.logger, 'flush')
28
+ ctx.flush()
29
+
30
+ expect(ctx.logger.flush).toHaveBeenCalled()
31
+ })
32
+
33
+ it('can record stats', () => {
34
+ const ctx = new Context({ type: 'track' })
35
+ ctx.stats.increment('i1', 10, ['test:test'])
36
+ ctx.stats.gauge('g1', 100, ['test:test'])
37
+
38
+ const metrics = ctx.stats.metrics
39
+ expect(metrics.length).toBe(2)
40
+
41
+ expect(metrics[0].metric).toEqual('i1')
42
+ expect(metrics[0].value).toEqual(10)
43
+
44
+ jest.spyOn(ctx.stats, 'flush')
45
+ ctx.flush()
46
+
47
+ expect(ctx.stats.flush).toHaveBeenCalled()
48
+ })
49
+
50
+ describe('ids', () => {
51
+ it('contains an uniq id', () => {
52
+ const page = new Context({ type: 'page' })
53
+ const track = new Context({ type: 'track' })
54
+
55
+ expect(page.id).not.toBeFalsy()
56
+ expect(track.id).not.toBeFalsy()
57
+ expect(page.id).not.toEqual(track.id)
58
+ })
59
+
60
+ it('allows for comparing identity', () => {
61
+ const page = new Context({ type: 'page' })
62
+ const track = new Context({ type: 'track' })
63
+
64
+ expect(page.id).not.toEqual(track.id)
65
+ expect(page.isSame(track)).toBe(false)
66
+
67
+ expect(page.isSame(page)).toBe(true)
68
+ expect(track.isSame(track)).toBe(true)
69
+ })
70
+ })
71
+
72
+ describe('events', () => {
73
+ const evt: HightouchEvent = {
74
+ type: 'identify',
75
+ traits: {
76
+ banana: 'phone',
77
+ },
78
+ }
79
+
80
+ const anothaOne: HightouchEvent = {
81
+ type: 'identify',
82
+ traits: {
83
+ name: 'DJ Khaled',
84
+ },
85
+ }
86
+
87
+ it('holds an event', () => {
88
+ const ctx = new Context(evt)
89
+ expect(ctx.event).toBe(evt)
90
+ })
91
+
92
+ it('allows for resetting the event', () => {
93
+ const ctx = new Context(evt)
94
+ ctx.event = anothaOne
95
+ expect(ctx.event).toEqual(anothaOne)
96
+ })
97
+
98
+ it('allows for partially updating the event', () => {
99
+ const ctx = new Context(evt)
100
+ ctx.updateEvent('traits.lastName', 'Farah')
101
+ ctx.updateEvent('traits.firstName', 'Netto')
102
+
103
+ ctx.updateEvent('traits.address', {
104
+ street: '301 Brazos St',
105
+ state: 'TX',
106
+ })
107
+
108
+ expect(ctx.event.traits).toEqual({
109
+ address: {
110
+ state: 'TX',
111
+ street: '301 Brazos St',
112
+ },
113
+ banana: 'phone',
114
+ firstName: 'Netto',
115
+ lastName: 'Farah',
116
+ })
117
+ })
118
+
119
+ it('allows updating integrations set to true', () => {
120
+ const trueEvt: HightouchEvent = {
121
+ type: 'identify',
122
+ integrations: {
123
+ Amplitude: true,
124
+ },
125
+ }
126
+
127
+ const falseEvt: HightouchEvent = {
128
+ type: 'identify',
129
+ integrations: {
130
+ Amplitude: false,
131
+ },
132
+ }
133
+
134
+ const trueCtx = new Context(trueEvt)
135
+ trueCtx.updateEvent('integrations.Amplitude.sessionId', 'foo')
136
+ expect(trueCtx.event.integrations).toEqual({
137
+ Amplitude: {
138
+ sessionId: 'foo',
139
+ },
140
+ })
141
+
142
+ trueCtx.updateEvent('traits.address', {
143
+ street: '301 Brazos St',
144
+ state: 'TX',
145
+ })
146
+
147
+ const falseCtx = new Context(falseEvt)
148
+ falseCtx.updateEvent('integrations.Amplitude.sessionId', 'foo')
149
+ expect(falseCtx.event.integrations).toEqual({
150
+ Amplitude: false,
151
+ })
152
+ })
153
+ })
154
+
155
+ it('serializes a context to JSON', () => {
156
+ const evt: HightouchEvent = {
157
+ type: 'track',
158
+ properties: {
159
+ serializable: true,
160
+ },
161
+ integrations: {
162
+ Mixpanel: false,
163
+ },
164
+ }
165
+
166
+ const ctx = new Context(evt)
167
+ ctx.stats.increment('c1')
168
+ ctx.log('warn', 'warning!')
169
+
170
+ const str = JSON.stringify(ctx)
171
+
172
+ expect(JSON.parse(str)).toEqual({
173
+ event: {
174
+ integrations: {
175
+ Mixpanel: false,
176
+ },
177
+ properties: {
178
+ serializable: true,
179
+ },
180
+ type: 'track',
181
+ },
182
+ id: expect.any(String),
183
+ logs: [
184
+ {
185
+ level: 'warn',
186
+ message: 'warning!',
187
+ time: expect.any(String),
188
+ },
189
+ ],
190
+ metrics: [
191
+ {
192
+ metric: 'c1',
193
+ tags: [],
194
+ timestamp: expect.any(Number),
195
+ type: 'counter',
196
+ value: 1,
197
+ },
198
+ ],
199
+ })
200
+ })
201
+ })
@@ -0,0 +1,21 @@
1
+ import {
2
+ CoreContext,
3
+ ContextCancelation,
4
+ ContextFailedDelivery,
5
+ SerializedContext,
6
+ CancelationOptions,
7
+ } from '@ht-sdks/events-sdk-js-core'
8
+ import { HightouchEvent } from '../events/interfaces'
9
+ import { Stats } from '../stats'
10
+
11
+ export class Context extends CoreContext<HightouchEvent> {
12
+ static override system() {
13
+ return new this({ type: 'track', event: 'system' })
14
+ }
15
+ constructor(event: HightouchEvent, 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
+ }