@customerio/cdp-analytics-browser 0.0.0-test-oidc
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/LICENSE.MD +22 -0
- package/README.md +36 -0
- package/dist/cjs/browser/browser-umd.js +20 -0
- package/dist/cjs/browser/browser-umd.js.map +1 -0
- package/dist/cjs/browser/index.js +334 -0
- package/dist/cjs/browser/index.js.map +1 -0
- package/dist/cjs/browser/standalone-analytics.js +62 -0
- package/dist/cjs/browser/standalone-analytics.js.map +1 -0
- package/dist/cjs/browser/standalone-interface.js +3 -0
- package/dist/cjs/browser/standalone-interface.js.map +1 -0
- package/dist/cjs/browser/standalone.js +90 -0
- package/dist/cjs/browser/standalone.js.map +1 -0
- package/dist/cjs/core/analytics/index.js +545 -0
- package/dist/cjs/core/analytics/index.js.map +1 -0
- package/dist/cjs/core/analytics/interfaces.js +3 -0
- package/dist/cjs/core/analytics/interfaces.js.map +1 -0
- package/dist/cjs/core/arguments-resolver/index.js +106 -0
- package/dist/cjs/core/arguments-resolver/index.js.map +1 -0
- package/dist/cjs/core/auto-track.js +108 -0
- package/dist/cjs/core/auto-track.js.map +1 -0
- package/dist/cjs/core/buffer/index.js +237 -0
- package/dist/cjs/core/buffer/index.js.map +1 -0
- package/dist/cjs/core/buffer/snippet.js +32 -0
- package/dist/cjs/core/buffer/snippet.js.map +1 -0
- package/dist/cjs/core/callback/index.js +7 -0
- package/dist/cjs/core/callback/index.js.map +1 -0
- package/dist/cjs/core/connection/index.js +16 -0
- package/dist/cjs/core/connection/index.js.map +1 -0
- package/dist/cjs/core/context/index.js +19 -0
- package/dist/cjs/core/context/index.js.map +1 -0
- package/dist/cjs/core/environment/index.js +12 -0
- package/dist/cjs/core/environment/index.js.map +1 -0
- package/dist/cjs/core/events/index.js +134 -0
- package/dist/cjs/core/events/index.js.map +1 -0
- package/dist/cjs/core/events/interfaces.js +3 -0
- package/dist/cjs/core/events/interfaces.js.map +1 -0
- package/dist/cjs/core/inspector/index.js +14 -0
- package/dist/cjs/core/inspector/index.js.map +1 -0
- package/dist/cjs/core/plugin/index.js +3 -0
- package/dist/cjs/core/plugin/index.js.map +1 -0
- package/dist/cjs/core/query-string/gracefulDecodeURIComponent.js +20 -0
- package/dist/cjs/core/query-string/gracefulDecodeURIComponent.js.map +1 -0
- package/dist/cjs/core/query-string/index.js +48 -0
- package/dist/cjs/core/query-string/index.js.map +1 -0
- package/dist/cjs/core/query-string/pickPrefix.js +20 -0
- package/dist/cjs/core/query-string/pickPrefix.js.map +1 -0
- package/dist/cjs/core/queue/event-queue.js +15 -0
- package/dist/cjs/core/queue/event-queue.js.map +1 -0
- package/dist/cjs/core/stats/index.js +23 -0
- package/dist/cjs/core/stats/index.js.map +1 -0
- package/dist/cjs/core/stats/remote-metrics.js +107 -0
- package/dist/cjs/core/stats/remote-metrics.js.map +1 -0
- package/dist/cjs/core/user/index.js +422 -0
- package/dist/cjs/core/user/index.js.map +1 -0
- package/dist/cjs/core/user/tld.js +64 -0
- package/dist/cjs/core/user/tld.js.map +1 -0
- package/dist/cjs/generated/version.js +6 -0
- package/dist/cjs/generated/version.js.map +1 -0
- package/dist/cjs/index.js +15 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/bind-all.js +17 -0
- package/dist/cjs/lib/bind-all.js.map +1 -0
- package/dist/cjs/lib/browser-polyfill.js +22 -0
- package/dist/cjs/lib/browser-polyfill.js.map +1 -0
- package/dist/cjs/lib/create-deferred.js +21 -0
- package/dist/cjs/lib/create-deferred.js.map +1 -0
- package/dist/cjs/lib/csp-detection.js +33 -0
- package/dist/cjs/lib/csp-detection.js.map +1 -0
- package/dist/cjs/lib/embedded-write-key.js +22 -0
- package/dist/cjs/lib/embedded-write-key.js.map +1 -0
- package/dist/cjs/lib/fetch.js +19 -0
- package/dist/cjs/lib/fetch.js.map +1 -0
- package/dist/cjs/lib/get-global.js +21 -0
- package/dist/cjs/lib/get-global.js.map +1 -0
- package/dist/cjs/lib/get-process-env.js +15 -0
- package/dist/cjs/lib/get-process-env.js.map +1 -0
- package/dist/cjs/lib/global-analytics-helper.js +34 -0
- package/dist/cjs/lib/global-analytics-helper.js.map +1 -0
- package/dist/cjs/lib/group-by.js +28 -0
- package/dist/cjs/lib/group-by.js.map +1 -0
- package/dist/cjs/lib/is-plan-event-enabled.js +20 -0
- package/dist/cjs/lib/is-plan-event-enabled.js.map +1 -0
- package/dist/cjs/lib/is-thenable.js +15 -0
- package/dist/cjs/lib/is-thenable.js.map +1 -0
- package/dist/cjs/lib/load-script.js +56 -0
- package/dist/cjs/lib/load-script.js.map +1 -0
- package/dist/cjs/lib/merged-options.js +31 -0
- package/dist/cjs/lib/merged-options.js.map +1 -0
- package/dist/cjs/lib/on-page-leave.js +35 -0
- package/dist/cjs/lib/on-page-leave.js.map +1 -0
- package/dist/cjs/lib/p-while.js +25 -0
- package/dist/cjs/lib/p-while.js.map +1 -0
- package/dist/cjs/lib/parse-cdn.js +86 -0
- package/dist/cjs/lib/parse-cdn.js.map +1 -0
- package/dist/cjs/lib/priority-queue/backoff.js +10 -0
- package/dist/cjs/lib/priority-queue/backoff.js.map +1 -0
- package/dist/cjs/lib/priority-queue/index.js +7 -0
- package/dist/cjs/lib/priority-queue/index.js.map +1 -0
- package/dist/cjs/lib/priority-queue/persisted.js +108 -0
- package/dist/cjs/lib/priority-queue/persisted.js.map +1 -0
- package/dist/cjs/lib/sleep.js +10 -0
- package/dist/cjs/lib/sleep.js.map +1 -0
- package/dist/cjs/lib/to-facade.js +32 -0
- package/dist/cjs/lib/to-facade.js.map +1 -0
- package/dist/cjs/node/index.js +43 -0
- package/dist/cjs/node/index.js.map +1 -0
- package/dist/cjs/node/node.browser.js +13 -0
- package/dist/cjs/node/node.browser.js.map +1 -0
- package/dist/cjs/plugins/ajs-destination/index.js +345 -0
- package/dist/cjs/plugins/ajs-destination/index.js.map +1 -0
- package/dist/cjs/plugins/ajs-destination/loader.js +110 -0
- package/dist/cjs/plugins/ajs-destination/loader.js.map +1 -0
- package/dist/cjs/plugins/ajs-destination/types.js +3 -0
- package/dist/cjs/plugins/ajs-destination/types.js.map +1 -0
- package/dist/cjs/plugins/ajs-destination/utils.js +23 -0
- package/dist/cjs/plugins/ajs-destination/utils.js.map +1 -0
- package/dist/cjs/plugins/analytics-node/index.js +65 -0
- package/dist/cjs/plugins/analytics-node/index.js.map +1 -0
- package/dist/cjs/plugins/customerio/batched-dispatcher.js +102 -0
- package/dist/cjs/plugins/customerio/batched-dispatcher.js.map +1 -0
- package/dist/cjs/plugins/customerio/fetch-dispatcher.js +18 -0
- package/dist/cjs/plugins/customerio/fetch-dispatcher.js.map +1 -0
- package/dist/cjs/plugins/customerio/index.js +98 -0
- package/dist/cjs/plugins/customerio/index.js.map +1 -0
- package/dist/cjs/plugins/customerio/normalize.js +176 -0
- package/dist/cjs/plugins/customerio/normalize.js.map +1 -0
- package/dist/cjs/plugins/customerio/schedule-flush.js +76 -0
- package/dist/cjs/plugins/customerio/schedule-flush.js.map +1 -0
- package/dist/cjs/plugins/in-app-plugin/events.js +41 -0
- package/dist/cjs/plugins/in-app-plugin/events.js.map +1 -0
- package/dist/cjs/plugins/in-app-plugin/index.js +237 -0
- package/dist/cjs/plugins/in-app-plugin/index.js.map +1 -0
- package/dist/cjs/plugins/legacy-video-plugins/index.js +25 -0
- package/dist/cjs/plugins/legacy-video-plugins/index.js.map +1 -0
- package/dist/cjs/plugins/middleware/index.js +124 -0
- package/dist/cjs/plugins/middleware/index.js.map +1 -0
- package/dist/cjs/plugins/page-enrichment/index.js +98 -0
- package/dist/cjs/plugins/page-enrichment/index.js.map +1 -0
- package/dist/cjs/plugins/remote-loader/index.js +211 -0
- package/dist/cjs/plugins/remote-loader/index.js.map +1 -0
- package/dist/cjs/plugins/remote-middleware/index.js +70 -0
- package/dist/cjs/plugins/remote-middleware/index.js.map +1 -0
- package/dist/cjs/plugins/routing-middleware/index.js +27 -0
- package/dist/cjs/plugins/routing-middleware/index.js.map +1 -0
- package/dist/cjs/plugins/schema-filter/index.js +67 -0
- package/dist/cjs/plugins/schema-filter/index.js.map +1 -0
- package/dist/cjs/plugins/validation/index.js +70 -0
- package/dist/cjs/plugins/validation/index.js.map +1 -0
- package/dist/cjs/vendor/tsub/tsub.js +645 -0
- package/dist/cjs/vendor/tsub/tsub.js.map +1 -0
- package/dist/cjs/vendor/tsub/types.js +3 -0
- package/dist/cjs/vendor/tsub/types.js.map +1 -0
- package/dist/pkg/browser/browser-umd.js +17 -0
- package/dist/pkg/browser/browser-umd.js.map +1 -0
- package/dist/pkg/browser/index.js +330 -0
- package/dist/pkg/browser/index.js.map +1 -0
- package/dist/pkg/browser/standalone-analytics.js +58 -0
- package/dist/pkg/browser/standalone-analytics.js.map +1 -0
- package/dist/pkg/browser/standalone-interface.js +2 -0
- package/dist/pkg/browser/standalone-interface.js.map +1 -0
- package/dist/pkg/browser/standalone.js +88 -0
- package/dist/pkg/browser/standalone.js.map +1 -0
- package/dist/pkg/core/analytics/index.js +542 -0
- package/dist/pkg/core/analytics/index.js.map +1 -0
- package/dist/pkg/core/analytics/interfaces.js +2 -0
- package/dist/pkg/core/analytics/interfaces.js.map +1 -0
- package/dist/pkg/core/arguments-resolver/index.js +99 -0
- package/dist/pkg/core/arguments-resolver/index.js.map +1 -0
- package/dist/pkg/core/auto-track.js +103 -0
- package/dist/pkg/core/auto-track.js.map +1 -0
- package/dist/pkg/core/buffer/index.js +231 -0
- package/dist/pkg/core/buffer/index.js.map +1 -0
- package/dist/pkg/core/buffer/snippet.js +27 -0
- package/dist/pkg/core/buffer/snippet.js.map +1 -0
- package/dist/pkg/core/callback/index.js +2 -0
- package/dist/pkg/core/callback/index.js.map +1 -0
- package/dist/pkg/core/connection/index.js +11 -0
- package/dist/pkg/core/connection/index.js.map +1 -0
- package/dist/pkg/core/context/index.js +16 -0
- package/dist/pkg/core/context/index.js.map +1 -0
- package/dist/pkg/core/environment/index.js +7 -0
- package/dist/pkg/core/environment/index.js.map +1 -0
- package/dist/pkg/core/events/index.js +131 -0
- package/dist/pkg/core/events/index.js.map +1 -0
- package/dist/pkg/core/events/interfaces.js +2 -0
- package/dist/pkg/core/events/interfaces.js.map +1 -0
- package/dist/pkg/core/inspector/index.js +10 -0
- package/dist/pkg/core/inspector/index.js.map +1 -0
- package/dist/pkg/core/plugin/index.js +2 -0
- package/dist/pkg/core/plugin/index.js.map +1 -0
- package/dist/pkg/core/query-string/gracefulDecodeURIComponent.js +16 -0
- package/dist/pkg/core/query-string/gracefulDecodeURIComponent.js.map +1 -0
- package/dist/pkg/core/query-string/index.js +44 -0
- package/dist/pkg/core/query-string/index.js.map +1 -0
- package/dist/pkg/core/query-string/pickPrefix.js +16 -0
- package/dist/pkg/core/query-string/pickPrefix.js.map +1 -0
- package/dist/pkg/core/queue/event-queue.js +12 -0
- package/dist/pkg/core/queue/event-queue.js.map +1 -0
- package/dist/pkg/core/stats/index.js +20 -0
- package/dist/pkg/core/stats/index.js.map +1 -0
- package/dist/pkg/core/stats/remote-metrics.js +104 -0
- package/dist/pkg/core/stats/remote-metrics.js.map +1 -0
- package/dist/pkg/core/user/index.js +418 -0
- package/dist/pkg/core/user/index.js.map +1 -0
- package/dist/pkg/core/user/tld.js +59 -0
- package/dist/pkg/core/user/tld.js.map +1 -0
- package/dist/pkg/generated/version.js +3 -0
- package/dist/pkg/generated/version.js.map +1 -0
- package/dist/pkg/index.js +10 -0
- package/dist/pkg/index.js.map +1 -0
- package/dist/pkg/lib/bind-all.js +14 -0
- package/dist/pkg/lib/bind-all.js.map +1 -0
- package/dist/pkg/lib/browser-polyfill.js +18 -0
- package/dist/pkg/lib/browser-polyfill.js.map +1 -0
- package/dist/pkg/lib/create-deferred.js +17 -0
- package/dist/pkg/lib/create-deferred.js.map +1 -0
- package/dist/pkg/lib/csp-detection.js +29 -0
- package/dist/pkg/lib/csp-detection.js.map +1 -0
- package/dist/pkg/lib/embedded-write-key.js +18 -0
- package/dist/pkg/lib/embedded-write-key.js.map +1 -0
- package/dist/pkg/lib/fetch.js +14 -0
- package/dist/pkg/lib/fetch.js.map +1 -0
- package/dist/pkg/lib/get-global.js +17 -0
- package/dist/pkg/lib/get-global.js.map +1 -0
- package/dist/pkg/lib/get-process-env.js +11 -0
- package/dist/pkg/lib/get-process-env.js.map +1 -0
- package/dist/pkg/lib/global-analytics-helper.js +28 -0
- package/dist/pkg/lib/global-analytics-helper.js.map +1 -0
- package/dist/pkg/lib/group-by.js +24 -0
- package/dist/pkg/lib/group-by.js.map +1 -0
- package/dist/pkg/lib/is-plan-event-enabled.js +16 -0
- package/dist/pkg/lib/is-plan-event-enabled.js.map +1 -0
- package/dist/pkg/lib/is-thenable.js +11 -0
- package/dist/pkg/lib/is-thenable.js.map +1 -0
- package/dist/pkg/lib/load-script.js +51 -0
- package/dist/pkg/lib/load-script.js.map +1 -0
- package/dist/pkg/lib/merged-options.js +27 -0
- package/dist/pkg/lib/merged-options.js.map +1 -0
- package/dist/pkg/lib/on-page-leave.js +31 -0
- package/dist/pkg/lib/on-page-leave.js.map +1 -0
- package/dist/pkg/lib/p-while.js +21 -0
- package/dist/pkg/lib/p-while.js.map +1 -0
- package/dist/pkg/lib/parse-cdn.js +79 -0
- package/dist/pkg/lib/parse-cdn.js.map +1 -0
- package/dist/pkg/lib/priority-queue/backoff.js +6 -0
- package/dist/pkg/lib/priority-queue/backoff.js.map +1 -0
- package/dist/pkg/lib/priority-queue/index.js +3 -0
- package/dist/pkg/lib/priority-queue/index.js.map +1 -0
- package/dist/pkg/lib/priority-queue/persisted.js +105 -0
- package/dist/pkg/lib/priority-queue/persisted.js.map +1 -0
- package/dist/pkg/lib/sleep.js +6 -0
- package/dist/pkg/lib/sleep.js.map +1 -0
- package/dist/pkg/lib/to-facade.js +28 -0
- package/dist/pkg/lib/to-facade.js.map +1 -0
- package/dist/pkg/node/index.js +40 -0
- package/dist/pkg/node/index.js.map +1 -0
- package/dist/pkg/node/node.browser.js +10 -0
- package/dist/pkg/node/node.browser.js.map +1 -0
- package/dist/pkg/plugins/ajs-destination/index.js +341 -0
- package/dist/pkg/plugins/ajs-destination/index.js.map +1 -0
- package/dist/pkg/plugins/ajs-destination/loader.js +102 -0
- package/dist/pkg/plugins/ajs-destination/loader.js.map +1 -0
- package/dist/pkg/plugins/ajs-destination/types.js +2 -0
- package/dist/pkg/plugins/ajs-destination/types.js.map +1 -0
- package/dist/pkg/plugins/ajs-destination/utils.js +18 -0
- package/dist/pkg/plugins/ajs-destination/utils.js.map +1 -0
- package/dist/pkg/plugins/analytics-node/index.js +60 -0
- package/dist/pkg/plugins/analytics-node/index.js.map +1 -0
- package/dist/pkg/plugins/customerio/batched-dispatcher.js +99 -0
- package/dist/pkg/plugins/customerio/batched-dispatcher.js.map +1 -0
- package/dist/pkg/plugins/customerio/fetch-dispatcher.js +15 -0
- package/dist/pkg/plugins/customerio/fetch-dispatcher.js.map +1 -0
- package/dist/pkg/plugins/customerio/index.js +94 -0
- package/dist/pkg/plugins/customerio/index.js.map +1 -0
- package/dist/pkg/plugins/customerio/normalize.js +168 -0
- package/dist/pkg/plugins/customerio/normalize.js.map +1 -0
- package/dist/pkg/plugins/customerio/schedule-flush.js +72 -0
- package/dist/pkg/plugins/customerio/schedule-flush.js.map +1 -0
- package/dist/pkg/plugins/in-app-plugin/events.js +36 -0
- package/dist/pkg/plugins/in-app-plugin/events.js.map +1 -0
- package/dist/pkg/plugins/in-app-plugin/index.js +233 -0
- package/dist/pkg/plugins/in-app-plugin/index.js.map +1 -0
- package/dist/pkg/plugins/legacy-video-plugins/index.js +25 -0
- package/dist/pkg/plugins/legacy-video-plugins/index.js.map +1 -0
- package/dist/pkg/plugins/middleware/index.js +119 -0
- package/dist/pkg/plugins/middleware/index.js.map +1 -0
- package/dist/pkg/plugins/page-enrichment/index.js +93 -0
- package/dist/pkg/plugins/page-enrichment/index.js.map +1 -0
- package/dist/pkg/plugins/remote-loader/index.js +207 -0
- package/dist/pkg/plugins/remote-loader/index.js.map +1 -0
- package/dist/pkg/plugins/remote-middleware/index.js +66 -0
- package/dist/pkg/plugins/remote-middleware/index.js.map +1 -0
- package/dist/pkg/plugins/routing-middleware/index.js +22 -0
- package/dist/pkg/plugins/routing-middleware/index.js.map +1 -0
- package/dist/pkg/plugins/schema-filter/index.js +63 -0
- package/dist/pkg/plugins/schema-filter/index.js.map +1 -0
- package/dist/pkg/plugins/validation/index.js +63 -0
- package/dist/pkg/plugins/validation/index.js.map +1 -0
- package/dist/pkg/vendor/tsub/tsub.js +645 -0
- package/dist/pkg/vendor/tsub/tsub.js.map +1 -0
- package/dist/pkg/vendor/tsub/types.js +2 -0
- package/dist/pkg/vendor/tsub/types.js.map +1 -0
- package/dist/types/browser/browser-umd.d.ts +2 -0
- package/dist/types/browser/browser-umd.d.ts.map +1 -0
- package/dist/types/browser/index.d.ts +86 -0
- package/dist/types/browser/index.d.ts.map +1 -0
- package/dist/types/browser/standalone-analytics.d.ts +2 -0
- package/dist/types/browser/standalone-analytics.d.ts.map +1 -0
- package/dist/types/browser/standalone-interface.d.ts +10 -0
- package/dist/types/browser/standalone-interface.d.ts.map +1 -0
- package/dist/types/browser/standalone.d.ts +2 -0
- package/dist/types/browser/standalone.d.ts.map +1 -0
- package/dist/types/core/analytics/index.d.ts +121 -0
- package/dist/types/core/analytics/index.d.ts.map +1 -0
- package/dist/types/core/analytics/interfaces.d.ts +77 -0
- package/dist/types/core/analytics/interfaces.d.ts.map +1 -0
- package/dist/types/core/arguments-resolver/index.d.ts +34 -0
- package/dist/types/core/arguments-resolver/index.d.ts.map +1 -0
- package/dist/types/core/auto-track.d.ts +10 -0
- package/dist/types/core/auto-track.d.ts.map +1 -0
- package/dist/types/core/buffer/index.d.ts +86 -0
- package/dist/types/core/buffer/index.d.ts.map +1 -0
- package/dist/types/core/buffer/snippet.d.ts +15 -0
- package/dist/types/core/buffer/snippet.d.ts.map +1 -0
- package/dist/types/core/callback/index.d.ts +2 -0
- package/dist/types/core/callback/index.d.ts.map +1 -0
- package/dist/types/core/connection/index.d.ts +3 -0
- package/dist/types/core/connection/index.d.ts.map +1 -0
- package/dist/types/core/context/index.d.ts +9 -0
- package/dist/types/core/context/index.d.ts.map +1 -0
- package/dist/types/core/environment/index.d.ts +3 -0
- package/dist/types/core/environment/index.d.ts.map +1 -0
- package/dist/types/core/events/index.d.ts +21 -0
- package/dist/types/core/events/index.d.ts.map +1 -0
- package/dist/types/core/events/interfaces.d.ts +9 -0
- package/dist/types/core/events/interfaces.d.ts.map +1 -0
- package/dist/types/core/inspector/index.d.ts +3 -0
- package/dist/types/core/inspector/index.d.ts.map +1 -0
- package/dist/types/core/plugin/index.d.ts +11 -0
- package/dist/types/core/plugin/index.d.ts.map +1 -0
- package/dist/types/core/query-string/gracefulDecodeURIComponent.d.ts +9 -0
- package/dist/types/core/query-string/gracefulDecodeURIComponent.d.ts.map +1 -0
- package/dist/types/core/query-string/index.d.ts +7 -0
- package/dist/types/core/query-string/index.d.ts.map +1 -0
- package/dist/types/core/query-string/pickPrefix.d.ts +9 -0
- package/dist/types/core/query-string/pickPrefix.d.ts.map +1 -0
- package/dist/types/core/queue/event-queue.d.ts +8 -0
- package/dist/types/core/queue/event-queue.d.ts.map +1 -0
- package/dist/types/core/stats/index.d.ts +7 -0
- package/dist/types/core/stats/index.d.ts.map +1 -0
- package/dist/types/core/stats/remote-metrics.d.ts +29 -0
- package/dist/types/core/stats/remote-metrics.d.ts.map +1 -0
- package/dist/types/core/user/index.d.ts +128 -0
- package/dist/types/core/user/index.d.ts.map +1 -0
- package/dist/types/core/user/tld.d.ts +2 -0
- package/dist/types/core/user/tld.d.ts.map +1 -0
- package/dist/types/generated/version.d.ts +2 -0
- package/dist/types/generated/version.d.ts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/lib/bind-all.d.ts +4 -0
- package/dist/types/lib/bind-all.d.ts.map +1 -0
- package/dist/types/lib/browser-polyfill.d.ts +2 -0
- package/dist/types/lib/browser-polyfill.d.ts.map +1 -0
- package/dist/types/lib/create-deferred.d.ts +9 -0
- package/dist/types/lib/create-deferred.d.ts.map +1 -0
- package/dist/types/lib/csp-detection.d.ts +4 -0
- package/dist/types/lib/csp-detection.d.ts.map +1 -0
- package/dist/types/lib/embedded-write-key.d.ts +7 -0
- package/dist/types/lib/embedded-write-key.d.ts.map +1 -0
- package/dist/types/lib/fetch.d.ts +5 -0
- package/dist/types/lib/fetch.d.ts.map +1 -0
- package/dist/types/lib/get-global.d.ts +2 -0
- package/dist/types/lib/get-global.d.ts.map +1 -0
- package/dist/types/lib/get-process-env.d.ts +8 -0
- package/dist/types/lib/get-process-env.d.ts.map +1 -0
- package/dist/types/lib/global-analytics-helper.d.ts +18 -0
- package/dist/types/lib/global-analytics-helper.d.ts.map +1 -0
- package/dist/types/lib/group-by.d.ts +4 -0
- package/dist/types/lib/group-by.d.ts.map +1 -0
- package/dist/types/lib/is-plan-event-enabled.d.ts +9 -0
- package/dist/types/lib/is-plan-event-enabled.d.ts.map +1 -0
- package/dist/types/lib/is-thenable.d.ts +6 -0
- package/dist/types/lib/is-thenable.d.ts.map +1 -0
- package/dist/types/lib/load-script.d.ts +3 -0
- package/dist/types/lib/load-script.d.ts.map +1 -0
- package/dist/types/lib/merged-options.d.ts +13 -0
- package/dist/types/lib/merged-options.d.ts.map +1 -0
- package/dist/types/lib/on-page-leave.d.ts +11 -0
- package/dist/types/lib/on-page-leave.d.ts.map +1 -0
- package/dist/types/lib/p-while.d.ts +2 -0
- package/dist/types/lib/p-while.d.ts.map +1 -0
- package/dist/types/lib/parse-cdn.d.ts +10 -0
- package/dist/types/lib/parse-cdn.d.ts.map +1 -0
- package/dist/types/lib/priority-queue/backoff.d.ts +13 -0
- package/dist/types/lib/priority-queue/backoff.d.ts.map +1 -0
- package/dist/types/lib/priority-queue/index.d.ts +3 -0
- package/dist/types/lib/priority-queue/index.d.ts.map +1 -0
- package/dist/types/lib/priority-queue/persisted.d.ts +6 -0
- package/dist/types/lib/priority-queue/persisted.d.ts.map +1 -0
- package/dist/types/lib/sleep.d.ts +2 -0
- package/dist/types/lib/sleep.d.ts.map +1 -0
- package/dist/types/lib/to-facade.d.ts +7 -0
- package/dist/types/lib/to-facade.d.ts.map +1 -0
- package/dist/types/node/index.d.ts +8 -0
- package/dist/types/node/index.d.ts.map +1 -0
- package/dist/types/node/node.browser.d.ts +4 -0
- package/dist/types/node/node.browser.d.ts.map +1 -0
- package/dist/types/plugins/ajs-destination/index.d.ts +42 -0
- package/dist/types/plugins/ajs-destination/index.d.ts.map +1 -0
- package/dist/types/plugins/ajs-destination/loader.d.ts +12 -0
- package/dist/types/plugins/ajs-destination/loader.d.ts.map +1 -0
- package/dist/types/plugins/ajs-destination/types.d.ts +36 -0
- package/dist/types/plugins/ajs-destination/types.d.ts.map +1 -0
- package/dist/types/plugins/ajs-destination/utils.d.ts +5 -0
- package/dist/types/plugins/ajs-destination/utils.d.ts.map +1 -0
- package/dist/types/plugins/analytics-node/index.d.ts +12 -0
- package/dist/types/plugins/analytics-node/index.d.ts.map +1 -0
- package/dist/types/plugins/customerio/batched-dispatcher.d.ts +8 -0
- package/dist/types/plugins/customerio/batched-dispatcher.d.ts.map +1 -0
- package/dist/types/plugins/customerio/fetch-dispatcher.d.ts +8 -0
- package/dist/types/plugins/customerio/fetch-dispatcher.d.ts.map +1 -0
- package/dist/types/plugins/customerio/index.d.ts +26 -0
- package/dist/types/plugins/customerio/index.d.ts.map +1 -0
- package/dist/types/plugins/customerio/normalize.d.ts +12 -0
- package/dist/types/plugins/customerio/normalize.d.ts.map +1 -0
- package/dist/types/plugins/customerio/schedule-flush.d.ts +5 -0
- package/dist/types/plugins/customerio/schedule-flush.d.ts.map +1 -0
- package/dist/types/plugins/in-app-plugin/events.d.ts +19 -0
- package/dist/types/plugins/in-app-plugin/events.d.ts.map +1 -0
- package/dist/types/plugins/in-app-plugin/index.d.ts +12 -0
- package/dist/types/plugins/in-app-plugin/index.d.ts.map +1 -0
- package/dist/types/plugins/legacy-video-plugins/index.d.ts +3 -0
- package/dist/types/plugins/legacy-video-plugins/index.d.ts.map +1 -0
- package/dist/types/plugins/middleware/index.d.ts +18 -0
- package/dist/types/plugins/middleware/index.d.ts.map +1 -0
- package/dist/types/plugins/page-enrichment/index.d.ts +21 -0
- package/dist/types/plugins/page-enrichment/index.d.ts.map +1 -0
- package/dist/types/plugins/remote-loader/index.d.ts +43 -0
- package/dist/types/plugins/remote-loader/index.d.ts.map +1 -0
- package/dist/types/plugins/remote-middleware/index.d.ts +5 -0
- package/dist/types/plugins/remote-middleware/index.d.ts.map +1 -0
- package/dist/types/plugins/routing-middleware/index.d.ts +13 -0
- package/dist/types/plugins/routing-middleware/index.d.ts.map +1 -0
- package/dist/types/plugins/schema-filter/index.d.ts +5 -0
- package/dist/types/plugins/schema-filter/index.d.ts.map +1 -0
- package/dist/types/plugins/validation/index.d.ts +7 -0
- package/dist/types/plugins/validation/index.d.ts.map +1 -0
- package/dist/types/vendor/tsub/tsub.d.ts +1 -0
- package/dist/types/vendor/tsub/tsub.d.ts.map +1 -0
- package/dist/types/vendor/tsub/types.d.ts +20 -0
- package/dist/types/vendor/tsub/types.d.ts.map +1 -0
- package/dist/umd/407.js +1 -0
- package/dist/umd/407.js.gz +0 -0
- package/dist/umd/852.js +1 -0
- package/dist/umd/852.js.gz +0 -0
- package/dist/umd/ajs-destination.js +1 -0
- package/dist/umd/ajs-destination.js.gz +0 -0
- package/dist/umd/auto-track.js +1 -0
- package/dist/umd/auto-track.js.gz +0 -0
- package/dist/umd/inAppPlugin.js +1 -0
- package/dist/umd/inAppPlugin.js.gz +0 -0
- package/dist/umd/index.js +1 -0
- package/dist/umd/index.js.gz +0 -0
- package/dist/umd/legacyVideos.js +1 -0
- package/dist/umd/legacyVideos.js.gz +0 -0
- package/dist/umd/queryString.js +1 -0
- package/dist/umd/queryString.js.gz +0 -0
- package/dist/umd/remoteMiddleware.js +1 -0
- package/dist/umd/remoteMiddleware.js.gz +0 -0
- package/dist/umd/schemaFilter.js +1 -0
- package/dist/umd/schemaFilter.js.gz +0 -0
- package/dist/umd/standalone.js +1 -0
- package/dist/umd/standalone.js.gz +0 -0
- package/dist/umd/tsub-middleware.js +1 -0
- package/dist/umd/tsub-middleware.js.gz +0 -0
- package/package.json +106 -0
- package/src/browser/browser-umd.ts +19 -0
- package/src/browser/index.ts +423 -0
- package/src/browser/standalone-analytics.ts +62 -0
- package/src/browser/standalone-interface.ts +11 -0
- package/src/browser/standalone.ts +90 -0
- package/src/core/analytics/index.ts +573 -0
- package/src/core/analytics/interfaces.ts +100 -0
- package/src/core/arguments-resolver/index.ts +166 -0
- package/src/core/auto-track.ts +152 -0
- package/src/core/buffer/index.ts +289 -0
- package/src/core/buffer/snippet.ts +46 -0
- package/src/core/callback/index.ts +1 -0
- package/src/core/connection/index.ts +13 -0
- package/src/core/context/index.ts +21 -0
- package/src/core/environment/index.ts +7 -0
- package/src/core/events/index.ts +254 -0
- package/src/core/events/interfaces.ts +36 -0
- package/src/core/inspector/index.ts +14 -0
- package/src/core/plugin/index.ts +12 -0
- package/src/core/query-string/gracefulDecodeURIComponent.ts +16 -0
- package/src/core/query-string/index.ts +64 -0
- package/src/core/query-string/pickPrefix.ts +20 -0
- package/src/core/queue/event-queue.ts +11 -0
- package/src/core/stats/index.ts +15 -0
- package/src/core/stats/remote-metrics.ts +137 -0
- package/src/core/user/index.ts +534 -0
- package/src/core/user/tld.ts +65 -0
- package/src/generated/version.ts +2 -0
- package/src/index.ts +12 -0
- package/src/lib/bind-all.ts +19 -0
- package/src/lib/browser-polyfill.ts +23 -0
- package/src/lib/create-deferred.ts +16 -0
- package/src/lib/csp-detection.ts +26 -0
- package/src/lib/embedded-write-key.ts +24 -0
- package/src/lib/fetch.ts +10 -0
- package/src/lib/get-global.ts +16 -0
- package/src/lib/get-process-env.ts +11 -0
- package/src/lib/global-analytics-helper.ts +31 -0
- package/src/lib/group-by.ts +30 -0
- package/src/lib/is-plan-event-enabled.ts +20 -0
- package/src/lib/is-thenable.ts +9 -0
- package/src/lib/load-script.ts +66 -0
- package/src/lib/merged-options.ts +46 -0
- package/src/lib/on-page-leave.ts +29 -0
- package/src/lib/p-while.ts +12 -0
- package/src/lib/parse-cdn.ts +93 -0
- package/src/lib/priority-queue/backoff.ts +24 -0
- package/src/lib/priority-queue/index.ts +6 -0
- package/src/lib/priority-queue/persisted.ts +127 -0
- package/src/lib/sleep.ts +4 -0
- package/src/lib/to-facade.ts +53 -0
- package/src/node/index.ts +36 -0
- package/src/node/node.browser.ts +7 -0
- package/src/plugins/ajs-destination/index.ts +388 -0
- package/src/plugins/ajs-destination/loader.ts +127 -0
- package/src/plugins/ajs-destination/types.ts +44 -0
- package/src/plugins/ajs-destination/utils.ts +34 -0
- package/src/plugins/analytics-node/index.ts +64 -0
- package/src/plugins/customerio/batched-dispatcher.ts +112 -0
- package/src/plugins/customerio/fetch-dispatcher.ts +24 -0
- package/src/plugins/customerio/index.ts +143 -0
- package/src/plugins/customerio/normalize.ts +223 -0
- package/src/plugins/customerio/schedule-flush.ts +58 -0
- package/src/plugins/in-app-plugin/events.ts +38 -0
- package/src/plugins/in-app-plugin/index.ts +241 -0
- package/src/plugins/legacy-video-plugins/index.ts +16 -0
- package/src/plugins/middleware/index.ts +131 -0
- package/src/plugins/page-enrichment/index.ts +127 -0
- package/src/plugins/remote-loader/index.ts +240 -0
- package/src/plugins/remote-middleware/index.ts +44 -0
- package/src/plugins/routing-middleware/index.ts +38 -0
- package/src/plugins/schema-filter/index.ts +90 -0
- package/src/plugins/validation/index.ts +80 -0
- package/src/test-helpers/browser-storage.ts +72 -0
- package/src/test-helpers/factories.ts +18 -0
- package/src/test-helpers/fetch-parse.ts +8 -0
- package/src/test-helpers/fixtures/cdn-settings.ts +299 -0
- package/src/test-helpers/fixtures/classic-destination.ts +25 -0
- package/src/test-helpers/fixtures/create-fetch-method.ts +24 -0
- package/src/test-helpers/test-writekeys.ts +5 -0
- package/src/test-helpers/type-assertions.ts +11 -0
- package/src/vendor/tsub/tsub.js.LICENSE.txt +53 -0
- package/src/vendor/tsub/tsub.ts +7 -0
- package/src/vendor/tsub/types.ts +19 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface Window {
|
|
3
|
+
analyticsWriteKey?: string
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// This variable is used as an optional fallback for when customers
|
|
8
|
+
// host or proxy their own analytics.js.
|
|
9
|
+
try {
|
|
10
|
+
window.analyticsWriteKey = '__WRITE_KEY__'
|
|
11
|
+
} catch (_) {
|
|
12
|
+
// @ eslint-disable-next-line
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function embeddedWriteKey(): string | undefined {
|
|
16
|
+
if (window.analyticsWriteKey === undefined) {
|
|
17
|
+
return undefined
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// this is done so that we don't accidentally override every reference to __write_key__
|
|
21
|
+
return window.analyticsWriteKey !== ['__', 'WRITE', '_', 'KEY', '__'].join('')
|
|
22
|
+
? window.analyticsWriteKey
|
|
23
|
+
: undefined
|
|
24
|
+
}
|
package/src/lib/fetch.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import unfetch from 'unfetch'
|
|
2
|
+
import { getGlobal } from './get-global'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Wrapper around native `fetch` containing `unfetch` fallback.
|
|
6
|
+
*/
|
|
7
|
+
export const fetch: typeof global.fetch = (...args) => {
|
|
8
|
+
const global = getGlobal()
|
|
9
|
+
return ((global && global.fetch) || unfetch)(...args)
|
|
10
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// This an imperfect polyfill for globalThis
|
|
2
|
+
export const getGlobal = () => {
|
|
3
|
+
if (typeof globalThis !== 'undefined') {
|
|
4
|
+
return globalThis
|
|
5
|
+
}
|
|
6
|
+
if (typeof self !== 'undefined') {
|
|
7
|
+
return self
|
|
8
|
+
}
|
|
9
|
+
if (typeof window !== 'undefined') {
|
|
10
|
+
return window
|
|
11
|
+
}
|
|
12
|
+
if (typeof global !== 'undefined') {
|
|
13
|
+
return global
|
|
14
|
+
}
|
|
15
|
+
return null
|
|
16
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns `process.env` if it is available in the environment.
|
|
3
|
+
* Always returns an object make it similarly easy to use as `process.env`.
|
|
4
|
+
*/
|
|
5
|
+
export function getProcessEnv(): { [key: string]: string | undefined } {
|
|
6
|
+
if (typeof process === 'undefined' || !process.env) {
|
|
7
|
+
return {}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return process.env
|
|
11
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { AnalyticsSnippet } from '../browser/standalone-interface'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Stores the global window analytics key
|
|
5
|
+
*/
|
|
6
|
+
let _globalAnalyticsKey = 'analytics'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Gets the global analytics/buffer
|
|
10
|
+
* @param key name of the window property where the buffer is stored (default: analytics)
|
|
11
|
+
* @returns AnalyticsSnippet
|
|
12
|
+
*/
|
|
13
|
+
export function getGlobalAnalytics(): AnalyticsSnippet | undefined {
|
|
14
|
+
return (window as any)[_globalAnalyticsKey]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Replaces the global window key for the analytics/buffer object
|
|
19
|
+
* @param key key name
|
|
20
|
+
*/
|
|
21
|
+
export function setGlobalAnalyticsKey(key: string) {
|
|
22
|
+
_globalAnalyticsKey = key
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Sets the global analytics object
|
|
27
|
+
* @param analytics analytics snippet
|
|
28
|
+
*/
|
|
29
|
+
export function setGlobalAnalytics(analytics: AnalyticsSnippet): void {
|
|
30
|
+
;(window as any)[_globalAnalyticsKey] = analytics
|
|
31
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
type Grouper<T> = (obj: T) => string | number
|
|
2
|
+
|
|
3
|
+
export function groupBy<T>(
|
|
4
|
+
collection: T[],
|
|
5
|
+
grouper: keyof T | Grouper<T>
|
|
6
|
+
): Record<string, T[]> {
|
|
7
|
+
const results: Record<string, T[]> = {}
|
|
8
|
+
|
|
9
|
+
collection.forEach((item) => {
|
|
10
|
+
let key: string | number | undefined = undefined
|
|
11
|
+
|
|
12
|
+
if (typeof grouper === 'string') {
|
|
13
|
+
const suggestedKey = item[grouper]
|
|
14
|
+
key =
|
|
15
|
+
typeof suggestedKey !== 'string'
|
|
16
|
+
? JSON.stringify(suggestedKey)
|
|
17
|
+
: suggestedKey
|
|
18
|
+
} else if (grouper instanceof Function) {
|
|
19
|
+
key = grouper(item)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (key === undefined) {
|
|
23
|
+
return
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
results[key] = [...(results[key] ?? []), item]
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
return results
|
|
30
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PlanEvent, TrackPlan } from '../core/events/interfaces'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Determines whether a track event is allowed to be sent based on the
|
|
5
|
+
* user's tracking plan.
|
|
6
|
+
* If the user does not have a tracking plan or the event is allowed based
|
|
7
|
+
* on the tracking plan configuration, returns true.
|
|
8
|
+
*/
|
|
9
|
+
export function isPlanEventEnabled(
|
|
10
|
+
plan: TrackPlan | undefined,
|
|
11
|
+
planEvent: PlanEvent | undefined
|
|
12
|
+
): boolean {
|
|
13
|
+
// Always prioritize the event's `enabled` status
|
|
14
|
+
if (typeof planEvent?.enabled === 'boolean') {
|
|
15
|
+
return planEvent.enabled
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Assume absence of a tracking plan means events are enabled
|
|
19
|
+
return plan?.__default?.enabled ?? true
|
|
20
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
function findScript(src: string): HTMLScriptElement | undefined {
|
|
2
|
+
const scripts = Array.prototype.slice.call(
|
|
3
|
+
window.document.querySelectorAll('script')
|
|
4
|
+
)
|
|
5
|
+
return scripts.find((s) => s.src === src)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function loadScript(
|
|
9
|
+
src: string,
|
|
10
|
+
attributes?: Record<string, string>
|
|
11
|
+
): Promise<HTMLScriptElement> {
|
|
12
|
+
const found = findScript(src)
|
|
13
|
+
|
|
14
|
+
if (found !== undefined) {
|
|
15
|
+
const status = found?.getAttribute('status')
|
|
16
|
+
|
|
17
|
+
if (status === 'loaded') {
|
|
18
|
+
return Promise.resolve(found)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (status === 'loading') {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
found.addEventListener('load', () => resolve(found))
|
|
24
|
+
found.addEventListener('error', (err) => reject(err))
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
const script = window.document.createElement('script')
|
|
31
|
+
|
|
32
|
+
script.type = 'text/javascript'
|
|
33
|
+
script.src = src
|
|
34
|
+
script.async = true
|
|
35
|
+
|
|
36
|
+
script.setAttribute('status', 'loading')
|
|
37
|
+
for (const [k, v] of Object.entries(attributes ?? {})) {
|
|
38
|
+
script.setAttribute(k, v)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
script.onload = (): void => {
|
|
42
|
+
script.onerror = script.onload = null
|
|
43
|
+
script.setAttribute('status', 'loaded')
|
|
44
|
+
resolve(script)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
script.onerror = (): void => {
|
|
48
|
+
script.onerror = script.onload = null
|
|
49
|
+
script.setAttribute('status', 'error')
|
|
50
|
+
reject(new Error(`Failed to load ${src}`))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const tag = window.document.getElementsByTagName('script')[0]
|
|
54
|
+
tag.parentElement?.insertBefore(script, tag)
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function unloadScript(src: string): Promise<void> {
|
|
59
|
+
const found = findScript(src)
|
|
60
|
+
|
|
61
|
+
if (found !== undefined) {
|
|
62
|
+
found.remove()
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return Promise.resolve()
|
|
66
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { JSONObject, Options } from '../core/events/interfaces'
|
|
2
|
+
import { LegacySettings } from '../browser'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Merge legacy settings and initialized Integration option overrides.
|
|
6
|
+
*
|
|
7
|
+
* This will merge any options that were passed from initialization into
|
|
8
|
+
* overrides for settings that are returned by the CDN.
|
|
9
|
+
*
|
|
10
|
+
* i.e. this allows for passing options directly into destinations from
|
|
11
|
+
* the Analytics constructor.
|
|
12
|
+
*/
|
|
13
|
+
export function mergedOptions(
|
|
14
|
+
settings: LegacySettings,
|
|
15
|
+
options: Options
|
|
16
|
+
): Record<string, JSONObject> {
|
|
17
|
+
const optionOverrides = Object.entries(options.integrations ?? {}).reduce(
|
|
18
|
+
(overrides, [integration, options]) => {
|
|
19
|
+
if (typeof options === 'object') {
|
|
20
|
+
return {
|
|
21
|
+
...overrides,
|
|
22
|
+
[integration]: options,
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
...overrides,
|
|
28
|
+
[integration]: {},
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{} as Record<string, JSONObject>
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
return Object.entries(settings.integrations).reduce(
|
|
35
|
+
(integrationSettings, [integration, settings]) => {
|
|
36
|
+
return {
|
|
37
|
+
...integrationSettings,
|
|
38
|
+
[integration]: {
|
|
39
|
+
...settings,
|
|
40
|
+
...optionOverrides[integration],
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
{} as Record<string, JSONObject>
|
|
45
|
+
)
|
|
46
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register event listener on document that fires when:
|
|
3
|
+
* * tab change or tab close (in mobile or desktop)
|
|
4
|
+
* * click back / forward button
|
|
5
|
+
* * click any link or perform any other navigation action
|
|
6
|
+
* * soft refresh / hard refresh
|
|
7
|
+
*
|
|
8
|
+
* adapted from https://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad/52864508#52864508,
|
|
9
|
+
*/
|
|
10
|
+
export const onPageLeave = (cb: (...args: unknown[]) => void) => {
|
|
11
|
+
let unloaded = false // prevents double firing if both are supported
|
|
12
|
+
|
|
13
|
+
window.addEventListener('pagehide', () => {
|
|
14
|
+
if (unloaded) return
|
|
15
|
+
unloaded = true
|
|
16
|
+
cb()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
// using document instead of window because of bug affecting browsers before safari 14 (detail in footnotes https://caniuse.com/?search=visibilitychange)
|
|
20
|
+
document.addEventListener('visibilitychange', () => {
|
|
21
|
+
if (document.visibilityState == 'hidden') {
|
|
22
|
+
if (unloaded) return
|
|
23
|
+
unloaded = true
|
|
24
|
+
cb()
|
|
25
|
+
} else {
|
|
26
|
+
unloaded = false
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const pWhile = async <T>(
|
|
2
|
+
condition: (value: T | undefined) => boolean,
|
|
3
|
+
action: () => T | PromiseLike<T>
|
|
4
|
+
): Promise<void> => {
|
|
5
|
+
const loop = async (actionResult: T | undefined): Promise<void> => {
|
|
6
|
+
if (condition(actionResult)) {
|
|
7
|
+
return loop(await action())
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return loop(undefined)
|
|
12
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { getGlobalAnalytics } from './global-analytics-helper'
|
|
2
|
+
import { embeddedWriteKey } from './embedded-write-key'
|
|
3
|
+
|
|
4
|
+
const analyticsScriptRegex =
|
|
5
|
+
/(https?:\/\/[\w.\-:]+)\/(?:analytics\.js\/v1|v1\/analytics-js\/snippet)\/[\w\-:]+\/(analytics\.(?:min)\.js)/
|
|
6
|
+
|
|
7
|
+
const getCDNUrlFromScriptTag = (): string | undefined => {
|
|
8
|
+
let cdn: string | undefined
|
|
9
|
+
const scripts = Array.prototype.slice.call(
|
|
10
|
+
document.querySelectorAll('script')
|
|
11
|
+
)
|
|
12
|
+
for (const s of scripts) {
|
|
13
|
+
const src = s.getAttribute('src') ?? ''
|
|
14
|
+
const result = analyticsScriptRegex.exec(src)
|
|
15
|
+
|
|
16
|
+
if (result && result[1]) {
|
|
17
|
+
cdn = result[1]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// If the script tag has the globalCustomerioAnalyticsKey attribute, then this is a CDP script (not segment).
|
|
21
|
+
if (s.dataset?.globalCustomerioAnalyticsKey != null) {
|
|
22
|
+
break
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return cdn
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let _globalCDN: string | undefined // set globalCDN as in-memory singleton
|
|
29
|
+
const getGlobalCDNUrl = (): string | undefined => {
|
|
30
|
+
const result = _globalCDN ?? getGlobalAnalytics()?._cdn
|
|
31
|
+
return result
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const setGlobalCDNUrl = (cdn: string) => {
|
|
35
|
+
const globalAnalytics = getGlobalAnalytics()
|
|
36
|
+
if (globalAnalytics) {
|
|
37
|
+
globalAnalytics._cdn = cdn
|
|
38
|
+
}
|
|
39
|
+
_globalCDN = cdn
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const getCDN = (): string => {
|
|
43
|
+
const globalCdnUrl = getGlobalCDNUrl()
|
|
44
|
+
|
|
45
|
+
if (globalCdnUrl) return globalCdnUrl
|
|
46
|
+
|
|
47
|
+
const cdnFromScriptTag = getCDNUrlFromScriptTag()
|
|
48
|
+
|
|
49
|
+
if (cdnFromScriptTag) {
|
|
50
|
+
return cdnFromScriptTag
|
|
51
|
+
} else {
|
|
52
|
+
// it's possible that the CDN is not found in the page because:
|
|
53
|
+
// - the script is loaded through a proxy
|
|
54
|
+
// - the script is removed after execution
|
|
55
|
+
// in this case, we fall back to the default CDN
|
|
56
|
+
return `https://cdp.customer.io`
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const getNextIntegrationsURL = () => {
|
|
61
|
+
const cdn = getCDN()
|
|
62
|
+
return `${cdn}/v1/analytics-js/actions`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Replaces the CDN URL in the script tag with the one from Analytics.js 1.0
|
|
67
|
+
*
|
|
68
|
+
* @returns the path to Analytics JS 1.0
|
|
69
|
+
**/
|
|
70
|
+
export function getLegacyAJSPath(): string {
|
|
71
|
+
const writeKey = embeddedWriteKey() ?? getGlobalAnalytics()?._writeKey
|
|
72
|
+
|
|
73
|
+
const scripts = Array.prototype.slice.call(
|
|
74
|
+
document.querySelectorAll('script')
|
|
75
|
+
)
|
|
76
|
+
let path: string | undefined = undefined
|
|
77
|
+
|
|
78
|
+
for (const s of scripts) {
|
|
79
|
+
const src = s.getAttribute('src') ?? ''
|
|
80
|
+
const result = analyticsScriptRegex.exec(src)
|
|
81
|
+
|
|
82
|
+
if (result && result[1]) {
|
|
83
|
+
path = src
|
|
84
|
+
break
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (path) {
|
|
89
|
+
return path.replace('analytics.min.js', 'analytics.classic.js')
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return `https://cdp.customer.io/analytics.js/v1/${writeKey}/analytics.classic.js`
|
|
93
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
type BackoffParams = {
|
|
2
|
+
/** The number of milliseconds before starting the first retry. Default is 500 */
|
|
3
|
+
minTimeout?: number
|
|
4
|
+
|
|
5
|
+
/** The maximum number of milliseconds between two retries. Default is Infinity */
|
|
6
|
+
maxTimeout?: number
|
|
7
|
+
|
|
8
|
+
/** The exponential factor to use. Default is 2. */
|
|
9
|
+
factor?: number
|
|
10
|
+
|
|
11
|
+
/** The current attempt */
|
|
12
|
+
attempt: number
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function backoff(params: BackoffParams): number {
|
|
16
|
+
const random = Math.random() + 1
|
|
17
|
+
const {
|
|
18
|
+
minTimeout = 500,
|
|
19
|
+
factor = 2,
|
|
20
|
+
attempt,
|
|
21
|
+
maxTimeout = Infinity,
|
|
22
|
+
} = params
|
|
23
|
+
return Math.min(random * minTimeout * Math.pow(factor, attempt), maxTimeout)
|
|
24
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { PriorityQueue } from '.'
|
|
2
|
+
import { Context, SerializedContext } from '../../core/context'
|
|
3
|
+
import { isBrowser } from '../../core/environment'
|
|
4
|
+
|
|
5
|
+
let loc:
|
|
6
|
+
| Storage
|
|
7
|
+
| { getItem: () => void; setItem: () => void; removeItem: () => void } = {
|
|
8
|
+
getItem() {},
|
|
9
|
+
setItem() {},
|
|
10
|
+
removeItem() {},
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
loc = isBrowser() && window.localStorage ? window.localStorage : loc
|
|
15
|
+
} catch (err) {
|
|
16
|
+
console.warn('Unable to access localStorage', err)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function persisted(key: string): Context[] {
|
|
20
|
+
const items = loc.getItem(key)
|
|
21
|
+
return (items ? JSON.parse(items) : []).map(
|
|
22
|
+
(p: SerializedContext) => new Context(p.event, p.id)
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function persistItems(key: string, items: Context[]): void {
|
|
27
|
+
const existing = persisted(key)
|
|
28
|
+
const all = [...items, ...existing]
|
|
29
|
+
|
|
30
|
+
const merged = all.reduce((acc, item) => {
|
|
31
|
+
return {
|
|
32
|
+
...acc,
|
|
33
|
+
[item.id]: item,
|
|
34
|
+
}
|
|
35
|
+
}, {} as Record<string, Context>)
|
|
36
|
+
|
|
37
|
+
loc.setItem(key, JSON.stringify(Object.values(merged)))
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function seen(key: string): Record<string, number> {
|
|
41
|
+
const stored = loc.getItem(key)
|
|
42
|
+
return stored ? JSON.parse(stored) : {}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function persistSeen(key: string, memory: Record<string, number>): void {
|
|
46
|
+
const stored = seen(key)
|
|
47
|
+
|
|
48
|
+
loc.setItem(
|
|
49
|
+
key,
|
|
50
|
+
JSON.stringify({
|
|
51
|
+
...stored,
|
|
52
|
+
...memory,
|
|
53
|
+
})
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function remove(key: string): void {
|
|
58
|
+
loc.removeItem(key)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const now = (): number => new Date().getTime()
|
|
62
|
+
|
|
63
|
+
function mutex(key: string, onUnlock: Function, attempt = 0): void {
|
|
64
|
+
const lockTimeout = 50
|
|
65
|
+
const lockKey = `persisted-queue:v1:${key}:lock`
|
|
66
|
+
|
|
67
|
+
const expired = (lock: number): boolean => new Date().getTime() > lock
|
|
68
|
+
const rawLock = loc.getItem(lockKey)
|
|
69
|
+
const lock = rawLock ? (JSON.parse(rawLock) as number) : null
|
|
70
|
+
|
|
71
|
+
const allowed = lock === null || expired(lock)
|
|
72
|
+
if (allowed) {
|
|
73
|
+
loc.setItem(lockKey, JSON.stringify(now() + lockTimeout))
|
|
74
|
+
onUnlock()
|
|
75
|
+
loc.removeItem(lockKey)
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (!allowed && attempt < 3) {
|
|
80
|
+
setTimeout(() => {
|
|
81
|
+
mutex(key, onUnlock, attempt + 1)
|
|
82
|
+
}, lockTimeout)
|
|
83
|
+
} else {
|
|
84
|
+
console.error('Unable to retrieve lock')
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export class PersistedPriorityQueue extends PriorityQueue<Context> {
|
|
89
|
+
constructor(maxAttempts: number, key: string) {
|
|
90
|
+
super(maxAttempts, [])
|
|
91
|
+
|
|
92
|
+
const itemsKey = `persisted-queue:v1:${key}:items`
|
|
93
|
+
const seenKey = `persisted-queue:v1:${key}:seen`
|
|
94
|
+
|
|
95
|
+
let saved: Context[] = []
|
|
96
|
+
let lastSeen: Record<string, number> = {}
|
|
97
|
+
|
|
98
|
+
mutex(key, () => {
|
|
99
|
+
try {
|
|
100
|
+
saved = persisted(itemsKey)
|
|
101
|
+
lastSeen = seen(seenKey)
|
|
102
|
+
remove(itemsKey)
|
|
103
|
+
remove(seenKey)
|
|
104
|
+
|
|
105
|
+
this.queue = [...saved, ...this.queue]
|
|
106
|
+
this.seen = { ...lastSeen, ...this.seen }
|
|
107
|
+
} catch (err) {
|
|
108
|
+
console.error(err)
|
|
109
|
+
}
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
window.addEventListener('pagehide', () => {
|
|
113
|
+
// we deliberately want to use the less powerful 'pagehide' API to only persist on events where the analytics instance gets destroyed, and not on tab away.
|
|
114
|
+
if (this.todo > 0) {
|
|
115
|
+
const items = [...this.queue, ...this.future]
|
|
116
|
+
try {
|
|
117
|
+
mutex(key, () => {
|
|
118
|
+
persistItems(itemsKey, items)
|
|
119
|
+
persistSeen(seenKey, this.seen)
|
|
120
|
+
})
|
|
121
|
+
} catch (err) {
|
|
122
|
+
console.error(err)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
}
|
package/src/lib/sleep.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Alias,
|
|
3
|
+
Facade,
|
|
4
|
+
Group,
|
|
5
|
+
Identify,
|
|
6
|
+
Options,
|
|
7
|
+
Page,
|
|
8
|
+
Screen,
|
|
9
|
+
Track,
|
|
10
|
+
} from '@segment/facade'
|
|
11
|
+
import { CustomerioEvent } from '../core/events'
|
|
12
|
+
|
|
13
|
+
export type CustomerioFacade = Facade<CustomerioEvent> & {
|
|
14
|
+
obj: CustomerioEvent
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function toFacade(
|
|
18
|
+
evt: CustomerioEvent,
|
|
19
|
+
options?: Options
|
|
20
|
+
): CustomerioFacade {
|
|
21
|
+
let fcd = new Facade(evt, options)
|
|
22
|
+
|
|
23
|
+
if (evt.type === 'track') {
|
|
24
|
+
fcd = new Track(evt, options)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (evt.type === 'identify') {
|
|
28
|
+
fcd = new Identify(evt, options)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (evt.type === 'page') {
|
|
32
|
+
fcd = new Page(evt, options)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (evt.type === 'alias') {
|
|
36
|
+
fcd = new Alias(evt, options)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (evt.type === 'group') {
|
|
40
|
+
fcd = new Group(evt, options)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (evt.type === 'screen') {
|
|
44
|
+
fcd = new Screen(evt, options)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
Object.defineProperty(fcd, 'obj', {
|
|
48
|
+
value: evt,
|
|
49
|
+
writable: true,
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
return fcd as CustomerioFacade
|
|
53
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Analytics } from '../core/analytics'
|
|
2
|
+
import { Context } from '../core/context'
|
|
3
|
+
import { validation } from '../plugins/validation'
|
|
4
|
+
import { analyticsNode } from '../plugins/analytics-node'
|
|
5
|
+
import { Plugin } from '../core/plugin'
|
|
6
|
+
import { EventQueue } from '../core/queue/event-queue'
|
|
7
|
+
import { PriorityQueue } from '../lib/priority-queue'
|
|
8
|
+
|
|
9
|
+
export class AnalyticsNode {
|
|
10
|
+
static async load(settings: {
|
|
11
|
+
writeKey: string
|
|
12
|
+
}): Promise<[Analytics, Context]> {
|
|
13
|
+
const cookieOptions = {
|
|
14
|
+
persist: false,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const queue = new EventQueue(new PriorityQueue(3, []))
|
|
18
|
+
const options = { user: cookieOptions, group: cookieOptions }
|
|
19
|
+
const analytics = new Analytics(settings, options, queue)
|
|
20
|
+
|
|
21
|
+
const nodeSettings = {
|
|
22
|
+
writeKey: settings.writeKey,
|
|
23
|
+
name: 'analytics-node-next',
|
|
24
|
+
type: 'after' as Plugin['type'],
|
|
25
|
+
version: 'latest',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const ctx = await analytics.register(
|
|
29
|
+
validation,
|
|
30
|
+
analyticsNode(nodeSettings)
|
|
31
|
+
)
|
|
32
|
+
analytics.emit('initialize', settings, cookieOptions ?? {})
|
|
33
|
+
|
|
34
|
+
return [analytics, ctx]
|
|
35
|
+
}
|
|
36
|
+
}
|