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,475 @@
1
+ import { CoreContext } from '../context'
2
+ import { ID } from '../user'
3
+ import { DeepNullable } from '../utils/ts-helpers'
4
+
5
+ export type Callback<Ctx extends CoreContext = CoreContext> = (
6
+ ctx: Ctx
7
+ ) => Promise<unknown> | unknown
8
+
9
+ export type HightouchEventType =
10
+ | 'track'
11
+ | 'page'
12
+ | 'identify'
13
+ | 'group'
14
+ | 'alias'
15
+ | 'screen'
16
+
17
+ export type JSONPrimitive = string | number | boolean | null
18
+ export type JSONValue = JSONPrimitive | JSONObject | JSONArray
19
+ export type JSONObject = { [member: string]: JSONValue }
20
+ export type JSONArray = JSONValue[]
21
+
22
+ export type EventProperties = Record<string, any>
23
+
24
+ export type Integrations = {
25
+ All?: boolean
26
+ [integration: string]: boolean | JSONObject | undefined
27
+ }
28
+
29
+ export interface CoreOptions {
30
+ integrations?: Integrations
31
+ timestamp?: Timestamp
32
+ context?: CoreExtraContext
33
+ anonymousId?: string
34
+ userId?: string
35
+ traits?: Traits
36
+ // ugh, this is ugly, but we allow literally any property to be passed to options (which get spread onto the event)
37
+ [key: string]: any
38
+ }
39
+
40
+ /**
41
+ * Context is a dictionary of extra information that provides useful context about a datapoint, for example the user’s ip address or locale. You should only use Context fields for their intended meaning.
42
+ */
43
+ export interface CoreExtraContext {
44
+ /**
45
+ * This is usually used to flag an .identify() call to just update the trait, rather than "last seen".
46
+ */
47
+ active?: boolean
48
+
49
+ /**
50
+ * Current user's IP address.
51
+ */
52
+ ip?: string
53
+
54
+ /**
55
+ * Locale string for the current user, for example en-US.
56
+ * @example en-US
57
+ */
58
+ locale?: string
59
+ /**
60
+ * Dictionary of information about the user’s current location.
61
+ */
62
+ location?: {
63
+ /**
64
+ * @example San Francisco
65
+ */
66
+ city?: string
67
+ /**
68
+ * @example United States
69
+ */
70
+ country?: string
71
+ /**
72
+ * @example 40.2964197
73
+ */
74
+ latitude?: string
75
+ /**
76
+ * @example -76.9411617
77
+ */
78
+ longitude?: string
79
+ /**
80
+ * @example CA
81
+ */
82
+ region?: string
83
+ /**
84
+ * @example 100
85
+ */
86
+ speed?: number
87
+ }
88
+
89
+ /**
90
+ * Dictionary of information about the current web page.
91
+ */
92
+ page?: {
93
+ /**
94
+ * @example /academy/
95
+ */
96
+ path?: string
97
+ /**
98
+ * @example https://www.foo.com/
99
+ */
100
+ referrer?: string
101
+ /**
102
+ * @example projectId=123
103
+ */
104
+ search?: string
105
+ /**
106
+ * @example Analytics Academy
107
+ */
108
+ title?: string
109
+ /**
110
+ * @example https://hightouch.com/academy/
111
+ */
112
+ url?: string
113
+ }
114
+
115
+ /**
116
+ * User agent of the device making the request.
117
+ */
118
+ userAgent?: string
119
+
120
+ /**
121
+ * User agent data returned by the Client Hints API
122
+ */
123
+ userAgentData?: {
124
+ brands?: {
125
+ brand: string
126
+ version: string
127
+ }[]
128
+ mobile?: boolean
129
+ platform?: string
130
+ architecture?: string
131
+ bitness?: string
132
+ model?: string
133
+ platformVersion?: string
134
+ /** @deprecated in favour of fullVersionList */
135
+ uaFullVersion?: string
136
+ fullVersionList?: {
137
+ brand: string
138
+ version: string
139
+ }[]
140
+ wow64?: boolean
141
+ }
142
+
143
+ /**
144
+ * Information about the current library.
145
+ *
146
+ * **Automatically filled out by the library.**
147
+ *
148
+ * This type should probably be "never"
149
+ */
150
+ library?: {
151
+ /**
152
+ * @example analytics-node-next/latest
153
+ */
154
+ name: string
155
+ /**
156
+ * @example "1.43.1"
157
+ */
158
+ version: string
159
+ }
160
+
161
+ /**
162
+ * This is useful in cases where you need to track an event,
163
+ * but also associate information from a previous identify call.
164
+ * You should fill this object the same way you would fill traits in an identify call.
165
+ */
166
+ traits?: Traits
167
+
168
+ /**
169
+ * Dictionary of information about the campaign that resulted in the API call, containing name, source, medium, term, content, and any other custom UTM parameter.
170
+ */
171
+ campaign?: Campaign
172
+
173
+ /**
174
+ * Dictionary of information about the way the user was referred to the website or app.
175
+ */
176
+ referrer?: {
177
+ type?: string
178
+ name?: string
179
+ url?: string
180
+ link?: string
181
+
182
+ id?: string // undocumented
183
+ btid?: string // undocumented?
184
+ urid?: string // undocumented?
185
+ }
186
+
187
+ amp?: {
188
+ // undocumented?
189
+ id: string
190
+ }
191
+
192
+ [key: string]: any
193
+ }
194
+
195
+ export interface CoreHightouchEvent {
196
+ messageId?: string
197
+ type: HightouchEventType
198
+
199
+ // page specific
200
+ category?: string
201
+ name?: string
202
+
203
+ properties?: EventProperties
204
+
205
+ traits?: Traits // Traits is only defined in 'identify' and 'group', even if it can be passed in other calls.
206
+
207
+ integrations?: Integrations
208
+ context?: CoreExtraContext
209
+ options?: CoreOptions
210
+
211
+ userId?: ID
212
+ anonymousId?: ID
213
+ groupId?: ID
214
+ previousId?: ID
215
+
216
+ event?: string
217
+
218
+ writeKey?: string
219
+
220
+ sentAt?: Date
221
+
222
+ _metadata?: HightouchEventMetadata
223
+
224
+ timestamp?: Timestamp
225
+ }
226
+
227
+ export interface HightouchEventMetadata {
228
+ failedInitializations?: unknown[]
229
+ bundled?: string[]
230
+ unbundled?: string[]
231
+ nodeVersion?: string
232
+ bundledConfigIds?: string[]
233
+ unbundledConfigIds?: string[]
234
+ bundledIds?: string[]
235
+ }
236
+
237
+ export type Timestamp = Date | string
238
+
239
+ /**
240
+ * A Plan allows users to specify events and which destinations they would like them to be sent to
241
+ */
242
+ export interface Plan {
243
+ track?: TrackPlan
244
+ identify?: TrackPlan
245
+ group?: TrackPlan
246
+ }
247
+
248
+ export interface TrackPlan {
249
+ [key: string]: PlanEvent | undefined
250
+ // __default SHOULD always exist, but marking as optional for extra safety.
251
+ __default?: PlanEvent
252
+ }
253
+
254
+ export interface PlanEvent {
255
+ /**
256
+ * Whether or not this plan event is enabled
257
+ */
258
+ enabled: boolean
259
+ /**
260
+ * Which integrations the plan event applies to
261
+ */
262
+ integrations?: {
263
+ [key: string]: boolean
264
+ }
265
+ }
266
+
267
+ type DbId = string | number // TODO: the docs says that this can only be a string?
268
+ type PhoneNumber = string | number // TODO: the docs say this can only be a string?
269
+
270
+ /**
271
+ * Traits are pieces of information you know about a group.
272
+ * This interface represents reserved traits that Hightouch has standardized.
273
+ */
274
+ type BaseGroupTraits = DeepNullable<{
275
+ /**
276
+ * Street address of a group.
277
+ */
278
+ address?: BaseUserTraits['address']
279
+
280
+ /**
281
+ * URL to an avatar image for the group.
282
+ */
283
+ avatar?: BaseUserTraits['avatar']
284
+
285
+ /**
286
+ * Date the group's account was first created. Hightouch recommends ISO-8601 date strings.
287
+ */
288
+ createdAt?: BaseUserTraits['createdAt']
289
+
290
+ /**
291
+ * Description of a group
292
+ */
293
+ description?: BaseUserTraits['description']
294
+ /**
295
+ * Email address of group.
296
+ */
297
+ email?: BaseUserTraits['email']
298
+ /**
299
+ * Number of employees of a group, typically used for companies.
300
+ */
301
+ employees?: string | number // TODO: the docs says that this must be a string?
302
+
303
+ /**
304
+ * Unique ID in your database for a group.
305
+ */
306
+ id?: BaseUserTraits['id']
307
+
308
+ /**
309
+ * Industry a group is part of.
310
+ */
311
+ industry?: BaseUserTraits['industry']
312
+
313
+ /**
314
+ * Name of a group.
315
+ */
316
+ name?: BaseUserTraits['name']
317
+
318
+ /**
319
+ * Phone number of a group
320
+ */
321
+ phone?: BaseUserTraits['phone']
322
+
323
+ /**
324
+ * Website of a group.
325
+ */
326
+ website?: BaseUserTraits['website']
327
+
328
+ /**
329
+ * Plan that a group is in.
330
+ */
331
+ plan?: BaseUserTraits['plan']
332
+ }>
333
+
334
+ /**
335
+ * Traits are pieces of information you know about a user.
336
+ * This interface represents reserved traits that Hightouch has standardized.
337
+ */
338
+ type BaseUserTraits = DeepNullable<{
339
+ /**
340
+ * Unique ID in your database for a user
341
+ */
342
+ id?: DbId
343
+
344
+ /**
345
+ * Industry a user works in
346
+ */
347
+ industry?: string
348
+
349
+ /**
350
+ * First name of a user.
351
+ */
352
+ firstName?: string
353
+
354
+ /**
355
+ * Last name of a user.
356
+ */
357
+ lastName?: string
358
+
359
+ /**
360
+ * Full name of a user. If you only pass a first and last name Hightouch automatically fills in the full name for you.
361
+ */
362
+ name?: string
363
+
364
+ /**
365
+ * Phone number of a user
366
+ */
367
+ phone?: PhoneNumber
368
+
369
+ /**
370
+ * Title of a user, usually related to their position at a specific company.
371
+ * @example VP of Engineering
372
+ */
373
+ title?: string
374
+
375
+ /**
376
+ * User's username. This should be unique to each user, like the usernames of Twitter or GitHub.
377
+ */
378
+ username?: string
379
+
380
+ /**
381
+ * Website of a user.
382
+ */
383
+ website?: string
384
+
385
+ /**
386
+ * Street address of a user.
387
+ */
388
+ address?: {
389
+ city?: string
390
+ country?: string
391
+ postalCode?: string
392
+ state?: string
393
+ street?: string
394
+ }
395
+ /**
396
+ * Age of a user.
397
+ */
398
+ age?: number
399
+
400
+ /**
401
+ * URL to an avatar image for the user.
402
+ */
403
+ avatar?: string
404
+
405
+ /**
406
+ * User's birthday.
407
+ */
408
+ birthday?: Timestamp
409
+
410
+ /**
411
+ * User's company.
412
+ */
413
+ company?: {
414
+ name?: string
415
+ id?: DbId
416
+ industry?: BaseUserTraits['industry']
417
+ employee_count?: number
418
+ plan?: BaseUserTraits['plan']
419
+ }
420
+
421
+ /**
422
+ Plan that a user is in.
423
+
424
+ * @example enterprise
425
+ */
426
+ plan?: string
427
+
428
+ /**
429
+ * Date the user's account was first created. Hightouch recommends using ISO-8601 date strings.
430
+ */
431
+ createdAt?: Timestamp
432
+
433
+ /**
434
+ * Description of user, such as bio.
435
+ */
436
+ description?: string
437
+
438
+ /**
439
+ * Email address of a user.
440
+ */
441
+ email?: string
442
+
443
+ /**
444
+ * @example female
445
+ */
446
+ gender?: string
447
+ }>
448
+
449
+ /**
450
+ * Traits are pieces of information you know about a group.
451
+ * This interface represents reserved traits that Hightouch has standardized.
452
+ */
453
+ export type GroupTraits = BaseGroupTraits & {
454
+ [customTrait: string]: any
455
+ }
456
+
457
+ /**
458
+ * Traits are pieces of information you know about a user.
459
+ * This interface represents reserved traits that Hightouch has standardized.
460
+ */
461
+ export type UserTraits = BaseUserTraits & {
462
+ [customTrait: string]: any
463
+ }
464
+
465
+ /**
466
+ * Traits are pieces of information you know about a user or group.
467
+ */
468
+ export type Traits = UserTraits | GroupTraits
469
+
470
+ export type Campaign = {
471
+ name: string
472
+ source: string
473
+ medium: string
474
+ [key: string]: string
475
+ }
@@ -0,0 +1,19 @@
1
+ export * from './emitter'
2
+ export * from './emitter/interface'
3
+ export * from './plugins'
4
+ export * from './events/interfaces'
5
+ export * from './events'
6
+ export * from './callback'
7
+ export * from './priority-queue'
8
+ export { backoff } from './priority-queue/backoff'
9
+ export * from './context'
10
+ export * from './queue/event-queue'
11
+ export * from './analytics'
12
+ export * from './analytics/dispatch'
13
+ export * from './validation/helpers'
14
+ export * from './validation/errors'
15
+ export * from './validation/assertions'
16
+ export * from './utils/bind-all'
17
+ export * from './stats'
18
+ export { CoreLogger } from './logger'
19
+ export * from './queue/delivery'
@@ -0,0 +1,66 @@
1
+ import { CoreLogger } from '..'
2
+
3
+ describe(CoreLogger, () => {
4
+ let logger: CoreLogger
5
+
6
+ beforeEach(() => {
7
+ logger = new CoreLogger()
8
+ })
9
+
10
+ it('logs events at different levels', () => {
11
+ logger.log('debug', 'Debugging', { test: 'debug', emoji: '🐛' })
12
+ logger.log('info', 'Info', { test: 'info', emoji: '📰' })
13
+ logger.log('warn', 'Warning', { test: 'warn', emoji: '⚠️' })
14
+ logger.log('error', 'Error', { test: 'error', emoji: '💥' })
15
+
16
+ expect(logger.logs).toEqual([
17
+ {
18
+ extras: {
19
+ emoji: '🐛',
20
+ test: 'debug',
21
+ },
22
+ level: 'debug',
23
+ message: 'Debugging',
24
+ time: expect.any(Date),
25
+ },
26
+ {
27
+ extras: {
28
+ emoji: '📰',
29
+ test: 'info',
30
+ },
31
+ level: 'info',
32
+ message: 'Info',
33
+ time: expect.any(Date),
34
+ },
35
+ {
36
+ extras: {
37
+ emoji: '⚠️',
38
+ test: 'warn',
39
+ },
40
+ level: 'warn',
41
+ message: 'Warning',
42
+ time: expect.any(Date),
43
+ },
44
+ {
45
+ extras: {
46
+ emoji: '💥',
47
+ test: 'error',
48
+ },
49
+ level: 'error',
50
+ message: 'Error',
51
+ time: expect.any(Date),
52
+ },
53
+ ])
54
+ })
55
+
56
+ it('flushes logs to the console', () => {
57
+ jest.spyOn(console, 'table').mockImplementationOnce(() => {})
58
+
59
+ logger.log('info', 'my log')
60
+ logger.log('debug', 'my log')
61
+
62
+ logger.flush()
63
+ expect(console.table).toHaveBeenCalled()
64
+ expect(logger.logs).toEqual([])
65
+ })
66
+ })
@@ -0,0 +1,74 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error'
2
+ export type LogMessage = {
3
+ level: LogLevel
4
+ message: string
5
+ time?: Date
6
+ extras?: Record<string, any>
7
+ }
8
+
9
+ export interface GenericLogger {
10
+ log(level: LogLevel, message: string, extras?: object): void
11
+ flush(): void
12
+ logs: LogMessage[]
13
+ }
14
+
15
+ export class CoreLogger implements GenericLogger {
16
+ private _logs: LogMessage[] = []
17
+
18
+ log(level: LogLevel, message: string, extras?: object) {
19
+ const time = new Date()
20
+ this._logs.push({
21
+ level,
22
+ message,
23
+ time,
24
+ extras,
25
+ })
26
+ }
27
+
28
+ public get logs(): LogMessage[] {
29
+ return this._logs
30
+ }
31
+
32
+ public flush(): void {
33
+ if (this.logs.length > 1) {
34
+ const formatted = this._logs.reduce((logs, log) => {
35
+ const line = {
36
+ ...log,
37
+ json: JSON.stringify(log.extras, null, ' '),
38
+ extras: log.extras,
39
+ }
40
+
41
+ delete line['time']
42
+
43
+ let key = log.time?.toISOString() ?? ''
44
+ if (logs[key]) {
45
+ key = `${key}-${Math.random()}`
46
+ }
47
+
48
+ return {
49
+ ...logs,
50
+ [key]: line,
51
+ }
52
+ }, {} as Record<string, LogMessage>)
53
+
54
+ // ie doesn't like console.table
55
+ if (console.table) {
56
+ console.table(formatted)
57
+ } else {
58
+ console.log(formatted)
59
+ }
60
+ } else {
61
+ this.logs.forEach((logEntry) => {
62
+ const { level, message, extras } = logEntry
63
+
64
+ if (level === 'info' || level === 'debug') {
65
+ console.log(message, extras ?? '')
66
+ } else {
67
+ console[level](message, extras ?? '')
68
+ }
69
+ })
70
+ }
71
+
72
+ this._logs = []
73
+ }
74
+ }
@@ -0,0 +1,43 @@
1
+ import type { CoreAnalytics } from '../analytics'
2
+ import type { CoreContext } from '../context'
3
+
4
+ interface CorePluginConfig {
5
+ options: any
6
+ priority: 'critical' | 'non-critical' // whether AJS should expect this plugin to be loaded before starting event delivery
7
+ }
8
+
9
+ export type PluginType =
10
+ | 'before'
11
+ | 'after'
12
+ | 'destination'
13
+ | 'enrichment'
14
+ | 'utility'
15
+
16
+ // enrichment - modifies the event. Enrichment can happen in parallel, by reducing all changes in the final event. Failures in this stage could halt event delivery.
17
+ // destination - runs in parallel at the end of the lifecycle. Cannot modify the event, can fail and not halt execution.
18
+ // utility - do not affect lifecycle. Should be run and executed once. Their `track/identify` calls don't really do anything. example
19
+
20
+ export interface CorePlugin<
21
+ Ctx extends CoreContext = CoreContext,
22
+ Analytics extends CoreAnalytics = any
23
+ > {
24
+ name: string
25
+ alternativeNames?: string[]
26
+ version: string
27
+ type: PluginType
28
+ isLoaded: () => boolean
29
+ load: (
30
+ ctx: Ctx,
31
+ instance: Analytics,
32
+ config?: CorePluginConfig
33
+ ) => Promise<unknown>
34
+
35
+ unload?: (ctx: Ctx, instance: Analytics) => Promise<unknown> | unknown
36
+ ready?: () => Promise<unknown>
37
+ track?: (ctx: Ctx) => Promise<Ctx> | Ctx
38
+ identify?: (ctx: Ctx) => Promise<Ctx> | Ctx
39
+ page?: (ctx: Ctx) => Promise<Ctx> | Ctx
40
+ group?: (ctx: Ctx) => Promise<Ctx> | Ctx
41
+ alias?: (ctx: Ctx) => Promise<Ctx> | Ctx
42
+ screen?: (ctx: Ctx) => Promise<Ctx> | Ctx
43
+ }
@@ -0,0 +1,23 @@
1
+ import { backoff } from '../backoff'
2
+
3
+ describe('backoff', () => {
4
+ it('increases with the number of attempts', () => {
5
+ expect(backoff({ attempt: 1 })).toBeGreaterThan(1000)
6
+ expect(backoff({ attempt: 2 })).toBeGreaterThan(2000)
7
+ expect(backoff({ attempt: 3 })).toBeGreaterThan(3000)
8
+ expect(backoff({ attempt: 4 })).toBeGreaterThan(4000)
9
+ })
10
+
11
+ it('accepts a max timeout', () => {
12
+ expect(backoff({ attempt: 1, maxTimeout: 3000 })).toBeGreaterThan(1000)
13
+ expect(backoff({ attempt: 3, maxTimeout: 3000 })).toBeLessThanOrEqual(3000)
14
+ expect(backoff({ attempt: 4, maxTimeout: 3000 })).toBeLessThanOrEqual(3000)
15
+ })
16
+
17
+ it('accepts a growth factor', () => {
18
+ const f2 = backoff({ attempt: 2, factor: 2 })
19
+ const f3 = backoff({ attempt: 2, factor: 3 })
20
+
21
+ expect(f3).toBeGreaterThan(f2)
22
+ })
23
+ })