Ctrl K
ComunidadGuías…

src/services/posthog.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// @ts-nocheck
import { shouldSuppressPostHogExceptionEvent } from '~/services/staleAssetErrors'
import { isLocal } from '~/services/console'

const POSTHOG_URL_PROPERTY_KEYS = [
  '$current_url',
  '$initial_current_url',
  '$initial_referrer',
  '$referrer',
  'current_url',
  'url',
]

function isInvitationTokenKey(value: string): boolean {
  try {
    return decodeURIComponent(value.replace(/\+/g, ' ')).toLowerCase().includes('invite_magic_string')
  }
  catch {
    return value.toLowerCase().includes('invite_magic_string')
  }
}

function removeInvitationToken(value: unknown): unknown {
  if (typeof value !== 'string')
    return value

  try {
    const isAbsolute = /^[a-z][a-z\d+.-]*:\/\//i.test(value)
    const url = new URL(value, 'https://redacted.invalid')
    let removedToken = false
    for (const key of [...url.searchParams.keys()]) {
      if (isInvitationTokenKey(key)) {
        url.searchParams.delete(key)
        removedToken = true
      }
    }
    if (!removedToken)
      return value
    return isAbsolute ? url.toString() : `${url.pathname}${url.search}${url.hash}`
  }
  catch {
    let removedToken = false
    const sanitized = value.replace(/([?&])([^=&#]+)(?:=[^&#]*)?/g, (match, separator, key) => {
      if (!isInvitationTokenKey(key))
        return match
      removedToken = true
      return `${separator}${key}=[redacted]`
    })
    return removedToken ? sanitized : value
  }
}

function sanitizeInvitationUrlProperties(properties: Record<string, unknown>) {
  const sanitized = { ...properties }
  for (const key of POSTHOG_URL_PROPERTY_KEYS) {
    if (key in sanitized)
      sanitized[key] = removeInvitationToken(sanitized[key])
  }
  return sanitized
}

export function sanitizePostHogInvitationEvent(event: unknown) {
  if (!event || typeof event !== 'object')
    return event

  const properties = (event as { properties?: Record<string, unknown> }).properties
  if (!properties)
    return event

  const sanitizedProperties = sanitizeInvitationUrlProperties(properties)
  for (const key of ['$set', '$set_once']) {
    const nestedProperties = sanitizedProperties[key]
    if (nestedProperties && typeof nestedProperties === 'object' && !Array.isArray(nestedProperties))
      sanitizedProperties[key] = sanitizeInvitationUrlProperties(nestedProperties as Record<string, unknown>)
  }

  return { ...event, properties: sanitizedProperties }
}

export function posthogLoader(apiHost: string) {
  if (isLocal(apiHost))
    return
  !function (t, e) { var o, n, p, r; e.__SV || (window.posthog && window.posthog.__loaded) || (window.posthog = e, e._i = [], e.init = function (i, s, a) { function g(t, e) { var o = e.split("."); 2 == o.length && (t = t[o[0]], e = o[1]), t[e] = function () { t.push([e].concat(Array.prototype.slice.call(arguments, 0))) } } (p = t.createElement("script")).type = "text/javascript", p.crossOrigin = "anonymous", p.async = !0, p.src = s.api_host.replace(".i.posthog.com", "-assets.i.posthog.com") + "/static/array.js", (r = t.getElementsByTagName("script")[0]).parentNode.insertBefore(p, r); var u = e; for (void 0 !== a ? u = e[a] = [] : a = "posthog", u.people = u.people || [], u.toString = function (t) { var e = "posthog"; return "posthog" !== a && (e += "." + a), t || (e += " (stub)"), e }, u.people.toString = function () { return u.toString(1) + ".people (stub)" }, o = "ki Ci init qi Hi pr Bi zi Di capture calculateEventProperties Qi register register_once register_for_session unregister unregister_for_session Ki getFeatureFlag getFeatureFlagPayload getFeatureFlagResult getAllFeatureFlags isFeatureEnabled reloadFeatureFlags updateFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey displaySurvey cancelPendingSurvey canRenderSurvey canRenderSurveyAsync Xi identify setPersonProperties unsetPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset shutdown setIdentity clearIdentity get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException addExceptionStep captureLog startExceptionAutocapture stopExceptionAutocapture loadToolbar get_property getSessionProperty Ji Gi createPersonProfile setInternalOrTestUser Yi Ai rn opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing get_explicit_consent_status is_capturing clear_opt_in_out_capturing Vi debug mr it getPageViewId captureTraceFeedback captureTraceMetric Oi".split(" "), n = 0; n < o.length; n++)g(u, o[n]); e._i.push([i, s, a]) }, e.__SV = 1) }(document, window.posthog || []);
  posthog.init('phc_NXDyDajQaTQVwb25DEhIVZfxVUn4R0Y348Z7vWYHZUi', {
    api_host: 'https://psthg.capgo.app',
    ui_host: 'https://eu.posthog.com',
    person_profiles: 'identified_only',
    defaults: '2026-05-30',
    before_send: (event) => {
      const sanitizedEvent = sanitizePostHogInvitationEvent(event)
      if (shouldSuppressPostHogExceptionEvent(sanitizedEvent))
        return false
      return sanitizedEvent
    },
  })
}

type JsonPrimitive = string | number | boolean | null
type PostHogProperties = Record<string, JsonPrimitive>

export function pushEvent(nameEvent: string, apiHost: string, properties?: PostHogProperties): void {
  if (isLocal(apiHost))
    return
  posthog.capture(nameEvent, properties)
}

export function pushEventForUser(nameEvent: string, uuid: string, apiHost: string, properties?: PostHogProperties): void {
  if (isLocal(apiHost))
    return
  posthog.identify(uuid)
  posthog.capture(nameEvent, properties)
}

export function setUser(uuid: string, data: {
  first_name?: string
  last_name?: string
  nickname?: string
  phone?: string
  email?: string
  avatar?: string
}, apiHost: string): void {
  if (isLocal(apiHost))
    return
  // console.log('setUser')
  posthog.identify(
    uuid,
    { email: data.email, name: data.nickname, ...(data.first_name ? { first_name: data.first_name } : {}), ...(data.last_name ? { last_name: data.last_name } : {}) },
  )
  posthog.setPersonProperties(
    { avatar: data.avatar },
  )
}

export function reset(apiHost: string): void {
  if (isLocal(apiHost))
    return
  posthog.reset()
}