fix(sentry): widen SentryLike so official SDKs assign without adapters
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* Compile-time regression: official Sentry SDKs must assign to {@link SentryLike}
|
||||
* without casts or consumer adapters. Checked by `pnpm check` (`tsc --noEmit`).
|
||||
*/
|
||||
import * as Sentry from "@sentry/node";
|
||||
import { createSentrySink, type SentryLike } from "../src/sentry";
|
||||
|
||||
const _sdk: SentryLike = Sentry;
|
||||
createSentrySink(Sentry);
|
||||
createSentrySink(Sentry, { logs: true });
|
||||
|
||||
const stub: SentryLike = {
|
||||
withScope: (callback) =>
|
||||
callback({
|
||||
setLevel: () => undefined,
|
||||
setTag: () => undefined,
|
||||
setExtras: () => undefined,
|
||||
}),
|
||||
captureException: () => undefined,
|
||||
captureMessage: () => undefined,
|
||||
logger: {
|
||||
trace: () => undefined,
|
||||
debug: () => undefined,
|
||||
info: () => undefined,
|
||||
warn: () => undefined,
|
||||
error: () => undefined,
|
||||
},
|
||||
};
|
||||
createSentrySink(stub);
|
||||
createSentrySink(stub, { logs: true });
|
||||
+67
-2
@@ -1,6 +1,6 @@
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { createLogger } from "../src/index";
|
||||
import { createSentrySink, toSentryLogPayload } from "../src/sentry";
|
||||
import { createLogger, type LogEvent } from "../src/index";
|
||||
import { createSentrySink, toSentryLogPayload, toSentrySeverity } from "../src/sentry";
|
||||
|
||||
function createFakeSentry() {
|
||||
const scope = { setLevel: vi.fn(), setTag: vi.fn(), setExtras: vi.fn() };
|
||||
@@ -21,6 +21,29 @@ function createFakeSentry() {
|
||||
};
|
||||
}
|
||||
|
||||
function issueEvent(overrides: Partial<LogEvent> = {}): LogEvent {
|
||||
return {
|
||||
level: "error",
|
||||
arguments: ["message"],
|
||||
timestamp: new Date(),
|
||||
environment: "production",
|
||||
sendToSentryLogs: false,
|
||||
sendToSentryIssue: true,
|
||||
sendToConsole: false,
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
describe("toSentrySeverity", () => {
|
||||
it("maps logger levels to Sentry Issue severities", () => {
|
||||
expect(toSentrySeverity("warn")).toBe("warning");
|
||||
expect(toSentrySeverity("trace")).toBe("debug");
|
||||
expect(toSentrySeverity("error")).toBe("error");
|
||||
expect(toSentrySeverity("info")).toBe("info");
|
||||
expect(toSentrySeverity("debug")).toBe("debug");
|
||||
});
|
||||
});
|
||||
|
||||
describe("toSentryLogPayload", () => {
|
||||
it("joins string messages and flattens primitive object attributes", () => {
|
||||
expect(
|
||||
@@ -111,4 +134,46 @@ describe("createSentrySink", () => {
|
||||
expect(sentry.captureException).not.toHaveBeenCalled();
|
||||
expect(sentry.logger.warn).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("maps warn → warning on the Issues path and keeps warn on the Logs path", () => {
|
||||
const { scope, sentry } = createFakeSentry();
|
||||
const sink = createSentrySink(sentry, { logs: true });
|
||||
|
||||
sink.emit(
|
||||
issueEvent({
|
||||
level: "warn",
|
||||
arguments: ["degraded"],
|
||||
}),
|
||||
);
|
||||
expect(scope.setLevel).toHaveBeenCalledWith("warning");
|
||||
expect(sentry.captureMessage).toHaveBeenCalledWith("degraded", "warning");
|
||||
expect(sentry.logger.warn).not.toHaveBeenCalled();
|
||||
|
||||
sink.emit({
|
||||
level: "warn",
|
||||
namespace: "API",
|
||||
arguments: ["slow", { ms: 10 }],
|
||||
timestamp: new Date(),
|
||||
environment: "production",
|
||||
sendToSentryLogs: true,
|
||||
sendToSentryIssue: false,
|
||||
sendToConsole: false,
|
||||
});
|
||||
expect(sentry.logger.warn).toHaveBeenCalledWith("slow", {
|
||||
"logger.namespace": "API",
|
||||
ms: 10,
|
||||
});
|
||||
});
|
||||
|
||||
it("maps error Issue severity as error", () => {
|
||||
const { scope, sentry } = createFakeSentry();
|
||||
createSentrySink(sentry).emit(
|
||||
issueEvent({
|
||||
level: "error",
|
||||
arguments: ["failed"],
|
||||
}),
|
||||
);
|
||||
expect(scope.setLevel).toHaveBeenCalledWith("error");
|
||||
expect(sentry.captureMessage).toHaveBeenCalledWith("failed", "error");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user