posthog-js 1.121.3 → 1.121.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-js",
3
- "version": "1.121.3",
3
+ "version": "1.121.4",
4
4
  "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.",
5
5
  "repository": "https://github.com/PostHog/posthog-js",
6
6
  "author": "hey@posthog.com",
@@ -1 +1 @@
1
- {"version":3,"file":"autocapture-utils.js","sourceRoot":"","sources":["../../src/autocapture-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AutocaptureConfig, Properties } from './types'\nimport { _each, _entries, _includes, _trim } from './utils'\n\nimport { _isArray, _isNullish, _isString, _isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\nimport { window } from './utils/globals'\n\nexport function splitClassString(s: string): string[] {\n return s ? _trim(s).split(/\\s+/) : []\n}\n\n/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n *\n * Because this is a string it can contain unexpected characters\n * So, this method safely splits the className and returns that array.\n */\nexport function getClassNames(el: Element): string[] {\n let className = ''\n switch (typeof el.className) {\n case 'string':\n className = el.className\n break\n // TODO: when is this ever used?\n case 'object': // handle cases where className might be SVGAnimatedString or some other type\n className =\n ('baseVal' in el.className ? (el.className as any).baseVal : null) || el.getAttribute('class') || ''\n break\n default:\n className = ''\n }\n\n return splitClassString(className)\n}\n\nexport function makeSafeText(s: string | null | undefined): string | null {\n if (_isNullish(s)) {\n return null\n }\n\n return (\n _trim(s)\n // scrub potentially sensitive values\n .split(/(\\s+)/)\n .filter((s) => shouldCaptureValue(s))\n .join('')\n // normalize whitespace\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n // truncate\n .substring(0, 255)\n )\n}\n\n/*\n * Get the direct text content of an element, protecting against sensitive data collection.\n * Concats textContent of each of the element's text node children; this avoids potential\n * collection of sensitive data that could happen if we used element.textContent and the\n * element had sensitive child elements, since element.textContent includes child content.\n * Scrubs values that look like they could be sensitive (i.e. cc or ssn number).\n * @param {Element} el - element to get the text of\n * @returns {string} the element's direct text content\n */\nexport function getSafeText(el: Element): string {\n let elText = ''\n\n if (shouldCaptureElement(el) && !isSensitiveElement(el) && el.childNodes && el.childNodes.length) {\n _each(el.childNodes, function (child) {\n if (isTextNode(child) && child.textContent) {\n elText += makeSafeText(child.textContent) ?? ''\n }\n })\n }\n\n return _trim(elText)\n}\n\n/*\n * Check whether an element has nodeType Node.ELEMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isElementNode(el: Node | Element | undefined | null): el is Element {\n return !!el && el.nodeType === 1 // Node.ELEMENT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element is of a given tag type.\n * Due to potential reference discrepancies (such as the webcomponents.js polyfill),\n * we want to match tagNames instead of specific references because something like\n * element === document.body won't always work because element might not be a native\n * element.\n * @param {Element} el - element to check\n * @param {string} tag - tag name (e.g., \"div\")\n * @returns {boolean} whether el is of the given tag type\n */\nexport function isTag(el: Element | undefined | null, tag: string): el is HTMLElement {\n return !!el && !!el.tagName && el.tagName.toLowerCase() === tag.toLowerCase()\n}\n\n/*\n * Check whether an element has nodeType Node.TEXT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isTextNode(el: Element | undefined | null): el is HTMLElement {\n return !!el && el.nodeType === 3 // Node.TEXT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element has nodeType Node.DOCUMENT_FRAGMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isDocumentFragment(el: Element | ParentNode | undefined | null): el is DocumentFragment {\n return !!el && el.nodeType === 11 // Node.DOCUMENT_FRAGMENT_NODE - use integer constant for browser portability\n}\n\nexport const autocaptureCompatibleElements = ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n\n/*\n if there is no config, then all elements are allowed\n if there is a config, and there is an allow list, then only elements in the allow list are allowed\n assumes that some other code is checking this element's parents\n */\nfunction checkIfElementTreePassesElementAllowList(\n elements: Element[],\n autocaptureConfig: AutocaptureConfig | undefined\n): boolean {\n const allowlist = autocaptureConfig?.element_allowlist\n if (_isUndefined(allowlist)) {\n // everything is allowed, when there is no allow list\n return true\n }\n\n // check each element in the tree\n // if any of the elements are in the allow list, then the tree is allowed\n for (const el of elements) {\n if (allowlist.some((elementType) => el.tagName.toLowerCase() === elementType)) {\n return true\n }\n }\n\n // otherwise there is an allow list and this element tree didn't match it\n return false\n}\n\n/*\n if there is no config, then all elements are allowed\n if there is a config, and there is an allow list, then\n only elements that match the css selector in the allow list are allowed\n assumes that some other code is checking this element's parents\n */\nfunction checkIfElementTreePassesCSSSelectorAllowList(\n elements: Element[],\n autocaptureConfig: AutocaptureConfig | undefined\n): boolean {\n const allowlist = autocaptureConfig?.css_selector_allowlist\n if (_isUndefined(allowlist)) {\n // everything is allowed, when there is no allow list\n return true\n }\n\n // check each element in the tree\n // if any of the elements are in the allow list, then the tree is allowed\n for (const el of elements) {\n if (allowlist.some((selector) => el.matches(selector))) {\n return true\n }\n }\n\n // otherwise there is an allow list and this element tree didn't match it\n return false\n}\n\nfunction getParentElement(curEl: Element): Element | false {\n const parentNode = curEl.parentNode\n if (!parentNode || !isElementNode(parentNode)) return false\n return parentNode\n}\n\n/*\n * Check whether a DOM event should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @param {Event} event - event to check\n * @param {Object} autocaptureConfig - autocapture config\n * @param {boolean} captureOnAnyElement - whether to capture on any element, clipboard autocapture doesn't restrict to \"clickable\" elements\n * @param {string[]} allowedEventTypes - event types to capture, normally just 'click', but some autocapture types react to different events, some elements have fixed events (e.g., form has \"submit\")\n * @returns {boolean} whether the event should be captured\n */\nexport function shouldCaptureDomEvent(\n el: Element,\n event: Event,\n autocaptureConfig: AutocaptureConfig | undefined = undefined,\n captureOnAnyElement?: boolean,\n allowedEventTypes?: string[]\n): boolean {\n if (!window || !el || isTag(el, 'html') || !isElementNode(el)) {\n return false\n }\n\n if (autocaptureConfig?.url_allowlist) {\n const url = window.location.href\n const allowlist = autocaptureConfig.url_allowlist\n if (allowlist && !allowlist.some((regex) => url.match(regex))) {\n return false\n }\n }\n\n if (autocaptureConfig?.dom_event_allowlist) {\n const allowlist = autocaptureConfig.dom_event_allowlist\n if (allowlist && !allowlist.some((eventType) => event.type === eventType)) {\n return false\n }\n }\n\n let parentIsUsefulElement = false\n const targetElementList: Element[] = [el]\n let parentNode: Element | boolean = true\n let curEl: Element = el\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n // If element is a shadow root, we skip it\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n parentNode = getParentElement(curEl)\n if (!parentNode) break\n if (captureOnAnyElement || autocaptureCompatibleElements.indexOf(parentNode.tagName.toLowerCase()) > -1) {\n parentIsUsefulElement = true\n } else {\n const compStyles = window.getComputedStyle(parentNode)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer') {\n parentIsUsefulElement = true\n }\n }\n\n targetElementList.push(parentNode)\n curEl = parentNode\n }\n\n if (!checkIfElementTreePassesElementAllowList(targetElementList, autocaptureConfig)) {\n return false\n }\n\n if (!checkIfElementTreePassesCSSSelectorAllowList(targetElementList, autocaptureConfig)) {\n return false\n }\n\n const compStyles = window.getComputedStyle(el)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer' && event.type === 'click') {\n return true\n }\n\n const tag = el.tagName.toLowerCase()\n switch (tag) {\n case 'html':\n return false\n case 'form':\n return (allowedEventTypes || ['submit']).indexOf(event.type) >= 0\n case 'input':\n case 'select':\n case 'textarea':\n return (allowedEventTypes || ['change', 'click']).indexOf(event.type) >= 0\n default:\n if (parentIsUsefulElement) return (allowedEventTypes || ['click']).indexOf(event.type) >= 0\n return (\n (allowedEventTypes || ['click']).indexOf(event.type) >= 0 &&\n (autocaptureCompatibleElements.indexOf(tag) > -1 || el.getAttribute('contenteditable') === 'true')\n )\n }\n}\n\n/*\n * Check whether a DOM element should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureElement(el: Element): boolean {\n for (let curEl = el; curEl.parentNode && !isTag(curEl, 'body'); curEl = curEl.parentNode as Element) {\n const classes = getClassNames(curEl)\n if (_includes(classes, 'ph-sensitive') || _includes(classes, 'ph-no-capture')) {\n return false\n }\n }\n\n if (_includes(getClassNames(el), 'ph-include')) {\n return true\n }\n\n // don't include hidden or password fields\n const type = (el as HTMLInputElement).type || ''\n if (_isString(type)) {\n // it's possible for el.type to be a DOM element if el is a form with a child input[name=\"type\"]\n switch (type.toLowerCase()) {\n case 'hidden':\n return false\n case 'password':\n return false\n }\n }\n\n // filter out data from fields that look like sensitive fields\n const name = (el as HTMLInputElement).name || el.id || ''\n // See https://github.com/posthog/posthog-js/issues/165\n // Under specific circumstances a bug caused .replace to be called on a DOM element\n // instead of a string, removing the element from the page. Ensure this issue is mitigated.\n if (_isString(name)) {\n // it's possible for el.name or el.id to be a DOM element if el is a form with a child input[name=\"name\"]\n const sensitiveNameRegex =\n /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i\n if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether a DOM element is 'sensitive' and we should only capture limited data\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function isSensitiveElement(el: Element): boolean {\n // don't send data from inputs or similar elements since there will always be\n // a risk of clientside javascript placing sensitive data in attributes\n const allowedInputTypes = ['button', 'checkbox', 'submit', 'reset']\n if (\n (isTag(el, 'input') && !allowedInputTypes.includes((el as HTMLInputElement).type)) ||\n isTag(el, 'select') ||\n isTag(el, 'textarea') ||\n el.getAttribute('contenteditable') === 'true'\n ) {\n return true\n }\n return false\n}\n\n// Define the core pattern for matching credit card numbers\nconst coreCCPattern = `(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// Create the Anchored version of the regex by adding '^' at the start and '$' at the end\nconst anchoredCCRegex = new RegExp(`^(?:${coreCCPattern})$`)\n// The Unanchored version is essentially the core pattern, usable as is for partial matches\nconst unanchoredCCRegex = new RegExp(coreCCPattern)\n\n// Define the core pattern for matching SSNs with optional dashes\nconst coreSSNPattern = `\\\\d{3}-?\\\\d{2}-?\\\\d{4}`\n// Create the Anchored version of the regex by adding '^' at the start and '$' at the end\nconst anchoredSSNRegex = new RegExp(`^(${coreSSNPattern})$`)\n// The Unanchored version is essentially the core pattern itself, usable for partial matches\nconst unanchoredSSNRegex = new RegExp(`(${coreSSNPattern})`)\n\n/*\n * Check whether a string value should be \"captured\" or if it may contain sensitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @param {boolean} anchorRegexes - whether to anchor the regexes to the start and end of the string\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureValue(value: string, anchorRegexes = true): boolean {\n if (_isNullish(value)) {\n return false\n }\n\n if (_isString(value)) {\n value = _trim(value)\n\n // check to see if input value looks like a credit card number\n // see: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html\n const ccRegex = anchorRegexes ? anchoredCCRegex : unanchoredCCRegex\n if (ccRegex.test((value || '').replace(/[- ]/g, ''))) {\n return false\n }\n\n // check to see if input value looks like a social security number\n const ssnRegex = anchorRegexes ? anchoredSSNRegex : unanchoredSSNRegex\n if (ssnRegex.test(value)) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether an attribute name is an Angular style attr (either _ngcontent or _nghost)\n * These update on each build and lead to noise in the element chain\n * More details on the attributes here: https://angular.io/guide/view-encapsulation\n * @param {string} attributeName - string value to check\n * @returns {boolean} whether the element is an angular tag\n */\nexport function isAngularStyleAttr(attributeName: string): boolean {\n if (_isString(attributeName)) {\n return attributeName.substring(0, 10) === '_ngcontent' || attributeName.substring(0, 7) === '_nghost'\n }\n return false\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces,\n * along with the direct text content of the target element\n * @param {Element} target - element to check\n * @returns {string} text content of the target element and its child span tags\n */\nexport function getDirectAndNestedSpanText(target: Element): string {\n let text = getSafeText(target)\n text = `${text} ${getNestedSpanText(target)}`.trim()\n return shouldCaptureValue(text) ? text : ''\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces\n * @param {Element} target - element to check\n * @returns {string} text content of span tags\n */\nexport function getNestedSpanText(target: Element): string {\n let text = ''\n if (target && target.childNodes && target.childNodes.length) {\n _each(target.childNodes, function (child) {\n if (child && child.tagName?.toLowerCase() === 'span') {\n try {\n const spanText = getSafeText(child)\n text = `${text} ${spanText}`.trim()\n\n if (child.childNodes && child.childNodes.length) {\n text = `${text} ${getNestedSpanText(child)}`.trim()\n }\n } catch (e) {\n logger.error(e)\n }\n }\n })\n }\n return text\n}\n\n/*\nBack in the day storing events in Postgres we use Elements for autocapture events.\nNow we're using elements_chain. We used to do this parsing/processing during ingestion.\nThis code is just copied over from ingestion, but we should optimize it\nto create elements_chain string directly.\n*/\nexport function getElementsChainString(elements: Properties[]): string {\n return elementsToString(extractElements(elements))\n}\n\n// This interface is called 'Element' in plugin-scaffold https://github.com/PostHog/plugin-scaffold/blob/b07d3b879796ecc7e22deb71bf627694ba05386b/src/types.ts#L200\n// However 'Element' is a DOM Element when run in the browser, so we have to rename it\ninterface PHElement {\n text?: string\n tag_name?: string\n href?: string\n attr_id?: string\n attr_class?: string[]\n nth_child?: number\n nth_of_type?: number\n attributes?: Record<string, any>\n event_id?: number\n order?: number\n group_id?: number\n}\n\nfunction escapeQuotes(input: string): string {\n return input.replace(/\"|\\\\\"/g, '\\\\\"')\n}\n\nfunction elementsToString(elements: PHElement[]): string {\n const ret = elements.map((element) => {\n let el_string = ''\n if (element.tag_name) {\n el_string += element.tag_name\n }\n if (element.attr_class) {\n element.attr_class.sort()\n for (const single_class of element.attr_class) {\n el_string += `.${single_class.replace(/\"/g, '')}`\n }\n }\n const attributes: Record<string, any> = {\n ...(element.text ? { text: element.text } : {}),\n 'nth-child': element.nth_child ?? 0,\n 'nth-of-type': element.nth_of_type ?? 0,\n ...(element.href ? { href: element.href } : {}),\n ...(element.attr_id ? { attr_id: element.attr_id } : {}),\n ...element.attributes,\n }\n const sortedAttributes: Record<string, any> = {}\n _entries(attributes)\n .sort(([a], [b]) => a.localeCompare(b))\n .forEach(\n ([key, value]) => (sortedAttributes[escapeQuotes(key.toString())] = escapeQuotes(value.toString()))\n )\n el_string += ':'\n el_string += _entries(attributes)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join('')\n return el_string\n })\n return ret.join(';')\n}\n\nfunction extractElements(elements: Properties[]): PHElement[] {\n return elements.map((el) => {\n const response = {\n text: el['$el_text']?.slice(0, 400),\n tag_name: el['tag_name'],\n href: el['attr__href']?.slice(0, 2048),\n attr_class: extractAttrClass(el),\n attr_id: el['attr__id'],\n nth_child: el['nth_child'],\n nth_of_type: el['nth_of_type'],\n attributes: {} as { [id: string]: any },\n }\n _entries(el)\n .filter(([key]) => key.indexOf('attr__') === 0)\n .forEach(([key, value]) => (response.attributes[key] = value))\n return response\n })\n}\n\nfunction extractAttrClass(el: Properties): PHElement['attr_class'] {\n const attr_class = el['attr__class']\n if (!attr_class) {\n return undefined\n } else if (_isArray(attr_class)) {\n return attr_class\n } else {\n return splitClassString(attr_class)\n }\n}\n"]}
1
+ {"version":3,"file":"autocapture-utils.js","sourceRoot":"","sources":["../../src/autocapture-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AutocaptureConfig, Properties } from './types'\nimport { _each, _entries, _includes, _trim } from './utils'\n\nimport { _isArray, _isNullish, _isString, _isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\nimport { window } from './utils/globals'\n\nexport function splitClassString(s: string): string[] {\n return s ? _trim(s).split(/\\s+/) : []\n}\n\n/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n *\n * Because this is a string it can contain unexpected characters\n * So, this method safely splits the className and returns that array.\n */\nexport function getClassNames(el: Element): string[] {\n let className = ''\n switch (typeof el.className) {\n case 'string':\n className = el.className\n break\n // TODO: when is this ever used?\n case 'object': // handle cases where className might be SVGAnimatedString or some other type\n className =\n ('baseVal' in el.className ? (el.className as any).baseVal : null) || el.getAttribute('class') || ''\n break\n default:\n className = ''\n }\n\n return splitClassString(className)\n}\n\nexport function makeSafeText(s: string | null | undefined): string | null {\n if (_isNullish(s)) {\n return null\n }\n\n return (\n _trim(s)\n // scrub potentially sensitive values\n .split(/(\\s+)/)\n .filter((s) => shouldCaptureValue(s))\n .join('')\n // normalize whitespace\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n // truncate\n .substring(0, 255)\n )\n}\n\n/*\n * Get the direct text content of an element, protecting against sensitive data collection.\n * Concats textContent of each of the element's text node children; this avoids potential\n * collection of sensitive data that could happen if we used element.textContent and the\n * element had sensitive child elements, since element.textContent includes child content.\n * Scrubs values that look like they could be sensitive (i.e. cc or ssn number).\n * @param {Element} el - element to get the text of\n * @returns {string} the element's direct text content\n */\nexport function getSafeText(el: Element): string {\n let elText = ''\n\n if (shouldCaptureElement(el) && !isSensitiveElement(el) && el.childNodes && el.childNodes.length) {\n _each(el.childNodes, function (child) {\n if (isTextNode(child) && child.textContent) {\n elText += makeSafeText(child.textContent) ?? ''\n }\n })\n }\n\n return _trim(elText)\n}\n\n/*\n * Check whether an element has nodeType Node.ELEMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isElementNode(el: Node | Element | undefined | null): el is Element {\n return !!el && el.nodeType === 1 // Node.ELEMENT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element is of a given tag type.\n * Due to potential reference discrepancies (such as the webcomponents.js polyfill),\n * we want to match tagNames instead of specific references because something like\n * element === document.body won't always work because element might not be a native\n * element.\n * @param {Element} el - element to check\n * @param {string} tag - tag name (e.g., \"div\")\n * @returns {boolean} whether el is of the given tag type\n */\nexport function isTag(el: Element | undefined | null, tag: string): el is HTMLElement {\n return !!el && !!el.tagName && el.tagName.toLowerCase() === tag.toLowerCase()\n}\n\n/*\n * Check whether an element has nodeType Node.TEXT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isTextNode(el: Element | undefined | null): el is HTMLElement {\n return !!el && el.nodeType === 3 // Node.TEXT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element has nodeType Node.DOCUMENT_FRAGMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isDocumentFragment(el: Element | ParentNode | undefined | null): el is DocumentFragment {\n return !!el && el.nodeType === 11 // Node.DOCUMENT_FRAGMENT_NODE - use integer constant for browser portability\n}\n\nexport const autocaptureCompatibleElements = ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n\n/*\n if there is no config, then all elements are allowed\n if there is a config, and there is an allow list, then only elements in the allow list are allowed\n assumes that some other code is checking this element's parents\n */\nfunction checkIfElementTreePassesElementAllowList(\n elements: Element[],\n autocaptureConfig: AutocaptureConfig | undefined\n): boolean {\n const allowlist = autocaptureConfig?.element_allowlist\n if (_isUndefined(allowlist)) {\n // everything is allowed, when there is no allow list\n return true\n }\n\n // check each element in the tree\n // if any of the elements are in the allow list, then the tree is allowed\n for (const el of elements) {\n if (allowlist.some((elementType) => el.tagName.toLowerCase() === elementType)) {\n return true\n }\n }\n\n // otherwise there is an allow list and this element tree didn't match it\n return false\n}\n\n/*\n if there is no config, then all elements are allowed\n if there is a config, and there is an allow list, then\n only elements that match the css selector in the allow list are allowed\n assumes that some other code is checking this element's parents\n */\nfunction checkIfElementTreePassesCSSSelectorAllowList(\n elements: Element[],\n autocaptureConfig: AutocaptureConfig | undefined\n): boolean {\n const allowlist = autocaptureConfig?.css_selector_allowlist\n if (_isUndefined(allowlist)) {\n // everything is allowed, when there is no allow list\n return true\n }\n\n // check each element in the tree\n // if any of the elements are in the allow list, then the tree is allowed\n for (const el of elements) {\n if (allowlist.some((selector) => el.matches(selector))) {\n return true\n }\n }\n\n // otherwise there is an allow list and this element tree didn't match it\n return false\n}\n\nfunction getParentElement(curEl: Element): Element | false {\n const parentNode = curEl.parentNode\n if (!parentNode || !isElementNode(parentNode)) return false\n return parentNode\n}\n\n/*\n * Check whether a DOM event should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @param {Event} event - event to check\n * @param {Object} autocaptureConfig - autocapture config\n * @param {boolean} captureOnAnyElement - whether to capture on any element, clipboard autocapture doesn't restrict to \"clickable\" elements\n * @param {string[]} allowedEventTypes - event types to capture, normally just 'click', but some autocapture types react to different events, some elements have fixed events (e.g., form has \"submit\")\n * @returns {boolean} whether the event should be captured\n */\nexport function shouldCaptureDomEvent(\n el: Element,\n event: Event,\n autocaptureConfig: AutocaptureConfig | undefined = undefined,\n captureOnAnyElement?: boolean,\n allowedEventTypes?: string[]\n): boolean {\n if (!window || !el || isTag(el, 'html') || !isElementNode(el)) {\n return false\n }\n\n if (autocaptureConfig?.url_allowlist) {\n const url = window.location.href\n const allowlist = autocaptureConfig.url_allowlist\n if (allowlist && !allowlist.some((regex) => url.match(regex))) {\n return false\n }\n }\n\n if (autocaptureConfig?.dom_event_allowlist) {\n const allowlist = autocaptureConfig.dom_event_allowlist\n if (allowlist && !allowlist.some((eventType) => event.type === eventType)) {\n return false\n }\n }\n\n let parentIsUsefulElement = false\n const targetElementList: Element[] = [el]\n let parentNode: Element | boolean = true\n let curEl: Element = el\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n // If element is a shadow root, we skip it\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n parentNode = getParentElement(curEl)\n if (!parentNode) break\n if (captureOnAnyElement || autocaptureCompatibleElements.indexOf(parentNode.tagName.toLowerCase()) > -1) {\n parentIsUsefulElement = true\n } else {\n const compStyles = window.getComputedStyle(parentNode)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer') {\n parentIsUsefulElement = true\n }\n }\n\n targetElementList.push(parentNode)\n curEl = parentNode\n }\n\n if (!checkIfElementTreePassesElementAllowList(targetElementList, autocaptureConfig)) {\n return false\n }\n\n if (!checkIfElementTreePassesCSSSelectorAllowList(targetElementList, autocaptureConfig)) {\n return false\n }\n\n const compStyles = window.getComputedStyle(el)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer' && event.type === 'click') {\n return true\n }\n\n const tag = el.tagName.toLowerCase()\n switch (tag) {\n case 'html':\n return false\n case 'form':\n return (allowedEventTypes || ['submit']).indexOf(event.type) >= 0\n case 'input':\n case 'select':\n case 'textarea':\n return (allowedEventTypes || ['change', 'click']).indexOf(event.type) >= 0\n default:\n if (parentIsUsefulElement) return (allowedEventTypes || ['click']).indexOf(event.type) >= 0\n return (\n (allowedEventTypes || ['click']).indexOf(event.type) >= 0 &&\n (autocaptureCompatibleElements.indexOf(tag) > -1 || el.getAttribute('contenteditable') === 'true')\n )\n }\n}\n\n/*\n * Check whether a DOM element should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureElement(el: Element): boolean {\n for (let curEl = el; curEl.parentNode && !isTag(curEl, 'body'); curEl = curEl.parentNode as Element) {\n const classes = getClassNames(curEl)\n if (_includes(classes, 'ph-sensitive') || _includes(classes, 'ph-no-capture')) {\n return false\n }\n }\n\n if (_includes(getClassNames(el), 'ph-include')) {\n return true\n }\n\n // don't include hidden or password fields\n const type = (el as HTMLInputElement).type || ''\n if (_isString(type)) {\n // it's possible for el.type to be a DOM element if el is a form with a child input[name=\"type\"]\n switch (type.toLowerCase()) {\n case 'hidden':\n return false\n case 'password':\n return false\n }\n }\n\n // filter out data from fields that look like sensitive fields\n const name = (el as HTMLInputElement).name || el.id || ''\n // See https://github.com/posthog/posthog-js/issues/165\n // Under specific circumstances a bug caused .replace to be called on a DOM element\n // instead of a string, removing the element from the page. Ensure this issue is mitigated.\n if (_isString(name)) {\n // it's possible for el.name or el.id to be a DOM element if el is a form with a child input[name=\"name\"]\n const sensitiveNameRegex =\n /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i\n if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether a DOM element is 'sensitive' and we should only capture limited data\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function isSensitiveElement(el: Element): boolean {\n // don't send data from inputs or similar elements since there will always be\n // a risk of clientside javascript placing sensitive data in attributes\n const allowedInputTypes = ['button', 'checkbox', 'submit', 'reset']\n if (\n (isTag(el, 'input') && !allowedInputTypes.includes((el as HTMLInputElement).type)) ||\n isTag(el, 'select') ||\n isTag(el, 'textarea') ||\n el.getAttribute('contenteditable') === 'true'\n ) {\n return true\n }\n return false\n}\n\n// Define the core pattern for matching credit card numbers\nconst coreCCPattern = `(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// Create the Anchored version of the regex by adding '^' at the start and '$' at the end\nconst anchoredCCRegex = new RegExp(`^(?:${coreCCPattern})$`)\n// The Unanchored version is essentially the core pattern, usable as is for partial matches\nconst unanchoredCCRegex = new RegExp(coreCCPattern)\n\n// Define the core pattern for matching SSNs with optional dashes\nconst coreSSNPattern = `\\\\d{3}-?\\\\d{2}-?\\\\d{4}`\n// Create the Anchored version of the regex by adding '^' at the start and '$' at the end\nconst anchoredSSNRegex = new RegExp(`^(${coreSSNPattern})$`)\n// The Unanchored version is essentially the core pattern itself, usable for partial matches\nconst unanchoredSSNRegex = new RegExp(`(${coreSSNPattern})`)\n\n/*\n * Check whether a string value should be \"captured\" or if it may contain sensitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @param {boolean} anchorRegexes - whether to anchor the regexes to the start and end of the string\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureValue(value: string, anchorRegexes = true): boolean {\n if (_isNullish(value)) {\n return false\n }\n\n if (_isString(value)) {\n value = _trim(value)\n\n // check to see if input value looks like a credit card number\n // see: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html\n const ccRegex = anchorRegexes ? anchoredCCRegex : unanchoredCCRegex\n if (ccRegex.test((value || '').replace(/[- ]/g, ''))) {\n return false\n }\n\n // check to see if input value looks like a social security number\n const ssnRegex = anchorRegexes ? anchoredSSNRegex : unanchoredSSNRegex\n if (ssnRegex.test(value)) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether an attribute name is an Angular style attr (either _ngcontent or _nghost)\n * These update on each build and lead to noise in the element chain\n * More details on the attributes here: https://angular.io/guide/view-encapsulation\n * @param {string} attributeName - string value to check\n * @returns {boolean} whether the element is an angular tag\n */\nexport function isAngularStyleAttr(attributeName: string): boolean {\n if (_isString(attributeName)) {\n return attributeName.substring(0, 10) === '_ngcontent' || attributeName.substring(0, 7) === '_nghost'\n }\n return false\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces,\n * along with the direct text content of the target element\n * @param {Element} target - element to check\n * @returns {string} text content of the target element and its child span tags\n */\nexport function getDirectAndNestedSpanText(target: Element): string {\n let text = getSafeText(target)\n text = `${text} ${getNestedSpanText(target)}`.trim()\n return shouldCaptureValue(text) ? text : ''\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces\n * @param {Element} target - element to check\n * @returns {string} text content of span tags\n */\nexport function getNestedSpanText(target: Element): string {\n let text = ''\n if (target && target.childNodes && target.childNodes.length) {\n _each(target.childNodes, function (child) {\n if (child && child.tagName?.toLowerCase() === 'span') {\n try {\n const spanText = getSafeText(child)\n text = `${text} ${spanText}`.trim()\n\n if (child.childNodes && child.childNodes.length) {\n text = `${text} ${getNestedSpanText(child)}`.trim()\n }\n } catch (e) {\n logger.error(e)\n }\n }\n })\n }\n return text\n}\n\n/*\nBack in the day storing events in Postgres we use Elements for autocapture events.\nNow we're using elements_chain. We used to do this parsing/processing during ingestion.\nThis code is just copied over from ingestion, but we should optimize it\nto create elements_chain string directly.\n*/\nexport function getElementsChainString(elements: Properties[]): string {\n return elementsToString(extractElements(elements))\n}\n\n// This interface is called 'Element' in plugin-scaffold https://github.com/PostHog/plugin-scaffold/blob/b07d3b879796ecc7e22deb71bf627694ba05386b/src/types.ts#L200\n// However 'Element' is a DOM Element when run in the browser, so we have to rename it\ninterface PHElement {\n text?: string\n tag_name?: string\n href?: string\n attr_id?: string\n attr_class?: string[]\n nth_child?: number\n nth_of_type?: number\n attributes?: Record<string, any>\n event_id?: number\n order?: number\n group_id?: number\n}\n\nfunction escapeQuotes(input: string): string {\n return input.replace(/\"|\\\\\"/g, '\\\\\"')\n}\n\nfunction elementsToString(elements: PHElement[]): string {\n const ret = elements.map((element) => {\n let el_string = ''\n if (element.tag_name) {\n el_string += element.tag_name\n }\n if (element.attr_class) {\n element.attr_class.sort()\n for (const single_class of element.attr_class) {\n el_string += `.${single_class.replace(/\"/g, '')}`\n }\n }\n const attributes: Record<string, any> = {\n ...(element.text ? { text: element.text } : {}),\n 'nth-child': element.nth_child ?? 0,\n 'nth-of-type': element.nth_of_type ?? 0,\n ...(element.href ? { href: element.href } : {}),\n ...(element.attr_id ? { attr_id: element.attr_id } : {}),\n ...element.attributes,\n }\n const sortedAttributes: Record<string, any> = {}\n _entries(attributes)\n .sort(([a], [b]) => a.localeCompare(b))\n .forEach(\n ([key, value]) => (sortedAttributes[escapeQuotes(key.toString())] = escapeQuotes(value.toString()))\n )\n el_string += ':'\n el_string += _entries(attributes)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join('')\n return el_string\n })\n return ret.join(';')\n}\n\nfunction extractElements(elements: Properties[]): PHElement[] {\n return elements.map((el) => {\n const response = {\n text: el['$el_text']?.slice(0, 400),\n tag_name: el['tag_name'],\n href: el['attr__href']?.slice(0, 2048),\n attr_class: extractAttrClass(el),\n attr_id: el['attr__id'],\n nth_child: el['nth_child'],\n nth_of_type: el['nth_of_type'],\n attributes: {} as { [id: string]: any },\n }\n\n _entries(el)\n .filter(([key]) => key.indexOf('attr__') === 0)\n .forEach(([key, value]) => (response.attributes[key] = value))\n return response\n })\n}\n\nfunction extractAttrClass(el: Properties): PHElement['attr_class'] {\n const attr_class = el['attr__class']\n if (!attr_class) {\n return undefined\n } else if (_isArray(attr_class)) {\n return attr_class\n } else {\n return splitClassString(attr_class)\n }\n}\n"]}
@@ -1,27 +1,22 @@
1
1
  import RageClick from './extensions/rageclick';
2
- import { AutocaptureConfig, AutoCaptureCustomProperty, DecideResponse, Properties } from './types';
2
+ import { DecideResponse } from './types';
3
3
  import { PostHog } from './posthog-core';
4
- declare const autocapture: {
5
- _initializedTokens: string[];
4
+ export declare class Autocapture {
5
+ instance: PostHog;
6
+ _initialized: boolean;
6
7
  _isDisabledServerSide: boolean | null;
7
- _isAutocaptureEnabled: boolean;
8
- _setIsAutocaptureEnabled: (instance: PostHog) => void;
9
- _previousElementSibling: (el: Element) => Element | null;
10
- _getAugmentPropertiesFromElement: (elem: Element) => Properties;
11
- _getPropertiesFromElement: (elem: Element, maskInputs: boolean, maskText: boolean) => Properties;
12
- _getDefaultProperties: (eventType: string) => Properties;
13
- _extractCustomPropertyValue: (customProperty: AutoCaptureCustomProperty) => string;
14
- _getCustomProperties: (targetElementList: Element[]) => Properties;
15
- _getEventTarget: (e: Event) => Element | null;
16
- _captureEvent: (e: Event, instance: PostHog, eventName?: string, extraProps?: Properties) => boolean | void;
17
- _navigate: (href: string) => void;
18
- _addDomEventHandlers: (instance: PostHog) => void;
19
- _customProperties: AutoCaptureCustomProperty[];
20
- rageclicks: RageClick | null;
21
- config: AutocaptureConfig | undefined;
22
- init: (instance: PostHog) => void;
23
- afterDecideResponse: (response: DecideResponse, instance: PostHog) => void;
24
- enabledForProject: (token: string | null | undefined, numBuckets: number, numEnabledBuckets: number) => boolean;
25
- isBrowserSupported: () => boolean;
26
- };
27
- export { autocapture };
8
+ rageclicks: RageClick;
9
+ _elementsChainAsString: boolean;
10
+ constructor(instance: PostHog);
11
+ private get config();
12
+ private _addDomEventHandlers;
13
+ afterDecideResponse(response: DecideResponse): void;
14
+ get isEnabled(): boolean;
15
+ private _previousElementSibling;
16
+ private _getAugmentPropertiesFromElement;
17
+ private _getPropertiesFromElement;
18
+ private _getDefaultProperties;
19
+ private _getEventTarget;
20
+ private _captureEvent;
21
+ isBrowserSupported(): boolean;
22
+ }
@@ -1,8 +1,8 @@
1
- import { _bind_instance_methods, _each, _extend, _includes, _register_event, _safewrap_instance_methods } from './utils';
1
+ import { _each, _extend, _includes, _register_event } from './utils';
2
2
  import { autocaptureCompatibleElements, getClassNames, getDirectAndNestedSpanText, getElementsChainString, getSafeText, isAngularStyleAttr, isDocumentFragment, isElementNode, isSensitiveElement, isTag, isTextNode, makeSafeText, shouldCaptureDomEvent, shouldCaptureElement, shouldCaptureValue, splitClassString, } from './autocapture-utils';
3
3
  import RageClick from './extensions/rageclick';
4
4
  import { AUTOCAPTURE_DISABLED_SERVER_SIDE } from './constants';
5
- import { _isBoolean, _isFunction, _isNull, _isObject, _isUndefined } from './utils/type-utils';
5
+ import { _isFunction, _isNull, _isObject, _isUndefined } from './utils/type-utils';
6
6
  import { logger } from './utils/logger';
7
7
  import { document, window } from './utils/globals';
8
8
  var COPY_AUTOCAPTURE_EVENT = '$copy_autocapture';
@@ -12,38 +12,106 @@ function limitText(length, text) {
12
12
  }
13
13
  return text;
14
14
  }
15
- var autocapture = {
16
- _initializedTokens: [],
17
- _isDisabledServerSide: null,
18
- _isAutocaptureEnabled: false,
19
- _setIsAutocaptureEnabled: function (instance) {
15
+ var Autocapture = /** @class */ (function () {
16
+ function Autocapture(instance) {
17
+ this._initialized = false;
18
+ this._isDisabledServerSide = null;
19
+ this.rageclicks = new RageClick();
20
+ this._elementsChainAsString = false;
21
+ this.instance = instance;
22
+ }
23
+ Object.defineProperty(Autocapture.prototype, "config", {
24
+ get: function () {
25
+ var _a;
26
+ var config = _isObject(this.instance.config.autocapture) ? this.instance.config.autocapture : {};
27
+ // precompile the regex
28
+ config.url_allowlist = (_a = config.url_allowlist) === null || _a === void 0 ? void 0 : _a.map(function (url) { return new RegExp(url); });
29
+ return config;
30
+ },
31
+ enumerable: false,
32
+ configurable: true
33
+ });
34
+ Autocapture.prototype._addDomEventHandlers = function () {
35
+ var _this = this;
36
+ if (!this.isBrowserSupported()) {
37
+ logger.info('Disabling Automatic Event Collection because this browser is not supported');
38
+ return;
39
+ }
40
+ if (!window || !document) {
41
+ return;
42
+ }
43
+ var handler = function (e) {
44
+ e = e || (window === null || window === void 0 ? void 0 : window.event);
45
+ try {
46
+ _this._captureEvent(e);
47
+ }
48
+ catch (error) {
49
+ logger.error('Failed to capture event', error);
50
+ }
51
+ };
52
+ var copiedTextHandler = function (e) {
53
+ e = e || (window === null || window === void 0 ? void 0 : window.event);
54
+ _this._captureEvent(e, COPY_AUTOCAPTURE_EVENT);
55
+ };
56
+ _register_event(document, 'submit', handler, false, true);
57
+ _register_event(document, 'change', handler, false, true);
58
+ _register_event(document, 'click', handler, false, true);
59
+ if (this.config.capture_copied_text) {
60
+ _register_event(document, 'copy', copiedTextHandler, false, true);
61
+ _register_event(document, 'cut', copiedTextHandler, false, true);
62
+ }
63
+ };
64
+ Autocapture.prototype.afterDecideResponse = function (response) {
20
65
  var _a;
21
- var disabled_server_side = _isNull(this._isDisabledServerSide)
22
- ? !!((_a = instance.persistence) === null || _a === void 0 ? void 0 : _a.props[AUTOCAPTURE_DISABLED_SERVER_SIDE])
23
- : this._isDisabledServerSide;
24
- var enabled_client_side = !!instance.config.autocapture;
25
- this._isAutocaptureEnabled = enabled_client_side && !disabled_server_side;
26
- },
27
- _previousElementSibling: function (el) {
66
+ if (this._initialized) {
67
+ logger.info('autocapture already initialized');
68
+ return;
69
+ }
70
+ if (this.instance.persistence) {
71
+ this.instance.persistence.register((_a = {},
72
+ _a[AUTOCAPTURE_DISABLED_SERVER_SIDE] = !!response['autocapture_opt_out'],
73
+ _a));
74
+ }
75
+ // store this in-memory in case persistence is disabled
76
+ this._isDisabledServerSide = !!response['autocapture_opt_out'];
77
+ if (response.elementsChainAsString) {
78
+ this._elementsChainAsString = response.elementsChainAsString;
79
+ }
80
+ if (this.isEnabled) {
81
+ this._addDomEventHandlers();
82
+ this._initialized = true;
83
+ }
84
+ };
85
+ Object.defineProperty(Autocapture.prototype, "isEnabled", {
86
+ get: function () {
87
+ var _a;
88
+ var disabledServer = _isNull(this._isDisabledServerSide)
89
+ ? !!((_a = this.instance.persistence) === null || _a === void 0 ? void 0 : _a.props[AUTOCAPTURE_DISABLED_SERVER_SIDE])
90
+ : this._isDisabledServerSide;
91
+ var disabledClient = !this.instance.config.autocapture;
92
+ return !disabledClient && !disabledServer;
93
+ },
94
+ enumerable: false,
95
+ configurable: true
96
+ });
97
+ Autocapture.prototype._previousElementSibling = function (el) {
28
98
  if (el.previousElementSibling) {
29
99
  return el.previousElementSibling;
30
100
  }
31
- else {
32
- var _el = el;
33
- do {
34
- _el = _el.previousSibling; // resolves to ChildNode->Node, which is Element's parent class
35
- } while (_el && !isElementNode(_el));
36
- return _el;
37
- }
38
- },
39
- _getAugmentPropertiesFromElement: function (elem) {
101
+ var _el = el;
102
+ do {
103
+ _el = _el.previousSibling; // resolves to ChildNode->Node, which is Element's parent class
104
+ } while (_el && !isElementNode(_el));
105
+ return _el;
106
+ };
107
+ Autocapture.prototype._getAugmentPropertiesFromElement = function (elem) {
40
108
  var shouldCaptureEl = shouldCaptureElement(elem);
41
109
  if (!shouldCaptureEl) {
42
110
  return {};
43
111
  }
44
112
  var props = {};
45
113
  _each(elem.attributes, function (attr) {
46
- if (attr.name.indexOf('data-ph-capture-attribute') === 0) {
114
+ if (attr.name && attr.name.indexOf('data-ph-capture-attribute') === 0) {
47
115
  var propertyKey = attr.name.replace('data-ph-capture-attribute-', '');
48
116
  var propertyValue = attr.value;
49
117
  if (propertyKey && propertyValue && shouldCaptureValue(propertyValue)) {
@@ -52,8 +120,8 @@ var autocapture = {
52
120
  }
53
121
  });
54
122
  return props;
55
- },
56
- _getPropertiesFromElement: function (elem, maskInputs, maskText) {
123
+ };
124
+ Autocapture.prototype._getPropertiesFromElement = function (elem, maskInputs, maskText) {
57
125
  var _a;
58
126
  var tag_name = elem.tagName.toLowerCase();
59
127
  var props = {
@@ -104,46 +172,14 @@ var autocapture = {
104
172
  props['nth_child'] = nthChild;
105
173
  props['nth_of_type'] = nthOfType;
106
174
  return props;
107
- },
108
- _getDefaultProperties: function (eventType) {
175
+ };
176
+ Autocapture.prototype._getDefaultProperties = function (eventType) {
109
177
  return {
110
178
  $event_type: eventType,
111
179
  $ce_version: 1,
112
180
  };
113
- },
114
- _extractCustomPropertyValue: function (customProperty) {
115
- var propValues = [];
116
- _each(document === null || document === void 0 ? void 0 : document.querySelectorAll(customProperty['css_selector']), function (matchedElem) {
117
- var value;
118
- if (['input', 'select'].indexOf(matchedElem.tagName.toLowerCase()) > -1) {
119
- value = matchedElem['value'];
120
- }
121
- else if (matchedElem['textContent']) {
122
- value = matchedElem['textContent'];
123
- }
124
- if (shouldCaptureValue(value)) {
125
- propValues.push(value);
126
- }
127
- });
128
- return propValues.join(', ');
129
- },
130
- // TODO: delete custom_properties after changeless typescript refactor
131
- _getCustomProperties: function (targetElementList) {
132
- var _this = this;
133
- var props = {}; // will be deleted
134
- _each(this._customProperties, function (customProperty) {
135
- _each(customProperty['event_selectors'], function (eventSelector) {
136
- var eventElements = document === null || document === void 0 ? void 0 : document.querySelectorAll(eventSelector);
137
- _each(eventElements, function (eventElement) {
138
- if (_includes(targetElementList, eventElement) && shouldCaptureElement(eventElement)) {
139
- props[customProperty['name']] = _this._extractCustomPropertyValue(customProperty);
140
- }
141
- });
142
- });
143
- });
144
- return props;
145
- },
146
- _getEventTarget: function (e) {
181
+ };
182
+ Autocapture.prototype._getEventTarget = function (e) {
147
183
  var _a;
148
184
  // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes
149
185
  if (_isUndefined(e.target)) {
@@ -155,8 +191,8 @@ var autocapture = {
155
191
  }
156
192
  return e.target || null;
157
193
  }
158
- },
159
- _captureEvent: function (e, instance, eventName, extraProps) {
194
+ };
195
+ Autocapture.prototype._captureEvent = function (e, eventName) {
160
196
  var _this = this;
161
197
  var _a, _b, _c, _d;
162
198
  if (eventName === void 0) { eventName = '$autocapture'; }
@@ -167,8 +203,9 @@ var autocapture = {
167
203
  target = (target.parentNode || null);
168
204
  }
169
205
  if (eventName === '$autocapture' && e.type === 'click' && e instanceof MouseEvent) {
170
- if ((_a = this.rageclicks) === null || _a === void 0 ? void 0 : _a.isRageClick(e.clientX, e.clientY, new Date().getTime())) {
171
- this._captureEvent(e, instance, '$rageclick');
206
+ if (this.instance.config.rageclick &&
207
+ ((_a = this.rageclicks) === null || _a === void 0 ? void 0 : _a.isRageClick(e.clientX, e.clientY, new Date().getTime()))) {
208
+ this._captureEvent(e, '$rageclick');
172
209
  }
173
210
  }
174
211
  var isCopyAutocapture = eventName === COPY_AUTOCAPTURE_EVENT;
@@ -207,11 +244,11 @@ var autocapture = {
207
244
  if (_includes(classes, 'ph-no-capture')) {
208
245
  explicitNoCapture_1 = true;
209
246
  }
210
- elementsJson_1.push(_this._getPropertiesFromElement(el, instance.config.mask_all_element_attributes, instance.config.mask_all_text));
247
+ elementsJson_1.push(_this._getPropertiesFromElement(el, _this.instance.config.mask_all_element_attributes, _this.instance.config.mask_all_text));
211
248
  var augmentProperties = _this._getAugmentPropertiesFromElement(el);
212
249
  _extend(autocaptureAugmentProperties_1, augmentProperties);
213
250
  });
214
- if (!instance.config.mask_all_text) {
251
+ if (!this.instance.config.mask_all_text) {
215
252
  // if the element is a button or anchor tag get the span text from any
216
253
  // children and include it as/with the text property on the parent element
217
254
  if (target.tagName.toLowerCase() === 'a' || target.tagName.toLowerCase() === 'button') {
@@ -227,13 +264,13 @@ var autocapture = {
227
264
  if (explicitNoCapture_1) {
228
265
  return false;
229
266
  }
230
- var props = _extend(this._getDefaultProperties(e.type), instance.elementsChainAsString
267
+ var props = _extend(this._getDefaultProperties(e.type), this._elementsChainAsString
231
268
  ? {
232
269
  $elements_chain: getElementsChainString(elementsJson_1),
233
270
  }
234
271
  : {
235
272
  $elements: elementsJson_1,
236
- }, ((_b = elementsJson_1[0]) === null || _b === void 0 ? void 0 : _b['$el_text']) ? { $el_text: (_c = elementsJson_1[0]) === null || _c === void 0 ? void 0 : _c['$el_text'] } : {}, this._getCustomProperties(targetElementList), autocaptureAugmentProperties_1, extraProps || {});
273
+ }, ((_b = elementsJson_1[0]) === null || _b === void 0 ? void 0 : _b['$el_text']) ? { $el_text: (_c = elementsJson_1[0]) === null || _c === void 0 ? void 0 : _c['$el_text'] } : {}, autocaptureAugmentProperties_1);
237
274
  if (eventName === COPY_AUTOCAPTURE_EVENT) {
238
275
  // you can't read the data from the clipboard event,
239
276
  // but you can guess that you can read it from the window's current selection
@@ -245,105 +282,14 @@ var autocapture = {
245
282
  props['$selected_content'] = selectedContent;
246
283
  props['$copy_type'] = clipType;
247
284
  }
248
- instance.capture(eventName, props);
285
+ this.instance.capture(eventName, props);
249
286
  return true;
250
287
  }
251
- },
252
- // only reason is to stub for unit tests
253
- // since you can't override window.location props
254
- _navigate: function (href) {
255
- if (!window) {
256
- return;
257
- }
258
- window.location.href = href;
259
- },
260
- _addDomEventHandlers: function (instance) {
261
- var _this = this;
262
- if (!window || !document) {
263
- return;
264
- }
265
- var handler = function (e) {
266
- e = e || (window === null || window === void 0 ? void 0 : window.event);
267
- _this._captureEvent(e, instance);
268
- };
269
- var copiedTextHandler = function (e) {
270
- e = e || (window === null || window === void 0 ? void 0 : window.event);
271
- _this._captureEvent(e, instance, COPY_AUTOCAPTURE_EVENT);
272
- };
273
- _register_event(document, 'submit', handler, false, true);
274
- _register_event(document, 'change', handler, false, true);
275
- _register_event(document, 'click', handler, false, true);
276
- if (_isObject(instance.config.autocapture) && instance.config.autocapture.capture_copied_text) {
277
- _register_event(document, 'copy', copiedTextHandler, false, true);
278
- _register_event(document, 'cut', copiedTextHandler, false, true);
279
- }
280
- },
281
- _customProperties: [],
282
- rageclicks: null,
283
- config: undefined,
284
- init: function (instance) {
285
- var _a;
286
- if (!_isBoolean(instance.__autocapture)) {
287
- this.config = instance.__autocapture;
288
- }
289
- // precompile the regex
290
- if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.url_allowlist) {
291
- this.config.url_allowlist = this.config.url_allowlist.map(function (url) { return new RegExp(url); });
292
- }
293
- this.rageclicks = new RageClick(instance.config.rageclick);
294
- },
295
- afterDecideResponse: function (response, instance) {
296
- var _a;
297
- var token = instance.config.token;
298
- if (this._initializedTokens.indexOf(token) > -1) {
299
- logger.info('autocapture already initialized for token "' + token + '"');
300
- return;
301
- }
302
- if (instance.persistence) {
303
- instance.persistence.register((_a = {},
304
- _a[AUTOCAPTURE_DISABLED_SERVER_SIDE] = !!response['autocapture_opt_out'],
305
- _a));
306
- }
307
- // store this in-memory incase persistence is disabled
308
- this._isDisabledServerSide = !!response['autocapture_opt_out'];
309
- this._setIsAutocaptureEnabled(instance);
310
- this._initializedTokens.push(token);
311
- if (response &&
312
- response['config'] &&
313
- response['config']['enable_collect_everything'] &&
314
- this._isAutocaptureEnabled) {
315
- // TODO: delete custom_properties after changeless typescript refactor
316
- if (response['custom_properties']) {
317
- this._customProperties = response['custom_properties'];
318
- }
319
- this._addDomEventHandlers(instance);
320
- }
321
- else {
322
- instance['__autocapture'] = false;
323
- }
324
- },
325
- // this is a mechanism to ramp up CE with no server-side interaction.
326
- // when CE is active, every page load results in a decide request. we
327
- // need to gently ramp this up, so we don't overload decide. this decides
328
- // deterministically if CE is enabled for this project by modding the char
329
- // value of the project token.
330
- enabledForProject: function (token, numBuckets, numEnabledBuckets) {
331
- if (!token) {
332
- return true;
333
- }
334
- numBuckets = !_isUndefined(numBuckets) ? numBuckets : 10;
335
- numEnabledBuckets = !_isUndefined(numEnabledBuckets) ? numEnabledBuckets : 10;
336
- var charCodeSum = 0;
337
- for (var i = 0; i < token.length; i++) {
338
- charCodeSum += token.charCodeAt(i);
339
- }
340
- return charCodeSum % numBuckets < numEnabledBuckets;
341
- },
342
- isBrowserSupported: function () {
288
+ };
289
+ Autocapture.prototype.isBrowserSupported = function () {
343
290
  return _isFunction(document === null || document === void 0 ? void 0 : document.querySelectorAll);
344
- },
345
- };
346
- _bind_instance_methods(autocapture);
347
- _safewrap_instance_methods(autocapture);
348
- export { autocapture };
291
+ };
292
+ return Autocapture;
293
+ }());
294
+ export { Autocapture };
349
295
  //# sourceMappingURL=autocapture.js.map