posthog-js 1.90.2 → 1.91.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/array.full.js +1 -1
- package/dist/array.full.js.map +1 -1
- package/dist/array.js +1 -1
- package/dist/array.js.map +1 -1
- package/dist/es.js +1 -1
- package/dist/es.js.map +1 -1
- package/dist/exception-autocapture.js +1 -1
- package/dist/exception-autocapture.js.map +1 -1
- package/dist/module.d.ts +3 -4
- package/dist/module.js +1 -1
- package/dist/module.js.map +1 -1
- package/dist/recorder-v2.js +1 -1
- package/dist/recorder-v2.js.map +1 -1
- package/dist/recorder.js +1 -1
- package/dist/recorder.js.map +1 -1
- package/dist/surveys.js +1 -1
- package/dist/surveys.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/src/autocapture-utils.js +2 -1
- package/lib/src/autocapture-utils.js.map +1 -1
- package/lib/src/autocapture.js +11 -4
- package/lib/src/autocapture.js.map +1 -1
- package/lib/src/decide.js +2 -1
- package/lib/src/decide.js.map +1 -1
- package/lib/src/extensions/exception-autocapture/index.js +6 -3
- package/lib/src/extensions/exception-autocapture/index.js.map +1 -1
- package/lib/src/extensions/replay/sessionrecording.js +8 -8
- package/lib/src/extensions/replay/sessionrecording.js.map +1 -1
- package/lib/src/extensions/replay/web-performance.js +1 -0
- package/lib/src/extensions/replay/web-performance.js.map +1 -1
- package/lib/src/extensions/surveys.js +10 -2
- package/lib/src/extensions/surveys.js.map +1 -1
- package/lib/src/extensions/toolbar.d.ts +2 -2
- package/lib/src/extensions/toolbar.js +16 -13
- package/lib/src/extensions/toolbar.js.map +1 -1
- package/lib/src/gdpr-utils.js +2 -2
- package/lib/src/gdpr-utils.js.map +1 -1
- package/lib/src/loader-exception-autocapture.js +4 -3
- package/lib/src/loader-exception-autocapture.js.map +1 -1
- package/lib/src/loader-recorder-v2.js +7 -4
- package/lib/src/loader-recorder-v2.js.map +1 -1
- package/lib/src/loader-recorder.js +6 -6
- package/lib/src/loader-recorder.js.map +1 -1
- package/lib/src/loader-surveys.js +5 -3
- package/lib/src/loader-surveys.js.map +1 -1
- package/lib/src/page-view.js +14 -11
- package/lib/src/page-view.js.map +1 -1
- package/lib/src/posthog-core.js +21 -22
- package/lib/src/posthog-core.js.map +1 -1
- package/lib/src/posthog-surveys.js +7 -4
- package/lib/src/posthog-surveys.js.map +1 -1
- package/lib/src/retry-queue.js +2 -1
- package/lib/src/retry-queue.js.map +1 -1
- package/lib/src/session-props.d.ts +1 -2
- package/lib/src/session-props.js +2 -2
- package/lib/src/session-props.js.map +1 -1
- package/lib/src/sessionid.js +1 -1
- package/lib/src/sessionid.js.map +1 -1
- package/lib/src/storage.d.ts +1 -1
- package/lib/src/storage.js +18 -8
- package/lib/src/storage.js.map +1 -1
- package/lib/src/utils/event-utils.js +16 -10
- package/lib/src/utils/event-utils.js.map +1 -1
- package/lib/src/utils/globals.d.ts +5 -4
- package/lib/src/utils/globals.js +7 -5
- package/lib/src/utils/globals.js.map +1 -1
- package/lib/src/utils/index.js +7 -4
- package/lib/src/utils/index.js.map +1 -1
- package/lib/src/utils/logger.js +5 -2
- package/lib/src/utils/logger.js.map +1 -1
- package/lib/src/uuidv7.js +1 -1
- package/lib/src/uuidv7.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gdpr-utils.js","sourceRoot":"","sources":["../../src/gdpr-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * GDPR utils\n *\n * The General Data Protection Regulation (GDPR) is a regulation in EU law on data protection\n * and privacy for all individuals within the European Union. It addresses the export of personal\n * data outside the EU. The GDPR aims primarily to give control back to citizens and residents\n * over their personal data and to simplify the regulatory environment for international business\n * by unifying the regulation within the EU.\n *\n * This set of utilities is intended to enable opt in/out functionality in the PostHog JS SDK.\n * These functions are used internally by the SDK and are not intended to be publicly exposed.\n */\n\nimport { _each, _includes } from './utils'\nimport { window } from './utils/globals'\nimport { cookieStore, localStore, localPlusCookieStore } from './storage'\nimport { GDPROptions, PersistentStore } from './types'\nimport { PostHog } from './posthog-core'\n\nimport { _isNumber, _isString } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\n/**\n * A function used to capture a PostHog event (e.g. PostHogLib.capture)\n * @callback captureFunction\n * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc.\n * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself.\n * @param {Function} [callback] If provided, the callback function will be called after capturing the event.\n */\n\n/** Public **/\n\nconst GDPR_DEFAULT_PERSISTENCE_PREFIX = '__ph_opt_in_out_'\n\n/**\n * Opt the user in to data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {captureFunction} [options.capture] - function used for capturing a PostHog event to record the opt-in action\n * @param {string} [options.captureEventName] - event name to be used for capturing the opt-in action\n * @param {Object} [options.captureProperties] - set of properties to be captured along with the opt-in action\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nexport function optIn(token: string, options: GDPROptions): void {\n _optInOut(true, token, options)\n}\n\n/**\n * Opt the user out of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-out cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-out cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-out cookie is set as secure or not\n */\nexport function optOut(token: string, options: GDPROptions): void {\n _optInOut(false, token, options)\n}\n\n/**\n * Check whether the user has opted in to data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} whether the user has opted in to the given opt type\n */\nexport function hasOptedIn(token: string, options: GDPROptions): boolean {\n return _getStorageValue(token, options) === '1'\n}\n\n/**\n * Check whether the user has opted out of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {boolean} [options.respectDnt] - flag to take browser DNT setting into account\n * @returns {boolean} whether the user has opted out of the given opt type\n */\nexport function hasOptedOut(token: string, options: Partial<GDPROptions>): boolean {\n if (_hasDoNotTrackFlagOn(options)) {\n return true\n }\n return _getStorageValue(token, options) === '0'\n}\n\n/**\n * Clear the user's opt in/out status of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nexport function clearOptInOut(token: string, options: GDPROptions) {\n options = options || {}\n _getStorage(options).remove(_getStorageKey(token, options), !!options.crossSubdomainCookie)\n}\n\n/** Private **/\n\n/**\n * Get storage util\n * @param {Object} [options]\n * @param {string} [options.persistenceType]\n * @returns {object} either cookieStore or localStore\n */\nfunction _getStorage(options: GDPROptions): PersistentStore {\n options = options || {}\n if (options.persistenceType === 'localStorage') {\n return localStore\n }\n if (options.persistenceType === 'localStorage+cookie') {\n return localPlusCookieStore\n }\n return cookieStore\n}\n\n/**\n * Get the name of the cookie that is used for the given opt type (capturing, cookie, etc.)\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the name of the cookie for the given opt type\n */\nfunction _getStorageKey(token: string, options: GDPROptions) {\n options = options || {}\n return (options.persistencePrefix || GDPR_DEFAULT_PERSISTENCE_PREFIX) + token\n}\n\n/**\n * Get the value of the cookie that is used for the given opt type (capturing, cookie, etc.)\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the value of the cookie for the given opt type\n */\nfunction _getStorageValue(token: string, options: GDPROptions) {\n return _getStorage(options).get(_getStorageKey(token, options))\n}\n\n/**\n * Check whether the user has set the DNT/doNotTrack setting to true in their browser\n * @param {Object} [options]\n * @param {string} [options.window] - alternate window object to check; used to force various DNT settings in browser tests\n * @param {boolean} [options.respectDnt] - flag to take browser DNT setting into account\n * @returns {boolean} whether the DNT setting is true\n */\nfunction _hasDoNotTrackFlagOn(options: GDPROptions) {\n if (options && options.respectDnt) {\n const win = (options && options.window) || window\n const nav = win['navigator'] || {}\n let hasDntOn = false\n _each(\n [\n nav['doNotTrack'], // standard\n (nav as any)['msDoNotTrack'],\n (win as any)['doNotTrack'],\n ],\n function (dntValue) {\n if (_includes([true, 1, '1', 'yes'], dntValue)) {\n hasDntOn = true\n }\n }\n )\n return hasDntOn\n }\n return false\n}\n\n/**\n * Set cookie/localstorage for the user indicating that they are opted in or out for the given opt type\n * @param {boolean} optValue - whether to opt the user in or out for the given opt type\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {captureFunction} [options.capture] - function used for capturing a PostHog event to record the opt-in action\n * @param {string} [options.captureEventName] - event name to be used for capturing the opt-in action\n * @param {Object} [options.captureProperties] - set of properties to be captured along with the opt-in action\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nfunction _optInOut(optValue: boolean, token: string, options: GDPROptions) {\n if (!_isString(token) || !token.length) {\n logger.error('gdpr.' + (optValue ? 'optIn' : 'optOut') + ' called with an invalid token')\n return\n }\n\n options = options || {}\n\n _getStorage(options).set(\n _getStorageKey(token, options),\n optValue ? 1 : 0,\n _isNumber(options.cookieExpiration) ? options.cookieExpiration : null,\n options.crossSubdomainCookie,\n options.secureCookie\n )\n\n if (options.capture && optValue) {\n // only capture event if opting in (optValue=true)\n options.capture(options.captureEventName || '$opt_in', options.captureProperties || {}, {\n send_instantly: true,\n })\n }\n}\n\nexport function userOptedOut(posthog: PostHog) {\n let optedOut = false\n\n try {\n const token = posthog.config.token\n const respectDnt = posthog.config.respect_dnt\n const persistenceType = posthog.config.opt_out_capturing_persistence_type\n const persistencePrefix = posthog.config.opt_out_capturing_cookie_prefix || undefined\n const win = (posthog.config as any).window as Window | undefined // used to override window during browser tests\n\n if (token) {\n // if there was an issue getting the token, continue method execution as normal\n optedOut = hasOptedOut(token, {\n respectDnt,\n persistenceType,\n persistencePrefix,\n window: win,\n })\n }\n } catch (err) {\n logger.error('Unexpected error when checking capturing opt-out status: ' + err)\n }\n return optedOut\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gdpr-utils.js","sourceRoot":"","sources":["../../src/gdpr-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * GDPR utils\n *\n * The General Data Protection Regulation (GDPR) is a regulation in EU law on data protection\n * and privacy for all individuals within the European Union. It addresses the export of personal\n * data outside the EU. The GDPR aims primarily to give control back to citizens and residents\n * over their personal data and to simplify the regulatory environment for international business\n * by unifying the regulation within the EU.\n *\n * This set of utilities is intended to enable opt in/out functionality in the PostHog JS SDK.\n * These functions are used internally by the SDK and are not intended to be publicly exposed.\n */\n\nimport { _each, _includes } from './utils'\nimport { window } from './utils/globals'\nimport { cookieStore, localStore, localPlusCookieStore } from './storage'\nimport { GDPROptions, PersistentStore } from './types'\nimport { PostHog } from './posthog-core'\n\nimport { _isNumber, _isString } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\n/**\n * A function used to capture a PostHog event (e.g. PostHogLib.capture)\n * @callback captureFunction\n * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc.\n * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself.\n * @param {Function} [callback] If provided, the callback function will be called after capturing the event.\n */\n\n/** Public **/\n\nconst GDPR_DEFAULT_PERSISTENCE_PREFIX = '__ph_opt_in_out_'\n\n/**\n * Opt the user in to data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {captureFunction} [options.capture] - function used for capturing a PostHog event to record the opt-in action\n * @param {string} [options.captureEventName] - event name to be used for capturing the opt-in action\n * @param {Object} [options.captureProperties] - set of properties to be captured along with the opt-in action\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nexport function optIn(token: string, options: GDPROptions): void {\n _optInOut(true, token, options)\n}\n\n/**\n * Opt the user out of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-out cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-out cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-out cookie is set as secure or not\n */\nexport function optOut(token: string, options: GDPROptions): void {\n _optInOut(false, token, options)\n}\n\n/**\n * Check whether the user has opted in to data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} whether the user has opted in to the given opt type\n */\nexport function hasOptedIn(token: string, options: GDPROptions): boolean {\n return _getStorageValue(token, options) === '1'\n}\n\n/**\n * Check whether the user has opted out of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {boolean} [options.respectDnt] - flag to take browser DNT setting into account\n * @returns {boolean} whether the user has opted out of the given opt type\n */\nexport function hasOptedOut(token: string, options: Partial<GDPROptions>): boolean {\n if (_hasDoNotTrackFlagOn(options)) {\n return true\n }\n return _getStorageValue(token, options) === '0'\n}\n\n/**\n * Clear the user's opt in/out status of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nexport function clearOptInOut(token: string, options: GDPROptions) {\n options = options || {}\n _getStorage(options).remove(_getStorageKey(token, options), !!options.crossSubdomainCookie)\n}\n\n/** Private **/\n\n/**\n * Get storage util\n * @param {Object} [options]\n * @param {string} [options.persistenceType]\n * @returns {object} either cookieStore or localStore\n */\nfunction _getStorage(options: GDPROptions): PersistentStore {\n options = options || {}\n if (options.persistenceType === 'localStorage') {\n return localStore\n }\n if (options.persistenceType === 'localStorage+cookie') {\n return localPlusCookieStore\n }\n return cookieStore\n}\n\n/**\n * Get the name of the cookie that is used for the given opt type (capturing, cookie, etc.)\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the name of the cookie for the given opt type\n */\nfunction _getStorageKey(token: string, options: GDPROptions) {\n options = options || {}\n return (options.persistencePrefix || GDPR_DEFAULT_PERSISTENCE_PREFIX) + token\n}\n\n/**\n * Get the value of the cookie that is used for the given opt type (capturing, cookie, etc.)\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the value of the cookie for the given opt type\n */\nfunction _getStorageValue(token: string, options: GDPROptions) {\n return _getStorage(options).get(_getStorageKey(token, options))\n}\n\n/**\n * Check whether the user has set the DNT/doNotTrack setting to true in their browser\n * @param {Object} [options]\n * @param {string} [options.window] - alternate window object to check; used to force various DNT settings in browser tests\n * @param {boolean} [options.respectDnt] - flag to take browser DNT setting into account\n * @returns {boolean} whether the DNT setting is true\n */\nfunction _hasDoNotTrackFlagOn(options: GDPROptions) {\n if (options && options.respectDnt) {\n const win = (options && options.window) || window\n const nav = win?.navigator\n let hasDntOn = false\n _each(\n [\n nav?.doNotTrack, // standard\n (nav as any)['msDoNotTrack'],\n (win as any)['doNotTrack'],\n ],\n function (dntValue) {\n if (_includes([true, 1, '1', 'yes'], dntValue)) {\n hasDntOn = true\n }\n }\n )\n return hasDntOn\n }\n return false\n}\n\n/**\n * Set cookie/localstorage for the user indicating that they are opted in or out for the given opt type\n * @param {boolean} optValue - whether to opt the user in or out for the given opt type\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {captureFunction} [options.capture] - function used for capturing a PostHog event to record the opt-in action\n * @param {string} [options.captureEventName] - event name to be used for capturing the opt-in action\n * @param {Object} [options.captureProperties] - set of properties to be captured along with the opt-in action\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nfunction _optInOut(optValue: boolean, token: string, options: GDPROptions) {\n if (!_isString(token) || !token.length) {\n logger.error('gdpr.' + (optValue ? 'optIn' : 'optOut') + ' called with an invalid token')\n return\n }\n\n options = options || {}\n\n _getStorage(options).set(\n _getStorageKey(token, options),\n optValue ? 1 : 0,\n _isNumber(options.cookieExpiration) ? options.cookieExpiration : null,\n options.crossSubdomainCookie,\n options.secureCookie\n )\n\n if (options.capture && optValue) {\n // only capture event if opting in (optValue=true)\n options.capture(options.captureEventName || '$opt_in', options.captureProperties || {}, {\n send_instantly: true,\n })\n }\n}\n\nexport function userOptedOut(posthog: PostHog) {\n let optedOut = false\n\n try {\n const token = posthog.config.token\n const respectDnt = posthog.config.respect_dnt\n const persistenceType = posthog.config.opt_out_capturing_persistence_type\n const persistencePrefix = posthog.config.opt_out_capturing_cookie_prefix || undefined\n const win = (posthog.config as any).window as Window | undefined // used to override window during browser tests\n\n if (token) {\n // if there was an issue getting the token, continue method execution as normal\n optedOut = hasOptedOut(token, {\n respectDnt,\n persistenceType,\n persistencePrefix,\n window: win,\n })\n }\n } catch (err) {\n logger.error('Unexpected error when checking capturing opt-out status: ' + err)\n }\n return optedOut\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { extendPostHog } from './extensions/exception-autocapture';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { window } from './utils/globals';
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
window.extendPostHogWithExceptionAutoCapture = extendPostHog;
|
|
5
6
|
export default extendPostHog;
|
|
6
7
|
//# sourceMappingURL=loader-exception-autocapture.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-exception-autocapture.js","sourceRoot":"","sources":["../../src/loader-exception-autocapture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAElE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"loader-exception-autocapture.js","sourceRoot":"","sources":["../../src/loader-exception-autocapture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,6DAA6D;AAC7D,aAAa;AACb,MAAM,CAAC,qCAAqC,GAAG,aAAa,CAAA;AAE5D,eAAe,aAAa,CAAA","sourcesContent":["import { extendPostHog } from './extensions/exception-autocapture'\n\nimport { window } from './utils/globals'\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nwindow.extendPostHogWithExceptionAutoCapture = extendPostHog\n\nexport default extendPostHog\n"]}
|
|
@@ -55,6 +55,7 @@ import rrwebRecord from 'rrweb/es/rrweb/packages/rrweb/src/record';
|
|
|
55
55
|
import { getRecordConsolePlugin } from 'rrweb/es/rrweb/packages/rrweb/src/plugins/console/record';
|
|
56
56
|
import { _isBoolean, _isFunction, _isArray, _isUndefined, _isNull } from './utils/type-utils';
|
|
57
57
|
import { logger } from './utils/logger';
|
|
58
|
+
import { window } from './utils/globals';
|
|
58
59
|
import { defaultNetworkOptions } from './extensions/replay/config';
|
|
59
60
|
var isNavigationTiming = function (entry) {
|
|
60
61
|
return entry.entryType === 'navigation';
|
|
@@ -451,9 +452,11 @@ export var getRecordNetworkPlugin = function (options) {
|
|
|
451
452
|
};
|
|
452
453
|
};
|
|
453
454
|
// rrweb/networ@1 ends
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
455
|
+
if (window) {
|
|
456
|
+
;
|
|
457
|
+
window.rrweb = { record: rrwebRecord, version: 'v2', rrwebVersion: version };
|
|
458
|
+
window.rrwebConsoleRecord = { getRecordConsolePlugin: getRecordConsolePlugin };
|
|
459
|
+
window.getRecordNetworkPlugin = getRecordNetworkPlugin;
|
|
460
|
+
}
|
|
458
461
|
export default rrwebRecord;
|
|
459
462
|
//# sourceMappingURL=loader-recorder-v2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-recorder-v2.js","sourceRoot":"","sources":["../../src/loader-recorder-v2.ts"],"names":[],"mappings":"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","sourcesContent":["import { version } from 'rrweb/package.json'\n\n// Same as loader-globals.ts except includes rrweb2 scripts.\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport rrwebRecord from 'rrweb/es/rrweb/packages/rrweb/src/record'\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { getRecordConsolePlugin } from 'rrweb/es/rrweb/packages/rrweb/src/plugins/console/record'\n\n// rrweb/network@1 code starts\n// most of what is below here will be removed when rrweb release their code for this\n// see https://github.com/rrweb-io/rrweb/pull/1105\n\n/// <reference lib=\"dom\" />\n\n// NB adopted from https://github.com/rrweb-io/rrweb/pull/1105 which looks like it will be accepted into rrweb\n// however, in the PR, it throws when the performance observer data is not available\n// and assumes it is running in a browser with the Request API (i.e. not IE11)\n// copying here so that we can use it before rrweb adopt it\n\nimport type { IWindow, listenerHandler, RecordPlugin } from '@rrweb/types'\nimport { InitiatorType, NetworkRecordOptions, NetworkRequest, Headers } from './types'\nimport { _isBoolean, _isFunction, _isArray, _isUndefined, _isNull } from './utils/type-utils'\nimport { logger } from './utils/logger'\nimport { defaultNetworkOptions } from './extensions/replay/config'\n\nexport type NetworkData = {\n requests: NetworkRequest[]\n isInitial?: boolean\n}\n\ntype networkCallback = (data: NetworkData) => void\n\nconst isNavigationTiming = (entry: PerformanceEntry): entry is PerformanceNavigationTiming =>\n entry.entryType === 'navigation'\nconst isResourceTiming = (entry: PerformanceEntry): entry is PerformanceResourceTiming => entry.entryType === 'resource'\n\ntype ObservedPerformanceEntry = (PerformanceNavigationTiming | PerformanceResourceTiming) & {\n responseStatus?: number\n}\n\n// import { patch } from 'rrweb/typings/utils'\n// copied from https://github.com/rrweb-io/rrweb/blob/8aea5b00a4dfe5a6f59bd2ae72bb624f45e51e81/packages/rrweb/src/utils.ts#L129\n// which was copied from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n }\n }\n\n const original = source[name] as () => unknown\n const wrapped = replacement(original)\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (_isFunction(wrapped)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {}\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n })\n }\n\n source[name] = wrapped\n\n return () => {\n source[name] = original\n }\n } catch {\n return () => {\n //\n }\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n\nexport function findLast<T>(array: Array<T>, predicate: (value: T) => boolean): T | undefined {\n const length = array.length\n for (let i = length - 1; i >= 0; i -= 1) {\n if (predicate(array[i])) {\n return array[i]\n }\n }\n return undefined\n}\n\nfunction initPerformanceObserver(cb: networkCallback, win: IWindow, options: Required<NetworkRecordOptions>) {\n if (options.recordInitialRequests) {\n const initialPerformanceEntries = win.performance\n .getEntries()\n .filter(\n (entry): entry is ObservedPerformanceEntry =>\n isNavigationTiming(entry) ||\n (isResourceTiming(entry) && options.initiatorTypes.includes(entry.initiatorType as InitiatorType))\n )\n cb({\n requests: initialPerformanceEntries.map((entry) => ({\n url: entry.name,\n initiatorType: entry.initiatorType as InitiatorType,\n status: 'responseStatus' in entry ? entry.responseStatus : undefined,\n startTime: Math.round(entry.startTime),\n endTime: Math.round(entry.responseEnd),\n })),\n isInitial: true,\n })\n }\n const observer = new win.PerformanceObserver((entries) => {\n const performanceEntries = entries\n .getEntries()\n .filter(\n (entry): entry is ObservedPerformanceEntry =>\n isNavigationTiming(entry) ||\n (isResourceTiming(entry) &&\n options.initiatorTypes.includes(entry.initiatorType as InitiatorType) &&\n entry.initiatorType !== 'xmlhttprequest' &&\n entry.initiatorType !== 'fetch')\n )\n cb({\n requests: performanceEntries.map((entry) => ({\n url: entry.name,\n initiatorType: entry.initiatorType as InitiatorType,\n status: 'responseStatus' in entry ? entry.responseStatus : undefined,\n startTime: Math.round(entry.startTime),\n endTime: Math.round(entry.responseEnd),\n })),\n })\n })\n observer.observe({ entryTypes: ['navigation', 'resource'] })\n return () => {\n observer.disconnect()\n }\n}\n\nfunction shouldRecordHeaders(type: 'request' | 'response', recordHeaders: NetworkRecordOptions['recordHeaders']) {\n return !!recordHeaders && (_isBoolean(recordHeaders) || recordHeaders[type])\n}\n\nfunction shouldRecordBody(\n type: 'request' | 'response',\n recordBody: NetworkRecordOptions['recordBody'],\n headers: Headers\n) {\n function matchesContentType(contentTypes: string[]) {\n const contentTypeHeader = Object.keys(headers).find((key) => key.toLowerCase() === 'content-type')\n const contentType = contentTypeHeader && headers[contentTypeHeader]\n return contentTypes.some((ct) => contentType?.includes(ct))\n }\n if (!recordBody) return false\n if (_isBoolean(recordBody)) return true\n if (_isArray(recordBody)) return matchesContentType(recordBody)\n const recordBodyType = recordBody[type]\n if (_isBoolean(recordBodyType)) return recordBodyType\n return matchesContentType(recordBodyType)\n}\n\nasync function getRequestPerformanceEntry(\n win: IWindow,\n initiatorType: string,\n url: string,\n after?: number,\n before?: number,\n attempt = 0\n): Promise<PerformanceResourceTiming | null> {\n if (attempt > 10) {\n logger.warn('Failed to get performance entry for request', { url, initiatorType })\n return null\n }\n const urlPerformanceEntries = win.performance.getEntriesByName(url) as PerformanceResourceTiming[]\n const performanceEntry = findLast(\n urlPerformanceEntries,\n (entry) =>\n isResourceTiming(entry) &&\n entry.initiatorType === initiatorType &&\n (!after || entry.startTime >= after) &&\n (!before || entry.startTime <= before)\n )\n if (!performanceEntry) {\n await new Promise((resolve) => setTimeout(resolve, 50 * attempt))\n return getRequestPerformanceEntry(win, initiatorType, url, after, before, attempt + 1)\n }\n return performanceEntry\n}\n\nfunction initXhrObserver(cb: networkCallback, win: IWindow, options: Required<NetworkRecordOptions>): listenerHandler {\n if (!options.initiatorTypes.includes('xmlhttprequest')) {\n return () => {\n //\n }\n }\n const recordRequestHeaders = shouldRecordHeaders('request', options.recordHeaders)\n const recordResponseHeaders = shouldRecordHeaders('response', options.recordHeaders)\n\n const restorePatch = patch(\n win.XMLHttpRequest.prototype,\n 'open',\n // TODO how should this be typed?\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (originalOpen: typeof XMLHttpRequest.prototype.open) => {\n return function (\n method: string,\n url: string | URL,\n async = true,\n username?: string | null,\n password?: string | null\n ) {\n // because this function is returned in its actual context `this` _is_ an XMLHttpRequest\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const xhr = this as XMLHttpRequest\n\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url)\n const networkRequest: Partial<NetworkRequest> = {}\n let after: number | undefined\n let before: number | undefined\n const requestHeaders: Headers = {}\n const originalSetRequestHeader = xhr.setRequestHeader.bind(xhr)\n xhr.setRequestHeader = (header: string, value: string) => {\n requestHeaders[header] = value\n return originalSetRequestHeader(header, value)\n }\n if (recordRequestHeaders) {\n networkRequest.requestHeaders = requestHeaders\n }\n const originalSend = xhr.send.bind(xhr)\n xhr.send = (body) => {\n if (shouldRecordBody('request', options.recordBody, requestHeaders)) {\n if (_isUndefined(body) || _isNull(body)) {\n networkRequest.requestBody = null\n } else {\n networkRequest.requestBody = body\n }\n }\n after = win.performance.now()\n return originalSend(body)\n }\n xhr.addEventListener('readystatechange', () => {\n if (xhr.readyState !== xhr.DONE) {\n return\n }\n before = win.performance.now()\n const responseHeaders: Headers = {}\n const rawHeaders = xhr.getAllResponseHeaders()\n const headers = rawHeaders.trim().split(/[\\r\\n]+/)\n headers.forEach((line) => {\n const parts = line.split(': ')\n const header = parts.shift()\n const value = parts.join(': ')\n if (header) {\n responseHeaders[header] = value\n }\n })\n if (recordResponseHeaders) {\n networkRequest.responseHeaders = responseHeaders\n }\n if (shouldRecordBody('response', options.recordBody, responseHeaders)) {\n if (_isUndefined(xhr.response) || _isNull(xhr.response)) {\n networkRequest.responseBody = null\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n networkRequest.responseBody = xhr.response\n }\n }\n getRequestPerformanceEntry(win, 'xmlhttprequest', req.url, after, before)\n .then((entry) => {\n if (_isNull(entry)) {\n return\n }\n const request: NetworkRequest = {\n url: entry.name,\n method: req.method,\n initiatorType: entry.initiatorType as InitiatorType,\n status: xhr.status,\n startTime: Math.round(entry.startTime),\n endTime: Math.round(entry.responseEnd),\n requestHeaders: networkRequest.requestHeaders,\n requestBody: networkRequest.requestBody,\n responseHeaders: networkRequest.responseHeaders,\n responseBody: networkRequest.responseBody,\n }\n cb({ requests: [request] })\n })\n .catch(() => {\n //\n })\n })\n originalOpen.call(xhr, method, url, async, username, password)\n }\n }\n )\n return () => {\n restorePatch()\n }\n}\n\nfunction initFetchObserver(\n cb: networkCallback,\n win: IWindow,\n options: Required<NetworkRecordOptions>\n): listenerHandler {\n if (!options.initiatorTypes.includes('fetch')) {\n return () => {\n //\n }\n }\n const recordRequestHeaders = shouldRecordHeaders('request', options.recordHeaders)\n const recordResponseHeaders = shouldRecordHeaders('response', options.recordHeaders)\n // TODO how should this be typed?\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const restorePatch = patch(win, 'fetch', (originalFetch: typeof fetch) => {\n return async function (url: URL | RequestInfo, init?: RequestInit | undefined) {\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url, init)\n let res: Response | undefined\n const networkRequest: Partial<NetworkRequest> = {}\n let after: number | undefined\n let before: number | undefined\n try {\n const requestHeaders: Headers = {}\n req.headers.forEach((value, header) => {\n requestHeaders[header] = value\n })\n if (recordRequestHeaders) {\n networkRequest.requestHeaders = requestHeaders\n }\n if (shouldRecordBody('request', options.recordBody, requestHeaders)) {\n if (_isUndefined(req.body) || _isNull(req.body)) {\n networkRequest.requestBody = null\n } else {\n networkRequest.requestBody = req.body\n }\n }\n after = win.performance.now()\n res = await originalFetch(req)\n before = win.performance.now()\n const responseHeaders: Headers = {}\n res.headers.forEach((value, header) => {\n responseHeaders[header] = value\n })\n if (recordResponseHeaders) {\n networkRequest.responseHeaders = responseHeaders\n }\n if (shouldRecordBody('response', options.recordBody, responseHeaders)) {\n let body: string | undefined\n try {\n body = await res.clone().text()\n } catch {\n //\n }\n if (_isUndefined(res.body) || _isNull(res.body)) {\n networkRequest.responseBody = null\n } else {\n networkRequest.responseBody = body\n }\n }\n return res\n } finally {\n getRequestPerformanceEntry(win, 'fetch', req.url, after, before)\n .then((entry) => {\n if (_isNull(entry)) {\n return\n }\n const request: NetworkRequest = {\n url: entry.name,\n method: req.method,\n initiatorType: entry.initiatorType as InitiatorType,\n status: res?.status,\n startTime: Math.round(entry.startTime),\n endTime: Math.round(entry.responseEnd),\n requestHeaders: networkRequest.requestHeaders,\n requestBody: networkRequest.requestBody,\n responseHeaders: networkRequest.responseHeaders,\n responseBody: networkRequest.responseBody,\n }\n cb({ requests: [request] })\n })\n .catch(() => {\n //\n })\n }\n }\n })\n return () => {\n restorePatch()\n }\n}\n\nfunction initNetworkObserver(\n callback: networkCallback,\n win: IWindow, // top window or in an iframe\n options: NetworkRecordOptions\n): listenerHandler {\n if (!('performance' in win)) {\n return () => {\n //\n }\n }\n const networkOptions = (\n options ? Object.assign({}, defaultNetworkOptions, options) : defaultNetworkOptions\n ) as Required<NetworkRecordOptions>\n\n const cb: networkCallback = (data) => {\n const requests: NetworkRequest[] = []\n data.requests.forEach((request) => {\n const maskedRequest = networkOptions.maskRequestFn(request)\n if (maskedRequest) {\n requests.push(maskedRequest)\n }\n })\n\n if (requests.length > 0 || data.isInitial) {\n callback({ ...data, requests })\n }\n }\n const performanceObserver = initPerformanceObserver(cb, win, networkOptions)\n const xhrObserver = initXhrObserver(cb, win, networkOptions)\n const fetchObserver = initFetchObserver(cb, win, networkOptions)\n return () => {\n performanceObserver()\n xhrObserver()\n fetchObserver()\n }\n}\n\n// use the plugin name so that when this functionality is adopted into rrweb\n// we can remove this plugin and use the core functionality with the same data\nexport const NETWORK_PLUGIN_NAME = 'rrweb/network@1'\n\n// TODO how should this be typed?\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const getRecordNetworkPlugin: (options?: NetworkRecordOptions) => RecordPlugin = (options) => {\n return {\n name: NETWORK_PLUGIN_NAME,\n observer: initNetworkObserver,\n options: options,\n }\n}\n\n// rrweb/networ@1 ends\n\nconst win: Window & typeof globalThis = _isUndefined(window) ? ({} as typeof window) : window\n\n;(win as any).rrweb = { record: rrwebRecord, version: 'v2', rrwebVersion: version }\n;(win as any).rrwebConsoleRecord = { getRecordConsolePlugin }\n;(win as any).getRecordNetworkPlugin = getRecordNetworkPlugin\n\nexport default rrwebRecord\n"]}
|
|
1
|
+
{"version":3,"file":"loader-recorder-v2.js","sourceRoot":"","sources":["../../src/loader-recorder-v2.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C,4DAA4D;AAC5D,6DAA6D;AAC7D,aAAa;AACb,OAAO,WAAW,MAAM,0CAA0C,CAAA;AAClE,6DAA6D;AAC7D,aAAa;AACb,OAAO,EAAE,sBAAsB,EAAE,MAAM,0DAA0D,CAAA;AAejG,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC7F,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AASlE,IAAM,kBAAkB,GAAG,UAAC,KAAuB;IAC/C,OAAA,KAAK,CAAC,SAAS,KAAK,YAAY;AAAhC,CAAgC,CAAA;AACpC,IAAM,gBAAgB,GAAG,UAAC,KAAuB,IAAyC,OAAA,KAAK,CAAC,SAAS,KAAK,UAAU,EAA9B,CAA8B,CAAA;AAMxH,8CAA8C;AAC9C,+HAA+H;AAC/H,kJAAkJ;AAClJ,MAAM,UAAU,KAAK,CACjB,MAA8B,EAC9B,IAAY,EACZ,WAA4C;IAE5C,IAAI;QACA,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE;YACnB,OAAO;gBACH,EAAE;YACN,CAAC,CAAA;SACJ;QAED,IAAM,UAAQ,GAAG,MAAM,CAAC,IAAI,CAAkB,CAAA;QAC9C,IAAM,OAAO,GAAG,WAAW,CAAC,UAAQ,CAAC,CAAA;QAErC,0GAA0G;QAC1G,kFAAkF;QAClF,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE;YACtB,mEAAmE;YACnE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAA;YAC3C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE;gBAC7B,kBAAkB,EAAE;oBAChB,UAAU,EAAE,KAAK;oBACjB,KAAK,EAAE,UAAQ;iBAClB;aACJ,CAAC,CAAA;SACL;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;QAEtB,OAAO;YACH,MAAM,CAAC,IAAI,CAAC,GAAG,UAAQ,CAAA;QAC3B,CAAC,CAAA;KACJ;IAAC,WAAM;QACJ,OAAO;YACH,EAAE;QACN,CAAC,CAAA;QACD,iFAAiF;QACjF,mEAAmE;KACtE;AACL,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,KAAe,EAAE,SAAgC;IACzE,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;IAC3B,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;QACrC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YACrB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;SAClB;KACJ;IACD,OAAO,SAAS,CAAA;AACpB,CAAC;AAED,SAAS,uBAAuB,CAAC,EAAmB,EAAE,GAAY,EAAE,OAAuC;IACvG,IAAI,OAAO,CAAC,qBAAqB,EAAE;QAC/B,IAAM,yBAAyB,GAAG,GAAG,CAAC,WAAW;aAC5C,UAAU,EAAE;aACZ,MAAM,CACH,UAAC,KAAK;YACF,OAAA,kBAAkB,CAAC,KAAK,CAAC;gBACzB,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,aAA8B,CAAC,CAAC;QADlG,CACkG,CACzG,CAAA;QACL,EAAE,CAAC;YACC,QAAQ,EAAE,yBAAyB,CAAC,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,CAAC;gBAChD,GAAG,EAAE,KAAK,CAAC,IAAI;gBACf,aAAa,EAAE,KAAK,CAAC,aAA8B;gBACnD,MAAM,EAAE,gBAAgB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;gBACpE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;gBACtC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;aACzC,CAAC,EANiD,CAMjD,CAAC;YACH,SAAS,EAAE,IAAI;SAClB,CAAC,CAAA;KACL;IACD,IAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,UAAC,OAAO;QACjD,IAAM,kBAAkB,GAAG,OAAO;aAC7B,UAAU,EAAE;aACZ,MAAM,CACH,UAAC,KAAK;YACF,OAAA,kBAAkB,CAAC,KAAK,CAAC;gBACzB,CAAC,gBAAgB,CAAC,KAAK,CAAC;oBACpB,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,aAA8B,CAAC;oBACrE,KAAK,CAAC,aAAa,KAAK,gBAAgB;oBACxC,KAAK,CAAC,aAAa,KAAK,OAAO,CAAC;QAJpC,CAIoC,CAC3C,CAAA;QACL,EAAE,CAAC;YACC,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,CAAC;gBACzC,GAAG,EAAE,KAAK,CAAC,IAAI;gBACf,aAAa,EAAE,KAAK,CAAC,aAA8B;gBACnD,MAAM,EAAE,gBAAgB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;gBACpE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;gBACtC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;aACzC,CAAC,EAN0C,CAM1C,CAAC;SACN,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,CAAC,CAAA;IAC5D,OAAO;QACH,QAAQ,CAAC,UAAU,EAAE,CAAA;IACzB,CAAC,CAAA;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,IAA4B,EAAE,aAAoD;IAC3G,OAAO,CAAC,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,gBAAgB,CACrB,IAA4B,EAC5B,UAA8C,EAC9C,OAAgB;IAEhB,SAAS,kBAAkB,CAAC,YAAsB;QAC9C,IAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,WAAW,EAAE,KAAK,cAAc,EAApC,CAAoC,CAAC,CAAA;QAClG,IAAM,WAAW,GAAG,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAA;QACnE,OAAO,YAAY,CAAC,IAAI,CAAC,UAAC,EAAE,IAAK,OAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,CAAC,EAAE,CAAC,EAAzB,CAAyB,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAA;IAC7B,IAAI,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAA;IACvC,IAAI,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAA;IAC/D,IAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,cAAc,CAAA;IACrD,OAAO,kBAAkB,CAAC,cAAc,CAAC,CAAA;AAC7C,CAAC;AAED,SAAe,0BAA0B,CACrC,GAAY,EACZ,aAAqB,EACrB,GAAW,EACX,KAAc,EACd,MAAe,EACf,OAAW;IAAX,wBAAA,EAAA,WAAW;;;;;;oBAEX,IAAI,OAAO,GAAG,EAAE,EAAE;wBACd,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,EAAE,GAAG,KAAA,EAAE,aAAa,eAAA,EAAE,CAAC,CAAA;wBAClF,sBAAO,IAAI,EAAA;qBACd;oBACK,qBAAqB,GAAG,GAAG,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAgC,CAAA;oBAC5F,gBAAgB,GAAG,QAAQ,CAC7B,qBAAqB,EACrB,UAAC,KAAK;wBACF,OAAA,gBAAgB,CAAC,KAAK,CAAC;4BACvB,KAAK,CAAC,aAAa,KAAK,aAAa;4BACrC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;4BACpC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC;oBAHtC,CAGsC,CAC7C,CAAA;yBACG,CAAC,gBAAgB,EAAjB,wBAAiB;oBACjB,qBAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,EAAjC,CAAiC,CAAC,EAAA;;oBAAjE,SAAiE,CAAA;oBACjE,sBAAO,0BAA0B,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,EAAA;wBAE1F,sBAAO,gBAAgB,EAAA;;;;CAC1B;AAED,SAAS,eAAe,CAAC,EAAmB,EAAE,GAAY,EAAE,OAAuC;IAC/F,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;QACpD,OAAO;YACH,EAAE;QACN,CAAC,CAAA;KACJ;IACD,IAAM,oBAAoB,GAAG,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAClF,IAAM,qBAAqB,GAAG,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAEpF,IAAM,YAAY,GAAG,KAAK,CACtB,GAAG,CAAC,cAAc,CAAC,SAAS,EAC5B,MAAM;IACN,iCAAiC;IACjC,6DAA6D;IAC7D,aAAa;IACb,UAAC,YAAkD;QAC/C,OAAO,UACH,MAAc,EACd,GAAiB,EACjB,KAAY,EACZ,QAAwB,EACxB,QAAwB;YAFxB,sBAAA,EAAA,YAAY;YAIZ,wFAAwF;YACxF,6DAA6D;YAC7D,aAAa;YACb,IAAM,GAAG,GAAG,IAAsB,CAAA;YAElC,uEAAuE;YACvE,yCAAyC;YACzC,IAAM,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAA;YAC5B,IAAM,cAAc,GAA4B,EAAE,CAAA;YAClD,IAAI,KAAyB,CAAA;YAC7B,IAAI,MAA0B,CAAA;YAC9B,IAAM,cAAc,GAAY,EAAE,CAAA;YAClC,IAAM,wBAAwB,GAAG,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC/D,GAAG,CAAC,gBAAgB,GAAG,UAAC,MAAc,EAAE,KAAa;gBACjD,cAAc,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;gBAC9B,OAAO,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YAClD,CAAC,CAAA;YACD,IAAI,oBAAoB,EAAE;gBACtB,cAAc,CAAC,cAAc,GAAG,cAAc,CAAA;aACjD;YACD,IAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACvC,GAAG,CAAC,IAAI,GAAG,UAAC,IAAI;gBACZ,IAAI,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE;oBACjE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;wBACrC,cAAc,CAAC,WAAW,GAAG,IAAI,CAAA;qBACpC;yBAAM;wBACH,cAAc,CAAC,WAAW,GAAG,IAAI,CAAA;qBACpC;iBACJ;gBACD,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,CAAA;gBAC7B,OAAO,YAAY,CAAC,IAAI,CAAC,CAAA;YAC7B,CAAC,CAAA;YACD,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,EAAE;gBACrC,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,EAAE;oBAC7B,OAAM;iBACT;gBACD,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,CAAA;gBAC9B,IAAM,eAAe,GAAY,EAAE,CAAA;gBACnC,IAAM,UAAU,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAA;gBAC9C,IAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;gBAClD,OAAO,CAAC,OAAO,CAAC,UAAC,IAAI;oBACjB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;oBAC9B,IAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;oBAC5B,IAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oBAC9B,IAAI,MAAM,EAAE;wBACR,eAAe,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;qBAClC;gBACL,CAAC,CAAC,CAAA;gBACF,IAAI,qBAAqB,EAAE;oBACvB,cAAc,CAAC,eAAe,GAAG,eAAe,CAAA;iBACnD;gBACD,IAAI,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE;oBACnE,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;wBACrD,cAAc,CAAC,YAAY,GAAG,IAAI,CAAA;qBACrC;yBAAM;wBACH,mEAAmE;wBACnE,cAAc,CAAC,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAA;qBAC7C;iBACJ;gBACD,0BAA0B,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC;qBACpE,IAAI,CAAC,UAAC,KAAK;oBACR,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;wBAChB,OAAM;qBACT;oBACD,IAAM,OAAO,GAAmB;wBAC5B,GAAG,EAAE,KAAK,CAAC,IAAI;wBACf,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,aAAa,EAAE,KAAK,CAAC,aAA8B;wBACnD,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;wBACtC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;wBACtC,cAAc,EAAE,cAAc,CAAC,cAAc;wBAC7C,WAAW,EAAE,cAAc,CAAC,WAAW;wBACvC,eAAe,EAAE,cAAc,CAAC,eAAe;wBAC/C,YAAY,EAAE,cAAc,CAAC,YAAY;qBAC5C,CAAA;oBACD,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;gBAC/B,CAAC,CAAC;qBACD,KAAK,CAAC;oBACH,EAAE;gBACN,CAAC,CAAC,CAAA;YACV,CAAC,CAAC,CAAA;YACF,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAClE,CAAC,CAAA;IACL,CAAC,CACJ,CAAA;IACD,OAAO;QACH,YAAY,EAAE,CAAA;IAClB,CAAC,CAAA;AACL,CAAC;AAED,SAAS,iBAAiB,CACtB,EAAmB,EACnB,GAAY,EACZ,OAAuC;IAEvC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QAC3C,OAAO;YACH,EAAE;QACN,CAAC,CAAA;KACJ;IACD,IAAM,oBAAoB,GAAG,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAClF,IAAM,qBAAqB,GAAG,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IACpF,iCAAiC;IACjC,6DAA6D;IAC7D,aAAa;IACb,IAAM,YAAY,GAAG,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,UAAC,aAA2B;QACjE,OAAO,UAAgB,GAAsB,EAAE,IAA8B;;;;;;4BAGnE,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;4BAE5B,cAAc,GAA4B,EAAE,CAAA;;;;4BAIxC,mBAA0B,EAAE,CAAA;4BAClC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,MAAM;gCAC9B,gBAAc,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;4BAClC,CAAC,CAAC,CAAA;4BACF,IAAI,oBAAoB,EAAE;gCACtB,cAAc,CAAC,cAAc,GAAG,gBAAc,CAAA;6BACjD;4BACD,IAAI,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,gBAAc,CAAC,EAAE;gCACjE,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oCAC7C,cAAc,CAAC,WAAW,GAAG,IAAI,CAAA;iCACpC;qCAAM;oCACH,cAAc,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,CAAA;iCACxC;6BACJ;4BACD,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,CAAA;4BACvB,qBAAM,aAAa,CAAC,GAAG,CAAC,EAAA;;4BAA9B,GAAG,GAAG,SAAwB,CAAA;4BAC9B,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,CAAA;4BACxB,oBAA2B,EAAE,CAAA;4BACnC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,MAAM;gCAC9B,iBAAe,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;4BACnC,CAAC,CAAC,CAAA;4BACF,IAAI,qBAAqB,EAAE;gCACvB,cAAc,CAAC,eAAe,GAAG,iBAAe,CAAA;6BACnD;iCACG,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,iBAAe,CAAC,EAAjE,wBAAiE;4BAC7D,IAAI,SAAoB,CAAA;;;;4BAEjB,qBAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAA;;4BAA/B,IAAI,GAAG,SAAwB,CAAA;;;;;;4BAInC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gCAC7C,cAAc,CAAC,YAAY,GAAG,IAAI,CAAA;6BACrC;iCAAM;gCACH,cAAc,CAAC,YAAY,GAAG,IAAI,CAAA;6BACrC;;gCAEL,sBAAO,GAAG,EAAA;;4BAEV,0BAA0B,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC;iCAC3D,IAAI,CAAC,UAAC,KAAK;gCACR,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;oCAChB,OAAM;iCACT;gCACD,IAAM,OAAO,GAAmB;oCAC5B,GAAG,EAAE,KAAK,CAAC,IAAI;oCACf,MAAM,EAAE,GAAG,CAAC,MAAM;oCAClB,aAAa,EAAE,KAAK,CAAC,aAA8B;oCACnD,MAAM,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM;oCACnB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;oCACtC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;oCACtC,cAAc,EAAE,cAAc,CAAC,cAAc;oCAC7C,WAAW,EAAE,cAAc,CAAC,WAAW;oCACvC,eAAe,EAAE,cAAc,CAAC,eAAe;oCAC/C,YAAY,EAAE,cAAc,CAAC,YAAY;iCAC5C,CAAA;gCACD,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;4BAC/B,CAAC,CAAC;iCACD,KAAK,CAAC;gCACH,EAAE;4BACN,CAAC,CAAC,CAAA;;;;;;SAEb,CAAA;IACL,CAAC,CAAC,CAAA;IACF,OAAO;QACH,YAAY,EAAE,CAAA;IAClB,CAAC,CAAA;AACL,CAAC;AAED,SAAS,mBAAmB,CACxB,QAAyB,EACzB,GAAY,EAAE,6BAA6B;AAC3C,OAA6B;IAE7B,IAAI,CAAC,CAAC,aAAa,IAAI,GAAG,CAAC,EAAE;QACzB,OAAO;YACH,EAAE;QACN,CAAC,CAAA;KACJ;IACD,IAAM,cAAc,GAAG,CACnB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,qBAAqB,CACpD,CAAA;IAEnC,IAAM,EAAE,GAAoB,UAAC,IAAI;QAC7B,IAAM,QAAQ,GAAqB,EAAE,CAAA;QACrC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAC,OAAO;YAC1B,IAAM,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;YAC3D,IAAI,aAAa,EAAE;gBACf,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;aAC/B;QACL,CAAC,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;YACvC,QAAQ,uBAAM,IAAI,KAAE,QAAQ,UAAA,IAAG,CAAA;SAClC;IACL,CAAC,CAAA;IACD,IAAM,mBAAmB,GAAG,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,CAAA;IAC5E,IAAM,WAAW,GAAG,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,CAAA;IAC5D,IAAM,aAAa,GAAG,iBAAiB,CAAC,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,CAAA;IAChE,OAAO;QACH,mBAAmB,EAAE,CAAA;QACrB,WAAW,EAAE,CAAA;QACb,aAAa,EAAE,CAAA;IACnB,CAAC,CAAA;AACL,CAAC;AAED,4EAA4E;AAC5E,8EAA8E;AAC9E,MAAM,CAAC,IAAM,mBAAmB,GAAG,iBAAiB,CAAA;AAEpD,iCAAiC;AACjC,6DAA6D;AAC7D,aAAa;AACb,MAAM,CAAC,IAAM,sBAAsB,GAAqD,UAAC,OAAO;IAC5F,OAAO;QACH,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,mBAAmB;QAC7B,OAAO,EAAE,OAAO;KACnB,CAAA;AACL,CAAC,CAAA;AAED,sBAAsB;AAEtB,IAAI,MAAM,EAAE;IACR,CAAC;IAAC,MAAc,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CACrF;IAAC,MAAc,CAAC,kBAAkB,GAAG,EAAE,sBAAsB,wBAAA,EAAE,CAC/D;IAAC,MAAc,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;CACnE;AAED,eAAe,WAAW,CAAA","sourcesContent":["import { version } from 'rrweb/package.json'\n\n// Same as loader-globals.ts except includes rrweb2 scripts.\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport rrwebRecord from 'rrweb/es/rrweb/packages/rrweb/src/record'\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { getRecordConsolePlugin } from 'rrweb/es/rrweb/packages/rrweb/src/plugins/console/record'\n\n// rrweb/network@1 code starts\n// most of what is below here will be removed when rrweb release their code for this\n// see https://github.com/rrweb-io/rrweb/pull/1105\n\n/// <reference lib=\"dom\" />\n\n// NB adopted from https://github.com/rrweb-io/rrweb/pull/1105 which looks like it will be accepted into rrweb\n// however, in the PR, it throws when the performance observer data is not available\n// and assumes it is running in a browser with the Request API (i.e. not IE11)\n// copying here so that we can use it before rrweb adopt it\n\nimport type { IWindow, listenerHandler, RecordPlugin } from '@rrweb/types'\nimport { InitiatorType, NetworkRecordOptions, NetworkRequest, Headers } from './types'\nimport { _isBoolean, _isFunction, _isArray, _isUndefined, _isNull } from './utils/type-utils'\nimport { logger } from './utils/logger'\nimport { window } from './utils/globals'\nimport { defaultNetworkOptions } from './extensions/replay/config'\n\nexport type NetworkData = {\n requests: NetworkRequest[]\n isInitial?: boolean\n}\n\ntype networkCallback = (data: NetworkData) => void\n\nconst isNavigationTiming = (entry: PerformanceEntry): entry is PerformanceNavigationTiming =>\n entry.entryType === 'navigation'\nconst isResourceTiming = (entry: PerformanceEntry): entry is PerformanceResourceTiming => entry.entryType === 'resource'\n\ntype ObservedPerformanceEntry = (PerformanceNavigationTiming | PerformanceResourceTiming) & {\n responseStatus?: number\n}\n\n// import { patch } from 'rrweb/typings/utils'\n// copied from https://github.com/rrweb-io/rrweb/blob/8aea5b00a4dfe5a6f59bd2ae72bb624f45e51e81/packages/rrweb/src/utils.ts#L129\n// which was copied from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n }\n }\n\n const original = source[name] as () => unknown\n const wrapped = replacement(original)\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (_isFunction(wrapped)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {}\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n })\n }\n\n source[name] = wrapped\n\n return () => {\n source[name] = original\n }\n } catch {\n return () => {\n //\n }\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n\nexport function findLast<T>(array: Array<T>, predicate: (value: T) => boolean): T | undefined {\n const length = array.length\n for (let i = length - 1; i >= 0; i -= 1) {\n if (predicate(array[i])) {\n return array[i]\n }\n }\n return undefined\n}\n\nfunction initPerformanceObserver(cb: networkCallback, win: IWindow, options: Required<NetworkRecordOptions>) {\n if (options.recordInitialRequests) {\n const initialPerformanceEntries = win.performance\n .getEntries()\n .filter(\n (entry): entry is ObservedPerformanceEntry =>\n isNavigationTiming(entry) ||\n (isResourceTiming(entry) && options.initiatorTypes.includes(entry.initiatorType as InitiatorType))\n )\n cb({\n requests: initialPerformanceEntries.map((entry) => ({\n url: entry.name,\n initiatorType: entry.initiatorType as InitiatorType,\n status: 'responseStatus' in entry ? entry.responseStatus : undefined,\n startTime: Math.round(entry.startTime),\n endTime: Math.round(entry.responseEnd),\n })),\n isInitial: true,\n })\n }\n const observer = new win.PerformanceObserver((entries) => {\n const performanceEntries = entries\n .getEntries()\n .filter(\n (entry): entry is ObservedPerformanceEntry =>\n isNavigationTiming(entry) ||\n (isResourceTiming(entry) &&\n options.initiatorTypes.includes(entry.initiatorType as InitiatorType) &&\n entry.initiatorType !== 'xmlhttprequest' &&\n entry.initiatorType !== 'fetch')\n )\n cb({\n requests: performanceEntries.map((entry) => ({\n url: entry.name,\n initiatorType: entry.initiatorType as InitiatorType,\n status: 'responseStatus' in entry ? entry.responseStatus : undefined,\n startTime: Math.round(entry.startTime),\n endTime: Math.round(entry.responseEnd),\n })),\n })\n })\n observer.observe({ entryTypes: ['navigation', 'resource'] })\n return () => {\n observer.disconnect()\n }\n}\n\nfunction shouldRecordHeaders(type: 'request' | 'response', recordHeaders: NetworkRecordOptions['recordHeaders']) {\n return !!recordHeaders && (_isBoolean(recordHeaders) || recordHeaders[type])\n}\n\nfunction shouldRecordBody(\n type: 'request' | 'response',\n recordBody: NetworkRecordOptions['recordBody'],\n headers: Headers\n) {\n function matchesContentType(contentTypes: string[]) {\n const contentTypeHeader = Object.keys(headers).find((key) => key.toLowerCase() === 'content-type')\n const contentType = contentTypeHeader && headers[contentTypeHeader]\n return contentTypes.some((ct) => contentType?.includes(ct))\n }\n if (!recordBody) return false\n if (_isBoolean(recordBody)) return true\n if (_isArray(recordBody)) return matchesContentType(recordBody)\n const recordBodyType = recordBody[type]\n if (_isBoolean(recordBodyType)) return recordBodyType\n return matchesContentType(recordBodyType)\n}\n\nasync function getRequestPerformanceEntry(\n win: IWindow,\n initiatorType: string,\n url: string,\n after?: number,\n before?: number,\n attempt = 0\n): Promise<PerformanceResourceTiming | null> {\n if (attempt > 10) {\n logger.warn('Failed to get performance entry for request', { url, initiatorType })\n return null\n }\n const urlPerformanceEntries = win.performance.getEntriesByName(url) as PerformanceResourceTiming[]\n const performanceEntry = findLast(\n urlPerformanceEntries,\n (entry) =>\n isResourceTiming(entry) &&\n entry.initiatorType === initiatorType &&\n (!after || entry.startTime >= after) &&\n (!before || entry.startTime <= before)\n )\n if (!performanceEntry) {\n await new Promise((resolve) => setTimeout(resolve, 50 * attempt))\n return getRequestPerformanceEntry(win, initiatorType, url, after, before, attempt + 1)\n }\n return performanceEntry\n}\n\nfunction initXhrObserver(cb: networkCallback, win: IWindow, options: Required<NetworkRecordOptions>): listenerHandler {\n if (!options.initiatorTypes.includes('xmlhttprequest')) {\n return () => {\n //\n }\n }\n const recordRequestHeaders = shouldRecordHeaders('request', options.recordHeaders)\n const recordResponseHeaders = shouldRecordHeaders('response', options.recordHeaders)\n\n const restorePatch = patch(\n win.XMLHttpRequest.prototype,\n 'open',\n // TODO how should this be typed?\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (originalOpen: typeof XMLHttpRequest.prototype.open) => {\n return function (\n method: string,\n url: string | URL,\n async = true,\n username?: string | null,\n password?: string | null\n ) {\n // because this function is returned in its actual context `this` _is_ an XMLHttpRequest\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const xhr = this as XMLHttpRequest\n\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url)\n const networkRequest: Partial<NetworkRequest> = {}\n let after: number | undefined\n let before: number | undefined\n const requestHeaders: Headers = {}\n const originalSetRequestHeader = xhr.setRequestHeader.bind(xhr)\n xhr.setRequestHeader = (header: string, value: string) => {\n requestHeaders[header] = value\n return originalSetRequestHeader(header, value)\n }\n if (recordRequestHeaders) {\n networkRequest.requestHeaders = requestHeaders\n }\n const originalSend = xhr.send.bind(xhr)\n xhr.send = (body) => {\n if (shouldRecordBody('request', options.recordBody, requestHeaders)) {\n if (_isUndefined(body) || _isNull(body)) {\n networkRequest.requestBody = null\n } else {\n networkRequest.requestBody = body\n }\n }\n after = win.performance.now()\n return originalSend(body)\n }\n xhr.addEventListener('readystatechange', () => {\n if (xhr.readyState !== xhr.DONE) {\n return\n }\n before = win.performance.now()\n const responseHeaders: Headers = {}\n const rawHeaders = xhr.getAllResponseHeaders()\n const headers = rawHeaders.trim().split(/[\\r\\n]+/)\n headers.forEach((line) => {\n const parts = line.split(': ')\n const header = parts.shift()\n const value = parts.join(': ')\n if (header) {\n responseHeaders[header] = value\n }\n })\n if (recordResponseHeaders) {\n networkRequest.responseHeaders = responseHeaders\n }\n if (shouldRecordBody('response', options.recordBody, responseHeaders)) {\n if (_isUndefined(xhr.response) || _isNull(xhr.response)) {\n networkRequest.responseBody = null\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n networkRequest.responseBody = xhr.response\n }\n }\n getRequestPerformanceEntry(win, 'xmlhttprequest', req.url, after, before)\n .then((entry) => {\n if (_isNull(entry)) {\n return\n }\n const request: NetworkRequest = {\n url: entry.name,\n method: req.method,\n initiatorType: entry.initiatorType as InitiatorType,\n status: xhr.status,\n startTime: Math.round(entry.startTime),\n endTime: Math.round(entry.responseEnd),\n requestHeaders: networkRequest.requestHeaders,\n requestBody: networkRequest.requestBody,\n responseHeaders: networkRequest.responseHeaders,\n responseBody: networkRequest.responseBody,\n }\n cb({ requests: [request] })\n })\n .catch(() => {\n //\n })\n })\n originalOpen.call(xhr, method, url, async, username, password)\n }\n }\n )\n return () => {\n restorePatch()\n }\n}\n\nfunction initFetchObserver(\n cb: networkCallback,\n win: IWindow,\n options: Required<NetworkRecordOptions>\n): listenerHandler {\n if (!options.initiatorTypes.includes('fetch')) {\n return () => {\n //\n }\n }\n const recordRequestHeaders = shouldRecordHeaders('request', options.recordHeaders)\n const recordResponseHeaders = shouldRecordHeaders('response', options.recordHeaders)\n // TODO how should this be typed?\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const restorePatch = patch(win, 'fetch', (originalFetch: typeof fetch) => {\n return async function (url: URL | RequestInfo, init?: RequestInit | undefined) {\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url, init)\n let res: Response | undefined\n const networkRequest: Partial<NetworkRequest> = {}\n let after: number | undefined\n let before: number | undefined\n try {\n const requestHeaders: Headers = {}\n req.headers.forEach((value, header) => {\n requestHeaders[header] = value\n })\n if (recordRequestHeaders) {\n networkRequest.requestHeaders = requestHeaders\n }\n if (shouldRecordBody('request', options.recordBody, requestHeaders)) {\n if (_isUndefined(req.body) || _isNull(req.body)) {\n networkRequest.requestBody = null\n } else {\n networkRequest.requestBody = req.body\n }\n }\n after = win.performance.now()\n res = await originalFetch(req)\n before = win.performance.now()\n const responseHeaders: Headers = {}\n res.headers.forEach((value, header) => {\n responseHeaders[header] = value\n })\n if (recordResponseHeaders) {\n networkRequest.responseHeaders = responseHeaders\n }\n if (shouldRecordBody('response', options.recordBody, responseHeaders)) {\n let body: string | undefined\n try {\n body = await res.clone().text()\n } catch {\n //\n }\n if (_isUndefined(res.body) || _isNull(res.body)) {\n networkRequest.responseBody = null\n } else {\n networkRequest.responseBody = body\n }\n }\n return res\n } finally {\n getRequestPerformanceEntry(win, 'fetch', req.url, after, before)\n .then((entry) => {\n if (_isNull(entry)) {\n return\n }\n const request: NetworkRequest = {\n url: entry.name,\n method: req.method,\n initiatorType: entry.initiatorType as InitiatorType,\n status: res?.status,\n startTime: Math.round(entry.startTime),\n endTime: Math.round(entry.responseEnd),\n requestHeaders: networkRequest.requestHeaders,\n requestBody: networkRequest.requestBody,\n responseHeaders: networkRequest.responseHeaders,\n responseBody: networkRequest.responseBody,\n }\n cb({ requests: [request] })\n })\n .catch(() => {\n //\n })\n }\n }\n })\n return () => {\n restorePatch()\n }\n}\n\nfunction initNetworkObserver(\n callback: networkCallback,\n win: IWindow, // top window or in an iframe\n options: NetworkRecordOptions\n): listenerHandler {\n if (!('performance' in win)) {\n return () => {\n //\n }\n }\n const networkOptions = (\n options ? Object.assign({}, defaultNetworkOptions, options) : defaultNetworkOptions\n ) as Required<NetworkRecordOptions>\n\n const cb: networkCallback = (data) => {\n const requests: NetworkRequest[] = []\n data.requests.forEach((request) => {\n const maskedRequest = networkOptions.maskRequestFn(request)\n if (maskedRequest) {\n requests.push(maskedRequest)\n }\n })\n\n if (requests.length > 0 || data.isInitial) {\n callback({ ...data, requests })\n }\n }\n const performanceObserver = initPerformanceObserver(cb, win, networkOptions)\n const xhrObserver = initXhrObserver(cb, win, networkOptions)\n const fetchObserver = initFetchObserver(cb, win, networkOptions)\n return () => {\n performanceObserver()\n xhrObserver()\n fetchObserver()\n }\n}\n\n// use the plugin name so that when this functionality is adopted into rrweb\n// we can remove this plugin and use the core functionality with the same data\nexport const NETWORK_PLUGIN_NAME = 'rrweb/network@1'\n\n// TODO how should this be typed?\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const getRecordNetworkPlugin: (options?: NetworkRecordOptions) => RecordPlugin = (options) => {\n return {\n name: NETWORK_PLUGIN_NAME,\n observer: initNetworkObserver,\n options: options,\n }\n}\n\n// rrweb/networ@1 ends\n\nif (window) {\n ;(window as any).rrweb = { record: rrwebRecord, version: 'v2', rrwebVersion: version }\n ;(window as any).rrwebConsoleRecord = { getRecordConsolePlugin }\n ;(window as any).getRecordNetworkPlugin = getRecordNetworkPlugin\n}\n\nexport default rrwebRecord\n"]}
|
|
@@ -6,11 +6,11 @@ import rrwebRecord from 'rrweb-v1/es/rrweb/packages/rrweb/src/record';
|
|
|
6
6
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
7
7
|
// @ts-ignore
|
|
8
8
|
import { getRecordConsolePlugin } from 'rrweb-v1/es/rrweb/packages/rrweb/src/plugins/console/record';
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
import { window } from './utils/globals';
|
|
10
|
+
if (window) {
|
|
11
|
+
;
|
|
12
|
+
window.rrweb = { record: rrwebRecord, version: 'v1', rrwebVersion: version };
|
|
13
|
+
window.rrwebConsoleRecord = { getRecordConsolePlugin: getRecordConsolePlugin };
|
|
14
|
+
}
|
|
15
15
|
export default rrwebRecord;
|
|
16
16
|
//# sourceMappingURL=loader-recorder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-recorder.js","sourceRoot":"","sources":["../../src/loader-recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAE/C,2DAA2D;AAC3D,6DAA6D;AAC7D,aAAa;AACb,OAAO,WAAW,MAAM,6CAA6C,CAAA;AACrE,6DAA6D;AAC7D,aAAa;AACb,OAAO,EAAE,sBAAsB,EAAE,MAAM,6DAA6D,CAAA;AAEpG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"loader-recorder.js","sourceRoot":"","sources":["../../src/loader-recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAE/C,2DAA2D;AAC3D,6DAA6D;AAC7D,aAAa;AACb,OAAO,WAAW,MAAM,6CAA6C,CAAA;AACrE,6DAA6D;AAC7D,aAAa;AACb,OAAO,EAAE,sBAAsB,EAAE,MAAM,6DAA6D,CAAA;AAEpG,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,IAAI,MAAM,EAAE;IACR,CAAC;IAAC,MAAc,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CACrF;IAAC,MAAc,CAAC,kBAAkB,GAAG,EAAE,sBAAsB,wBAAA,EAAE,CAAA;CACnE;AAED,eAAe,WAAW,CAAA","sourcesContent":["import { version } from 'rrweb-v1/package.json'\n\n// Same as loader-globals.ts except includes rrweb scripts.\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport rrwebRecord from 'rrweb-v1/es/rrweb/packages/rrweb/src/record'\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { getRecordConsolePlugin } from 'rrweb-v1/es/rrweb/packages/rrweb/src/plugins/console/record'\n\nimport { window } from './utils/globals'\n\nif (window) {\n ;(window as any).rrweb = { record: rrwebRecord, version: 'v1', rrwebVersion: version }\n ;(window as any).rrwebConsoleRecord = { getRecordConsolePlugin }\n}\n\nexport default rrwebRecord\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { generateSurveys } from './extensions/surveys';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { window } from './utils/globals';
|
|
3
|
+
if (window) {
|
|
4
|
+
;
|
|
5
|
+
window.extendPostHogWithSurveys = generateSurveys;
|
|
6
|
+
}
|
|
5
7
|
export default generateSurveys;
|
|
6
8
|
//# sourceMappingURL=loader-surveys.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-surveys.js","sourceRoot":"","sources":["../../src/loader-surveys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"loader-surveys.js","sourceRoot":"","sources":["../../src/loader-surveys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,IAAI,MAAM,EAAE;IACR,CAAC;IAAC,MAAc,CAAC,wBAAwB,GAAG,eAAe,CAAA;CAC9D;AAED,eAAe,eAAe,CAAA","sourcesContent":["import { generateSurveys } from './extensions/surveys'\n\nimport { window } from './utils/globals'\n\nif (window) {\n ;(window as any).extendPostHogWithSurveys = generateSurveys\n}\n\nexport default generateSurveys\n"]}
|
package/lib/src/page-view.js
CHANGED
|
@@ -33,8 +33,9 @@ var PageViewManager = /** @class */ (function () {
|
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
PageViewManager.prototype._createPageViewData = function () {
|
|
36
|
+
var _a;
|
|
36
37
|
return {
|
|
37
|
-
pathname: window.location.pathname,
|
|
38
|
+
pathname: (_a = window === null || window === void 0 ? void 0 : window.location.pathname) !== null && _a !== void 0 ? _a : '',
|
|
38
39
|
};
|
|
39
40
|
};
|
|
40
41
|
PageViewManager.prototype.doPageView = function () {
|
|
@@ -96,26 +97,28 @@ var PageViewManager = /** @class */ (function () {
|
|
|
96
97
|
};
|
|
97
98
|
};
|
|
98
99
|
PageViewManager.prototype.startMeasuringScrollPosition = function () {
|
|
99
|
-
window.addEventListener('scroll', this._updateScrollData);
|
|
100
|
-
window.addEventListener('scrollend', this._updateScrollData);
|
|
101
|
-
window.addEventListener('resize', this._updateScrollData);
|
|
100
|
+
window === null || window === void 0 ? void 0 : window.addEventListener('scroll', this._updateScrollData);
|
|
101
|
+
window === null || window === void 0 ? void 0 : window.addEventListener('scrollend', this._updateScrollData);
|
|
102
|
+
window === null || window === void 0 ? void 0 : window.addEventListener('resize', this._updateScrollData);
|
|
102
103
|
};
|
|
103
104
|
PageViewManager.prototype.stopMeasuringScrollPosition = function () {
|
|
104
|
-
window.removeEventListener('scroll', this._updateScrollData);
|
|
105
|
-
window.removeEventListener('scrollend', this._updateScrollData);
|
|
106
|
-
window.removeEventListener('resize', this._updateScrollData);
|
|
105
|
+
window === null || window === void 0 ? void 0 : window.removeEventListener('scroll', this._updateScrollData);
|
|
106
|
+
window === null || window === void 0 ? void 0 : window.removeEventListener('scrollend', this._updateScrollData);
|
|
107
|
+
window === null || window === void 0 ? void 0 : window.removeEventListener('resize', this._updateScrollData);
|
|
107
108
|
};
|
|
108
109
|
PageViewManager.prototype._scrollHeight = function () {
|
|
109
|
-
return
|
|
110
|
+
return window
|
|
111
|
+
? Math.max(0, window.document.documentElement.scrollHeight - window.document.documentElement.clientHeight)
|
|
112
|
+
: 0;
|
|
110
113
|
};
|
|
111
114
|
PageViewManager.prototype._scrollY = function () {
|
|
112
|
-
return window.scrollY || window.pageYOffset || window.document.documentElement.scrollTop || 0;
|
|
115
|
+
return window ? window.scrollY || window.pageYOffset || window.document.documentElement.scrollTop || 0 : 0;
|
|
113
116
|
};
|
|
114
117
|
PageViewManager.prototype._contentHeight = function () {
|
|
115
|
-
return window.document.documentElement.scrollHeight || 0;
|
|
118
|
+
return (window === null || window === void 0 ? void 0 : window.document.documentElement.scrollHeight) || 0;
|
|
116
119
|
};
|
|
117
120
|
PageViewManager.prototype._contentY = function () {
|
|
118
|
-
var clientHeight = window.document.documentElement.clientHeight || 0;
|
|
121
|
+
var clientHeight = (window === null || window === void 0 ? void 0 : window.document.documentElement.clientHeight) || 0;
|
|
119
122
|
return this._scrollY() + clientHeight;
|
|
120
123
|
};
|
|
121
124
|
return PageViewManager;
|
package/lib/src/page-view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-view.js","sourceRoot":"","sources":["../../src/page-view.ts"],"names":[],"mappings":"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","sourcesContent":["import { window } from './utils/globals'\n\ninterface PageViewData {\n pathname: string\n // scroll is how far down the page the user has scrolled,\n // content is how far down the page the user can view content\n // (e.g. if the page is 1000 tall, but the user's screen is only 500 tall,\n // and they don't scroll at all, then scroll is 0 and content is 500)\n maxScrollHeight?: number\n maxScrollY?: number\n lastScrollY?: number\n maxContentHeight?: number\n maxContentY?: number\n lastContentY?: number\n}\n\ninterface ScrollProperties {\n $prev_pageview_last_scroll?: number\n $prev_pageview_last_scroll_percentage?: number\n $prev_pageview_max_scroll?: number\n $prev_pageview_max_scroll_percentage?: number\n $prev_pageview_last_content?: number\n $prev_pageview_last_content_percentage?: number\n $prev_pageview_max_content?: number\n $prev_pageview_max_content_percentage?: number\n}\n\ninterface PageViewEventProperties extends ScrollProperties {\n $prev_pageview_pathname?: string\n}\n\nexport class PageViewManager {\n _pageViewData: PageViewData | undefined\n _hasSeenPageView = false\n\n _createPageViewData(): PageViewData {\n return {\n pathname: window.location.pathname,\n }\n }\n\n doPageView(): PageViewEventProperties {\n let prevPageViewData: PageViewData | undefined\n // if there were events created before the first PageView, we would have created a\n // pageViewData for them. If this happened, we don't want to create a new pageViewData\n if (!this._hasSeenPageView) {\n this._hasSeenPageView = true\n prevPageViewData = undefined\n if (!this._pageViewData) {\n this._pageViewData = this._createPageViewData()\n }\n } else {\n prevPageViewData = this._pageViewData\n this._pageViewData = this._createPageViewData()\n }\n\n // update the scroll properties for the new page, but wait until the next tick\n // of the event loop\n setTimeout(this._updateScrollData, 0)\n\n return {\n $prev_pageview_pathname: prevPageViewData?.pathname,\n ...this._calculatePrevPageScrollProperties(prevPageViewData),\n }\n }\n\n doPageLeave(): PageViewEventProperties {\n const prevPageViewData = this._pageViewData\n return {\n $prev_pageview_pathname: prevPageViewData?.pathname,\n ...this._calculatePrevPageScrollProperties(prevPageViewData),\n }\n }\n\n _calculatePrevPageScrollProperties(prevPageViewData: PageViewData | undefined): ScrollProperties {\n if (\n !prevPageViewData ||\n prevPageViewData.maxScrollHeight == null ||\n prevPageViewData.lastScrollY == null ||\n prevPageViewData.maxScrollY == null ||\n prevPageViewData.maxContentHeight == null ||\n prevPageViewData.lastContentY == null ||\n prevPageViewData.maxContentY == null\n ) {\n return {}\n }\n\n let { maxScrollHeight, lastScrollY, maxScrollY, maxContentHeight, lastContentY, maxContentY } = prevPageViewData\n\n // Use ceil, so that e.g. scrolling 999.5px of a 1000px page is considered 100% scrolled\n maxScrollHeight = Math.ceil(maxScrollHeight)\n lastScrollY = Math.ceil(lastScrollY)\n maxScrollY = Math.ceil(maxScrollY)\n maxContentHeight = Math.ceil(maxContentHeight)\n lastContentY = Math.ceil(lastContentY)\n maxContentY = Math.ceil(maxContentY)\n\n // if the maximum scroll height is near 0, then the percentage is 1\n const lastScrollPercentage = maxScrollHeight <= 1 ? 1 : clamp(lastScrollY / maxScrollHeight, 0, 1)\n const maxScrollPercentage = maxScrollHeight <= 1 ? 1 : clamp(maxScrollY / maxScrollHeight, 0, 1)\n const lastContentPercentage = maxContentHeight <= 1 ? 1 : clamp(lastContentY / maxContentHeight, 0, 1)\n const maxContentPercentage = maxContentHeight <= 1 ? 1 : clamp(maxContentY / maxContentHeight, 0, 1)\n\n return {\n $prev_pageview_last_scroll: lastScrollY,\n $prev_pageview_last_scroll_percentage: lastScrollPercentage,\n $prev_pageview_max_scroll: maxScrollY,\n $prev_pageview_max_scroll_percentage: maxScrollPercentage,\n $prev_pageview_last_content: lastContentY,\n $prev_pageview_last_content_percentage: lastContentPercentage,\n $prev_pageview_max_content: maxContentY,\n $prev_pageview_max_content_percentage: maxContentPercentage,\n }\n }\n\n _updateScrollData = () => {\n if (!this._pageViewData) {\n this._pageViewData = this._createPageViewData()\n }\n const pageViewData = this._pageViewData\n\n const scrollY = this._scrollY()\n const scrollHeight = this._scrollHeight()\n const contentY = this._contentY()\n const contentHeight = this._contentHeight()\n\n pageViewData.lastScrollY = scrollY\n pageViewData.maxScrollY = Math.max(scrollY, pageViewData.maxScrollY ?? 0)\n pageViewData.maxScrollHeight = Math.max(scrollHeight, pageViewData.maxScrollHeight ?? 0)\n\n pageViewData.lastContentY = contentY\n pageViewData.maxContentY = Math.max(contentY, pageViewData.maxContentY ?? 0)\n pageViewData.maxContentHeight = Math.max(contentHeight, pageViewData.maxContentHeight ?? 0)\n }\n\n startMeasuringScrollPosition() {\n window.addEventListener('scroll', this._updateScrollData)\n window.addEventListener('scrollend', this._updateScrollData)\n window.addEventListener('resize', this._updateScrollData)\n }\n\n stopMeasuringScrollPosition() {\n window.removeEventListener('scroll', this._updateScrollData)\n window.removeEventListener('scrollend', this._updateScrollData)\n window.removeEventListener('resize', this._updateScrollData)\n }\n\n _scrollHeight(): number {\n return Math.max(0, window.document.documentElement.scrollHeight - window.document.documentElement.clientHeight)\n }\n\n _scrollY(): number {\n return window.scrollY || window.pageYOffset || window.document.documentElement.scrollTop || 0\n }\n\n _contentHeight(): number {\n return window.document.documentElement.scrollHeight || 0\n }\n\n _contentY(): number {\n const clientHeight = window.document.documentElement.clientHeight || 0\n return this._scrollY() + clientHeight\n }\n}\n\nfunction clamp(x: number, min: number, max: number) {\n return Math.max(min, Math.min(x, max))\n}\n"]}
|
|
1
|
+
{"version":3,"file":"page-view.js","sourceRoot":"","sources":["../../src/page-view.ts"],"names":[],"mappings":"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","sourcesContent":["import { window } from './utils/globals'\n\ninterface PageViewData {\n pathname: string\n // scroll is how far down the page the user has scrolled,\n // content is how far down the page the user can view content\n // (e.g. if the page is 1000 tall, but the user's screen is only 500 tall,\n // and they don't scroll at all, then scroll is 0 and content is 500)\n maxScrollHeight?: number\n maxScrollY?: number\n lastScrollY?: number\n maxContentHeight?: number\n maxContentY?: number\n lastContentY?: number\n}\n\ninterface ScrollProperties {\n $prev_pageview_last_scroll?: number\n $prev_pageview_last_scroll_percentage?: number\n $prev_pageview_max_scroll?: number\n $prev_pageview_max_scroll_percentage?: number\n $prev_pageview_last_content?: number\n $prev_pageview_last_content_percentage?: number\n $prev_pageview_max_content?: number\n $prev_pageview_max_content_percentage?: number\n}\n\ninterface PageViewEventProperties extends ScrollProperties {\n $prev_pageview_pathname?: string\n}\n\nexport class PageViewManager {\n _pageViewData: PageViewData | undefined\n _hasSeenPageView = false\n\n _createPageViewData(): PageViewData {\n return {\n pathname: window?.location.pathname ?? '',\n }\n }\n\n doPageView(): PageViewEventProperties {\n let prevPageViewData: PageViewData | undefined\n // if there were events created before the first PageView, we would have created a\n // pageViewData for them. If this happened, we don't want to create a new pageViewData\n if (!this._hasSeenPageView) {\n this._hasSeenPageView = true\n prevPageViewData = undefined\n if (!this._pageViewData) {\n this._pageViewData = this._createPageViewData()\n }\n } else {\n prevPageViewData = this._pageViewData\n this._pageViewData = this._createPageViewData()\n }\n\n // update the scroll properties for the new page, but wait until the next tick\n // of the event loop\n setTimeout(this._updateScrollData, 0)\n\n return {\n $prev_pageview_pathname: prevPageViewData?.pathname,\n ...this._calculatePrevPageScrollProperties(prevPageViewData),\n }\n }\n\n doPageLeave(): PageViewEventProperties {\n const prevPageViewData = this._pageViewData\n return {\n $prev_pageview_pathname: prevPageViewData?.pathname,\n ...this._calculatePrevPageScrollProperties(prevPageViewData),\n }\n }\n\n _calculatePrevPageScrollProperties(prevPageViewData: PageViewData | undefined): ScrollProperties {\n if (\n !prevPageViewData ||\n prevPageViewData.maxScrollHeight == null ||\n prevPageViewData.lastScrollY == null ||\n prevPageViewData.maxScrollY == null ||\n prevPageViewData.maxContentHeight == null ||\n prevPageViewData.lastContentY == null ||\n prevPageViewData.maxContentY == null\n ) {\n return {}\n }\n\n let { maxScrollHeight, lastScrollY, maxScrollY, maxContentHeight, lastContentY, maxContentY } = prevPageViewData\n\n // Use ceil, so that e.g. scrolling 999.5px of a 1000px page is considered 100% scrolled\n maxScrollHeight = Math.ceil(maxScrollHeight)\n lastScrollY = Math.ceil(lastScrollY)\n maxScrollY = Math.ceil(maxScrollY)\n maxContentHeight = Math.ceil(maxContentHeight)\n lastContentY = Math.ceil(lastContentY)\n maxContentY = Math.ceil(maxContentY)\n\n // if the maximum scroll height is near 0, then the percentage is 1\n const lastScrollPercentage = maxScrollHeight <= 1 ? 1 : clamp(lastScrollY / maxScrollHeight, 0, 1)\n const maxScrollPercentage = maxScrollHeight <= 1 ? 1 : clamp(maxScrollY / maxScrollHeight, 0, 1)\n const lastContentPercentage = maxContentHeight <= 1 ? 1 : clamp(lastContentY / maxContentHeight, 0, 1)\n const maxContentPercentage = maxContentHeight <= 1 ? 1 : clamp(maxContentY / maxContentHeight, 0, 1)\n\n return {\n $prev_pageview_last_scroll: lastScrollY,\n $prev_pageview_last_scroll_percentage: lastScrollPercentage,\n $prev_pageview_max_scroll: maxScrollY,\n $prev_pageview_max_scroll_percentage: maxScrollPercentage,\n $prev_pageview_last_content: lastContentY,\n $prev_pageview_last_content_percentage: lastContentPercentage,\n $prev_pageview_max_content: maxContentY,\n $prev_pageview_max_content_percentage: maxContentPercentage,\n }\n }\n\n _updateScrollData = () => {\n if (!this._pageViewData) {\n this._pageViewData = this._createPageViewData()\n }\n const pageViewData = this._pageViewData\n\n const scrollY = this._scrollY()\n const scrollHeight = this._scrollHeight()\n const contentY = this._contentY()\n const contentHeight = this._contentHeight()\n\n pageViewData.lastScrollY = scrollY\n pageViewData.maxScrollY = Math.max(scrollY, pageViewData.maxScrollY ?? 0)\n pageViewData.maxScrollHeight = Math.max(scrollHeight, pageViewData.maxScrollHeight ?? 0)\n\n pageViewData.lastContentY = contentY\n pageViewData.maxContentY = Math.max(contentY, pageViewData.maxContentY ?? 0)\n pageViewData.maxContentHeight = Math.max(contentHeight, pageViewData.maxContentHeight ?? 0)\n }\n\n startMeasuringScrollPosition() {\n window?.addEventListener('scroll', this._updateScrollData)\n window?.addEventListener('scrollend', this._updateScrollData)\n window?.addEventListener('resize', this._updateScrollData)\n }\n\n stopMeasuringScrollPosition() {\n window?.removeEventListener('scroll', this._updateScrollData)\n window?.removeEventListener('scrollend', this._updateScrollData)\n window?.removeEventListener('resize', this._updateScrollData)\n }\n\n _scrollHeight(): number {\n return window\n ? Math.max(0, window.document.documentElement.scrollHeight - window.document.documentElement.clientHeight)\n : 0\n }\n\n _scrollY(): number {\n return window ? window.scrollY || window.pageYOffset || window.document.documentElement.scrollTop || 0 : 0\n }\n\n _contentHeight(): number {\n return window?.document.documentElement.scrollHeight || 0\n }\n\n _contentY(): number {\n const clientHeight = window?.document.documentElement.clientHeight || 0\n return this._scrollY() + clientHeight\n }\n}\n\nfunction clamp(x: number, min: number, max: number) {\n return Math.max(min, Math.min(x, max))\n}\n"]}
|
package/lib/src/posthog-core.js
CHANGED
|
@@ -47,7 +47,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
47
47
|
};
|
|
48
48
|
import Config from './config';
|
|
49
49
|
import { _copyAndTruncateStrings, _each, _eachArray, _extend, _isBlockedUA, _register_event, _safewrap_class, isCrossDomainCookie, } from './utils';
|
|
50
|
-
import { window } from './utils/globals';
|
|
50
|
+
import { assignableWindow, window } from './utils/globals';
|
|
51
51
|
import { autocapture } from './autocapture';
|
|
52
52
|
import { PostHogFeatureFlags } from './posthog-featureflags';
|
|
53
53
|
import { PostHogPersistence } from './posthog-persistence';
|
|
@@ -100,11 +100,11 @@ var PRIMARY_INSTANCE_NAME = 'posthog';
|
|
|
100
100
|
*/
|
|
101
101
|
// http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/
|
|
102
102
|
// https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#withCredentials
|
|
103
|
-
var USE_XHR = window.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest();
|
|
103
|
+
var USE_XHR = (window === null || window === void 0 ? void 0 : window.XMLHttpRequest) && 'withCredentials' in new XMLHttpRequest();
|
|
104
104
|
// IE<10 does not support cross-origin XHR's but script tags
|
|
105
105
|
// with defer won't block window.onload; ENQUEUE_REQUESTS
|
|
106
106
|
// should only be true for Opera<12
|
|
107
|
-
var ENQUEUE_REQUESTS = !USE_XHR && userAgent.indexOf('MSIE') === -1 && userAgent.indexOf('Mozilla') === -1;
|
|
107
|
+
var ENQUEUE_REQUESTS = !USE_XHR && (userAgent === null || userAgent === void 0 ? void 0 : userAgent.indexOf('MSIE')) === -1 && (userAgent === null || userAgent === void 0 ? void 0 : userAgent.indexOf('Mozilla')) === -1;
|
|
108
108
|
export var defaultConfig = function () {
|
|
109
109
|
var _a;
|
|
110
110
|
return ({
|
|
@@ -336,7 +336,7 @@ var PostHog = /** @class */ (function () {
|
|
|
336
336
|
//
|
|
337
337
|
PostHog.prototype._init = function (token, config, name, initComplete) {
|
|
338
338
|
var _this = this;
|
|
339
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
339
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
340
340
|
if (config === void 0) { config = {}; }
|
|
341
341
|
this.__loaded = true;
|
|
342
342
|
this.config = {}; // will be set right below
|
|
@@ -442,8 +442,7 @@ var PostHog = /** @class */ (function () {
|
|
|
442
442
|
}
|
|
443
443
|
// Set up event handler for pageleave
|
|
444
444
|
// Use `onpagehide` if available, see https://calendar.perfplanet.com/2020/beaconing-in-practice/#beaconing-reliability-avoiding-abandons
|
|
445
|
-
window.addEventListener
|
|
446
|
-
window.addEventListener('onpagehide' in self ? 'pagehide' : 'unload', this._handle_unload.bind(this));
|
|
445
|
+
(_h = window === null || window === void 0 ? void 0 : window.addEventListener) === null || _h === void 0 ? void 0 : _h.call(window, 'onpagehide' in self ? 'pagehide' : 'unload', this._handle_unload.bind(this));
|
|
447
446
|
// Make sure that we also call the initComplete callback at the end of
|
|
448
447
|
// the synchronous code as well.
|
|
449
448
|
updateInitComplete('syncCode')();
|
|
@@ -491,7 +490,7 @@ var PostHog = /** @class */ (function () {
|
|
|
491
490
|
this._start_queue_if_opted_in();
|
|
492
491
|
// this happens after so a user can call identify in
|
|
493
492
|
// the loaded callback
|
|
494
|
-
if (this.config.capture_pageview) {
|
|
493
|
+
if (this.config.capture_pageview && document) {
|
|
495
494
|
this.capture('$pageview', { title: document.title }, { send_instantly: true });
|
|
496
495
|
}
|
|
497
496
|
// Call decide to get what features are enabled and other settings.
|
|
@@ -598,7 +597,7 @@ var PostHog = /** @class */ (function () {
|
|
|
598
597
|
if (!USE_XHR) {
|
|
599
598
|
options.method = 'GET';
|
|
600
599
|
}
|
|
601
|
-
var useSendBeacon = 'sendBeacon' in window.navigator && options.transport === 'sendBeacon';
|
|
600
|
+
var useSendBeacon = window && 'sendBeacon' in window.navigator && options.transport === 'sendBeacon';
|
|
602
601
|
url = addParamsToURL(url, options.urlQueryArgs || {}, {
|
|
603
602
|
ip: this.config.ip,
|
|
604
603
|
});
|
|
@@ -606,14 +605,14 @@ var PostHog = /** @class */ (function () {
|
|
|
606
605
|
// beacon documentation https://w3c.github.io/beacon/
|
|
607
606
|
// beacons format the message and use the type property
|
|
608
607
|
try {
|
|
609
|
-
window.navigator.sendBeacon(url, encodePostData(data, __assign(__assign({}, options), { sendBeacon: true })));
|
|
608
|
+
window === null || window === void 0 ? void 0 : window.navigator.sendBeacon(url, encodePostData(data, __assign(__assign({}, options), { sendBeacon: true })));
|
|
610
609
|
}
|
|
611
610
|
catch (e) {
|
|
612
611
|
// send beacon is a best-effort, fire-and-forget mechanism on page unload,
|
|
613
612
|
// we don't want to throw errors here
|
|
614
613
|
}
|
|
615
614
|
}
|
|
616
|
-
else if (USE_XHR) {
|
|
615
|
+
else if (USE_XHR || !document) {
|
|
617
616
|
try {
|
|
618
617
|
xhr({
|
|
619
618
|
url: url,
|
|
@@ -758,7 +757,7 @@ var PostHog = /** @class */ (function () {
|
|
|
758
757
|
logger.error('No event name provided to posthog.capture');
|
|
759
758
|
return;
|
|
760
759
|
}
|
|
761
|
-
if (_isBlockedUA(userAgent, this.config.custom_blocked_useragents)) {
|
|
760
|
+
if (userAgent && _isBlockedUA(userAgent, this.config.custom_blocked_useragents)) {
|
|
762
761
|
return;
|
|
763
762
|
}
|
|
764
763
|
// update persistence
|
|
@@ -841,7 +840,7 @@ var PostHog = /** @class */ (function () {
|
|
|
841
840
|
}
|
|
842
841
|
properties = _extend(properties, performanceProperties);
|
|
843
842
|
}
|
|
844
|
-
if (event_name === '$pageview') {
|
|
843
|
+
if (event_name === '$pageview' && document) {
|
|
845
844
|
properties['title'] = document.title;
|
|
846
845
|
}
|
|
847
846
|
if (event_name === '$performance_event') {
|
|
@@ -1837,12 +1836,12 @@ var PostHog = /** @class */ (function () {
|
|
|
1837
1836
|
};
|
|
1838
1837
|
PostHog.prototype.debug = function (debug) {
|
|
1839
1838
|
if (debug === false) {
|
|
1840
|
-
window.console.log("You've disabled debug mode.");
|
|
1839
|
+
window === null || window === void 0 ? void 0 : window.console.log("You've disabled debug mode.");
|
|
1841
1840
|
localStorage && localStorage.removeItem('ph_debug');
|
|
1842
1841
|
this.set_config({ debug: false });
|
|
1843
1842
|
}
|
|
1844
1843
|
else {
|
|
1845
|
-
window.console.log("You're now in debug mode. All calls to PostHog will be logged in your console.\nYou can disable this with `posthog.debug(false)`.");
|
|
1844
|
+
window === null || window === void 0 ? void 0 : window.console.log("You're now in debug mode. All calls to PostHog will be logged in your console.\nYou can disable this with `posthog.debug(false)`.");
|
|
1846
1845
|
localStorage && localStorage.setItem('ph_debug', 'true');
|
|
1847
1846
|
this.set_config({ debug: true });
|
|
1848
1847
|
}
|
|
@@ -1891,8 +1890,7 @@ var override_ph_init_func = function () {
|
|
|
1891
1890
|
;
|
|
1892
1891
|
posthog_master = instance;
|
|
1893
1892
|
if (init_type === InitType.INIT_SNIPPET) {
|
|
1894
|
-
;
|
|
1895
|
-
window[PRIMARY_INSTANCE_NAME] = posthog_master;
|
|
1893
|
+
assignableWindow[PRIMARY_INSTANCE_NAME] = posthog_master;
|
|
1896
1894
|
}
|
|
1897
1895
|
extend_mp();
|
|
1898
1896
|
return instance;
|
|
@@ -1913,7 +1911,7 @@ var add_dom_loaded_handler = function () {
|
|
|
1913
1911
|
inst._dom_loaded();
|
|
1914
1912
|
});
|
|
1915
1913
|
}
|
|
1916
|
-
if (document.addEventListener) {
|
|
1914
|
+
if (document === null || document === void 0 ? void 0 : document.addEventListener) {
|
|
1917
1915
|
if (document.readyState === 'complete') {
|
|
1918
1916
|
// safari 4 can fire the DOMContentLoaded event before loading all
|
|
1919
1917
|
// external JS (including this file). you will see some copypasta
|
|
@@ -1926,15 +1924,16 @@ var add_dom_loaded_handler = function () {
|
|
|
1926
1924
|
}
|
|
1927
1925
|
}
|
|
1928
1926
|
// fallback handler, always will work
|
|
1929
|
-
|
|
1927
|
+
if (window) {
|
|
1928
|
+
_register_event(window, 'load', dom_loaded_handler, true);
|
|
1929
|
+
}
|
|
1930
1930
|
};
|
|
1931
1931
|
export function init_from_snippet() {
|
|
1932
1932
|
init_type = InitType.INIT_SNIPPET;
|
|
1933
|
-
if (_isUndefined(
|
|
1934
|
-
;
|
|
1935
|
-
window.posthog = [];
|
|
1933
|
+
if (_isUndefined(assignableWindow.posthog)) {
|
|
1934
|
+
assignableWindow.posthog = [];
|
|
1936
1935
|
}
|
|
1937
|
-
posthog_master =
|
|
1936
|
+
posthog_master = assignableWindow.posthog;
|
|
1938
1937
|
if (posthog_master['__loaded'] || (posthog_master['config'] && posthog_master['persistence'])) {
|
|
1939
1938
|
// lib has already been loaded at least once; we don't want to override the global object this time so bomb early
|
|
1940
1939
|
logger.critical('PostHog library has already been downloaded at least once.');
|