feat(core-shared): add ILogger interface + NoopLogger

This commit is contained in:
2026-05-06 23:41:27 +02:00
parent f1051ded9b
commit fdd4e9141b
3 changed files with 69 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
export type Breadcrumb = {
category: string;
message: string;
level?: "info" | "warning" | "error";
data?: Record<string, unknown>;
};
export type CaptureContext = {
tags?: Record<string, string>;
extras?: Record<string, unknown>;
fingerprint?: string[];
};
export interface ILogger {
captureException(err: unknown, ctx?: CaptureContext): void;
captureMessage(
msg: string,
level?: "info" | "warning" | "error",
ctx?: CaptureContext,
): void;
addBreadcrumb(b: Breadcrumb): void;
setUser(user: { id: string } | null): void;
}

View File

@@ -0,0 +1,34 @@
import { describe, it, expect } from "vitest";
import { NoopLogger } from "@/instrumentation/noop-logger";
describe("NoopLogger", () => {
it("captureException is callable with err and ctx", () => {
const logger = new NoopLogger();
expect(() => logger.captureException(new Error("x"))).not.toThrow();
expect(() =>
logger.captureException(new Error("x"), { tags: { feature: "blog" } }),
).not.toThrow();
});
it("captureMessage is callable", () => {
const logger = new NoopLogger();
expect(() => logger.captureMessage("hello")).not.toThrow();
expect(() => logger.captureMessage("hello", "warning")).not.toThrow();
expect(() =>
logger.captureMessage("hello", "error", { extras: { foo: 1 } }),
).not.toThrow();
});
it("addBreadcrumb is callable", () => {
const logger = new NoopLogger();
expect(() =>
logger.addBreadcrumb({ category: "test", message: "x" }),
).not.toThrow();
});
it("setUser accepts opaque id and null", () => {
const logger = new NoopLogger();
expect(() => logger.setUser({ id: "u1" })).not.toThrow();
expect(() => logger.setUser(null)).not.toThrow();
});
});

View File

@@ -0,0 +1,12 @@
import type { ILogger, Breadcrumb, CaptureContext } from "./logger.interface";
export class NoopLogger implements ILogger {
captureException(_err: unknown, _ctx?: CaptureContext): void {}
captureMessage(
_msg: string,
_level?: "info" | "warning" | "error",
_ctx?: CaptureContext,
): void {}
addBreadcrumb(_b: Breadcrumb): void {}
setUser(_user: { id: string } | null): void {}
}