utneque 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
package/.yarnrc.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
nodeLinker: node-modules
|
2
|
+
|
3
|
+
plugins:
|
4
|
+
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
|
5
|
+
spec: "@yarnpkg/plugin-workspace-tools"
|
6
|
+
- path: .yarn/plugins/@yarnpkg/plugin-constraints.cjs
|
7
|
+
spec: "@yarnpkg/plugin-constraints"
|
8
|
+
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
|
9
|
+
spec: "@yarnpkg/plugin-interactive-tools"
|
10
|
+
- path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
|
11
|
+
spec: "@yarnpkg/plugin-typescript"
|
12
|
+
|
13
|
+
preferInteractive: true
|
14
|
+
|
15
|
+
yarnPath: .yarn/releases/yarn-3.4.1.cjs
|
package/jest.config.js
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
const { createJestTSConfig } = require('@internal/config')
|
2
|
+
|
3
|
+
/**
|
4
|
+
* This config detects our monorepo, and allows
|
5
|
+
* you to run every single package test in a single jest instance using 'yarn jest'.
|
6
|
+
* Thus, `yarn jest --watch` works as expected (unlike say, when using turborepo)
|
7
|
+
*/
|
8
|
+
module.exports = () =>
|
9
|
+
createJestTSConfig(__dirname, {
|
10
|
+
projects: [
|
11
|
+
// being explicit here, as a globbing bug means that using packages/* can cause problems in non-worktrees (haven't fully investigated yet).
|
12
|
+
'<rootDir>/packages/core',
|
13
|
+
'<rootDir>/packages/node',
|
14
|
+
'<rootDir>/packages/browser',
|
15
|
+
'<rootDir>/packages/consent/consent-tools',
|
16
|
+
'<rootDir>/packages/consent/consent-wrapper-onetrust',
|
17
|
+
],
|
18
|
+
})
|
package/package.json
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
{
|
2
|
+
"name": "utneque",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"workspaces": [
|
5
|
+
"examples/*",
|
6
|
+
"packages/*",
|
7
|
+
"packages/consent/*"
|
8
|
+
],
|
9
|
+
"engines": {
|
10
|
+
"node": "^16.16.0"
|
11
|
+
},
|
12
|
+
"packageManager": "yarn@3.4.1",
|
13
|
+
"devDependencies": {
|
14
|
+
"@changesets/changelog-github": "^0.4.5",
|
15
|
+
"@changesets/cli": "^2.23.2",
|
16
|
+
"@npmcli/promise-spawn": "^3.0.0",
|
17
|
+
"@types/express": "4",
|
18
|
+
"@types/jest": "^28.1.1",
|
19
|
+
"@types/lodash": "^4",
|
20
|
+
"@types/node-fetch": "^2.6.2",
|
21
|
+
"@typescript-eslint/eslint-plugin": "^5.21.0",
|
22
|
+
"@typescript-eslint/parser": "^5.21.0",
|
23
|
+
"concurrently": "^7.6.0",
|
24
|
+
"eslint": "^8.14.0",
|
25
|
+
"eslint-config-prettier": "^8.5.0",
|
26
|
+
"eslint-plugin-import": "^2.27.5",
|
27
|
+
"eslint-plugin-jest": "^27.2.2",
|
28
|
+
"eslint-plugin-prettier": "^4.0.0",
|
29
|
+
"express": "^4.18.2",
|
30
|
+
"get-monorepo-packages": "^1.2.0",
|
31
|
+
"husky": "^8.0.0",
|
32
|
+
"jest": "^28.1.0",
|
33
|
+
"lint-staged": "^13.0.0",
|
34
|
+
"lodash": "^4.17.21",
|
35
|
+
"nock": "^13.3.0",
|
36
|
+
"node-gyp": "^9.0.0",
|
37
|
+
"prettier": "^2.6.2",
|
38
|
+
"ts-jest": "^28.0.4",
|
39
|
+
"ts-node": "^10.8.0",
|
40
|
+
"turbo": "^1.10.14",
|
41
|
+
"typescript": "^4.7.0",
|
42
|
+
"webpack": "^5.76.0",
|
43
|
+
"webpack-dev-server": "^4.15.1"
|
44
|
+
},
|
45
|
+
"resolutions": {
|
46
|
+
"@ht-sdks/events-sdk-js-browser": "workspace:*",
|
47
|
+
"@ht-sdks/events-sdk-js-node": "workspace:*",
|
48
|
+
"@ht-sdks/events-sdk-js-core": "workspace:*"
|
49
|
+
},
|
50
|
+
"author": "ElzaLeuschke",
|
51
|
+
"repository": {
|
52
|
+
"type": "git",
|
53
|
+
"url": "https://github.com/KaileeJerde/utneque.git"
|
54
|
+
},
|
55
|
+
"bugs": {
|
56
|
+
"url": "https://github.com/KaileeJerde/utneque.git/issues"
|
57
|
+
},
|
58
|
+
"homepage": "https://github.com/KaileeJerde/utneque.git"
|
59
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
module.exports = require("@internal/config").lintStagedConfig
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Architecture
|
2
|
+
|
3
|
+
## Codebases
|
4
|
+
|
5
|
+
Javascript event tracking can be thought of as two different codebases:
|
6
|
+
|
7
|
+
- [events-sdk-js-mono](https://github.com/ht-sdks/events-sdk-js-mono): All core functionality
|
8
|
+
- Legacy client side destinations and plugins
|
9
|
+
|
10
|
+
## Core
|
11
|
+
|
12
|
+
Some of the bigger core modules are briefly outlined here -
|
13
|
+
|
14
|
+
- arguments-resolver: Responsible for reshuffling arguments in event calls
|
15
|
+
- context: Responsible for building context objects for different events
|
16
|
+
- emitter: Responsible for emitting events and adding listeners for them
|
17
|
+
- events: Responsible for building the different events (track, page, etc), and normalizing those events
|
18
|
+
- logger: Responsible for building and flushing the logs that will be carried around in an events context object
|
19
|
+
- queue: The heart of events-sdk-js, the queue is responsible for managing events which will be delivered to plugins and destinations, and handles things such as retries, timeouts, and delivery reliability
|
20
|
+
- user: Responsible for all of the logic built around an analytics user
|
21
|
+
|
22
|
+
The general end to end flow of events-sdk-js core is as follows:
|
23
|
+
|
24
|
+
1. Legacy settings and destinations are loaded from a settings object passed at initialization
|
25
|
+
2. The HtEvents object is instantiated with the loaded settings, and sets up things such as new/existing users and an event queue.
|
26
|
+
3. Events are built and queued when a user makes a call (ie. analytics.track())
|
27
|
+
4. The event is dispatched, goes through all enabled plugins, and is finally sent through the hightouch.io plugin to get the data into hightouch
|
28
|
+
|
29
|
+
## Everything is a Plugin
|
30
|
+
|
31
|
+
When developing against events-sdk-js you will likely be writing plugins, which can augment events-sdk-js functionality and enrich data. Plugins are isolated chunks which you can build, test, version, and deploy independently of the rest of the codebase. Extensions are bounded by events-sdk-js which handles things such as observability, retries, and error management.
|
32
|
+
|
33
|
+
Plugins can be of two different priorities:
|
34
|
+
|
35
|
+
- Critical: events-sdk-js should expect this plugin to be loaded before starting event delivery
|
36
|
+
- Non-critical: events-sdk-js can start event delivery before this plugin has finished loading
|
37
|
+
|
38
|
+
and can be of five different types:
|
39
|
+
|
40
|
+
- Before: Pleguns that need to be run before any other plugins are run. An example of this would be validating events before passing them along to other plugins.
|
41
|
+
- After: Plugins that need to run after all other plugins have run. An example of this is the hightouch.io integration, which will wait for destinations to succeed or fail so that it can send its observability metrics.
|
42
|
+
- Destination: Destinations to send the event to (ie. legacy destinations). Does not modify the event and failure does not halt execution.
|
43
|
+
- Enrichment: Modifies an event, failure here could halt the event pipeline.
|
44
|
+
- Utility: Plugins that change events-sdk-js functionality and don't fall into the other categories.
|
45
|
+
|
46
|
+
## Observability
|
47
|
+
|
48
|
+
Every event and plugin has a context object, which contains both metrics and logs that were collected throughout their lifetime. Logs can be used for debugging, and the metrics will be included when the event is sent to Hightouch.
|
@@ -0,0 +1,45 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright © 2023 Hightouch
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
22
|
+
|
23
|
+
---
|
24
|
+
|
25
|
+
The MIT License (MIT)
|
26
|
+
|
27
|
+
Copyright © 2021 Segment
|
28
|
+
|
29
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
30
|
+
of this software and associated documentation files (the "Software"), to deal
|
31
|
+
in the Software without restriction, including without limitation the rights
|
32
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
33
|
+
copies of the Software, and to permit persons to whom the Software is
|
34
|
+
furnished to do so, subject to the following conditions:
|
35
|
+
|
36
|
+
The above copyright notice and this permission notice shall be included in
|
37
|
+
all copies or substantial portions of the Software.
|
38
|
+
|
39
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
40
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
41
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
42
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
43
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
44
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
45
|
+
THE SOFTWARE.
|
@@ -0,0 +1,64 @@
|
|
1
|
+
BIN := ./node_modules/.bin
|
2
|
+
yarn_run := yarn run -T browser
|
3
|
+
|
4
|
+
help: ## Lists all available make tasks and some short documentation about them
|
5
|
+
@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-24s\033[0m %s\n", $$1, $$2}'
|
6
|
+
.PHONY: help
|
7
|
+
|
8
|
+
|
9
|
+
## Basic repo maintenance
|
10
|
+
|
11
|
+
# Installs npm dependencies
|
12
|
+
node_modules:
|
13
|
+
yarn install --immutable
|
14
|
+
@touch $@
|
15
|
+
|
16
|
+
build-browser: build # build dependencies
|
17
|
+
$(yarn_run) umd --no-stats
|
18
|
+
.PHONY: build-browser
|
19
|
+
|
20
|
+
build: ## Builds libraries in prod mode, and all dependencies
|
21
|
+
yarn run -T browser . build
|
22
|
+
.PHONY: build
|
23
|
+
|
24
|
+
clean: ## Clean the build directory
|
25
|
+
rm -rf dist generated
|
26
|
+
.PHONY: clean
|
27
|
+
|
28
|
+
## Test Commands
|
29
|
+
|
30
|
+
tdd: node_modules ## Runs unit tests in watch mode
|
31
|
+
$(yarn_run) test --watch
|
32
|
+
.PHONY: tdd
|
33
|
+
|
34
|
+
test-unit: node_modules ## Runs unit tests
|
35
|
+
$(yarn_run) test
|
36
|
+
.PHONY: test-unit
|
37
|
+
|
38
|
+
test-coverage: node_modules ## Runs unit tests with coverage
|
39
|
+
$(yarn_run) test --coverage --forceExit
|
40
|
+
.PHONY: test-coverage
|
41
|
+
|
42
|
+
test-qa: build-browser ## Runs all QA tests in a single command
|
43
|
+
$(yarn_run) test --runTestsByPath qa/__tests__/*.test.ts --testPathIgnorePatterns qa/__tests__/destinations.test.ts --reporters="default" --reporters="<rootDir>/qa/lib/jest-reporter.js" ${args}
|
44
|
+
.PHONY: test-coverage
|
45
|
+
|
46
|
+
test-qa-destinations: build-browser ## Runs Destination QA tests. options. DESTINATION=amplitude DEBUG=true
|
47
|
+
$(yarn_run) test --forceExit --runTestsByPath qa/__tests__/destinations.test.ts --reporters="default" --reporters="<rootDir>/qa/lib/jest-reporter.js" ${args}
|
48
|
+
.PHONY: test-coverage
|
49
|
+
|
50
|
+
test-integration: build ## Runs all integration tests in a single command
|
51
|
+
$(yarn_run) test --forceExit --runTestsByPath e2e-tests/**/*.test.ts ${args}
|
52
|
+
.PHONY: test-coverage
|
53
|
+
|
54
|
+
test-perf: build ## Runs all integration tests in a single command
|
55
|
+
$(yarn_run) test --forceExit --runTestsByPath e2e-tests/performance/*.test.ts ${args}
|
56
|
+
.PHONY: test-coverage
|
57
|
+
|
58
|
+
lint: node_modules ## Lints the source code
|
59
|
+
$(yarn_run) lint
|
60
|
+
.PHONY: lint
|
61
|
+
|
62
|
+
analyze:
|
63
|
+
NODE_ENV=production $(BIN)/webpack --profile --json > stats.json && $(BIN)/webpack-bundle-analyzer --port 4200 stats.json
|
64
|
+
.PHONY: analyze
|
@@ -0,0 +1,227 @@
|
|
1
|
+
# Events Javascript SDK
|
2
|
+
|
3
|
+
## Installation via CDN
|
4
|
+
|
5
|
+
To integrate the JavaScript SDK with your website, place the following code snippet in the `<head>` section of your website.
|
6
|
+
|
7
|
+
```javascript
|
8
|
+
<script type="text/javascript">
|
9
|
+
!function(){var e=window.htevents=window.htevents||[];if(!e.initialize)if(e.invoked)window.console&&console.error&&console.error("Hightouch snippet included twice.");else{e.invoked=!0,e.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"],e.factory=function(t){return function(){var n=Array.prototype.slice.call(arguments);return n.unshift(t),e.push(n),e}};for(var t=0;t<e.methods.length;t++){var n=e.methods[t];e[n]=e.factory(n)}e.load=function(t,n){var o=document.createElement("script");o.type="text/javascript",o.async=!0,o.src="https://cdn.hightouch-events.com/browser/release/v1-latest/events.min.js";var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(o,r),e._loadOptions=n,e._writeKey=t},e.SNIPPET_VERSION="0.0.1",
|
10
|
+
e.load(<WRITE_KEY>,{apiHost:<DATA_PLANE_URL>}),
|
11
|
+
e.page()}}();
|
12
|
+
</script>
|
13
|
+
```
|
14
|
+
|
15
|
+
`window.htevents.track(...)` will then be available for use.
|
16
|
+
|
17
|
+
### Alternative installation using NPM
|
18
|
+
|
19
|
+
1. Install the package
|
20
|
+
|
21
|
+
```sh
|
22
|
+
# npm
|
23
|
+
npm install @ht-sdks/events-sdk-js-browser
|
24
|
+
|
25
|
+
# yarn
|
26
|
+
yarn add @ht-sdks/events-sdk-js-browser
|
27
|
+
|
28
|
+
# pnpm
|
29
|
+
pnpm add @ht-sdks/events-sdk-js-browser
|
30
|
+
```
|
31
|
+
|
32
|
+
2. Import the package into your project and you're good to go (with working types)!
|
33
|
+
|
34
|
+
```ts
|
35
|
+
import { HtEventsBrowser } from '@ht-sdks/events-sdk-js-browser'
|
36
|
+
|
37
|
+
const htevents = HtEventsBrowser.load({ writeKey: '<YOUR_WRITE_KEY>' })
|
38
|
+
|
39
|
+
htevents.identify('hello world')
|
40
|
+
|
41
|
+
document.body?.addEventListener('click', () => {
|
42
|
+
htevents.track('document body clicked!')
|
43
|
+
})
|
44
|
+
```
|
45
|
+
|
46
|
+
## Lazy / Delayed Loading
|
47
|
+
You can load a buffered version of htevents that requires `.load` to be explicitly called before initiating any network activity. This can be useful if you want to wait for a user to consent before fetching any tracking destinations or sending buffered events to hightouch.
|
48
|
+
|
49
|
+
- ⚠️ ️`.load` should only be called _once_.
|
50
|
+
|
51
|
+
```ts
|
52
|
+
export const htevents = new HtEventsBrowser()
|
53
|
+
|
54
|
+
htevents.identify("hello world")
|
55
|
+
|
56
|
+
if (userConsentsToBeingTracked) {
|
57
|
+
htevents.load({ writeKey: '<YOUR_WRITE_KEY>' }) // destinations loaded, enqueued events are flushed
|
58
|
+
}
|
59
|
+
```
|
60
|
+
|
61
|
+
## Error Handling
|
62
|
+
### Handling initialization errors
|
63
|
+
If you want to catch initialization errors, you can do the following:
|
64
|
+
```ts
|
65
|
+
export const htevents = new HtEventsBrowser();
|
66
|
+
htevents
|
67
|
+
.load({ writeKey: "MY_WRITE_KEY" })
|
68
|
+
.catch((err) => ...);
|
69
|
+
```
|
70
|
+
|
71
|
+
## Usage in Common Frameworks / SPAs
|
72
|
+
|
73
|
+
### Vanilla React
|
74
|
+
```tsx
|
75
|
+
import { HtEventsBrowser } from '@ht-sdks/events-sdk-js-browser'
|
76
|
+
|
77
|
+
// We can export this instance to share with rest of our codebase.
|
78
|
+
export const htevents = HtEventsBrowser.load({ writeKey: '<YOUR_WRITE_KEY>' })
|
79
|
+
|
80
|
+
const App = () => (
|
81
|
+
<div>
|
82
|
+
<button onClick={() => htevents.track('hello world')}>Track</button>
|
83
|
+
</div>
|
84
|
+
)
|
85
|
+
```
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
### Vue
|
90
|
+
|
91
|
+
1. Export htevents instance. E.g. `services/hightouch.ts`
|
92
|
+
|
93
|
+
```ts
|
94
|
+
import { HtEventsBrowser } from '@ht-sdks/events-sdk-js-browser'
|
95
|
+
|
96
|
+
export const htevents = HtEventsBrowser.load({
|
97
|
+
writeKey: '<YOUR_WRITE_KEY>',
|
98
|
+
})
|
99
|
+
```
|
100
|
+
|
101
|
+
2. in `.vue` component
|
102
|
+
|
103
|
+
```tsx
|
104
|
+
<template>
|
105
|
+
<button @click="track()">Track</button>
|
106
|
+
</template>
|
107
|
+
|
108
|
+
<script>
|
109
|
+
import { defineComponent } from 'vue'
|
110
|
+
import { htevents } from './services/hightouch'
|
111
|
+
|
112
|
+
export default defineComponent({
|
113
|
+
setup() {
|
114
|
+
function track() {
|
115
|
+
htevents.track('Hello world')
|
116
|
+
}
|
117
|
+
|
118
|
+
return {
|
119
|
+
track,
|
120
|
+
}
|
121
|
+
},
|
122
|
+
})
|
123
|
+
</script>
|
124
|
+
```
|
125
|
+
|
126
|
+
## How to add typescript support when using the CDN snippet
|
127
|
+
|
128
|
+
NOTE: this is only required for snippet installation.
|
129
|
+
|
130
|
+
NPM installation should already have type support.
|
131
|
+
|
132
|
+
1. Install npm package `@ht-sdks/events-sdk-js-browser` as a dev dependency.
|
133
|
+
|
134
|
+
2. Create `./typings/htevents.d.ts`
|
135
|
+
```ts
|
136
|
+
// ./typings/htevents.d.ts
|
137
|
+
import type { HtEventsSnippet } from "@ht-sdks/events-sdk-js-browser";
|
138
|
+
|
139
|
+
declare global {
|
140
|
+
interface Window {
|
141
|
+
htevents: HtEventsSnippet;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
```
|
146
|
+
3. Configure typescript to read from the custom `./typings` folder
|
147
|
+
```jsonc
|
148
|
+
// tsconfig.json
|
149
|
+
{
|
150
|
+
...
|
151
|
+
"compilerOptions": {
|
152
|
+
....
|
153
|
+
"typeRoots": [
|
154
|
+
"./node_modules/@types",
|
155
|
+
"./typings"
|
156
|
+
]
|
157
|
+
}
|
158
|
+
....
|
159
|
+
}
|
160
|
+
```
|
161
|
+
|
162
|
+
---
|
163
|
+
|
164
|
+
## Development
|
165
|
+
|
166
|
+
First, clone the repo and then startup our local dev environment:
|
167
|
+
|
168
|
+
```sh
|
169
|
+
$ git clone git@github.com:ht-sdks/events-sdk-js-mono.git
|
170
|
+
$ cd events-sdk-js-mono
|
171
|
+
$ nvm use # installs correct version of node defined in .nvmrc.
|
172
|
+
$ yarn && yarn build
|
173
|
+
$ yarn test
|
174
|
+
```
|
175
|
+
|
176
|
+
> If you get "Cannot find module '@ht-sdks/events-sdk-js-browser' or its corresponding type declarations.ts(2307)" (in VSCode), you may have to "cmd+shift+p -> "TypeScript: Restart TS server"
|
177
|
+
|
178
|
+
# Plugins
|
179
|
+
|
180
|
+
When developing against Events SDK JS you will likely be writing plugins, which can augment functionality and enrich data. Plugins are isolated chunks which you can build, test, version, and deploy independently of the rest of the codebase. Plugins are bounded by Events SDK JS which handles things such as observability, retries, and error management.
|
181
|
+
|
182
|
+
Plugins can be of two different priorities:
|
183
|
+
|
184
|
+
1. **Critical**: Events SDK JS should expect this plugin to be loaded before starting event delivery
|
185
|
+
2. **Non-critical**: Events SDK JS can start event delivery before this plugin has finished loading
|
186
|
+
|
187
|
+
and can be of five different types:
|
188
|
+
|
189
|
+
1. **Before**: Plugins that need to be run before any other plugins are run. An example of this would be validating events before passing them along to other plugins.
|
190
|
+
2. **After**: Plugins that need to run after all other plugins have run. An example of this is the Hightouch.io integration, which will wait for destinations to succeed or fail so that it can send its observability metrics.
|
191
|
+
3. **Destination**: Destinations to send the event to (ie. legacy destinations). Does not modify the event and failure does not halt execution.
|
192
|
+
4. **Enrichment**: Modifies an event, failure here could halt the event pipeline.
|
193
|
+
5. **Utility**: Plugins that change Events SDK JS functionality and don't fall into the other categories.
|
194
|
+
|
195
|
+
Here is an example of a simple plugin that would convert all track events event names to lowercase before the event gets sent through the rest of the pipeline:
|
196
|
+
|
197
|
+
```ts
|
198
|
+
import type { Plugin } from '@ht-sdks/events-sdk-js-browser'
|
199
|
+
|
200
|
+
export const lowercase: Plugin = {
|
201
|
+
name: 'Lowercase Event Name',
|
202
|
+
type: 'before',
|
203
|
+
version: '1.0.0',
|
204
|
+
|
205
|
+
isLoaded: () => true,
|
206
|
+
load: () => Promise.resolve(),
|
207
|
+
|
208
|
+
track: (ctx) => {
|
209
|
+
ctx.event.event = ctx.event.event.toLowerCase()
|
210
|
+
return ctx
|
211
|
+
}
|
212
|
+
}
|
213
|
+
|
214
|
+
htevents.register(lowercase)
|
215
|
+
```
|
216
|
+
|
217
|
+
For further examples check out our [existing plugins](/packages/browser/src/plugins).
|
218
|
+
|
219
|
+
## QA
|
220
|
+
Feature work and bug fixes should include tests. Run all [Jest](https://jestjs.io) tests:
|
221
|
+
```
|
222
|
+
$ yarn test
|
223
|
+
```
|
224
|
+
Lint all with [ESLint](https://github.com/typescript-eslint/typescript-eslint/):
|
225
|
+
```
|
226
|
+
$ yarn lint
|
227
|
+
```
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import fetch from 'node-fetch'
|
2
|
+
import http from 'http'
|
3
|
+
import handler from 'serve-handler'
|
4
|
+
|
5
|
+
export async function startLocalServer(): Promise<string> {
|
6
|
+
const srv = http.createServer((request, response) => {
|
7
|
+
return handler(request, response)
|
8
|
+
})
|
9
|
+
|
10
|
+
return new Promise(async (resolve, reject) => {
|
11
|
+
const desiredPort = process.env.PORT ?? 5000
|
12
|
+
const desiredPath = `http://localhost:${desiredPort}`
|
13
|
+
|
14
|
+
try {
|
15
|
+
const ping = await fetch(desiredPath)
|
16
|
+
if (ping.ok) {
|
17
|
+
return resolve(desiredPath)
|
18
|
+
}
|
19
|
+
} catch (err) {
|
20
|
+
srv.on('error', reject)
|
21
|
+
srv.listen(desiredPort, () => {
|
22
|
+
// @ts-expect-error
|
23
|
+
const { port } = srv.address()
|
24
|
+
resolve(`http://localhost:${port ?? desiredPort}`)
|
25
|
+
})
|
26
|
+
}
|
27
|
+
})
|
28
|
+
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import { tester, testerTeardown } from '../../src/tester/ajs-tester'
|
2
|
+
import {
|
3
|
+
gatherLighthouseMetrics,
|
4
|
+
globalSetup,
|
5
|
+
globalTeardown,
|
6
|
+
} from '../../src/tester/ajs-perf'
|
7
|
+
import { TEST_WRITEKEY } from '../../src/test-helpers/test-writekeys'
|
8
|
+
|
9
|
+
describe('Performance', () => {
|
10
|
+
beforeAll(async () => {
|
11
|
+
await globalSetup()
|
12
|
+
})
|
13
|
+
|
14
|
+
afterAll(async () => {
|
15
|
+
await globalTeardown()
|
16
|
+
await testerTeardown()
|
17
|
+
})
|
18
|
+
|
19
|
+
// These tests are now biased because of the massive number of tests running during our QA process
|
20
|
+
it('gather lighthouse', async () => {
|
21
|
+
const analyticsStub = await tester(
|
22
|
+
TEST_WRITEKEY,
|
23
|
+
'http://localhost:3001',
|
24
|
+
'chromium',
|
25
|
+
true
|
26
|
+
)
|
27
|
+
|
28
|
+
const results: any = await gatherLighthouseMetrics(analyticsStub.browserPage)
|
29
|
+
const audits = results.audits // Lighthouse audits
|
30
|
+
|
31
|
+
// lighthouse perf score
|
32
|
+
expect(results['categories'].performance.score).toBeGreaterThanOrEqual(0.99)
|
33
|
+
// no render blocking resource
|
34
|
+
expect(audits['render-blocking-resources'].details.items).toHaveLength(0)
|
35
|
+
// first contentful paint in the first second
|
36
|
+
expect(audits['first-contentful-paint'].numericValue).toBeLessThan(1000)
|
37
|
+
|
38
|
+
// total blocking time less than 100ms
|
39
|
+
expect(audits['total-blocking-time'].numericValue).toBeLessThan(150)
|
40
|
+
// main thread work less than 100ms
|
41
|
+
expect(audits['mainthread-work-breakdown'].numericValue).toBeLessThan(300)
|
42
|
+
|
43
|
+
console.log('⚡️ AJS is blazing fast ⚡')
|
44
|
+
console.table(
|
45
|
+
Object.keys(audits)
|
46
|
+
.filter((i) => audits[i].displayValue)
|
47
|
+
.map((i) => ({
|
48
|
+
metric: audits[i].title,
|
49
|
+
value: audits[i].displayValue,
|
50
|
+
}))
|
51
|
+
)
|
52
|
+
|
53
|
+
await analyticsStub.browserPage.close()
|
54
|
+
}, 50000)
|
55
|
+
|
56
|
+
it('loads ajs in a browser', async () => {
|
57
|
+
const analyticsStub = await tester(
|
58
|
+
TEST_WRITEKEY,
|
59
|
+
'http://localhost:3001',
|
60
|
+
'chromium',
|
61
|
+
true
|
62
|
+
)
|
63
|
+
|
64
|
+
const ctx = await analyticsStub.track('hi', {
|
65
|
+
test: 'prop',
|
66
|
+
})
|
67
|
+
|
68
|
+
expect(ctx.event.event).toEqual('hi')
|
69
|
+
expect(ctx.event.properties).toEqual({
|
70
|
+
test: 'prop',
|
71
|
+
})
|
72
|
+
|
73
|
+
await analyticsStub.browserPage.close()
|
74
|
+
}, 10000)
|
75
|
+
})
|
@@ -0,0 +1,15 @@
|
|
1
|
+
const { createJestTSConfig } = require('@internal/config')
|
2
|
+
|
3
|
+
module.exports = createJestTSConfig(__dirname, {
|
4
|
+
modulePathIgnorePatterns: ['<rootDir>/e2e-tests', '<rootDir>/qa'],
|
5
|
+
setupFilesAfterEnv: ['./jest.setup.js'],
|
6
|
+
testEnvironment: 'jsdom',
|
7
|
+
coverageThreshold: {
|
8
|
+
global: {
|
9
|
+
branches: 80.91,
|
10
|
+
functions: 87.25,
|
11
|
+
lines: 91.03,
|
12
|
+
statements: 87.25,
|
13
|
+
},
|
14
|
+
},
|
15
|
+
})
|
@@ -0,0 +1,10 @@
|
|
1
|
+
const { TextEncoder, TextDecoder } = require('util')
|
2
|
+
const { setImmediate } = require('timers')
|
3
|
+
|
4
|
+
// fix: "ReferenceError: TextEncoder is not defined" after upgrading JSDOM
|
5
|
+
global.TextEncoder = TextEncoder
|
6
|
+
global.TextDecoder = TextDecoder
|
7
|
+
// fix: jsdom uses setImmediate under the hood for preflight XHR requests,
|
8
|
+
// and jest removed setImmediate, so we need to provide it to prevent console
|
9
|
+
// logging ReferenceErrors made by integration tests that call Amplitude.
|
10
|
+
global.setImmediate = setImmediate
|