{"version":3,"file":"eventbuilder.js","sources":["../../../src/utils/eventbuilder.ts"],"sourcesContent":["import type { Client } from '../client';\nimport type { Event, EventHint } from '../types-hoist/event';\nimport type { Exception } from '../types-hoist/exception';\nimport type { Extras } from '../types-hoist/extra';\nimport type { Mechanism } from '../types-hoist/mechanism';\nimport type { ParameterizedString } from '../types-hoist/parameterize';\nimport type { SeverityLevel } from '../types-hoist/severity';\nimport type { StackFrame } from '../types-hoist/stackframe';\nimport type { StackParser } from '../types-hoist/stacktrace';\nimport { isError, isErrorEvent, isParameterizedString, isPlainObject } from './is';\nimport { addExceptionMechanism, addExceptionTypeValue } from './misc';\nimport { normalizeToSize } from './normalize';\nimport { extractExceptionKeysForMessage } from './object';\n\n/**\n * Extracts stack frames from the error.stack string\n */\nexport function parseStackFrames(stackParser: StackParser, error: Error): StackFrame[] {\n  return stackParser(error.stack || '', 1);\n}\n\nfunction hasSentryFetchUrlHost(error: unknown): error is Error & { __sentry_fetch_url_host__: string } {\n  return isError(error) && '__sentry_fetch_url_host__' in error && typeof error.__sentry_fetch_url_host__ === 'string';\n}\n\n/**\n * Enhances the error message with the hostname for better Sentry error reporting.\n * This allows third-party packages to still match on the original error message,\n * while Sentry gets the enhanced version with context.\n *\n * Only used internally\n * @hidden\n */\nexport function _enhanceErrorWithSentryInfo<T extends Error>(error: T): string {\n  // If the error has a __sentry_fetch_url_host__ property (added by fetch instrumentation),\n  // enhance the error message with the hostname.\n  if (hasSentryFetchUrlHost(error)) {\n    return `${error.message} (${error.__sentry_fetch_url_host__})`;\n  }\n\n  return error.message;\n}\n\n/**\n * Extracts stack frames from the error and builds a Sentry Exception\n */\nexport function exceptionFromError(stackParser: StackParser, error: Error): Exception {\n  const exception: Exception = {\n    type: error.name || error.constructor.name,\n    value: _enhanceErrorWithSentryInfo(error),\n  };\n\n  const frames = parseStackFrames(stackParser, error);\n  if (frames.length) {\n    exception.stacktrace = { frames };\n  }\n\n  return exception;\n}\n\n/** If a plain object has a property that is an `Error`, return this error. */\nfunction getErrorPropertyFromObject(obj: Record<string, unknown>): Error | undefined {\n  for (const prop in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n      const value = obj[prop];\n      if (value instanceof Error) {\n        return value;\n      }\n    }\n  }\n\n  return undefined;\n}\n\nfunction getMessageForObject(exception: Record<string, unknown>): string {\n  if ('name' in exception && typeof exception.name === 'string') {\n    let message = `'${exception.name}' captured as exception`;\n\n    if ('message' in exception && typeof exception.message === 'string') {\n      message += ` with message '${exception.message}'`;\n    }\n\n    return message;\n  } else if ('message' in exception && typeof exception.message === 'string') {\n    return exception.message;\n  }\n\n  const keys = extractExceptionKeysForMessage(exception);\n\n  // Some ErrorEvent instances do not have an `error` property, which is why they are not handled before\n  // We still want to try to get a decent message for these cases\n  if (isErrorEvent(exception)) {\n    return `Event \\`ErrorEvent\\` captured as exception with message \\`${exception.message}\\``;\n  }\n\n  const className = getObjectClassName(exception);\n\n  return `${\n    className && className !== 'Object' ? `'${className}'` : 'Object'\n  } captured as exception with keys: ${keys}`;\n}\n\nfunction getObjectClassName(obj: unknown): string | undefined | void {\n  try {\n    const prototype: unknown | null = Object.getPrototypeOf(obj);\n    return prototype ? prototype.constructor.name : undefined;\n  } catch {\n    // ignore errors here\n  }\n}\n\nfunction getException(\n  client: Client,\n  mechanism: Mechanism,\n  exception: unknown,\n  hint?: EventHint,\n): [Error, Extras | undefined] {\n  if (isError(exception)) {\n    return [exception, undefined];\n  }\n\n  // Mutate this!\n  mechanism.synthetic = true;\n\n  if (isPlainObject(exception)) {\n    const normalizeDepth = client?.getOptions().normalizeDepth;\n    const extras = { ['__serialized__']: normalizeToSize(exception, normalizeDepth) };\n\n    const errorFromProp = getErrorPropertyFromObject(exception);\n    if (errorFromProp) {\n      return [errorFromProp, extras];\n    }\n\n    const message = getMessageForObject(exception);\n    const ex = hint?.syntheticException || new Error(message);\n    ex.message = message;\n\n    return [ex, extras];\n  }\n\n  // This handles when someone does: `throw \"something awesome\";`\n  // We use synthesized Error here so we can extract a (rough) stack trace.\n  const ex = hint?.syntheticException || new Error(exception as string);\n  ex.message = `${exception}`;\n\n  return [ex, undefined];\n}\n\n/**\n * Builds and Event from a Exception\n * @hidden\n */\nexport function eventFromUnknownInput(\n  client: Client,\n  stackParser: StackParser,\n  exception: unknown,\n  hint?: EventHint,\n): Event {\n  const providedMechanism: Mechanism | undefined = hint?.data && (hint.data as { mechanism: Mechanism }).mechanism;\n  const mechanism: Mechanism = providedMechanism || {\n    handled: true,\n    type: 'generic',\n  };\n\n  const [ex, extras] = getException(client, mechanism, exception, hint);\n\n  const event: Event = {\n    exception: {\n      values: [exceptionFromError(stackParser, ex)],\n    },\n  };\n\n  if (extras) {\n    event.extra = extras;\n  }\n\n  addExceptionTypeValue(event, undefined, undefined);\n  addExceptionMechanism(event, mechanism);\n\n  return {\n    ...event,\n    event_id: hint?.event_id,\n  };\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(\n  stackParser: StackParser,\n  message: ParameterizedString,\n  level: SeverityLevel = 'info',\n  hint?: EventHint,\n  attachStacktrace?: boolean,\n): Event {\n  const event: Event = {\n    event_id: hint?.event_id,\n    level,\n  };\n\n  if (attachStacktrace && hint?.syntheticException) {\n    const frames = parseStackFrames(stackParser, hint.syntheticException);\n    if (frames.length) {\n      event.exception = {\n        values: [\n          {\n            value: message,\n            stacktrace: { frames },\n          },\n        ],\n      };\n      addExceptionMechanism(event, { synthetic: true });\n    }\n  }\n\n  if (isParameterizedString(message)) {\n    const { __sentry_template_string__, __sentry_template_values__ } = message;\n\n    event.logentry = {\n      message: __sentry_template_string__,\n      params: __sentry_template_values__,\n    };\n    return event;\n  }\n\n  event.message = message;\n  return event;\n}\n"],"names":[],"mappings":"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"}