@amplitude/plugin-autocapture-browser 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/autocapture-plugin.d.ts +4 -4
- package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
- package/lib/cjs/autocapture-plugin.js +53 -30
- package/lib/cjs/autocapture-plugin.js.map +1 -1
- package/lib/cjs/helpers.d.ts +1 -1
- package/lib/cjs/helpers.d.ts.map +1 -1
- package/lib/cjs/helpers.js.map +1 -1
- package/lib/cjs/hierarchy.d.ts +2 -2
- package/lib/cjs/hierarchy.d.ts.map +1 -1
- package/lib/cjs/hierarchy.js.map +1 -1
- package/lib/cjs/libs/messenger.d.ts.map +1 -1
- package/lib/cjs/libs/messenger.js +2 -0
- package/lib/cjs/libs/messenger.js.map +1 -1
- package/lib/cjs/pageActions/matchEventToFilter.js +1 -1
- package/lib/cjs/pageActions/matchEventToFilter.js.map +1 -1
- package/lib/cjs/pageActions/triggers.d.ts +13 -7
- package/lib/cjs/pageActions/triggers.d.ts.map +1 -1
- package/lib/cjs/pageActions/triggers.js +80 -13
- package/lib/cjs/pageActions/triggers.js.map +1 -1
- package/lib/cjs/version.d.ts +1 -1
- package/lib/cjs/version.js +1 -1
- package/lib/cjs/version.js.map +1 -1
- package/lib/esm/autocapture-plugin.d.ts +4 -4
- package/lib/esm/autocapture-plugin.d.ts.map +1 -1
- package/lib/esm/autocapture-plugin.js +54 -31
- package/lib/esm/autocapture-plugin.js.map +1 -1
- package/lib/esm/helpers.d.ts +1 -1
- package/lib/esm/helpers.d.ts.map +1 -1
- package/lib/esm/helpers.js.map +1 -1
- package/lib/esm/hierarchy.d.ts +2 -2
- package/lib/esm/hierarchy.d.ts.map +1 -1
- package/lib/esm/hierarchy.js.map +1 -1
- package/lib/esm/libs/messenger.d.ts.map +1 -1
- package/lib/esm/libs/messenger.js +2 -0
- package/lib/esm/libs/messenger.js.map +1 -1
- package/lib/esm/pageActions/matchEventToFilter.js +1 -1
- package/lib/esm/pageActions/matchEventToFilter.js.map +1 -1
- package/lib/esm/pageActions/triggers.d.ts +13 -7
- package/lib/esm/pageActions/triggers.d.ts.map +1 -1
- package/lib/esm/pageActions/triggers.js +78 -12
- package/lib/esm/pageActions/triggers.js.map +1 -1
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.js +1 -1
- package/lib/esm/version.js.map +1 -1
- package/lib/scripts/amplitude-min.js +1 -1
- package/lib/scripts/amplitude-min.js.gz +0 -0
- package/lib/scripts/amplitude-min.js.map +1 -1
- package/lib/scripts/amplitude-min.umd.js +1 -1
- package/lib/scripts/amplitude-min.umd.js.gz +0 -0
- package/lib/scripts/autocapture-plugin.d.ts +4 -4
- package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
- package/lib/scripts/helpers.d.ts +1 -1
- package/lib/scripts/helpers.d.ts.map +1 -1
- package/lib/scripts/hierarchy.d.ts +2 -2
- package/lib/scripts/hierarchy.d.ts.map +1 -1
- package/lib/scripts/libs/messenger.d.ts.map +1 -1
- package/lib/scripts/pageActions/triggers.d.ts +13 -7
- package/lib/scripts/pageActions/triggers.d.ts.map +1 -1
- package/lib/scripts/version.d.ts +1 -1
- package/package.json +4 -3
package/lib/esm/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport * as constants from './constants';\nimport { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';\nimport { getHierarchy } from './hierarchy';\n\nexport type JSONValue = string | number | boolean | null | { [x: string]: JSONValue } | Array<JSONValue>;\n\nconst SENSITIVE_TAGS = ['input', 'select', 'textarea'];\n\nexport type shouldTrackEvent = (actionType: ActionType, element: Element) => boolean;\n\nexport const isElementPointerCursor = (element: Element, actionType: ActionType): boolean => {\n /* istanbul ignore next */\n const computedStyle = window?.getComputedStyle?.(element);\n /* istanbul ignore next */\n return computedStyle?.getPropertyValue('cursor') === 'pointer' && actionType === 'click';\n};\n\nexport const createShouldTrackEvent = (\n autocaptureOptions: ElementInteractionsOptions,\n allowlist: string[], // this can be any type of css selector allow list\n isAlwaysCaptureCursorPointer = false,\n): shouldTrackEvent => {\n return (actionType: ActionType, element: Element) => {\n const { pageUrlAllowlist, shouldTrackEventResolver } = autocaptureOptions;\n\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n // window, document, and Text nodes have no tag\n if (!tag) {\n return false;\n }\n\n if (shouldTrackEventResolver) {\n return shouldTrackEventResolver(actionType, element);\n }\n\n if (!isPageUrlAllowed(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n /* istanbul ignore next */\n const elementType = String(element?.getAttribute('type')) || '';\n if (typeof elementType === 'string') {\n switch (elementType.toLowerCase()) {\n case 'hidden':\n return false;\n case 'password':\n return false;\n }\n }\n\n const isCursorPointer = isElementPointerCursor(element, actionType);\n\n if (isAlwaysCaptureCursorPointer && isCursorPointer) {\n return true;\n }\n\n /* istanbul ignore if */\n if (allowlist) {\n const hasMatchAnyAllowedSelector = allowlist.some((selector) => !!element?.matches?.(selector));\n if (!hasMatchAnyAllowedSelector) {\n return false;\n }\n }\n\n switch (tag) {\n case 'input':\n case 'select':\n case 'textarea':\n return actionType === 'change' || actionType === 'click';\n default: {\n /* istanbul ignore next */\n /* istanbul ignore next */\n if (isCursorPointer) {\n return true;\n }\n return actionType === 'click';\n }\n }\n };\n};\n\nexport const isNonSensitiveString = (text: string | null) => {\n if (text == null) {\n return false;\n }\n if (typeof text === 'string') {\n const ccRegex =\n /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/;\n if (ccRegex.test((text || '').replace(/[- ]/g, ''))) {\n return false;\n }\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/;\n if (ssnRegex.test(text)) {\n return false;\n }\n }\n return true;\n};\n\nexport const isTextNode = (node: Node) => {\n return !!node && node.nodeType === 3;\n};\n\nexport const isNonSensitiveElement = (element: Element) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n const isContentEditable =\n element instanceof HTMLElement ? element.getAttribute('contenteditable')?.toLowerCase() === 'true' : false;\n\n return !SENSITIVE_TAGS.includes(tag) && !isContentEditable;\n};\n\n// Maybe this can be simplified with element.innerText, keep and manual concatenating for now, more research needed.\nexport const getText = (element: Element): string => {\n let text = '';\n if (isNonSensitiveElement(element) && element.childNodes && element.childNodes.length) {\n element.childNodes.forEach((child) => {\n let childText = '';\n if (isTextNode(child)) {\n if (child.textContent) {\n childText = child.textContent;\n }\n } else {\n childText = getText(child as Element);\n }\n text += childText\n .split(/(\\s+)/)\n .filter(isNonSensitiveString)\n .join('')\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n .substring(0, 255);\n });\n }\n return text;\n};\n\nexport const isPageUrlAllowed = (url: string, pageUrlAllowlist: (string | RegExp)[] | undefined) => {\n if (!pageUrlAllowlist || !pageUrlAllowlist.length) {\n return true;\n }\n return pageUrlAllowlist.some((allowedUrl) => {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\n\nexport const getAttributesWithPrefix = (element: Element, prefix: string): { [key: string]: string } => {\n return element.getAttributeNames().reduce((attributes: { [key: string]: string }, attributeName) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n const attributeValue = element.getAttribute(attributeName);\n if (attributeKey) {\n attributes[attributeKey] = attributeValue || '';\n }\n }\n return attributes;\n }, {});\n};\n\nexport const isEmpty = (value: unknown) => {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n );\n};\n\nexport const removeEmptyProperties = (properties: { [key: string]: unknown }) => {\n return Object.keys(properties).reduce((filteredProperties: { [key: string]: unknown }, key) => {\n const value = properties[key];\n if (!isEmpty(value)) {\n filteredProperties[key] = value;\n }\n return filteredProperties;\n }, {});\n};\n\nexport const getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch (error) {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n const labelText = labelElement.textContent || '';\n return isNonSensitiveString(labelText) ? labelText : '';\n }\n return getNearestLabel(parent);\n};\n\nexport const querySelectUniqueElements = (root: Element | Document, selectors: string[]): Element[] => {\n if (root && 'querySelectorAll' in root && typeof root.querySelectorAll === 'function') {\n const elementSet = selectors.reduce((elements: Set<Element>, selector) => {\n if (selector) {\n const selectedElements = Array.from(root.querySelectorAll(selector));\n selectedElements.forEach((element) => {\n elements.add(element);\n });\n }\n return elements;\n }, new Set<Element>());\n return Array.from(elementSet);\n }\n return [];\n};\n\n// Similar as element.closest, but works with multiple selectors\nexport const getClosestElement = (element: Element | null, selectors: string[]): Element | null => {\n if (!element) {\n return null;\n }\n /* istanbul ignore next */\n if (selectors.some((selector) => element?.matches?.(selector))) {\n return element;\n }\n /* istanbul ignore next */\n return getClosestElement(element?.parentElement, selectors);\n};\n\n// Returns the element properties for the given element in Visual Labeling.\nexport const getEventTagProps = (element: Element) => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties: Record<string, JSONValue> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties);\n};\n\nexport const asyncLoadScript = (url: string) => {\n return new Promise((resolve, reject) => {\n try {\n const scriptElement = document.createElement('script');\n scriptElement.type = 'text/javascript';\n scriptElement.async = true;\n scriptElement.src = url;\n scriptElement.addEventListener(\n 'load',\n () => {\n resolve({ status: true });\n },\n { once: true },\n );\n scriptElement.addEventListener('error', () => {\n reject({\n status: false,\n message: `Failed to load the script ${url}`,\n });\n });\n /* istanbul ignore next */\n document.head?.appendChild(scriptElement);\n } catch (error) {\n /* istanbul ignore next */\n reject(error);\n }\n });\n};\n\nexport function generateUniqueId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\nexport const filterOutNonTrackableEvents = (event: ElementBasedTimestampedEvent<ElementBasedEvent>): boolean => {\n // Filter out changeEvent events with no target\n // This could happen when change events are triggered programmatically\n if (event.event.target === null || !event.closestTrackedAncestor) {\n return false;\n }\n\n return true;\n};\n\n// Returns the Amplitude event properties for the given element.\nexport const getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n const ariaLabel = element.getAttribute('aria-label');\n const attributes = getAttributesWithPrefix(element, dataAttributePrefix);\n const nearestLabel = getNearestLabel(element);\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID]: element.getAttribute('id') || '',\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS]: element.getAttribute('class'),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: getHierarchy(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL]: ariaLabel,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]: (typeof document !== 'undefined' && document.title) || '',\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = element.href;\n }\n return removeEmptyProperties(properties);\n};\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n};\n\n// Base TimestampedEvent type\nexport type BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\nexport type evaluateTriggersFn = <T extends ElementBasedEvent>(\n event: ElementBasedTimestampedEvent<T>,\n) => ElementBasedTimestampedEvent<T>;\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\n// Type predicate\nexport function isElementBasedEvent<T>(event: BaseTimestampedEvent<T>): event is ElementBasedTimestampedEvent<T> {\n return event.type === 'click' || event.type === 'change';\n}\n\nexport interface NavigateEvent extends Event {\n readonly navigationType: 'reload' | 'push' | 'replace' | 'traverse';\n readonly destination: {\n readonly url: string;\n readonly key: string | null;\n readonly id: string | null;\n readonly index: number;\n readonly sameDocument: boolean;\n\n getState(): any;\n };\n readonly canIntercept: boolean;\n readonly userInitiated: boolean;\n readonly hashChange: boolean;\n readonly signal: AbortSignal;\n readonly formData: FormData | null;\n readonly downloadRequest: string | null;\n readonly info: any;\n readonly hasUAVisualTransition: boolean;\n /** @see https://github.com/WICG/navigation-api/pull/264 */\n readonly sourceElement: Element | null;\n\n scroll(): void;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport * as constants from './constants';\nimport { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';\nimport { getHierarchy } from './hierarchy';\n\nexport type JSONValue = string | number | boolean | null | { [x: string]: JSONValue } | Array<JSONValue>;\n\nconst SENSITIVE_TAGS = ['input', 'select', 'textarea'];\n\nexport type shouldTrackEvent = (actionType: ActionType, element: Element) => boolean;\n\nexport const isElementPointerCursor = (element: Element, actionType: ActionType): boolean => {\n /* istanbul ignore next */\n const computedStyle = window?.getComputedStyle?.(element);\n /* istanbul ignore next */\n return computedStyle?.getPropertyValue('cursor') === 'pointer' && actionType === 'click';\n};\n\nexport const createShouldTrackEvent = (\n autocaptureOptions: ElementInteractionsOptions,\n allowlist: string[], // this can be any type of css selector allow list\n isAlwaysCaptureCursorPointer = false,\n): shouldTrackEvent => {\n return (actionType: ActionType, element: Element) => {\n const { pageUrlAllowlist, shouldTrackEventResolver } = autocaptureOptions;\n\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n // window, document, and Text nodes have no tag\n if (!tag) {\n return false;\n }\n\n if (shouldTrackEventResolver) {\n return shouldTrackEventResolver(actionType, element);\n }\n\n if (!isPageUrlAllowed(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n /* istanbul ignore next */\n const elementType = String(element?.getAttribute('type')) || '';\n if (typeof elementType === 'string') {\n switch (elementType.toLowerCase()) {\n case 'hidden':\n return false;\n case 'password':\n return false;\n }\n }\n\n const isCursorPointer = isElementPointerCursor(element, actionType);\n\n if (isAlwaysCaptureCursorPointer && isCursorPointer) {\n return true;\n }\n\n /* istanbul ignore if */\n if (allowlist) {\n const hasMatchAnyAllowedSelector = allowlist.some((selector) => !!element?.matches?.(selector));\n if (!hasMatchAnyAllowedSelector) {\n return false;\n }\n }\n\n switch (tag) {\n case 'input':\n case 'select':\n case 'textarea':\n return actionType === 'change' || actionType === 'click';\n default: {\n /* istanbul ignore next */\n /* istanbul ignore next */\n if (isCursorPointer) {\n return true;\n }\n return actionType === 'click';\n }\n }\n };\n};\n\nexport const isNonSensitiveString = (text: string | null) => {\n if (text == null) {\n return false;\n }\n if (typeof text === 'string') {\n const ccRegex =\n /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/;\n if (ccRegex.test((text || '').replace(/[- ]/g, ''))) {\n return false;\n }\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/;\n if (ssnRegex.test(text)) {\n return false;\n }\n }\n return true;\n};\n\nexport const isTextNode = (node: Node) => {\n return !!node && node.nodeType === 3;\n};\n\nexport const isNonSensitiveElement = (element: Element) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n const isContentEditable =\n element instanceof HTMLElement ? element.getAttribute('contenteditable')?.toLowerCase() === 'true' : false;\n\n return !SENSITIVE_TAGS.includes(tag) && !isContentEditable;\n};\n\n// Maybe this can be simplified with element.innerText, keep and manual concatenating for now, more research needed.\nexport const getText = (element: Element): string => {\n let text = '';\n if (isNonSensitiveElement(element) && element.childNodes && element.childNodes.length) {\n element.childNodes.forEach((child) => {\n let childText = '';\n if (isTextNode(child)) {\n if (child.textContent) {\n childText = child.textContent;\n }\n } else {\n childText = getText(child as Element);\n }\n text += childText\n .split(/(\\s+)/)\n .filter(isNonSensitiveString)\n .join('')\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n .substring(0, 255);\n });\n }\n return text;\n};\n\nexport const isPageUrlAllowed = (url: string, pageUrlAllowlist: (string | RegExp)[] | undefined) => {\n if (!pageUrlAllowlist || !pageUrlAllowlist.length) {\n return true;\n }\n return pageUrlAllowlist.some((allowedUrl) => {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\n\nexport const getAttributesWithPrefix = (element: Element, prefix: string): { [key: string]: string } => {\n return element.getAttributeNames().reduce((attributes: { [key: string]: string }, attributeName) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n const attributeValue = element.getAttribute(attributeName);\n if (attributeKey) {\n attributes[attributeKey] = attributeValue || '';\n }\n }\n return attributes;\n }, {});\n};\n\nexport const isEmpty = (value: unknown) => {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n );\n};\n\nexport const removeEmptyProperties = (properties: { [key: string]: unknown }) => {\n return Object.keys(properties).reduce((filteredProperties: { [key: string]: unknown }, key) => {\n const value = properties[key];\n if (!isEmpty(value)) {\n filteredProperties[key] = value;\n }\n return filteredProperties;\n }, {});\n};\n\nexport const getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch (error) {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n const labelText = labelElement.textContent || '';\n return isNonSensitiveString(labelText) ? labelText : '';\n }\n return getNearestLabel(parent);\n};\n\nexport const querySelectUniqueElements = (root: Element | Document, selectors: string[]): Element[] => {\n if (root && 'querySelectorAll' in root && typeof root.querySelectorAll === 'function') {\n const elementSet = selectors.reduce((elements: Set<Element>, selector) => {\n if (selector) {\n const selectedElements = Array.from(root.querySelectorAll(selector));\n selectedElements.forEach((element) => {\n elements.add(element);\n });\n }\n return elements;\n }, new Set<Element>());\n return Array.from(elementSet);\n }\n return [];\n};\n\n// Similar as element.closest, but works with multiple selectors\nexport const getClosestElement = (element: Element | null, selectors: string[]): Element | null => {\n if (!element) {\n return null;\n }\n /* istanbul ignore next */\n if (selectors.some((selector) => element?.matches?.(selector))) {\n return element;\n }\n /* istanbul ignore next */\n return getClosestElement(element?.parentElement, selectors);\n};\n\n// Returns the element properties for the given element in Visual Labeling.\nexport const getEventTagProps = (element: Element) => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties: Record<string, JSONValue> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties);\n};\n\nexport const asyncLoadScript = (url: string) => {\n return new Promise((resolve, reject) => {\n try {\n const scriptElement = document.createElement('script');\n scriptElement.type = 'text/javascript';\n scriptElement.async = true;\n scriptElement.src = url;\n scriptElement.addEventListener(\n 'load',\n () => {\n resolve({ status: true });\n },\n { once: true },\n );\n scriptElement.addEventListener('error', () => {\n reject({\n status: false,\n message: `Failed to load the script ${url}`,\n });\n });\n /* istanbul ignore next */\n document.head?.appendChild(scriptElement);\n } catch (error) {\n /* istanbul ignore next */\n reject(error);\n }\n });\n};\n\nexport function generateUniqueId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\nexport const filterOutNonTrackableEvents = (event: ElementBasedTimestampedEvent<ElementBasedEvent>): boolean => {\n // Filter out changeEvent events with no target\n // This could happen when change events are triggered programmatically\n if (event.event.target === null || !event.closestTrackedAncestor) {\n return false;\n }\n\n return true;\n};\n\n// Returns the Amplitude event properties for the given element.\nexport const getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n const ariaLabel = element.getAttribute('aria-label');\n const attributes = getAttributesWithPrefix(element, dataAttributePrefix);\n const nearestLabel = getNearestLabel(element);\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID]: element.getAttribute('id') || '',\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS]: element.getAttribute('class'),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: getHierarchy(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL]: ariaLabel,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]: (typeof document !== 'undefined' && document.title) || '',\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = element.href;\n }\n return removeEmptyProperties(properties);\n};\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n};\n\n// Base TimestampedEvent type\nexport type BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\nexport type evaluateTriggersFn = (\n event: ElementBasedTimestampedEvent<ElementBasedEvent>,\n) => ElementBasedTimestampedEvent<ElementBasedEvent>;\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\n// Type predicate\nexport function isElementBasedEvent<T>(event: BaseTimestampedEvent<T>): event is ElementBasedTimestampedEvent<T> {\n return event.type === 'click' || event.type === 'change';\n}\n\nexport interface NavigateEvent extends Event {\n readonly navigationType: 'reload' | 'push' | 'replace' | 'traverse';\n readonly destination: {\n readonly url: string;\n readonly key: string | null;\n readonly id: string | null;\n readonly index: number;\n readonly sameDocument: boolean;\n\n getState(): any;\n };\n readonly canIntercept: boolean;\n readonly userInitiated: boolean;\n readonly hashChange: boolean;\n readonly signal: AbortSignal;\n readonly formData: FormData | null;\n readonly downloadRequest: string | null;\n readonly info: any;\n readonly hasUAVisualTransition: boolean;\n /** @see https://github.com/WICG/navigation-api/pull/264 */\n readonly sourceElement: Element | null;\n\n scroll(): void;\n}\n"]}
|
package/lib/esm/hierarchy.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { JSONValue } from './helpers';
|
|
2
|
-
import { Hierarchy, HierarchyNode } from './typings/autocapture';
|
|
1
|
+
import { type JSONValue } from './helpers';
|
|
2
|
+
import type { Hierarchy, HierarchyNode } from './typings/autocapture';
|
|
3
3
|
export declare function getElementProperties(element: Element | null): HierarchyNode | null;
|
|
4
4
|
export declare function getAncestors(targetEl: Element | null): Element[];
|
|
5
5
|
export declare const getHierarchy: (element: Element | null) => Hierarchy;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.d.ts","sourceRoot":"","sources":["../../src/hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"hierarchy.d.ts","sourceRoot":"","sources":["../../src/hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAoCtE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,aAAa,GAAG,IAAI,CAsDlF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,EAAE,CAehE;AAGD,eAAO,MAAM,YAAY,YAAa,OAAO,GAAG,IAAI,cAcnD,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,EAAE,CAkB/G;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,EAAE,MAAM,UAAQ,GAAG,MAAM,GAAG,IAAI,CAoDpH"}
|
package/lib/esm/hierarchy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/hierarchy.ts"],"names":[],"mappings":"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","sourcesContent":["import { isNonSensitiveElement, JSONValue } from './helpers';\nimport { Hierarchy, HierarchyNode } from './typings/autocapture';\n\nconst BLOCKED_ATTRIBUTES = [\n // Already captured elsewhere in the hierarchy object\n 'id',\n 'class',\n\n // non-useful and potentially large attribute\n 'style',\n\n // sensitive as prefilled form data may populate this attribute\n 'value',\n\n // DOM events\n 'onclick',\n 'onchange',\n 'oninput',\n 'onblur',\n 'onsubmit',\n 'onfocus',\n 'onkeydown',\n 'onkeyup',\n 'onkeypress',\n\n // React specific\n 'data-reactid',\n 'data-react-checksum',\n 'data-reactroot',\n];\nconst SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST = ['type'];\n\nconst SVG_TAGS = ['svg', 'path', 'g'];\nconst HIGHLY_SENSITIVE_INPUT_TYPES = ['password', 'hidden'];\nconst MAX_ATTRIBUTE_LENGTH = 128;\nconst MAX_HIERARCHY_LENGTH = 1024;\n\nexport function getElementProperties(element: Element | null): HierarchyNode | null {\n if (element === null) {\n return null;\n }\n\n const tagName = String(element.tagName).toLowerCase();\n const properties: HierarchyNode = {\n tag: tagName,\n };\n\n const siblings = Array.from(element.parentElement?.children ?? []);\n if (siblings.length) {\n properties.index = siblings.indexOf(element);\n properties.indexOfType = siblings.filter((el) => el.tagName === element.tagName).indexOf(element);\n }\n\n const prevSiblingTag = element.previousElementSibling?.tagName?.toLowerCase();\n if (prevSiblingTag) {\n properties.prevSib = String(prevSiblingTag);\n }\n\n const id = element.getAttribute('id');\n if (id) {\n properties.id = String(id);\n }\n\n const classes = Array.from(element.classList);\n if (classes.length) {\n properties.classes = classes;\n }\n\n const attributes: Record<string, string> = {};\n const attributesArray = Array.from(element.attributes);\n const filteredAttributes = attributesArray.filter((attr) => !BLOCKED_ATTRIBUTES.includes(attr.name));\n const isSensitiveElement = !isNonSensitiveElement(element);\n\n // if input is hidden or password or for SVGs, skip attribute collection entirely\n if (!HIGHLY_SENSITIVE_INPUT_TYPES.includes(String(element.getAttribute('type'))) && !SVG_TAGS.includes(tagName)) {\n for (const attr of filteredAttributes) {\n // If sensitive element, only allow certain attributes\n if (isSensitiveElement && !SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST.includes(attr.name)) {\n continue;\n }\n\n // Finally cast attribute value to string and limit attribute value length\n attributes[attr.name] = String(attr.value).substring(0, MAX_ATTRIBUTE_LENGTH);\n }\n }\n\n if (Object.keys(attributes).length) {\n properties.attrs = attributes;\n }\n\n return properties;\n}\n\nexport function getAncestors(targetEl: Element | null): Element[] {\n const ancestors: Element[] = [];\n\n if (!targetEl) {\n return ancestors;\n }\n\n // Add self to the list of ancestors\n ancestors.push(targetEl);\n let current = targetEl.parentElement;\n while (current && current.tagName !== 'HTML') {\n ancestors.push(current);\n current = current.parentElement;\n }\n return ancestors;\n}\n\n// Get the DOM hierarchy of the element, starting from the target element to the root element.\nexport const getHierarchy = (element: Element | null): Hierarchy => {\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n hierarchy = ensureListUnderLimit(\n ancestors.map((el) => getElementProperties(el)),\n MAX_HIERARCHY_LENGTH,\n ) as Hierarchy;\n\n return hierarchy;\n};\n\nexport function ensureListUnderLimit(list: Hierarchy | JSONValue[], bytesLimit: number): Hierarchy | JSONValue[] {\n let numChars = 0;\n for (let i = 0; i < list.length; i++) {\n const node = list[i];\n if (node === null) {\n // simulate 'None' in python\n numChars += 4;\n } else {\n const value = ensureUnicodePythonCompatible(node);\n // Using Array.from(string).length instead of string.length\n // to correctly count Unicode characters (including emojis)\n numChars += value ? Array.from(value).length : 4;\n }\n if (numChars > bytesLimit) {\n return list.slice(0, i);\n }\n }\n return list;\n}\n\n/**\n * Converts a JSON-compatible value to a Python-compatible string representation.\n * This function handles various data types and ensures proper escaping and formatting.\n *\n * @param value - The value to be converted (can be any JSON-compatible type)\n * @param nested - Indicates if the value is nested within another structure (default: false)\n * @returns A string representation of the value compatible with Python, or null if conversion fails\n */\nexport function ensureUnicodePythonCompatible(value: HierarchyNode | JSONValue | null, nested = false): string | null {\n try {\n if (value == null) {\n // Handle null values\n if (nested) {\n return 'None'; // Represent null as 'None' in Python when nested\n }\n return null; // Return null for top-level null values\n } else if (typeof value === 'string') {\n if (nested) {\n // Escape special characters in nested strings\n value = value.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\\t/g, '\\\\t').replace(/\\r/g, '\\\\r');\n\n // Handle quotes in the string\n if (value.includes('\"')) {\n return `'${value}'`; // Wrap in single quotes if it contains double quotes\n }\n if (value.includes(\"'\")) {\n return `\"${value.replace(/'/g, \"\\\\'\")}\"`; // Wrap in double quotes and escape single quotes\n }\n return `'${value}'`; // Default to wrapping in single quotes\n }\n return value; // Return non-nested strings as-is\n } else if (typeof value === 'boolean') {\n // Convert boolean to Python-style capitalized string\n return value ? 'True' : 'False';\n } else if (Array.isArray(value)) {\n // Handle arrays by recursively converting each element\n const elements = value.map((o) => ensureUnicodePythonCompatible(o, true));\n return `[${elements.join(', ')}]`;\n } else if (typeof value === 'object') {\n // Handle objects (dictionaries in Python)\n const entries = Object.entries(value)\n .filter(([key]) => key != null) // Filter out null keys\n .map(\n ([key, val]) =>\n `${String(ensureUnicodePythonCompatible(key, true))}: ${String(ensureUnicodePythonCompatible(val, true))}`,\n );\n let result = `{${entries.join(', ')}}`;\n\n // Handle single quotes in the resulting string\n if (result.includes(\"\\\\'\")) {\n result = result.replace(/'/g, \"'\").replace(/'/g, \"\\\\'\");\n }\n return result;\n }\n // For any other types, return their string representation;\n return value.toString();\n } catch (e) {\n // Return null if any error occurs during the conversion\n return null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/hierarchy.ts"],"names":[],"mappings":"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","sourcesContent":["import { isNonSensitiveElement, type JSONValue } from './helpers';\nimport type { Hierarchy, HierarchyNode } from './typings/autocapture';\n\nconst BLOCKED_ATTRIBUTES = [\n // Already captured elsewhere in the hierarchy object\n 'id',\n 'class',\n\n // non-useful and potentially large attribute\n 'style',\n\n // sensitive as prefilled form data may populate this attribute\n 'value',\n\n // DOM events\n 'onclick',\n 'onchange',\n 'oninput',\n 'onblur',\n 'onsubmit',\n 'onfocus',\n 'onkeydown',\n 'onkeyup',\n 'onkeypress',\n\n // React specific\n 'data-reactid',\n 'data-react-checksum',\n 'data-reactroot',\n];\nconst SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST = ['type'];\n\nconst SVG_TAGS = ['svg', 'path', 'g'];\nconst HIGHLY_SENSITIVE_INPUT_TYPES = ['password', 'hidden'];\nconst MAX_ATTRIBUTE_LENGTH = 128;\nconst MAX_HIERARCHY_LENGTH = 1024;\n\nexport function getElementProperties(element: Element | null): HierarchyNode | null {\n if (element === null) {\n return null;\n }\n\n const tagName = String(element.tagName).toLowerCase();\n const properties: HierarchyNode = {\n tag: tagName,\n };\n\n const siblings = Array.from(element.parentElement?.children ?? []);\n if (siblings.length) {\n properties.index = siblings.indexOf(element);\n properties.indexOfType = siblings.filter((el) => el.tagName === element.tagName).indexOf(element);\n }\n\n const prevSiblingTag = element.previousElementSibling?.tagName?.toLowerCase();\n if (prevSiblingTag) {\n properties.prevSib = String(prevSiblingTag);\n }\n\n const id = element.getAttribute('id');\n if (id) {\n properties.id = String(id);\n }\n\n const classes = Array.from(element.classList);\n if (classes.length) {\n properties.classes = classes;\n }\n\n const attributes: Record<string, string> = {};\n const attributesArray = Array.from(element.attributes);\n const filteredAttributes = attributesArray.filter((attr) => !BLOCKED_ATTRIBUTES.includes(attr.name));\n const isSensitiveElement = !isNonSensitiveElement(element);\n\n // if input is hidden or password or for SVGs, skip attribute collection entirely\n if (!HIGHLY_SENSITIVE_INPUT_TYPES.includes(String(element.getAttribute('type'))) && !SVG_TAGS.includes(tagName)) {\n for (const attr of filteredAttributes) {\n // If sensitive element, only allow certain attributes\n if (isSensitiveElement && !SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST.includes(attr.name)) {\n continue;\n }\n\n // Finally cast attribute value to string and limit attribute value length\n attributes[attr.name] = String(attr.value).substring(0, MAX_ATTRIBUTE_LENGTH);\n }\n }\n\n if (Object.keys(attributes).length) {\n properties.attrs = attributes;\n }\n\n return properties;\n}\n\nexport function getAncestors(targetEl: Element | null): Element[] {\n const ancestors: Element[] = [];\n\n if (!targetEl) {\n return ancestors;\n }\n\n // Add self to the list of ancestors\n ancestors.push(targetEl);\n let current = targetEl.parentElement;\n while (current && current.tagName !== 'HTML') {\n ancestors.push(current);\n current = current.parentElement;\n }\n return ancestors;\n}\n\n// Get the DOM hierarchy of the element, starting from the target element to the root element.\nexport const getHierarchy = (element: Element | null): Hierarchy => {\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n hierarchy = ensureListUnderLimit(\n ancestors.map((el) => getElementProperties(el)),\n MAX_HIERARCHY_LENGTH,\n ) as Hierarchy;\n\n return hierarchy;\n};\n\nexport function ensureListUnderLimit(list: Hierarchy | JSONValue[], bytesLimit: number): Hierarchy | JSONValue[] {\n let numChars = 0;\n for (let i = 0; i < list.length; i++) {\n const node = list[i];\n if (node === null) {\n // simulate 'None' in python\n numChars += 4;\n } else {\n const value = ensureUnicodePythonCompatible(node);\n // Using Array.from(string).length instead of string.length\n // to correctly count Unicode characters (including emojis)\n numChars += value ? Array.from(value).length : 4;\n }\n if (numChars > bytesLimit) {\n return list.slice(0, i);\n }\n }\n return list;\n}\n\n/**\n * Converts a JSON-compatible value to a Python-compatible string representation.\n * This function handles various data types and ensures proper escaping and formatting.\n *\n * @param value - The value to be converted (can be any JSON-compatible type)\n * @param nested - Indicates if the value is nested within another structure (default: false)\n * @returns A string representation of the value compatible with Python, or null if conversion fails\n */\nexport function ensureUnicodePythonCompatible(value: HierarchyNode | JSONValue | null, nested = false): string | null {\n try {\n if (value == null) {\n // Handle null values\n if (nested) {\n return 'None'; // Represent null as 'None' in Python when nested\n }\n return null; // Return null for top-level null values\n } else if (typeof value === 'string') {\n if (nested) {\n // Escape special characters in nested strings\n value = value.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\\t/g, '\\\\t').replace(/\\r/g, '\\\\r');\n\n // Handle quotes in the string\n if (value.includes('\"')) {\n return `'${value}'`; // Wrap in single quotes if it contains double quotes\n }\n if (value.includes(\"'\")) {\n return `\"${value.replace(/'/g, \"\\\\'\")}\"`; // Wrap in double quotes and escape single quotes\n }\n return `'${value}'`; // Default to wrapping in single quotes\n }\n return value; // Return non-nested strings as-is\n } else if (typeof value === 'boolean') {\n // Convert boolean to Python-style capitalized string\n return value ? 'True' : 'False';\n } else if (Array.isArray(value)) {\n // Handle arrays by recursively converting each element\n const elements = value.map((o) => ensureUnicodePythonCompatible(o, true));\n return `[${elements.join(', ')}]`;\n } else if (typeof value === 'object') {\n // Handle objects (dictionaries in Python)\n const entries = Object.entries(value)\n .filter(([key]) => key != null) // Filter out null keys\n .map(\n ([key, val]) =>\n `${String(ensureUnicodePythonCompatible(key, true))}: ${String(ensureUnicodePythonCompatible(val, true))}`,\n );\n let result = `{${entries.join(', ')}}`;\n\n // Handle single quotes in the resulting string\n if (result.includes(\"\\\\'\")) {\n result = result.replace(/'/g, \"'\").replace(/'/g, \"\\\\'\");\n }\n return result;\n }\n // For any other types, return their string representation;\n return value.toString();\n } catch (e) {\n // Return null if any error occurs during the conversion\n return null;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messenger.d.ts","sourceRoot":"","sources":["../../../src/libs/messenger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"messenger.d.ts","sourceRoot":"","sources":["../../../src/libs/messenger.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE3E,MAAM,MAAM,MAAM,GACd,MAAM,GACN,MAAM,GACN,aAAa,GACb,iBAAiB,GACjB,oCAAoC,GACpC,+BAA+B,GAC/B,kBAAkB,GAClB,6BAA6B,GAC7B,sBAAsB,CAAC;AAE3B,UAAU,mCAAmC;IAC3C,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,UAAU,mBAAmB;IAC3B,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iBAAiB,CAAC,EAAE,IAAI,CAAC;CAC1B;AAED,UAAU,4BAA4B;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,sBAAsB;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB,aAAa,EAAE,IAAI,GAAG,SAAS,CAAC;IAChC,iBAAiB,EAAE,IAAI,GAAG,SAAS,CAAC;IACpC,oCAAoC,EAAE,mCAAmC,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7F,+BAA+B,EAAE,IAAI,GAAG,SAAS,CAAC;IAClD,kBAAkB,EAAE,mBAAmB,CAAC;IACxC,6BAA6B,EAAE,4BAA4B,CAAC;IAC5D,sBAAsB,EAAE,sBAAsB,CAAC;CAChD,CAAC;AAEF,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM;IACvC,MAAM,EAAE,CAAC,CAAC;IACV,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACtB;AAeD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,QAAQ,SAAoB;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE;QAChB,CAAC,EAAE,EAAE,MAAM,GAAG;YACZ,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;YAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;SAC7B,CAAC;KACH,CAAM;gBAEK,EAAE,MAAyB,EAAE,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAInE,OAAO,CAAC,MAAM;IAMP,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO;;KAAsB,GAAG,OAAO,CAAC,GAAG,CAAC;IA6B1G,OAAO,CAAC,cAAc;IAUtB,KAAK,CAAC,EACJ,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,GAAE;QACD,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,mCAAmC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;QAC/G,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B;IAuEN,OAAO,CAAC,QAAQ,CAEd;IAEF,OAAO,CAAC,OAAO,CAMb;CACH"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* istanbul ignore file */
|
|
2
2
|
/* eslint-disable no-restricted-globals */
|
|
3
|
+
import { extractDataFromDataSource } from '../pageActions/actions';
|
|
3
4
|
import { AMPLITUDE_ORIGIN, AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL, AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS, } from '../constants';
|
|
4
5
|
import { asyncLoadScript, generateUniqueId, getEventTagProps } from '../helpers';
|
|
5
6
|
// TODO: use MessageChannel instead of window.postMessage
|
|
@@ -116,6 +117,7 @@ var WindowMessenger = /** @class */ (function () {
|
|
|
116
117
|
messenger: _this,
|
|
117
118
|
cssSelectorAllowlist: cssSelectorAllowlist,
|
|
118
119
|
actionClickAllowlist: actionClickAllowlist,
|
|
120
|
+
extractDataFromDataSource: extractDataFromDataSource,
|
|
119
121
|
});
|
|
120
122
|
_this.notify({ action: 'selector-loaded' });
|
|
121
123
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messenger.js","sourceRoot":"","sources":["../../../src/libs/messenger.ts"],"names":[],"mappings":"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","sourcesContent":["/* istanbul ignore file */\n/* eslint-disable no-restricted-globals */\nimport {\n AMPLITUDE_ORIGIN,\n AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL,\n AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n} from '../constants';\nimport { asyncLoadScript, generateUniqueId, getEventTagProps } from '../helpers';\nimport { ILogger, Messenger, ActionType } from '@amplitude/analytics-core';\n\nexport type Action =\n | 'ping'\n | 'pong'\n | 'page-loaded'\n | 'selector-loaded'\n | 'initialize-visual-tagging-selector'\n | 'close-visual-tagging-selector'\n | 'element-selected'\n | 'track-selector-mode-changed'\n | 'track-selector-moved';\n\ninterface InitializeVisualTaggingSelectorData {\n actionType: ActionType;\n}\n\ninterface ElementSelectedData {\n '[Amplitude] Element Hierarchy'?: string;\n '[Amplitude] Element Tag'?: string;\n '[Amplitude] Element Text'?: string;\n '[Amplitude] Page URL'?: string;\n elementScreenshot?: Blob;\n}\n\ninterface TrackSelectorModeChangedData {\n newMode: string;\n pageUrl?: string;\n}\n\ninterface TrackSelectorMovedData {\n newEditorLocation: string;\n pageUrl?: string;\n}\n\nexport type ActionData = {\n ping: null | undefined;\n pong: null | undefined;\n 'page-loaded': null | undefined;\n 'selector-loaded': null | undefined;\n 'initialize-visual-tagging-selector': InitializeVisualTaggingSelectorData | null | undefined;\n 'close-visual-tagging-selector': null | undefined;\n 'element-selected': ElementSelectedData;\n 'track-selector-mode-changed': TrackSelectorModeChangedData;\n 'track-selector-moved': TrackSelectorMovedData;\n};\n\nexport interface Message<A extends Action> {\n action: A;\n data?: ActionData[A];\n}\n\ntype MessageRequest = {\n id: string;\n action: string;\n args: Record<string, any>;\n};\n\ntype MessageResponse = {\n id: string;\n action: string;\n responseData: any;\n};\n\n// TODO: use MessageChannel instead of window.postMessage\nexport class WindowMessenger implements Messenger {\n endpoint = AMPLITUDE_ORIGIN;\n logger?: ILogger;\n requestCallbacks: {\n [id: string]: {\n resolve: (data: any) => void;\n reject: (data: any) => void;\n };\n } = {};\n\n constructor({ origin = AMPLITUDE_ORIGIN }: { origin?: string } = {}) {\n this.endpoint = origin;\n }\n\n private notify(message: Message<Action> | MessageRequest) {\n this.logger?.debug?.('Message sent: ', JSON.stringify(message));\n (window.opener as WindowProxy)?.postMessage?.(message, this.endpoint);\n }\n\n // Send an async request to the parent window\n public sendRequest(action: string, args: Record<string, any>, options = { timeout: 15_000 }): Promise<any> {\n // Create Request ID\n const id = generateUniqueId();\n const request = {\n id,\n action,\n args,\n };\n\n // Create a Promise that will be resolved when the response is received\n const promise = new Promise((resolve, reject) => {\n this.requestCallbacks[id] = { resolve, reject };\n\n // Send the request\n this.notify(request);\n\n // Handle request timeouts\n if (options?.timeout > 0) {\n setTimeout(() => {\n reject(new Error(`${action} timed out (id: ${id})`));\n delete this.requestCallbacks[id];\n }, options.timeout);\n }\n });\n\n return promise;\n }\n\n // Handle messages from the parent window\n private handleResponse(response: MessageResponse) {\n if (!this.requestCallbacks[response.id]) {\n this.logger?.warn(`No callback found for request id: ${response.id}`);\n return;\n }\n\n this.requestCallbacks[response.id].resolve(response.responseData);\n delete this.requestCallbacks[response.id];\n }\n\n setup({\n logger,\n endpoint,\n isElementSelectable,\n cssSelectorAllowlist,\n actionClickAllowlist,\n }: {\n logger?: ILogger;\n endpoint?: string;\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\n cssSelectorAllowlist?: string[];\n actionClickAllowlist?: string[];\n } = {}) {\n this.logger = logger;\n // If endpoint is customized, don't override it.\n if (endpoint && this.endpoint === AMPLITUDE_ORIGIN) {\n this.endpoint = endpoint;\n }\n let amplitudeVisualTaggingSelectorInstance: any = null;\n\n // Attach Event Listener to listen for messages from the parent window\n window.addEventListener('message', (event) => {\n this.logger?.debug?.('Message received: ', JSON.stringify(event));\n\n // Only accept messages from the specified origin\n if (this.endpoint !== event.origin) {\n return;\n }\n\n const eventData = event?.data as Message<Action> | MessageResponse;\n const action = eventData?.action;\n\n // Ignore messages without action\n if (!action) {\n return;\n }\n\n // If id exists, handle responses to previous requests\n if ('id' in eventData) {\n this.logger?.debug?.('Received Response to previous request: ', JSON.stringify(event));\n this.handleResponse(eventData);\n\n // If action exists, handle the action using existing handlers\n } else {\n if (action === 'ping') {\n this.notify({ action: 'pong' });\n } else if (action === 'initialize-visual-tagging-selector') {\n const actionData = eventData?.data as InitializeVisualTaggingSelectorData;\n asyncLoadScript(AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL)\n .then(() => {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance = (window as any)?.amplitudeVisualTaggingSelector?.({\n getEventTagProps,\n isElementSelectable: (element: Element) => {\n if (isElementSelectable) {\n return isElementSelectable(actionData?.actionType || 'click', element);\n }\n return true;\n },\n onTrack: this.onTrack,\n onSelect: this.onSelect,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n messenger: this,\n cssSelectorAllowlist,\n actionClickAllowlist,\n });\n this.notify({ action: 'selector-loaded' });\n })\n .catch(() => {\n this.logger?.warn('Failed to initialize visual tagging selector');\n });\n } else if (action === 'close-visual-tagging-selector') {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance?.close?.();\n }\n }\n });\n\n // Notify the parent window that the page has loaded\n this.notify({ action: 'page-loaded' });\n }\n\n private onSelect = (data: ElementSelectedData) => {\n this.notify({ action: 'element-selected', data });\n };\n\n private onTrack = (type: string, properties: { [key: string]: string | null }) => {\n if (type === 'selector-mode-changed') {\n this.notify({ action: 'track-selector-mode-changed', data: properties });\n } else if (type === 'selector-moved') {\n this.notify({ action: 'track-selector-moved', data: properties });\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"messenger.js","sourceRoot":"","sources":["../../../src/libs/messenger.ts"],"names":[],"mappings":"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","sourcesContent":["/* istanbul ignore file */\n/* eslint-disable no-restricted-globals */\nimport { extractDataFromDataSource } from '../pageActions/actions';\nimport {\n AMPLITUDE_ORIGIN,\n AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL,\n AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n} from '../constants';\nimport { asyncLoadScript, generateUniqueId, getEventTagProps } from '../helpers';\nimport { ILogger, Messenger, ActionType } from '@amplitude/analytics-core';\n\nexport type Action =\n | 'ping'\n | 'pong'\n | 'page-loaded'\n | 'selector-loaded'\n | 'initialize-visual-tagging-selector'\n | 'close-visual-tagging-selector'\n | 'element-selected'\n | 'track-selector-mode-changed'\n | 'track-selector-moved';\n\ninterface InitializeVisualTaggingSelectorData {\n actionType: ActionType;\n}\n\ninterface ElementSelectedData {\n '[Amplitude] Element Hierarchy'?: string;\n '[Amplitude] Element Tag'?: string;\n '[Amplitude] Element Text'?: string;\n '[Amplitude] Page URL'?: string;\n elementScreenshot?: Blob;\n}\n\ninterface TrackSelectorModeChangedData {\n newMode: string;\n pageUrl?: string;\n}\n\ninterface TrackSelectorMovedData {\n newEditorLocation: string;\n pageUrl?: string;\n}\n\nexport type ActionData = {\n ping: null | undefined;\n pong: null | undefined;\n 'page-loaded': null | undefined;\n 'selector-loaded': null | undefined;\n 'initialize-visual-tagging-selector': InitializeVisualTaggingSelectorData | null | undefined;\n 'close-visual-tagging-selector': null | undefined;\n 'element-selected': ElementSelectedData;\n 'track-selector-mode-changed': TrackSelectorModeChangedData;\n 'track-selector-moved': TrackSelectorMovedData;\n};\n\nexport interface Message<A extends Action> {\n action: A;\n data?: ActionData[A];\n}\n\ntype MessageRequest = {\n id: string;\n action: string;\n args: Record<string, any>;\n};\n\ntype MessageResponse = {\n id: string;\n action: string;\n responseData: any;\n};\n\n// TODO: use MessageChannel instead of window.postMessage\nexport class WindowMessenger implements Messenger {\n endpoint = AMPLITUDE_ORIGIN;\n logger?: ILogger;\n requestCallbacks: {\n [id: string]: {\n resolve: (data: any) => void;\n reject: (data: any) => void;\n };\n } = {};\n\n constructor({ origin = AMPLITUDE_ORIGIN }: { origin?: string } = {}) {\n this.endpoint = origin;\n }\n\n private notify(message: Message<Action> | MessageRequest) {\n this.logger?.debug?.('Message sent: ', JSON.stringify(message));\n (window.opener as WindowProxy)?.postMessage?.(message, this.endpoint);\n }\n\n // Send an async request to the parent window\n public sendRequest(action: string, args: Record<string, any>, options = { timeout: 15_000 }): Promise<any> {\n // Create Request ID\n const id = generateUniqueId();\n const request = {\n id,\n action,\n args,\n };\n\n // Create a Promise that will be resolved when the response is received\n const promise = new Promise((resolve, reject) => {\n this.requestCallbacks[id] = { resolve, reject };\n\n // Send the request\n this.notify(request);\n\n // Handle request timeouts\n if (options?.timeout > 0) {\n setTimeout(() => {\n reject(new Error(`${action} timed out (id: ${id})`));\n delete this.requestCallbacks[id];\n }, options.timeout);\n }\n });\n\n return promise;\n }\n\n // Handle messages from the parent window\n private handleResponse(response: MessageResponse) {\n if (!this.requestCallbacks[response.id]) {\n this.logger?.warn(`No callback found for request id: ${response.id}`);\n return;\n }\n\n this.requestCallbacks[response.id].resolve(response.responseData);\n delete this.requestCallbacks[response.id];\n }\n\n setup({\n logger,\n endpoint,\n isElementSelectable,\n cssSelectorAllowlist,\n actionClickAllowlist,\n }: {\n logger?: ILogger;\n endpoint?: string;\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\n cssSelectorAllowlist?: string[];\n actionClickAllowlist?: string[];\n } = {}) {\n this.logger = logger;\n // If endpoint is customized, don't override it.\n if (endpoint && this.endpoint === AMPLITUDE_ORIGIN) {\n this.endpoint = endpoint;\n }\n let amplitudeVisualTaggingSelectorInstance: any = null;\n\n // Attach Event Listener to listen for messages from the parent window\n window.addEventListener('message', (event) => {\n this.logger?.debug?.('Message received: ', JSON.stringify(event));\n\n // Only accept messages from the specified origin\n if (this.endpoint !== event.origin) {\n return;\n }\n\n const eventData = event?.data as Message<Action> | MessageResponse;\n const action = eventData?.action;\n\n // Ignore messages without action\n if (!action) {\n return;\n }\n\n // If id exists, handle responses to previous requests\n if ('id' in eventData) {\n this.logger?.debug?.('Received Response to previous request: ', JSON.stringify(event));\n this.handleResponse(eventData);\n\n // If action exists, handle the action using existing handlers\n } else {\n if (action === 'ping') {\n this.notify({ action: 'pong' });\n } else if (action === 'initialize-visual-tagging-selector') {\n const actionData = eventData?.data as InitializeVisualTaggingSelectorData;\n asyncLoadScript(AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL)\n .then(() => {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance = (window as any)?.amplitudeVisualTaggingSelector?.({\n getEventTagProps,\n isElementSelectable: (element: Element) => {\n if (isElementSelectable) {\n return isElementSelectable(actionData?.actionType || 'click', element);\n }\n return true;\n },\n onTrack: this.onTrack,\n onSelect: this.onSelect,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n messenger: this,\n cssSelectorAllowlist,\n actionClickAllowlist,\n extractDataFromDataSource,\n });\n this.notify({ action: 'selector-loaded' });\n })\n .catch(() => {\n this.logger?.warn('Failed to initialize visual tagging selector');\n });\n } else if (action === 'close-visual-tagging-selector') {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance?.close?.();\n }\n }\n });\n\n // Notify the parent window that the page has loaded\n this.notify({ action: 'page-loaded' });\n }\n\n private onSelect = (data: ElementSelectedData) => {\n this.notify({ action: 'element-selected', data });\n };\n\n private onTrack = (type: string, properties: { [key: string]: string | null }) => {\n if (type === 'selector-mode-changed') {\n this.notify({ action: 'track-selector-mode-changed', data: properties });\n } else if (type === 'selector-moved') {\n this.notify({ action: 'track-selector-moved', data: properties });\n }\n };\n}\n"]}
|
|
@@ -8,7 +8,7 @@ export var matchEventToFilter = function (event, filter) {
|
|
|
8
8
|
try {
|
|
9
9
|
if (filter.subprop_key === '[Amplitude] Element Text') {
|
|
10
10
|
// TODO: add support for the other operators
|
|
11
|
-
return (filter.subprop_op === '
|
|
11
|
+
return (filter.subprop_op === 'is' &&
|
|
12
12
|
filter.subprop_value.includes(event.targetElementProperties['[Amplitude] Element Text']));
|
|
13
13
|
}
|
|
14
14
|
else if (filter.subprop_key === '[Amplitude] Element Hierarchy') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matchEventToFilter.js","sourceRoot":"","sources":["../../../src/pageActions/matchEventToFilter.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAAC,KAAsD,EAAE,MAAc;IACvG,IAAI;QACF,IAAI,MAAM,CAAC,WAAW,KAAK,0BAA0B,EAAE;YACrD,4CAA4C;YAC5C,OAAO,CACL,MAAM,CAAC,UAAU,KAAK,
|
|
1
|
+
{"version":3,"file":"matchEventToFilter.js","sourceRoot":"","sources":["../../../src/pageActions/matchEventToFilter.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAAC,KAAsD,EAAE,MAAc;IACvG,IAAI;QACF,IAAI,MAAM,CAAC,WAAW,KAAK,0BAA0B,EAAE;YACrD,4CAA4C;YAC5C,OAAO,CACL,MAAM,CAAC,UAAU,KAAK,IAAI;gBAC1B,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,0BAA0B,CAAW,CAAC,CACnG,CAAC;SACH;aAAM,IAAI,MAAM,CAAC,WAAW,KAAK,+BAA+B,EAAE;YACjE,iHAAiH;YACjH,OAAO,CACL,MAAM,CAAC,UAAU,KAAK,qBAAqB;gBAC3C,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CACxE,CAAC;SACH;KACF;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;KACd;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC","sourcesContent":["import type { Filter } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport { ElementBasedTimestampedEvent, ElementBasedEvent } from 'src/helpers';\n\n/**\n * Matches an event to a single filter\n * @param event - The event to match\n * @param filter - The filter to match against\n * @returns boolean indicating if the event matches the filter\n */\nexport const matchEventToFilter = (event: ElementBasedTimestampedEvent<ElementBasedEvent>, filter: Filter) => {\n try {\n if (filter.subprop_key === '[Amplitude] Element Text') {\n // TODO: add support for the other operators\n return (\n filter.subprop_op === 'is' &&\n filter.subprop_value.includes(event.targetElementProperties['[Amplitude] Element Text'] as string)\n );\n } else if (filter.subprop_key === '[Amplitude] Element Hierarchy') {\n // Check if the element ancestory matches the CSS selector, always check this last since it is the most expensive\n return (\n filter.subprop_op === 'autotrack css match' &&\n !!event.closestTrackedAncestor.closest(filter.subprop_value.toString())\n );\n }\n } catch (error) {\n console.error('Error matching event to filter', error);\n return false;\n }\n return false;\n};\n"]}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { Trigger } from '@amplitude/analytics-core/lib/esm/types/element-interactions';
|
|
2
|
-
import type { LabeledEvent } from '@amplitude/analytics-core/lib/esm/types/element-interactions';
|
|
3
|
-
import { ElementBasedTimestampedEvent, ElementBasedEvent } from 'src/helpers';
|
|
4
|
-
export declare const groupLabeledEventIdsByEventType: (labeledEvents
|
|
5
|
-
click: Set<string>;
|
|
6
|
-
change: Set<string>;
|
|
7
|
-
};
|
|
1
|
+
import type { Trigger } from '@amplitude/analytics-core/lib/esm/types/element-interactions';
|
|
2
|
+
import type { ElementInteractionsOptions, LabeledEvent } from '@amplitude/analytics-core/lib/esm/types/element-interactions';
|
|
3
|
+
import type { ElementBasedTimestampedEvent, ElementBasedEvent } from 'src/helpers';
|
|
4
|
+
export declare const groupLabeledEventIdsByEventType: (labeledEvents: LabeledEvent[] | null | undefined) => Record<string, Set<string>>;
|
|
8
5
|
export declare const createLabeledEventToTriggerMap: (triggers: Trigger[]) => Map<string, Trigger[]>;
|
|
9
6
|
/**
|
|
10
7
|
* Matches an event to labeled events based on the event's properties.
|
|
@@ -17,4 +14,13 @@ export declare const createLabeledEventToTriggerMap: (triggers: Trigger[]) => Ma
|
|
|
17
14
|
*/
|
|
18
15
|
export declare const matchEventToLabeledEvents: (event: ElementBasedTimestampedEvent<ElementBasedEvent>, labeledEvents: LabeledEvent[]) => LabeledEvent[];
|
|
19
16
|
export declare const matchLabeledEventsToTriggers: (labeledEvents: LabeledEvent[], leToTriggerMap: Map<string, Trigger[]>) => Trigger[];
|
|
17
|
+
export declare class TriggerEvaluator {
|
|
18
|
+
private groupedLabeledEvents;
|
|
19
|
+
private labeledEventToTriggerMap;
|
|
20
|
+
private options;
|
|
21
|
+
constructor(groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>, labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>, options: ElementInteractionsOptions);
|
|
22
|
+
evaluate(event: ElementBasedTimestampedEvent<ElementBasedEvent>): ElementBasedTimestampedEvent<ElementBasedEvent>;
|
|
23
|
+
update(groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>, labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>, options: ElementInteractionsOptions): void;
|
|
24
|
+
}
|
|
25
|
+
export declare const createTriggerEvaluator: (groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>, labeledEventToTriggerMap: Map<string, Trigger[]>, options: ElementInteractionsOptions) => TriggerEvaluator;
|
|
20
26
|
//# sourceMappingURL=triggers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../../src/pageActions/triggers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,8DAA8D,CAAC;
|
|
1
|
+
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../../src/pageActions/triggers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8DAA8D,CAAC;AAE5F,OAAO,KAAK,EACV,0BAA0B,EAC1B,YAAY,EACb,MAAM,8DAA8D,CAAC;AACtE,OAAO,KAAK,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUnF,eAAO,MAAM,+BAA+B,kBAAmB,YAAY,EAAE,GAAG,IAAI,GAAG,SAAS,gCA2B/F,CAAC;AAGF,eAAO,MAAM,8BAA8B,aAAc,OAAO,EAAE,2BAkBjE,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,UAC7B,6BAA6B,iBAAiB,CAAC,iBACvC,YAAY,EAAE,mBAU9B,CAAC;AAEF,eAAO,MAAM,4BAA4B,kBAAmB,YAAY,EAAE,kBAAkB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC,cAWjH,CAAC;AAEF,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,wBAAwB;IAChC,OAAO,CAAC,OAAO;gBAFP,oBAAoB,EAAE,UAAU,CAAC,OAAO,+BAA+B,CAAC,EACxE,wBAAwB,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,EAC3E,OAAO,EAAE,0BAA0B;IAG7C,QAAQ,CAAC,KAAK,EAAE,4BAA4B,CAAC,iBAAiB,CAAC;IAqB/D,MAAM,CACJ,oBAAoB,EAAE,UAAU,CAAC,OAAO,+BAA+B,CAAC,EACxE,wBAAwB,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,EAC3E,OAAO,EAAE,0BAA0B;CAMtC;AAED,eAAO,MAAM,sBAAsB,yBACX,WAAW,sCAAsC,CAAC,6DAE/D,0BAA0B,qBAGpC,CAAC"}
|
|
@@ -1,31 +1,41 @@
|
|
|
1
1
|
import { __values } from "tslib";
|
|
2
2
|
import { matchEventToFilter } from './matchEventToFilter';
|
|
3
|
+
import { executeActions } from './actions';
|
|
4
|
+
var eventTypeToBrowserEventMap = {
|
|
5
|
+
'[Amplitude] Element Clicked': 'click',
|
|
6
|
+
'[Amplitude] Element Changed': 'change',
|
|
7
|
+
};
|
|
3
8
|
// groups labeled events by event type
|
|
4
9
|
// skips any labeled events with malformed definitions or unexpected event_type
|
|
5
10
|
export var groupLabeledEventIdsByEventType = function (labeledEvents) {
|
|
6
11
|
var e_1, _a, e_2, _b;
|
|
7
|
-
|
|
8
|
-
var groupedLabeledEvents = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
};
|
|
12
|
+
// Initialize all event types with empty sets
|
|
13
|
+
var groupedLabeledEvents = Object.values(eventTypeToBrowserEventMap).reduce(function (acc, browserEvent) {
|
|
14
|
+
acc[browserEvent] = new Set();
|
|
15
|
+
return acc;
|
|
16
|
+
}, {});
|
|
17
|
+
// If there are no labeled events, return the initialized groupedLabeledEvents
|
|
12
18
|
if (!labeledEvents) {
|
|
13
19
|
return groupedLabeledEvents;
|
|
14
20
|
}
|
|
15
21
|
try {
|
|
22
|
+
// Group labeled events by event type
|
|
16
23
|
for (var labeledEvents_1 = __values(labeledEvents), labeledEvents_1_1 = labeledEvents_1.next(); !labeledEvents_1_1.done; labeledEvents_1_1 = labeledEvents_1.next()) {
|
|
17
24
|
var le = labeledEvents_1_1.value;
|
|
18
25
|
try {
|
|
19
26
|
try {
|
|
20
|
-
for (var
|
|
21
|
-
var def =
|
|
22
|
-
|
|
27
|
+
for (var _c = (e_2 = void 0, __values(le.definition)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
28
|
+
var def = _d.value;
|
|
29
|
+
var browserEvent = eventTypeToBrowserEventMap[def.event_type];
|
|
30
|
+
if (browserEvent) {
|
|
31
|
+
groupedLabeledEvents[browserEvent].add(le.id);
|
|
32
|
+
}
|
|
23
33
|
}
|
|
24
34
|
}
|
|
25
35
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
26
36
|
finally {
|
|
27
37
|
try {
|
|
28
|
-
if (
|
|
38
|
+
if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
|
|
29
39
|
}
|
|
30
40
|
finally { if (e_2) throw e_2.error; }
|
|
31
41
|
}
|
|
@@ -98,19 +108,32 @@ export var createLabeledEventToTriggerMap = function (triggers) {
|
|
|
98
108
|
export var matchEventToLabeledEvents = function (event, labeledEvents) {
|
|
99
109
|
return labeledEvents.filter(function (le) {
|
|
100
110
|
return le.definition.some(function (def) {
|
|
101
|
-
return def.event_type === event.type &&
|
|
111
|
+
return (eventTypeToBrowserEventMap[def.event_type] === event.type &&
|
|
112
|
+
def.filters.every(function (filter) { return matchEventToFilter(event, filter); }));
|
|
102
113
|
});
|
|
103
114
|
});
|
|
104
115
|
};
|
|
105
116
|
export var matchLabeledEventsToTriggers = function (labeledEvents, leToTriggerMap) {
|
|
106
|
-
var e_5, _a;
|
|
117
|
+
var e_5, _a, e_6, _b;
|
|
107
118
|
var matchingTriggers = new Set();
|
|
108
119
|
try {
|
|
109
120
|
for (var labeledEvents_2 = __values(labeledEvents), labeledEvents_2_1 = labeledEvents_2.next(); !labeledEvents_2_1.done; labeledEvents_2_1 = labeledEvents_2.next()) {
|
|
110
121
|
var le = labeledEvents_2_1.value;
|
|
111
122
|
var triggers = leToTriggerMap.get(le.id);
|
|
112
123
|
if (triggers) {
|
|
113
|
-
|
|
124
|
+
try {
|
|
125
|
+
for (var triggers_2 = (e_6 = void 0, __values(triggers)), triggers_2_1 = triggers_2.next(); !triggers_2_1.done; triggers_2_1 = triggers_2.next()) {
|
|
126
|
+
var trigger = triggers_2_1.value;
|
|
127
|
+
matchingTriggers.add(trigger);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
131
|
+
finally {
|
|
132
|
+
try {
|
|
133
|
+
if (triggers_2_1 && !triggers_2_1.done && (_b = triggers_2.return)) _b.call(triggers_2);
|
|
134
|
+
}
|
|
135
|
+
finally { if (e_6) throw e_6.error; }
|
|
136
|
+
}
|
|
114
137
|
}
|
|
115
138
|
}
|
|
116
139
|
}
|
|
@@ -123,4 +146,47 @@ export var matchLabeledEventsToTriggers = function (labeledEvents, leToTriggerMa
|
|
|
123
146
|
}
|
|
124
147
|
return Array.from(matchingTriggers);
|
|
125
148
|
};
|
|
149
|
+
var TriggerEvaluator = /** @class */ (function () {
|
|
150
|
+
function TriggerEvaluator(groupedLabeledEvents, labeledEventToTriggerMap, options) {
|
|
151
|
+
this.groupedLabeledEvents = groupedLabeledEvents;
|
|
152
|
+
this.labeledEventToTriggerMap = labeledEventToTriggerMap;
|
|
153
|
+
this.options = options;
|
|
154
|
+
}
|
|
155
|
+
TriggerEvaluator.prototype.evaluate = function (event) {
|
|
156
|
+
var e_7, _a;
|
|
157
|
+
// If there is no pageActions, return the event as is
|
|
158
|
+
var pageActions = this.options.pageActions;
|
|
159
|
+
if (!pageActions) {
|
|
160
|
+
return event;
|
|
161
|
+
}
|
|
162
|
+
// Find matching labeled events
|
|
163
|
+
var matchingLabeledEvents = matchEventToLabeledEvents(event, Array.from(this.groupedLabeledEvents[event.type]).map(function (id) { return pageActions.labeledEvents[id]; }));
|
|
164
|
+
// Find matching conditions
|
|
165
|
+
var matchingTriggers = matchLabeledEventsToTriggers(matchingLabeledEvents, this.labeledEventToTriggerMap);
|
|
166
|
+
try {
|
|
167
|
+
for (var matchingTriggers_1 = __values(matchingTriggers), matchingTriggers_1_1 = matchingTriggers_1.next(); !matchingTriggers_1_1.done; matchingTriggers_1_1 = matchingTriggers_1.next()) {
|
|
168
|
+
var trigger = matchingTriggers_1_1.value;
|
|
169
|
+
executeActions(trigger.actions, event);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
173
|
+
finally {
|
|
174
|
+
try {
|
|
175
|
+
if (matchingTriggers_1_1 && !matchingTriggers_1_1.done && (_a = matchingTriggers_1.return)) _a.call(matchingTriggers_1);
|
|
176
|
+
}
|
|
177
|
+
finally { if (e_7) throw e_7.error; }
|
|
178
|
+
}
|
|
179
|
+
return event;
|
|
180
|
+
};
|
|
181
|
+
TriggerEvaluator.prototype.update = function (groupedLabeledEvents, labeledEventToTriggerMap, options) {
|
|
182
|
+
this.groupedLabeledEvents = groupedLabeledEvents;
|
|
183
|
+
this.labeledEventToTriggerMap = labeledEventToTriggerMap;
|
|
184
|
+
this.options = options;
|
|
185
|
+
};
|
|
186
|
+
return TriggerEvaluator;
|
|
187
|
+
}());
|
|
188
|
+
export { TriggerEvaluator };
|
|
189
|
+
export var createTriggerEvaluator = function (groupedLabeledEvents, labeledEventToTriggerMap, options) {
|
|
190
|
+
return new TriggerEvaluator(groupedLabeledEvents, labeledEventToTriggerMap, options);
|
|
191
|
+
};
|
|
126
192
|
//# sourceMappingURL=triggers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../../src/pageActions/triggers.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../../src/pageActions/triggers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Trigger } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\n// Return which labeled events, if any, the element matches\nimport type {\n ElementInteractionsOptions,\n LabeledEvent,\n} from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport type { ElementBasedTimestampedEvent, ElementBasedEvent } from 'src/helpers';\nimport { matchEventToFilter } from './matchEventToFilter';\nimport { executeActions } from './actions';\n\nconst eventTypeToBrowserEventMap = {\n '[Amplitude] Element Clicked': 'click',\n '[Amplitude] Element Changed': 'change',\n} as const;\n// groups labeled events by event type\n// skips any labeled events with malformed definitions or unexpected event_type\nexport const groupLabeledEventIdsByEventType = (labeledEvents: LabeledEvent[] | null | undefined) => {\n // Initialize all event types with empty sets\n const groupedLabeledEvents = Object.values(eventTypeToBrowserEventMap).reduce((acc, browserEvent) => {\n acc[browserEvent] = new Set<string>();\n return acc;\n }, {} as Record<string, Set<string>>);\n\n // If there are no labeled events, return the initialized groupedLabeledEvents\n if (!labeledEvents) {\n return groupedLabeledEvents;\n }\n\n // Group labeled events by event type\n for (const le of labeledEvents) {\n try {\n for (const def of le.definition) {\n const browserEvent = eventTypeToBrowserEventMap[def.event_type];\n if (browserEvent) {\n groupedLabeledEvents[browserEvent].add(le.id);\n }\n }\n } catch (e) {\n // Skip this labeled event if there is an error\n console.warn('Skipping Labeled Event due to malformed definition', le?.id, e);\n }\n }\n return groupedLabeledEvents;\n};\n\n// TODO: add tests\nexport const createLabeledEventToTriggerMap = (triggers: Trigger[]) => {\n const labeledEventToTriggerMap = new Map<string, Trigger[]>();\n for (const trigger of triggers) {\n for (const condition of trigger.conditions) {\n if (condition.type === 'LABELED_EVENT') {\n const eventId = condition.match.eventId;\n // Get existing triggers for this event ID or initialize empty array\n let existingTriggers = labeledEventToTriggerMap.get(eventId);\n if (!existingTriggers) {\n existingTriggers = [];\n labeledEventToTriggerMap.set(eventId, existingTriggers);\n }\n // Add current trigger to the list of triggers for this event ID\n existingTriggers.push(trigger);\n }\n }\n }\n return labeledEventToTriggerMap;\n};\n\n/**\n * Matches an event to labeled events based on the event's properties.\n * The logic matches exactly what is supported by the query backend.\n * TODO: later pre-filter the labeled events based on URL first\n *\n * @param event - The event to match against labeled events\n * @param labeledEvents - Array of labeled events to match against\n * @returns Array of matching labeled events\n */\nexport const matchEventToLabeledEvents = (\n event: ElementBasedTimestampedEvent<ElementBasedEvent>,\n labeledEvents: LabeledEvent[],\n) => {\n return labeledEvents.filter((le) => {\n return le.definition.some((def) => {\n return (\n eventTypeToBrowserEventMap[def.event_type] === event.type &&\n def.filters.every((filter) => matchEventToFilter(event, filter))\n );\n });\n });\n};\n\nexport const matchLabeledEventsToTriggers = (labeledEvents: LabeledEvent[], leToTriggerMap: Map<string, Trigger[]>) => {\n const matchingTriggers = new Set<Trigger>();\n for (const le of labeledEvents) {\n const triggers = leToTriggerMap.get(le.id);\n if (triggers) {\n for (const trigger of triggers) {\n matchingTriggers.add(trigger);\n }\n }\n }\n return Array.from(matchingTriggers);\n};\n\nexport class TriggerEvaluator {\n constructor(\n private groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>,\n private labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>,\n private options: ElementInteractionsOptions,\n ) {}\n\n evaluate(event: ElementBasedTimestampedEvent<ElementBasedEvent>) {\n // If there is no pageActions, return the event as is\n const { pageActions } = this.options;\n if (!pageActions) {\n return event;\n }\n\n // Find matching labeled events\n const matchingLabeledEvents = matchEventToLabeledEvents(\n event,\n Array.from(this.groupedLabeledEvents[event.type]).map((id) => pageActions.labeledEvents[id]),\n );\n // Find matching conditions\n const matchingTriggers = matchLabeledEventsToTriggers(matchingLabeledEvents, this.labeledEventToTriggerMap);\n for (const trigger of matchingTriggers) {\n executeActions(trigger.actions, event);\n }\n\n return event;\n }\n\n update(\n groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>,\n labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>,\n options: ElementInteractionsOptions,\n ) {\n this.groupedLabeledEvents = groupedLabeledEvents;\n this.labeledEventToTriggerMap = labeledEventToTriggerMap;\n this.options = options;\n }\n}\n\nexport const createTriggerEvaluator = (\n groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>,\n labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>,\n options: ElementInteractionsOptions,\n) => {\n return new TriggerEvaluator(groupedLabeledEvents, labeledEventToTriggerMap, options);\n};\n"]}
|
package/lib/esm/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "1.
|
|
1
|
+
export declare const VERSION = "1.8.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/lib/esm/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export var VERSION = '1.
|
|
1
|
+
export var VERSION = '1.8.0';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/lib/esm/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,OAAO,GAAG,OAAO,CAAC","sourcesContent":["export const VERSION = '1.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,OAAO,GAAG,OAAO,CAAC","sourcesContent":["export const VERSION = '1.8.0';\n"]}
|