@lacspace/logger
A tiny structured logger for Node and the browser — leveled JSON logging, child loggers, field redaction and pluggable transports (JSON, pretty, in-memory). A log below the active level costs almost nothing: the record is never even built. Errors serialise automatically; secrets get redacted before they leave the logger. Zero-dependency, isomorphic.
npm i @lacspace/loggerUsage
import { createLogger } from "@lacspace/logger";
const log = createLogger({
level: "info",
bindings: { service: "api" }, // added to every line
redact: ["password", "*.token"], // secrets never reach the logs
});
log.info("server started", { port: 3000 });
// {"level":"info","time":1700000000000,"msg":"server started","service":"api","port":3000}
// a per-request child logger inherits bindings + transports
const reqLog = log.child({ reqId: "abc123" });
reqLog.warn("slow query", { ms: 1200 });
// a log below the active level costs nothing — the record is never built
log.debug("skipped");Exports 7
createLoggerjsonConsoleprettyConsolememoryserializeErrortoObjectLEVELSKeywords
More in Core Runtime Kit
Typed, functional error handling — Result<T,E> (Ok/Err) and Option<T> (Some/None) so functions return errors as values instead of throwing. Constructors, guards, map/andThen/match, unwrap variants, trySync/tryAsync to wrap throwing code, and an all() combinator that short-circuits on the first error. Tree-shakeable, zero-dependency, isomorphic.
@lacspace/eventsA fully type-safe event emitter / tiny pub-sub for Node and the browser. Declare an events map (name → payload type) and get compile-time-checked on/emit. A throwing listener never blocks the others (errors are isolated), adding or removing listeners mid-emit is safe, and once/waitFor/onAny round it out. Comparable to mitt or nanoevents but strongly typed. Zero-dependency, isomorphic.
@lacspace/queueAn in-memory async task queue with a concurrency limit — run up to N async tasks at once and await individual results or the whole drain. Priority ordering, pause/start, clear, onIdle/onEmpty draining, and per-task abort via AbortSignal. A rejected task never stalls the queue. Comparable to p-queue/p-limit but tiny and dependency-free. Isomorphic.