From fdd4e9141ba63822e3daeb2f3ddc66fb0c9f80e7 Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Wed, 6 May 2026 23:41:27 +0200 Subject: [PATCH] feat(core-shared): add ILogger interface + NoopLogger --- .../src/instrumentation/logger.interface.ts | 23 +++++++++++++ .../src/instrumentation/noop-logger.test.ts | 34 +++++++++++++++++++ .../src/instrumentation/noop-logger.ts | 12 +++++++ 3 files changed, 69 insertions(+) create mode 100644 packages/core-shared/src/instrumentation/logger.interface.ts create mode 100644 packages/core-shared/src/instrumentation/noop-logger.test.ts create mode 100644 packages/core-shared/src/instrumentation/noop-logger.ts diff --git a/packages/core-shared/src/instrumentation/logger.interface.ts b/packages/core-shared/src/instrumentation/logger.interface.ts new file mode 100644 index 0000000..49762c9 --- /dev/null +++ b/packages/core-shared/src/instrumentation/logger.interface.ts @@ -0,0 +1,23 @@ +export type Breadcrumb = { + category: string; + message: string; + level?: "info" | "warning" | "error"; + data?: Record; +}; + +export type CaptureContext = { + tags?: Record; + extras?: Record; + 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; +} diff --git a/packages/core-shared/src/instrumentation/noop-logger.test.ts b/packages/core-shared/src/instrumentation/noop-logger.test.ts new file mode 100644 index 0000000..3f00909 --- /dev/null +++ b/packages/core-shared/src/instrumentation/noop-logger.test.ts @@ -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(); + }); +}); diff --git a/packages/core-shared/src/instrumentation/noop-logger.ts b/packages/core-shared/src/instrumentation/noop-logger.ts new file mode 100644 index 0000000..1b7af61 --- /dev/null +++ b/packages/core-shared/src/instrumentation/noop-logger.ts @@ -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 {} +}