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,101 @@
1
+ import jar from 'js-cookie'
2
+ import { User } from '..'
3
+ import { LocalStorage } from '../../storage'
4
+
5
+ function clear(): void {
6
+ document.cookie.split(';').forEach(function (c) {
7
+ document.cookie = c
8
+ .replace(/^ +/, '')
9
+ .replace(/=.*/, '=;expires=' + new Date().toUTCString() + ';path=/')
10
+ })
11
+ localStorage.clear()
12
+ }
13
+
14
+ let store: LocalStorage
15
+ beforeEach(function () {
16
+ store = new LocalStorage()
17
+ clear()
18
+ // Restore any cookie, localstorage disable
19
+ jest.restoreAllMocks()
20
+ jest.spyOn(console, 'warn').mockImplementation(() => {}) // silence console spam.
21
+ })
22
+
23
+ const anonymousIdKey = 'htjs_anonymous_id'
24
+ const rudderHtAnonymousIdKey = 'htev_anonymous_id'
25
+ const segmentAnonymousIdKey = 'ajs_anonymous_id'
26
+ const rudderAnonymousIdKey = 'rl_anonymous_id'
27
+
28
+ describe('user anonymousId migration', () => {
29
+ describe('()', () => {
30
+ it('should get the hightouch anonymousId', () => {
31
+ store.set(anonymousIdKey, '1234')
32
+ const user = new User()
33
+ expect(user.anonymousId()).toEqual('1234')
34
+ })
35
+
36
+ it('should decrypt the "legacy" hightouch anonymousId', () => {
37
+ store.set(
38
+ rudderHtAnonymousIdKey,
39
+ 'HtEvEncrypt:U2FsdGVkX1+BxLsjF52p24D/rVEQfG9ACRjvLRoSgbnfLYlWBmBCWABZPMsDHWySVO4c26kYs2hxrT13q8amlw=='
40
+ )
41
+ const user = new User()
42
+ expect(user.anonymousId()).toEqual('c027ce91-f759-4f91-96d4-985eaa146346')
43
+
44
+ store.remove(rudderHtAnonymousIdKey)
45
+ const user2 = new User()
46
+ expect(user2.anonymousId()).toEqual(
47
+ 'c027ce91-f759-4f91-96d4-985eaa146346'
48
+ )
49
+ expect(store.get(anonymousIdKey)).toEqual(
50
+ 'c027ce91-f759-4f91-96d4-985eaa146346'
51
+ )
52
+ expect(store.get(rudderHtAnonymousIdKey)).toEqual(null)
53
+ })
54
+
55
+ it('should get the segment anonymousId', () => {
56
+ store.set(segmentAnonymousIdKey, '56789')
57
+ const user = new User()
58
+ expect(user.anonymousId()).toEqual('56789')
59
+ })
60
+
61
+ it('should get the unencrypted rudder anonymousId', () => {
62
+ jar.set(rudderAnonymousIdKey, '56789')
63
+ const user = new User()
64
+ expect(user.anonymousId()).toEqual('56789')
65
+ })
66
+
67
+ it('should get the v3 "encrypted" rudder anonymousId', () => {
68
+ jar.set(rudderAnonymousIdKey, 'RS_ENC_v3_dGVzdC1kYXRh')
69
+ const user = new User()
70
+ expect(user.anonymousId()).toEqual('test-data')
71
+ })
72
+
73
+ it('should get the v1 "encrypted" rudder anonymousId', () => {
74
+ jar.set(
75
+ rudderAnonymousIdKey,
76
+ 'RudderEncrypt:U2FsdGVkX1+5q5jikppUASe8AdIH6O2iORyF41sYXgxzIGiX9whSeVxxww0OK5h/'
77
+ )
78
+ const user = new User()
79
+ expect(user.anonymousId()).toEqual('1wefk7M3Y1D6EDX4ZpIE00LpKAE')
80
+ })
81
+
82
+ it('should always choose the hightouch anonymousId when present', () => {
83
+ store.set(segmentAnonymousIdKey, '56789')
84
+ jar.set(anonymousIdKey, '1234')
85
+ const user = new User()
86
+ expect(user.anonymousId()).toEqual('1234')
87
+ })
88
+
89
+ it('should migrate the anonymousId', () => {
90
+ store.set(segmentAnonymousIdKey, '56789')
91
+ const user = new User()
92
+ expect(user.anonymousId()).toEqual('56789')
93
+
94
+ store.remove(segmentAnonymousIdKey)
95
+ const user2 = new User()
96
+ expect(user2.anonymousId()).toEqual('56789')
97
+ expect(store.get(anonymousIdKey)).toEqual('56789')
98
+ expect(store.get(segmentAnonymousIdKey)).toEqual(null)
99
+ })
100
+ })
101
+ })
@@ -0,0 +1,136 @@
1
+ import { User } from '..'
2
+ import { LocalStorage } from '../../storage'
3
+ import { SessionInfo } from '../../session'
4
+
5
+ function clear(): void {
6
+ document.cookie.split(';').forEach(function (c) {
7
+ document.cookie = c
8
+ .replace(/^ +/, '')
9
+ .replace(/=.*/, '=;expires=' + new Date().toUTCString() + ';path=/')
10
+ })
11
+ localStorage.clear()
12
+ }
13
+
14
+ let store: LocalStorage
15
+ beforeEach(function () {
16
+ store = new LocalStorage()
17
+ clear()
18
+ // Restore any cookie, localstorage disable
19
+ jest.restoreAllMocks()
20
+ jest.spyOn(console, 'warn').mockImplementation(() => {}) // silence console spam.
21
+ })
22
+
23
+ const seshKey = 'htjs_sesh'
24
+
25
+ describe('user anonymousId migration', () => {
26
+ describe('()', () => {
27
+ it('should create a session', () => {
28
+ const user = new User()
29
+ const session = user.getAndUpdateSession()
30
+ expect(session?.sessionStart).toEqual(true)
31
+ expect(session?.sessionId).toBeTruthy()
32
+
33
+ const sesh = store.get(seshKey) as unknown as SessionInfo
34
+ expect(sesh.expiresAt).toBeTruthy()
35
+ expect(sesh.autoTrack).toBeTruthy()
36
+ })
37
+
38
+ it('should update an existing session', () => {
39
+ const user = new User()
40
+ const session = user.getAndUpdateSession()
41
+ const sesh = store.get(seshKey) as unknown as SessionInfo
42
+ expect(session?.sessionStart).toEqual(true)
43
+ expect(session?.sessionId).toBeTruthy()
44
+
45
+ const updated = user.getAndUpdateSession()
46
+ const updatedSesh = store.get(seshKey) as unknown as SessionInfo
47
+ expect(updated?.sessionStart).toEqual(undefined)
48
+ expect(updated?.sessionId).toEqual(session?.sessionId)
49
+ expect(updatedSesh.expiresAt).toEqual(sesh.expiresAt! + sesh.timeout!)
50
+ })
51
+
52
+ it('should not create a session if autoTrack is disabled', () => {
53
+ const user = new User({ sessions: { autoTrack: false } })
54
+ const session = user.getAndUpdateSession()
55
+ expect(session).toEqual({})
56
+ })
57
+
58
+ it('should be able to start and end manual sessions', () => {
59
+ const user = new User({ sessions: { autoTrack: false } })
60
+ const session = user.getAndUpdateSession()
61
+ expect(session).toEqual({})
62
+
63
+ user.startManualSession()
64
+ const sessionId = user.sessionId()
65
+ const sesh = store.get(seshKey) as unknown as SessionInfo
66
+
67
+ expect(sesh).toEqual({
68
+ id: sessionId,
69
+ manualTrack: true,
70
+ sessionStart: true,
71
+ })
72
+
73
+ // first call sets it as no longer being the start of the session
74
+ const firstCall = user.getAndUpdateSession()
75
+ expect(firstCall).toEqual({ sessionId })
76
+ // subsequent calls do not change the session
77
+ const secondCall = user.getAndUpdateSession()
78
+ expect(secondCall).toEqual({ sessionId })
79
+ const thirdCall = user.getAndUpdateSession()
80
+ expect(thirdCall).toEqual({ sessionId })
81
+
82
+ // ending the session should clear the session
83
+ user.endManualSession()
84
+ // this should NOT auto create another session
85
+ // autoTrack was disabled during User init
86
+ const ended = user.getAndUpdateSession()
87
+ expect(ended).toEqual({})
88
+ })
89
+
90
+ it('should end an autoTrack session when manualSession is called', () => {
91
+ const user = new User()
92
+ const session = user.getAndUpdateSession()
93
+ const sesh = store.get(seshKey) as unknown as SessionInfo
94
+ expect(session?.sessionStart).toEqual(true)
95
+ expect(session?.sessionId).toBeTruthy()
96
+ expect(sesh?.sessionStart).toEqual(true)
97
+ expect(sesh?.expiresAt).toBeTruthy()
98
+ expect(sesh?.autoTrack).toBeTruthy()
99
+
100
+ user.startManualSession(23114123412)
101
+ const newSesh = store.get(seshKey) as unknown as SessionInfo
102
+ const newSession = user.getAndUpdateSession()
103
+ expect(newSession?.sessionId === session?.sessionId).toBe(false)
104
+ expect(newSesh).toEqual({
105
+ id: newSession?.sessionId,
106
+ manualTrack: true,
107
+ sessionStart: true,
108
+ })
109
+
110
+ // ending the manual session should return to auto track
111
+ user.endManualSession()
112
+ const autoSession = user.getAndUpdateSession()
113
+ const autoSesh = store.get(seshKey) as unknown as SessionInfo
114
+ expect(autoSession?.sessionStart).toEqual(true)
115
+ expect(autoSession?.sessionId).toBeTruthy()
116
+ expect(autoSesh?.sessionStart).toEqual(true)
117
+ expect(autoSesh?.expiresAt).toBeTruthy()
118
+ expect(autoSesh?.autoTrack).toBeTruthy()
119
+ })
120
+
121
+ it('should get a sessionId without affecting the session', () => {
122
+ const user = new User()
123
+ const session = user.getAndUpdateSession()
124
+ const sesh = store.get(seshKey) as unknown as SessionInfo
125
+ expect(session?.sessionId).toBeTruthy()
126
+
127
+ user.sessionId()
128
+ user.sessionId()
129
+ user.sessionId()
130
+ const notUpdated = store.get(seshKey) as unknown as SessionInfo
131
+ expect(user.sessionId()).toEqual(session?.sessionId)
132
+ expect(notUpdated.expiresAt).toEqual(sesh.expiresAt)
133
+ expect(notUpdated.id).toEqual(sesh.id)
134
+ })
135
+ })
136
+ })
@@ -0,0 +1,36 @@
1
+ import cookie from 'js-cookie'
2
+ import { tld } from '../tld'
3
+ import assert from 'assert'
4
+
5
+ describe('topDomain', function () {
6
+ beforeEach(() => {
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ const cookies: Record<string, any> = {}
9
+
10
+ // @ts-ignore
11
+ jest.spyOn(cookie, 'set').mockImplementation((key, val, opts) => {
12
+ const parts = opts?.domain?.split('.') ?? []
13
+ if (parts[1] === 'co') return
14
+ cookies[key] = val
15
+ return val
16
+ })
17
+
18
+ // @ts-ignore
19
+ jest.spyOn(cookie, 'get').mockImplementation((key) => {
20
+ return cookies[key]
21
+ })
22
+ })
23
+
24
+ it('should match the following urls', function () {
25
+ assert.strictEqual(tld('http://www.google.com'), 'google.com')
26
+ assert.strictEqual(
27
+ tld('http://gist.github.com/calvinfo/some_file'),
28
+ 'github.com'
29
+ )
30
+ assert.strictEqual(tld('http://localhost:3000'), undefined)
31
+ assert.strictEqual(tld('https://google.com:443/stuff'), 'google.com')
32
+ assert.strictEqual(tld('http://dev:3000'), undefined)
33
+ assert.strictEqual(tld('http://app.jut.io'), 'jut.io')
34
+ assert.strictEqual(tld('http://app.hightouch.io'), 'hightouch.io')
35
+ })
36
+ })
@@ -0,0 +1,399 @@
1
+ import { v4 as uuid } from '@lukeed/uuid'
2
+ import autoBind from '../../lib/bind-all'
3
+ import { Traits } from '../events'
4
+ import {
5
+ CookieOptions,
6
+ UniversalStorage,
7
+ MemoryStorage,
8
+ StorageObject,
9
+ StorageSettings,
10
+ StoreType,
11
+ applyCookieOptions,
12
+ initializeStorages,
13
+ isArrayOfStoreType,
14
+ } from '../storage'
15
+ import { decryptRudderValue, decryptRudderHtValue } from './migrate'
16
+ import {
17
+ SessionContext,
18
+ SessionInfo,
19
+ generateAutoTrackingSession,
20
+ generateManualTrackingSession,
21
+ hasSessionExpired,
22
+ updateSessionExpiration,
23
+ } from '../session'
24
+
25
+ export type ID = string | null | undefined
26
+
27
+ export interface UserOptions {
28
+ /**
29
+ * Disables storing any data about the user.
30
+ */
31
+ disable?: boolean
32
+ localStorageFallbackDisabled?: boolean
33
+ persist?: boolean
34
+
35
+ cookie?: {
36
+ key?: string
37
+ oldKey?: string
38
+ }
39
+
40
+ localStorage?: {
41
+ key: string
42
+ }
43
+
44
+ sessions?: {
45
+ autoTrack?: boolean
46
+ timeout?: number // milliseconds
47
+ }
48
+
49
+ /**
50
+ * Store priority
51
+ * @example stores: [StoreType.Cookie, StoreType.Memory]
52
+ */
53
+ storage?: StorageSettings
54
+ }
55
+
56
+ const defaults = {
57
+ persist: true,
58
+ cookie: {
59
+ key: 'htjs_user_id',
60
+ oldKey: 'ajs_user',
61
+ },
62
+ localStorage: {
63
+ key: 'htjs_user_traits',
64
+ },
65
+ sessions: {
66
+ autoTrack: true,
67
+ },
68
+ }
69
+
70
+ const sessionKey = 'htjs_sesh'
71
+ const anonymousIdKey = 'htjs_anonymous_id'
72
+ const rudderHtAnonymousIdKey = 'htev_anonymous_id'
73
+ const segmentAnonymousIdKey = 'ajs_anonymous_id'
74
+ const rudderAnonymousIdKey = 'rl_anonymous_id'
75
+
76
+ export class User {
77
+ static defaults = defaults
78
+
79
+ private idKey: string
80
+ private traitsKey: string
81
+ private anonKey: string
82
+ private seshKey: string
83
+ private cookieOptions?: CookieOptions
84
+
85
+ private legacyUserStore: UniversalStorage<{
86
+ [k: string]:
87
+ | {
88
+ id?: string
89
+ traits?: Traits
90
+ }
91
+ | string
92
+ }>
93
+ private traitsStore: UniversalStorage<{
94
+ [k: string]: Traits
95
+ }>
96
+
97
+ private identityStore: UniversalStorage<{
98
+ [k: string]: string
99
+ }>
100
+
101
+ private sessionStore: UniversalStorage<{ [k: string]: SessionInfo }>
102
+
103
+ options: UserOptions = {}
104
+
105
+ constructor(options: UserOptions = defaults, cookieOptions?: CookieOptions) {
106
+ this.options = { ...defaults, ...options }
107
+ this.cookieOptions = cookieOptions
108
+
109
+ this.idKey = options.cookie?.key ?? defaults.cookie.key
110
+ this.traitsKey = options.localStorage?.key ?? defaults.localStorage.key
111
+ this.anonKey = anonymousIdKey
112
+ this.seshKey = sessionKey
113
+
114
+ this.identityStore = this.createStorage(this.options, cookieOptions)
115
+
116
+ this.sessionStore = this.createStorage(this.options, cookieOptions)
117
+
118
+ // using only cookies for legacy user store
119
+ this.legacyUserStore = this.createStorage(
120
+ this.options,
121
+ cookieOptions,
122
+ (s) => s === StoreType.Cookie
123
+ )
124
+
125
+ // using only localStorage / memory for traits store
126
+ this.traitsStore = this.createStorage(
127
+ this.options,
128
+ cookieOptions,
129
+ (s) => s !== StoreType.Cookie
130
+ )
131
+
132
+ const legacyUser = this.legacyUserStore.get(defaults.cookie.oldKey)
133
+ if (legacyUser && typeof legacyUser === 'object') {
134
+ legacyUser.id && this.id(legacyUser.id)
135
+ legacyUser.traits && this.traits(legacyUser.traits)
136
+ }
137
+ autoBind(this)
138
+ }
139
+
140
+ id = (id?: ID): ID => {
141
+ if (this.options.disable) {
142
+ return null
143
+ }
144
+
145
+ const prevId = this.identityStore.getAndSync(this.idKey)
146
+
147
+ if (id !== undefined) {
148
+ this.identityStore.set(this.idKey, id)
149
+
150
+ const changingIdentity = id !== prevId && prevId !== null && id !== null
151
+ if (changingIdentity) {
152
+ this.anonymousId(null)
153
+ }
154
+ }
155
+
156
+ const retId = this.identityStore.getAndSync(this.idKey)
157
+ if (retId) return retId
158
+
159
+ const retLeg = this.legacyUserStore.get(defaults.cookie.oldKey)
160
+ return retLeg ? (typeof retLeg === 'object' ? retLeg.id : retLeg) : null
161
+ }
162
+
163
+ private legacySIO(): [string, string] | null {
164
+ const val = this.legacyUserStore.get('_sio') as string
165
+ if (!val) {
166
+ return null
167
+ }
168
+ const [anon, user] = val.split('----')
169
+ return [anon, user]
170
+ }
171
+
172
+ anonymousId = (id?: ID): ID => {
173
+ if (this.options.disable) {
174
+ return null
175
+ }
176
+
177
+ if (id === undefined) {
178
+ let val = this.identityStore.getAndSync(this.anonKey)
179
+
180
+ // support anonymousId migration from other analytics providers
181
+ if (!val) {
182
+ val = decryptRudderHtValue(
183
+ this.identityStore.getAndSync(rudderHtAnonymousIdKey) ?? ''
184
+ )
185
+ if (val) this.identityStore.set(this.anonKey, val)
186
+ }
187
+ if (!val) {
188
+ val = this.identityStore.getAndSync(segmentAnonymousIdKey)
189
+ if (val) this.identityStore.set(this.anonKey, val)
190
+ }
191
+ if (!val) {
192
+ val = decryptRudderValue(
193
+ this.identityStore.getAndSync(rudderAnonymousIdKey) ?? ''
194
+ )
195
+ if (val) this.identityStore.set(this.anonKey, val)
196
+ }
197
+ if (!val) {
198
+ val = this.legacySIO()?.[0] ?? null
199
+ }
200
+
201
+ if (val) {
202
+ return val
203
+ }
204
+ }
205
+
206
+ if (id === null) {
207
+ this.identityStore.set(this.anonKey, null)
208
+ return this.identityStore.getAndSync(this.anonKey)
209
+ }
210
+
211
+ this.identityStore.set(this.anonKey, id ?? uuid())
212
+ return this.identityStore.getAndSync(this.anonKey)
213
+ }
214
+
215
+ traits = (traits?: Traits | null): Traits | undefined => {
216
+ if (this.options.disable) {
217
+ return
218
+ }
219
+
220
+ if (traits === null) {
221
+ traits = {}
222
+ }
223
+
224
+ if (traits) {
225
+ this.traitsStore.set(this.traitsKey, traits ?? {})
226
+ }
227
+
228
+ return this.traitsStore.get(this.traitsKey) ?? {}
229
+ }
230
+
231
+ identify(id?: ID, traits?: Traits): void {
232
+ if (this.options.disable) {
233
+ return
234
+ }
235
+
236
+ traits = traits ?? {}
237
+ const currentId = this.id()
238
+
239
+ if (currentId === null || currentId === id) {
240
+ traits = {
241
+ ...this.traits(),
242
+ ...traits,
243
+ }
244
+ }
245
+
246
+ if (id) {
247
+ this.id(id)
248
+ }
249
+
250
+ this.traits(traits)
251
+ }
252
+
253
+ startManualSession(sessionId?: number) {
254
+ if (this.options.disable) {
255
+ return
256
+ }
257
+ this.sessionStore.clear(this.seshKey)
258
+ const session = generateManualTrackingSession(sessionId)
259
+ this.sessionStore.set(this.seshKey, session)
260
+ }
261
+
262
+ endManualSession() {
263
+ this.sessionStore.clear(this.seshKey)
264
+ }
265
+
266
+ private getAndUpdateSessionInfo(): SessionInfo | null {
267
+ if (this.options.disable) {
268
+ return null
269
+ }
270
+
271
+ let session = this.sessionStore.getAndSync(this.seshKey)
272
+
273
+ if (session == null) {
274
+ if (this.options?.sessions?.autoTrack) {
275
+ session = generateAutoTrackingSession(this.options?.sessions?.timeout)
276
+ this.sessionStore.set(this.seshKey, session)
277
+ return session
278
+ }
279
+ return null
280
+ }
281
+
282
+ if (session?.autoTrack && hasSessionExpired(session.expiresAt!)) {
283
+ session = generateAutoTrackingSession(this.options?.sessions?.timeout)
284
+ this.sessionStore.set(this.seshKey, session)
285
+ return session
286
+ }
287
+
288
+ session = updateSessionExpiration(session)
289
+ this.sessionStore.set(this.seshKey, session)
290
+ return session
291
+ }
292
+
293
+ getAndUpdateSession(): SessionContext | null {
294
+ const sessionInfo = this.getAndUpdateSessionInfo()
295
+ const session: SessionContext = {}
296
+ if (sessionInfo?.id) session.sessionId = sessionInfo.id
297
+ if (sessionInfo?.sessionStart)
298
+ session.sessionStart = sessionInfo.sessionStart
299
+ return session
300
+ }
301
+
302
+ sessionId(): number | null {
303
+ const session = this.sessionStore.getAndSync(this.seshKey)
304
+ return session?.id ?? null
305
+ }
306
+
307
+ logout(): void {
308
+ this.anonymousId(null)
309
+ this.id(null)
310
+ this.traits({})
311
+ }
312
+
313
+ reset(): void {
314
+ this.logout()
315
+ this.identityStore.clear(this.idKey)
316
+ this.identityStore.clear(this.anonKey)
317
+ this.sessionStore.clear(this.seshKey)
318
+ this.traitsStore.clear(this.traitsKey)
319
+ }
320
+
321
+ load(): User {
322
+ return new User(this.options, this.cookieOptions)
323
+ }
324
+
325
+ save(): boolean {
326
+ return true
327
+ }
328
+
329
+ /**
330
+ * Creates the right storage system applying all the user options, cookie options and particular filters
331
+ * @param options UserOptions
332
+ * @param cookieOpts CookieOptions
333
+ * @param filterStores filter function to apply to any StoreTypes (skipped if options specify using a custom storage)
334
+ * @returns a Storage object
335
+ */
336
+ private createStorage<T extends StorageObject = StorageObject>(
337
+ options: UserOptions,
338
+ cookieOpts?: CookieOptions,
339
+ filterStores?: (value: StoreType) => boolean
340
+ ): UniversalStorage<T> {
341
+ let stores: StoreType[] = [
342
+ StoreType.LocalStorage,
343
+ StoreType.Cookie,
344
+ StoreType.Memory,
345
+ ]
346
+
347
+ // If disabled we won't have any storage functionality
348
+ if (options.disable) {
349
+ return new UniversalStorage<T>([])
350
+ }
351
+
352
+ // If persistance is disabled we will always fallback to Memory Storage
353
+ if (!options.persist) {
354
+ return new UniversalStorage<T>([new MemoryStorage<T>()])
355
+ }
356
+
357
+ if (options.storage !== undefined && options.storage !== null) {
358
+ if (isArrayOfStoreType(options.storage)) {
359
+ // If the user only specified order of stores we will still apply filters and transformations e.g. not using localStorage if localStorageFallbackDisabled
360
+ stores = options.storage.stores
361
+ }
362
+ }
363
+
364
+ // Disable LocalStorage
365
+ if (options.localStorageFallbackDisabled) {
366
+ stores = stores.filter((s) => s !== StoreType.LocalStorage)
367
+ }
368
+
369
+ // Apply Additional filters
370
+ if (filterStores) {
371
+ stores = stores.filter(filterStores)
372
+ }
373
+
374
+ return new UniversalStorage(
375
+ initializeStorages(applyCookieOptions(stores, cookieOpts))
376
+ )
377
+ }
378
+ }
379
+
380
+ const groupDefaults: UserOptions = {
381
+ persist: true,
382
+ cookie: {
383
+ key: 'htjs_group_id',
384
+ },
385
+ localStorage: {
386
+ key: 'htjs_group_properties',
387
+ },
388
+ }
389
+
390
+ export class Group extends User {
391
+ constructor(options: UserOptions = groupDefaults, cookie?: CookieOptions) {
392
+ super({ ...groupDefaults, ...options }, cookie)
393
+ autoBind(this)
394
+ }
395
+
396
+ anonymousId = (_id?: ID): ID => {
397
+ return undefined
398
+ }
399
+ }