UNPKG

@aws-amplify/analytics

Version:

Analytics category of aws-amplify

1 lines 6.75 kB
{"version":3,"file":"EventTracker.mjs","sources":["../../../src/trackers/EventTracker.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { ConsoleLogger } from '@aws-amplify/core';\nimport { isBrowser } from '@aws-amplify/core/internals/utils';\nconst DEFAULT_EVENTS = ['click'];\nconst DEFAULT_SELECTOR_PREFIX = 'data-amplify-analytics-';\nconst DEFAULT_EVENT_NAME = 'event'; // Default event name as sent to the analytics provider\nconst logger = new ConsoleLogger('EventTracker');\nexport class EventTracker {\n constructor(eventRecorder, options) {\n this.options = {};\n this.trackerActive = false;\n this.eventRecorder = eventRecorder;\n this.handleDocEvent = this.handleDocEvent.bind(this);\n this.configure(eventRecorder, options);\n }\n configure(eventRecorder, options) {\n this.eventRecorder = eventRecorder;\n // Clean up any existing listeners\n this.cleanup();\n // Apply defaults\n this.options = {\n attributes: options?.attributes ?? undefined,\n events: options?.events ?? DEFAULT_EVENTS,\n selectorPrefix: options?.selectorPrefix ?? DEFAULT_SELECTOR_PREFIX,\n };\n // Register event listeners\n if (isBrowser()) {\n this.options.events?.forEach(targetEvent => {\n document.addEventListener(targetEvent, this.handleDocEvent, {\n capture: true,\n });\n });\n this.trackerActive = true;\n }\n }\n cleanup() {\n // No-op if document listener is not active\n if (!this.trackerActive) {\n return;\n }\n // Clean up event listeners\n this.options.events?.forEach(targetEvent => {\n document.removeEventListener(targetEvent, this.handleDocEvent, {\n capture: true,\n });\n });\n }\n handleDocEvent(event) {\n /**\n * Example DOM element:\n *\n * ```\n * <button\n * data-amplify-analytics-on=\"click\"\n * data-amplify-analytics-name=\"click\"\n * data-amplify-analytics-attrs=\"attr1:attr1_value,attr2:attr2_value\"\n * />\n * ```\n */\n const triggerSelector = `[${this.options.selectorPrefix}on]`;\n const attrSelector = `${this.options.selectorPrefix}attrs`;\n const eventNameSelector = `${this.options.selectorPrefix}name`;\n const eventSource = event.target;\n // Validate that the triggering event type is being tracked\n if (!this.options.events?.includes(event.type)) {\n return;\n }\n if (eventSource instanceof HTMLElement) {\n const target = eventSource.closest(triggerSelector);\n if (target) {\n // Parse event name from the element\n const eventName = target.getAttribute(eventNameSelector) || DEFAULT_EVENT_NAME;\n // Parse attributes from the element\n const elementAttributes = {};\n const rawElementAttributes = target.getAttribute(attrSelector);\n rawElementAttributes?.split(/\\s*,\\s*/).forEach(attr => {\n const tmp = attr.trim().split(/\\s*:\\s*/);\n elementAttributes[tmp[0]] = tmp[1];\n });\n // Assemble final list of attributes\n const attributes = Object.assign({\n type: event.type,\n target: `${target.localName} with id ${target.id}`,\n }, this.options.attributes, elementAttributes);\n logger.debug('Recording automatically tracked DOM event', {\n eventName,\n attributes,\n });\n this.eventRecorder(eventName, attributes);\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}