sentry-vir 4.0.1 → 4.0.3

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.
@@ -1,19 +1,24 @@
1
+ import { safeCopyThroughJson, } from '@augment-vir/common';
1
2
  /**
2
3
  * Maps internal EventDetails type to Sentry's required type for event severity, extra context, and
3
4
  * tags.
4
5
  */
5
6
  export function convertEventDetailsToSentryContext(eventDetails, options) {
6
- const extra = {
7
+ const extra = safeCopyThroughJson({
7
8
  ...(options.wasSentPrematurely
8
9
  ? {
9
10
  wasSentPrematurely: true,
10
11
  }
11
12
  : {}),
12
13
  ...eventDetails.extraContext,
13
- };
14
+ });
14
15
  return {
15
16
  extra,
16
17
  level: eventDetails.severity,
17
- ...(eventDetails.tags ? { tags: eventDetails.tags } : {}),
18
+ ...(eventDetails.tags
19
+ ? {
20
+ tags: eventDetails.tags,
21
+ }
22
+ : {}),
18
23
  };
19
24
  }
@@ -23,7 +23,9 @@ function internalHandleError(error, eventOptions, options) {
23
23
  addPrematureEvent(internalHandleError, [
24
24
  error,
25
25
  eventOptions,
26
- { wasSentPrematurely: true },
26
+ {
27
+ wasSentPrematurely: true,
28
+ },
27
29
  ]);
28
30
  return undefined;
29
31
  }
@@ -18,5 +18,8 @@ export function sendPrematureEvents() {
18
18
  }
19
19
  }
20
20
  export function addPrematureEvent(callback, inputs) {
21
- prematureSentryEvents.push({ callback, inputs });
21
+ prematureSentryEvents.push({
22
+ callback,
23
+ inputs,
24
+ });
22
25
  }
@@ -1,5 +1,9 @@
1
1
  import { type Event as SentryEvent } from '@sentry/core';
2
2
  import { type ContextOptions, type EventContextAndTags, type EventDetails } from '../event-context/event-context.js';
3
+ /** A Sentry event object without the fields that are set by the logging context. */
4
+ export type SendLogEvent = Omit<SentryEvent, 'extra' | 'level'>;
5
+ /** All accepted input types for `sendLog`. Strings, Error objects, and raw Sentry events. */
6
+ export type SendLogInfo = string | Error | SendLogEvent;
3
7
  /** Send non-error events to Sentry. */
4
8
  export declare const sendLog: {
5
9
  /** Sends an even to Sentry with debug severity. */
@@ -9,5 +13,5 @@ export declare const sendLog: {
9
13
  /** Sends an even to Sentry with warning severity. */
10
14
  readonly warning: (info: Parameters<typeof sendLogToSentry>[0], eventOptions?: EventContextAndTags) => string | undefined;
11
15
  };
12
- declare function sendLogToSentry(logInfo: string | Omit<SentryEvent, 'extra' | 'level'>, eventDetails: EventDetails, options: ContextOptions): string | undefined;
16
+ declare function sendLogToSentry(logInfo: SendLogInfo, eventDetails: EventDetails, options: ContextOptions): string | undefined;
13
17
  export {};
@@ -1,4 +1,5 @@
1
1
  import { check } from '@augment-vir/assert';
2
+ import { extractErrorMessage } from '@augment-vir/common';
2
3
  import { convertEventDetailsToSentryContext, } from '../event-context/event-context.js';
3
4
  import { EventSeverityEnum } from '../event-context/event-severity.js';
4
5
  import { extractOriginalMessage } from '../processing/event-processor.js';
@@ -27,28 +28,36 @@ function wrapLogWithSeverity(severity) {
27
28
  }
28
29
  function sendLogToSentry(logInfo, eventDetails, options) {
29
30
  try {
31
+ /**
32
+ * `Error.message` is not enumerable, so spreading an `Error` into `captureEvent` would lose
33
+ * the message entirely and produce an `<unlabeled event>` in Sentry. Extract the message
34
+ * string so it goes through the `captureMessage` path instead.
35
+ */
36
+ const resolvedLogInfo = logInfo instanceof Error ? extractErrorMessage(logInfo) : logInfo;
30
37
  if (!sentryClientForLogging) {
31
38
  logToConsoleWithoutSentry(eventDetails.severity, LoggingState.NoSentryYet, {
32
- message: check.isString(logInfo)
33
- ? logInfo
34
- : extractOriginalMessage(logInfo, undefined),
35
- event: check.isString(logInfo) ? undefined : logInfo,
39
+ message: check.isString(resolvedLogInfo)
40
+ ? resolvedLogInfo
41
+ : extractOriginalMessage(resolvedLogInfo, undefined),
42
+ event: check.isString(resolvedLogInfo) ? undefined : resolvedLogInfo,
36
43
  extra: eventDetails.extraContext,
37
44
  hint: undefined,
38
45
  originalException: undefined,
39
46
  });
40
47
  addPrematureEvent(sendLogToSentry, [
41
- logInfo,
48
+ resolvedLogInfo,
42
49
  eventDetails,
43
- { wasSentPrematurely: true },
50
+ {
51
+ wasSentPrematurely: true,
52
+ },
44
53
  ]);
45
54
  return undefined;
46
55
  }
47
56
  const scopeContext = convertEventDetailsToSentryContext(eventDetails, options);
48
- const eventId = check.isString(logInfo)
49
- ? sentryClientForLogging.captureMessage(logInfo, scopeContext)
57
+ const eventId = check.isString(resolvedLogInfo)
58
+ ? sentryClientForLogging.captureMessage(resolvedLogInfo, scopeContext)
50
59
  : sentryClientForLogging.captureEvent({
51
- ...logInfo,
60
+ ...resolvedLogInfo,
52
61
  ...scopeContext,
53
62
  });
54
63
  return eventId;
@@ -1,4 +1,4 @@
1
- import { extractErrorMessage } from '@augment-vir/common';
1
+ import { extractErrorMessage, safeCopyThroughJson } from '@augment-vir/common';
2
2
  import { convertEventDetailsToSentryContext, } from '../event-context/event-context.js';
3
3
  import { extractEventSeverity } from '../event-context/event-severity.js';
4
4
  import { extractExtraEventContext, extractExtraEventTags, } from '../event-context/extra-event-context.js';
@@ -10,12 +10,12 @@ event,
10
10
  hint,
11
11
  /** Optional callback for creating extra event context. */
12
12
  createUniversalContext) {
13
- const extraContext = {
13
+ const extraContext = safeCopyThroughJson({
14
14
  ...extractExtraEventContext(hint),
15
15
  ...extractExtraEventContext(event),
16
16
  ...createUniversalContext?.(),
17
17
  originalFullMessage: event.message || extractErrorMessage(hint.originalException),
18
- };
18
+ });
19
19
  const extraTags = {
20
20
  ...extractExtraEventTags(hint),
21
21
  ...extractExtraEventTags(event),
@@ -27,6 +27,13 @@ createUniversalContext) {
27
27
  wasSentPrematurely: false,
28
28
  });
29
29
  Object.assign(event, sentryContext);
30
+ /**
31
+ * Try to recover one from the hint's original exception. Without this, the event shows as
32
+ * `<unlabeled event>` in Sentry.
33
+ */
34
+ if (!event.message && hint.originalException) {
35
+ event.message = extractErrorMessage(hint.originalException);
36
+ }
30
37
  if (Object.keys(extraTags).length) {
31
38
  event.tags = {
32
39
  ...event.tags,
@@ -15,9 +15,13 @@ export const throttleCache = new Map();
15
15
  */
16
16
  export const defaultThrottleOptions = {
17
17
  disableThrottling: false,
18
- thresholdInterval: { hours: 1 },
18
+ thresholdInterval: {
19
+ hours: 1,
20
+ },
19
21
  disableThrottleLog: false,
20
- throttleCooldown: { days: 1 },
22
+ throttleCooldown: {
23
+ days: 1,
24
+ },
21
25
  throttleThreshold: 50,
22
26
  };
23
27
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sentry-vir",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
4
4
  "description": "Easily use Sentry.",
5
5
  "keywords": [
6
6
  "config",
@@ -44,54 +44,54 @@
44
44
  "test:update": "npm test update"
45
45
  },
46
46
  "dependencies": {
47
- "@augment-vir/assert": "^31.65.0",
48
- "@augment-vir/common": "^31.65.0",
49
- "@sentry/browser": "^10.39.0",
50
- "@sentry/core": "^10.39.0",
51
- "@sentry/node": "^10.39.0",
52
- "date-vir": "^8.1.1",
47
+ "@augment-vir/assert": "^31.68.1",
48
+ "@augment-vir/common": "^31.68.1",
49
+ "@sentry/browser": "^10.42.0",
50
+ "@sentry/core": "^10.42.0",
51
+ "@sentry/node": "^10.42.0",
52
+ "date-vir": "^8.2.0",
53
53
  "type-fest": "^5.4.4"
54
54
  },
55
55
  "devDependencies": {
56
- "@augment-vir/test": "^31.65.0",
57
- "@eslint/eslintrc": "^3.3.3",
56
+ "@augment-vir/test": "^31.68.1",
57
+ "@eslint/eslintrc": "^3.3.4",
58
58
  "@eslint/js": "^9.39.2",
59
- "@stylistic/eslint-plugin": "^5.9.0",
59
+ "@stylistic/eslint-plugin": "^5.10.0",
60
60
  "@stylistic/eslint-plugin-ts": "^4.4.1",
61
- "@typescript-eslint/eslint-plugin": "^8.56.0",
61
+ "@typescript-eslint/eslint-plugin": "^8.56.1",
62
62
  "@web/dev-server-esbuild": "^1.0.5",
63
63
  "@web/test-runner": "^0.20.2",
64
64
  "@web/test-runner-commands": "^0.9.0",
65
65
  "@web/test-runner-playwright": "^0.11.1",
66
66
  "@web/test-runner-visual-regression": "^0.10.0",
67
- "cspell": "^9.6.4",
67
+ "cspell": "^9.7.0",
68
68
  "dependency-cruiser": "^17.3.8",
69
69
  "esbuild": "^0.27.3",
70
70
  "eslint": "^9.39.2",
71
71
  "eslint-config-prettier": "^10.1.8",
72
- "eslint-plugin-jsdoc": "^62.7.0",
72
+ "eslint-plugin-jsdoc": "^62.7.1",
73
73
  "eslint-plugin-monorepo-cop": "^1.0.2",
74
- "eslint-plugin-playwright": "^2.7.0",
74
+ "eslint-plugin-playwright": "^2.9.0",
75
75
  "eslint-plugin-prettier": "^5.5.5",
76
76
  "eslint-plugin-require-extensions": "^0.1.3",
77
- "eslint-plugin-sonarjs": "^4.0.0",
77
+ "eslint-plugin-sonarjs": "^4.0.1",
78
78
  "eslint-plugin-unicorn": "^63.0.0",
79
79
  "istanbul-smart-text-reporter": "^1.1.5",
80
80
  "markdown-code-example-inserter": "^3.0.3",
81
- "npm-check-updates": "^19.4.1",
81
+ "npm-check-updates": "^19.6.3",
82
82
  "prettier": "~3.3.3",
83
83
  "prettier-plugin-interpolated-html-tags": "^2.0.1",
84
84
  "prettier-plugin-jsdoc": "^1.8.0",
85
85
  "prettier-plugin-multiline-arrays": "^4.1.4",
86
86
  "prettier-plugin-organize-imports": "^4.3.0",
87
- "prettier-plugin-packagejson": "^3.0.0",
87
+ "prettier-plugin-packagejson": "^3.0.2",
88
88
  "prettier-plugin-sort-json": "^4.2.0",
89
89
  "prettier-plugin-toml": "^2.0.6",
90
90
  "runstorm": "^1.0.0",
91
91
  "typedoc": "^0.28.17",
92
92
  "typescript": "^5.9.3",
93
- "typescript-eslint": "^8.56.0",
94
- "virmator": "^14.6.1",
93
+ "typescript-eslint": "^8.56.1",
94
+ "virmator": "^14.8.3",
95
95
  "vite": "^7.3.1"
96
96
  },
97
97
  "engines": {