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,834 @@
1
+ /* eslint-disable @typescript-eslint/no-floating-promises */
2
+ import jsdom from 'jsdom'
3
+ import unfetch from 'unfetch'
4
+ import { ajsDestinations, LegacyDestination } from '..'
5
+ import { Analytics } from '../../../core/analytics'
6
+ import { LegacySettings } from '../../../browser'
7
+ import { Context } from '../../../core/context'
8
+ import { Plan } from '../../../core/events'
9
+ import { tsubMiddleware } from '../../routing-middleware'
10
+ import { AMPLITUDE_WRITEKEY } from '../../../test-helpers/test-writekeys'
11
+ import { PersistedPriorityQueue } from '../../../lib/priority-queue/persisted'
12
+ import * as Factory from '../../../test-helpers/factories'
13
+
14
+ const cdnResponse: LegacySettings = {
15
+ integrations: {
16
+ Zapier: {
17
+ type: 'server',
18
+ },
19
+ WithNoVersion: {
20
+ type: 'browser',
21
+ },
22
+ WithProperTypeComponent: {
23
+ versionSettings: {
24
+ componentTypes: ['browser'],
25
+ },
26
+ },
27
+ WithVersionSettings: {
28
+ versionSettings: {
29
+ version: '1.2.3',
30
+ },
31
+ type: 'browser',
32
+ },
33
+ WithVersionOverrides: {
34
+ versionSettings: {
35
+ version: '1.2.3',
36
+ override: '9.9.9',
37
+ },
38
+ type: 'browser',
39
+ },
40
+ 'Amazon S3': {},
41
+ Amplitude: {
42
+ type: 'browser',
43
+ },
44
+ Hightouchio: {
45
+ type: 'browser',
46
+ },
47
+ Iterable: {
48
+ type: 'browser',
49
+ name: 'Iterable',
50
+ },
51
+ },
52
+ middlewareSettings: {
53
+ routingRules: [
54
+ {
55
+ matchers: [
56
+ {
57
+ ir: '["=","event",{"value":"Item Impression"}]',
58
+ type: 'fql',
59
+ },
60
+ ],
61
+ scope: 'destinations',
62
+ target_type: 'workspace::project::destination',
63
+ transformers: [[{ type: 'drop' }]],
64
+ destinationName: 'Amplitude',
65
+ },
66
+ ],
67
+ },
68
+ }
69
+
70
+ const fetchSettings = Factory.createSuccess(cdnResponse)
71
+
72
+ jest.mock('unfetch', () => {
73
+ return jest.fn()
74
+ })
75
+
76
+ // We do not support remote integrations
77
+ describe.skip('loading ajsDestinations', () => {
78
+ const writeKey = 'foo'
79
+ beforeEach(async () => {
80
+ jest.resetAllMocks()
81
+
82
+ jest
83
+ .mocked(unfetch)
84
+ // @ts-ignore: ignore Response required fields
85
+ .mockImplementation((): Promise<Response> => fetchSettings)
86
+ })
87
+
88
+ it('loads version overrides', () => {
89
+ const destinations = ajsDestinations(writeKey, cdnResponse, {}, {})
90
+
91
+ const withVersionSettings = destinations.find(
92
+ (d) => d.name === 'WithVersionSettings'
93
+ )
94
+
95
+ const withVersionOverrides = destinations.find(
96
+ (d) => d.name === 'WithVersionOverrides'
97
+ )
98
+
99
+ const withNoVersion = destinations.find((d) => d.name === 'WithNoVersion')
100
+
101
+ expect(withVersionSettings?.version).toBe('1.2.3')
102
+ expect(withVersionOverrides?.version).toBe('9.9.9')
103
+ expect(withNoVersion?.version).toBe('latest')
104
+ })
105
+
106
+ // This test should temporary. It must be deleted once we fix the Iterable metadata
107
+ it('ignores Iterable', () => {
108
+ const destinations = ajsDestinations(writeKey, cdnResponse, {}, {})
109
+ const iterable = destinations.find((d) => d.name === 'Iterable')
110
+ expect(iterable).toBeUndefined()
111
+ })
112
+
113
+ describe('versionSettings.components', () => {
114
+ it('ignores [componentType:browser] when bundlingStatus is unbundled', () => {
115
+ const destinations = ajsDestinations(
116
+ writeKey,
117
+ {
118
+ integrations: {
119
+ 'Some server destination': {
120
+ versionSettings: {
121
+ componentTypes: ['server'],
122
+ },
123
+ bundlingStatus: 'bundled', // this combination will never happen
124
+ },
125
+ 'Device Mode Customer.io': {
126
+ versionSettings: {
127
+ componentTypes: ['browser'],
128
+ },
129
+ bundlingStatus: 'bundled',
130
+ },
131
+ 'Cloud Mode Customer.io': {
132
+ versionSettings: {
133
+ componentTypes: ['browser'],
134
+ },
135
+ bundlingStatus: 'unbundled',
136
+ },
137
+ },
138
+ },
139
+ {},
140
+ {}
141
+ )
142
+ expect(destinations.length).toBe(1)
143
+ })
144
+
145
+ it('loads [componentType:browser] when bundlingStatus is not defined', () => {
146
+ const destinations = ajsDestinations(
147
+ writeKey,
148
+ {
149
+ integrations: {
150
+ 'Some server destination': {
151
+ versionSettings: {
152
+ componentTypes: ['server'],
153
+ },
154
+ bundlingStatus: 'bundled', // this combination will never happen
155
+ },
156
+ 'Device Mode Customer.io': {
157
+ versionSettings: {
158
+ componentTypes: ['browser'],
159
+ },
160
+ bundlingStatus: 'bundled',
161
+ },
162
+ 'Device Mode no bundling status Customer.io': {
163
+ versionSettings: {
164
+ componentTypes: ['browser'],
165
+ },
166
+ },
167
+ },
168
+ },
169
+ {},
170
+ {}
171
+ )
172
+ expect(destinations.length).toBe(2)
173
+ })
174
+ })
175
+
176
+ // we do not support the legacy destination
177
+ it.skip('loads type:browser legacy ajs destinations from cdn', () => {
178
+ const destinations = ajsDestinations(writeKey, cdnResponse, {}, {})
179
+ // ignores hightouch.io
180
+ expect(destinations.length).toBe(5)
181
+ })
182
+
183
+ it('ignores type:browser when bundlingStatus is unbundled', () => {
184
+ const destinations = ajsDestinations(
185
+ writeKey,
186
+ {
187
+ integrations: {
188
+ 'Some server destination': {
189
+ type: 'server',
190
+ bundlingStatus: 'bundled', // this combination will never happen
191
+ },
192
+ 'Device Mode Customer.io': {
193
+ type: 'browser',
194
+ bundlingStatus: 'bundled',
195
+ },
196
+ 'Cloud Mode Customer.io': {
197
+ type: 'browser',
198
+ bundlingStatus: 'unbundled',
199
+ },
200
+ },
201
+ },
202
+ {},
203
+ {}
204
+ )
205
+ expect(destinations.length).toBe(1)
206
+ })
207
+
208
+ it('loads type:browser when bundlingStatus is not defined', () => {
209
+ const destinations = ajsDestinations(
210
+ writeKey,
211
+ {
212
+ integrations: {
213
+ 'Some server destination': {
214
+ type: 'server',
215
+ bundlingStatus: 'bundled', // this combination will never happen
216
+ },
217
+ 'Device Mode Customer.io': {
218
+ type: 'browser',
219
+ bundlingStatus: 'bundled',
220
+ },
221
+ 'Device Mode no bundling status Customer.io': {
222
+ type: 'browser',
223
+ },
224
+ },
225
+ },
226
+ {},
227
+ {}
228
+ )
229
+ expect(destinations.length).toBe(2)
230
+ })
231
+
232
+ it('ignores destinations of type:server', () => {
233
+ const destinations = ajsDestinations(writeKey, cdnResponse, {}, {})
234
+ expect(destinations.find((d) => d.name === 'Zapier')).toBe(undefined)
235
+ })
236
+
237
+ it('does not load integrations when All:false', () => {
238
+ const destinations = ajsDestinations(
239
+ writeKey,
240
+ cdnResponse,
241
+ {
242
+ All: false,
243
+ },
244
+ {}
245
+ )
246
+ expect(destinations.length).toBe(0)
247
+ })
248
+
249
+ it('loads integrations when All:false, <integration>: true', () => {
250
+ const destinations = ajsDestinations(
251
+ writeKey,
252
+ cdnResponse,
253
+ {
254
+ All: false,
255
+ Amplitude: true,
256
+ Hightouchio: false,
257
+ },
258
+ {}
259
+ )
260
+ expect(destinations.length).toBe(1)
261
+ expect(destinations[0].name).toEqual('Amplitude')
262
+ })
263
+
264
+ it('adds a tsub middleware for matching rules', () => {
265
+ const middleware = tsubMiddleware(
266
+ cdnResponse.middlewareSettings!.routingRules
267
+ )
268
+ const destinations = ajsDestinations(
269
+ writeKey,
270
+ cdnResponse,
271
+ {},
272
+ {},
273
+ middleware
274
+ )
275
+ const amplitude = destinations.find((d) => d.name === 'Amplitude')
276
+ expect(amplitude?.middleware.length).toBe(1)
277
+ })
278
+ })
279
+
280
+ // We do not currently support remote integrations
281
+ describe.skip('settings', () => {
282
+ it('does not delete type=any', () => {
283
+ const dest = new LegacyDestination(
284
+ 'Yandex',
285
+ 'latest',
286
+ 'writeKey',
287
+ {
288
+ type: 'custom',
289
+ },
290
+ {}
291
+ )
292
+ expect(dest.settings['type']).toEqual('custom')
293
+ })
294
+
295
+ it('deletes type=browser', () => {
296
+ const dest = new LegacyDestination(
297
+ 'Amplitude',
298
+ 'latest',
299
+ 'writeKey',
300
+ {
301
+ type: 'browser',
302
+ },
303
+ {}
304
+ )
305
+
306
+ expect(dest.settings['type']).toBeUndefined()
307
+ })
308
+ })
309
+
310
+ // We do not support remote integrations
311
+ describe.skip('options', () => {
312
+ it('#disableClientPersistence affects underlying queue', () => {
313
+ const defaultDestWithPersistance = new LegacyDestination(
314
+ 'LocalStorageUser',
315
+ 'latest',
316
+ 'writeKey',
317
+ {},
318
+ {}
319
+ )
320
+ const destWithPersistance = new LegacyDestination(
321
+ 'LocalStorageUserToo',
322
+ 'latest',
323
+ 'writeKey',
324
+ {},
325
+ { disableClientPersistence: false }
326
+ )
327
+ const destWithoutPersistance = new LegacyDestination(
328
+ 'MemoryUser',
329
+ 'latest',
330
+ 'writeKey',
331
+ {},
332
+ { disableClientPersistence: true }
333
+ )
334
+
335
+ expect(
336
+ defaultDestWithPersistance.buffer instanceof PersistedPriorityQueue
337
+ ).toBeTruthy()
338
+ expect(
339
+ destWithPersistance.buffer instanceof PersistedPriorityQueue
340
+ ).toBeTruthy()
341
+ expect(
342
+ destWithoutPersistance.buffer instanceof PersistedPriorityQueue
343
+ ).toBeFalsy()
344
+ })
345
+ })
346
+
347
+ // We do not support remote integrations
348
+ describe.skip('remote loading', () => {
349
+ const loadAmplitude = async (
350
+ obfuscate = false
351
+ ): Promise<LegacyDestination> => {
352
+ const writeKey = 'abc'
353
+ const ajs = new Analytics({
354
+ writeKey,
355
+ })
356
+
357
+ const dest = new LegacyDestination(
358
+ 'Amplitude',
359
+ 'latest',
360
+ writeKey,
361
+ {
362
+ apiKey: AMPLITUDE_WRITEKEY,
363
+ },
364
+ { obfuscate }
365
+ )
366
+
367
+ await dest.load(Context.system(), ajs)
368
+ await dest.ready()
369
+ return dest
370
+ }
371
+
372
+ beforeEach(() => {
373
+ jest.restoreAllMocks()
374
+ jest.resetAllMocks()
375
+
376
+ const html = `
377
+ <!DOCTYPE html>
378
+ <head>
379
+ <script>'hi'</script>
380
+ </head>
381
+ <body>
382
+ </body>
383
+ </html>
384
+ `.trim()
385
+
386
+ const jsd = new jsdom.JSDOM(html, {
387
+ runScripts: 'dangerously',
388
+ resources: 'usable',
389
+ url: 'https://localhost',
390
+ })
391
+
392
+ const windowSpy = jest.spyOn(global, 'window', 'get')
393
+ windowSpy.mockImplementation(
394
+ () => jsd.window as unknown as Window & typeof globalThis
395
+ )
396
+ })
397
+
398
+ it('loads integrations from the Hightouch CDN', async () => {
399
+ await loadAmplitude()
400
+
401
+ const sources = Array.from(window.document.querySelectorAll('script'))
402
+ .map((s) => s.src)
403
+ .filter(Boolean)
404
+
405
+ expect(sources).toMatchObject(
406
+ expect.arrayContaining([
407
+ 'https://cdn.hightouch-events.com/next-integrations/integrations/amplitude/latest/amplitude.dynamic.js.gz',
408
+ expect.stringContaining(
409
+ 'https://cdn.hightouch-events.com/next-integrations/integrations/vendor/commons'
410
+ ),
411
+ 'https://cdn.amplitude.com/libs/amplitude-5.2.2-min.gz.js',
412
+ ])
413
+ )
414
+ })
415
+
416
+ it('loads obfuscated integrations from the Hightouch CDN', async () => {
417
+ await loadAmplitude(true)
418
+
419
+ const sources = Array.from(window.document.querySelectorAll('script'))
420
+ .map((s) => s.src)
421
+ .filter(Boolean)
422
+
423
+ expect(sources).toMatchObject(
424
+ expect.arrayContaining([
425
+ 'https://cdn.hightouch-events.com/next-integrations/integrations/YW1wbGl0dWRl/latest/YW1wbGl0dWRl.dynamic.js.gz',
426
+ expect.stringContaining(
427
+ 'https://cdn.hightouch-events.com/next-integrations/integrations/vendor/commons'
428
+ ),
429
+ 'https://cdn.amplitude.com/libs/amplitude-5.2.2-min.gz.js',
430
+ ])
431
+ )
432
+ })
433
+
434
+ it('forwards identify calls to integration', async () => {
435
+ const dest = await loadAmplitude()
436
+ jest.spyOn(dest.integration!, 'identify')
437
+
438
+ const evt = new Context({ type: 'identify' })
439
+ await dest.identify(evt)
440
+
441
+ expect(dest.integration?.identify).toHaveBeenCalled()
442
+ })
443
+
444
+ it('forwards track calls to integration', async () => {
445
+ const dest = await loadAmplitude()
446
+ jest.spyOn(dest.integration!, 'track')
447
+
448
+ await dest.track(new Context({ type: 'track' }))
449
+ expect(dest.integration?.track).toHaveBeenCalled()
450
+ })
451
+
452
+ it('forwards page calls to integration', async () => {
453
+ const dest = await loadAmplitude()
454
+ jest.spyOn(dest.integration!, 'page')
455
+
456
+ await dest.page(new Context({ type: 'page' }))
457
+ expect(dest.integration?.page).toHaveBeenCalled()
458
+ })
459
+
460
+ it('forwards identify calls to obfuscated integration', async () => {
461
+ const dest = await loadAmplitude(true)
462
+ jest.spyOn(dest.integration!, 'identify')
463
+
464
+ const evt = new Context({ type: 'identify' })
465
+ await dest.identify(evt)
466
+
467
+ expect(dest.integration?.identify).toHaveBeenCalled()
468
+ })
469
+
470
+ it('forwards track calls to obfuscated integration', async () => {
471
+ const dest = await loadAmplitude(true)
472
+ jest.spyOn(dest.integration!, 'track')
473
+
474
+ await dest.track(new Context({ type: 'track' }))
475
+ expect(dest.integration?.track).toHaveBeenCalled()
476
+ })
477
+
478
+ it('forwards page calls to obfuscated integration', async () => {
479
+ const dest = await loadAmplitude(true)
480
+ jest.spyOn(dest.integration!, 'page')
481
+
482
+ await dest.page(new Context({ type: 'page' }))
483
+ expect(dest.integration?.page).toHaveBeenCalled()
484
+ })
485
+
486
+ it('applies remote routing rules', async () => {
487
+ const dest = await loadAmplitude()
488
+ jest.spyOn(dest.integration!, 'track')
489
+
490
+ dest.addMiddleware(
491
+ tsubMiddleware(cdnResponse.middlewareSettings?.routingRules ?? [])
492
+ )
493
+
494
+ // this routing rule should drop the event
495
+ await dest.track(new Context({ type: 'track', event: 'Item Impression' }))
496
+ expect(dest.integration?.track).not.toHaveBeenCalled()
497
+ })
498
+ })
499
+
500
+ // We do not support remote integrations
501
+ describe.skip('plan', () => {
502
+ beforeEach(async () => {
503
+ jest.resetAllMocks()
504
+
505
+ const html = `
506
+ <!DOCTYPE html>
507
+ <head>
508
+ <script>'hi'</script>
509
+ </head>
510
+ <body>
511
+ </body>
512
+ </html>
513
+ `.trim()
514
+
515
+ const jsd = new jsdom.JSDOM(html, {
516
+ runScripts: 'dangerously',
517
+ resources: 'usable',
518
+ url: 'https://localhost',
519
+ })
520
+
521
+ const windowSpy = jest.spyOn(global, 'window', 'get')
522
+ windowSpy.mockImplementation(
523
+ () => jsd.window as unknown as Window & typeof globalThis
524
+ )
525
+ })
526
+
527
+ const loadAmplitude = async (plan: Plan): Promise<LegacyDestination> => {
528
+ const writeKey = 'abc'
529
+ const ajs = new Analytics({
530
+ writeKey,
531
+ })
532
+
533
+ const dest = new LegacyDestination(
534
+ 'amplitude',
535
+ 'latest',
536
+ writeKey,
537
+ {
538
+ apiKey: AMPLITUDE_WRITEKEY,
539
+ },
540
+ { plan }
541
+ )
542
+
543
+ await dest.load(Context.system(), ajs)
544
+ await dest.ready()
545
+ return dest
546
+ }
547
+
548
+ it('does not drop events when no plan is defined', async () => {
549
+ const dest = await loadAmplitude({})
550
+
551
+ jest.spyOn(dest.integration!, 'track')
552
+
553
+ await dest.track(new Context({ type: 'page', event: 'Track Event' }))
554
+ expect(dest.integration?.track).toHaveBeenCalled()
555
+ })
556
+
557
+ it('drops event when event is disabled', async () => {
558
+ const dest = await loadAmplitude({
559
+ track: {
560
+ 'Track Event': {
561
+ enabled: false,
562
+ integrations: { amplitude: false },
563
+ },
564
+ },
565
+ })
566
+
567
+ jest.spyOn(dest.integration!, 'track')
568
+
569
+ const ctx = new Context({ type: 'page', event: 'Track Event' })
570
+ await expect(() => dest.track(ctx)).rejects.toMatchInlineSnapshot(`
571
+ ContextCancelation {
572
+ "reason": "Event Track Event disabled for integration amplitude in tracking plan",
573
+ "retry": false,
574
+ "type": "Dropped by plan",
575
+ }
576
+ `)
577
+
578
+ expect(dest.integration?.track).not.toHaveBeenCalled()
579
+ expect(ctx.event.integrations).toMatchInlineSnapshot(`
580
+ Object {
581
+ "All": false,
582
+ "Hightouch.io": true,
583
+ }
584
+ `)
585
+ })
586
+
587
+ it('drops event when unplanned event is disabled', async () => {
588
+ const dest = await loadAmplitude({
589
+ track: {
590
+ __default: {
591
+ enabled: false,
592
+ integrations: {},
593
+ },
594
+ },
595
+ })
596
+
597
+ jest.spyOn(dest.integration!, 'track')
598
+
599
+ const ctx = new Context({ type: 'page', event: 'Track Event' })
600
+ await expect(() => dest.track(ctx)).rejects.toMatchInlineSnapshot(`
601
+ ContextCancelation {
602
+ "reason": "Event Track Event disabled for integration amplitude in tracking plan",
603
+ "retry": false,
604
+ "type": "Dropped by plan",
605
+ }
606
+ `)
607
+
608
+ expect(dest.integration?.track).not.toHaveBeenCalled()
609
+ expect(ctx.event.integrations).toMatchInlineSnapshot(`
610
+ Object {
611
+ "All": false,
612
+ "Hightouch.io": true,
613
+ }
614
+ `)
615
+ })
616
+
617
+ it('does not drop events with different names', async () => {
618
+ const dest = await loadAmplitude({
619
+ track: {
620
+ 'Fake Track Event': {
621
+ enabled: true,
622
+ integrations: { amplitude: false },
623
+ },
624
+ },
625
+ })
626
+
627
+ jest.spyOn(dest.integration!, 'track')
628
+
629
+ await dest.track(new Context({ type: 'page', event: 'Track Event' }))
630
+ expect(dest.integration?.track).toHaveBeenCalled()
631
+ })
632
+
633
+ it('does not drop events with same name when unplanned events are disallowed', async () => {
634
+ const dest = await loadAmplitude({
635
+ track: {
636
+ __default: { enabled: false, integrations: {} },
637
+ 'Track Event': {
638
+ enabled: true,
639
+ integrations: {},
640
+ },
641
+ },
642
+ })
643
+
644
+ jest.spyOn(dest.integration!, 'track')
645
+
646
+ await dest.track(new Context({ type: 'page', event: 'Track Event' }))
647
+ expect(dest.integration?.track).toHaveBeenCalled()
648
+ })
649
+
650
+ it('drops enabled event for matching destination', async () => {
651
+ const dest = await loadAmplitude({
652
+ track: {
653
+ 'Track Event': {
654
+ enabled: true,
655
+ integrations: { amplitude: false },
656
+ },
657
+ },
658
+ })
659
+
660
+ jest.spyOn(dest.integration!, 'track')
661
+ const ctx = new Context({ type: 'page', event: 'Track Event' })
662
+ await expect(() => dest.track(ctx)).rejects.toMatchInlineSnapshot(`
663
+ ContextCancelation {
664
+ "reason": "Event Track Event disabled for integration amplitude in tracking plan",
665
+ "retry": false,
666
+ "type": "Dropped by plan",
667
+ }
668
+ `)
669
+
670
+ expect(dest.integration?.track).not.toHaveBeenCalled()
671
+ })
672
+
673
+ it('does not drop enabled event for non-matching destination', async () => {
674
+ const dest = await loadAmplitude({
675
+ track: {
676
+ 'Track Event': {
677
+ enabled: true,
678
+ integrations: { 'not amplitude': false },
679
+ },
680
+ },
681
+ })
682
+
683
+ jest.spyOn(dest.integration!, 'track')
684
+
685
+ await dest.track(new Context({ type: 'page', event: 'Track Event' }))
686
+ expect(dest.integration?.track).toHaveBeenCalled()
687
+ })
688
+
689
+ it('does not drop enabled event with enabled destination', async () => {
690
+ const dest = await loadAmplitude({
691
+ track: {
692
+ 'Track Event': {
693
+ enabled: true,
694
+ integrations: { amplitude: true },
695
+ },
696
+ },
697
+ })
698
+
699
+ jest.spyOn(dest.integration!, 'track')
700
+
701
+ await dest.track(new Context({ type: 'page', event: 'Track Event' }))
702
+ expect(dest.integration?.track).toHaveBeenCalled()
703
+ })
704
+
705
+ it('properly sets event integrations object with enabled plan', async () => {
706
+ const dest = await loadAmplitude({
707
+ track: {
708
+ 'Track Event': {
709
+ enabled: true,
710
+ integrations: { amplitude: true },
711
+ },
712
+ },
713
+ })
714
+
715
+ const ctx = await dest.track(
716
+ new Context({ type: 'page', event: 'Track Event' })
717
+ )
718
+ expect(ctx.event.integrations).toEqual({ amplitude: true })
719
+ })
720
+
721
+ it('sets event integrations object when integration is disabled', async () => {
722
+ const dest = await loadAmplitude({
723
+ track: {
724
+ 'Track Event': {
725
+ enabled: true,
726
+ integrations: { amplitude: false },
727
+ },
728
+ },
729
+ })
730
+ jest.spyOn(dest.integration!, 'track')
731
+ const ctx = new Context({ type: 'page', event: 'Track Event' })
732
+
733
+ await expect(() => dest.track(ctx)).rejects.toMatchInlineSnapshot(`
734
+ ContextCancelation {
735
+ "reason": "Event Track Event disabled for integration amplitude in tracking plan",
736
+ "retry": false,
737
+ "type": "Dropped by plan",
738
+ }
739
+ `)
740
+
741
+ expect(dest.integration?.track).not.toHaveBeenCalled()
742
+ expect(ctx.event.integrations).toEqual({ amplitude: false })
743
+ })
744
+
745
+ it('doesnt set event integrations object with different event', async () => {
746
+ const dest = await loadAmplitude({
747
+ track: {
748
+ 'Track Event': {
749
+ enabled: true,
750
+ integrations: { amplitude: true },
751
+ },
752
+ },
753
+ })
754
+
755
+ const ctx = await dest.track(
756
+ new Context({ type: 'page', event: 'Not Track Event' })
757
+ )
758
+ expect(ctx.event.integrations).toEqual({})
759
+ })
760
+ })
761
+
762
+ // We do not support remote integrations
763
+ describe.skip('option overrides', () => {
764
+ beforeEach(async () => {
765
+ jest.resetAllMocks()
766
+
767
+ const html = `
768
+ <!DOCTYPE html>
769
+ <head>
770
+ <script>'hi'</script>
771
+ </head>
772
+ <body>
773
+ </body>
774
+ </html>
775
+ `.trim()
776
+
777
+ const jsd = new jsdom.JSDOM(html, {
778
+ runScripts: 'dangerously',
779
+ resources: 'usable',
780
+ url: 'https://localhost',
781
+ })
782
+
783
+ const windowSpy = jest.spyOn(global, 'window', 'get')
784
+ windowSpy.mockImplementation(
785
+ () => jsd.window as unknown as Window & typeof globalThis
786
+ )
787
+ })
788
+
789
+ it('accepts settings overrides from options', async () => {
790
+ const cdnSettings = {
791
+ integrations: {
792
+ Amplitude: {
793
+ type: 'browser',
794
+ apiKey: '123',
795
+ secondOption: '👻',
796
+ },
797
+ },
798
+ }
799
+
800
+ const initOptions = {
801
+ integrations: {
802
+ Amplitude: {
803
+ apiKey: 'abc',
804
+ thirdOption: '🤠',
805
+ },
806
+ },
807
+ }
808
+
809
+ const destinations = ajsDestinations(
810
+ 'writeKey',
811
+ cdnSettings,
812
+ {},
813
+ initOptions
814
+ )
815
+ const amplitude = destinations[0]
816
+
817
+ await amplitude.load(Context.system(), {} as Analytics)
818
+ await amplitude.ready()
819
+
820
+ expect(amplitude.settings).toMatchObject({
821
+ apiKey: 'abc', // overriden
822
+ secondOption: '👻', // merged from cdn settings
823
+ thirdOption: '🤠', // merged from init options
824
+ })
825
+
826
+ expect(amplitude.integration?.options).toEqual(
827
+ expect.objectContaining({
828
+ apiKey: 'abc', // overriden
829
+ secondOption: '👻', // merged from cdn settings
830
+ thirdOption: '🤠', // merged from init options
831
+ })
832
+ )
833
+ })
834
+ })