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,455 @@
1
+ import {
2
+ AnalyticsBuffered,
3
+ callAnalyticsMethod,
4
+ PreInitMethodCall,
5
+ flushAnalyticsCallsInNewTask,
6
+ PreInitMethodCallBuffer,
7
+ PreInitMethodName,
8
+ } from '..'
9
+ import { Analytics } from '../../analytics'
10
+ import { Context } from '../../context'
11
+ import { sleep } from '../../../lib/sleep'
12
+ import { User } from '../../user'
13
+ import { getBufferedPageCtxFixture } from '../../../test-helpers/fixtures'
14
+ import * as GlobalAnalytics from '../../../lib/global-analytics-helper'
15
+
16
+ describe(PreInitMethodCallBuffer, () => {
17
+ beforeEach(() => {
18
+ GlobalAnalytics.setGlobalAnalytics(undefined as any)
19
+ })
20
+
21
+ describe('toArray()', () => {
22
+ it('should convert the map back to an array', () => {
23
+ const call1 = new PreInitMethodCall('identify', [], jest.fn())
24
+ const call2 = new PreInitMethodCall('identify', [], jest.fn())
25
+ const call3 = new PreInitMethodCall('group', [], jest.fn())
26
+ const buffer = new PreInitMethodCallBuffer(call1, call2, call3)
27
+ expect(buffer.toArray()).toEqual([call1, call2, call3])
28
+ })
29
+
30
+ it('should also read from global analytics buffer', () => {
31
+ const call1 = new PreInitMethodCall('identify', ['foo'], jest.fn())
32
+ ;(window as any).htevents = [['track', 'snippet']]
33
+
34
+ const buffer = new PreInitMethodCallBuffer(call1)
35
+ const calls = buffer.toArray()
36
+ expect(calls.length).toBe(2)
37
+ expect(calls[0]).toEqual(
38
+ expect.objectContaining<Partial<PreInitMethodCall>>({
39
+ method: 'track',
40
+ args: ['snippet', getBufferedPageCtxFixture()],
41
+ })
42
+ )
43
+ expect(calls[1]).toEqual(call1)
44
+ })
45
+ })
46
+
47
+ describe('push()', () => {
48
+ it('should add method calls', () => {
49
+ const call1 = new PreInitMethodCall('identify', [], jest.fn())
50
+ const buffer = new PreInitMethodCallBuffer()
51
+ buffer.push(call1)
52
+ expect(buffer.toArray()).toEqual([call1])
53
+ })
54
+
55
+ it('should work if the calls were added at different times or in different ways', () => {
56
+ const call1 = new PreInitMethodCall('identify', [], jest.fn())
57
+ const call2 = new PreInitMethodCall('identify', [], jest.fn())
58
+ const call3 = new PreInitMethodCall('group', [], jest.fn())
59
+ const call4 = new PreInitMethodCall('group', [], jest.fn())
60
+ const buffer = new PreInitMethodCallBuffer(call1)
61
+ buffer.push(call2, call3)
62
+ buffer.push(call4)
63
+ expect(buffer.toArray()).toEqual([call1, call2, call3, call4])
64
+ })
65
+ })
66
+
67
+ describe('getCalls()', () => {
68
+ it('should fetch calls by name', async () => {
69
+ const buffer = new PreInitMethodCallBuffer()
70
+ const call1 = new PreInitMethodCall('identify', [], jest.fn())
71
+ const call2 = new PreInitMethodCall('identify', [], jest.fn())
72
+ const call3 = new PreInitMethodCall('group', [], jest.fn())
73
+ buffer.push(call1, call2, call3)
74
+ expect(buffer.getCalls('identify')).toEqual([call1, call2])
75
+ expect(buffer.getCalls('group')).toEqual([call3])
76
+ })
77
+ it('should read from Snippet Buffer', () => {
78
+ const call1 = new PreInitMethodCall('identify', ['foo'], jest.fn())
79
+ GlobalAnalytics.setGlobalAnalytics([['identify', 'snippet']] as any)
80
+
81
+ const buffer = new PreInitMethodCallBuffer(call1)
82
+ const calls = buffer.getCalls('identify')
83
+ expect(calls.length).toBe(2)
84
+ expect(calls[0]).toEqual(
85
+ expect.objectContaining<Partial<PreInitMethodCall>>({
86
+ method: 'identify',
87
+ args: ['snippet', getBufferedPageCtxFixture()],
88
+ })
89
+ )
90
+ expect(calls[1]).toEqual(call1)
91
+ })
92
+ })
93
+ describe('clear()', () => {
94
+ it('should clear calls', () => {
95
+ const call1 = new PreInitMethodCall('identify', [], jest.fn())
96
+ const call2 = new PreInitMethodCall('identify', [], jest.fn())
97
+ const call3 = new PreInitMethodCall('group', [], jest.fn())
98
+ GlobalAnalytics.setGlobalAnalytics([['track', 'bar']] as any)
99
+ const buffer = new PreInitMethodCallBuffer(call1, call2, call3)
100
+ buffer.clear()
101
+ expect(buffer.toArray()).toEqual([])
102
+ expect(GlobalAnalytics.getGlobalAnalytics()).toEqual([])
103
+ })
104
+ })
105
+
106
+ describe('Snippet buffer (method calls)', () => {
107
+ it('should be read from the global analytics instance', () => {
108
+ const getGlobalAnalyticsSpy = jest.spyOn(
109
+ GlobalAnalytics,
110
+ 'getGlobalAnalytics'
111
+ )
112
+
113
+ const buffer = new PreInitMethodCallBuffer()
114
+ expect(getGlobalAnalyticsSpy).not.toBeCalled()
115
+ buffer.toArray()
116
+ expect(getGlobalAnalyticsSpy).toBeCalled()
117
+ })
118
+ })
119
+ describe('BufferedPageContext', () => {
120
+ test.each([
121
+ 'track',
122
+ 'screen',
123
+ 'alias',
124
+ 'group',
125
+ 'page',
126
+ 'identify',
127
+ ] as PreInitMethodName[])('should be appended to %p calls.', (method) => {
128
+ const buffer = new PreInitMethodCallBuffer(
129
+ new PreInitMethodCall(method, ['foo'], jest.fn())
130
+ )
131
+ expect(buffer.getCalls(method)[0].args).toEqual([
132
+ 'foo',
133
+ getBufferedPageCtxFixture(),
134
+ ])
135
+ })
136
+ it('should not be appended for other method calls', () => {
137
+ const fn = jest.fn()
138
+ const onCall = new PreInitMethodCall('on', ['foo', fn])
139
+ expect(onCall.args).toEqual(['foo', fn])
140
+ const setAnonIdCall = new PreInitMethodCall('setAnonymousId', [])
141
+ expect(setAnonIdCall.args).toEqual([])
142
+ })
143
+ })
144
+ })
145
+
146
+ describe(AnalyticsBuffered, () => {
147
+ describe('Happy path', () => {
148
+ it('should return a promise-like object', async () => {
149
+ const ajs = new Analytics({ writeKey: 'foo' })
150
+ const ctx = new Context({ type: 'track' })
151
+ const buffered = new AnalyticsBuffered(() =>
152
+ Promise.resolve<[Analytics, Context]>([ajs, ctx])
153
+ )
154
+ expect(buffered).toBeInstanceOf(AnalyticsBuffered)
155
+ expect(typeof buffered.then).toBe('function')
156
+ expect(typeof buffered.catch).toBe('function')
157
+ expect(typeof buffered.finally).toBe('function')
158
+ })
159
+
160
+ it('should have instance and ctx properties defined when loader is done', async () => {
161
+ const ajs = new Analytics({ writeKey: 'foo' })
162
+ const ctx = new Context({ type: 'track' })
163
+ const buffered = new AnalyticsBuffered(() =>
164
+ Promise.resolve<[Analytics, Context]>([ajs, ctx])
165
+ )
166
+ expect(buffered.instance).not.toBeDefined()
167
+ expect(buffered.ctx).not.toBeDefined()
168
+ await buffered // finish loading
169
+ expect(buffered.instance).toBe(ajs)
170
+ expect(buffered.ctx).toBe(ctx)
171
+ })
172
+
173
+ it('should convert to a promise on await', async () => {
174
+ const ajs = new Analytics({ writeKey: 'foo' })
175
+ const ctx = new Context({ type: 'track' })
176
+ const [analytics, context] = await new AnalyticsBuffered(() => {
177
+ return Promise.resolve<[Analytics, Context]>([ajs, ctx])
178
+ })
179
+
180
+ expect(analytics).toEqual(ajs)
181
+ expect(context).toEqual(ctx)
182
+ })
183
+
184
+ it('should wrap async methods in a promise', async () => {
185
+ const ajs = new Analytics({ writeKey: 'foo' })
186
+ const ctx = new Context({ type: 'track' })
187
+
188
+ ajs.track = () => Promise.resolve(ctx)
189
+
190
+ const buffered = new AnalyticsBuffered((buffer) => {
191
+ return new Promise((resolve) =>
192
+ setTimeout(() => {
193
+ flushAnalyticsCallsInNewTask(ajs, buffer)
194
+ resolve([ajs, ctx])
195
+ }, 0)
196
+ )
197
+ })
198
+ const result = buffered.track('foo')
199
+ expect(result).toBeInstanceOf(Promise)
200
+
201
+ await buffered
202
+
203
+ const result2 = buffered.track('bar')
204
+ expect(result2).toBeInstanceOf(Promise)
205
+
206
+ expect(await result).toBeInstanceOf(Context)
207
+ expect(await result2).toBeInstanceOf(Context)
208
+ })
209
+
210
+ it('should wrap synchronous methods in a promise', async () => {
211
+ const ajs = new Analytics({ writeKey: 'foo' })
212
+ ajs.user = () => new User()
213
+ const ctx = new Context({ type: 'track' })
214
+
215
+ const buffered = new AnalyticsBuffered((buffer) => {
216
+ return new Promise((resolve) =>
217
+ setTimeout(() => {
218
+ flushAnalyticsCallsInNewTask(ajs, buffer)
219
+ resolve([ajs, ctx])
220
+ }, 0)
221
+ )
222
+ })
223
+ const result = buffered.user()
224
+ expect(result).toBeInstanceOf(Promise)
225
+
226
+ await buffered
227
+
228
+ const result2 = buffered.user()
229
+ expect(result2).toBeInstanceOf(Promise)
230
+
231
+ expect(await result).toBeInstanceOf(User)
232
+ expect(await result2).toBeInstanceOf(User)
233
+ })
234
+
235
+ describe('the "this" value of proxied analytics methods', () => {
236
+ test('should be the ajs instance for non-chainable methods (that return a promise)', async () => {
237
+ const ajs = new Analytics({ writeKey: 'foo' })
238
+ jest.spyOn(ajs, 'track').mockImplementation(function (this: Analytics) {
239
+ expect(this).toBe(ajs)
240
+ return Promise.resolve(ctx)
241
+ })
242
+ const ctx = new Context({ type: 'track' })
243
+ const result: [Analytics, Context] = [ajs, ctx]
244
+ const buffered = new AnalyticsBuffered(() => Promise.resolve(result))
245
+ await buffered
246
+ void buffered.track('foo', {})
247
+ expect.assertions(1)
248
+ })
249
+ })
250
+
251
+ test('should be the ajs instance for chainable methods', async () => {
252
+ const ajs = new Analytics({ writeKey: 'foo' })
253
+ jest.spyOn(ajs, 'on').mockImplementation(function (this: Analytics) {
254
+ expect(this).toBe(ajs)
255
+ return ajs
256
+ })
257
+ const ctx = new Context({ type: 'page' })
258
+ const result: [Analytics, Context] = [ajs, ctx]
259
+ const buffered = new AnalyticsBuffered(() => Promise.resolve(result))
260
+ await buffered
261
+ void buffered.on('foo', jest.fn)
262
+ expect.assertions(1)
263
+ })
264
+ })
265
+
266
+ describe('Unhappy path', () => {
267
+ test('Will throw an error if the callback throws', async () => {
268
+ try {
269
+ new AnalyticsBuffered(() => {
270
+ throw 'oops!'
271
+ })
272
+ } catch (err) {
273
+ expect(err).toBe('oops!')
274
+ }
275
+ expect.assertions(1)
276
+ })
277
+ test('Will throw if a promise rejection', async () => {
278
+ try {
279
+ await new AnalyticsBuffered(() => Promise.reject('oops!'))
280
+ } catch (err) {
281
+ expect(err).toBe('oops!')
282
+ }
283
+ expect.assertions(1)
284
+ })
285
+
286
+ test('Will ignore the .then if there is a catch block', () => {
287
+ const thenCb = jest.fn()
288
+ const p = new AnalyticsBuffered(() => {
289
+ return Promise.reject('nope') as any
290
+ })
291
+ .then(() => {
292
+ thenCb()
293
+ })
294
+ .catch((err) => {
295
+ expect(err).toBe('nope')
296
+ })
297
+ expect(thenCb).not.toBeCalled()
298
+ expect.assertions(2)
299
+ return p
300
+ })
301
+ })
302
+ })
303
+
304
+ describe(callAnalyticsMethod, () => {
305
+ let ajs!: Analytics
306
+ let resolveSpy!: jest.Mock<any, any>
307
+ let rejectSpy!: jest.Mock<any, any>
308
+ let methodCall!: PreInitMethodCall
309
+ beforeEach(() => {
310
+ resolveSpy = jest.fn().mockImplementation((el) => `resolved: ${el}`)
311
+ rejectSpy = jest.fn().mockImplementation((el) => `rejected: ${el}`)
312
+ methodCall = new PreInitMethodCall(
313
+ 'track',
314
+ ['foo', {}],
315
+ resolveSpy,
316
+ rejectSpy
317
+ )
318
+ ajs = new Analytics({
319
+ writeKey: 'abc',
320
+ })
321
+ })
322
+ it('should change called to true', async () => {
323
+ methodCall.called = false
324
+ await callAnalyticsMethod(ajs, methodCall)
325
+ expect(methodCall.called).toBe(true)
326
+ })
327
+ it('should resolve if an async method is called, like track', async () => {
328
+ await callAnalyticsMethod(ajs, methodCall)
329
+ expect(resolveSpy).toBeCalled()
330
+ })
331
+
332
+ it('should not defer if a synchronous method is called, like "on"', () => {
333
+ void callAnalyticsMethod(ajs, {
334
+ ...methodCall,
335
+ method: 'on',
336
+ args: ['foo', jest.fn],
337
+ })
338
+ expect(resolveSpy).toBeCalled()
339
+ })
340
+ describe('error handling', () => {
341
+ it('will catch a promise rejection for async functions', async () => {
342
+ const genericError = new Error('An Error')
343
+ jest.spyOn(ajs, 'track').mockImplementationOnce(() => {
344
+ return Promise.reject(genericError)
345
+ })
346
+ await callAnalyticsMethod(ajs, {
347
+ ...methodCall,
348
+ method: 'track',
349
+ } as PreInitMethodCall<'track'>)
350
+
351
+ expect(methodCall.resolve).not.toHaveBeenCalled()
352
+ expect(methodCall.reject).toBeCalledWith(genericError)
353
+ })
354
+
355
+ it('will catch any thrown errors for a non-async functions', () => {
356
+ const genericError = new Error('An Error')
357
+ jest.spyOn(ajs, 'on').mockImplementationOnce(() => {
358
+ throw genericError
359
+ })
360
+ void callAnalyticsMethod(ajs, {
361
+ ...methodCall,
362
+ method: 'on',
363
+ args: ['foo', jest.fn()],
364
+ } as PreInitMethodCall<'on'>)
365
+
366
+ expect(methodCall.resolve).not.toHaveBeenCalled()
367
+ expect(methodCall.reject).toBeCalledWith(genericError)
368
+ })
369
+ })
370
+
371
+ it('should not resolve and return undefined if previously called', async () => {
372
+ methodCall.called = true
373
+ const result = await callAnalyticsMethod(ajs, methodCall)
374
+ expect(resolveSpy).not.toBeCalled()
375
+ expect(result).toBeUndefined()
376
+ })
377
+ })
378
+
379
+ describe(flushAnalyticsCallsInNewTask, () => {
380
+ test('should defer buffered method calls, regardless of whether or not they are async', async () => {
381
+ // @ts-ignore
382
+ Analytics.prototype['synchronousMethod'] = () => 123
383
+
384
+ // @ts-ignore
385
+ Analytics.prototype['asyncMethod'] = () => Promise.resolve(123)
386
+
387
+ const synchronousMethod = new PreInitMethodCall(
388
+ 'synchronousMethod' as any,
389
+ ['foo'],
390
+ jest.fn(),
391
+ jest.fn()
392
+ )
393
+
394
+ const asyncMethod = new PreInitMethodCall(
395
+ 'asyncMethod' as any,
396
+ ['foo'],
397
+ jest.fn(),
398
+ jest.fn()
399
+ )
400
+
401
+ const buffer = new PreInitMethodCallBuffer(synchronousMethod, asyncMethod)
402
+ flushAnalyticsCallsInNewTask(new Analytics({ writeKey: 'abc' }), buffer)
403
+ expect(synchronousMethod.resolve).not.toBeCalled()
404
+ expect(asyncMethod.resolve).not.toBeCalled()
405
+ await sleep(0)
406
+ expect(synchronousMethod.resolve).toBeCalled()
407
+ expect(asyncMethod.resolve).toBeCalled()
408
+ })
409
+
410
+ test('should handle promise rejections', async () => {
411
+ // @ts-ignore
412
+ Analytics.prototype['asyncMethod'] = () => Promise.reject('oops!')
413
+
414
+ const asyncMethod = new PreInitMethodCall(
415
+ 'asyncMethod' as any,
416
+ ['foo'],
417
+ jest.fn(),
418
+ jest.fn()
419
+ )
420
+
421
+ const buffer = new PreInitMethodCallBuffer(asyncMethod)
422
+ flushAnalyticsCallsInNewTask(new Analytics({ writeKey: 'abc' }), buffer)
423
+ await sleep(0)
424
+ expect(asyncMethod.reject).toBeCalledWith('oops!')
425
+ })
426
+
427
+ test('a thrown error by a synchronous method should not terminate the queue', async () => {
428
+ // @ts-ignore
429
+ Analytics.prototype['asyncMethod'] = () => Promise.resolve(123)
430
+
431
+ // @ts-ignore
432
+ Analytics.prototype['synchronousMethod'] = () => {
433
+ throw new Error('Ooops!')
434
+ }
435
+
436
+ const synchronousMethod = new PreInitMethodCall(
437
+ 'synchronousMethod' as any,
438
+ ['foo'],
439
+ jest.fn(),
440
+ jest.fn()
441
+ )
442
+ const asyncMethod = new PreInitMethodCall(
443
+ 'asyncMethod' as any,
444
+ ['foo'],
445
+ jest.fn(),
446
+ jest.fn()
447
+ )
448
+
449
+ const buffer = new PreInitMethodCallBuffer(synchronousMethod, asyncMethod)
450
+ flushAnalyticsCallsInNewTask(new Analytics({ writeKey: 'abc' }), buffer)
451
+ await sleep(0)
452
+ expect(synchronousMethod.reject).toBeCalledTimes(1)
453
+ expect(asyncMethod.resolve).toBeCalledTimes(1)
454
+ })
455
+ })