{"version":3,"sources":["../src/next-app-router.ts","../src/core/redactor.ts"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\nimport type { RumInstance, RumOptions } from './types';\nimport { redactUrl } from './core/redactor';\n\nexport interface RumNextAppTrackerProps {\n  rum: RumInstance;\n  pathname: string;\n  search?: string;\n  pattern?: string;\n  redact?: RumOptions['redact'];\n}\n\nconst lastAppNavigation = new WeakMap<RumInstance, string>();\n\nexport function trackNextAppNavigation(rum: RumInstance, props: Omit<RumNextAppTrackerProps, 'rum'>): void {\n  const url = redactUrl(routeUrl(props.pathname, props.search), props.redact?.urlQueryKeys);\n  const span = rum.startSpan('routeChange', {\n    'next.router': 'app',\n    'route.url': url,\n    'route.pattern': props.pattern ?? props.pathname\n  });\n  span.end();\n}\n\nexport function RumNextAppTracker(props: RumNextAppTrackerProps): null {\n  const redactionKey = props.redact?.urlQueryKeys?.join('\\0') ?? '';\n  useEffect(() => {\n    const key = `${props.pathname}|${props.search ?? ''}|${props.pattern ?? ''}|${redactionKey}`;\n    if (lastAppNavigation.get(props.rum) === key) return;\n    lastAppNavigation.set(props.rum, key);\n    trackNextAppNavigation(props.rum, props);\n  }, [props.rum, props.pathname, props.search, props.pattern, redactionKey]);\n  return null;\n}\n\nfunction routeUrl(pathname: string, search?: string): string {\n  if (!search) return pathname;\n  return `${pathname}${search.startsWith('?') ? search : `?${search}`}`;\n}\n","const DEFAULT_QUERY_KEYS = ['password', 'token', 'secret', 'api_key', 'authorization'];\n\nexport function redactUrl(rawUrl: string, extraKeys: string[] = []): string {\n  const sensitive = new Set([...DEFAULT_QUERY_KEYS, ...extraKeys].map((key) => key.toLowerCase()));\n  try {\n    const url = new URL(rawUrl, typeof location !== 'undefined' ? location.href : 'https://example.invalid');\n    url.searchParams.forEach((_value, key) => {\n      if (sensitive.has(key.toLowerCase())) url.searchParams.set(key, '[REDACTED]');\n    });\n    return rawUrl.startsWith('http') ? url.toString() : `${url.pathname}${url.search}${url.hash}`;\n  } catch {\n    return rawUrl;\n  }\n}\n\nexport function redactHeaders(headers: Record<string, string>, keys: string[] = []): Record<string, string> {\n  const sensitive = new Set(keys.map((key) => key.toLowerCase()));\n  return Object.fromEntries(Object.entries(headers).filter(([key]) => !sensitive.has(key.toLowerCase())));\n}\n\nexport function redactStackTrace(stack: string, extraKeys: string[] = []): string {\n  return stack.replace(/https?:\\/\\/[^\\s\"'<>]+/g, (match) => {\n    const trailing = match.match(/[)\\].,;]+$/)?.[0] ?? '';\n    const url = trailing ? match.slice(0, -trailing.length) : match;\n    return `${redactUrl(url, extraKeys)}${trailing}`;\n  });\n}\n\nexport function redactInteractionText(element: Element | null, text: string): string {\n  if (element instanceof HTMLInputElement) {\n    const type = element.type.toLowerCase();\n    if (type === 'password' || type === 'email' || type === 'tel' || type === 'credit-card') {\n      return '[REDACTED]';\n    }\n  }\n  return text.length > 100 ? text.slice(0, 100) : text;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAA0B;;;ACF1B,IAAM,qBAAqB,CAAC,YAAY,SAAS,UAAU,WAAW,eAAe;AAE9E,SAAS,UAAU,QAAgB,YAAsB,CAAC,GAAW;AAC1E,QAAM,YAAY,IAAI,IAAI,CAAC,GAAG,oBAAoB,GAAG,SAAS,EAAE,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC;AAC/F,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,QAAQ,OAAO,aAAa,cAAc,SAAS,OAAO,yBAAyB;AACvG,QAAI,aAAa,QAAQ,CAAC,QAAQ,QAAQ;AACxC,UAAI,UAAU,IAAI,IAAI,YAAY,CAAC,EAAG,KAAI,aAAa,IAAI,KAAK,YAAY;AAAA,IAC9E,CAAC;AACD,WAAO,OAAO,WAAW,MAAM,IAAI,IAAI,SAAS,IAAI,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI;AAAA,EAC7F,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADCA,IAAM,oBAAoB,oBAAI,QAA6B;AAEpD,SAAS,uBAAuB,KAAkB,OAAkD;AAhB3G;AAiBE,QAAM,MAAM,UAAU,SAAS,MAAM,UAAU,MAAM,MAAM,IAAG,WAAM,WAAN,mBAAc,YAAY;AACxF,QAAM,OAAO,IAAI,UAAU,eAAe;AAAA,IACxC,eAAe;AAAA,IACf,aAAa;AAAA,IACb,kBAAiB,WAAM,YAAN,YAAiB,MAAM;AAAA,EAC1C,CAAC;AACD,OAAK,IAAI;AACX;AAEO,SAAS,kBAAkB,OAAqC;AA1BvE;AA2BE,QAAM,gBAAe,uBAAM,WAAN,mBAAc,iBAAd,mBAA4B,KAAK,UAAjC,YAA0C;AAC/D,8BAAU,MAAM;AA5BlB,QAAAA,KAAAC;AA6BI,UAAM,MAAM,GAAG,MAAM,QAAQ,KAAID,MAAA,MAAM,WAAN,OAAAA,MAAgB,EAAE,KAAIC,MAAA,MAAM,YAAN,OAAAA,MAAiB,EAAE,IAAI,YAAY;AAC1F,QAAI,kBAAkB,IAAI,MAAM,GAAG,MAAM,IAAK;AAC9C,sBAAkB,IAAI,MAAM,KAAK,GAAG;AACpC,2BAAuB,MAAM,KAAK,KAAK;AAAA,EACzC,GAAG,CAAC,MAAM,KAAK,MAAM,UAAU,MAAM,QAAQ,MAAM,SAAS,YAAY,CAAC;AACzE,SAAO;AACT;AAEA,SAAS,SAAS,UAAkB,QAAyB;AAC3D,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,GAAG,QAAQ,GAAG,OAAO,WAAW,GAAG,IAAI,SAAS,IAAI,MAAM,EAAE;AACrE;","names":["_a","_b"]}