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,52 @@
1
+ import { detectRuntime, RuntimeEnv } from '../env'
2
+
3
+ const ogProcessEnv = { ...process.env }
4
+
5
+ afterEach(() => {
6
+ process.env = ogProcessEnv
7
+ // @ts-ignore
8
+ delete globalThis.window
9
+
10
+ // @ts-ignore
11
+ delete globalThis.WebSocketPair
12
+
13
+ // @ts-ignore
14
+ delete globalThis.EdgeRuntime
15
+
16
+ // @ts-ignore
17
+ delete globalThis.window
18
+ })
19
+ describe(detectRuntime, () => {
20
+ it('should return node since these tests run in node', () => {
21
+ expect(detectRuntime()).toEqual<RuntimeEnv>('node')
22
+ })
23
+
24
+ it('should return browser if correct env', () => {
25
+ // @ts-ignore
26
+ // eslint-disable-next-line
27
+ delete process.env
28
+ // @ts-ignore
29
+ globalThis.window = {}
30
+ expect(detectRuntime()).toEqual<RuntimeEnv>('browser')
31
+ })
32
+
33
+ it('should return cloudflare worker if correct env', () => {
34
+ // @ts-ignore
35
+ // eslint-disable-next-line
36
+ delete process.env
37
+ // @ts-ignore
38
+ globalThis.WebSocketPair = {}
39
+ expect(detectRuntime()).toEqual<RuntimeEnv>('cloudflare-worker')
40
+ })
41
+
42
+ it('should return edgeruntime if correct env', () => {
43
+ // @ts-ignore
44
+ // eslint-disable-next-line
45
+ delete process.env
46
+
47
+ // @ts-ignore
48
+ globalThis.EdgeRuntime = 'vercel'
49
+
50
+ expect(detectRuntime()).toEqual<RuntimeEnv>('vercel-edge')
51
+ })
52
+ })
@@ -0,0 +1,21 @@
1
+ import { createMessageId } from '../get-message-id'
2
+
3
+ // https://gist.github.com/johnelliott/cf77003f72f889abbc3f32785fa3df8d
4
+ const uuidv4Regex =
5
+ /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
6
+
7
+ describe(createMessageId, () => {
8
+ it('returns a string in the format "node-next-[unix epoch time]-[uuid v4]"', () => {
9
+ const msg = createMessageId().split('-')
10
+ expect(msg.length).toBe(8)
11
+
12
+ expect(`${msg[0]}-${msg[1]}`).toBe('node-next')
13
+
14
+ const epochTimeSeg = msg[2]
15
+ expect(typeof parseInt(epochTimeSeg)).toBe('number')
16
+ expect(epochTimeSeg.length > 10).toBeTruthy()
17
+
18
+ const uuidSeg = msg.slice(3).join('-')
19
+ expect(uuidSeg).toEqual(expect.stringMatching(uuidv4Regex))
20
+ })
21
+ })
@@ -0,0 +1,77 @@
1
+ /**
2
+ * use non-native event emitter for the benefit of non-node runtimes like CF workers.
3
+ */
4
+ import { Emitter } from '@ht-sdks/events-sdk-js-core'
5
+ import { detectRuntime } from './env'
6
+
7
+ /**
8
+ * adapted from: https://www.npmjs.com/package/node-abort-controller
9
+ */
10
+ export class AbortSignal {
11
+ onabort: globalThis.AbortSignal['onabort'] = null
12
+ aborted = false
13
+ eventEmitter = new Emitter()
14
+
15
+ toString() {
16
+ return '[object AbortSignal]'
17
+ }
18
+ get [Symbol.toStringTag]() {
19
+ return 'AbortSignal'
20
+ }
21
+ removeEventListener(...args: Parameters<Emitter['off']>) {
22
+ this.eventEmitter.off(...args)
23
+ }
24
+ addEventListener(...args: Parameters<Emitter['on']>) {
25
+ this.eventEmitter.on(...args)
26
+ }
27
+ dispatchEvent(type: string) {
28
+ const event = { type, target: this }
29
+
30
+ const handlerName = `on${type}`
31
+
32
+ if (typeof (this as any)[handlerName] === 'function') {
33
+ ;(this as any)[handlerName](event)
34
+ }
35
+
36
+ this.eventEmitter.emit(type, event)
37
+ }
38
+ }
39
+
40
+ /**
41
+ * This polyfill is only neccessary to support versions of node < 14.17.
42
+ * Can be removed once node 14 support is dropped.
43
+ */
44
+ class AbortController {
45
+ signal = new AbortSignal()
46
+ abort() {
47
+ if (this.signal.aborted) return
48
+
49
+ this.signal.aborted = true
50
+ this.signal.dispatchEvent('abort')
51
+ }
52
+ toString() {
53
+ return '[object AbortController]'
54
+ }
55
+ get [Symbol.toStringTag]() {
56
+ return 'AbortController'
57
+ }
58
+ }
59
+
60
+ /**
61
+ * @param timeoutMs - Set a request timeout, after which the request is cancelled.
62
+ */
63
+ export const abortSignalAfterTimeout = (timeoutMs: number) => {
64
+ if (detectRuntime() === 'cloudflare-worker') {
65
+ return [] // TODO: this is broken in cloudflare workers, otherwise results in "A hanging Promise was canceled..." error.
66
+ }
67
+ const ac = new (globalThis.AbortController || AbortController)()
68
+
69
+ const timeoutId = setTimeout(() => {
70
+ ac.abort()
71
+ }, timeoutMs)
72
+
73
+ // Allow Node.js processes to exit early if only the timeout is running
74
+ timeoutId?.unref?.()
75
+
76
+ return [ac.signal, timeoutId] as const
77
+ }
@@ -0,0 +1,8 @@
1
+ // eslint-disable-next-line import/no-nodejs-modules
2
+ import { Buffer } from 'buffer'
3
+ /**
4
+ * Base64 encoder that works in browser, worker, node runtimes.
5
+ */
6
+ export const b64encode = (str: string): string => {
7
+ return Buffer.from(str).toString('base64')
8
+ }
@@ -0,0 +1,11 @@
1
+ const stripTrailingSlash = (str: string) => str.replace(/\/$/, '')
2
+
3
+ /**
4
+ *
5
+ * @param host e.g. "http://foo.com"
6
+ * @param path e.g. "/bar"
7
+ * @returns "e.g." "http://foo.com/bar"
8
+ */
9
+ export const tryCreateFormattedUrl = (host: string, path?: string) => {
10
+ return stripTrailingSlash(new URL(path || '', host).href)
11
+ }
@@ -0,0 +1,45 @@
1
+ /* eslint-disable no-restricted-globals */
2
+ export type RuntimeEnv =
3
+ | 'node'
4
+ | 'browser'
5
+ | 'web-worker'
6
+ | 'cloudflare-worker'
7
+ | 'vercel-edge'
8
+ | 'unknown'
9
+
10
+ export const detectRuntime = (): RuntimeEnv => {
11
+ if (
12
+ typeof process === 'object' &&
13
+ process &&
14
+ typeof process.env === 'object' &&
15
+ process.env &&
16
+ typeof process.version === 'string'
17
+ ) {
18
+ return 'node'
19
+ }
20
+
21
+ if (typeof window === 'object') {
22
+ return 'browser'
23
+ }
24
+
25
+ // @ts-ignore
26
+ if (typeof WebSocketPair !== 'undefined') {
27
+ return 'cloudflare-worker'
28
+ }
29
+
30
+ // @ts-ignore
31
+ if (typeof EdgeRuntime === 'string') {
32
+ return 'vercel-edge'
33
+ }
34
+
35
+ if (
36
+ // @ts-ignore
37
+ typeof WorkerGlobalScope !== 'undefined' &&
38
+ // @ts-ignore
39
+ typeof importScripts === 'function'
40
+ ) {
41
+ return 'web-worker'
42
+ }
43
+
44
+ return 'unknown'
45
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Returns a promise and its associated `resolve` and `reject` methods.
3
+ */
4
+ export function extractPromiseParts<T = unknown>(): {
5
+ promise: Promise<T>
6
+ resolve: (value: T) => void
7
+ reject: (reason?: unknown) => void
8
+ } {
9
+ let resolver: (value: T) => void
10
+ let rejecter: (reason?: unknown) => void
11
+ const promise = new Promise<T>((resolve, reject) => {
12
+ resolver = resolve
13
+ rejecter = reject
14
+ })
15
+
16
+ return {
17
+ promise,
18
+ resolve: resolver!,
19
+ reject: rejecter!,
20
+ }
21
+ }
@@ -0,0 +1,16 @@
1
+ import type { HTTPFetchFn } from './http-client'
2
+
3
+ export const fetch: HTTPFetchFn = async (...args) => {
4
+ if (globalThis.fetch) {
5
+ return globalThis.fetch(...args)
6
+ }
7
+ // This guard causes is important, as it causes dead-code elimination to be enabled inside this block.
8
+ // @ts-ignore
9
+ else if (typeof EdgeRuntime !== 'string') {
10
+ return (await import('node-fetch')).default(...args)
11
+ } else {
12
+ throw new Error(
13
+ 'Invariant: an edge runtime that does not support fetch should not exist'
14
+ )
15
+ }
16
+ }
@@ -0,0 +1,10 @@
1
+ import { uuid } from './uuid'
2
+
3
+ /**
4
+ * get a unique messageId with a very low chance of collisions
5
+ * using @lukeed/uuid/secure uses the node crypto module, which is the fastest
6
+ * @example "node-next-1668208232027-743be593-7789-4b74-8078-cbcc8894c586"
7
+ */
8
+ export const createMessageId = (): string => {
9
+ return `node-next-${Date.now()}-${uuid()}`
10
+ }
@@ -0,0 +1,95 @@
1
+ import { abortSignalAfterTimeout } from './abort'
2
+ import { fetch as defaultFetch } from './fetch'
3
+
4
+ /**
5
+ * This interface is meant to be compatible with different fetch implementations (node and browser).
6
+ * Using the ambient fetch type is not possible because the AbortSignal type is not compatible with node-fetch.
7
+ * @link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
8
+ */
9
+ export interface HTTPFetchFn {
10
+ (url: string, requestInit: HTTPFetchRequest): Promise<HTTPResponse>
11
+ }
12
+
13
+ /**
14
+ * This interface is meant to be compatible with the Request interface.
15
+ * @link https://developer.mozilla.org/en-US/docs/Web/API/Request
16
+ */
17
+ export interface HTTPFetchRequest {
18
+ headers: Record<string, string>
19
+ body: string
20
+ method: HTTPClientRequest['method']
21
+ signal: any // AbortSignal type does not play nicely with node-fetch
22
+ }
23
+
24
+ /**
25
+ * This interface is meant to very minimally conform to the Response interface.
26
+ * @link https://developer.mozilla.org/en-US/docs/Web/API/Response
27
+ */
28
+ export interface HTTPResponse {
29
+ status: number
30
+ statusText: string
31
+ }
32
+
33
+ /**
34
+ * This interface is meant to be a generic interface for making HTTP requests.
35
+ * While it may overlap with fetch's Request interface, it is not coupled to it.
36
+ */
37
+ export interface HTTPClientRequest {
38
+ /**
39
+ * URL to be used for the request
40
+ * @example 'https://us-east-1.hightouch-events.com/v1/batch'
41
+ */
42
+ url: string
43
+ /**
44
+ * HTTP method to be used for the request. This will always be a 'POST' request.
45
+ **/
46
+ method: 'POST'
47
+ /**
48
+ * Headers to be sent with the request
49
+ */
50
+ headers: Record<string, string>
51
+ /**
52
+ * JSON data to be sent with the request (will be stringified)
53
+ * @example { "batch": [ ... ]}
54
+ */
55
+ data: Record<string, any>
56
+ /**
57
+ * Specifies the timeout (in milliseconds) for an HTTP client to get an HTTP response from the server
58
+ * @example 10000
59
+ */
60
+ httpRequestTimeout: number
61
+ }
62
+
63
+ /**
64
+ * HTTP client interface for making requests
65
+ */
66
+ export interface HTTPClient {
67
+ makeRequest(_options: HTTPClientRequest): Promise<HTTPResponse>
68
+ }
69
+
70
+ /**
71
+ * Default HTTP client implementation using fetch
72
+ */
73
+ export class FetchHTTPClient implements HTTPClient {
74
+ private _fetch: HTTPFetchFn
75
+ constructor(fetchFn?: HTTPFetchFn) {
76
+ this._fetch = fetchFn ?? defaultFetch
77
+ }
78
+ async makeRequest(options: HTTPClientRequest): Promise<HTTPResponse> {
79
+ const [signal, timeoutId] = abortSignalAfterTimeout(
80
+ options.httpRequestTimeout
81
+ )
82
+
83
+ const requestInit = {
84
+ url: options.url,
85
+ method: options.method,
86
+ headers: options.headers,
87
+ body: JSON.stringify(options.data),
88
+ signal: signal,
89
+ }
90
+
91
+ return this._fetch(options.url, requestInit).finally(() =>
92
+ clearTimeout(timeoutId)
93
+ )
94
+ }
95
+ }
@@ -0,0 +1 @@
1
+ export { v4 as uuid } from '@lukeed/uuid'
@@ -0,0 +1,223 @@
1
+ import { NodeEventFactory } from '../../../app/event-factory'
2
+ import { createSuccess } from '../../../__tests__/test-helpers/factories'
3
+ import { createConfiguredNodePlugin } from '../index'
4
+ import { PublisherProps } from '../publisher'
5
+ import { Context } from '../../../app/context'
6
+ import { Emitter } from '@ht-sdks/events-sdk-js-core'
7
+ import {
8
+ assertHTTPRequestOptions,
9
+ httpClientOptionsBodyMatcher,
10
+ } from '../../../__tests__/test-helpers/assert-shape'
11
+ import { TestFetchClient } from '../../../__tests__/test-helpers/create-test-analytics'
12
+
13
+ let emitter: Emitter
14
+ const testClient = new TestFetchClient()
15
+ const fetcher = jest.spyOn(testClient, 'makeRequest')
16
+
17
+ const createTestNodePlugin = (props: Partial<PublisherProps> = {}) =>
18
+ createConfiguredNodePlugin(
19
+ {
20
+ maxRetries: 3,
21
+ maxEventsInBatch: 1,
22
+ flushInterval: 1000,
23
+ writeKey: '',
24
+ httpClient: testClient,
25
+ ...props,
26
+ },
27
+ emitter
28
+ )
29
+
30
+ const validateFetcherInputs = (...contexts: Context[]) => {
31
+ const [request] = fetcher.mock.lastCall
32
+ return assertHTTPRequestOptions(request, contexts)
33
+ }
34
+
35
+ const eventFactory = new NodeEventFactory()
36
+
37
+ beforeEach(() => {
38
+ emitter = new Emitter()
39
+ fetcher.mockReturnValue(createSuccess())
40
+ jest.useFakeTimers()
41
+ })
42
+
43
+ test('alias', async () => {
44
+ const { plugin: segmentPlugin } = createTestNodePlugin()
45
+
46
+ const event = eventFactory.alias('to', 'from')
47
+ const context = new Context(event)
48
+
49
+ fetcher.mockReturnValueOnce(createSuccess())
50
+ await segmentPlugin.alias(context)
51
+
52
+ expect(fetcher).toHaveBeenCalledTimes(1)
53
+ validateFetcherInputs(context)
54
+
55
+ const [request] = fetcher.mock.lastCall
56
+ const data = request.data
57
+
58
+ expect(data.batch).toHaveLength(1)
59
+ expect(data.batch[0]).toEqual({
60
+ ...httpClientOptionsBodyMatcher,
61
+ type: 'alias',
62
+ previousId: 'from',
63
+ userId: 'to',
64
+ })
65
+ })
66
+
67
+ test('group', async () => {
68
+ const { plugin: segmentPlugin } = createTestNodePlugin()
69
+
70
+ const event = eventFactory.group(
71
+ 'foo-group-id',
72
+ {
73
+ name: 'libraries',
74
+ },
75
+ { userId: 'foo-user-id' }
76
+ )
77
+ const context = new Context(event)
78
+
79
+ fetcher.mockReturnValueOnce(createSuccess())
80
+ await segmentPlugin.group(context)
81
+
82
+ expect(fetcher).toHaveBeenCalledTimes(1)
83
+ validateFetcherInputs(context)
84
+
85
+ const [request] = fetcher.mock.lastCall
86
+ const data = request.data
87
+
88
+ expect(data.batch).toHaveLength(1)
89
+ expect(data.batch[0]).toEqual({
90
+ ...httpClientOptionsBodyMatcher,
91
+ traits: {
92
+ name: 'libraries',
93
+ },
94
+ type: 'group',
95
+ groupId: 'foo-group-id',
96
+ userId: 'foo-user-id',
97
+ })
98
+ })
99
+
100
+ test('identify', async () => {
101
+ const { plugin: segmentPlugin } = createTestNodePlugin()
102
+
103
+ const event = eventFactory.identify('foo-user-id', {
104
+ name: 'Chris Radek',
105
+ })
106
+ const context = new Context(event)
107
+
108
+ fetcher.mockReturnValueOnce(createSuccess())
109
+ await segmentPlugin.identify(context)
110
+
111
+ expect(fetcher).toHaveBeenCalledTimes(1)
112
+ validateFetcherInputs(context)
113
+
114
+ const [request] = fetcher.mock.lastCall
115
+ const data = request.data
116
+ expect(data.batch).toHaveLength(1)
117
+ expect(data.batch[0]).toEqual({
118
+ ...httpClientOptionsBodyMatcher,
119
+ traits: {
120
+ name: 'Chris Radek',
121
+ },
122
+ type: 'identify',
123
+ userId: 'foo-user-id',
124
+ })
125
+ })
126
+
127
+ test('page', async () => {
128
+ const { plugin: segmentPlugin } = createTestNodePlugin()
129
+
130
+ const event = eventFactory.page(
131
+ 'Category',
132
+ 'Home',
133
+ { url: 'http://localhost' },
134
+ { userId: 'foo-user-id' }
135
+ )
136
+ const context = new Context(event)
137
+
138
+ fetcher.mockReturnValueOnce(createSuccess())
139
+ await segmentPlugin.page(context)
140
+
141
+ expect(fetcher).toHaveBeenCalledTimes(1)
142
+ validateFetcherInputs(context)
143
+
144
+ const [request] = fetcher.mock.lastCall
145
+ const data = request.data
146
+
147
+ expect(data.batch).toHaveLength(1)
148
+ expect(data.batch[0]).toEqual({
149
+ ...httpClientOptionsBodyMatcher,
150
+ type: 'page',
151
+ userId: 'foo-user-id',
152
+ name: 'Home',
153
+ category: 'Category',
154
+ properties: {
155
+ category: 'Category',
156
+ url: 'http://localhost',
157
+ },
158
+ })
159
+ })
160
+
161
+ test('screen', async () => {
162
+ const { plugin: segmentPlugin } = createTestNodePlugin()
163
+
164
+ const event = eventFactory.screen(
165
+ 'Category',
166
+ 'Home',
167
+ { variation: 'local' },
168
+ { userId: 'foo-user-id' }
169
+ )
170
+ const context = new Context(event)
171
+
172
+ fetcher.mockReturnValueOnce(createSuccess())
173
+ await segmentPlugin.screen(context)
174
+
175
+ expect(fetcher).toHaveBeenCalledTimes(1)
176
+ validateFetcherInputs(context)
177
+
178
+ const [request] = fetcher.mock.lastCall
179
+ const data = request.data
180
+
181
+ expect(data.batch).toHaveLength(1)
182
+ expect(data.batch[0]).toEqual({
183
+ ...httpClientOptionsBodyMatcher,
184
+ type: 'screen',
185
+ userId: 'foo-user-id',
186
+ name: 'Home',
187
+ category: 'Category',
188
+ properties: {
189
+ variation: 'local',
190
+ },
191
+ })
192
+ })
193
+
194
+ test('track', async () => {
195
+ const { plugin: segmentPlugin } = createTestNodePlugin()
196
+
197
+ const event = eventFactory.track(
198
+ 'test event',
199
+ { foo: 'bar' },
200
+ { userId: 'foo-user-id' }
201
+ )
202
+ const context = new Context(event)
203
+
204
+ fetcher.mockReturnValueOnce(createSuccess())
205
+ await segmentPlugin.screen(context)
206
+
207
+ expect(fetcher).toHaveBeenCalledTimes(1)
208
+ validateFetcherInputs(context)
209
+
210
+ const [request] = fetcher.mock.lastCall
211
+ const data = request.data
212
+
213
+ expect(data.batch).toHaveLength(1)
214
+ expect(data.batch[0]).toEqual({
215
+ ...httpClientOptionsBodyMatcher,
216
+ type: 'track',
217
+ event: 'test event',
218
+ userId: 'foo-user-id',
219
+ properties: {
220
+ foo: 'bar',
221
+ },
222
+ })
223
+ })