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,71 @@
1
+ import { HtEventsBrowser } from '../..'
2
+ import { setGlobalCDNUrl } from '../../lib/parse-cdn'
3
+ import { remoteLoader } from '../../plugins/remote-loader'
4
+ import unfetch from 'unfetch'
5
+ import { createSuccess } from '../../test-helpers/factories'
6
+ jest.mock('unfetch')
7
+
8
+ const INTG_TO_DELETE = 'deleteMe'
9
+
10
+ const cdnSettings = {
11
+ integrations: {
12
+ [INTG_TO_DELETE]: { bar: true },
13
+ otherIntegration: { foo: true },
14
+ },
15
+ }
16
+ const mockFetchSettingsSuccessResponse = (cdnSettings: any) => {
17
+ return jest
18
+ .mocked(unfetch)
19
+ .mockImplementation(() => createSuccess(cdnSettings))
20
+ }
21
+
22
+ jest.mock('../../plugins/remote-loader')
23
+ const remoteLoaderSpy = jest.fn().mockResolvedValue([])
24
+ jest.mocked(remoteLoader).mockImplementation(remoteLoaderSpy)
25
+
26
+ describe('updateCDNSettings configuration option', () => {
27
+ beforeEach(() => {
28
+ setGlobalCDNUrl(undefined as any)
29
+ ;(window as any).htevents = undefined
30
+ })
31
+ it('should update the configuration options if they are passed directly', async () => {
32
+ await HtEventsBrowser.load(
33
+ {
34
+ writeKey: 'foo',
35
+ cdnSettings,
36
+ },
37
+ {
38
+ updateCDNSettings: (settings) => {
39
+ delete settings.integrations.deleteMe
40
+ return settings
41
+ },
42
+ }
43
+ )
44
+ const [arg1] = remoteLoaderSpy.mock.lastCall
45
+ expect(arg1.integrations.otherIntegration).toEqual(
46
+ cdnSettings.integrations.otherIntegration
47
+ )
48
+ expect(arg1.integrations[INTG_TO_DELETE]).toBeUndefined()
49
+ })
50
+
51
+ // By default, we no longer fetch settings from the CDN
52
+ it.skip('should update the configuration options if they are fetched', async () => {
53
+ mockFetchSettingsSuccessResponse(cdnSettings)
54
+ await HtEventsBrowser.load(
55
+ {
56
+ writeKey: 'foo',
57
+ },
58
+ {
59
+ updateCDNSettings: (settings) => {
60
+ delete settings.integrations.deleteMe
61
+ return settings
62
+ },
63
+ }
64
+ )
65
+ const [arg1] = remoteLoaderSpy.mock.lastCall
66
+ expect(arg1.integrations.otherIntegration).toEqual(
67
+ cdnSettings.integrations.otherIntegration
68
+ )
69
+ expect(arg1.integrations[INTG_TO_DELETE]).toBeUndefined()
70
+ })
71
+ })
@@ -0,0 +1,19 @@
1
+ import { getCDN, setGlobalCDNUrl } from '../lib/parse-cdn'
2
+ import { setVersionType } from '../lib/version-type'
3
+
4
+ if (process.env.ASSET_PATH) {
5
+ if (process.env.ASSET_PATH === '/dist/umd/') {
6
+ // @ts-ignore
7
+ __webpack_public_path__ = '/dist/umd/'
8
+ } else {
9
+ const cdn = getCDN()
10
+ setGlobalCDNUrl(cdn) // preserving original behavior -- TODO: neccessary?
11
+ // @ts-ignore
12
+ __webpack_public_path__ =
13
+ cdn + `/${process.env.PATH_PREFIX}/${process.env.PATH_VERSION}/`
14
+ }
15
+ }
16
+
17
+ setVersionType('web')
18
+
19
+ export * from '.'
@@ -0,0 +1,486 @@
1
+ import { getProcessEnv } from '../lib/get-process-env'
2
+ import { getCDN, setGlobalCDNUrl } from '../lib/parse-cdn'
3
+
4
+ import { fetch } from '../lib/fetch'
5
+ import { Analytics, AnalyticsSettings, InitOptions } from '../core/analytics'
6
+ import { Context } from '../core/context'
7
+ import { Plan } from '../core/events'
8
+ import { Plugin } from '../core/plugin'
9
+ import { MetricsOptions } from '../core/stats/remote-metrics'
10
+ import { mergedOptions } from '../lib/merged-options'
11
+ import { createDeferred } from '../lib/create-deferred'
12
+ import { envEnrichment } from '../plugins/env-enrichment'
13
+ import {
14
+ PluginFactory,
15
+ remoteLoader,
16
+ RemotePlugin,
17
+ } from '../plugins/remote-loader'
18
+ import type { RoutingRule } from '../plugins/routing-middleware'
19
+ import { hightouchio, HightouchioSettings } from '../plugins/hightouchio'
20
+ import { validation } from '../plugins/validation'
21
+ import {
22
+ AnalyticsBuffered,
23
+ PreInitMethodCallBuffer,
24
+ flushAnalyticsCallsInNewTask,
25
+ flushAddSourceMiddleware,
26
+ flushSetAnonymousID,
27
+ flushOn,
28
+ } from '../core/buffer'
29
+ import { ClassicIntegrationSource } from '../plugins/ajs-destination/types'
30
+ import { attachInspector } from '../core/inspector'
31
+ import { setGlobalAnalyticsKey } from '../lib/global-analytics-helper'
32
+
33
+ export interface LegacyIntegrationConfiguration {
34
+ /* @deprecated - This does not indicate browser types anymore */
35
+ type?: string
36
+
37
+ versionSettings?: {
38
+ version?: string
39
+ override?: string
40
+ componentTypes?: Array<'browser' | 'android' | 'ios' | 'server'>
41
+ }
42
+
43
+ bundlingStatus?: string
44
+
45
+ /**
46
+ * Consent settings for the integration
47
+ */
48
+ consentSettings?: {
49
+ /**
50
+ * Consent categories for the integration
51
+ * @example ["Analytics", "Advertising", "CAT001"]
52
+ */
53
+ categories: string[]
54
+ }
55
+
56
+ // Hightouch.io specific
57
+ retryQueue?: boolean
58
+
59
+ // any extra unknown settings
60
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
+ [key: string]: any
62
+ }
63
+
64
+ export interface LegacySettings {
65
+ integrations: {
66
+ [name: string]: LegacyIntegrationConfiguration
67
+ }
68
+
69
+ middlewareSettings?: {
70
+ routingRules: RoutingRule[]
71
+ }
72
+
73
+ enabledMiddleware?: Record<string, boolean>
74
+ metrics?: MetricsOptions
75
+
76
+ plan?: Plan
77
+
78
+ legacyVideoPluginsEnabled?: boolean
79
+
80
+ remotePlugins?: RemotePlugin[]
81
+
82
+ /**
83
+ * Top level consent settings
84
+ */
85
+ consentSettings?: {
86
+ /**
87
+ * All unique consent categories.
88
+ * There can be categories in this array that are important for consent that are not included in any integration (e.g. 2 cloud mode categories).
89
+ * @example ["Analytics", "Advertising", "CAT001"]
90
+ */
91
+ allCategories: string[]
92
+ }
93
+ }
94
+
95
+ export interface HtEventsBrowserSettings extends AnalyticsSettings {
96
+ /**
97
+ * The settings for the Hightouch Source.
98
+ * If provided, `HtEventsBrowser` will not fetch remote settings
99
+ * for the source.
100
+ */
101
+ cdnSettings?: LegacySettings & Record<string, unknown>
102
+ /**
103
+ * If provided, will override the default Hightouch CDN (https://cdn.hightouch-events.com) for this application.
104
+ */
105
+ cdnURL?: string
106
+ }
107
+
108
+ export function loadLegacySettings(
109
+ writeKey: string,
110
+ cdnURL?: string
111
+ ): Promise<LegacySettings> {
112
+ const baseUrl = cdnURL ?? getCDN()
113
+
114
+ return fetch(`${baseUrl}/v1/projects/${writeKey}/settings`)
115
+ .then((res) => {
116
+ if (!res.ok) {
117
+ return res.text().then((errorResponseMessage) => {
118
+ throw new Error(errorResponseMessage)
119
+ })
120
+ }
121
+ return res.json()
122
+ })
123
+ .catch((err) => {
124
+ console.error(err.message)
125
+ throw err
126
+ })
127
+ }
128
+
129
+ function hasLegacyDestinations(settings: LegacySettings): boolean {
130
+ return (
131
+ getProcessEnv().NODE_ENV !== 'test' &&
132
+ // just one integration means hightouchio
133
+ Object.keys(settings.integrations).length > 1
134
+ )
135
+ }
136
+
137
+ function hasTsubMiddleware(settings: LegacySettings): boolean {
138
+ return (
139
+ getProcessEnv().NODE_ENV !== 'test' &&
140
+ (settings.middlewareSettings?.routingRules?.length ?? 0) > 0
141
+ )
142
+ }
143
+
144
+ /**
145
+ * With AJS classic, we allow users to call setAnonymousId before the library initialization.
146
+ * This is important because some of the destinations will use the anonymousId during the initialization,
147
+ * and if we set anonId afterwards, that wouldn’t impact the destination.
148
+ *
149
+ * Also Ensures events can be registered before library initialization.
150
+ * This is important so users can register to 'initialize' and any events that may fire early during setup.
151
+ */
152
+ function flushPreBuffer(
153
+ analytics: Analytics,
154
+ buffer: PreInitMethodCallBuffer
155
+ ): void {
156
+ flushSetAnonymousID(analytics, buffer)
157
+ flushOn(analytics, buffer)
158
+ }
159
+
160
+ /**
161
+ * Finish flushing buffer and cleanup.
162
+ */
163
+ async function flushFinalBuffer(
164
+ analytics: Analytics,
165
+ buffer: PreInitMethodCallBuffer
166
+ ): Promise<void> {
167
+ // Call popSnippetWindowBuffer before each flush task since there may be
168
+ // analytics calls during async function calls.
169
+ await flushAddSourceMiddleware(analytics, buffer)
170
+ flushAnalyticsCallsInNewTask(analytics, buffer)
171
+ // Clear buffer, just in case analytics is loaded twice; we don't want to fire events off again.
172
+ buffer.clear()
173
+ }
174
+
175
+ async function registerPlugins(
176
+ writeKey: string,
177
+ legacySettings: LegacySettings,
178
+ analytics: Analytics,
179
+ opts: InitOptions,
180
+ options: InitOptions,
181
+ pluginLikes: (Plugin | PluginFactory)[] = [],
182
+ legacyIntegrationSources: ClassicIntegrationSource[]
183
+ ): Promise<Context> {
184
+ const plugins = pluginLikes?.filter(
185
+ (pluginLike) => typeof pluginLike === 'object'
186
+ ) as Plugin[]
187
+
188
+ const pluginSources = pluginLikes?.filter(
189
+ (pluginLike) =>
190
+ typeof pluginLike === 'function' &&
191
+ typeof pluginLike.pluginName === 'string'
192
+ ) as PluginFactory[]
193
+
194
+ const tsubMiddleware = hasTsubMiddleware(legacySettings)
195
+ ? await import(
196
+ /* webpackChunkName: "tsub-middleware" */ '../plugins/routing-middleware'
197
+ ).then((mod) => {
198
+ return mod.tsubMiddleware(
199
+ legacySettings.middlewareSettings!.routingRules
200
+ )
201
+ })
202
+ : undefined
203
+
204
+ const legacyDestinations =
205
+ hasLegacyDestinations(legacySettings) || legacyIntegrationSources.length > 0
206
+ ? await import(
207
+ /* webpackChunkName: "ajs-destination" */ '../plugins/ajs-destination'
208
+ ).then((mod) => {
209
+ return mod.ajsDestinations(
210
+ writeKey,
211
+ legacySettings,
212
+ analytics.integrations,
213
+ opts,
214
+ tsubMiddleware,
215
+ legacyIntegrationSources
216
+ )
217
+ })
218
+ : []
219
+
220
+ if (legacySettings.legacyVideoPluginsEnabled) {
221
+ await import(
222
+ /* webpackChunkName: "legacyVideos" */ '../plugins/legacy-video-plugins'
223
+ ).then((mod) => {
224
+ return mod.loadLegacyVideoPlugins(analytics)
225
+ })
226
+ }
227
+
228
+ const schemaFilter = opts.plan?.track
229
+ ? await import(
230
+ /* webpackChunkName: "schemaFilter" */ '../plugins/schema-filter'
231
+ ).then((mod) => {
232
+ return mod.schemaFilter(opts.plan?.track, legacySettings)
233
+ })
234
+ : undefined
235
+
236
+ const mergedSettings = mergedOptions(legacySettings, options)
237
+ const remotePlugins = await remoteLoader(
238
+ legacySettings,
239
+ analytics.integrations,
240
+ mergedSettings,
241
+ options.obfuscate,
242
+ tsubMiddleware,
243
+ pluginSources
244
+ ).catch(() => [])
245
+
246
+ const toRegister = [
247
+ validation,
248
+ envEnrichment,
249
+ ...plugins,
250
+ ...legacyDestinations,
251
+ ...remotePlugins,
252
+ ]
253
+
254
+ if (schemaFilter) {
255
+ toRegister.push(schemaFilter)
256
+ }
257
+
258
+ const shouldIgnoreHightouchio =
259
+ (opts.integrations?.All === false && !opts.integrations['Hightouch.io']) ||
260
+ (opts.integrations && opts.integrations['Hightouch.io'] === false)
261
+
262
+ if (!shouldIgnoreHightouchio) {
263
+ toRegister.push(
264
+ await hightouchio(
265
+ analytics,
266
+ mergedSettings['Hightouch.io'] as HightouchioSettings,
267
+ legacySettings.integrations
268
+ )
269
+ )
270
+ }
271
+
272
+ const ctx = await analytics.register(...toRegister)
273
+
274
+ if (
275
+ Object.entries(legacySettings.enabledMiddleware ?? {}).some(
276
+ ([, enabled]) => enabled
277
+ )
278
+ ) {
279
+ await import(
280
+ /* webpackChunkName: "remoteMiddleware" */ '../plugins/remote-middleware'
281
+ ).then(async ({ remoteMiddlewares }) => {
282
+ const middleware = await remoteMiddlewares(
283
+ ctx,
284
+ legacySettings,
285
+ options.obfuscate
286
+ )
287
+ const promises = middleware.map((mdw) =>
288
+ analytics.addSourceMiddleware(mdw)
289
+ )
290
+ return Promise.all(promises)
291
+ })
292
+ }
293
+
294
+ return ctx
295
+ }
296
+
297
+ const defaultHightouchIntegration: HightouchioSettings = {
298
+ apiKey: 'WRITE_KEY',
299
+ apiHost: 'us-east-1.hightouch-events.com',
300
+ protocol: 'https',
301
+ unbundledIntegrations: [],
302
+ addBundledMetadata: false,
303
+ maybeBundledConfigIds: {},
304
+ deliveryStrategy: {
305
+ strategy: 'batching',
306
+ config: { timeout: 1000, size: 10 }, // 1 second or 10 items
307
+ },
308
+ }
309
+
310
+ const defaultSettings: LegacySettings = {
311
+ integrations: {},
312
+ plan: {
313
+ track: { __default: { enabled: true, integrations: {} } },
314
+ identify: { __default: { enabled: true } },
315
+ group: { __default: { enabled: true } },
316
+ },
317
+ enabledMiddleware: {},
318
+ metrics: { sampleRate: 0.0 },
319
+ legacyVideoPluginsEnabled: false,
320
+ remotePlugins: [],
321
+ }
322
+
323
+ async function loadAnalytics(
324
+ settings: HtEventsBrowserSettings,
325
+ options: InitOptions = {},
326
+ preInitBuffer: PreInitMethodCallBuffer
327
+ ): Promise<[Analytics, Context]> {
328
+ if (options.globalAnalyticsKey)
329
+ setGlobalAnalyticsKey(options.globalAnalyticsKey)
330
+ // this is an ugly side-effect, but it's for the benefits of the plugins that get their cdn via getCDN()
331
+ if (settings.cdnURL) setGlobalCDNUrl(settings.cdnURL)
332
+
333
+ let legacySettings
334
+ if (settings.cdnSettings) {
335
+ legacySettings = settings.cdnSettings
336
+ } else {
337
+ defaultSettings.integrations['Hightouch.io'] = {
338
+ ...defaultHightouchIntegration,
339
+ ...(settings.writeKey ? { apiKey: settings.writeKey } : {}),
340
+ ...(options.apiHost ? { apiHost: options.apiHost } : {}),
341
+ ...(options.protocol ? { protocol: options.protocol } : {}),
342
+ // defaultHightouchIntegration defaults to 'batching'
343
+ // allow the options override to turn it off
344
+ ...(options.batching == false
345
+ ? {
346
+ deliveryStrategy: {
347
+ strategy: 'standard',
348
+ },
349
+ }
350
+ : {}),
351
+ }
352
+ legacySettings = defaultSettings
353
+ }
354
+
355
+ if (options.updateCDNSettings) {
356
+ legacySettings = options.updateCDNSettings(legacySettings)
357
+ }
358
+
359
+ const retryQueue: boolean =
360
+ legacySettings.integrations['Hightouch.io']?.retryQueue ?? true
361
+
362
+ const opts: InitOptions = { retryQueue, ...options }
363
+ const analytics = new Analytics(settings, opts)
364
+
365
+ attachInspector(analytics)
366
+
367
+ const plugins = settings.plugins ?? []
368
+
369
+ const classicIntegrations = settings.classicIntegrations ?? []
370
+
371
+ // Uncomment to re-enable RemoteMetrics -- also see standalone.ts RemoteMetrics usage
372
+ // Stats.initRemoteMetrics(legacySettings.metrics)
373
+
374
+ // needs to be flushed before plugins are registered
375
+ flushPreBuffer(analytics, preInitBuffer)
376
+
377
+ const ctx = await registerPlugins(
378
+ settings.writeKey,
379
+ legacySettings,
380
+ analytics,
381
+ opts,
382
+ options,
383
+ plugins,
384
+ classicIntegrations
385
+ )
386
+
387
+ const search = window.location.search ?? ''
388
+ const hash = window.location.hash ?? ''
389
+
390
+ const term = search.length ? search : hash.replace(/(?=#).*(?=\?)/, '')
391
+
392
+ if (term.includes('ajs_')) {
393
+ await analytics.queryString(term).catch(console.error)
394
+ }
395
+
396
+ analytics.initialized = true
397
+ analytics.emit('initialize', settings, options)
398
+
399
+ if (options.initialPageview) {
400
+ analytics.page().catch(console.error)
401
+ }
402
+
403
+ await flushFinalBuffer(analytics, preInitBuffer)
404
+
405
+ return [analytics, ctx]
406
+ }
407
+
408
+ /**
409
+ * The public browser interface for Hightouch Events
410
+ *
411
+ * @example
412
+ * ```ts
413
+ * export const htevents = new HtEventsBrowser()
414
+ * htevents.load({ writeKey: 'foo' })
415
+ * ```
416
+ * @link https://github.com/ht-sdks/events-sdk-js-mono/tree/master/packages/browser#readme
417
+ */
418
+ export class HtEventsBrowser extends AnalyticsBuffered {
419
+ private _resolveLoadStart: (
420
+ settings: HtEventsBrowserSettings,
421
+ options: InitOptions
422
+ ) => void
423
+
424
+ constructor() {
425
+ const { promise: loadStart, resolve: resolveLoadStart } =
426
+ createDeferred<Parameters<HtEventsBrowser['load']>>()
427
+
428
+ super((buffer) =>
429
+ loadStart.then(([settings, options]) =>
430
+ loadAnalytics(settings, options, buffer)
431
+ )
432
+ )
433
+
434
+ this._resolveLoadStart = (settings, options) =>
435
+ resolveLoadStart([settings, options])
436
+ }
437
+
438
+ /**
439
+ * Fully initialize an analytics instance, including:
440
+ *
441
+ * * Fetching settings from the CDN (by default).
442
+ * * Fetching all remote destinations configured by the user (if applicable).
443
+ * * Flushing buffered analytics events.
444
+ * * Loading all middleware.
445
+ *
446
+ * Note:️ This method should only be called *once* in your application.
447
+ *
448
+ * @example
449
+ * ```ts
450
+ * export const analytics = new HtEventsBrowser()
451
+ * analytics.load({ writeKey: 'foo' })
452
+ * ```
453
+ */
454
+ load(
455
+ settings: HtEventsBrowserSettings,
456
+ options: InitOptions = {}
457
+ ): HtEventsBrowser {
458
+ this._resolveLoadStart(settings, options)
459
+ return this
460
+ }
461
+
462
+ /**
463
+ * Instantiates an object exposing Analytics methods.
464
+ *
465
+ * @example
466
+ * ```ts
467
+ * const ajs = HtEventsBrowser.load({ writeKey: '<YOUR_WRITE_KEY>' })
468
+ *
469
+ * ajs.track("foo")
470
+ * ...
471
+ * ```
472
+ */
473
+ static load(
474
+ settings: HtEventsBrowserSettings,
475
+ options: InitOptions = {}
476
+ ): HtEventsBrowser {
477
+ return new HtEventsBrowser().load(settings, options)
478
+ }
479
+
480
+ static standalone(
481
+ writeKey: string,
482
+ options?: InitOptions
483
+ ): Promise<Analytics> {
484
+ return HtEventsBrowser.load({ writeKey }, options).then((res) => res[0])
485
+ }
486
+ }
@@ -0,0 +1,62 @@
1
+ import { HtEventsBrowser } from '.'
2
+ import { embeddedWriteKey } from '../lib/embedded-write-key'
3
+ import { HtEventsSnippet } from './standalone-interface'
4
+ import {
5
+ getGlobalAnalytics,
6
+ setGlobalAnalytics,
7
+ } from '../lib/global-analytics-helper'
8
+
9
+ function getWriteKey(): string | undefined {
10
+ if (embeddedWriteKey()) {
11
+ return embeddedWriteKey()
12
+ }
13
+
14
+ const analytics = getGlobalAnalytics()
15
+ if (analytics?._writeKey) {
16
+ return analytics._writeKey
17
+ }
18
+
19
+ const regex = /http.*\/analytics\.js\/v1\/([^/]*)(\/platform)?\/analytics.*/
20
+ const scripts = Array.prototype.slice.call(
21
+ document.querySelectorAll('script')
22
+ )
23
+ let writeKey: string | undefined = undefined
24
+
25
+ for (const s of scripts) {
26
+ const src = s.getAttribute('src') ?? ''
27
+ const result = regex.exec(src)
28
+
29
+ if (result && result[1]) {
30
+ writeKey = result[1]
31
+ break
32
+ }
33
+ }
34
+
35
+ if (!writeKey && document.currentScript) {
36
+ const script = document.currentScript as HTMLScriptElement
37
+ const src = script.src
38
+
39
+ const result = regex.exec(src)
40
+
41
+ if (result && result[1]) {
42
+ writeKey = result[1]
43
+ }
44
+ }
45
+
46
+ return writeKey
47
+ }
48
+
49
+ export async function install(): Promise<void> {
50
+ const writeKey = getWriteKey()
51
+ const options = getGlobalAnalytics()?._loadOptions ?? {}
52
+ if (!writeKey) {
53
+ console.error(
54
+ 'Failed to load Write Key. Make sure to use the latest version of the hightouch snippet, which can be found in your source settings.'
55
+ )
56
+ return
57
+ }
58
+
59
+ setGlobalAnalytics(
60
+ (await HtEventsBrowser.standalone(writeKey, options)) as HtEventsSnippet
61
+ )
62
+ }
@@ -0,0 +1,11 @@
1
+ import { Analytics, InitOptions } from '../core/analytics'
2
+
3
+ export interface HtEventsSnippet extends AnalyticsStandalone {
4
+ load: (writeKey: string, options?: InitOptions) => void
5
+ }
6
+
7
+ export interface AnalyticsStandalone extends Analytics {
8
+ _loadOptions?: InitOptions
9
+ _writeKey?: string
10
+ _cdn?: string
11
+ }