messageFormatter.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // webpack fallback handles this
  2. // eslint-disable-next-line
  3. import {format} from 'util';
  4. import {AnnotatedText} from 'sentry/components/events/meta/annotatedText';
  5. import {getMeta} from 'sentry/components/events/meta/metaProxy';
  6. import {BreadcrumbTypeDefault, Crumb} from 'sentry/types/breadcrumbs';
  7. import isObject from 'lodash/isObject';
  8. import {objectIsEmpty} from 'sentry/utils';
  9. interface Props {
  10. breadcrumb: Extract<Crumb, BreadcrumbTypeDefault>;
  11. }
  12. /**
  13. * Attempt to emulate the browser console as much as possible
  14. */
  15. function MessageFormatter({breadcrumb}: Props) {
  16. let logMessage = '';
  17. if (!breadcrumb.data?.arguments) {
  18. // There is a possibility that we don't have arguments as we could be receiving an exception type breadcrumb.
  19. // In these cases we just need the message prop.
  20. // There are cases in which our prop message is an array, we want to force it to become a string
  21. logMessage = breadcrumb.message?.toString() || '';
  22. return <AnnotatedText meta={getMeta(breadcrumb, 'message')} value={logMessage} />;
  23. }
  24. // There is a special case where `console.error()` is called with an Error object.
  25. // The SDK uses the Error's `message` property as the breadcrumb message, but we lose the Error type,
  26. // resulting in an empty object in the breadcrumb arguments. In this case, we
  27. // only want to use `breadcrumb.message`.
  28. if (
  29. breadcrumb.message &&
  30. breadcrumb.data?.arguments.length === 1 &&
  31. isObject(breadcrumb.data.arguments[0]) &&
  32. objectIsEmpty(breadcrumb.data.arguments[0])
  33. ) {
  34. logMessage = breadcrumb.message;
  35. } else {
  36. logMessage = format(...breadcrumb.data.arguments);
  37. }
  38. // TODO(replays): Add better support for AnnotatedText (e.g. we use message
  39. // args from breadcrumb.data.arguments and not breadcrumb.message directly)
  40. return <AnnotatedText meta={getMeta(breadcrumb, 'message')} value={logMessage} />;
  41. }
  42. export default MessageFormatter;