utneque 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
package/.yarnrc.yml ADDED
@@ -0,0 +1,15 @@
1
+ nodeLinker: node-modules
2
+
3
+ plugins:
4
+ - path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
5
+ spec: "@yarnpkg/plugin-workspace-tools"
6
+ - path: .yarn/plugins/@yarnpkg/plugin-constraints.cjs
7
+ spec: "@yarnpkg/plugin-constraints"
8
+ - path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
9
+ spec: "@yarnpkg/plugin-interactive-tools"
10
+ - path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
11
+ spec: "@yarnpkg/plugin-typescript"
12
+
13
+ preferInteractive: true
14
+
15
+ yarnPath: .yarn/releases/yarn-3.4.1.cjs
package/jest.config.js ADDED
@@ -0,0 +1,18 @@
1
+ const { createJestTSConfig } = require('@internal/config')
2
+
3
+ /**
4
+ * This config detects our monorepo, and allows
5
+ * you to run every single package test in a single jest instance using 'yarn jest'.
6
+ * Thus, `yarn jest --watch` works as expected (unlike say, when using turborepo)
7
+ */
8
+ module.exports = () =>
9
+ createJestTSConfig(__dirname, {
10
+ projects: [
11
+ // being explicit here, as a globbing bug means that using packages/* can cause problems in non-worktrees (haven't fully investigated yet).
12
+ '<rootDir>/packages/core',
13
+ '<rootDir>/packages/node',
14
+ '<rootDir>/packages/browser',
15
+ '<rootDir>/packages/consent/consent-tools',
16
+ '<rootDir>/packages/consent/consent-wrapper-onetrust',
17
+ ],
18
+ })
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "utneque",
3
+ "version": "1.0.0",
4
+ "workspaces": [
5
+ "examples/*",
6
+ "packages/*",
7
+ "packages/consent/*"
8
+ ],
9
+ "engines": {
10
+ "node": "^16.16.0"
11
+ },
12
+ "packageManager": "yarn@3.4.1",
13
+ "devDependencies": {
14
+ "@changesets/changelog-github": "^0.4.5",
15
+ "@changesets/cli": "^2.23.2",
16
+ "@npmcli/promise-spawn": "^3.0.0",
17
+ "@types/express": "4",
18
+ "@types/jest": "^28.1.1",
19
+ "@types/lodash": "^4",
20
+ "@types/node-fetch": "^2.6.2",
21
+ "@typescript-eslint/eslint-plugin": "^5.21.0",
22
+ "@typescript-eslint/parser": "^5.21.0",
23
+ "concurrently": "^7.6.0",
24
+ "eslint": "^8.14.0",
25
+ "eslint-config-prettier": "^8.5.0",
26
+ "eslint-plugin-import": "^2.27.5",
27
+ "eslint-plugin-jest": "^27.2.2",
28
+ "eslint-plugin-prettier": "^4.0.0",
29
+ "express": "^4.18.2",
30
+ "get-monorepo-packages": "^1.2.0",
31
+ "husky": "^8.0.0",
32
+ "jest": "^28.1.0",
33
+ "lint-staged": "^13.0.0",
34
+ "lodash": "^4.17.21",
35
+ "nock": "^13.3.0",
36
+ "node-gyp": "^9.0.0",
37
+ "prettier": "^2.6.2",
38
+ "ts-jest": "^28.0.4",
39
+ "ts-node": "^10.8.0",
40
+ "turbo": "^1.10.14",
41
+ "typescript": "^4.7.0",
42
+ "webpack": "^5.76.0",
43
+ "webpack-dev-server": "^4.15.1"
44
+ },
45
+ "resolutions": {
46
+ "@ht-sdks/events-sdk-js-browser": "workspace:*",
47
+ "@ht-sdks/events-sdk-js-node": "workspace:*",
48
+ "@ht-sdks/events-sdk-js-core": "workspace:*"
49
+ },
50
+ "author": "ElzaLeuschke",
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "https://github.com/KaileeJerde/utneque.git"
54
+ },
55
+ "bugs": {
56
+ "url": "https://github.com/KaileeJerde/utneque.git/issues"
57
+ },
58
+ "homepage": "https://github.com/KaileeJerde/utneque.git"
59
+ }
@@ -0,0 +1,9 @@
1
+ /** @type { import('eslint').Linter.Config } */
2
+ module.exports = {
3
+ ignorePatterns: ['e2e-tests', 'qa', '/*.tmp.*/'],
4
+ extends: ['../../.eslintrc'],
5
+ env: {
6
+ node: true, // TODO: change to false when node is abstracted out
7
+ browser: true,
8
+ },
9
+ }
@@ -0,0 +1 @@
1
+ module.exports = require("@internal/config").lintStagedConfig
@@ -0,0 +1,48 @@
1
+ # Architecture
2
+
3
+ ## Codebases
4
+
5
+ Javascript event tracking can be thought of as two different codebases:
6
+
7
+ - [events-sdk-js-mono](https://github.com/ht-sdks/events-sdk-js-mono): All core functionality
8
+ - Legacy client side destinations and plugins
9
+
10
+ ## Core
11
+
12
+ Some of the bigger core modules are briefly outlined here -
13
+
14
+ - arguments-resolver: Responsible for reshuffling arguments in event calls
15
+ - context: Responsible for building context objects for different events
16
+ - emitter: Responsible for emitting events and adding listeners for them
17
+ - events: Responsible for building the different events (track, page, etc), and normalizing those events
18
+ - logger: Responsible for building and flushing the logs that will be carried around in an events context object
19
+ - queue: The heart of events-sdk-js, the queue is responsible for managing events which will be delivered to plugins and destinations, and handles things such as retries, timeouts, and delivery reliability
20
+ - user: Responsible for all of the logic built around an analytics user
21
+
22
+ The general end to end flow of events-sdk-js core is as follows:
23
+
24
+ 1. Legacy settings and destinations are loaded from a settings object passed at initialization
25
+ 2. The HtEvents object is instantiated with the loaded settings, and sets up things such as new/existing users and an event queue.
26
+ 3. Events are built and queued when a user makes a call (ie. analytics.track())
27
+ 4. The event is dispatched, goes through all enabled plugins, and is finally sent through the hightouch.io plugin to get the data into hightouch
28
+
29
+ ## Everything is a Plugin
30
+
31
+ When developing against events-sdk-js you will likely be writing plugins, which can augment events-sdk-js functionality and enrich data. Plugins are isolated chunks which you can build, test, version, and deploy independently of the rest of the codebase. Extensions are bounded by events-sdk-js which handles things such as observability, retries, and error management.
32
+
33
+ Plugins can be of two different priorities:
34
+
35
+ - Critical: events-sdk-js should expect this plugin to be loaded before starting event delivery
36
+ - Non-critical: events-sdk-js can start event delivery before this plugin has finished loading
37
+
38
+ and can be of five different types:
39
+
40
+ - Before: Pleguns that need to be run before any other plugins are run. An example of this would be validating events before passing them along to other plugins.
41
+ - After: Plugins that need to run after all other plugins have run. An example of this is the hightouch.io integration, which will wait for destinations to succeed or fail so that it can send its observability metrics.
42
+ - Destination: Destinations to send the event to (ie. legacy destinations). Does not modify the event and failure does not halt execution.
43
+ - Enrichment: Modifies an event, failure here could halt the event pipeline.
44
+ - Utility: Plugins that change events-sdk-js functionality and don't fall into the other categories.
45
+
46
+ ## Observability
47
+
48
+ Every event and plugin has a context object, which contains both metrics and logs that were collected throughout their lifetime. Logs can be used for debugging, and the metrics will be included when the event is sent to Hightouch.
@@ -0,0 +1,45 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright © 2023 Hightouch
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
22
+
23
+ ---
24
+
25
+ The MIT License (MIT)
26
+
27
+ Copyright © 2021 Segment
28
+
29
+ Permission is hereby granted, free of charge, to any person obtaining a copy
30
+ of this software and associated documentation files (the "Software"), to deal
31
+ in the Software without restriction, including without limitation the rights
32
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
33
+ copies of the Software, and to permit persons to whom the Software is
34
+ furnished to do so, subject to the following conditions:
35
+
36
+ The above copyright notice and this permission notice shall be included in
37
+ all copies or substantial portions of the Software.
38
+
39
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
40
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
41
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
42
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
43
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
44
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
45
+ THE SOFTWARE.
@@ -0,0 +1,64 @@
1
+ BIN := ./node_modules/.bin
2
+ yarn_run := yarn run -T browser
3
+
4
+ help: ## Lists all available make tasks and some short documentation about them
5
+ @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-24s\033[0m %s\n", $$1, $$2}'
6
+ .PHONY: help
7
+
8
+
9
+ ## Basic repo maintenance
10
+
11
+ # Installs npm dependencies
12
+ node_modules:
13
+ yarn install --immutable
14
+ @touch $@
15
+
16
+ build-browser: build # build dependencies
17
+ $(yarn_run) umd --no-stats
18
+ .PHONY: build-browser
19
+
20
+ build: ## Builds libraries in prod mode, and all dependencies
21
+ yarn run -T browser . build
22
+ .PHONY: build
23
+
24
+ clean: ## Clean the build directory
25
+ rm -rf dist generated
26
+ .PHONY: clean
27
+
28
+ ## Test Commands
29
+
30
+ tdd: node_modules ## Runs unit tests in watch mode
31
+ $(yarn_run) test --watch
32
+ .PHONY: tdd
33
+
34
+ test-unit: node_modules ## Runs unit tests
35
+ $(yarn_run) test
36
+ .PHONY: test-unit
37
+
38
+ test-coverage: node_modules ## Runs unit tests with coverage
39
+ $(yarn_run) test --coverage --forceExit
40
+ .PHONY: test-coverage
41
+
42
+ test-qa: build-browser ## Runs all QA tests in a single command
43
+ $(yarn_run) test --runTestsByPath qa/__tests__/*.test.ts --testPathIgnorePatterns qa/__tests__/destinations.test.ts --reporters="default" --reporters="<rootDir>/qa/lib/jest-reporter.js" ${args}
44
+ .PHONY: test-coverage
45
+
46
+ test-qa-destinations: build-browser ## Runs Destination QA tests. options. DESTINATION=amplitude DEBUG=true
47
+ $(yarn_run) test --forceExit --runTestsByPath qa/__tests__/destinations.test.ts --reporters="default" --reporters="<rootDir>/qa/lib/jest-reporter.js" ${args}
48
+ .PHONY: test-coverage
49
+
50
+ test-integration: build ## Runs all integration tests in a single command
51
+ $(yarn_run) test --forceExit --runTestsByPath e2e-tests/**/*.test.ts ${args}
52
+ .PHONY: test-coverage
53
+
54
+ test-perf: build ## Runs all integration tests in a single command
55
+ $(yarn_run) test --forceExit --runTestsByPath e2e-tests/performance/*.test.ts ${args}
56
+ .PHONY: test-coverage
57
+
58
+ lint: node_modules ## Lints the source code
59
+ $(yarn_run) lint
60
+ .PHONY: lint
61
+
62
+ analyze:
63
+ NODE_ENV=production $(BIN)/webpack --profile --json > stats.json && $(BIN)/webpack-bundle-analyzer --port 4200 stats.json
64
+ .PHONY: analyze
@@ -0,0 +1,227 @@
1
+ # Events Javascript SDK
2
+
3
+ ## Installation via CDN
4
+
5
+ To integrate the JavaScript SDK with your website, place the following code snippet in the `<head>` section of your website.
6
+
7
+ ```javascript
8
+ <script type="text/javascript">
9
+ !function(){var e=window.htevents=window.htevents||[];if(!e.initialize)if(e.invoked)window.console&&console.error&&console.error("Hightouch snippet included twice.");else{e.invoked=!0,e.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"],e.factory=function(t){return function(){var n=Array.prototype.slice.call(arguments);return n.unshift(t),e.push(n),e}};for(var t=0;t<e.methods.length;t++){var n=e.methods[t];e[n]=e.factory(n)}e.load=function(t,n){var o=document.createElement("script");o.type="text/javascript",o.async=!0,o.src="https://cdn.hightouch-events.com/browser/release/v1-latest/events.min.js";var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(o,r),e._loadOptions=n,e._writeKey=t},e.SNIPPET_VERSION="0.0.1",
10
+ e.load(<WRITE_KEY>,{apiHost:<DATA_PLANE_URL>}),
11
+ e.page()}}();
12
+ </script>
13
+ ```
14
+
15
+ `window.htevents.track(...)` will then be available for use.
16
+
17
+ ### Alternative installation using NPM
18
+
19
+ 1. Install the package
20
+
21
+ ```sh
22
+ # npm
23
+ npm install @ht-sdks/events-sdk-js-browser
24
+
25
+ # yarn
26
+ yarn add @ht-sdks/events-sdk-js-browser
27
+
28
+ # pnpm
29
+ pnpm add @ht-sdks/events-sdk-js-browser
30
+ ```
31
+
32
+ 2. Import the package into your project and you're good to go (with working types)!
33
+
34
+ ```ts
35
+ import { HtEventsBrowser } from '@ht-sdks/events-sdk-js-browser'
36
+
37
+ const htevents = HtEventsBrowser.load({ writeKey: '<YOUR_WRITE_KEY>' })
38
+
39
+ htevents.identify('hello world')
40
+
41
+ document.body?.addEventListener('click', () => {
42
+ htevents.track('document body clicked!')
43
+ })
44
+ ```
45
+
46
+ ## Lazy / Delayed Loading
47
+ You can load a buffered version of htevents that requires `.load` to be explicitly called before initiating any network activity. This can be useful if you want to wait for a user to consent before fetching any tracking destinations or sending buffered events to hightouch.
48
+
49
+ - ⚠️ ️`.load` should only be called _once_.
50
+
51
+ ```ts
52
+ export const htevents = new HtEventsBrowser()
53
+
54
+ htevents.identify("hello world")
55
+
56
+ if (userConsentsToBeingTracked) {
57
+ htevents.load({ writeKey: '<YOUR_WRITE_KEY>' }) // destinations loaded, enqueued events are flushed
58
+ }
59
+ ```
60
+
61
+ ## Error Handling
62
+ ### Handling initialization errors
63
+ If you want to catch initialization errors, you can do the following:
64
+ ```ts
65
+ export const htevents = new HtEventsBrowser();
66
+ htevents
67
+ .load({ writeKey: "MY_WRITE_KEY" })
68
+ .catch((err) => ...);
69
+ ```
70
+
71
+ ## Usage in Common Frameworks / SPAs
72
+
73
+ ### Vanilla React
74
+ ```tsx
75
+ import { HtEventsBrowser } from '@ht-sdks/events-sdk-js-browser'
76
+
77
+ // We can export this instance to share with rest of our codebase.
78
+ export const htevents = HtEventsBrowser.load({ writeKey: '<YOUR_WRITE_KEY>' })
79
+
80
+ const App = () => (
81
+ <div>
82
+ <button onClick={() => htevents.track('hello world')}>Track</button>
83
+ </div>
84
+ )
85
+ ```
86
+
87
+
88
+
89
+ ### Vue
90
+
91
+ 1. Export htevents instance. E.g. `services/hightouch.ts`
92
+
93
+ ```ts
94
+ import { HtEventsBrowser } from '@ht-sdks/events-sdk-js-browser'
95
+
96
+ export const htevents = HtEventsBrowser.load({
97
+ writeKey: '<YOUR_WRITE_KEY>',
98
+ })
99
+ ```
100
+
101
+ 2. in `.vue` component
102
+
103
+ ```tsx
104
+ <template>
105
+ <button @click="track()">Track</button>
106
+ </template>
107
+
108
+ <script>
109
+ import { defineComponent } from 'vue'
110
+ import { htevents } from './services/hightouch'
111
+
112
+ export default defineComponent({
113
+ setup() {
114
+ function track() {
115
+ htevents.track('Hello world')
116
+ }
117
+
118
+ return {
119
+ track,
120
+ }
121
+ },
122
+ })
123
+ </script>
124
+ ```
125
+
126
+ ## How to add typescript support when using the CDN snippet
127
+
128
+ NOTE: this is only required for snippet installation.
129
+
130
+ NPM installation should already have type support.
131
+
132
+ 1. Install npm package `@ht-sdks/events-sdk-js-browser` as a dev dependency.
133
+
134
+ 2. Create `./typings/htevents.d.ts`
135
+ ```ts
136
+ // ./typings/htevents.d.ts
137
+ import type { HtEventsSnippet } from "@ht-sdks/events-sdk-js-browser";
138
+
139
+ declare global {
140
+ interface Window {
141
+ htevents: HtEventsSnippet;
142
+ }
143
+ }
144
+
145
+ ```
146
+ 3. Configure typescript to read from the custom `./typings` folder
147
+ ```jsonc
148
+ // tsconfig.json
149
+ {
150
+ ...
151
+ "compilerOptions": {
152
+ ....
153
+ "typeRoots": [
154
+ "./node_modules/@types",
155
+ "./typings"
156
+ ]
157
+ }
158
+ ....
159
+ }
160
+ ```
161
+
162
+ ---
163
+
164
+ ## Development
165
+
166
+ First, clone the repo and then startup our local dev environment:
167
+
168
+ ```sh
169
+ $ git clone git@github.com:ht-sdks/events-sdk-js-mono.git
170
+ $ cd events-sdk-js-mono
171
+ $ nvm use # installs correct version of node defined in .nvmrc.
172
+ $ yarn && yarn build
173
+ $ yarn test
174
+ ```
175
+
176
+ > If you get "Cannot find module '@ht-sdks/events-sdk-js-browser' or its corresponding type declarations.ts(2307)" (in VSCode), you may have to "cmd+shift+p -> "TypeScript: Restart TS server"
177
+
178
+ # Plugins
179
+
180
+ When developing against Events SDK JS you will likely be writing plugins, which can augment functionality and enrich data. Plugins are isolated chunks which you can build, test, version, and deploy independently of the rest of the codebase. Plugins are bounded by Events SDK JS which handles things such as observability, retries, and error management.
181
+
182
+ Plugins can be of two different priorities:
183
+
184
+ 1. **Critical**: Events SDK JS should expect this plugin to be loaded before starting event delivery
185
+ 2. **Non-critical**: Events SDK JS can start event delivery before this plugin has finished loading
186
+
187
+ and can be of five different types:
188
+
189
+ 1. **Before**: Plugins that need to be run before any other plugins are run. An example of this would be validating events before passing them along to other plugins.
190
+ 2. **After**: Plugins that need to run after all other plugins have run. An example of this is the Hightouch.io integration, which will wait for destinations to succeed or fail so that it can send its observability metrics.
191
+ 3. **Destination**: Destinations to send the event to (ie. legacy destinations). Does not modify the event and failure does not halt execution.
192
+ 4. **Enrichment**: Modifies an event, failure here could halt the event pipeline.
193
+ 5. **Utility**: Plugins that change Events SDK JS functionality and don't fall into the other categories.
194
+
195
+ Here is an example of a simple plugin that would convert all track events event names to lowercase before the event gets sent through the rest of the pipeline:
196
+
197
+ ```ts
198
+ import type { Plugin } from '@ht-sdks/events-sdk-js-browser'
199
+
200
+ export const lowercase: Plugin = {
201
+ name: 'Lowercase Event Name',
202
+ type: 'before',
203
+ version: '1.0.0',
204
+
205
+ isLoaded: () => true,
206
+ load: () => Promise.resolve(),
207
+
208
+ track: (ctx) => {
209
+ ctx.event.event = ctx.event.event.toLowerCase()
210
+ return ctx
211
+ }
212
+ }
213
+
214
+ htevents.register(lowercase)
215
+ ```
216
+
217
+ For further examples check out our [existing plugins](/packages/browser/src/plugins).
218
+
219
+ ## QA
220
+ Feature work and bug fixes should include tests. Run all [Jest](https://jestjs.io) tests:
221
+ ```
222
+ $ yarn test
223
+ ```
224
+ Lint all with [ESLint](https://github.com/typescript-eslint/typescript-eslint/):
225
+ ```
226
+ $ yarn lint
227
+ ```
@@ -0,0 +1,28 @@
1
+ import fetch from 'node-fetch'
2
+ import http from 'http'
3
+ import handler from 'serve-handler'
4
+
5
+ export async function startLocalServer(): Promise<string> {
6
+ const srv = http.createServer((request, response) => {
7
+ return handler(request, response)
8
+ })
9
+
10
+ return new Promise(async (resolve, reject) => {
11
+ const desiredPort = process.env.PORT ?? 5000
12
+ const desiredPath = `http://localhost:${desiredPort}`
13
+
14
+ try {
15
+ const ping = await fetch(desiredPath)
16
+ if (ping.ok) {
17
+ return resolve(desiredPath)
18
+ }
19
+ } catch (err) {
20
+ srv.on('error', reject)
21
+ srv.listen(desiredPort, () => {
22
+ // @ts-expect-error
23
+ const { port } = srv.address()
24
+ resolve(`http://localhost:${port ?? desiredPort}`)
25
+ })
26
+ }
27
+ })
28
+ }
@@ -0,0 +1,75 @@
1
+ import { tester, testerTeardown } from '../../src/tester/ajs-tester'
2
+ import {
3
+ gatherLighthouseMetrics,
4
+ globalSetup,
5
+ globalTeardown,
6
+ } from '../../src/tester/ajs-perf'
7
+ import { TEST_WRITEKEY } from '../../src/test-helpers/test-writekeys'
8
+
9
+ describe('Performance', () => {
10
+ beforeAll(async () => {
11
+ await globalSetup()
12
+ })
13
+
14
+ afterAll(async () => {
15
+ await globalTeardown()
16
+ await testerTeardown()
17
+ })
18
+
19
+ // These tests are now biased because of the massive number of tests running during our QA process
20
+ it('gather lighthouse', async () => {
21
+ const analyticsStub = await tester(
22
+ TEST_WRITEKEY,
23
+ 'http://localhost:3001',
24
+ 'chromium',
25
+ true
26
+ )
27
+
28
+ const results: any = await gatherLighthouseMetrics(analyticsStub.browserPage)
29
+ const audits = results.audits // Lighthouse audits
30
+
31
+ // lighthouse perf score
32
+ expect(results['categories'].performance.score).toBeGreaterThanOrEqual(0.99)
33
+ // no render blocking resource
34
+ expect(audits['render-blocking-resources'].details.items).toHaveLength(0)
35
+ // first contentful paint in the first second
36
+ expect(audits['first-contentful-paint'].numericValue).toBeLessThan(1000)
37
+
38
+ // total blocking time less than 100ms
39
+ expect(audits['total-blocking-time'].numericValue).toBeLessThan(150)
40
+ // main thread work less than 100ms
41
+ expect(audits['mainthread-work-breakdown'].numericValue).toBeLessThan(300)
42
+
43
+ console.log('⚡️ AJS is blazing fast ⚡')
44
+ console.table(
45
+ Object.keys(audits)
46
+ .filter((i) => audits[i].displayValue)
47
+ .map((i) => ({
48
+ metric: audits[i].title,
49
+ value: audits[i].displayValue,
50
+ }))
51
+ )
52
+
53
+ await analyticsStub.browserPage.close()
54
+ }, 50000)
55
+
56
+ it('loads ajs in a browser', async () => {
57
+ const analyticsStub = await tester(
58
+ TEST_WRITEKEY,
59
+ 'http://localhost:3001',
60
+ 'chromium',
61
+ true
62
+ )
63
+
64
+ const ctx = await analyticsStub.track('hi', {
65
+ test: 'prop',
66
+ })
67
+
68
+ expect(ctx.event.event).toEqual('hi')
69
+ expect(ctx.event.properties).toEqual({
70
+ test: 'prop',
71
+ })
72
+
73
+ await analyticsStub.browserPage.close()
74
+ }, 10000)
75
+ })
@@ -0,0 +1,15 @@
1
+ const { createJestTSConfig } = require('@internal/config')
2
+
3
+ module.exports = createJestTSConfig(__dirname, {
4
+ modulePathIgnorePatterns: ['<rootDir>/e2e-tests', '<rootDir>/qa'],
5
+ setupFilesAfterEnv: ['./jest.setup.js'],
6
+ testEnvironment: 'jsdom',
7
+ coverageThreshold: {
8
+ global: {
9
+ branches: 80.91,
10
+ functions: 87.25,
11
+ lines: 91.03,
12
+ statements: 87.25,
13
+ },
14
+ },
15
+ })
@@ -0,0 +1,10 @@
1
+ const { TextEncoder, TextDecoder } = require('util')
2
+ const { setImmediate } = require('timers')
3
+
4
+ // fix: "ReferenceError: TextEncoder is not defined" after upgrading JSDOM
5
+ global.TextEncoder = TextEncoder
6
+ global.TextDecoder = TextDecoder
7
+ // fix: jsdom uses setImmediate under the hood for preflight XHR requests,
8
+ // and jest removed setImmediate, so we need to provide it to prevent console
9
+ // logging ReferenceErrors made by integration tests that call Amplitude.
10
+ global.setImmediate = setImmediate