posthog-js 1.83.0 → 1.83.2

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.
Files changed (52) hide show
  1. package/dist/array.full.js +2 -2
  2. package/dist/array.full.js.map +1 -1
  3. package/dist/array.js +2 -2
  4. package/dist/array.js.map +1 -1
  5. package/dist/es.js +2 -2
  6. package/dist/es.js.map +1 -1
  7. package/dist/module.d.ts +4 -2
  8. package/dist/module.js +2 -2
  9. package/dist/module.js.map +1 -1
  10. package/dist/surveys.js +1 -1
  11. package/dist/surveys.js.map +1 -1
  12. package/lib/package.json +1 -1
  13. package/lib/src/autocapture-utils.js +2 -2
  14. package/lib/src/autocapture-utils.js.map +1 -1
  15. package/lib/src/autocapture.js +1 -1
  16. package/lib/src/autocapture.js.map +1 -1
  17. package/lib/src/decide.js +6 -6
  18. package/lib/src/decide.js.map +1 -1
  19. package/lib/src/extensions/exceptions/exception-autocapture.js +3 -5
  20. package/lib/src/extensions/exceptions/exception-autocapture.js.map +1 -1
  21. package/lib/src/extensions/segment-integration.d.ts +0 -18
  22. package/lib/src/extensions/segment-integration.js +20 -1
  23. package/lib/src/extensions/segment-integration.js.map +1 -1
  24. package/lib/src/extensions/sessionrecording.d.ts +4 -2
  25. package/lib/src/extensions/sessionrecording.js +23 -9
  26. package/lib/src/extensions/sessionrecording.js.map +1 -1
  27. package/lib/src/extensions/surveys.js +3 -2
  28. package/lib/src/extensions/surveys.js.map +1 -1
  29. package/lib/src/extensions/web-performance.js +3 -3
  30. package/lib/src/extensions/web-performance.js.map +1 -1
  31. package/lib/src/gdpr-utils.d.ts +1 -11
  32. package/lib/src/gdpr-utils.js +4 -34
  33. package/lib/src/gdpr-utils.js.map +1 -1
  34. package/lib/src/posthog-core.js +17 -19
  35. package/lib/src/posthog-core.js.map +1 -1
  36. package/lib/src/posthog-featureflags.js +3 -3
  37. package/lib/src/posthog-featureflags.js.map +1 -1
  38. package/lib/src/rate-limiter.js +1 -1
  39. package/lib/src/rate-limiter.js.map +1 -1
  40. package/lib/src/retry-queue.js +4 -8
  41. package/lib/src/retry-queue.js.map +1 -1
  42. package/lib/src/sessionid.js +4 -3
  43. package/lib/src/sessionid.js.map +1 -1
  44. package/lib/src/storage.js +2 -5
  45. package/lib/src/storage.js.map +1 -1
  46. package/lib/src/utils.d.ts +7 -8
  47. package/lib/src/utils.js +33 -57
  48. package/lib/src/utils.js.map +1 -1
  49. package/package.json +1 -1
  50. package/react/dist/esm/index.js +3 -3
  51. package/react/dist/types/context/PostHogProvider.d.ts.map +1 -1
  52. package/react/dist/umd/index.js +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"autocapture-utils.js","sourceRoot":"","sources":["../../src/autocapture-utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/D,MAAM,UAAU,YAAY,CAAC,EAAW;IACpC,QAAQ,OAAO,EAAE,CAAC,SAAS,EAAE;QACzB,KAAK,QAAQ;YACT,OAAO,EAAE,CAAC,SAAS,CAAA;QACvB,gCAAgC;QAChC,KAAK,QAAQ,EAAE,6EAA6E;YACxF,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,CAAC,SAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QAC/G;YACI,eAAe;YACf,OAAO,EAAE,CAAA;KAChB;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,EAAW;IACnC,IAAI,MAAM,GAAG,EAAE,CAAA;IAEf,IAAI,oBAAoB,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE;QAC9F,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK;YAChC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE;gBACxC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;oBAC9B,qCAAqC;qBACpC,KAAK,CAAC,OAAO,CAAC;qBACd,MAAM,CAAC,kBAAkB,CAAC;qBAC1B,IAAI,CAAC,EAAE,CAAC;oBACT,uBAAuB;qBACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;qBACvB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;oBACtB,WAAW;qBACV,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;aACzB;QACL,CAAC,CAAC,CAAA;KACL;IAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAA;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,EAA8B;IACxD,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAA,CAAC,mEAAmE;AACxG,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,KAAK,CAAC,EAA8B,EAAE,GAAW;IAC7D,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAAA;AACjF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,EAA8B;IACrD,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAA,CAAC,gEAAgE;AACrG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAA2C;IAC1E,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAA,CAAC,6EAA6E;AACnH,CAAC;AAED,MAAM,CAAC,IAAM,6BAA6B,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;AAC5G;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACjC,EAAW,EACX,KAAY,EACZ,iBAA4D;IAA5D,kCAAA,EAAA,6BAA4D;IAE5D,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE;QAChD,OAAO,KAAK,CAAA;KACf;IAED,IAAI,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,aAAa,EAAE;QAClC,IAAM,KAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAA;QAChC,IAAM,SAAS,GAAG,iBAAiB,CAAC,aAAa,CAAA;QACjD,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAC,KAAK,IAAK,OAAA,KAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAhB,CAAgB,CAAC,EAAE;YAC3D,OAAO,KAAK,CAAA;SACf;KACJ;IAED,IAAI,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,mBAAmB,EAAE;QACxC,IAAM,SAAS,GAAG,iBAAiB,CAAC,mBAAmB,CAAA;QACvD,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAC,SAAS,IAAK,OAAA,KAAK,CAAC,IAAI,KAAK,SAAS,EAAxB,CAAwB,CAAC,EAAE;YACvE,OAAO,KAAK,CAAA;SACf;KACJ;IAED,IAAI,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,iBAAiB,EAAE;QACtC,IAAM,SAAS,GAAG,iBAAiB,CAAC,iBAAiB,CAAA;QACrD,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAC,WAAW,IAAK,OAAA,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,WAAW,EAAxC,CAAwC,CAAC,EAAE;YACzF,OAAO,KAAK,CAAA;SACf;KACJ;IAED,IAAI,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,sBAAsB,EAAE;QAC3C,IAAM,SAAS,GAAG,iBAAiB,CAAC,sBAAsB,CAAA;QAC1D,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAC,QAAQ,IAAK,OAAA,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAApB,CAAoB,CAAC,EAAE;YAClE,OAAO,KAAK,CAAA;SACf;KACJ;IAED,IAAI,qBAAqB,GAAG,KAAK,CAAA;IACjC,IAAM,iBAAiB,GAAc,CAAC,EAAE,CAAC,CAAA,CAAC,4CAA4C;IACtF,IAAI,UAAU,GAAsB,IAAI,CAAA;IACxC,IAAI,KAAK,GAAY,EAAE,CAAA;IACvB,OAAO,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;QAC9C,0CAA0C;QAC1C,IAAI,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;YACtC,iBAAiB,CAAC,IAAI,CAAE,KAAK,CAAC,UAAkB,CAAC,IAAI,CAAC,CAAA;YACtD,KAAK,GAAI,KAAK,CAAC,UAAkB,CAAC,IAAI,CAAA;YACtC,SAAQ;SACX;QACD,UAAU,GAAI,KAAK,CAAC,UAAsB,IAAI,KAAK,CAAA;QACnD,IAAI,CAAC,UAAU;YAAE,MAAK;QACtB,IAAI,6BAA6B,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;YAC9E,qBAAqB,GAAG,IAAI,CAAA;SAC/B;aAAM;YACH,IAAM,YAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAA;YACtD,IAAI,YAAU,IAAI,YAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;gBACnE,qBAAqB,GAAG,IAAI,CAAA;aAC/B;SACJ;QAED,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClC,KAAK,GAAG,UAAU,CAAA;KACrB;IAED,IAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;IAC9C,IAAI,UAAU,IAAI,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;QAC7F,OAAO,IAAI,CAAA;KACd;IAED,IAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;IACpC,QAAQ,GAAG,EAAE;QACT,KAAK,MAAM;YACP,OAAO,KAAK,CAAA;QAChB,KAAK,MAAM;YACP,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAA;QAClC,KAAK,OAAO;YACR,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAA;QAC5D,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU;YACX,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAA;QAC5D;YACI,IAAI,qBAAqB;gBAAE,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,CAAA;YACxD,OAAO,CACH,KAAK,CAAC,IAAI,KAAK,OAAO;gBACtB,CAAC,6BAA6B,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,MAAM,CAAC,CACrG,CAAA;KACR;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAW;IAC5C,KAAK,IAAI,KAAK,GAAG,EAAE,EAAE,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,UAAqB,EAAE;QACjG,IAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9C,IAAI,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE;YAC3E,OAAO,KAAK,CAAA;SACf;KACJ;IAED,IAAI,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE;QACtD,OAAO,IAAI,CAAA;KACd;IAED,0CAA0C;IAC1C,IAAM,IAAI,GAAI,EAAuB,CAAC,IAAI,IAAI,EAAE,CAAA;IAChD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC1B,gGAAgG;QAChG,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE;YACxB,KAAK,QAAQ;gBACT,OAAO,KAAK,CAAA;YAChB,KAAK,UAAU;gBACX,OAAO,KAAK,CAAA;SACnB;KACJ;IAED,8DAA8D;IAC9D,IAAM,IAAI,GAAI,EAAuB,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA;IACzD,uDAAuD;IACvD,mFAAmF;IACnF,2FAA2F;IAC3F,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC1B,yGAAyG;QACzG,IAAM,kBAAkB,GACpB,sHAAsH,CAAA;QAC1H,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,EAAE;YAC5D,OAAO,KAAK,CAAA;SACf;KACJ;IAED,OAAO,IAAI,CAAA;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAW;IAC1C,6EAA6E;IAC7E,uEAAuE;IACvE,IAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IACnE,IACI,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAE,EAAuB,CAAC,IAAI,CAAC,CAAC;QAClF,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC;QACnB,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC;QACrB,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,MAAM,EAC/C;QACE,OAAO,IAAI,CAAA;KACd;IACD,OAAO,KAAK,CAAA;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;QACvC,OAAO,KAAK,CAAA;KACf;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC3B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QAEpB,8DAA8D;QAC9D,8GAA8G;QAC9G,IAAM,OAAO,GACT,uKAAuK,CAAA;QAC3K,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE;YAClD,OAAO,KAAK,CAAA;SACf;QAED,kEAAkE;QAClE,IAAM,QAAQ,GAAG,yBAAyB,CAAA;QAC1C,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACtB,OAAO,KAAK,CAAA;SACf;KACJ;IAED,OAAO,IAAI,CAAA;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACpD,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;QACnC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,YAAY,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAA;KACxG;IACD,OAAO,KAAK,CAAA;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAe;IACtD,IAAI,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IAC9B,IAAI,GAAG,UAAG,IAAI,cAAI,iBAAiB,CAAC,MAAM,CAAC,CAAE,CAAC,IAAI,EAAE,CAAA;IACpD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC7C,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE;QACzD,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,KAAK;;YACpC,IAAI,KAAK,IAAI,CAAA,MAAA,KAAK,CAAC,OAAO,0CAAE,WAAW,EAAE,MAAK,MAAM,EAAE;gBAClD,IAAI;oBACA,IAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;oBACnC,IAAI,GAAG,UAAG,IAAI,cAAI,QAAQ,CAAE,CAAC,IAAI,EAAE,CAAA;oBAEnC,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE;wBAC7C,IAAI,GAAG,UAAG,IAAI,cAAI,iBAAiB,CAAC,KAAK,CAAC,CAAE,CAAC,IAAI,EAAE,CAAA;qBACtD;iBACJ;gBAAC,OAAO,CAAC,EAAE;oBACR,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;iBACnB;aACJ;QACL,CAAC,CAAC,CAAA;KACL;IACD,OAAO,IAAI,CAAA;AACf,CAAC","sourcesContent":["/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n * @param {Element} el - element to get the className of\n * @returns {string} the element's class\n */\nimport { AutocaptureConfig } from 'types'\nimport { _each, _includes, _isUndefined, _trim } from './utils'\n\nexport function getClassName(el: Element): string {\n switch (typeof el.className) {\n case 'string':\n return el.className\n // TODO: when is this ever used?\n case 'object': // handle cases where className might be SVGAnimatedString or some other type\n return ('baseVal' in el.className ? (el.className as any).baseVal : null) || el.getAttribute('class') || ''\n default:\n // future proof\n return ''\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 += _trim(child.textContent)\n // scrub potentially sensitive values\n .split(/(\\s+)/)\n .filter(shouldCaptureValue)\n .join('')\n // normalize whitespace\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n // truncate\n .substring(0, 255)\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: Element | undefined | null): el is HTMLElement {\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 * 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 * @returns {boolean} whether the event should be captured\n */\nexport function shouldCaptureDomEvent(\n el: Element,\n event: Event,\n autocaptureConfig: AutocaptureConfig | undefined = undefined\n): boolean {\n if (!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 if (autocaptureConfig?.element_allowlist) {\n const allowlist = autocaptureConfig.element_allowlist\n if (allowlist && !allowlist.some((elementType) => el.tagName.toLowerCase() === elementType)) {\n return false\n }\n }\n\n if (autocaptureConfig?.css_selector_allowlist) {\n const allowlist = autocaptureConfig.css_selector_allowlist\n if (allowlist && !allowlist.some((selector) => el.matches(selector))) {\n return false\n }\n }\n\n let parentIsUsefulElement = false\n const targetElementList: Element[] = [el] // TODO: remove this var, it's never queried\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 = (curEl.parentNode as Element) || false\n if (!parentNode) break\n if (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 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 event.type === 'submit'\n case 'input':\n return event.type === 'change' || event.type === 'click'\n case 'select':\n case 'textarea':\n return event.type === 'change' || event.type === 'click'\n default:\n if (parentIsUsefulElement) return event.type === 'click'\n return (\n event.type === 'click' &&\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 = getClassName(curEl).split(' ')\n if (_includes(classes, 'ph-sensitive') || _includes(classes, 'ph-no-capture')) {\n return false\n }\n }\n\n if (_includes(getClassName(el).split(' '), 'ph-include')) {\n return true\n }\n\n // don't include hidden or password fields\n const type = (el as HTMLInputElement).type || ''\n if (typeof type === 'string') {\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 (typeof name === 'string') {\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/*\n * Check whether a string value should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureValue(value: string): boolean {\n if (value === null || _isUndefined(value)) {\n return false\n }\n\n if (typeof value === 'string') {\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 =\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((value || '').replace(/[- ]/g, ''))) {\n return false\n }\n\n // check to see if input value looks like a social security number\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/\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 (typeof attributeName === 'string') {\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 console.error(e)\n }\n }\n })\n }\n return text\n}\n"]}
1
+ {"version":3,"file":"autocapture-utils.js","sourceRoot":"","sources":["../../src/autocapture-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n * @param {Element} el - element to get the className of\n * @returns {string} the element's class\n */\nimport { AutocaptureConfig } from 'types'\nimport { _each, _includes, _isUndefined, _trim, logger } from './utils'\n\nexport function getClassName(el: Element): string {\n switch (typeof el.className) {\n case 'string':\n return el.className\n // TODO: when is this ever used?\n case 'object': // handle cases where className might be SVGAnimatedString or some other type\n return ('baseVal' in el.className ? (el.className as any).baseVal : null) || el.getAttribute('class') || ''\n default:\n // future proof\n return ''\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 += _trim(child.textContent)\n // scrub potentially sensitive values\n .split(/(\\s+)/)\n .filter(shouldCaptureValue)\n .join('')\n // normalize whitespace\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n // truncate\n .substring(0, 255)\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: Element | undefined | null): el is HTMLElement {\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 * 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 * @returns {boolean} whether the event should be captured\n */\nexport function shouldCaptureDomEvent(\n el: Element,\n event: Event,\n autocaptureConfig: AutocaptureConfig | undefined = undefined\n): boolean {\n if (!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 if (autocaptureConfig?.element_allowlist) {\n const allowlist = autocaptureConfig.element_allowlist\n if (allowlist && !allowlist.some((elementType) => el.tagName.toLowerCase() === elementType)) {\n return false\n }\n }\n\n if (autocaptureConfig?.css_selector_allowlist) {\n const allowlist = autocaptureConfig.css_selector_allowlist\n if (allowlist && !allowlist.some((selector) => el.matches(selector))) {\n return false\n }\n }\n\n let parentIsUsefulElement = false\n const targetElementList: Element[] = [el] // TODO: remove this var, it's never queried\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 = (curEl.parentNode as Element) || false\n if (!parentNode) break\n if (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 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 event.type === 'submit'\n case 'input':\n return event.type === 'change' || event.type === 'click'\n case 'select':\n case 'textarea':\n return event.type === 'change' || event.type === 'click'\n default:\n if (parentIsUsefulElement) return event.type === 'click'\n return (\n event.type === 'click' &&\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 = getClassName(curEl).split(' ')\n if (_includes(classes, 'ph-sensitive') || _includes(classes, 'ph-no-capture')) {\n return false\n }\n }\n\n if (_includes(getClassName(el).split(' '), 'ph-include')) {\n return true\n }\n\n // don't include hidden or password fields\n const type = (el as HTMLInputElement).type || ''\n if (typeof type === 'string') {\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 (typeof name === 'string') {\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/*\n * Check whether a string value should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureValue(value: string): boolean {\n if (value === null || _isUndefined(value)) {\n return false\n }\n\n if (typeof value === 'string') {\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 =\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((value || '').replace(/[- ]/g, ''))) {\n return false\n }\n\n // check to see if input value looks like a social security number\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/\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 (typeof attributeName === 'string') {\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"]}
@@ -248,7 +248,7 @@ var autocapture = {
248
248
  var _a;
249
249
  var token = instance.config.token;
250
250
  if (this._initializedTokens.indexOf(token) > -1) {
251
- logger.log('autocapture already initialized for token "' + token + '"');
251
+ logger.info('autocapture already initialized for token "' + token + '"');
252
252
  return;
253
253
  }
254
254
  if (instance.persistence) {
@@ -1 +1 @@
1
- {"version":3,"file":"autocapture.js","sourceRoot":"","sources":["../../src/autocapture.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n _bind_instance_methods,\n _each,\n _extend,\n _includes,\n _isFunction,\n _isUndefined,\n _register_event,\n _safewrap_instance_methods,\n logger,\n} from './utils'\nimport {\n getClassName,\n getSafeText,\n isElementNode,\n isSensitiveElement,\n isTag,\n isTextNode,\n shouldCaptureDomEvent,\n shouldCaptureElement,\n shouldCaptureValue,\n autocaptureCompatibleElements,\n isAngularStyleAttr,\n isDocumentFragment,\n getDirectAndNestedSpanText,\n} from './autocapture-utils'\nimport RageClick from './extensions/rageclick'\nimport { AutocaptureConfig, AutoCaptureCustomProperty, DecideResponse, Properties } from './types'\nimport { PostHog } from './posthog-core'\nimport { AUTOCAPTURE_DISABLED_SERVER_SIDE } from './constants'\n\nfunction limitText(length: number, text: string): string {\n if (text.length > length) {\n return text.slice(0, length) + '...'\n }\n return text\n}\n\nconst autocapture = {\n _initializedTokens: [] as string[],\n _isDisabledServerSide: null as boolean | null,\n _isAutocaptureEnabled: false as boolean,\n\n _setIsAutocaptureEnabled: function (instance: PostHog): void {\n const disabled_server_side =\n this._isDisabledServerSide === null\n ? !!instance.persistence?.props[AUTOCAPTURE_DISABLED_SERVER_SIDE]\n : this._isDisabledServerSide\n const enabled_client_side = !!instance.config.autocapture\n this._isAutocaptureEnabled = enabled_client_side && !disabled_server_side\n },\n\n _previousElementSibling: function (el: Element): Element | null {\n if (el.previousElementSibling) {\n return el.previousElementSibling\n } else {\n let _el: Element | null = el\n do {\n _el = _el.previousSibling as Element | null // resolves to ChildNode->Node, which is Element's parent class\n } while (_el && !isElementNode(_el))\n return _el\n }\n },\n\n _getAugmentPropertiesFromElement: function (elem: Element): Properties {\n const shouldCaptureEl = shouldCaptureElement(elem)\n if (!shouldCaptureEl) {\n return {}\n }\n\n const props: Properties = {}\n\n _each(elem.attributes, function (attr: Attr) {\n if (attr.name.indexOf('data-ph-capture-attribute') === 0) {\n const propertyKey = attr.name.replace('data-ph-capture-attribute-', '')\n const propertyValue = attr.value\n if (propertyKey && propertyValue && shouldCaptureValue(propertyValue)) {\n props[propertyKey] = propertyValue\n }\n }\n })\n return props\n },\n\n _getPropertiesFromElement: function (elem: Element, maskInputs: boolean, maskText: boolean): Properties {\n const tag_name = elem.tagName.toLowerCase()\n const props: Properties = {\n tag_name: tag_name,\n }\n if (autocaptureCompatibleElements.indexOf(tag_name) > -1 && !maskText) {\n if (tag_name.toLowerCase() === 'a' || tag_name.toLowerCase() === 'button') {\n props['$el_text'] = limitText(1024, getDirectAndNestedSpanText(elem))\n } else {\n props['$el_text'] = limitText(1024, getSafeText(elem))\n }\n }\n\n const classes = getClassName(elem)\n if (classes.length > 0)\n props['classes'] = classes.split(' ').filter(function (c) {\n return c !== ''\n })\n\n // capture the deny list here because this not-a-class class makes it tricky to use this.config in the function below\n const elementAttributeIgnorelist = this.config?.element_attribute_ignorelist\n _each(elem.attributes, function (attr: Attr) {\n // Only capture attributes we know are safe\n if (isSensitiveElement(elem) && ['name', 'id', 'class'].indexOf(attr.name) === -1) return\n\n if (elementAttributeIgnorelist?.includes(attr.name)) return\n\n if (!maskInputs && shouldCaptureValue(attr.value) && !isAngularStyleAttr(attr.name)) {\n props['attr__' + attr.name] = limitText(1024, attr.value)\n }\n })\n\n let nthChild = 1\n let nthOfType = 1\n let currentElem: Element | null = elem\n while ((currentElem = this._previousElementSibling(currentElem))) {\n // eslint-disable-line no-cond-assign\n nthChild++\n if (currentElem.tagName === elem.tagName) {\n nthOfType++\n }\n }\n props['nth_child'] = nthChild\n props['nth_of_type'] = nthOfType\n\n return props\n },\n\n _getDefaultProperties: function (eventType: string): Properties {\n return {\n $event_type: eventType,\n $ce_version: 1,\n }\n },\n\n _extractCustomPropertyValue: function (customProperty: AutoCaptureCustomProperty): string {\n const propValues: string[] = []\n _each(document.querySelectorAll(customProperty['css_selector']), function (matchedElem) {\n let value\n\n if (['input', 'select'].indexOf(matchedElem.tagName.toLowerCase()) > -1) {\n value = matchedElem['value']\n } else if (matchedElem['textContent']) {\n value = matchedElem['textContent']\n }\n\n if (shouldCaptureValue(value)) {\n propValues.push(value)\n }\n })\n return propValues.join(', ')\n },\n\n // TODO: delete custom_properties after changeless typescript refactor\n _getCustomProperties: function (targetElementList: Element[]): Properties {\n const props: Properties = {} // will be deleted\n _each(this._customProperties, (customProperty) => {\n _each(customProperty['event_selectors'], (eventSelector) => {\n const eventElements = document.querySelectorAll(eventSelector)\n _each(eventElements, (eventElement) => {\n if (_includes(targetElementList, eventElement) && shouldCaptureElement(eventElement)) {\n props[customProperty['name']] = this._extractCustomPropertyValue(customProperty)\n }\n })\n })\n })\n return props\n },\n\n _getEventTarget: function (e: Event): Element | null {\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes\n if (typeof e.target === 'undefined') {\n return (e.srcElement as Element) || null\n } else {\n if ((e.target as HTMLElement)?.shadowRoot) {\n return (e.composedPath()[0] as Element) || null\n }\n return (e.target as Element) || null\n }\n },\n\n _captureEvent: function (e: Event, instance: PostHog, eventName = '$autocapture'): boolean | void {\n /*** Don't mess with this code without running IE8 tests on it ***/\n let target = this._getEventTarget(e)\n if (isTextNode(target)) {\n // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html)\n target = (target.parentNode || null) as Element | null\n }\n\n if (eventName === '$autocapture' && e.type === 'click' && e instanceof MouseEvent) {\n if (this.rageclicks?.isRageClick(e.clientX, e.clientY, new Date().getTime())) {\n this._captureEvent(e, instance, '$rageclick')\n }\n }\n\n if (target && shouldCaptureDomEvent(target, e, this.config)) {\n const targetElementList = [target]\n let curEl = target\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n targetElementList.push(curEl.parentNode as Element)\n curEl = curEl.parentNode as Element\n }\n\n const elementsJson: Properties[] = []\n const autocaptureAugmentProperties: Properties = {}\n let href,\n explicitNoCapture = false\n _each(targetElementList, (el) => {\n const shouldCaptureEl = shouldCaptureElement(el)\n\n // if the element or a parent element is an anchor tag\n // include the href as a property\n if (el.tagName.toLowerCase() === 'a') {\n href = el.getAttribute('href')\n href = shouldCaptureEl && shouldCaptureValue(href) && href\n }\n\n // allow users to programmatically prevent capturing of elements by adding class 'ph-no-capture'\n const classes = getClassName(el).split(' ')\n if (_includes(classes, 'ph-no-capture')) {\n explicitNoCapture = true\n }\n\n elementsJson.push(\n this._getPropertiesFromElement(\n el,\n instance.config.mask_all_element_attributes,\n instance.config.mask_all_text\n )\n )\n\n const augmentProperties = this._getAugmentPropertiesFromElement(el)\n _extend(autocaptureAugmentProperties, augmentProperties)\n })\n\n if (!instance.config.mask_all_text) {\n // if the element is a button or anchor tag get the span text from any\n // children and include it as/with the text property on the parent element\n if (target.tagName.toLowerCase() === 'a' || target.tagName.toLowerCase() === 'button') {\n elementsJson[0]['$el_text'] = getDirectAndNestedSpanText(target)\n } else {\n elementsJson[0]['$el_text'] = getSafeText(target)\n }\n }\n\n if (href) {\n elementsJson[0]['attr__href'] = href\n }\n\n if (explicitNoCapture) {\n return false\n }\n\n const props = _extend(\n this._getDefaultProperties(e.type),\n {\n $elements: elementsJson,\n },\n elementsJson[0]?.['$el_text'] ? { $el_text: elementsJson[0]?.['$el_text'] } : {},\n this._getCustomProperties(targetElementList),\n autocaptureAugmentProperties\n )\n\n instance.capture(eventName, props)\n return true\n }\n },\n\n // only reason is to stub for unit tests\n // since you can't override window.location props\n _navigate: function (href: string): void {\n window.location.href = href\n },\n\n _addDomEventHandlers: function (instance: PostHog): void {\n const handler = (e: Event) => {\n e = e || window.event\n this._captureEvent(e, instance)\n }\n _register_event(document, 'submit', handler, false, true)\n _register_event(document, 'change', handler, false, true)\n _register_event(document, 'click', handler, false, true)\n },\n\n _customProperties: [] as AutoCaptureCustomProperty[],\n rageclicks: null as RageClick | null,\n config: undefined as AutocaptureConfig | undefined,\n\n init: function (instance: PostHog): void {\n if (typeof instance.__autocapture !== 'boolean') {\n this.config = instance.__autocapture\n }\n\n // precompile the regex\n if (this.config?.url_allowlist) {\n this.config.url_allowlist = this.config.url_allowlist.map((url) => new RegExp(url))\n }\n\n this.rageclicks = new RageClick(instance.config.rageclick)\n },\n\n afterDecideResponse: function (response: DecideResponse, instance: PostHog): void {\n const token = instance.config.token\n if (this._initializedTokens.indexOf(token) > -1) {\n logger.log('autocapture already initialized for token \"' + token + '\"')\n return\n }\n\n if (instance.persistence) {\n instance.persistence.register({\n [AUTOCAPTURE_DISABLED_SERVER_SIDE]: !!response['autocapture_opt_out'],\n })\n }\n // store this in-memory incase persistence is disabled\n this._isDisabledServerSide = !!response['autocapture_opt_out']\n\n this._setIsAutocaptureEnabled(instance)\n\n this._initializedTokens.push(token)\n\n if (\n response &&\n response['config'] &&\n response['config']['enable_collect_everything'] &&\n this._isAutocaptureEnabled\n ) {\n // TODO: delete custom_properties after changeless typescript refactor\n if (response['custom_properties']) {\n this._customProperties = response['custom_properties']\n }\n this._addDomEventHandlers(instance)\n } else {\n instance['__autocapture'] = false\n }\n },\n\n // this is a mechanism to ramp up CE with no server-side interaction.\n // when CE is active, every page load results in a decide request. we\n // need to gently ramp this up so we don't overload decide. this decides\n // deterministically if CE is enabled for this project by modding the char\n // value of the project token.\n enabledForProject: function (\n token: string | null | undefined,\n numBuckets: number,\n numEnabledBuckets: number\n ): boolean {\n if (!token) {\n return true\n }\n numBuckets = !_isUndefined(numBuckets) ? numBuckets : 10\n numEnabledBuckets = !_isUndefined(numEnabledBuckets) ? numEnabledBuckets : 10\n let charCodeSum = 0\n for (let i = 0; i < token.length; i++) {\n charCodeSum += token.charCodeAt(i)\n }\n return charCodeSum % numBuckets < numEnabledBuckets\n },\n\n isBrowserSupported: function (): boolean {\n return _isFunction(document.querySelectorAll)\n },\n}\n\n_bind_instance_methods(autocapture)\n_safewrap_instance_methods(autocapture)\n\nexport { autocapture }\n"]}
1
+ {"version":3,"file":"autocapture.js","sourceRoot":"","sources":["../../src/autocapture.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n _bind_instance_methods,\n _each,\n _extend,\n _includes,\n _isFunction,\n _isUndefined,\n _register_event,\n _safewrap_instance_methods,\n logger,\n} from './utils'\nimport {\n getClassName,\n getSafeText,\n isElementNode,\n isSensitiveElement,\n isTag,\n isTextNode,\n shouldCaptureDomEvent,\n shouldCaptureElement,\n shouldCaptureValue,\n autocaptureCompatibleElements,\n isAngularStyleAttr,\n isDocumentFragment,\n getDirectAndNestedSpanText,\n} from './autocapture-utils'\nimport RageClick from './extensions/rageclick'\nimport { AutocaptureConfig, AutoCaptureCustomProperty, DecideResponse, Properties } from './types'\nimport { PostHog } from './posthog-core'\nimport { AUTOCAPTURE_DISABLED_SERVER_SIDE } from './constants'\n\nfunction limitText(length: number, text: string): string {\n if (text.length > length) {\n return text.slice(0, length) + '...'\n }\n return text\n}\n\nconst autocapture = {\n _initializedTokens: [] as string[],\n _isDisabledServerSide: null as boolean | null,\n _isAutocaptureEnabled: false as boolean,\n\n _setIsAutocaptureEnabled: function (instance: PostHog): void {\n const disabled_server_side =\n this._isDisabledServerSide === null\n ? !!instance.persistence?.props[AUTOCAPTURE_DISABLED_SERVER_SIDE]\n : this._isDisabledServerSide\n const enabled_client_side = !!instance.config.autocapture\n this._isAutocaptureEnabled = enabled_client_side && !disabled_server_side\n },\n\n _previousElementSibling: function (el: Element): Element | null {\n if (el.previousElementSibling) {\n return el.previousElementSibling\n } else {\n let _el: Element | null = el\n do {\n _el = _el.previousSibling as Element | null // resolves to ChildNode->Node, which is Element's parent class\n } while (_el && !isElementNode(_el))\n return _el\n }\n },\n\n _getAugmentPropertiesFromElement: function (elem: Element): Properties {\n const shouldCaptureEl = shouldCaptureElement(elem)\n if (!shouldCaptureEl) {\n return {}\n }\n\n const props: Properties = {}\n\n _each(elem.attributes, function (attr: Attr) {\n if (attr.name.indexOf('data-ph-capture-attribute') === 0) {\n const propertyKey = attr.name.replace('data-ph-capture-attribute-', '')\n const propertyValue = attr.value\n if (propertyKey && propertyValue && shouldCaptureValue(propertyValue)) {\n props[propertyKey] = propertyValue\n }\n }\n })\n return props\n },\n\n _getPropertiesFromElement: function (elem: Element, maskInputs: boolean, maskText: boolean): Properties {\n const tag_name = elem.tagName.toLowerCase()\n const props: Properties = {\n tag_name: tag_name,\n }\n if (autocaptureCompatibleElements.indexOf(tag_name) > -1 && !maskText) {\n if (tag_name.toLowerCase() === 'a' || tag_name.toLowerCase() === 'button') {\n props['$el_text'] = limitText(1024, getDirectAndNestedSpanText(elem))\n } else {\n props['$el_text'] = limitText(1024, getSafeText(elem))\n }\n }\n\n const classes = getClassName(elem)\n if (classes.length > 0)\n props['classes'] = classes.split(' ').filter(function (c) {\n return c !== ''\n })\n\n // capture the deny list here because this not-a-class class makes it tricky to use this.config in the function below\n const elementAttributeIgnorelist = this.config?.element_attribute_ignorelist\n _each(elem.attributes, function (attr: Attr) {\n // Only capture attributes we know are safe\n if (isSensitiveElement(elem) && ['name', 'id', 'class'].indexOf(attr.name) === -1) return\n\n if (elementAttributeIgnorelist?.includes(attr.name)) return\n\n if (!maskInputs && shouldCaptureValue(attr.value) && !isAngularStyleAttr(attr.name)) {\n props['attr__' + attr.name] = limitText(1024, attr.value)\n }\n })\n\n let nthChild = 1\n let nthOfType = 1\n let currentElem: Element | null = elem\n while ((currentElem = this._previousElementSibling(currentElem))) {\n // eslint-disable-line no-cond-assign\n nthChild++\n if (currentElem.tagName === elem.tagName) {\n nthOfType++\n }\n }\n props['nth_child'] = nthChild\n props['nth_of_type'] = nthOfType\n\n return props\n },\n\n _getDefaultProperties: function (eventType: string): Properties {\n return {\n $event_type: eventType,\n $ce_version: 1,\n }\n },\n\n _extractCustomPropertyValue: function (customProperty: AutoCaptureCustomProperty): string {\n const propValues: string[] = []\n _each(document.querySelectorAll(customProperty['css_selector']), function (matchedElem) {\n let value\n\n if (['input', 'select'].indexOf(matchedElem.tagName.toLowerCase()) > -1) {\n value = matchedElem['value']\n } else if (matchedElem['textContent']) {\n value = matchedElem['textContent']\n }\n\n if (shouldCaptureValue(value)) {\n propValues.push(value)\n }\n })\n return propValues.join(', ')\n },\n\n // TODO: delete custom_properties after changeless typescript refactor\n _getCustomProperties: function (targetElementList: Element[]): Properties {\n const props: Properties = {} // will be deleted\n _each(this._customProperties, (customProperty) => {\n _each(customProperty['event_selectors'], (eventSelector) => {\n const eventElements = document.querySelectorAll(eventSelector)\n _each(eventElements, (eventElement) => {\n if (_includes(targetElementList, eventElement) && shouldCaptureElement(eventElement)) {\n props[customProperty['name']] = this._extractCustomPropertyValue(customProperty)\n }\n })\n })\n })\n return props\n },\n\n _getEventTarget: function (e: Event): Element | null {\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes\n if (typeof e.target === 'undefined') {\n return (e.srcElement as Element) || null\n } else {\n if ((e.target as HTMLElement)?.shadowRoot) {\n return (e.composedPath()[0] as Element) || null\n }\n return (e.target as Element) || null\n }\n },\n\n _captureEvent: function (e: Event, instance: PostHog, eventName = '$autocapture'): boolean | void {\n /*** Don't mess with this code without running IE8 tests on it ***/\n let target = this._getEventTarget(e)\n if (isTextNode(target)) {\n // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html)\n target = (target.parentNode || null) as Element | null\n }\n\n if (eventName === '$autocapture' && e.type === 'click' && e instanceof MouseEvent) {\n if (this.rageclicks?.isRageClick(e.clientX, e.clientY, new Date().getTime())) {\n this._captureEvent(e, instance, '$rageclick')\n }\n }\n\n if (target && shouldCaptureDomEvent(target, e, this.config)) {\n const targetElementList = [target]\n let curEl = target\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n targetElementList.push(curEl.parentNode as Element)\n curEl = curEl.parentNode as Element\n }\n\n const elementsJson: Properties[] = []\n const autocaptureAugmentProperties: Properties = {}\n let href,\n explicitNoCapture = false\n _each(targetElementList, (el) => {\n const shouldCaptureEl = shouldCaptureElement(el)\n\n // if the element or a parent element is an anchor tag\n // include the href as a property\n if (el.tagName.toLowerCase() === 'a') {\n href = el.getAttribute('href')\n href = shouldCaptureEl && shouldCaptureValue(href) && href\n }\n\n // allow users to programmatically prevent capturing of elements by adding class 'ph-no-capture'\n const classes = getClassName(el).split(' ')\n if (_includes(classes, 'ph-no-capture')) {\n explicitNoCapture = true\n }\n\n elementsJson.push(\n this._getPropertiesFromElement(\n el,\n instance.config.mask_all_element_attributes,\n instance.config.mask_all_text\n )\n )\n\n const augmentProperties = this._getAugmentPropertiesFromElement(el)\n _extend(autocaptureAugmentProperties, augmentProperties)\n })\n\n if (!instance.config.mask_all_text) {\n // if the element is a button or anchor tag get the span text from any\n // children and include it as/with the text property on the parent element\n if (target.tagName.toLowerCase() === 'a' || target.tagName.toLowerCase() === 'button') {\n elementsJson[0]['$el_text'] = getDirectAndNestedSpanText(target)\n } else {\n elementsJson[0]['$el_text'] = getSafeText(target)\n }\n }\n\n if (href) {\n elementsJson[0]['attr__href'] = href\n }\n\n if (explicitNoCapture) {\n return false\n }\n\n const props = _extend(\n this._getDefaultProperties(e.type),\n {\n $elements: elementsJson,\n },\n elementsJson[0]?.['$el_text'] ? { $el_text: elementsJson[0]?.['$el_text'] } : {},\n this._getCustomProperties(targetElementList),\n autocaptureAugmentProperties\n )\n\n instance.capture(eventName, props)\n return true\n }\n },\n\n // only reason is to stub for unit tests\n // since you can't override window.location props\n _navigate: function (href: string): void {\n window.location.href = href\n },\n\n _addDomEventHandlers: function (instance: PostHog): void {\n const handler = (e: Event) => {\n e = e || window.event\n this._captureEvent(e, instance)\n }\n _register_event(document, 'submit', handler, false, true)\n _register_event(document, 'change', handler, false, true)\n _register_event(document, 'click', handler, false, true)\n },\n\n _customProperties: [] as AutoCaptureCustomProperty[],\n rageclicks: null as RageClick | null,\n config: undefined as AutocaptureConfig | undefined,\n\n init: function (instance: PostHog): void {\n if (typeof instance.__autocapture !== 'boolean') {\n this.config = instance.__autocapture\n }\n\n // precompile the regex\n if (this.config?.url_allowlist) {\n this.config.url_allowlist = this.config.url_allowlist.map((url) => new RegExp(url))\n }\n\n this.rageclicks = new RageClick(instance.config.rageclick)\n },\n\n afterDecideResponse: function (response: DecideResponse, instance: PostHog): void {\n const token = instance.config.token\n if (this._initializedTokens.indexOf(token) > -1) {\n logger.info('autocapture already initialized for token \"' + token + '\"')\n return\n }\n\n if (instance.persistence) {\n instance.persistence.register({\n [AUTOCAPTURE_DISABLED_SERVER_SIDE]: !!response['autocapture_opt_out'],\n })\n }\n // store this in-memory incase persistence is disabled\n this._isDisabledServerSide = !!response['autocapture_opt_out']\n\n this._setIsAutocaptureEnabled(instance)\n\n this._initializedTokens.push(token)\n\n if (\n response &&\n response['config'] &&\n response['config']['enable_collect_everything'] &&\n this._isAutocaptureEnabled\n ) {\n // TODO: delete custom_properties after changeless typescript refactor\n if (response['custom_properties']) {\n this._customProperties = response['custom_properties']\n }\n this._addDomEventHandlers(instance)\n } else {\n instance['__autocapture'] = false\n }\n },\n\n // this is a mechanism to ramp up CE with no server-side interaction.\n // when CE is active, every page load results in a decide request. we\n // need to gently ramp this up so we don't overload decide. this decides\n // deterministically if CE is enabled for this project by modding the char\n // value of the project token.\n enabledForProject: function (\n token: string | null | undefined,\n numBuckets: number,\n numEnabledBuckets: number\n ): boolean {\n if (!token) {\n return true\n }\n numBuckets = !_isUndefined(numBuckets) ? numBuckets : 10\n numEnabledBuckets = !_isUndefined(numEnabledBuckets) ? numEnabledBuckets : 10\n let charCodeSum = 0\n for (let i = 0; i < token.length; i++) {\n charCodeSum += token.charCodeAt(i)\n }\n return charCodeSum % numBuckets < numEnabledBuckets\n },\n\n isBrowserSupported: function (): boolean {\n return _isFunction(document.querySelectorAll)\n },\n}\n\n_bind_instance_methods(autocapture)\n_safewrap_instance_methods(autocapture)\n\nexport { autocapture }\n"]}
package/lib/src/decide.js CHANGED
@@ -10,7 +10,7 @@ var __values = (this && this.__values) || function(o) {
10
10
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
11
11
  };
12
12
  import { autocapture } from './autocapture';
13
- import { _base64Encode, loadScript } from './utils';
13
+ import { _base64Encode, loadScript, logger } from './utils';
14
14
  import { STORED_GROUP_PROPERTIES_KEY, STORED_PERSON_PROPERTIES_KEY } from './constants';
15
15
  var Decide = /** @class */ (function () {
16
16
  function Decide(instance) {
@@ -44,11 +44,11 @@ var Decide = /** @class */ (function () {
44
44
  // :TRICKY: Reload - start another request if queued!
45
45
  this.instance.featureFlags._startReloadTimer();
46
46
  if ((response === null || response === void 0 ? void 0 : response.status) === 0) {
47
- console.error('Failed to fetch feature flags from PostHog.');
47
+ logger.error('Failed to fetch feature flags from PostHog.');
48
48
  return;
49
49
  }
50
50
  if (!(document && document.body)) {
51
- console.log('document not ready yet, trying again in 500 milliseconds...');
51
+ logger.info('document not ready yet, trying again in 500 milliseconds...');
52
52
  setTimeout(function () {
53
53
  _this.parseDecideResponse(response);
54
54
  }, 500);
@@ -87,7 +87,7 @@ var Decide = /** @class */ (function () {
87
87
  if (response['surveys'] && !surveysGenerator) {
88
88
  loadScript(this.instance.config.api_host + "/static/surveys.js", function (err) {
89
89
  if (err) {
90
- return console.error("Could not load surveys script", err);
90
+ return logger.error("Could not load surveys script", err);
91
91
  }
92
92
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
93
93
  // @ts-ignore
@@ -105,7 +105,7 @@ var Decide = /** @class */ (function () {
105
105
  window["__$$ph_site_app_".concat(id)] = this_1.instance;
106
106
  loadScript(scriptUrl, function (err) {
107
107
  if (err) {
108
- console.error("Error while initializing PostHog app with config id ".concat(id), err);
108
+ logger.error("Error while initializing PostHog app with config id ".concat(id), err);
109
109
  }
110
110
  });
111
111
  };
@@ -125,7 +125,7 @@ var Decide = /** @class */ (function () {
125
125
  }
126
126
  }
127
127
  else if (response['siteApps'].length > 0) {
128
- console.error('PostHog site apps are disabled. Enable the "opt_in_site_apps" config to proceed.');
128
+ logger.error('PostHog site apps are disabled. Enable the "opt_in_site_apps" config to proceed.');
129
129
  }
130
130
  }
131
131
  };
@@ -1 +1 @@
1
- {"version":3,"file":"decide.js","sourceRoot":"","sources":["../../src/decide.ts"],"names":[],"mappings":"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","sourcesContent":["import { autocapture } from './autocapture'\nimport { _base64Encode, loadScript } from './utils'\nimport { PostHog } from './posthog-core'\nimport { Compression, DecideResponse } from './types'\nimport { STORED_GROUP_PROPERTIES_KEY, STORED_PERSON_PROPERTIES_KEY } from './constants'\n\nexport class Decide {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n // don't need to wait for `decide` to return if flags were provided on initialisation\n this.instance.decideEndpointWasHit = this.instance._hasBootstrappedFeatureFlags()\n }\n\n call(): void {\n /*\n Calls /decide endpoint to fetch options for autocapture, session recording, feature flags & compression.\n */\n const json_data = JSON.stringify({\n token: this.instance.config.token,\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n person_properties: this.instance.get_property(STORED_PERSON_PROPERTIES_KEY),\n group_properties: this.instance.get_property(STORED_GROUP_PROPERTIES_KEY),\n disable_flags:\n this.instance.config.advanced_disable_feature_flags ||\n this.instance.config.advanced_disable_feature_flags_on_first_load ||\n undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n `${this.instance.config.api_host}/decide/?v=3`,\n { data: encoded_data, verbose: true },\n { method: 'POST' },\n (response) => this.parseDecideResponse(response as DecideResponse)\n )\n }\n\n parseDecideResponse(response: DecideResponse): void {\n this.instance.featureFlags.setReloadingPaused(false)\n // :TRICKY: Reload - start another request if queued!\n this.instance.featureFlags._startReloadTimer()\n\n if (response?.status === 0) {\n console.error('Failed to fetch feature flags from PostHog.')\n return\n }\n if (!(document && document.body)) {\n console.log('document not ready yet, trying again in 500 milliseconds...')\n setTimeout(() => {\n this.parseDecideResponse(response)\n }, 500)\n return\n }\n\n this.instance.toolbar.afterDecideResponse(response)\n this.instance.sessionRecording?.afterDecideResponse(response)\n autocapture.afterDecideResponse(response, this.instance)\n this.instance.webPerformance?.afterDecideResponse(response)\n this.instance.exceptionAutocapture?.afterDecideResponse(response)\n\n if (!this.instance.config.advanced_disable_feature_flags_on_first_load) {\n this.instance.featureFlags.receivedFeatureFlags(response)\n }\n\n this.instance['compression'] = {}\n if (response['supportedCompression'] && !this.instance.config.disable_compression) {\n const compression: Partial<Record<Compression, boolean>> = {}\n for (const method of response['supportedCompression']) {\n compression[method] = true\n }\n this.instance['compression'] = compression\n }\n\n // Check if recorder.js is already loaded\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const surveysGenerator = window?.extendPostHogWithSurveys\n\n if (response['surveys'] && !surveysGenerator) {\n loadScript(this.instance.config.api_host + `/static/surveys.js`, (err) => {\n if (err) {\n return console.error(`Could not load surveys script`, err)\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.extendPostHogWithSurveys(this.instance)\n })\n }\n\n if (response['siteApps']) {\n if (this.instance.config.opt_in_site_apps) {\n const apiHost = this.instance.config.api_host\n for (const { id, url } of response['siteApps']) {\n const scriptUrl = [\n apiHost,\n apiHost[apiHost.length - 1] === '/' && url[0] === '/' ? url.substring(1) : url,\n ].join('')\n\n ;(window as any)[`__$$ph_site_app_${id}`] = this.instance\n\n loadScript(scriptUrl, (err) => {\n if (err) {\n console.error(`Error while initializing PostHog app with config id ${id}`, err)\n }\n })\n }\n } else if (response['siteApps'].length > 0) {\n console.error('PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.')\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"decide.js","sourceRoot":"","sources":["../../src/decide.ts"],"names":[],"mappings":"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","sourcesContent":["import { autocapture } from './autocapture'\nimport { _base64Encode, loadScript, logger } from './utils'\nimport { PostHog } from './posthog-core'\nimport { Compression, DecideResponse } from './types'\nimport { STORED_GROUP_PROPERTIES_KEY, STORED_PERSON_PROPERTIES_KEY } from './constants'\n\nexport class Decide {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n // don't need to wait for `decide` to return if flags were provided on initialisation\n this.instance.decideEndpointWasHit = this.instance._hasBootstrappedFeatureFlags()\n }\n\n call(): void {\n /*\n Calls /decide endpoint to fetch options for autocapture, session recording, feature flags & compression.\n */\n const json_data = JSON.stringify({\n token: this.instance.config.token,\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n person_properties: this.instance.get_property(STORED_PERSON_PROPERTIES_KEY),\n group_properties: this.instance.get_property(STORED_GROUP_PROPERTIES_KEY),\n disable_flags:\n this.instance.config.advanced_disable_feature_flags ||\n this.instance.config.advanced_disable_feature_flags_on_first_load ||\n undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n `${this.instance.config.api_host}/decide/?v=3`,\n { data: encoded_data, verbose: true },\n { method: 'POST' },\n (response) => this.parseDecideResponse(response as DecideResponse)\n )\n }\n\n parseDecideResponse(response: DecideResponse): void {\n this.instance.featureFlags.setReloadingPaused(false)\n // :TRICKY: Reload - start another request if queued!\n this.instance.featureFlags._startReloadTimer()\n\n if (response?.status === 0) {\n logger.error('Failed to fetch feature flags from PostHog.')\n return\n }\n if (!(document && document.body)) {\n logger.info('document not ready yet, trying again in 500 milliseconds...')\n setTimeout(() => {\n this.parseDecideResponse(response)\n }, 500)\n return\n }\n\n this.instance.toolbar.afterDecideResponse(response)\n this.instance.sessionRecording?.afterDecideResponse(response)\n autocapture.afterDecideResponse(response, this.instance)\n this.instance.webPerformance?.afterDecideResponse(response)\n this.instance.exceptionAutocapture?.afterDecideResponse(response)\n\n if (!this.instance.config.advanced_disable_feature_flags_on_first_load) {\n this.instance.featureFlags.receivedFeatureFlags(response)\n }\n\n this.instance['compression'] = {}\n if (response['supportedCompression'] && !this.instance.config.disable_compression) {\n const compression: Partial<Record<Compression, boolean>> = {}\n for (const method of response['supportedCompression']) {\n compression[method] = true\n }\n this.instance['compression'] = compression\n }\n\n // Check if recorder.js is already loaded\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const surveysGenerator = window?.extendPostHogWithSurveys\n\n if (response['surveys'] && !surveysGenerator) {\n loadScript(this.instance.config.api_host + `/static/surveys.js`, (err) => {\n if (err) {\n return logger.error(`Could not load surveys script`, err)\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.extendPostHogWithSurveys(this.instance)\n })\n }\n\n if (response['siteApps']) {\n if (this.instance.config.opt_in_site_apps) {\n const apiHost = this.instance.config.api_host\n for (const { id, url } of response['siteApps']) {\n const scriptUrl = [\n apiHost,\n apiHost[apiHost.length - 1] === '/' && url[0] === '/' ? url.substring(1) : url,\n ].join('')\n\n ;(window as any)[`__$$ph_site_app_${id}`] = this.instance\n\n loadScript(scriptUrl, (err) => {\n if (err) {\n logger.error(`Error while initializing PostHog app with config id ${id}`, err)\n }\n })\n }\n } else if (response['siteApps'].length > 0) {\n logger.error('PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.')\n }\n }\n }\n}\n"]}
@@ -34,7 +34,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
34
34
  }
35
35
  return to.concat(ar || Array.prototype.slice.call(from));
36
36
  };
37
- import { window } from '../../utils';
37
+ import { logger, window } from '../../utils';
38
38
  import { errorToProperties, unhandledRejectionToProperties } from './error-conversion';
39
39
  import { isPrimitive } from './type-checking';
40
40
  var EXCEPTION_INGESTION_ENDPOINT = '/e/';
@@ -50,9 +50,7 @@ var ExceptionObserver = /** @class */ (function () {
50
50
  for (var _i = 0; _i < arguments.length; _i++) {
51
51
  args[_i] = arguments[_i];
52
52
  }
53
- if (this.instance.config.debug) {
54
- console.log.apply(console, __spreadArray(['PostHog.js [PostHog.ExceptionObserver]'], __read(args), false));
55
- }
53
+ logger.info.apply(logger, __spreadArray(['[ExceptionObserver]'], __read(args), false));
56
54
  };
57
55
  ExceptionObserver.prototype.startCapturing = function () {
58
56
  var _a;
@@ -91,7 +89,7 @@ var ExceptionObserver = /** @class */ (function () {
91
89
  window.onunhandledrejection.__POSTHOG_INSTRUMENTED__ = true;
92
90
  }
93
91
  catch (e) {
94
- console.error('PostHog failed to start exception autocapture', e);
92
+ logger.error('PostHog failed to start exception autocapture', e);
95
93
  this.stopCapturing();
96
94
  }
97
95
  };
@@ -1 +1 @@
1
- {"version":3,"file":"exception-autocapture.js","sourceRoot":"","sources":["../../../../src/extensions/exceptions/exception-autocapture.ts"],"names":[],"mappings":"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","sourcesContent":["import { window } from '../../utils'\nimport { PostHog } from '../../posthog-core'\nimport { DecideResponse, Properties } from '../../types'\nimport { ErrorEventArgs, ErrorProperties, errorToProperties, unhandledRejectionToProperties } from './error-conversion'\nimport { isPrimitive } from './type-checking'\n\nconst EXCEPTION_INGESTION_ENDPOINT = '/e/'\n\nexport class ExceptionObserver {\n instance: PostHog\n remoteEnabled: boolean | undefined\n private originalOnErrorHandler: typeof window['onerror'] | null | undefined = undefined\n private originalOnUnhandledRejectionHandler: typeof window['onunhandledrejection'] | null | undefined = undefined\n\n private errorsToIgnore: RegExp[] = []\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n private debugLog(...args: any[]) {\n if (this.instance.config.debug) {\n console.log('PostHog.js [PostHog.ExceptionObserver]', ...args)\n }\n }\n\n startCapturing() {\n if (!this.isEnabled() || (window.onerror as any)?.__POSTHOG_INSTRUMENTED__) {\n return\n }\n\n try {\n this.originalOnErrorHandler = window.onerror\n\n window.onerror = function (this: ExceptionObserver, ...args: ErrorEventArgs): boolean {\n this.captureException(args)\n\n if (this.originalOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnErrorHandler.apply(this, args)\n }\n\n return false\n }.bind(this)\n ;(window.onerror as any).__POSTHOG_INSTRUMENTED__ = true\n\n this.originalOnUnhandledRejectionHandler = window.onunhandledrejection\n\n window.onunhandledrejection = function (\n this: ExceptionObserver,\n ...args: [ev: PromiseRejectionEvent]\n ): boolean {\n const errorProperties: ErrorProperties = unhandledRejectionToProperties(args)\n this.sendExceptionEvent(errorProperties)\n\n if (this.originalOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnUnhandledRejectionHandler.apply(window, args)\n }\n\n return true\n }.bind(this)\n ;(window.onunhandledrejection as any).__POSTHOG_INSTRUMENTED__ = true\n } catch (e) {\n console.error('PostHog failed to start exception autocapture', e)\n this.stopCapturing()\n }\n }\n\n stopCapturing() {\n if (this.originalOnErrorHandler !== undefined) {\n window.onerror = this.originalOnErrorHandler\n this.originalOnErrorHandler = null\n }\n delete (window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n\n if (this.originalOnUnhandledRejectionHandler !== undefined) {\n window.onunhandledrejection = this.originalOnUnhandledRejectionHandler\n this.originalOnUnhandledRejectionHandler = null\n }\n delete (window.onunhandledrejection as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isCapturing() {\n return !!(window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isEnabled() {\n return this.remoteEnabled ?? false\n }\n\n afterDecideResponse(response: DecideResponse) {\n const autocaptureExceptionsResponse = response.autocaptureExceptions\n this.remoteEnabled = !!autocaptureExceptionsResponse || false\n if (\n !isPrimitive(autocaptureExceptionsResponse) &&\n 'errors_to_ignore' in autocaptureExceptionsResponse &&\n Array.isArray(autocaptureExceptionsResponse.errors_to_ignore)\n ) {\n const dropRules = autocaptureExceptionsResponse.errors_to_ignore\n\n this.errorsToIgnore = dropRules.map((rule) => {\n return new RegExp(rule)\n })\n }\n\n if (this.isEnabled()) {\n this.startCapturing()\n this.debugLog('Remote config for exception autocapture is enabled, starting', autocaptureExceptionsResponse)\n } else {\n this.debugLog(\n 'Remote config for exception autocapture is disabled, not starting',\n autocaptureExceptionsResponse\n )\n }\n }\n\n captureException(args: ErrorEventArgs, properties?: Properties) {\n const errorProperties = errorToProperties(args)\n\n if (this.errorsToIgnore.some((regex) => regex.test(errorProperties.$exception_message || ''))) {\n this.debugLog('Ignoring exception based on remote config', errorProperties)\n return\n }\n\n const propertiesToSend = { ...properties, ...errorProperties }\n\n const posthogHost = this.instance.config.ui_host || this.instance.config.api_host\n errorProperties.$exception_personURL = posthogHost + '/person/' + this.instance.get_distinct_id()\n\n this.sendExceptionEvent(propertiesToSend)\n }\n\n /**\n * :TRICKY: Make sure we batch these requests\n */\n sendExceptionEvent(properties: { [key: string]: any }) {\n this.instance.capture('$exception', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: EXCEPTION_INGESTION_ENDPOINT,\n _noTruncate: true,\n _batchKey: 'exceptionEvent',\n })\n }\n}\n"]}
1
+ {"version":3,"file":"exception-autocapture.js","sourceRoot":"","sources":["../../../../src/extensions/exceptions/exception-autocapture.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger, window } from '../../utils'\nimport { PostHog } from '../../posthog-core'\nimport { DecideResponse, Properties } from '../../types'\nimport { ErrorEventArgs, ErrorProperties, errorToProperties, unhandledRejectionToProperties } from './error-conversion'\nimport { isPrimitive } from './type-checking'\n\nconst EXCEPTION_INGESTION_ENDPOINT = '/e/'\n\nexport class ExceptionObserver {\n instance: PostHog\n remoteEnabled: boolean | undefined\n private originalOnErrorHandler: typeof window['onerror'] | null | undefined = undefined\n private originalOnUnhandledRejectionHandler: typeof window['onunhandledrejection'] | null | undefined = undefined\n\n private errorsToIgnore: RegExp[] = []\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n private debugLog(...args: any[]) {\n logger.info('[ExceptionObserver]', ...args)\n }\n\n startCapturing() {\n if (!this.isEnabled() || (window.onerror as any)?.__POSTHOG_INSTRUMENTED__) {\n return\n }\n\n try {\n this.originalOnErrorHandler = window.onerror\n\n window.onerror = function (this: ExceptionObserver, ...args: ErrorEventArgs): boolean {\n this.captureException(args)\n\n if (this.originalOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnErrorHandler.apply(this, args)\n }\n\n return false\n }.bind(this)\n ;(window.onerror as any).__POSTHOG_INSTRUMENTED__ = true\n\n this.originalOnUnhandledRejectionHandler = window.onunhandledrejection\n\n window.onunhandledrejection = function (\n this: ExceptionObserver,\n ...args: [ev: PromiseRejectionEvent]\n ): boolean {\n const errorProperties: ErrorProperties = unhandledRejectionToProperties(args)\n this.sendExceptionEvent(errorProperties)\n\n if (this.originalOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return this.originalOnUnhandledRejectionHandler.apply(window, args)\n }\n\n return true\n }.bind(this)\n ;(window.onunhandledrejection as any).__POSTHOG_INSTRUMENTED__ = true\n } catch (e) {\n logger.error('PostHog failed to start exception autocapture', e)\n this.stopCapturing()\n }\n }\n\n stopCapturing() {\n if (this.originalOnErrorHandler !== undefined) {\n window.onerror = this.originalOnErrorHandler\n this.originalOnErrorHandler = null\n }\n delete (window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n\n if (this.originalOnUnhandledRejectionHandler !== undefined) {\n window.onunhandledrejection = this.originalOnUnhandledRejectionHandler\n this.originalOnUnhandledRejectionHandler = null\n }\n delete (window.onunhandledrejection as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isCapturing() {\n return !!(window.onerror as any)?.__POSTHOG_INSTRUMENTED__\n }\n\n isEnabled() {\n return this.remoteEnabled ?? false\n }\n\n afterDecideResponse(response: DecideResponse) {\n const autocaptureExceptionsResponse = response.autocaptureExceptions\n this.remoteEnabled = !!autocaptureExceptionsResponse || false\n if (\n !isPrimitive(autocaptureExceptionsResponse) &&\n 'errors_to_ignore' in autocaptureExceptionsResponse &&\n Array.isArray(autocaptureExceptionsResponse.errors_to_ignore)\n ) {\n const dropRules = autocaptureExceptionsResponse.errors_to_ignore\n\n this.errorsToIgnore = dropRules.map((rule) => {\n return new RegExp(rule)\n })\n }\n\n if (this.isEnabled()) {\n this.startCapturing()\n this.debugLog('Remote config for exception autocapture is enabled, starting', autocaptureExceptionsResponse)\n } else {\n this.debugLog(\n 'Remote config for exception autocapture is disabled, not starting',\n autocaptureExceptionsResponse\n )\n }\n }\n\n captureException(args: ErrorEventArgs, properties?: Properties) {\n const errorProperties = errorToProperties(args)\n\n if (this.errorsToIgnore.some((regex) => regex.test(errorProperties.$exception_message || ''))) {\n this.debugLog('Ignoring exception based on remote config', errorProperties)\n return\n }\n\n const propertiesToSend = { ...properties, ...errorProperties }\n\n const posthogHost = this.instance.config.ui_host || this.instance.config.api_host\n errorProperties.$exception_personURL = posthogHost + '/person/' + this.instance.get_distinct_id()\n\n this.sendExceptionEvent(propertiesToSend)\n }\n\n /**\n * :TRICKY: Make sure we batch these requests\n */\n sendExceptionEvent(properties: { [key: string]: any }) {\n this.instance.capture('$exception', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: EXCEPTION_INGESTION_ENDPOINT,\n _noTruncate: true,\n _batchKey: 'exceptionEvent',\n })\n }\n}\n"]}
@@ -1,21 +1,3 @@
1
- /**
2
- * Extend Segment with extra PostHog JS functionality. Required for things like Recordings and feature flags to work correctly.
3
- *
4
- * ### Usage
5
- *
6
- * ```js
7
- * // After your standard segment anyalytics install
8
- * analytics.load("GOEDfA21zZTtR7clsBuDvmBKAtAdZ6Np");
9
- *
10
- * analytics.ready(() => {
11
- * posthog.init('<posthog-api-key>', {
12
- * capture_pageview: false,
13
- * segment: window.analytics, // NOTE: Be sure to use window.analytics here!
14
- * });
15
- * window.analytics.page();
16
- * })
17
- * ```
18
- */
19
1
  import { PostHog } from '../posthog-core';
20
2
  interface SegmentPluginContext {
21
3
  event: {
@@ -1,6 +1,25 @@
1
+ /**
2
+ * Extend Segment with extra PostHog JS functionality. Required for things like Recordings and feature flags to work correctly.
3
+ *
4
+ * ### Usage
5
+ *
6
+ * ```js
7
+ * // After your standard segment anyalytics install
8
+ * analytics.load("GOEDfA21zZTtR7clsBuDvmBKAtAdZ6Np");
9
+ *
10
+ * analytics.ready(() => {
11
+ * posthog.init('<posthog-api-key>', {
12
+ * capture_pageview: false,
13
+ * segment: window.analytics, // NOTE: Be sure to use window.analytics here!
14
+ * });
15
+ * window.analytics.page();
16
+ * })
17
+ * ```
18
+ */
19
+ import { logger } from '../utils';
1
20
  export var createSegmentIntegration = function (posthog) {
2
21
  if (!Promise || !Promise.resolve) {
3
- console.warn('This browser does not have Promise support, and can not use the segment integration');
22
+ logger.warn('This browser does not have Promise support, and can not use the segment integration');
4
23
  }
5
24
  var enrichEvent = function (ctx, eventName) {
6
25
  if (!ctx.event.userId && ctx.event.anonymousId !== posthog.get_distinct_id()) {
@@ -1 +1 @@
1
- {"version":3,"file":"segment-integration.js","sourceRoot":"","sources":["../../../src/extensions/segment-integration.ts"],"names":[],"mappings":"AA8CA,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAAC,OAAgB;IACrD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QAC9B,OAAO,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAA;KACtG;IAED,IAAM,WAAW,GAAG,UAAC,GAAyB,EAAE,SAAiB;QAC7D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,OAAO,CAAC,eAAe,EAAE,EAAE;YAC1E,wGAAwG;YACxG,OAAO,CAAC,KAAK,EAAE,CAAA;SAClB;QACD,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,eAAe,EAAE,EAAE;YACpE,OAAO,CAAC,QAAQ,CAAC;gBACb,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;aAChC,CAAC,CAAA;YACF,OAAO,CAAC,kBAAkB,EAAE,CAAA;SAC/B;QAED,IAAM,oBAAoB,GAAG,OAAO,CAAC,2BAA2B,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACjG,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,oBAAoB,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACpF,OAAO,GAAG,CAAA;IACd,CAAC,CAAA;IAED,OAAO;QACH,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,cAAM,OAAA,IAAI,EAAJ,CAAI;QACpB,+BAA+B;QAC/B,yCAAyC;QACzC,IAAI,EAAE,cAAM,OAAA,OAAO,CAAC,OAAO,EAAE,EAAjB,CAAiB;QAC7B,KAAK,EAAE,UAAC,GAAG,IAAK,OAAA,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAjC,CAAiC;QACjD,IAAI,EAAE,UAAC,GAAG,IAAK,OAAA,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,EAA7B,CAA6B;QAC5C,QAAQ,EAAE,UAAC,GAAG,IAAK,OAAA,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,EAA7B,CAA6B;QAChD,MAAM,EAAE,UAAC,GAAG,IAAK,OAAA,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,EAA3B,CAA2B;KAC/C,CAAA;AACL,CAAC,CAAA","sourcesContent":["/**\n * Extend Segment with extra PostHog JS functionality. Required for things like Recordings and feature flags to work correctly.\n *\n * ### Usage\n *\n * ```js\n * // After your standard segment anyalytics install\n * analytics.load(\"GOEDfA21zZTtR7clsBuDvmBKAtAdZ6Np\");\n *\n * analytics.ready(() => {\n * posthog.init('<posthog-api-key>', {\n * capture_pageview: false,\n * segment: window.analytics, // NOTE: Be sure to use window.analytics here!\n * });\n * window.analytics.page();\n * })\n * ```\n */\nimport { PostHog } from '../posthog-core'\n\n// Loosely based on https://github.com/segmentio/analytics-next/blob/master/packages/core/src/plugins/index.ts\ninterface SegmentPluginContext {\n event: {\n event: string\n userId?: string\n anonymousId?: string\n properties: any\n }\n}\n\ninterface SegmentPlugin {\n name: string\n version: string\n type: 'enrichment'\n isLoaded: () => boolean\n load: (ctx: SegmentPluginContext, instance: any, config?: any) => Promise<unknown>\n unload?: (ctx: SegmentPluginContext, instance: any) => Promise<unknown> | unknown\n ready?: () => Promise<unknown>\n track?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n identify?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n page?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n group?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n alias?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n screen?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n}\n\nexport const createSegmentIntegration = (posthog: PostHog): SegmentPlugin => {\n if (!Promise || !Promise.resolve) {\n console.warn('This browser does not have Promise support, and can not use the segment integration')\n }\n\n const enrichEvent = (ctx: SegmentPluginContext, eventName: string) => {\n if (!ctx.event.userId && ctx.event.anonymousId !== posthog.get_distinct_id()) {\n // This is our only way of detecting that segment's analytics.reset() has been called so we also call it\n posthog.reset()\n }\n if (ctx.event.userId && ctx.event.userId !== posthog.get_distinct_id()) {\n posthog.register({\n distinct_id: ctx.event.userId,\n })\n posthog.reloadFeatureFlags()\n }\n\n const additionalProperties = posthog._calculate_event_properties(eventName, ctx.event.properties)\n ctx.event.properties = Object.assign({}, additionalProperties, ctx.event.properties)\n return ctx\n }\n\n return {\n name: 'PostHog JS',\n type: 'enrichment',\n version: '1.0.0',\n isLoaded: () => true,\n // check and early return above\n // eslint-disable-next-line compat/compat\n load: () => Promise.resolve(),\n track: (ctx) => enrichEvent(ctx, ctx.event.event),\n page: (ctx) => enrichEvent(ctx, '$pageview'),\n identify: (ctx) => enrichEvent(ctx, '$identify'),\n screen: (ctx) => enrichEvent(ctx, '$screen'),\n }\n}\n"]}
1
+ {"version":3,"file":"segment-integration.js","sourceRoot":"","sources":["../../../src/extensions/segment-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AA6BjC,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAAC,OAAgB;IACrD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAA;KACrG;IAED,IAAM,WAAW,GAAG,UAAC,GAAyB,EAAE,SAAiB;QAC7D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,OAAO,CAAC,eAAe,EAAE,EAAE;YAC1E,wGAAwG;YACxG,OAAO,CAAC,KAAK,EAAE,CAAA;SAClB;QACD,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,eAAe,EAAE,EAAE;YACpE,OAAO,CAAC,QAAQ,CAAC;gBACb,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;aAChC,CAAC,CAAA;YACF,OAAO,CAAC,kBAAkB,EAAE,CAAA;SAC/B;QAED,IAAM,oBAAoB,GAAG,OAAO,CAAC,2BAA2B,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACjG,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,oBAAoB,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACpF,OAAO,GAAG,CAAA;IACd,CAAC,CAAA;IAED,OAAO;QACH,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,cAAM,OAAA,IAAI,EAAJ,CAAI;QACpB,+BAA+B;QAC/B,yCAAyC;QACzC,IAAI,EAAE,cAAM,OAAA,OAAO,CAAC,OAAO,EAAE,EAAjB,CAAiB;QAC7B,KAAK,EAAE,UAAC,GAAG,IAAK,OAAA,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAjC,CAAiC;QACjD,IAAI,EAAE,UAAC,GAAG,IAAK,OAAA,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,EAA7B,CAA6B;QAC5C,QAAQ,EAAE,UAAC,GAAG,IAAK,OAAA,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,EAA7B,CAA6B;QAChD,MAAM,EAAE,UAAC,GAAG,IAAK,OAAA,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,EAA3B,CAA2B;KAC/C,CAAA;AACL,CAAC,CAAA","sourcesContent":["/**\n * Extend Segment with extra PostHog JS functionality. Required for things like Recordings and feature flags to work correctly.\n *\n * ### Usage\n *\n * ```js\n * // After your standard segment anyalytics install\n * analytics.load(\"GOEDfA21zZTtR7clsBuDvmBKAtAdZ6Np\");\n *\n * analytics.ready(() => {\n * posthog.init('<posthog-api-key>', {\n * capture_pageview: false,\n * segment: window.analytics, // NOTE: Be sure to use window.analytics here!\n * });\n * window.analytics.page();\n * })\n * ```\n */\nimport { logger } from '../utils'\nimport { PostHog } from '../posthog-core'\n\n// Loosely based on https://github.com/segmentio/analytics-next/blob/master/packages/core/src/plugins/index.ts\ninterface SegmentPluginContext {\n event: {\n event: string\n userId?: string\n anonymousId?: string\n properties: any\n }\n}\n\ninterface SegmentPlugin {\n name: string\n version: string\n type: 'enrichment'\n isLoaded: () => boolean\n load: (ctx: SegmentPluginContext, instance: any, config?: any) => Promise<unknown>\n unload?: (ctx: SegmentPluginContext, instance: any) => Promise<unknown> | unknown\n ready?: () => Promise<unknown>\n track?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n identify?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n page?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n group?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n alias?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n screen?: (ctx: SegmentPluginContext) => Promise<SegmentPluginContext> | SegmentPluginContext\n}\n\nexport const createSegmentIntegration = (posthog: PostHog): SegmentPlugin => {\n if (!Promise || !Promise.resolve) {\n logger.warn('This browser does not have Promise support, and can not use the segment integration')\n }\n\n const enrichEvent = (ctx: SegmentPluginContext, eventName: string) => {\n if (!ctx.event.userId && ctx.event.anonymousId !== posthog.get_distinct_id()) {\n // This is our only way of detecting that segment's analytics.reset() has been called so we also call it\n posthog.reset()\n }\n if (ctx.event.userId && ctx.event.userId !== posthog.get_distinct_id()) {\n posthog.register({\n distinct_id: ctx.event.userId,\n })\n posthog.reloadFeatureFlags()\n }\n\n const additionalProperties = posthog._calculate_event_properties(eventName, ctx.event.properties)\n ctx.event.properties = Object.assign({}, additionalProperties, ctx.event.properties)\n return ctx\n }\n\n return {\n name: 'PostHog JS',\n type: 'enrichment',\n version: '1.0.0',\n isLoaded: () => true,\n // check and early return above\n // eslint-disable-next-line compat/compat\n load: () => Promise.resolve(),\n track: (ctx) => enrichEvent(ctx, ctx.event.event),\n page: (ctx) => enrichEvent(ctx, '$pageview'),\n identify: (ctx) => enrichEvent(ctx, '$identify'),\n screen: (ctx) => enrichEvent(ctx, '$screen'),\n }\n}\n"]}
@@ -7,12 +7,14 @@ export declare const RECORDING_MAX_EVENT_SIZE: number;
7
7
  export declare const RECORDING_BUFFER_TIMEOUT = 2000;
8
8
  export declare const SESSION_RECORDING_BATCH_KEY = "recordings";
9
9
  export declare class SessionRecording {
10
+ get lastActivityTimestamp(): number;
11
+ get endpoint(): string;
10
12
  private instance;
11
13
  private emit;
12
- private endpoint;
14
+ private _endpoint;
13
15
  private windowId;
14
16
  private sessionId;
15
- private lastActivityTimestamp;
17
+ private _lastActivityTimestamp;
16
18
  private flushBufferTimer?;
17
19
  private buffer?;
18
20
  private mutationRateLimiter?;
@@ -40,7 +40,7 @@ import { CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE, SESSION_RECORDING_ENABLED_SE
40
40
  import { ensureMaxMessageSize, FULL_SNAPSHOT_EVENT_TYPE, INCREMENTAL_SNAPSHOT_EVENT_TYPE, META_EVENT_TYPE, MutationRateLimiter, truncateLargeConsoleLogs, } from './sessionrecording-utils';
41
41
  import { EventType } from '@rrweb/types';
42
42
  import Config from '../config';
43
- import { logger, loadScript, _timestamp } from '../utils';
43
+ import { logger, loadScript, _timestamp, window } from '../utils';
44
44
  var BASE_ENDPOINT = '/s/';
45
45
  export var RECORDING_IDLE_ACTIVITY_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
46
46
  export var RECORDING_MAX_EVENT_SIZE = 1024 * 1024 * 0.9; // ~1mb (with some wiggle room)
@@ -82,13 +82,13 @@ var ACTIVE_SOURCES = [
82
82
  var SessionRecording = /** @class */ (function () {
83
83
  function SessionRecording(instance) {
84
84
  var _this = this;
85
- this.lastActivityTimestamp = Date.now();
85
+ this._lastActivityTimestamp = Date.now();
86
86
  this.isIdle = false;
87
87
  this.instance = instance;
88
88
  this.captureStarted = false;
89
89
  this.snapshots = [];
90
90
  this.emit = false; // Controls whether data is sent to the server or not
91
- this.endpoint = BASE_ENDPOINT;
91
+ this._endpoint = BASE_ENDPOINT;
92
92
  this.stopRrweb = undefined;
93
93
  this.windowId = null;
94
94
  this.sessionId = null;
@@ -97,6 +97,20 @@ var SessionRecording = /** @class */ (function () {
97
97
  _this._flushBuffer();
98
98
  });
99
99
  }
100
+ Object.defineProperty(SessionRecording.prototype, "lastActivityTimestamp", {
101
+ get: function () {
102
+ return this._lastActivityTimestamp;
103
+ },
104
+ enumerable: false,
105
+ configurable: true
106
+ });
107
+ Object.defineProperty(SessionRecording.prototype, "endpoint", {
108
+ get: function () {
109
+ return this._endpoint;
110
+ },
111
+ enumerable: false,
112
+ configurable: true
113
+ });
100
114
  SessionRecording.prototype.getSessionManager = function () {
101
115
  if (!this.instance.sessionManager) {
102
116
  logger.error('Session recording started without valid sessionManager');
@@ -150,7 +164,7 @@ var SessionRecording = /** @class */ (function () {
150
164
  _a));
151
165
  }
152
166
  if ((_d = response.sessionRecording) === null || _d === void 0 ? void 0 : _d.endpoint) {
153
- this.endpoint = (_e = response.sessionRecording) === null || _e === void 0 ? void 0 : _e.endpoint;
167
+ this._endpoint = (_e = response.sessionRecording) === null || _e === void 0 ? void 0 : _e.endpoint;
154
168
  }
155
169
  if ((_f = response.sessionRecording) === null || _f === void 0 ? void 0 : _f.recorderVersion) {
156
170
  this.recorderVersion = response.sessionRecording.recorderVersion;
@@ -238,12 +252,12 @@ var SessionRecording = /** @class */ (function () {
238
252
  var isUserInteraction = this._isInteractiveEvent(event);
239
253
  if (!isUserInteraction && !this.isIdle) {
240
254
  // We check if the lastActivityTimestamp is old enough to go idle
241
- if (event.timestamp - this.lastActivityTimestamp > RECORDING_IDLE_ACTIVITY_TIMEOUT_MS) {
255
+ if (event.timestamp - this._lastActivityTimestamp > RECORDING_IDLE_ACTIVITY_TIMEOUT_MS) {
242
256
  this.isIdle = true;
243
257
  }
244
258
  }
245
259
  if (isUserInteraction) {
246
- this.lastActivityTimestamp = event.timestamp;
260
+ this._lastActivityTimestamp = event.timestamp;
247
261
  if (this.isIdle) {
248
262
  // Remove the idle state if set and trigger a full snapshot as we will have ingored previous mutations
249
263
  this.isIdle = false;
@@ -331,7 +345,7 @@ var SessionRecording = /** @class */ (function () {
331
345
  (_b = this.mutationRateLimiter) !== null && _b !== void 0 ? _b : new MutationRateLimiter(this.rrwebRecord, {
332
346
  onBlockedNode: function (id, node) {
333
347
  var message = "Too many mutations on node '".concat(id, "'. Rate limiting. This could be due to SVG animations or something similar");
334
- logger.log(message, {
348
+ logger.info(message, {
335
349
  node: node,
336
350
  });
337
351
  _this.log('[PostHog Recorder] ' + message, 'warn');
@@ -361,7 +375,7 @@ var SessionRecording = /** @class */ (function () {
361
375
  }
362
376
  });
363
377
  // We reset the last activity timestamp, resetting the idle timer
364
- this.lastActivityTimestamp = Date.now();
378
+ this._lastActivityTimestamp = Date.now();
365
379
  this.isIdle = false;
366
380
  };
367
381
  SessionRecording.prototype.onRRwebEmit = function (rawEvent) {
@@ -454,7 +468,7 @@ var SessionRecording = /** @class */ (function () {
454
468
  this.instance.capture('$snapshot', properties, {
455
469
  transport: 'XHR',
456
470
  method: 'POST',
457
- endpoint: this.endpoint,
471
+ endpoint: this._endpoint,
458
472
  _noTruncate: true,
459
473
  _batchKey: SESSION_RECORDING_BATCH_KEY,
460
474
  _metrics: {