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