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.
- package/.editorconfig +10 -0
- package/.eslintrc.isomorphic.js +26 -0
- package/.eslintrc.js +86 -0
- package/.gitattributes +1 -0
- package/.github/workflows/ci.yml +33 -0
- package/.github/workflows/deploy-browser-cdn-candidate.yml +51 -0
- package/.github/workflows/deploy-releases.yml +178 -0
- package/.nvmrc +1 -0
- package/.prettierrc +7 -0
- package/.vscode/extensions.json +3 -0
- package/.vscode/launch.json +81 -0
- package/.vscode/settings.json +41 -0
- package/.yarn/plugins/@yarnpkg/plugin-constraints.cjs +52 -0
- package/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +546 -0
- package/.yarn/plugins/@yarnpkg/plugin-typescript.cjs +9 -0
- package/.yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs +28 -0
- package/.yarn/releases/yarn-3.4.1.cjs +873 -0
- package/.yarnrc.yml +15 -0
- package/jest.config.js +18 -0
- package/package.json +59 -0
- package/packages/browser/.eslintrc.js +9 -0
- package/packages/browser/.lintstagedrc.js +1 -0
- package/packages/browser/ARCHITECTURE.md +48 -0
- package/packages/browser/LICENSE.MD +45 -0
- package/packages/browser/Makefile +64 -0
- package/packages/browser/README.md +227 -0
- package/packages/browser/e2e-tests/local-server.ts +28 -0
- package/packages/browser/e2e-tests/performance/ajs-perf-browser.test.ts +75 -0
- package/packages/browser/jest.config.js +15 -0
- package/packages/browser/jest.setup.js +10 -0
- package/packages/browser/package.json +106 -0
- package/packages/browser/qa/README.md +41 -0
- package/packages/browser/qa/__fixtures__/snippets.ts +148 -0
- package/packages/browser/qa/__tests__/backwards-compatibility.test.ts +180 -0
- package/packages/browser/qa/__tests__/destinations.test.ts +101 -0
- package/packages/browser/qa/__tests__/smoke.test.ts +170 -0
- package/packages/browser/qa/lib/benchmark.ts +36 -0
- package/packages/browser/qa/lib/browser.ts +28 -0
- package/packages/browser/qa/lib/jest-reporter.js +57 -0
- package/packages/browser/qa/lib/runner.ts +142 -0
- package/packages/browser/qa/lib/schema.ts +59 -0
- package/packages/browser/qa/lib/server.ts +54 -0
- package/packages/browser/qa/lib/stats.ts +52 -0
- package/packages/browser/scripts/build-prep.sh +7 -0
- package/packages/browser/scripts/ci.sh +15 -0
- package/packages/browser/scripts/release.js +121 -0
- package/packages/browser/scripts/release.sh +9 -0
- package/packages/browser/scripts/run.sh +8 -0
- package/packages/browser/src/browser/__tests__/analytics-lazy-init.integration.test.ts +51 -0
- package/packages/browser/src/browser/__tests__/analytics-pre-init.integration.test.ts +440 -0
- package/packages/browser/src/browser/__tests__/anon-id-and-reset.integration.test.ts +73 -0
- package/packages/browser/src/browser/__tests__/cdn.test.ts +53 -0
- package/packages/browser/src/browser/__tests__/csp-detection.test.ts +140 -0
- package/packages/browser/src/browser/__tests__/inspector.integration.test.ts +121 -0
- package/packages/browser/src/browser/__tests__/integration.test.ts +1213 -0
- package/packages/browser/src/browser/__tests__/integrations.integration.test.ts +260 -0
- package/packages/browser/src/browser/__tests__/page-enrichment.integration.test.ts +216 -0
- package/packages/browser/src/browser/__tests__/query-string.integration.test.ts +116 -0
- package/packages/browser/src/browser/__tests__/standalone-analytics.test.ts +303 -0
- package/packages/browser/src/browser/__tests__/standalone-errors.test.ts +136 -0
- package/packages/browser/src/browser/__tests__/standalone.test.ts +97 -0
- package/packages/browser/src/browser/__tests__/typedef-tests/analytics-browser.ts +150 -0
- package/packages/browser/src/browser/__tests__/update-cdn-settings.test.ts +71 -0
- package/packages/browser/src/browser/browser-umd.ts +19 -0
- package/packages/browser/src/browser/index.ts +486 -0
- package/packages/browser/src/browser/standalone-analytics.ts +62 -0
- package/packages/browser/src/browser/standalone-interface.ts +11 -0
- package/packages/browser/src/browser/standalone.ts +92 -0
- package/packages/browser/src/core/__tests__/track-form.test.ts +193 -0
- package/packages/browser/src/core/__tests__/track-link.test.ts +252 -0
- package/packages/browser/src/core/analytics/__tests__/integration.test.ts +334 -0
- package/packages/browser/src/core/analytics/__tests__/test-plugins.ts +94 -0
- package/packages/browser/src/core/analytics/index.ts +672 -0
- package/packages/browser/src/core/analytics/interfaces.ts +100 -0
- package/packages/browser/src/core/arguments-resolver/__tests__/index.test.ts +524 -0
- package/packages/browser/src/core/arguments-resolver/index.ts +200 -0
- package/packages/browser/src/core/auto-track.ts +152 -0
- package/packages/browser/src/core/buffer/__tests__/index.test.ts +455 -0
- package/packages/browser/src/core/buffer/index.ts +371 -0
- package/packages/browser/src/core/callback/index.ts +1 -0
- package/packages/browser/src/core/connection/__tests__/index.test.ts +25 -0
- package/packages/browser/src/core/connection/index.ts +13 -0
- package/packages/browser/src/core/constants/index.ts +1 -0
- package/packages/browser/src/core/context/__tests__/index.test.ts +201 -0
- package/packages/browser/src/core/context/index.ts +21 -0
- package/packages/browser/src/core/environment/index.ts +7 -0
- package/packages/browser/src/core/events/__tests__/index.test.ts +450 -0
- package/packages/browser/src/core/events/index.ts +280 -0
- package/packages/browser/src/core/events/interfaces.ts +36 -0
- package/packages/browser/src/core/inspector/index.ts +14 -0
- package/packages/browser/src/core/page/__tests__/index.test.ts +130 -0
- package/packages/browser/src/core/page/add-page-context.ts +33 -0
- package/packages/browser/src/core/page/get-page-context.ts +140 -0
- package/packages/browser/src/core/page/index.ts +2 -0
- package/packages/browser/src/core/plugin/index.ts +12 -0
- package/packages/browser/src/core/query-string/__tests__/gracefulDecodeURIComponent.test.ts +17 -0
- package/packages/browser/src/core/query-string/__tests__/index.test.ts +149 -0
- package/packages/browser/src/core/query-string/__tests__/pickPrefix.test.ts +31 -0
- package/packages/browser/src/core/query-string/__tests__/useQueryString.test.ts +60 -0
- package/packages/browser/src/core/query-string/gracefulDecodeURIComponent.ts +16 -0
- package/packages/browser/src/core/query-string/index.ts +64 -0
- package/packages/browser/src/core/query-string/pickPrefix.ts +20 -0
- package/packages/browser/src/core/queue/__tests__/event-queue.test.ts +82 -0
- package/packages/browser/src/core/queue/event-queue.ts +22 -0
- package/packages/browser/src/core/session/__tests__/index.test.ts +41 -0
- package/packages/browser/src/core/session/index.ts +107 -0
- package/packages/browser/src/core/stats/__tests__/index.test.ts +15 -0
- package/packages/browser/src/core/stats/__tests__/remote-metrics.test.ts +189 -0
- package/packages/browser/src/core/stats/index.ts +15 -0
- package/packages/browser/src/core/stats/remote-metrics.ts +144 -0
- package/packages/browser/src/core/storage/__tests__/cookieStorage.test.ts +58 -0
- package/packages/browser/src/core/storage/__tests__/localStorage.test.ts +70 -0
- package/packages/browser/src/core/storage/__tests__/test-helpers.ts +26 -0
- package/packages/browser/src/core/storage/__tests__/universalStorage.test.ts +167 -0
- package/packages/browser/src/core/storage/cookieStorage.ts +80 -0
- package/packages/browser/src/core/storage/index.ts +64 -0
- package/packages/browser/src/core/storage/localStorage.ts +45 -0
- package/packages/browser/src/core/storage/memoryStorage.ts +22 -0
- package/packages/browser/src/core/storage/settings.ts +23 -0
- package/packages/browser/src/core/storage/types.ts +49 -0
- package/packages/browser/src/core/storage/universalStorage.ts +78 -0
- package/packages/browser/src/core/user/__tests__/index.test.ts +922 -0
- package/packages/browser/src/core/user/__tests__/migrate.test.ts +101 -0
- package/packages/browser/src/core/user/__tests__/session.test.ts +136 -0
- package/packages/browser/src/core/user/__tests__/tld.test.ts +36 -0
- package/packages/browser/src/core/user/index.ts +399 -0
- package/packages/browser/src/core/user/migrate.ts +126 -0
- package/packages/browser/src/core/user/tld.ts +65 -0
- package/packages/browser/src/core/user/vendor/crypto-es/LICENSE +53 -0
- package/packages/browser/src/core/user/vendor/crypto-es/lib/aes.ts +302 -0
- package/packages/browser/src/core/user/vendor/crypto-es/lib/cipher-core.ts +922 -0
- package/packages/browser/src/core/user/vendor/crypto-es/lib/core.ts +806 -0
- package/packages/browser/src/core/user/vendor/crypto-es/lib/enc-base64.ts +110 -0
- package/packages/browser/src/core/user/vendor/crypto-es/lib/evpkdf.ts +110 -0
- package/packages/browser/src/core/user/vendor/crypto-es/lib/md5.ts +238 -0
- package/packages/browser/src/core/user/vendor/readme.md +7 -0
- package/packages/browser/src/generated/__tests__/version.test.ts +18 -0
- package/packages/browser/src/generated/version.ts +2 -0
- package/packages/browser/src/index.ts +13 -0
- package/packages/browser/src/lib/__tests__/embedded-write-key.test.ts +15 -0
- package/packages/browser/src/lib/__tests__/fetch.test.ts +35 -0
- package/packages/browser/src/lib/__tests__/get-process-env.test.ts +5 -0
- package/packages/browser/src/lib/__tests__/group-by.test.ts +96 -0
- package/packages/browser/src/lib/__tests__/is-plan-event-enabled.test.ts +36 -0
- package/packages/browser/src/lib/__tests__/is-thenable.test.ts +39 -0
- package/packages/browser/src/lib/__tests__/merged-options.test.ts +123 -0
- package/packages/browser/src/lib/__tests__/on-page-change.test.ts +74 -0
- package/packages/browser/src/lib/__tests__/parse-cdn.test.ts +88 -0
- package/packages/browser/src/lib/__tests__/pick.test.ts +34 -0
- package/packages/browser/src/lib/__tests__/pick.typedef.ts +39 -0
- package/packages/browser/src/lib/bind-all.ts +19 -0
- package/packages/browser/src/lib/browser-polyfill.ts +23 -0
- package/packages/browser/src/lib/client-hints/__tests__/index.test.ts +66 -0
- package/packages/browser/src/lib/client-hints/index.ts +16 -0
- package/packages/browser/src/lib/client-hints/interfaces.ts +42 -0
- package/packages/browser/src/lib/create-deferred.ts +16 -0
- package/packages/browser/src/lib/csp-detection.ts +8 -0
- package/packages/browser/src/lib/embedded-write-key.ts +24 -0
- package/packages/browser/src/lib/fetch.ts +10 -0
- package/packages/browser/src/lib/get-global.ts +16 -0
- package/packages/browser/src/lib/get-process-env.ts +11 -0
- package/packages/browser/src/lib/global-analytics-helper.ts +31 -0
- package/packages/browser/src/lib/group-by.ts +30 -0
- package/packages/browser/src/lib/is-plan-event-enabled.ts +20 -0
- package/packages/browser/src/lib/is-thenable.ts +9 -0
- package/packages/browser/src/lib/load-script.ts +66 -0
- package/packages/browser/src/lib/merged-options.ts +46 -0
- package/packages/browser/src/lib/on-page-change.ts +29 -0
- package/packages/browser/src/lib/p-while.ts +12 -0
- package/packages/browser/src/lib/parse-cdn.ts +56 -0
- package/packages/browser/src/lib/pick.ts +28 -0
- package/packages/browser/src/lib/priority-queue/__tests__/backoff.test.ts +23 -0
- package/packages/browser/src/lib/priority-queue/__tests__/index.test.ts +158 -0
- package/packages/browser/src/lib/priority-queue/__tests__/persisted.test.ts +228 -0
- package/packages/browser/src/lib/priority-queue/backoff.ts +24 -0
- package/packages/browser/src/lib/priority-queue/index.ts +6 -0
- package/packages/browser/src/lib/priority-queue/persisted.ts +127 -0
- package/packages/browser/src/lib/sleep.ts +4 -0
- package/packages/browser/src/lib/to-facade.ts +53 -0
- package/packages/browser/src/lib/version-type.ts +10 -0
- package/packages/browser/src/node/__tests__/node-integration.test.ts +19 -0
- package/packages/browser/src/node/index.ts +36 -0
- package/packages/browser/src/node/node.browser.ts +7 -0
- package/packages/browser/src/plugins/ajs-destination/__tests__/index.test.ts +834 -0
- package/packages/browser/src/plugins/ajs-destination/index.ts +392 -0
- package/packages/browser/src/plugins/ajs-destination/loader.ts +129 -0
- package/packages/browser/src/plugins/ajs-destination/types.ts +44 -0
- package/packages/browser/src/plugins/ajs-destination/utils.ts +32 -0
- package/packages/browser/src/plugins/analytics-node/__tests__/index.test.ts +69 -0
- package/packages/browser/src/plugins/analytics-node/index.ts +67 -0
- package/packages/browser/src/plugins/env-enrichment/__tests__/index.test.ts +421 -0
- package/packages/browser/src/plugins/env-enrichment/index.ts +208 -0
- package/packages/browser/src/plugins/hightouchio/__tests__/batched-dispatcher.test.ts +299 -0
- package/packages/browser/src/plugins/hightouchio/__tests__/index.test.ts +317 -0
- package/packages/browser/src/plugins/hightouchio/__tests__/normalize.test.ts +181 -0
- package/packages/browser/src/plugins/hightouchio/__tests__/retries.test.ts +82 -0
- package/packages/browser/src/plugins/hightouchio/batched-dispatcher.ts +127 -0
- package/packages/browser/src/plugins/hightouchio/fetch-dispatcher.ts +27 -0
- package/packages/browser/src/plugins/hightouchio/index.ts +147 -0
- package/packages/browser/src/plugins/hightouchio/normalize.ts +71 -0
- package/packages/browser/src/plugins/hightouchio/schedule-flush.ts +58 -0
- package/packages/browser/src/plugins/legacy-video-plugins/__tests__/index.test.ts +48 -0
- package/packages/browser/src/plugins/legacy-video-plugins/index.ts +16 -0
- package/packages/browser/src/plugins/middleware/__tests__/index.test.ts +268 -0
- package/packages/browser/src/plugins/middleware/index.ts +131 -0
- package/packages/browser/src/plugins/remote-loader/__tests__/index.test.ts +943 -0
- package/packages/browser/src/plugins/remote-loader/index.ts +256 -0
- package/packages/browser/src/plugins/remote-middleware/__tests__/index.test.ts +116 -0
- package/packages/browser/src/plugins/remote-middleware/index.ts +44 -0
- package/packages/browser/src/plugins/routing-middleware/__tests__/index.test.ts +64 -0
- package/packages/browser/src/plugins/routing-middleware/index.ts +37 -0
- package/packages/browser/src/plugins/schema-filter/__tests__/index.test.ts +520 -0
- package/packages/browser/src/plugins/schema-filter/index.ts +90 -0
- package/packages/browser/src/plugins/validation/__tests__/index.test.ts +78 -0
- package/packages/browser/src/plugins/validation/index.ts +44 -0
- package/packages/browser/src/test-helpers/browser-storage.ts +75 -0
- package/packages/browser/src/test-helpers/factories.ts +18 -0
- package/packages/browser/src/test-helpers/fetch-parse.ts +8 -0
- package/packages/browser/src/test-helpers/fixtures/cdn-settings.ts +301 -0
- package/packages/browser/src/test-helpers/fixtures/classic-destination.ts +25 -0
- package/packages/browser/src/test-helpers/fixtures/client-hints.ts +28 -0
- package/packages/browser/src/test-helpers/fixtures/create-fetch-method.ts +30 -0
- package/packages/browser/src/test-helpers/fixtures/index.ts +4 -0
- package/packages/browser/src/test-helpers/fixtures/page-context.ts +11 -0
- package/packages/browser/src/test-helpers/test-writekeys.ts +5 -0
- package/packages/browser/src/test-helpers/type-assertions.ts +11 -0
- package/packages/browser/src/tester/__fixtures__/hightouch-snippet.ts +64 -0
- package/packages/browser/src/tester/__fixtures__/index.html +8 -0
- package/packages/browser/src/tester/ajs-perf.ts +30 -0
- package/packages/browser/src/tester/ajs-tester.ts +119 -0
- package/packages/browser/src/tester/server.js +16 -0
- package/packages/browser/tsconfig.build.json +9 -0
- package/packages/browser/tsconfig.json +13 -0
- package/packages/browser/webpack.config.js +106 -0
- package/packages/config/package.json +10 -0
- package/packages/config/src/index.js +4 -0
- package/packages/config/src/jest/config.js +50 -0
- package/packages/config/src/jest/get-module-map.js +34 -0
- package/packages/config/src/lint-staged/config.js +4 -0
- package/packages/config-webpack/package.json +20 -0
- package/packages/config-webpack/webpack.config.common.js +75 -0
- package/packages/consent/consent-tools/.eslintrc.js +7 -0
- package/packages/consent/consent-tools/.lintstagedrc.js +1 -0
- package/packages/consent/consent-tools/LICENSE +45 -0
- package/packages/consent/consent-tools/README.md +104 -0
- package/packages/consent/consent-tools/jest.config.js +6 -0
- package/packages/consent/consent-tools/jest.setup.js +4 -0
- package/packages/consent/consent-tools/package.json +48 -0
- package/packages/consent/consent-tools/src/domain/__tests__/assertions/integrations-assertions.ts +37 -0
- package/packages/consent/consent-tools/src/domain/__tests__/consent-stamping.test.ts +45 -0
- package/packages/consent/consent-tools/src/domain/__tests__/create-wrapper.test.ts +816 -0
- package/packages/consent/consent-tools/src/domain/__tests__/typedef-tests.ts +21 -0
- package/packages/consent/consent-tools/src/domain/consent-changed.ts +51 -0
- package/packages/consent/consent-tools/src/domain/consent-stamping.ts +19 -0
- package/packages/consent/consent-tools/src/domain/create-wrapper.ts +238 -0
- package/packages/consent/consent-tools/src/domain/get-initialized-analytics.ts +25 -0
- package/packages/consent/consent-tools/src/domain/load-cancellation.ts +31 -0
- package/packages/consent/consent-tools/src/domain/validation/__tests__/options-validators.test.ts +77 -0
- package/packages/consent/consent-tools/src/domain/validation/__tests__/validation-error.test.ts +15 -0
- package/packages/consent/consent-tools/src/domain/validation/common-validators.ts +19 -0
- package/packages/consent/consent-tools/src/domain/validation/index.ts +1 -0
- package/packages/consent/consent-tools/src/domain/validation/options-validators.ts +74 -0
- package/packages/consent/consent-tools/src/domain/validation/validation-error.ts +11 -0
- package/packages/consent/consent-tools/src/index.ts +16 -0
- package/packages/consent/consent-tools/src/types/errors.ts +14 -0
- package/packages/consent/consent-tools/src/types/index.ts +3 -0
- package/packages/consent/consent-tools/src/types/settings.ts +121 -0
- package/packages/consent/consent-tools/src/types/wrapper.ts +107 -0
- package/packages/consent/consent-tools/src/utils/index.ts +4 -0
- package/packages/consent/consent-tools/src/utils/pick.ts +18 -0
- package/packages/consent/consent-tools/src/utils/pipe.ts +14 -0
- package/packages/consent/consent-tools/src/utils/resolve-when.ts +32 -0
- package/packages/consent/consent-tools/src/utils/uniq.ts +4 -0
- package/packages/consent/consent-tools/tsconfig.build.json +9 -0
- package/packages/consent/consent-tools/tsconfig.json +12 -0
- package/packages/consent/consent-wrapper-onetrust/.eslintrc.js +7 -0
- package/packages/consent/consent-wrapper-onetrust/.lintstagedrc.js +1 -0
- package/packages/consent/consent-wrapper-onetrust/LICENSE +45 -0
- package/packages/consent/consent-wrapper-onetrust/README.md +125 -0
- package/packages/consent/consent-wrapper-onetrust/img/onetrust-cat-id.jpg +0 -0
- package/packages/consent/consent-wrapper-onetrust/img/onetrust-popup.jpg +0 -0
- package/packages/consent/consent-wrapper-onetrust/jest.config.js +6 -0
- package/packages/consent/consent-wrapper-onetrust/jest.setup.js +4 -0
- package/packages/consent/consent-wrapper-onetrust/package.json +60 -0
- package/packages/consent/consent-wrapper-onetrust/src/domain/__tests__/wrapper.test.ts +151 -0
- package/packages/consent/consent-wrapper-onetrust/src/domain/wrapper.ts +61 -0
- package/packages/consent/consent-wrapper-onetrust/src/index.ts +6 -0
- package/packages/consent/consent-wrapper-onetrust/src/index.umd.ts +11 -0
- package/packages/consent/consent-wrapper-onetrust/src/lib/__tests__/onetrust-api.test.ts +181 -0
- package/packages/consent/consent-wrapper-onetrust/src/lib/onetrust-api.ts +155 -0
- package/packages/consent/consent-wrapper-onetrust/src/lib/validation/index.ts +1 -0
- package/packages/consent/consent-wrapper-onetrust/src/lib/validation/onetrust-api-error.ts +11 -0
- package/packages/consent/consent-wrapper-onetrust/src/test-helpers/mocks.ts +23 -0
- package/packages/consent/consent-wrapper-onetrust/src/test-helpers/onetrust-globals.d.ts +11 -0
- package/packages/consent/consent-wrapper-onetrust/src/test-helpers/utils.ts +3 -0
- package/packages/consent/consent-wrapper-onetrust/tsconfig.build.json +9 -0
- package/packages/consent/consent-wrapper-onetrust/tsconfig.json +11 -0
- package/packages/consent/consent-wrapper-onetrust/webpack.config.js +25 -0
- package/packages/core/.eslintrc.js +4 -0
- package/packages/core/.lintstagedrc.js +1 -0
- package/packages/core/LICENSE.MD +45 -0
- package/packages/core/README.md +3 -0
- package/packages/core/jest.config.js +5 -0
- package/packages/core/jest.setup.js +10 -0
- package/packages/core/package.json +40 -0
- package/packages/core/src/analytics/__tests__/dispatch.test.ts +95 -0
- package/packages/core/src/analytics/dispatch.ts +58 -0
- package/packages/core/src/analytics/index.ts +11 -0
- package/packages/core/src/callback/__tests__/index.test.ts +85 -0
- package/packages/core/src/callback/index.ts +51 -0
- package/packages/core/src/context/index.ts +123 -0
- package/packages/core/src/emitter/__tests__/emitter.test.ts +74 -0
- package/packages/core/src/emitter/index.ts +65 -0
- package/packages/core/src/emitter/interface.ts +31 -0
- package/packages/core/src/events/__tests__/index.test.ts +394 -0
- package/packages/core/src/events/index.ts +280 -0
- package/packages/core/src/events/interfaces.ts +475 -0
- package/packages/core/src/index.ts +19 -0
- package/packages/core/src/logger/__tests__/index.test.ts +66 -0
- package/packages/core/src/logger/index.ts +74 -0
- package/packages/core/src/plugins/index.ts +43 -0
- package/packages/core/src/priority-queue/__tests__/backoff.test.ts +23 -0
- package/packages/core/src/priority-queue/__tests__/index.test.ts +158 -0
- package/packages/core/src/priority-queue/backoff.ts +24 -0
- package/packages/core/src/priority-queue/index.ts +103 -0
- package/packages/core/src/queue/__tests__/event-queue.test.ts +678 -0
- package/packages/core/src/queue/__tests__/extension-flushing.test.ts +416 -0
- package/packages/core/src/queue/delivery.ts +73 -0
- package/packages/core/src/queue/event-queue.ts +318 -0
- package/packages/core/src/stats/__tests__/index.test.ts +103 -0
- package/packages/core/src/stats/index.ts +88 -0
- package/packages/core/src/task/__tests__/task-group.test.ts +26 -0
- package/packages/core/src/task/task-group.ts +31 -0
- package/packages/core/src/user/index.ts +7 -0
- package/packages/core/src/utils/__tests__/group-by.test.ts +96 -0
- package/packages/core/src/utils/__tests__/is-plain-object.test.ts +27 -0
- package/packages/core/src/utils/__tests__/is-thenable.test.ts +39 -0
- package/packages/core/src/utils/bind-all.ts +19 -0
- package/packages/core/src/utils/get-global.ts +17 -0
- package/packages/core/src/utils/group-by.ts +30 -0
- package/packages/core/src/utils/has-properties.ts +7 -0
- package/packages/core/src/utils/is-plain-object.ts +26 -0
- package/packages/core/src/utils/is-thenable.ts +9 -0
- package/packages/core/src/utils/p-while.ts +12 -0
- package/packages/core/src/utils/pick.ts +8 -0
- package/packages/core/src/utils/ts-helpers.ts +13 -0
- package/packages/core/src/validation/__tests__/assertions.test.ts +155 -0
- package/packages/core/src/validation/assertions.ts +72 -0
- package/packages/core/src/validation/errors.ts +8 -0
- package/packages/core/src/validation/helpers.ts +23 -0
- package/packages/core/test-helpers/index.ts +2 -0
- package/packages/core/test-helpers/test-ctx.ts +7 -0
- package/packages/core/test-helpers/test-event-queue.ts +7 -0
- package/packages/core/tsconfig.build.json +9 -0
- package/packages/core/tsconfig.json +11 -0
- package/packages/node/.eslintrc.js +7 -0
- package/packages/node/.lintstagedrc.js +1 -0
- package/packages/node/LICENSE +45 -0
- package/packages/node/README.md +138 -0
- package/packages/node/jest.config.js +5 -0
- package/packages/node/jest.setup.js +4 -0
- package/packages/node/package.json +50 -0
- package/packages/node/scripts/version.sh +11 -0
- package/packages/node/src/__tests__/callback.test.ts +47 -0
- package/packages/node/src/__tests__/disable.integration.test.ts +42 -0
- package/packages/node/src/__tests__/emitter.integration.test.ts +45 -0
- package/packages/node/src/__tests__/graceful-shutdown-integration.test.ts +244 -0
- package/packages/node/src/__tests__/http-client.integration.test.ts +69 -0
- package/packages/node/src/__tests__/http-integration.test.ts +362 -0
- package/packages/node/src/__tests__/integration.test.ts +357 -0
- package/packages/node/src/__tests__/plugins.test.ts +16 -0
- package/packages/node/src/__tests__/settings.test.ts +9 -0
- package/packages/node/src/__tests__/test-helpers/assert-shape/http-request-event.ts +13 -0
- package/packages/node/src/__tests__/test-helpers/assert-shape/index.ts +2 -0
- package/packages/node/src/__tests__/test-helpers/assert-shape/segment-http-api.ts +43 -0
- package/packages/node/src/__tests__/test-helpers/create-test-analytics.ts +42 -0
- package/packages/node/src/__tests__/test-helpers/factories.ts +17 -0
- package/packages/node/src/__tests__/test-helpers/is-valid-date.ts +6 -0
- package/packages/node/src/__tests__/test-helpers/resolve-ctx.ts +19 -0
- package/packages/node/src/__tests__/test-helpers/resolve-emitter.ts +11 -0
- package/packages/node/src/__tests__/test-helpers/sleep.ts +3 -0
- package/packages/node/src/__tests__/test-helpers/test-plugin.ts +16 -0
- package/packages/node/src/__tests__/typedef-tests.ts +120 -0
- package/packages/node/src/app/analytics-node.ts +299 -0
- package/packages/node/src/app/context.ts +11 -0
- package/packages/node/src/app/dispatch-emit.ts +42 -0
- package/packages/node/src/app/emitter.ts +23 -0
- package/packages/node/src/app/event-factory.ts +20 -0
- package/packages/node/src/app/event-queue.ts +23 -0
- package/packages/node/src/app/settings.ts +49 -0
- package/packages/node/src/app/types/index.ts +3 -0
- package/packages/node/src/app/types/params.ts +76 -0
- package/packages/node/src/app/types/plugin.ts +5 -0
- package/packages/node/src/app/types/segment-event.ts +7 -0
- package/packages/node/src/generated/version.ts +2 -0
- package/packages/node/src/index.ts +26 -0
- package/packages/node/src/lib/__tests__/abort.test.ts +54 -0
- package/packages/node/src/lib/__tests__/create-url.test.ts +35 -0
- package/packages/node/src/lib/__tests__/env.test.ts +52 -0
- package/packages/node/src/lib/__tests__/get-message-id.test.ts +21 -0
- package/packages/node/src/lib/abort.ts +77 -0
- package/packages/node/src/lib/base-64-encode.ts +8 -0
- package/packages/node/src/lib/create-url.ts +11 -0
- package/packages/node/src/lib/env.ts +45 -0
- package/packages/node/src/lib/extract-promise-parts.ts +21 -0
- package/packages/node/src/lib/fetch.ts +16 -0
- package/packages/node/src/lib/get-message-id.ts +10 -0
- package/packages/node/src/lib/http-client.ts +95 -0
- package/packages/node/src/lib/uuid.ts +1 -0
- package/packages/node/src/plugins/segmentio/__tests__/methods.test.ts +223 -0
- package/packages/node/src/plugins/segmentio/__tests__/publisher.test.ts +411 -0
- package/packages/node/src/plugins/segmentio/context-batch.ts +71 -0
- package/packages/node/src/plugins/segmentio/index.ts +66 -0
- package/packages/node/src/plugins/segmentio/publisher.ts +265 -0
- package/packages/node/tsconfig.build.json +9 -0
- package/packages/node/tsconfig.json +10 -0
- package/packages/test-helpers/.eslintrc.js +7 -0
- package/packages/test-helpers/.lintstagedrc.js +1 -0
- package/packages/test-helpers/jest.config.js +3 -0
- package/packages/test-helpers/package.json +26 -0
- package/packages/test-helpers/src/analytics/cdn-settings-builder.ts +79 -0
- package/packages/test-helpers/src/analytics/index.ts +1 -0
- package/packages/test-helpers/src/index.ts +2 -0
- package/packages/test-helpers/src/utils/index.ts +1 -0
- package/packages/test-helpers/src/utils/sleep.ts +4 -0
- package/packages/test-helpers/tsconfig.build.json +9 -0
- package/packages/test-helpers/tsconfig.json +11 -0
- package/tsconfig.json +21 -0
- package/turbo.json +39 -0
- package/typings/get-monorepo-packages.d.ts +9 -0
- 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
|
+
})
|