fix(docs):Docs and Exports
ci/woodpecker/push/ci Pipeline failed
ci/woodpecker/push/publish unknown status

- Add documentation for recently released changes
- Update some exports to include enums
This commit is contained in:
2026-08-21 11:45:56 -03:00
parent 2134ba58b8
commit f464fa5017
18 changed files with 1350 additions and 1307 deletions
+69 -69
View File
@@ -1,6 +1,6 @@
import { describe, expect, it, vi } from "vitest";
import { createLogger, type LogEvent } from "../src/index";
import { createSentrySink, toSentryLogPayload, toSentrySeverity } from "../src/sentry";
import { describe, expect, it, vi } from 'vitest';
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() };
@@ -23,10 +23,10 @@ function createFakeSentry() {
function issueEvent(overrides: Partial<LogEvent> = {}): LogEvent {
return {
level: "error",
arguments: ["message"],
level: 'error',
arguments: ['message'],
timestamp: new Date(),
environment: "production",
environment: 'production',
sendToSentryLogs: false,
sendToSentryIssue: true,
sendToConsole: false,
@@ -34,46 +34,46 @@ function issueEvent(overrides: Partial<LogEvent> = {}): LogEvent {
};
}
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('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", () => {
describe('toSentryLogPayload', () => {
it('joins string messages and flattens primitive object attributes', () => {
expect(
toSentryLogPayload({
level: "info",
namespace: "API",
arguments: ["Cache warmed", { entries: 42, ok: true, nested: { a: 1 } }],
level: 'info',
namespace: 'API',
arguments: ['Cache warmed', { entries: 42, ok: true, nested: { a: 1 } }],
timestamp: new Date(),
environment: "production",
environment: 'production',
sendToSentryLogs: true,
sendToSentryIssue: false,
sendToConsole: false,
}),
).toEqual({
message: "Cache warmed",
message: 'Cache warmed',
attributes: {
"logger.namespace": "API",
'logger.namespace': 'API',
entries: 42,
ok: true,
},
});
});
it("includes async when the event was deferred for thenables", () => {
it('includes async when the event was deferred for thenables', () => {
expect(
toSentryLogPayload({
level: "debug",
arguments: ["response"],
level: 'debug',
arguments: ['response'],
timestamp: new Date(),
environment: "development",
environment: 'development',
sendToSentryLogs: true,
sendToSentryIssue: false,
sendToConsole: true,
@@ -83,112 +83,112 @@ describe("toSentryLogPayload", () => {
});
});
describe("createSentrySink", () => {
it("captures errors as Issues with namespace and structured attributes", () => {
describe('createSentrySink', () => {
it('captures errors as Issues with namespace and structured attributes', () => {
const { scope, sentry } = createFakeSentry();
const logger = createLogger({
environment: "production",
namespace: "API",
environment: 'production',
namespace: 'API',
sinks: [createSentrySink(sentry)],
});
const error = new Error("offline");
logger.warn("ignored without logs");
logger.error("Request failed", error, { requestId: "req_1" });
const error = new Error('offline');
logger.warn('ignored without logs');
logger.error('Request failed', error, { requestId: 'req_1' });
expect(sentry.captureException).toHaveBeenCalledWith(error);
expect(sentry.captureMessage).not.toHaveBeenCalled();
expect(sentry.logger.info).not.toHaveBeenCalled();
expect(scope.setLevel).toHaveBeenCalledWith("error");
expect(scope.setTag).toHaveBeenCalledWith("logger.namespace", "API");
expect(scope.setLevel).toHaveBeenCalledWith('error');
expect(scope.setTag).toHaveBeenCalledWith('logger.namespace', 'API');
expect(scope.setExtras).toHaveBeenCalledWith({
"logger.namespace": "API",
requestId: "req_1",
'logger.namespace': 'API',
requestId: 'req_1',
});
});
it("writes non-error events to Sentry Logs when enabled, not as Issues", () => {
it('writes non-error events to Sentry Logs when enabled, not as Issues', () => {
const { sentry } = createFakeSentry();
const logger = createLogger({
environment: "production",
namespace: "API",
environment: 'production',
namespace: 'API',
sinks: [createSentrySink(sentry, { logs: true })],
});
logger.warn("slow", { ms: 1200 });
logger.info("forced", { id: 1 }, { sentry: true });
logger.warn('slow', { ms: 1200 });
logger.info('forced', { id: 1 }, { sentry: true });
expect(sentry.captureMessage).not.toHaveBeenCalled();
expect(sentry.captureException).not.toHaveBeenCalled();
expect(sentry.logger.warn).toHaveBeenCalledWith("slow", {
"logger.namespace": "API",
expect(sentry.logger.warn).toHaveBeenCalledWith('slow', {
'logger.namespace': 'API',
ms: 1200,
});
expect(sentry.logger.info).toHaveBeenCalledWith("forced", {
"logger.namespace": "API",
expect(sentry.logger.info).toHaveBeenCalledWith('forced', {
'logger.namespace': 'API',
id: 1,
});
});
it("does not create an Issue when suppressSentry is set", () => {
it('does not create an Issue when suppressSentry is set', () => {
const { sentry } = createFakeSentry();
const logger = createLogger({
environment: "production",
runtime: "node",
environment: 'production',
runtime: 'node',
sinks: [createSentrySink(sentry, { logs: true })],
});
logger.error("expected", new Error("nope"), { suppressSentry: true });
logger.error('expected', new Error('nope'), { suppressSentry: true });
expect(sentry.captureException).not.toHaveBeenCalled();
expect(sentry.logger.error).not.toHaveBeenCalled();
});
it("never sends in development", () => {
it('never sends in development', () => {
const { sentry } = createFakeSentry();
const logger = createLogger({
environment: "development",
environment: 'development',
sinks: [createSentrySink(sentry, { logs: true })],
});
logger.error("local", new Error("x"));
logger.warn("local warn", { sentry: true });
logger.error('local', new Error('x'));
logger.warn('local warn', { sentry: true });
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", () => {
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"],
level: 'warn',
arguments: ['degraded'],
}),
);
expect(scope.setLevel).toHaveBeenCalledWith("warning");
expect(sentry.captureMessage).toHaveBeenCalledWith("degraded", "warning");
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 }],
level: 'warn',
namespace: 'API',
arguments: ['slow', { ms: 10 }],
timestamp: new Date(),
environment: "production",
environment: 'production',
sendToSentryLogs: true,
sendToSentryIssue: false,
sendToConsole: false,
});
expect(sentry.logger.warn).toHaveBeenCalledWith("slow", {
"logger.namespace": "API",
expect(sentry.logger.warn).toHaveBeenCalledWith('slow', {
'logger.namespace': 'API',
ms: 10,
});
});
it("maps error Issue severity as error", () => {
it('maps error Issue severity as error', () => {
const { scope, sentry } = createFakeSentry();
createSentrySink(sentry).emit(
issueEvent({
level: "error",
arguments: ["failed"],
level: 'error',
arguments: ['failed'],
}),
);
expect(scope.setLevel).toHaveBeenCalledWith("error");
expect(sentry.captureMessage).toHaveBeenCalledWith("failed", "error");
expect(scope.setLevel).toHaveBeenCalledWith('error');
expect(sentry.captureMessage).toHaveBeenCalledWith('failed', 'error');
});
});