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,672 @@
1
+ import {
2
+ AliasParams,
3
+ DispatchedEvent,
4
+ EventParams,
5
+ GroupParams,
6
+ PageParams,
7
+ resolveAliasArguments,
8
+ resolveArguments,
9
+ resolvePageArguments,
10
+ resolveUserArguments,
11
+ IdentifyParams,
12
+ } from '../arguments-resolver'
13
+ import type { FormArgs, LinkArgs } from '../auto-track'
14
+ import { isOffline } from '../connection'
15
+ import { Context } from '../context'
16
+ import { dispatch, Emitter } from '@ht-sdks/events-sdk-js-core'
17
+ import {
18
+ Callback,
19
+ EventFactory,
20
+ Integrations,
21
+ Plan,
22
+ EventProperties,
23
+ HightouchEvent,
24
+ } from '../events'
25
+ import type { Plugin } from '../plugin'
26
+ import { EventQueue } from '../queue/event-queue'
27
+ import { Group, ID, User, UserOptions } from '../user'
28
+ import autoBind from '../../lib/bind-all'
29
+ import { PersistedPriorityQueue } from '../../lib/priority-queue/persisted'
30
+ import type { LegacyDestination } from '../../plugins/ajs-destination'
31
+ import type {
32
+ LegacyIntegration,
33
+ ClassicIntegrationSource,
34
+ } from '../../plugins/ajs-destination/types'
35
+ import type {
36
+ DestinationMiddlewareFunction,
37
+ MiddlewareFunction,
38
+ } from '../../plugins/middleware'
39
+ import { version } from '../../generated/version'
40
+ import { PriorityQueue } from '../../lib/priority-queue'
41
+ import { getGlobal } from '../../lib/get-global'
42
+ import { AnalyticsClassic, AnalyticsCore } from './interfaces'
43
+ import { HighEntropyHint } from '../../lib/client-hints/interfaces'
44
+ import type { LegacySettings } from '../../browser'
45
+ import {
46
+ CookieOptions,
47
+ MemoryStorage,
48
+ UniversalStorage,
49
+ StorageSettings,
50
+ StoreType,
51
+ applyCookieOptions,
52
+ initializeStorages,
53
+ isArrayOfStoreType,
54
+ } from '../storage'
55
+ import { PluginFactory } from '../../plugins/remote-loader'
56
+ import { setGlobalAnalytics } from '../../lib/global-analytics-helper'
57
+ import { popPageContext } from '../buffer'
58
+
59
+ const deprecationWarning =
60
+ 'This is being deprecated and will be not be available in future releases of Analytics JS'
61
+
62
+ // reference any pre-existing "analytics" object so a user can restore the reference
63
+ const global: any = getGlobal()
64
+ const _analytics = global?.analytics
65
+
66
+ function createDefaultQueue(
67
+ name: string,
68
+ retryQueue = false,
69
+ disablePersistance = false
70
+ ) {
71
+ const maxAttempts = retryQueue ? 4 : 1
72
+ const priorityQueue = disablePersistance
73
+ ? new PriorityQueue(maxAttempts, [])
74
+ : new PersistedPriorityQueue(maxAttempts, name)
75
+ return new EventQueue(priorityQueue)
76
+ }
77
+
78
+ export interface AnalyticsSettings {
79
+ writeKey: string
80
+ timeout?: number
81
+ plugins?: (Plugin | PluginFactory)[]
82
+ classicIntegrations?: ClassicIntegrationSource[]
83
+ }
84
+
85
+ export interface InitOptions {
86
+ /**
87
+ * Disables storing any data on the client-side via cookies or localstorage.
88
+ * Defaults to `false`.
89
+ *
90
+ */
91
+ disableClientPersistence?: boolean
92
+ /**
93
+ * Disables automatically converting ISO string event properties into Dates.
94
+ * ISO string to Date conversions occur right before sending events to a classic device mode integration,
95
+ * after any destination middleware have been ran.
96
+ * Defaults to `false`.
97
+ */
98
+ disableAutoISOConversion?: boolean
99
+ initialPageview?: boolean
100
+ cookie?: CookieOptions
101
+ storage?: StorageSettings
102
+ user?: UserOptions
103
+ group?: UserOptions
104
+ integrations?: Integrations
105
+ plan?: Plan
106
+ retryQueue?: boolean
107
+ obfuscate?: boolean
108
+ /**
109
+ * This callback allows you to update/mutate CDN Settings.
110
+ * This is called directly after settings are fetched from the CDN.
111
+ */
112
+ updateCDNSettings?: (settings: LegacySettings) => LegacySettings
113
+ /**
114
+ * Disables or sets constraints on processing of query string parameters
115
+ */
116
+ useQueryString?:
117
+ | boolean
118
+ | {
119
+ aid?: RegExp
120
+ uid?: RegExp
121
+ }
122
+ /**
123
+ * Array of high entropy Client Hints to request. These may be rejected by the user agent - only required hints should be requested.
124
+ */
125
+ highEntropyValuesClientHints?: HighEntropyHint[]
126
+ /**
127
+ * When using the snippet, this is the key that points to the global analytics instance (e.g. window.htevents).
128
+ * default: analytics
129
+ */
130
+ globalAnalyticsKey?: string
131
+
132
+ /**
133
+ * Shortcuts for overriding the default Hightouch.io integration settings
134
+ */
135
+ apiHost?: string // Defaults to us-east-1.hightouch-events.com
136
+ protocol?: string // Defaults to https
137
+ batching?: boolean // Defaults to true
138
+ }
139
+
140
+ /* analytics-classic stubs */
141
+ function _stub(this: never) {
142
+ console.warn(deprecationWarning)
143
+ }
144
+
145
+ export class Analytics
146
+ extends Emitter
147
+ implements AnalyticsCore, AnalyticsClassic
148
+ {
149
+ protected settings: AnalyticsSettings
150
+ private _user: User
151
+ private _group: Group
152
+ private eventFactory: EventFactory
153
+ private _debug = false
154
+ private _universalStorage: UniversalStorage
155
+
156
+ initialized = false
157
+ integrations: Integrations
158
+ options: InitOptions
159
+ queue: EventQueue
160
+
161
+ constructor(
162
+ settings: AnalyticsSettings,
163
+ options?: InitOptions,
164
+ queue?: EventQueue,
165
+ user?: User,
166
+ group?: Group
167
+ ) {
168
+ super()
169
+ const cookieOptions = options?.cookie
170
+ const disablePersistance = options?.disableClientPersistence ?? false
171
+ this.settings = settings
172
+ this.settings.timeout = this.settings.timeout ?? 300
173
+ this.queue =
174
+ queue ??
175
+ createDefaultQueue(
176
+ `${settings.writeKey}:event-queue`,
177
+ options?.retryQueue,
178
+ disablePersistance
179
+ )
180
+
181
+ const storageSetting = options?.storage
182
+ this._universalStorage = this.createStore(
183
+ disablePersistance,
184
+ storageSetting,
185
+ cookieOptions
186
+ )
187
+
188
+ this._user =
189
+ user ??
190
+ new User(
191
+ {
192
+ persist: !disablePersistance,
193
+ storage: options?.storage,
194
+ // Any User specific options override everything else
195
+ ...options?.user,
196
+ },
197
+ cookieOptions
198
+ ).load()
199
+ this._group =
200
+ group ??
201
+ new Group(
202
+ {
203
+ persist: !disablePersistance,
204
+ storage: options?.storage,
205
+ // Any group specific options override everything else
206
+ ...options?.group,
207
+ },
208
+ cookieOptions
209
+ ).load()
210
+ this.eventFactory = new EventFactory(this._user)
211
+ this.integrations = options?.integrations ?? {}
212
+ this.options = options ?? {}
213
+ autoBind(this)
214
+ }
215
+
216
+ user = (): User => {
217
+ return this._user
218
+ }
219
+
220
+ /**
221
+ * Creates the storage system based on the settings received
222
+ * @returns Storage
223
+ */
224
+ private createStore(
225
+ disablePersistance: boolean,
226
+ storageSetting: InitOptions['storage'],
227
+ cookieOptions?: CookieOptions | undefined
228
+ ): UniversalStorage {
229
+ // DisablePersistance option overrides all, no storage will be used outside of memory even if specified
230
+ if (disablePersistance) {
231
+ return new UniversalStorage([new MemoryStorage()])
232
+ } else {
233
+ if (storageSetting) {
234
+ if (isArrayOfStoreType(storageSetting)) {
235
+ // We will create the store with the priority for customer settings
236
+ return new UniversalStorage(
237
+ initializeStorages(
238
+ applyCookieOptions(storageSetting.stores, cookieOptions)
239
+ )
240
+ )
241
+ }
242
+ }
243
+ }
244
+ // We default to our multi storage with priority
245
+ return new UniversalStorage(
246
+ initializeStorages([
247
+ StoreType.LocalStorage,
248
+ {
249
+ name: StoreType.Cookie,
250
+ settings: cookieOptions,
251
+ },
252
+ StoreType.Memory,
253
+ ])
254
+ )
255
+ }
256
+
257
+ get storage(): UniversalStorage {
258
+ return this._universalStorage
259
+ }
260
+
261
+ async track(...args: EventParams): Promise<DispatchedEvent> {
262
+ const pageCtx = popPageContext(args)
263
+ const [name, data, opts, cb] = resolveArguments(...args)
264
+
265
+ const hightouchEvent = this.eventFactory.track(
266
+ name,
267
+ data as EventProperties,
268
+ opts,
269
+ this.integrations,
270
+ pageCtx
271
+ )
272
+
273
+ return this._dispatch(hightouchEvent, cb).then((ctx) => {
274
+ this.emit('track', name, ctx.event.properties, ctx.event.options)
275
+ return ctx
276
+ })
277
+ }
278
+
279
+ async page(...args: PageParams): Promise<DispatchedEvent> {
280
+ const pageCtx = popPageContext(args)
281
+ const [category, page, properties, options, callback] =
282
+ resolvePageArguments(...args)
283
+
284
+ const hightouchEvent = this.eventFactory.page(
285
+ category,
286
+ page,
287
+ properties,
288
+ options,
289
+ this.integrations,
290
+ pageCtx
291
+ )
292
+
293
+ return this._dispatch(hightouchEvent, callback).then((ctx) => {
294
+ this.emit('page', category, page, ctx.event.properties, ctx.event.options)
295
+ return ctx
296
+ })
297
+ }
298
+
299
+ async identify(...args: IdentifyParams): Promise<DispatchedEvent> {
300
+ const pageCtx = popPageContext(args)
301
+ const [id, _traits, options, callback] = resolveUserArguments(this._user)(
302
+ ...args
303
+ )
304
+
305
+ this._user.identify(id, _traits)
306
+ const hightouchEvent = this.eventFactory.identify(
307
+ this._user.id(),
308
+ this._user.traits(),
309
+ options,
310
+ this.integrations,
311
+ pageCtx
312
+ )
313
+
314
+ return this._dispatch(hightouchEvent, callback).then((ctx) => {
315
+ this.emit(
316
+ 'identify',
317
+ ctx.event.userId,
318
+ ctx.event.traits,
319
+ ctx.event.options
320
+ )
321
+ return ctx
322
+ })
323
+ }
324
+
325
+ group(): Group
326
+ group(...args: GroupParams): Promise<DispatchedEvent>
327
+ group(...args: GroupParams): Promise<DispatchedEvent> | Group {
328
+ const pageCtx = popPageContext(args)
329
+ if (args.length === 0) {
330
+ return this._group
331
+ }
332
+
333
+ const [id, _traits, options, callback] = resolveUserArguments(this._group)(
334
+ ...args
335
+ )
336
+
337
+ this._group.identify(id, _traits)
338
+ const groupId = this._group.id()
339
+ const groupTraits = this._group.traits()
340
+
341
+ const hightouchEvent = this.eventFactory.group(
342
+ groupId,
343
+ groupTraits,
344
+ options,
345
+ this.integrations,
346
+ pageCtx
347
+ )
348
+
349
+ return this._dispatch(hightouchEvent, callback).then((ctx) => {
350
+ this.emit('group', ctx.event.groupId, ctx.event.traits, ctx.event.options)
351
+ return ctx
352
+ })
353
+ }
354
+
355
+ async alias(...args: AliasParams): Promise<DispatchedEvent> {
356
+ const pageCtx = popPageContext(args)
357
+ const [to, from, options, callback] = resolveAliasArguments(...args)
358
+ const hightouchEvent = this.eventFactory.alias(
359
+ to,
360
+ from,
361
+ options,
362
+ this.integrations,
363
+ pageCtx
364
+ )
365
+ return this._dispatch(hightouchEvent, callback).then((ctx) => {
366
+ this.emit('alias', to, from, ctx.event.options)
367
+ return ctx
368
+ })
369
+ }
370
+
371
+ async screen(...args: PageParams): Promise<DispatchedEvent> {
372
+ const pageCtx = popPageContext(args)
373
+ const [category, page, properties, options, callback] =
374
+ resolvePageArguments(...args)
375
+
376
+ const hightouchEvent = this.eventFactory.screen(
377
+ category,
378
+ page,
379
+ properties,
380
+ options,
381
+ this.integrations,
382
+ pageCtx
383
+ )
384
+ return this._dispatch(hightouchEvent, callback).then((ctx) => {
385
+ this.emit(
386
+ 'screen',
387
+ category,
388
+ page,
389
+ ctx.event.properties,
390
+ ctx.event.options
391
+ )
392
+ return ctx
393
+ })
394
+ }
395
+
396
+ async trackClick(...args: LinkArgs): Promise<Analytics> {
397
+ const autotrack = await import(
398
+ /* webpackChunkName: "auto-track" */ '../auto-track'
399
+ )
400
+ return autotrack.link.call(this, ...args)
401
+ }
402
+
403
+ async trackLink(...args: LinkArgs): Promise<Analytics> {
404
+ const autotrack = await import(
405
+ /* webpackChunkName: "auto-track" */ '../auto-track'
406
+ )
407
+ return autotrack.link.call(this, ...args)
408
+ }
409
+
410
+ async trackSubmit(...args: FormArgs): Promise<Analytics> {
411
+ const autotrack = await import(
412
+ /* webpackChunkName: "auto-track" */ '../auto-track'
413
+ )
414
+ return autotrack.form.call(this, ...args)
415
+ }
416
+
417
+ async trackForm(...args: FormArgs): Promise<Analytics> {
418
+ const autotrack = await import(
419
+ /* webpackChunkName: "auto-track" */ '../auto-track'
420
+ )
421
+ return autotrack.form.call(this, ...args)
422
+ }
423
+
424
+ async register(...plugins: Plugin[]): Promise<Context> {
425
+ const ctx = Context.system()
426
+
427
+ const registrations = plugins.map((xt) =>
428
+ this.queue.register(ctx, xt, this)
429
+ )
430
+ await Promise.all(registrations)
431
+
432
+ return ctx
433
+ }
434
+
435
+ async deregister(...plugins: string[]): Promise<Context> {
436
+ const ctx = Context.system()
437
+
438
+ const deregistrations = plugins.map((pl) => {
439
+ const plugin = this.queue.plugins.find((p) => p.name === pl)
440
+ if (plugin) {
441
+ return this.queue.deregister(ctx, plugin, this)
442
+ } else {
443
+ ctx.log('warn', `plugin ${pl} not found`)
444
+ }
445
+ })
446
+
447
+ await Promise.all(deregistrations)
448
+
449
+ return ctx
450
+ }
451
+
452
+ debug(toggle: boolean): Analytics {
453
+ // Make sure legacy ajs debug gets turned off if it was enabled before upgrading.
454
+ if (toggle === false && localStorage.getItem('debug')) {
455
+ localStorage.removeItem('debug')
456
+ }
457
+ this._debug = toggle
458
+ return this
459
+ }
460
+
461
+ startSession(sessionId?: number): void {
462
+ this._user.startManualSession(sessionId)
463
+ }
464
+
465
+ endSession(): void {
466
+ this._user.endManualSession()
467
+ }
468
+
469
+ getSessionId(): number | null {
470
+ return this._user.sessionId() ?? null
471
+ }
472
+
473
+ reset(): void {
474
+ this._user.reset()
475
+ this._group.reset()
476
+ this.emit('reset')
477
+ }
478
+
479
+ timeout(timeout: number): void {
480
+ this.settings.timeout = timeout
481
+ }
482
+
483
+ private async _dispatch(
484
+ event: HightouchEvent,
485
+ callback?: Callback
486
+ ): Promise<DispatchedEvent> {
487
+ const ctx = new Context(event)
488
+ if (isOffline() && !this.options.retryQueue) {
489
+ return ctx
490
+ }
491
+ return dispatch(ctx, this.queue, this, {
492
+ callback,
493
+ debug: this._debug,
494
+ timeout: this.settings.timeout,
495
+ })
496
+ }
497
+
498
+ async addSourceMiddleware(fn: MiddlewareFunction): Promise<Analytics> {
499
+ await this.queue.criticalTasks.run(async () => {
500
+ const { sourceMiddlewarePlugin } = await import(
501
+ /* webpackChunkName: "middleware" */ '../../plugins/middleware'
502
+ )
503
+
504
+ const integrations: Record<string, boolean> = {}
505
+ this.queue.plugins.forEach((plugin) => {
506
+ if (plugin.type === 'destination') {
507
+ return (integrations[plugin.name] = true)
508
+ }
509
+ })
510
+
511
+ const plugin = sourceMiddlewarePlugin(fn, integrations)
512
+ await this.register(plugin)
513
+ })
514
+
515
+ return this
516
+ }
517
+
518
+ /* TODO: This does not have to return a promise? */
519
+ addDestinationMiddleware(
520
+ integrationName: string,
521
+ ...middlewares: DestinationMiddlewareFunction[]
522
+ ): Promise<Analytics> {
523
+ const legacyDestinations = this.queue.plugins.filter(
524
+ (xt) => xt.name.toLowerCase() === integrationName.toLowerCase()
525
+ ) as LegacyDestination[]
526
+
527
+ legacyDestinations.forEach((destination) => {
528
+ destination.addMiddleware(...middlewares)
529
+ })
530
+ return Promise.resolve(this)
531
+ }
532
+
533
+ setAnonymousId(id?: string): ID {
534
+ return this._user.anonymousId(id)
535
+ }
536
+
537
+ async queryString(query: string): Promise<Context[]> {
538
+ if (this.options.useQueryString === false) {
539
+ return []
540
+ }
541
+
542
+ const { queryString } = await import(
543
+ /* webpackChunkName: "queryString" */ '../query-string'
544
+ )
545
+ return queryString(this, query)
546
+ }
547
+
548
+ /**
549
+ * @deprecated This function does not register a destination plugin.
550
+ *
551
+ * Instantiates a legacy Analytics.js destination.
552
+ *
553
+ * This function does not register the destination as an Analytics.JS plugin,
554
+ * all the it does it to invoke the factory function back.
555
+ */
556
+ use(legacyPluginFactory: (analytics: Analytics) => void): Analytics {
557
+ legacyPluginFactory(this)
558
+ return this
559
+ }
560
+
561
+ async ready(
562
+ callback: Function = (res: Promise<unknown>[]): Promise<unknown>[] => res
563
+ ): Promise<unknown> {
564
+ return Promise.all(
565
+ this.queue.plugins.map((i) => (i.ready ? i.ready() : Promise.resolve()))
566
+ ).then((res) => {
567
+ callback(res)
568
+ return res
569
+ })
570
+ }
571
+
572
+ // analytics-classic api
573
+
574
+ noConflict(): Analytics {
575
+ console.warn(deprecationWarning)
576
+ setGlobalAnalytics(_analytics ?? this)
577
+ return this
578
+ }
579
+
580
+ normalize(msg: HightouchEvent): HightouchEvent {
581
+ console.warn(deprecationWarning)
582
+ return this.eventFactory.normalize(msg)
583
+ }
584
+
585
+ get failedInitializations(): string[] {
586
+ console.warn(deprecationWarning)
587
+ return this.queue.failedInitializations
588
+ }
589
+
590
+ get VERSION(): string {
591
+ return version
592
+ }
593
+
594
+ /* @deprecated - noop */
595
+ async initialize(
596
+ _settings?: AnalyticsSettings,
597
+ _options?: InitOptions
598
+ ): Promise<Analytics> {
599
+ console.warn(deprecationWarning)
600
+ return Promise.resolve(this)
601
+ }
602
+
603
+ init = this.initialize.bind(this)
604
+
605
+ async pageview(url: string): Promise<Analytics> {
606
+ console.warn(deprecationWarning)
607
+ await this.page({ path: url })
608
+ return this
609
+ }
610
+
611
+ get plugins() {
612
+ console.warn(deprecationWarning)
613
+ // @ts-expect-error
614
+ return this._plugins ?? {}
615
+ }
616
+
617
+ get Integrations() {
618
+ console.warn(deprecationWarning)
619
+ const integrations = this.queue.plugins
620
+ .filter((plugin) => plugin.type === 'destination')
621
+ .reduce((acc, plugin) => {
622
+ const name = `${plugin.name
623
+ .toLowerCase()
624
+ .replace('.', '')
625
+ .split(' ')
626
+ .join('-')}Integration`
627
+
628
+ // @ts-expect-error
629
+ const integration = window[name] as
630
+ | (LegacyIntegration & { Integration?: LegacyIntegration })
631
+ | undefined
632
+
633
+ if (!integration) {
634
+ return acc
635
+ }
636
+
637
+ const nested = integration.Integration // hack - Google Analytics function resides in the "Integration" field
638
+ if (nested) {
639
+ acc[plugin.name] = nested
640
+ return acc
641
+ }
642
+
643
+ acc[plugin.name] = integration as LegacyIntegration
644
+ return acc
645
+ }, {} as Record<string, LegacyIntegration>)
646
+
647
+ return integrations
648
+ }
649
+
650
+ log = _stub
651
+ addIntegrationMiddleware = _stub
652
+ listeners = _stub
653
+ addEventListener = _stub
654
+ removeAllListeners = _stub
655
+ removeListener = _stub
656
+ removeEventListener = _stub
657
+ hasListeners = _stub
658
+ add = _stub
659
+ addIntegration = _stub
660
+
661
+ // snippet function
662
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
663
+ push(args: any[]) {
664
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
665
+ const an = this as any
666
+ const method = args.shift()
667
+ if (method) {
668
+ if (!an[method]) return
669
+ }
670
+ an[method].apply(this, args)
671
+ }
672
+ }