posthog-js 1.92.0 → 1.92.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/array.full.js +1 -1
  2. package/dist/array.full.js.map +1 -1
  3. package/dist/array.js +1 -1
  4. package/dist/array.js.map +1 -1
  5. package/dist/es.js +1 -1
  6. package/dist/es.js.map +1 -1
  7. package/dist/exception-autocapture.js +1 -1
  8. package/dist/exception-autocapture.js.map +1 -1
  9. package/dist/module.d.ts +21 -23
  10. package/dist/module.js +1 -1
  11. package/dist/module.js.map +1 -1
  12. package/dist/recorder-v2.js +2 -2
  13. package/dist/recorder-v2.js.map +1 -1
  14. package/dist/surveys.js.map +1 -1
  15. package/lib/package.json +1 -1
  16. package/lib/src/decide.js +4 -5
  17. package/lib/src/decide.js.map +1 -1
  18. package/lib/src/extensions/replay/config.d.ts +2 -2
  19. package/lib/src/extensions/replay/config.js +73 -6
  20. package/lib/src/extensions/replay/config.js.map +1 -1
  21. package/lib/src/extensions/replay/sessionrecording.d.ts +1 -0
  22. package/lib/src/extensions/replay/sessionrecording.js +14 -2
  23. package/lib/src/extensions/replay/sessionrecording.js.map +1 -1
  24. package/lib/src/loader-recorder-v2.d.ts +2 -2
  25. package/lib/src/loader-recorder-v2.js +101 -49
  26. package/lib/src/loader-recorder-v2.js.map +1 -1
  27. package/lib/src/posthog-core.d.ts +7 -2
  28. package/lib/src/posthog-core.js +18 -3
  29. package/lib/src/posthog-core.js.map +1 -1
  30. package/lib/src/types.d.ts +13 -2
  31. package/lib/src/types.js.map +1 -1
  32. package/lib/src/utils/event-utils.js +3 -4
  33. package/lib/src/utils/event-utils.js.map +1 -1
  34. package/lib/src/utils/request-utils.d.ts +7 -0
  35. package/lib/src/utils/request-utils.js +15 -0
  36. package/lib/src/utils/request-utils.js.map +1 -1
  37. package/lib/src/utils/type-utils.js +2 -7
  38. package/lib/src/utils/type-utils.js.map +1 -1
  39. package/package.json +1 -1
  40. package/lib/src/extensions/replay/web-performance.d.ts +0 -20
  41. package/lib/src/extensions/replay/web-performance.js +0 -248
  42. package/lib/src/extensions/replay/web-performance.js.map +0 -1
@@ -144,8 +144,10 @@ export interface SessionRecordingOptions {
144
144
  inlineStylesheet?: boolean;
145
145
  recorderVersion?: 'v1' | 'v2';
146
146
  recordCrossOriginIframes?: boolean;
147
- /** Modify the network request before it is captured. Returning null stops it being captured */
147
+ /** @deprecated - use maskCapturedNetworkRequestFn instead */
148
148
  maskNetworkRequestFn?: ((data: NetworkRequest) => NetworkRequest | null | undefined) | null;
149
+ /** Modify the network request before it is captured. Returning null or undefined stops it being captured */
150
+ maskCapturedNetworkRequestFn?: ((data: CapturedNetworkRequest) => CapturedNetworkRequest | null | undefined) | null;
149
151
  initiatorTypes?: InitiatorType[];
150
152
  recordHeaders?: boolean | {
151
153
  request: boolean;
@@ -318,7 +320,7 @@ export declare type Body = string | Document | Blob | ArrayBufferView | ArrayBuf
318
320
  export declare type InitiatorType = 'audio' | 'beacon' | 'body' | 'css' | 'early-hint' | 'embed' | 'fetch' | 'frame' | 'iframe' | 'icon' | 'image' | 'img' | 'input' | 'link' | 'navigation' | 'object' | 'ping' | 'script' | 'track' | 'video' | 'xmlhttprequest';
319
321
  export declare type NetworkRecordOptions = {
320
322
  initiatorTypes?: InitiatorType[];
321
- maskRequestFn?: (data: NetworkRequest) => NetworkRequest | undefined;
323
+ maskRequestFn?: (data: CapturedNetworkRequest) => CapturedNetworkRequest | undefined;
322
324
  recordHeaders?: boolean | {
323
325
  request: boolean;
324
326
  response: boolean;
@@ -328,16 +330,25 @@ export declare type NetworkRecordOptions = {
328
330
  response: boolean | string[];
329
331
  };
330
332
  recordInitialRequests?: boolean;
333
+ recordPerformance?: boolean;
334
+ performanceEntryTypeToObserve: string[];
335
+ payloadSizeLimitBytes: number;
331
336
  };
337
+ /** @deprecated - use CapturedNetworkRequest instead */
332
338
  export declare type NetworkRequest = {
333
339
  url: string;
340
+ };
341
+ export declare type CapturedNetworkRequest = Omit<PerformanceEntry, 'toJSON'> & {
334
342
  method?: string;
335
343
  initiatorType?: InitiatorType;
336
344
  status?: number;
345
+ timeOrigin?: number;
346
+ timestamp?: number;
337
347
  startTime?: number;
338
348
  endTime?: number;
339
349
  requestHeaders?: Headers;
340
350
  requestBody?: Body;
341
351
  responseHeaders?: Headers;
342
352
  responseBody?: Body;
353
+ isInitial?: boolean;
343
354
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAqLA,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACnB,iCAAkB,CAAA;IAClB,gCAAiB,CAAA;AACrB,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB","sourcesContent":["import type { MaskInputOptions, SlimDOMOptions } from 'rrweb-snapshot'\nimport { PostHog } from './posthog-core'\nimport { RetryQueue } from './retry-queue'\n\nexport type Property = any\nexport type Properties = Record<string, Property>\n\nexport interface CaptureResult {\n uuid: string\n event: string\n properties: Properties\n $set?: Properties\n $set_once?: Properties\n timestamp?: Date\n}\nexport type CaptureCallback = (response: any, data: any) => void\n\nexport type AutocaptureCompatibleElement = 'a' | 'button' | 'form' | 'input' | 'select' | 'textarea' | 'label'\nexport type DomAutocaptureEvents = 'click' | 'change' | 'submit'\n\n/**\n * If an array is passed for an allowlist, autocapture events will only be sent for elements matching\n * at least one of the elements in the array. Multiple allowlists can be used\n */\nexport interface AutocaptureConfig {\n /**\n * List of URLs to allow autocapture on, can be strings to match\n * or regexes e.g. ['https://example.com', 'test.com/.*']\n */\n url_allowlist?: (string | RegExp)[]\n\n /**\n * List of DOM events to allow autocapture on e.g. ['click', 'change', 'submit']\n */\n dom_event_allowlist?: DomAutocaptureEvents[]\n\n /**\n * List of DOM elements to allow autocapture on\n * e.g. ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n */\n element_allowlist?: AutocaptureCompatibleElement[]\n\n /**\n * List of CSS selectors to allow autocapture on\n * e.g. ['[ph-capture]']\n */\n css_selector_allowlist?: string[]\n\n /**\n * Exclude certain element attributes from autocapture\n * E.g. ['aria-label'] or [data-attr-pii]\n */\n element_attribute_ignorelist?: string[]\n}\n\nexport type UUIDVersion = 'og' | 'v7'\n\nexport interface PostHogConfig {\n api_host: string\n api_method: string\n api_transport: string\n ui_host: string | null\n token: string\n autocapture: boolean | AutocaptureConfig\n rageclick: boolean\n cross_subdomain_cookie: boolean\n persistence: 'localStorage' | 'cookie' | 'memory' | 'localStorage+cookie' | 'sessionStorage'\n persistence_name: string\n cookie_name: string\n loaded: (posthog_instance: PostHog) => void\n store_google: boolean\n custom_campaign_params: string[]\n // a list of strings to be tested against navigator.userAgent to determine if the source is a bot\n // this is **added to** the default list of bots that we check\n // defaults to the empty array\n custom_blocked_useragents: string[]\n save_referrer: boolean\n verbose: boolean\n capture_pageview: boolean\n capture_pageleave: boolean\n debug: boolean\n cookie_expiration: number\n upgrade: boolean\n disable_session_recording: boolean\n disable_persistence: boolean\n disable_cookie: boolean\n enable_recording_console_log?: boolean\n secure_cookie: boolean\n ip: boolean\n opt_out_capturing_by_default: boolean\n opt_out_persistence_by_default: boolean\n opt_out_capturing_persistence_type: 'localStorage' | 'cookie'\n opt_out_capturing_cookie_prefix: string | null\n opt_in_site_apps: boolean\n respect_dnt: boolean\n property_blacklist: string[]\n xhr_headers: { [header_name: string]: string }\n on_xhr_error: (failedRequest: XMLHttpRequest) => void\n inapp_protocol: string\n inapp_link_new_window: boolean\n request_batching: boolean\n sanitize_properties: ((properties: Properties, event_name: string) => Properties) | null\n properties_string_max_length: number\n session_recording: SessionRecordingOptions\n session_idle_timeout_seconds: number\n mask_all_element_attributes: boolean\n mask_all_text: boolean\n advanced_disable_decide: boolean\n advanced_disable_feature_flags: boolean\n advanced_disable_feature_flags_on_first_load: boolean\n advanced_disable_toolbar_metrics: boolean\n get_device_id: (uuid: string) => string\n name: string\n callback_fn: string\n _onCapture: (eventName: string, eventData: CaptureResult) => void\n capture_performance?: boolean\n // Should only be used for testing. Could negatively impact performance.\n disable_compression: boolean\n bootstrap: {\n distinctID?: string\n isIdentifiedID?: boolean\n featureFlags?: Record<string, boolean | string>\n featureFlagPayloads?: Record<string, JsonType>\n }\n segment?: any\n __preview_measure_pageview_stats?: boolean\n __preview_send_client_session_params?: boolean\n}\n\nexport interface OptInOutCapturingOptions {\n capture: (event: string, properties: Properties, options: CaptureOptions) => void\n capture_event_name: string\n capture_properties: Properties\n enable_persistence: boolean\n clear_persistence: boolean\n persistence_type: 'cookie' | 'localStorage' | 'localStorage+cookie'\n cookie_prefix: string\n cookie_expiration: number\n cross_subdomain_cookie: boolean\n secure_cookie: boolean\n}\n\nexport interface isFeatureEnabledOptions {\n send_event: boolean\n}\n\nexport interface SessionRecordingOptions {\n blockClass?: string | RegExp\n blockSelector?: string | null\n ignoreClass?: string\n maskTextClass?: string | RegExp\n maskTextSelector?: string | null\n maskTextFn?: ((text: string) => string) | null\n maskAllInputs?: boolean\n maskInputOptions?: MaskInputOptions\n maskInputFn?: ((text: string, element?: HTMLElement) => string) | null\n slimDOMOptions?: SlimDOMOptions | 'all' | true\n collectFonts?: boolean\n inlineStylesheet?: boolean\n recorderVersion?: 'v1' | 'v2'\n recordCrossOriginIframes?: boolean\n /** Modify the network request before it is captured. Returning null stops it being captured */\n // TODO this has to work for both capture mechanisms? 😱\n maskNetworkRequestFn?: ((data: NetworkRequest) => NetworkRequest | null | undefined) | null\n // properties below here are ALPHA, don't rely on them, they may change without notice\n // TODO which of these do we actually expose?\n // if this isn't provided a default will be used\n // this only applies to the payload recorder\n // TODO I guess it should apply to the other recorder to\n initiatorTypes?: InitiatorType[]\n recordHeaders?: boolean | { request: boolean; response: boolean }\n // true means record all bodies\n // false means record no bodies\n // string[] means record bodies matching the provided content-type headers\n recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }\n // I can't think why you wouldn't want this... so\n // recordInitialRequests?: boolean\n}\n\nexport type SessionIdChangedCallback = (sessionId: string, windowId: string | null | undefined) => void\n\nexport enum Compression {\n GZipJS = 'gzip-js',\n Base64 = 'base64',\n}\n\nexport interface XHROptions {\n transport?: 'XHR' | 'sendBeacon'\n method?: 'POST' | 'GET'\n urlQueryArgs?: { compression: Compression }\n verbose?: boolean\n blob?: boolean\n sendBeacon?: boolean\n}\n\nexport interface CaptureOptions extends XHROptions {\n $set?: Properties /** used with $identify */\n $set_once?: Properties /** used with $identify */\n _batchKey?: string /** key of queue, e.g. 'sessionRecording' vs 'event' */\n _metrics?: Properties\n _noTruncate?: boolean /** if set, overrides and disables config.properties_string_max_length */\n endpoint?: string /** defaults to '/e/' */\n send_instantly?: boolean /** if set skips the batched queue */\n timestamp?: Date\n}\n\nexport interface RetryQueueElement {\n retryAt: Date\n requestData: QueuedRequestData\n}\nexport interface QueuedRequestData {\n url: string\n data: Properties\n options: CaptureOptions\n headers?: Properties\n callback?: RequestCallback\n retriesPerformedSoFar?: number\n}\n\nexport interface XHRParams extends QueuedRequestData {\n retryQueue: RetryQueue\n onXHRError: (req: XMLHttpRequest) => void\n timeout?: number\n onResponse?: (req: XMLHttpRequest) => void\n}\n\nexport interface DecideResponse {\n status: number\n supportedCompression: Compression[]\n config: {\n enable_collect_everything: boolean\n }\n custom_properties: AutoCaptureCustomProperty[] // TODO: delete, not sent\n featureFlags: Record<string, string | boolean>\n featureFlagPayloads: Record<string, JsonType>\n errorsWhileComputingFlags: boolean\n autocapture_opt_out?: boolean\n capturePerformance?: boolean\n analytics?: {\n endpoint?: string\n }\n elementsChainAsString?: boolean\n // this is currently in development and may have breaking changes without a major version bump\n autocaptureExceptions?:\n | boolean\n | {\n endpoint?: string\n errors_to_ignore: string[]\n }\n sessionRecording?: {\n endpoint?: string\n consoleLogRecordingEnabled?: boolean\n recorderVersion?: 'v1' | 'v2'\n // the API returns a decimal between 0 and 1 as a string\n sampleRate?: string | null\n minimumDurationMilliseconds?: number\n linkedFlag?: string | null\n networkPayloadCapture?: Pick<NetworkRecordOptions, 'recordBody' | 'recordHeaders'>\n }\n surveys?: boolean\n toolbarParams: ToolbarParams\n editorParams?: ToolbarParams /** @deprecated, renamed to toolbarParams, still present on older API responses */\n toolbarVersion: 'toolbar' /** @deprecated, moved to toolbarParams */\n isAuthenticated: boolean\n siteApps: { id: number; url: string }[]\n}\n\nexport type FeatureFlagsCallback = (flags: string[], variants: Record<string, string | boolean>) => void\n\n// TODO: delete custom_properties after changeless typescript refactor\nexport interface AutoCaptureCustomProperty {\n name: string\n css_selector: string\n event_selectors: string[]\n}\n\nexport interface CompressionData {\n data: string\n compression?: Compression\n}\n\nexport interface GDPROptions {\n capture?: (\n event: string,\n properties: Properties,\n options: CaptureOptions\n ) => void /** function used for capturing a PostHog event to record the opt-in action */\n captureEventName?: string /** event name to be used for capturing the opt-in action */\n captureProperties?: Properties /** set of properties to be captured along with the opt-in action */\n /** persistence mechanism used */\n persistenceType?: 'cookie' | 'localStorage' | 'localStorage+cookie'\n persistencePrefix?: string /** [__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name */\n cookieExpiration?: number /** number of days until the opt-in cookie expires */\n crossSubdomainCookie?: boolean /** whether the opt-in cookie is set as cross-subdomain or not */\n secureCookie?: boolean /** whether the opt-in cookie is set as secure or not */\n respectDnt?: boolean\n window?: Window\n}\n\nexport type RequestCallback = (response: Record<string, any>, data?: Properties) => void\n\nexport interface PersistentStore {\n is_supported: () => boolean\n error: (error: any) => void\n parse: (name: string) => any\n get: (name: string) => any\n set: (name: string, value: any, expire_days?: number | null, cross_subdomain?: boolean, secure?: boolean) => void\n remove: (name: string, cross_subdomain?: boolean) => void\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type Breaker = {}\nexport type EventHandler = (event: Event) => boolean | void\n\nexport type ToolbarUserIntent = 'add-action' | 'edit-action'\nexport type ToolbarSource = 'url' | 'localstorage'\nexport type ToolbarVersion = 'toolbar'\n\n/* sync with posthog */\nexport interface ToolbarParams {\n token?: string /** public posthog-js token */\n temporaryToken?: string /** private temporary user token */\n actionId?: number\n userIntent?: ToolbarUserIntent\n source?: ToolbarSource\n toolbarVersion?: ToolbarVersion\n instrument?: boolean\n distinctId?: string\n userEmail?: string\n dataAttributes?: string[]\n featureFlags?: Record<string, string | boolean>\n}\n\nexport interface PostData {\n buffer?: BlobPart\n compression?: Compression\n data?: string\n}\n\nexport interface JSC {\n (): void\n [key: string]: (response: any) => void\n}\n\nexport type SnippetArrayItem = [method: string, ...args: any[]]\n\nexport type JsonType = string | number | boolean | null | { [key: string]: JsonType } | Array<JsonType>\n\n/** A feature that isn't publicly available yet.*/\nexport interface EarlyAccessFeature {\n // Sync this with the backend's EarlyAccessFeatureSerializer!\n name: string\n description: string\n stage: 'concept' | 'alpha' | 'beta'\n documentationUrl: string | null\n flagKey: string | null\n}\n\nexport type EarlyAccessFeatureCallback = (earlyAccessFeatures: EarlyAccessFeature[]) => void\n\nexport interface EarlyAccessFeatureResponse {\n earlyAccessFeatures: EarlyAccessFeature[]\n}\n\nexport type Headers = Record<string, string>\n\nexport type Body =\n | string\n | Document\n | Blob\n | ArrayBufferView\n | ArrayBuffer\n | FormData\n | URLSearchParams\n | ReadableStream<Uint8Array>\n | null\n\n/* for rrweb/network@1\n ** when that is released as part of rrweb this can be removed\n ** don't rely on this type, it may change without notice\n */\nexport type InitiatorType =\n | 'audio'\n | 'beacon'\n | 'body'\n | 'css'\n | 'early-hint'\n | 'embed'\n | 'fetch'\n | 'frame'\n | 'iframe'\n | 'icon'\n | 'image'\n | 'img'\n | 'input'\n | 'link'\n | 'navigation'\n | 'object'\n | 'ping'\n | 'script'\n | 'track'\n | 'video'\n | 'xmlhttprequest'\n\nexport type NetworkRecordOptions = {\n initiatorTypes?: InitiatorType[]\n maskRequestFn?: (data: NetworkRequest) => NetworkRequest | undefined\n recordHeaders?: boolean | { request: boolean; response: boolean }\n recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }\n recordInitialRequests?: boolean\n}\n\n// extending this to match the rrweb NetworkRequest type\n// it is different in that the rrweb type will have initator type, starttime, and endtime\n// as required properties. but we don't want to require them here\n// because we've previously exposed this type as only having `url`\nexport type NetworkRequest = {\n url: string\n // properties below here are ALPHA, don't rely on them, they may change without notice\n method?: string\n initiatorType?: InitiatorType\n status?: number\n startTime?: number\n endTime?: number\n requestHeaders?: Headers\n requestBody?: Body\n responseHeaders?: Headers\n responseBody?: Body\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAsLA,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACnB,iCAAkB,CAAA;IAClB,gCAAiB,CAAA;AACrB,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB","sourcesContent":["import type { MaskInputOptions, SlimDOMOptions } from 'rrweb-snapshot'\nimport { PostHog } from './posthog-core'\nimport { RetryQueue } from './retry-queue'\n\nexport type Property = any\nexport type Properties = Record<string, Property>\n\nexport interface CaptureResult {\n uuid: string\n event: string\n properties: Properties\n $set?: Properties\n $set_once?: Properties\n timestamp?: Date\n}\nexport type CaptureCallback = (response: any, data: any) => void\n\nexport type AutocaptureCompatibleElement = 'a' | 'button' | 'form' | 'input' | 'select' | 'textarea' | 'label'\nexport type DomAutocaptureEvents = 'click' | 'change' | 'submit'\n\n/**\n * If an array is passed for an allowlist, autocapture events will only be sent for elements matching\n * at least one of the elements in the array. Multiple allowlists can be used\n */\nexport interface AutocaptureConfig {\n /**\n * List of URLs to allow autocapture on, can be strings to match\n * or regexes e.g. ['https://example.com', 'test.com/.*']\n */\n url_allowlist?: (string | RegExp)[]\n\n /**\n * List of DOM events to allow autocapture on e.g. ['click', 'change', 'submit']\n */\n dom_event_allowlist?: DomAutocaptureEvents[]\n\n /**\n * List of DOM elements to allow autocapture on\n * e.g. ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n */\n element_allowlist?: AutocaptureCompatibleElement[]\n\n /**\n * List of CSS selectors to allow autocapture on\n * e.g. ['[ph-capture]']\n */\n css_selector_allowlist?: string[]\n\n /**\n * Exclude certain element attributes from autocapture\n * E.g. ['aria-label'] or [data-attr-pii]\n */\n element_attribute_ignorelist?: string[]\n}\n\nexport type UUIDVersion = 'og' | 'v7'\n\nexport interface PostHogConfig {\n api_host: string\n api_method: string\n api_transport: string\n ui_host: string | null\n token: string\n autocapture: boolean | AutocaptureConfig\n rageclick: boolean\n cross_subdomain_cookie: boolean\n persistence: 'localStorage' | 'cookie' | 'memory' | 'localStorage+cookie' | 'sessionStorage'\n persistence_name: string\n cookie_name: string\n loaded: (posthog_instance: PostHog) => void\n store_google: boolean\n custom_campaign_params: string[]\n // a list of strings to be tested against navigator.userAgent to determine if the source is a bot\n // this is **added to** the default list of bots that we check\n // defaults to the empty array\n custom_blocked_useragents: string[]\n save_referrer: boolean\n verbose: boolean\n capture_pageview: boolean\n capture_pageleave: boolean\n debug: boolean\n cookie_expiration: number\n upgrade: boolean\n disable_session_recording: boolean\n disable_persistence: boolean\n disable_cookie: boolean\n enable_recording_console_log?: boolean\n secure_cookie: boolean\n ip: boolean\n opt_out_capturing_by_default: boolean\n opt_out_persistence_by_default: boolean\n opt_out_capturing_persistence_type: 'localStorage' | 'cookie'\n opt_out_capturing_cookie_prefix: string | null\n opt_in_site_apps: boolean\n respect_dnt: boolean\n property_blacklist: string[]\n xhr_headers: { [header_name: string]: string }\n on_xhr_error: (failedRequest: XMLHttpRequest) => void\n inapp_protocol: string\n inapp_link_new_window: boolean\n request_batching: boolean\n sanitize_properties: ((properties: Properties, event_name: string) => Properties) | null\n properties_string_max_length: number\n session_recording: SessionRecordingOptions\n session_idle_timeout_seconds: number\n mask_all_element_attributes: boolean\n mask_all_text: boolean\n advanced_disable_decide: boolean\n advanced_disable_feature_flags: boolean\n advanced_disable_feature_flags_on_first_load: boolean\n advanced_disable_toolbar_metrics: boolean\n get_device_id: (uuid: string) => string\n name: string\n callback_fn: string\n _onCapture: (eventName: string, eventData: CaptureResult) => void\n capture_performance?: boolean\n // Should only be used for testing. Could negatively impact performance.\n disable_compression: boolean\n bootstrap: {\n distinctID?: string\n isIdentifiedID?: boolean\n featureFlags?: Record<string, boolean | string>\n featureFlagPayloads?: Record<string, JsonType>\n }\n segment?: any\n __preview_measure_pageview_stats?: boolean\n __preview_send_client_session_params?: boolean\n}\n\nexport interface OptInOutCapturingOptions {\n capture: (event: string, properties: Properties, options: CaptureOptions) => void\n capture_event_name: string\n capture_properties: Properties\n enable_persistence: boolean\n clear_persistence: boolean\n persistence_type: 'cookie' | 'localStorage' | 'localStorage+cookie'\n cookie_prefix: string\n cookie_expiration: number\n cross_subdomain_cookie: boolean\n secure_cookie: boolean\n}\n\nexport interface isFeatureEnabledOptions {\n send_event: boolean\n}\n\nexport interface SessionRecordingOptions {\n blockClass?: string | RegExp\n blockSelector?: string | null\n ignoreClass?: string\n maskTextClass?: string | RegExp\n maskTextSelector?: string | null\n maskTextFn?: ((text: string) => string) | null\n maskAllInputs?: boolean\n maskInputOptions?: MaskInputOptions\n maskInputFn?: ((text: string, element?: HTMLElement) => string) | null\n slimDOMOptions?: SlimDOMOptions | 'all' | true\n collectFonts?: boolean\n inlineStylesheet?: boolean\n recorderVersion?: 'v1' | 'v2'\n recordCrossOriginIframes?: boolean\n /** @deprecated - use maskCapturedNetworkRequestFn instead */\n maskNetworkRequestFn?: ((data: NetworkRequest) => NetworkRequest | null | undefined) | null\n /** Modify the network request before it is captured. Returning null or undefined stops it being captured */\n maskCapturedNetworkRequestFn?: ((data: CapturedNetworkRequest) => CapturedNetworkRequest | null | undefined) | null\n // properties below here are ALPHA, don't rely on them, they may change without notice\n // TODO which of these do we actually expose?\n // if this isn't provided a default will be used\n // this only applies to the payload recorder\n // TODO I guess it should apply to the other recorder to\n initiatorTypes?: InitiatorType[]\n recordHeaders?: boolean | { request: boolean; response: boolean }\n // true means record all bodies\n // false means record no bodies\n // string[] means record bodies matching the provided content-type headers\n recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }\n // I can't think why you wouldn't want this... so\n // recordInitialRequests?: boolean\n}\n\nexport type SessionIdChangedCallback = (sessionId: string, windowId: string | null | undefined) => void\n\nexport enum Compression {\n GZipJS = 'gzip-js',\n Base64 = 'base64',\n}\n\nexport interface XHROptions {\n transport?: 'XHR' | 'sendBeacon'\n method?: 'POST' | 'GET'\n urlQueryArgs?: { compression: Compression }\n verbose?: boolean\n blob?: boolean\n sendBeacon?: boolean\n}\n\nexport interface CaptureOptions extends XHROptions {\n $set?: Properties /** used with $identify */\n $set_once?: Properties /** used with $identify */\n _batchKey?: string /** key of queue, e.g. 'sessionRecording' vs 'event' */\n _metrics?: Properties\n _noTruncate?: boolean /** if set, overrides and disables config.properties_string_max_length */\n endpoint?: string /** defaults to '/e/' */\n send_instantly?: boolean /** if set skips the batched queue */\n timestamp?: Date\n}\n\nexport interface RetryQueueElement {\n retryAt: Date\n requestData: QueuedRequestData\n}\nexport interface QueuedRequestData {\n url: string\n data: Properties\n options: CaptureOptions\n headers?: Properties\n callback?: RequestCallback\n retriesPerformedSoFar?: number\n}\n\nexport interface XHRParams extends QueuedRequestData {\n retryQueue: RetryQueue\n onXHRError: (req: XMLHttpRequest) => void\n timeout?: number\n onResponse?: (req: XMLHttpRequest) => void\n}\n\nexport interface DecideResponse {\n status: number\n supportedCompression: Compression[]\n config: {\n enable_collect_everything: boolean\n }\n custom_properties: AutoCaptureCustomProperty[] // TODO: delete, not sent\n featureFlags: Record<string, string | boolean>\n featureFlagPayloads: Record<string, JsonType>\n errorsWhileComputingFlags: boolean\n autocapture_opt_out?: boolean\n capturePerformance?: boolean\n analytics?: {\n endpoint?: string\n }\n elementsChainAsString?: boolean\n // this is currently in development and may have breaking changes without a major version bump\n autocaptureExceptions?:\n | boolean\n | {\n endpoint?: string\n errors_to_ignore: string[]\n }\n sessionRecording?: {\n endpoint?: string\n consoleLogRecordingEnabled?: boolean\n recorderVersion?: 'v1' | 'v2'\n // the API returns a decimal between 0 and 1 as a string\n sampleRate?: string | null\n minimumDurationMilliseconds?: number\n linkedFlag?: string | null\n networkPayloadCapture?: Pick<NetworkRecordOptions, 'recordBody' | 'recordHeaders'>\n }\n surveys?: boolean\n toolbarParams: ToolbarParams\n editorParams?: ToolbarParams /** @deprecated, renamed to toolbarParams, still present on older API responses */\n toolbarVersion: 'toolbar' /** @deprecated, moved to toolbarParams */\n isAuthenticated: boolean\n siteApps: { id: number; url: string }[]\n}\n\nexport type FeatureFlagsCallback = (flags: string[], variants: Record<string, string | boolean>) => void\n\n// TODO: delete custom_properties after changeless typescript refactor\nexport interface AutoCaptureCustomProperty {\n name: string\n css_selector: string\n event_selectors: string[]\n}\n\nexport interface CompressionData {\n data: string\n compression?: Compression\n}\n\nexport interface GDPROptions {\n capture?: (\n event: string,\n properties: Properties,\n options: CaptureOptions\n ) => void /** function used for capturing a PostHog event to record the opt-in action */\n captureEventName?: string /** event name to be used for capturing the opt-in action */\n captureProperties?: Properties /** set of properties to be captured along with the opt-in action */\n /** persistence mechanism used */\n persistenceType?: 'cookie' | 'localStorage' | 'localStorage+cookie'\n persistencePrefix?: string /** [__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name */\n cookieExpiration?: number /** number of days until the opt-in cookie expires */\n crossSubdomainCookie?: boolean /** whether the opt-in cookie is set as cross-subdomain or not */\n secureCookie?: boolean /** whether the opt-in cookie is set as secure or not */\n respectDnt?: boolean\n window?: Window\n}\n\nexport type RequestCallback = (response: Record<string, any>, data?: Properties) => void\n\nexport interface PersistentStore {\n is_supported: () => boolean\n error: (error: any) => void\n parse: (name: string) => any\n get: (name: string) => any\n set: (name: string, value: any, expire_days?: number | null, cross_subdomain?: boolean, secure?: boolean) => void\n remove: (name: string, cross_subdomain?: boolean) => void\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type Breaker = {}\nexport type EventHandler = (event: Event) => boolean | void\n\nexport type ToolbarUserIntent = 'add-action' | 'edit-action'\nexport type ToolbarSource = 'url' | 'localstorage'\nexport type ToolbarVersion = 'toolbar'\n\n/* sync with posthog */\nexport interface ToolbarParams {\n token?: string /** public posthog-js token */\n temporaryToken?: string /** private temporary user token */\n actionId?: number\n userIntent?: ToolbarUserIntent\n source?: ToolbarSource\n toolbarVersion?: ToolbarVersion\n instrument?: boolean\n distinctId?: string\n userEmail?: string\n dataAttributes?: string[]\n featureFlags?: Record<string, string | boolean>\n}\n\nexport interface PostData {\n buffer?: BlobPart\n compression?: Compression\n data?: string\n}\n\nexport interface JSC {\n (): void\n [key: string]: (response: any) => void\n}\n\nexport type SnippetArrayItem = [method: string, ...args: any[]]\n\nexport type JsonType = string | number | boolean | null | { [key: string]: JsonType } | Array<JsonType>\n\n/** A feature that isn't publicly available yet.*/\nexport interface EarlyAccessFeature {\n // Sync this with the backend's EarlyAccessFeatureSerializer!\n name: string\n description: string\n stage: 'concept' | 'alpha' | 'beta'\n documentationUrl: string | null\n flagKey: string | null\n}\n\nexport type EarlyAccessFeatureCallback = (earlyAccessFeatures: EarlyAccessFeature[]) => void\n\nexport interface EarlyAccessFeatureResponse {\n earlyAccessFeatures: EarlyAccessFeature[]\n}\n\nexport type Headers = Record<string, string>\n\nexport type Body =\n | string\n | Document\n | Blob\n | ArrayBufferView\n | ArrayBuffer\n | FormData\n // rrweb uses URLSearchParams and ReadableStream<Uint8Array>\n // as part of the union for this type\n // because they don't support IE11\n // but, we do 🫠\n // what's going to happen here in IE11?\n | URLSearchParams\n | ReadableStream<Uint8Array>\n | null\n\n/* for rrweb/network@1\n ** when that is released as part of rrweb this can be removed\n ** don't rely on this type, it may change without notice\n */\nexport type InitiatorType =\n | 'audio'\n | 'beacon'\n | 'body'\n | 'css'\n | 'early-hint'\n | 'embed'\n | 'fetch'\n | 'frame'\n | 'iframe'\n | 'icon'\n | 'image'\n | 'img'\n | 'input'\n | 'link'\n | 'navigation'\n | 'object'\n | 'ping'\n | 'script'\n | 'track'\n | 'video'\n | 'xmlhttprequest'\n\nexport type NetworkRecordOptions = {\n initiatorTypes?: InitiatorType[]\n maskRequestFn?: (data: CapturedNetworkRequest) => CapturedNetworkRequest | undefined\n recordHeaders?: boolean | { request: boolean; response: boolean }\n recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }\n recordInitialRequests?: boolean\n // whether to record PerformanceEntry events for network requests\n recordPerformance?: boolean\n // the PerformanceObserver will only observe these entry types\n performanceEntryTypeToObserve: string[]\n // the maximum size of the request/response body to record\n // NB this will be at most 1MB even if set larger\n payloadSizeLimitBytes: number\n}\n\n/** @deprecated - use CapturedNetworkRequest instead */\nexport type NetworkRequest = {\n url: string\n}\n\n// In rrweb this is called NetworkRequest, but we already exposed that as having only URL\n// we also want to vary from the rrweb NetworkRequest because we want to include\n// all PerformanceEntry properties too.\n// that has 4 required properties\n// readonly duration: DOMHighResTimeStamp;\n// readonly entryType: string;\n// readonly name: string;\n// readonly startTime: DOMHighResTimeStamp;\n// NB: properties below here are ALPHA, don't rely on them, they may change without notice\nexport type CapturedNetworkRequest = Omit<PerformanceEntry, 'toJSON'> & {\n // properties below here are ALPHA, don't rely on them, they may change without notice\n method?: string\n initiatorType?: InitiatorType\n status?: number\n timeOrigin?: number\n timestamp?: number\n startTime?: number\n endTime?: number\n requestHeaders?: Headers\n requestBody?: Body\n responseHeaders?: Headers\n responseBody?: Body\n // was this captured before fetch/xhr could have been wrapped\n isInitial?: boolean\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { _getQueryParam } from './request-utils';
1
+ import { _getQueryParam, convertToURL } from './request-utils';
2
2
  import { _isNull, _isUndefined } from './type-utils';
3
3
  import Config from '../config';
4
4
  import { _each, _extend, _includes, _strip_empty_properties, _timestamp } from './index';
@@ -268,12 +268,11 @@ export var _info = {
268
268
  return (document === null || document === void 0 ? void 0 : document.referrer) || '$direct';
269
269
  },
270
270
  referringDomain: function () {
271
+ var _a;
271
272
  if (!(document === null || document === void 0 ? void 0 : document.referrer)) {
272
273
  return '$direct';
273
274
  }
274
- var parser = document.createElement('a'); // Unfortunately we cannot use new URL due to IE11
275
- parser.href = document.referrer;
276
- return parser.host;
275
+ return ((_a = convertToURL(document.referrer)) === null || _a === void 0 ? void 0 : _a.host) || '$direct';
277
276
  },
278
277
  properties: function () {
279
278
  if (!userAgent) {
@@ -1 +1 @@
1
- {"version":3,"file":"event-utils.js","sourceRoot":"","sources":["../../../src/utils/event-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { _getQueryParam } from './request-utils'\nimport { _isNull, _isUndefined } from './type-utils'\nimport { Properties } from '../types'\nimport Config from '../config'\nimport { _each, _extend, _includes, _strip_empty_properties, _timestamp } from './index'\nimport { document, window, userAgent, assignableWindow } from './globals'\n\n/**\n * Safari detection turns out to be complicted. For e.g. https://stackoverflow.com/a/29696509\n * We can be slightly loose because some options have been ruled out (e.g. firefox on iOS)\n * before this check is made\n */\nfunction isSafari(userAgent: string): boolean {\n return _includes(userAgent, 'Safari') && !_includes(userAgent, 'Chrome') && !_includes(userAgent, 'Android')\n}\n\nexport const _info = {\n campaignParams: function (customParams?: string[]): Record<string, any> {\n const campaign_keywords = [\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_content',\n 'utm_term',\n 'gclid',\n 'fbclid',\n 'msclkid',\n ].concat(customParams || [])\n\n const params: Record<string, any> = {}\n _each(campaign_keywords, function (kwkey) {\n const kw = document ? _getQueryParam(document.URL, kwkey) : ''\n if (kw.length) {\n params[kwkey] = kw\n }\n })\n\n return params\n },\n\n searchEngine: function (): string | null {\n const referrer = document?.referrer\n if (!referrer) {\n return null\n } else if (referrer.search('https?://(.*)google.([^/?]*)') === 0) {\n return 'google'\n } else if (referrer.search('https?://(.*)bing.com') === 0) {\n return 'bing'\n } else if (referrer.search('https?://(.*)yahoo.com') === 0) {\n return 'yahoo'\n } else if (referrer.search('https?://(.*)duckduckgo.com') === 0) {\n return 'duckduckgo'\n } else {\n return null\n }\n },\n\n searchInfo: function (): Record<string, any> {\n const search = _info.searchEngine(),\n param = search != 'yahoo' ? 'q' : 'p',\n ret: Record<string, any> = {}\n\n if (!_isNull(search)) {\n ret['$search_engine'] = search\n\n const keyword = document ? _getQueryParam(document.referrer, param) : ''\n if (keyword.length) {\n ret['ph_keyword'] = keyword\n }\n }\n\n return ret\n },\n\n /**\n * This function detects which browser is running this script.\n * The order of the checks are important since many user agents\n * include key words used in later checks.\n */\n browser: function (user_agent: string, vendor: string | undefined, opera?: any): string {\n vendor = vendor || '' // vendor is undefined for at least IE9\n if (opera || _includes(user_agent, ' OPR/')) {\n if (_includes(user_agent, 'Mini')) {\n return 'Opera Mini'\n }\n return 'Opera'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (_includes(user_agent, 'IEMobile') || _includes(user_agent, 'WPDesktop')) {\n return 'Internet Explorer Mobile'\n } else if (_includes(user_agent, 'SamsungBrowser/')) {\n // https://developer.samsung.com/internet/user-agent-string-format\n return 'Samsung Internet'\n } else if (_includes(user_agent, 'Edge') || _includes(user_agent, 'Edg/')) {\n return 'Microsoft Edge'\n } else if (_includes(user_agent, 'FBIOS')) {\n return 'Facebook Mobile'\n } else if (_includes(user_agent, 'Chrome')) {\n return 'Chrome'\n } else if (_includes(user_agent, 'CriOS')) {\n return 'Chrome iOS'\n } else if (_includes(user_agent, 'UCWEB') || _includes(user_agent, 'UCBrowser')) {\n return 'UC Browser'\n } else if (_includes(user_agent, 'FxiOS')) {\n return 'Firefox iOS'\n } else if (_includes(vendor, 'Apple') || isSafari(user_agent)) {\n if (_includes(user_agent, 'Mobile')) {\n return 'Mobile Safari'\n }\n return 'Safari'\n } else if (_includes(user_agent, 'Android')) {\n return 'Android Mobile'\n } else if (_includes(user_agent, 'Konqueror') || _includes(user_agent, 'konqueror')) {\n return 'Konqueror'\n } else if (_includes(user_agent, 'Firefox')) {\n return 'Firefox'\n } else if (_includes(user_agent, 'MSIE') || _includes(user_agent, 'Trident/')) {\n return 'Internet Explorer'\n } else if (_includes(user_agent, 'Gecko')) {\n return 'Mozilla'\n } else {\n return ''\n }\n },\n\n /**\n * This function detects which browser version is running this script,\n * parsing major and minor version (e.g., 42.1). User agent strings from:\n * http://www.useragentstring.com/pages/useragentstring.php\n *\n * `navigator.vendor` is passed in and used to help with detecting certain browsers\n * NB `navigator.vendor` is deprecated and not present in every browser\n */\n browserVersion: function (userAgent: string, vendor: string | undefined, opera: string): number | null {\n const browser = _info.browser(userAgent, vendor, opera)\n const versionRegexes: Record<string, RegExp[]> = {\n 'Internet Explorer Mobile': [/rv:(\\d+(\\.\\d+)?)/],\n 'Microsoft Edge': [/Edge?\\/(\\d+(\\.\\d+)?)/],\n Chrome: [/Chrome\\/(\\d+(\\.\\d+)?)/],\n 'Chrome iOS': [/CriOS\\/(\\d+(\\.\\d+)?)/],\n 'UC Browser': [/(UCBrowser|UCWEB)\\/(\\d+(\\.\\d+)?)/],\n Safari: [/Version\\/(\\d+(\\.\\d+)?)/],\n 'Mobile Safari': [/Version\\/(\\d+(\\.\\d+)?)/],\n Opera: [/(Opera|OPR)\\/(\\d+(\\.\\d+)?)/],\n Firefox: [/Firefox\\/(\\d+(\\.\\d+)?)/],\n 'Firefox iOS': [/FxiOS\\/(\\d+(\\.\\d+)?)/],\n Konqueror: [/Konqueror[:/]?(\\d+(\\.\\d+)?)/i],\n // not every blackberry user agent has the version after the name\n BlackBerry: [/BlackBerry (\\d+(\\.\\d+)?)/, /Version\\/(\\d+(\\.\\d+)?)/],\n 'Android Mobile': [/android\\s(\\d+(\\.\\d+)?)/],\n 'Samsung Internet': [/SamsungBrowser\\/(\\d+(\\.\\d+)?)/],\n 'Internet Explorer': [/(rv:|MSIE )(\\d+(\\.\\d+)?)/],\n Mozilla: [/rv:(\\d+(\\.\\d+)?)/],\n }\n const regexes: RegExp[] | undefined = versionRegexes[browser as keyof typeof versionRegexes]\n if (_isUndefined(regexes)) {\n return null\n }\n\n for (let i = 0; i < regexes.length; i++) {\n const regex = regexes[i]\n const matches = userAgent.match(regex)\n if (matches) {\n return parseFloat(matches[matches.length - 2])\n }\n }\n return null\n },\n\n browserLanguage: function (): string {\n return (\n navigator.language || // Any modern browser\n (navigator as Record<string, any>).userLanguage // IE11\n )\n },\n\n os: function (user_agent: string): { os_name: string; os_version: string } {\n if (/Windows/i.test(user_agent)) {\n if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return { os_name: 'Windows Phone', os_version: '' }\n }\n const match = /Windows NT ([0-9.]+)/i.exec(user_agent)\n if (match && match[1]) {\n const version = match[1]\n return { os_name: 'Windows', os_version: version }\n }\n return { os_name: 'Windows', os_version: '' }\n } else if (/(iPhone|iPad|iPod)/.test(user_agent)) {\n const match = /OS (\\d+)_(\\d+)_?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'iOS', os_version: versionParts.join('.') }\n }\n return { os_name: 'iOS', os_version: '' }\n } else if (/Android/.test(user_agent)) {\n const match = /Android (\\d+)\\.(\\d+)\\.?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'Android', os_version: versionParts.join('.') }\n }\n return { os_name: 'Android', os_version: '' }\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return { os_name: 'BlackBerry', os_version: '' }\n } else if (/Mac/i.test(user_agent)) {\n const match = /Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'Mac OS X', os_version: versionParts.join('.') }\n }\n return { os_name: 'Mac OS X', os_version: '' }\n } else if (/Linux/.test(user_agent)) {\n return { os_name: 'Linux', os_version: '' }\n } else if (/CrOS/.test(user_agent)) {\n return { os_name: 'Chrome OS', os_version: '' }\n } else {\n return { os_name: '', os_version: '' }\n }\n },\n\n device: function (user_agent: string): string {\n if (/Windows Phone/i.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return 'Windows Phone'\n } else if (/iPad/.test(user_agent)) {\n return 'iPad'\n } else if (/iPod/.test(user_agent)) {\n return 'iPod Touch'\n } else if (/iPhone/.test(user_agent)) {\n return 'iPhone'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (/Android/.test(user_agent) && !/Mobile/.test(user_agent)) {\n return 'Android Tablet'\n } else if (/Android/.test(user_agent)) {\n return 'Android'\n } else {\n return ''\n }\n },\n\n deviceType: function (user_agent: string): string {\n const device = this.device(user_agent)\n if (device === 'iPad' || device === 'Android Tablet') {\n return 'Tablet'\n } else if (device) {\n return 'Mobile'\n } else {\n return 'Desktop'\n }\n },\n\n referrer: function (): string {\n return document?.referrer || '$direct'\n },\n\n referringDomain: function (): string {\n if (!document?.referrer) {\n return '$direct'\n }\n const parser = document.createElement('a') // Unfortunately we cannot use new URL due to IE11\n parser.href = document.referrer\n return parser.host\n },\n\n properties: function (): Properties {\n if (!userAgent) {\n return {}\n }\n const { os_name, os_version } = _info.os(userAgent)\n return _extend(\n _strip_empty_properties({\n $os: os_name,\n $os_version: os_version,\n $browser: _info.browser(userAgent, navigator.vendor, assignableWindow.opera),\n $device: _info.device(userAgent),\n $device_type: _info.deviceType(userAgent),\n }),\n {\n $current_url: window?.location.href,\n $host: window?.location.host,\n $pathname: window?.location.pathname,\n $raw_user_agent: userAgent.length > 1000 ? userAgent.substring(0, 997) + '...' : userAgent,\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, assignableWindow.opera),\n $browser_language: _info.browserLanguage(),\n $screen_height: window?.screen.height,\n $screen_width: window?.screen.width,\n $viewport_height: window?.innerHeight,\n $viewport_width: window?.innerWidth,\n $lib: 'web',\n $lib_version: Config.LIB_VERSION,\n $insert_id: Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10),\n $time: _timestamp() / 1000, // epoch time in seconds\n }\n )\n },\n\n people_properties: function (): Properties {\n if (!userAgent) {\n return {}\n }\n\n const { os_name, os_version } = _info.os(userAgent)\n return _extend(\n _strip_empty_properties({\n $os: os_name,\n $os_version: os_version,\n $browser: _info.browser(userAgent, navigator.vendor, assignableWindow.opera),\n }),\n {\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, assignableWindow.opera),\n }\n )\n },\n}\n"]}
1
+ {"version":3,"file":"event-utils.js","sourceRoot":"","sources":["../../../src/utils/event-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { _getQueryParam, convertToURL } from './request-utils'\nimport { _isNull, _isUndefined } from './type-utils'\nimport { Properties } from '../types'\nimport Config from '../config'\nimport { _each, _extend, _includes, _strip_empty_properties, _timestamp } from './index'\nimport { document, window, userAgent, assignableWindow } from './globals'\n\n/**\n * Safari detection turns out to be complicted. For e.g. https://stackoverflow.com/a/29696509\n * We can be slightly loose because some options have been ruled out (e.g. firefox on iOS)\n * before this check is made\n */\nfunction isSafari(userAgent: string): boolean {\n return _includes(userAgent, 'Safari') && !_includes(userAgent, 'Chrome') && !_includes(userAgent, 'Android')\n}\n\nexport const _info = {\n campaignParams: function (customParams?: string[]): Record<string, any> {\n const campaign_keywords = [\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_content',\n 'utm_term',\n 'gclid',\n 'fbclid',\n 'msclkid',\n ].concat(customParams || [])\n\n const params: Record<string, any> = {}\n _each(campaign_keywords, function (kwkey) {\n const kw = document ? _getQueryParam(document.URL, kwkey) : ''\n if (kw.length) {\n params[kwkey] = kw\n }\n })\n\n return params\n },\n\n searchEngine: function (): string | null {\n const referrer = document?.referrer\n if (!referrer) {\n return null\n } else if (referrer.search('https?://(.*)google.([^/?]*)') === 0) {\n return 'google'\n } else if (referrer.search('https?://(.*)bing.com') === 0) {\n return 'bing'\n } else if (referrer.search('https?://(.*)yahoo.com') === 0) {\n return 'yahoo'\n } else if (referrer.search('https?://(.*)duckduckgo.com') === 0) {\n return 'duckduckgo'\n } else {\n return null\n }\n },\n\n searchInfo: function (): Record<string, any> {\n const search = _info.searchEngine(),\n param = search != 'yahoo' ? 'q' : 'p',\n ret: Record<string, any> = {}\n\n if (!_isNull(search)) {\n ret['$search_engine'] = search\n\n const keyword = document ? _getQueryParam(document.referrer, param) : ''\n if (keyword.length) {\n ret['ph_keyword'] = keyword\n }\n }\n\n return ret\n },\n\n /**\n * This function detects which browser is running this script.\n * The order of the checks are important since many user agents\n * include key words used in later checks.\n */\n browser: function (user_agent: string, vendor: string | undefined, opera?: any): string {\n vendor = vendor || '' // vendor is undefined for at least IE9\n if (opera || _includes(user_agent, ' OPR/')) {\n if (_includes(user_agent, 'Mini')) {\n return 'Opera Mini'\n }\n return 'Opera'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (_includes(user_agent, 'IEMobile') || _includes(user_agent, 'WPDesktop')) {\n return 'Internet Explorer Mobile'\n } else if (_includes(user_agent, 'SamsungBrowser/')) {\n // https://developer.samsung.com/internet/user-agent-string-format\n return 'Samsung Internet'\n } else if (_includes(user_agent, 'Edge') || _includes(user_agent, 'Edg/')) {\n return 'Microsoft Edge'\n } else if (_includes(user_agent, 'FBIOS')) {\n return 'Facebook Mobile'\n } else if (_includes(user_agent, 'Chrome')) {\n return 'Chrome'\n } else if (_includes(user_agent, 'CriOS')) {\n return 'Chrome iOS'\n } else if (_includes(user_agent, 'UCWEB') || _includes(user_agent, 'UCBrowser')) {\n return 'UC Browser'\n } else if (_includes(user_agent, 'FxiOS')) {\n return 'Firefox iOS'\n } else if (_includes(vendor, 'Apple') || isSafari(user_agent)) {\n if (_includes(user_agent, 'Mobile')) {\n return 'Mobile Safari'\n }\n return 'Safari'\n } else if (_includes(user_agent, 'Android')) {\n return 'Android Mobile'\n } else if (_includes(user_agent, 'Konqueror') || _includes(user_agent, 'konqueror')) {\n return 'Konqueror'\n } else if (_includes(user_agent, 'Firefox')) {\n return 'Firefox'\n } else if (_includes(user_agent, 'MSIE') || _includes(user_agent, 'Trident/')) {\n return 'Internet Explorer'\n } else if (_includes(user_agent, 'Gecko')) {\n return 'Mozilla'\n } else {\n return ''\n }\n },\n\n /**\n * This function detects which browser version is running this script,\n * parsing major and minor version (e.g., 42.1). User agent strings from:\n * http://www.useragentstring.com/pages/useragentstring.php\n *\n * `navigator.vendor` is passed in and used to help with detecting certain browsers\n * NB `navigator.vendor` is deprecated and not present in every browser\n */\n browserVersion: function (userAgent: string, vendor: string | undefined, opera: string): number | null {\n const browser = _info.browser(userAgent, vendor, opera)\n const versionRegexes: Record<string, RegExp[]> = {\n 'Internet Explorer Mobile': [/rv:(\\d+(\\.\\d+)?)/],\n 'Microsoft Edge': [/Edge?\\/(\\d+(\\.\\d+)?)/],\n Chrome: [/Chrome\\/(\\d+(\\.\\d+)?)/],\n 'Chrome iOS': [/CriOS\\/(\\d+(\\.\\d+)?)/],\n 'UC Browser': [/(UCBrowser|UCWEB)\\/(\\d+(\\.\\d+)?)/],\n Safari: [/Version\\/(\\d+(\\.\\d+)?)/],\n 'Mobile Safari': [/Version\\/(\\d+(\\.\\d+)?)/],\n Opera: [/(Opera|OPR)\\/(\\d+(\\.\\d+)?)/],\n Firefox: [/Firefox\\/(\\d+(\\.\\d+)?)/],\n 'Firefox iOS': [/FxiOS\\/(\\d+(\\.\\d+)?)/],\n Konqueror: [/Konqueror[:/]?(\\d+(\\.\\d+)?)/i],\n // not every blackberry user agent has the version after the name\n BlackBerry: [/BlackBerry (\\d+(\\.\\d+)?)/, /Version\\/(\\d+(\\.\\d+)?)/],\n 'Android Mobile': [/android\\s(\\d+(\\.\\d+)?)/],\n 'Samsung Internet': [/SamsungBrowser\\/(\\d+(\\.\\d+)?)/],\n 'Internet Explorer': [/(rv:|MSIE )(\\d+(\\.\\d+)?)/],\n Mozilla: [/rv:(\\d+(\\.\\d+)?)/],\n }\n const regexes: RegExp[] | undefined = versionRegexes[browser as keyof typeof versionRegexes]\n if (_isUndefined(regexes)) {\n return null\n }\n\n for (let i = 0; i < regexes.length; i++) {\n const regex = regexes[i]\n const matches = userAgent.match(regex)\n if (matches) {\n return parseFloat(matches[matches.length - 2])\n }\n }\n return null\n },\n\n browserLanguage: function (): string {\n return (\n navigator.language || // Any modern browser\n (navigator as Record<string, any>).userLanguage // IE11\n )\n },\n\n os: function (user_agent: string): { os_name: string; os_version: string } {\n if (/Windows/i.test(user_agent)) {\n if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return { os_name: 'Windows Phone', os_version: '' }\n }\n const match = /Windows NT ([0-9.]+)/i.exec(user_agent)\n if (match && match[1]) {\n const version = match[1]\n return { os_name: 'Windows', os_version: version }\n }\n return { os_name: 'Windows', os_version: '' }\n } else if (/(iPhone|iPad|iPod)/.test(user_agent)) {\n const match = /OS (\\d+)_(\\d+)_?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'iOS', os_version: versionParts.join('.') }\n }\n return { os_name: 'iOS', os_version: '' }\n } else if (/Android/.test(user_agent)) {\n const match = /Android (\\d+)\\.(\\d+)\\.?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'Android', os_version: versionParts.join('.') }\n }\n return { os_name: 'Android', os_version: '' }\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return { os_name: 'BlackBerry', os_version: '' }\n } else if (/Mac/i.test(user_agent)) {\n const match = /Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/i.exec(user_agent)\n if (match && match[1]) {\n const versionParts = [match[1], match[2], match[3] || '0']\n return { os_name: 'Mac OS X', os_version: versionParts.join('.') }\n }\n return { os_name: 'Mac OS X', os_version: '' }\n } else if (/Linux/.test(user_agent)) {\n return { os_name: 'Linux', os_version: '' }\n } else if (/CrOS/.test(user_agent)) {\n return { os_name: 'Chrome OS', os_version: '' }\n } else {\n return { os_name: '', os_version: '' }\n }\n },\n\n device: function (user_agent: string): string {\n if (/Windows Phone/i.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return 'Windows Phone'\n } else if (/iPad/.test(user_agent)) {\n return 'iPad'\n } else if (/iPod/.test(user_agent)) {\n return 'iPod Touch'\n } else if (/iPhone/.test(user_agent)) {\n return 'iPhone'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (/Android/.test(user_agent) && !/Mobile/.test(user_agent)) {\n return 'Android Tablet'\n } else if (/Android/.test(user_agent)) {\n return 'Android'\n } else {\n return ''\n }\n },\n\n deviceType: function (user_agent: string): string {\n const device = this.device(user_agent)\n if (device === 'iPad' || device === 'Android Tablet') {\n return 'Tablet'\n } else if (device) {\n return 'Mobile'\n } else {\n return 'Desktop'\n }\n },\n\n referrer: function (): string {\n return document?.referrer || '$direct'\n },\n\n referringDomain: function (): string {\n if (!document?.referrer) {\n return '$direct'\n }\n return convertToURL(document.referrer)?.host || '$direct'\n },\n\n properties: function (): Properties {\n if (!userAgent) {\n return {}\n }\n const { os_name, os_version } = _info.os(userAgent)\n return _extend(\n _strip_empty_properties({\n $os: os_name,\n $os_version: os_version,\n $browser: _info.browser(userAgent, navigator.vendor, assignableWindow.opera),\n $device: _info.device(userAgent),\n $device_type: _info.deviceType(userAgent),\n }),\n {\n $current_url: window?.location.href,\n $host: window?.location.host,\n $pathname: window?.location.pathname,\n $raw_user_agent: userAgent.length > 1000 ? userAgent.substring(0, 997) + '...' : userAgent,\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, assignableWindow.opera),\n $browser_language: _info.browserLanguage(),\n $screen_height: window?.screen.height,\n $screen_width: window?.screen.width,\n $viewport_height: window?.innerHeight,\n $viewport_width: window?.innerWidth,\n $lib: 'web',\n $lib_version: Config.LIB_VERSION,\n $insert_id: Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10),\n $time: _timestamp() / 1000, // epoch time in seconds\n }\n )\n },\n\n people_properties: function (): Properties {\n if (!userAgent) {\n return {}\n }\n\n const { os_name, os_version } = _info.os(userAgent)\n return _extend(\n _strip_empty_properties({\n $os: os_name,\n $os_version: os_version,\n $browser: _info.browser(userAgent, navigator.vendor, assignableWindow.opera),\n }),\n {\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, assignableWindow.opera),\n }\n )\n },\n}\n"]}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * IE11 doesn't support `new URL`
3
+ * so we can create an anchor element and use that to parse the URL
4
+ * there's a lot of overlap between HTMLHyperlinkElementUtils and URL
5
+ * meaning useful properties like `pathname` are available on both
6
+ */
7
+ export declare const convertToURL: (url: string) => HTMLAnchorElement | null;
1
8
  export declare const _isUrlMatchingRegex: (url: string, pattern: string) => boolean;
2
9
  export declare const _HTTPBuildQuery: (formdata: Record<string, any>, arg_separator?: string) => string;
3
10
  export declare const _getQueryParam: (url: string, param: string) => string;
@@ -1,7 +1,22 @@
1
1
  import { _each, _isValidRegex } from './';
2
2
  import { _isArray, _isUndefined } from './type-utils';
3
3
  import { logger } from './logger';
4
+ import { document } from './globals';
4
5
  var localDomains = ['localhost', '127.0.0.1'];
6
+ /**
7
+ * IE11 doesn't support `new URL`
8
+ * so we can create an anchor element and use that to parse the URL
9
+ * there's a lot of overlap between HTMLHyperlinkElementUtils and URL
10
+ * meaning useful properties like `pathname` are available on both
11
+ */
12
+ export var convertToURL = function (url) {
13
+ var location = document === null || document === void 0 ? void 0 : document.createElement('a');
14
+ if (_isUndefined(location)) {
15
+ return null;
16
+ }
17
+ location.href = url;
18
+ return location;
19
+ };
5
20
  export var _isUrlMatchingRegex = function (url, pattern) {
6
21
  if (!_isValidRegex(pattern))
7
22
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"request-utils.js","sourceRoot":"","sources":["../../../src/utils/request-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { _each, _isValidRegex } from './'\n\nimport { _isArray, _isUndefined } from './type-utils'\nimport { logger } from './logger'\n\nconst localDomains = ['localhost', '127.0.0.1']\n\nexport const _isUrlMatchingRegex = function (url: string, pattern: string): boolean {\n if (!_isValidRegex(pattern)) return false\n return new RegExp(pattern).test(url)\n}\n\nexport const _HTTPBuildQuery = function (formdata: Record<string, any>, arg_separator = '&'): string {\n let use_val: string\n let use_key: string\n const tph_arr: string[] = []\n\n _each(formdata, function (val, key) {\n // the key might be literally the string undefined for e.g. if {undefined: 'something'}\n if (_isUndefined(val) || _isUndefined(key) || key === 'undefined') {\n return\n }\n\n use_val = encodeURIComponent(val.toString())\n use_key = encodeURIComponent(key)\n tph_arr[tph_arr.length] = use_key + '=' + use_val\n })\n\n return tph_arr.join(arg_separator)\n}\n\nexport const _getQueryParam = function (url: string, param: string): string {\n const withoutHash: string = url.split('#')[0] || ''\n const queryParams: string = withoutHash.split('?')[1] || ''\n\n const queryParts = queryParams.split('&')\n let keyValuePair\n\n for (let i = 0; i < queryParts.length; i++) {\n const parts = queryParts[i].split('=')\n if (parts[0] === param) {\n keyValuePair = parts\n break\n }\n }\n\n if (!_isArray(keyValuePair) || keyValuePair.length < 2) {\n return ''\n } else {\n let result = keyValuePair[1]\n try {\n result = decodeURIComponent(result)\n } catch (err) {\n logger.error('Skipping decoding for malformed query param: ' + result)\n }\n return result.replace(/\\+/g, ' ')\n }\n}\n\nexport const _getHashParam = function (hash: string, param: string): string | null {\n const matches = hash.match(new RegExp(param + '=([^&]*)'))\n return matches ? matches[1] : null\n}\n\nexport const isLocalhost = (): boolean => {\n return localDomains.includes(location.hostname)\n}\n"]}
1
+ {"version":3,"file":"request-utils.js","sourceRoot":"","sources":["../../../src/utils/request-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { _each, _isValidRegex } from './'\n\nimport { _isArray, _isUndefined } from './type-utils'\nimport { logger } from './logger'\nimport { document } from './globals'\n\nconst localDomains = ['localhost', '127.0.0.1']\n\n/**\n * IE11 doesn't support `new URL`\n * so we can create an anchor element and use that to parse the URL\n * there's a lot of overlap between HTMLHyperlinkElementUtils and URL\n * meaning useful properties like `pathname` are available on both\n */\nexport const convertToURL = (url: string): HTMLAnchorElement | null => {\n const location = document?.createElement('a')\n if (_isUndefined(location)) {\n return null\n }\n\n location.href = url\n return location\n}\n\nexport const _isUrlMatchingRegex = function (url: string, pattern: string): boolean {\n if (!_isValidRegex(pattern)) return false\n return new RegExp(pattern).test(url)\n}\n\nexport const _HTTPBuildQuery = function (formdata: Record<string, any>, arg_separator = '&'): string {\n let use_val: string\n let use_key: string\n const tph_arr: string[] = []\n\n _each(formdata, function (val, key) {\n // the key might be literally the string undefined for e.g. if {undefined: 'something'}\n if (_isUndefined(val) || _isUndefined(key) || key === 'undefined') {\n return\n }\n\n use_val = encodeURIComponent(val.toString())\n use_key = encodeURIComponent(key)\n tph_arr[tph_arr.length] = use_key + '=' + use_val\n })\n\n return tph_arr.join(arg_separator)\n}\n\nexport const _getQueryParam = function (url: string, param: string): string {\n const withoutHash: string = url.split('#')[0] || ''\n const queryParams: string = withoutHash.split('?')[1] || ''\n\n const queryParts = queryParams.split('&')\n let keyValuePair\n\n for (let i = 0; i < queryParts.length; i++) {\n const parts = queryParts[i].split('=')\n if (parts[0] === param) {\n keyValuePair = parts\n break\n }\n }\n\n if (!_isArray(keyValuePair) || keyValuePair.length < 2) {\n return ''\n } else {\n let result = keyValuePair[1]\n try {\n result = decodeURIComponent(result)\n } catch (err) {\n logger.error('Skipping decoding for malformed query param: ' + result)\n }\n return result.replace(/\\+/g, ' ')\n }\n}\n\nexport const _getHashParam = function (hash: string, param: string): string | null {\n const matches = hash.match(new RegExp(param + '=([^&]*)'))\n return matches ? matches[1] : null\n}\n\nexport const isLocalhost = (): boolean => {\n return localDomains.includes(location.hostname)\n}\n"]}
@@ -14,13 +14,8 @@ export var _isUint8Array = function (x) {
14
14
  // fails on only one very rare and deliberate custom object:
15
15
  // let bomb = { toString : undefined, valueOf: function(o) { return "function BOMBA!"; }};
16
16
  export var _isFunction = function (f) {
17
- try {
18
- // eslint-disable-next-line posthog-js/no-direct-function-check
19
- return /^\s*\bfunction\b/.test(f);
20
- }
21
- catch (x) {
22
- return false;
23
- }
17
+ // eslint-disable-next-line posthog-js/no-direct-function-check
18
+ return typeof f === 'function';
24
19
  };
25
20
  // Underscore Addons
26
21
  export var _isObject = function (x) {
@@ -1 +1 @@
1
- {"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../../../src/utils/type-utils.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,IAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAA;AACnC,IAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAA;AACjC,MAAM,CAAC,IAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAA;AACrD,IAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;AAElC,MAAM,CAAC,IAAM,QAAQ,GACjB,aAAa;IACb,UAAU,GAAQ;QACd,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAAA;IAClD,CAAC,CAAA;AACL,MAAM,CAAC,IAAM,aAAa,GAAG,UAAU,CAAU;IAC7C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,qBAAqB,CAAA;AACrD,CAAC,CAAA;AACD,8CAA8C;AAC9C,4DAA4D;AAC5D,0FAA0F;AAC1F,MAAM,CAAC,IAAM,WAAW,GAAG,UAAU,CAAM;IACvC,IAAI;QACA,+DAA+D;QAC/D,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;KACpC;IAAC,OAAO,CAAC,EAAE;QACR,OAAO,KAAK,CAAA;KACf;AACL,CAAC,CAAA;AACD,oBAAoB;AACpB,MAAM,CAAC,IAAM,SAAS,GAAG,UAAU,CAAU;IACzC,6DAA6D;IAC7D,OAAO,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AAC1C,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,cAAc,GAAG,UAAU,CAAU;IAC9C,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE;QACd,KAAK,IAAM,GAAG,IAAI,CAAC,EAAE;YACjB,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;gBAC7B,OAAO,KAAK,CAAA;aACf;SACJ;QACD,OAAO,IAAI,CAAA;KACd;IACD,OAAO,KAAK,CAAA;AAChB,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,YAAY,GAAG,UAAU,CAAU;IAC5C,OAAO,CAAC,KAAK,KAAK,CAAC,CAAA;AACvB,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,SAAS,GAAG,UAAU,CAAU;IACzC,6DAA6D;IAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAA;AAChD,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,OAAO,GAAG,UAAU,CAAU;IACvC,2DAA2D;IAC3D,OAAO,CAAC,KAAK,IAAI,CAAA;AACrB,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,OAAO,GAAG,UAAU,CAAU;IACvC,2DAA2D;IAC3D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,eAAe,CAAA;AAC9C,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,SAAS,GAAG,UAAU,CAAU;IACzC,6DAA6D;IAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAA;AAChD,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,UAAU,GAAG,UAAU,CAAU;IAC1C,8DAA8D;IAC9D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAA;AAClD,CAAC,CAAA","sourcesContent":["// eslint-disable-next-line posthog-js/no-direct-array-check\nconst nativeIsArray = Array.isArray\nconst ObjProto = Object.prototype\nexport const hasOwnProperty = ObjProto.hasOwnProperty\nconst toString = ObjProto.toString\n\nexport const _isArray =\n nativeIsArray ||\n function (obj: any): obj is any[] {\n return toString.call(obj) === '[object Array]'\n }\nexport const _isUint8Array = function (x: unknown): x is Uint8Array {\n return toString.call(x) === '[object Uint8Array]'\n}\n// from a comment on http://dbj.org/dbj/?p=286\n// fails on only one very rare and deliberate custom object:\n// let bomb = { toString : undefined, valueOf: function(o) { return \"function BOMBA!\"; }};\nexport const _isFunction = function (f: any): f is (...args: any[]) => any {\n try {\n // eslint-disable-next-line posthog-js/no-direct-function-check\n return /^\\s*\\bfunction\\b/.test(f)\n } catch (x) {\n return false\n }\n}\n// Underscore Addons\nexport const _isObject = function (x: unknown): x is Record<string, any> {\n // eslint-disable-next-line posthog-js/no-direct-object-check\n return x === Object(x) && !_isArray(x)\n}\nexport const _isEmptyObject = function (x: unknown): x is Record<string, any> {\n if (_isObject(x)) {\n for (const key in x) {\n if (hasOwnProperty.call(x, key)) {\n return false\n }\n }\n return true\n }\n return false\n}\nexport const _isUndefined = function (x: unknown): x is undefined {\n return x === void 0\n}\nexport const _isString = function (x: unknown): x is string {\n // eslint-disable-next-line posthog-js/no-direct-string-check\n return toString.call(x) == '[object String]'\n}\nexport const _isNull = function (x: unknown): x is null {\n // eslint-disable-next-line posthog-js/no-direct-null-check\n return x === null\n}\nexport const _isDate = function (x: unknown): x is Date {\n // eslint-disable-next-line posthog-js/no-direct-date-check\n return toString.call(x) == '[object Date]'\n}\nexport const _isNumber = function (x: unknown): x is number {\n // eslint-disable-next-line posthog-js/no-direct-number-check\n return toString.call(x) == '[object Number]'\n}\nexport const _isBoolean = function (x: unknown): x is boolean {\n // eslint-disable-next-line posthog-js/no-direct-boolean-check\n return toString.call(x) === '[object Boolean]'\n}\n"]}
1
+ {"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../../../src/utils/type-utils.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,IAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAA;AACnC,IAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAA;AACjC,MAAM,CAAC,IAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAA;AACrD,IAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;AAElC,MAAM,CAAC,IAAM,QAAQ,GACjB,aAAa;IACb,UAAU,GAAQ;QACd,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAAA;IAClD,CAAC,CAAA;AACL,MAAM,CAAC,IAAM,aAAa,GAAG,UAAU,CAAU;IAC7C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,qBAAqB,CAAA;AACrD,CAAC,CAAA;AACD,8CAA8C;AAC9C,4DAA4D;AAC5D,0FAA0F;AAC1F,MAAM,CAAC,IAAM,WAAW,GAAG,UAAU,CAAM;IACvC,+DAA+D;IAC/D,OAAO,OAAO,CAAC,KAAK,UAAU,CAAA;AAClC,CAAC,CAAA;AACD,oBAAoB;AACpB,MAAM,CAAC,IAAM,SAAS,GAAG,UAAU,CAAU;IACzC,6DAA6D;IAC7D,OAAO,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AAC1C,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,cAAc,GAAG,UAAU,CAAU;IAC9C,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE;QACd,KAAK,IAAM,GAAG,IAAI,CAAC,EAAE;YACjB,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;gBAC7B,OAAO,KAAK,CAAA;aACf;SACJ;QACD,OAAO,IAAI,CAAA;KACd;IACD,OAAO,KAAK,CAAA;AAChB,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,YAAY,GAAG,UAAU,CAAU;IAC5C,OAAO,CAAC,KAAK,KAAK,CAAC,CAAA;AACvB,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,SAAS,GAAG,UAAU,CAAU;IACzC,6DAA6D;IAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAA;AAChD,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,OAAO,GAAG,UAAU,CAAU;IACvC,2DAA2D;IAC3D,OAAO,CAAC,KAAK,IAAI,CAAA;AACrB,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,OAAO,GAAG,UAAU,CAAU;IACvC,2DAA2D;IAC3D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,eAAe,CAAA;AAC9C,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,SAAS,GAAG,UAAU,CAAU;IACzC,6DAA6D;IAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAA;AAChD,CAAC,CAAA;AACD,MAAM,CAAC,IAAM,UAAU,GAAG,UAAU,CAAU;IAC1C,8DAA8D;IAC9D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAA;AAClD,CAAC,CAAA","sourcesContent":["// eslint-disable-next-line posthog-js/no-direct-array-check\nconst nativeIsArray = Array.isArray\nconst ObjProto = Object.prototype\nexport const hasOwnProperty = ObjProto.hasOwnProperty\nconst toString = ObjProto.toString\n\nexport const _isArray =\n nativeIsArray ||\n function (obj: any): obj is any[] {\n return toString.call(obj) === '[object Array]'\n }\nexport const _isUint8Array = function (x: unknown): x is Uint8Array {\n return toString.call(x) === '[object Uint8Array]'\n}\n// from a comment on http://dbj.org/dbj/?p=286\n// fails on only one very rare and deliberate custom object:\n// let bomb = { toString : undefined, valueOf: function(o) { return \"function BOMBA!\"; }};\nexport const _isFunction = function (f: any): f is (...args: any[]) => any {\n // eslint-disable-next-line posthog-js/no-direct-function-check\n return typeof f === 'function'\n}\n// Underscore Addons\nexport const _isObject = function (x: unknown): x is Record<string, any> {\n // eslint-disable-next-line posthog-js/no-direct-object-check\n return x === Object(x) && !_isArray(x)\n}\nexport const _isEmptyObject = function (x: unknown): x is Record<string, any> {\n if (_isObject(x)) {\n for (const key in x) {\n if (hasOwnProperty.call(x, key)) {\n return false\n }\n }\n return true\n }\n return false\n}\nexport const _isUndefined = function (x: unknown): x is undefined {\n return x === void 0\n}\nexport const _isString = function (x: unknown): x is string {\n // eslint-disable-next-line posthog-js/no-direct-string-check\n return toString.call(x) == '[object String]'\n}\n\nexport const _isNull = function (x: unknown): x is null {\n // eslint-disable-next-line posthog-js/no-direct-null-check\n return x === null\n}\nexport const _isDate = function (x: unknown): x is Date {\n // eslint-disable-next-line posthog-js/no-direct-date-check\n return toString.call(x) == '[object Date]'\n}\nexport const _isNumber = function (x: unknown): x is number {\n // eslint-disable-next-line posthog-js/no-direct-number-check\n return toString.call(x) == '[object Number]'\n}\nexport const _isBoolean = function (x: unknown): x is boolean {\n // eslint-disable-next-line posthog-js/no-direct-boolean-check\n return toString.call(x) === '[object Boolean]'\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-js",
3
- "version": "1.92.0",
3
+ "version": "1.92.1",
4
4
  "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.",
5
5
  "repository": "https://github.com/PostHog/posthog-js",
6
6
  "author": "hey@posthog.com",
@@ -1,20 +0,0 @@
1
- import { PostHog } from '../../posthog-core';
2
- import { DecideResponse } from '../../types';
3
- export declare class WebPerformanceObserver {
4
- instance: PostHog;
5
- remoteEnabled: boolean | undefined;
6
- observer: PerformanceObserver | undefined;
7
- _forceAllowLocalhost: boolean;
8
- constructor(instance: PostHog);
9
- startObservingIfEnabled(): void;
10
- startObserving(): void;
11
- stopObserving(): void;
12
- isObserving(): boolean;
13
- isEnabled(): boolean;
14
- afterDecideResponse(response: DecideResponse): void;
15
- _capturePerformanceEvent(event: PerformanceEntry): void;
16
- /**
17
- * :TRICKY: Make sure we batch these requests, and don't truncate the strings.
18
- */
19
- private capturePerformanceEvent;
20
- }