
Research
/Security News
Popular Tinycolor npm Package Compromised in Supply Chain Attack Affecting 40+ Packages
Malicious update to @ctrl/tinycolor on npm is part of a supply-chain attack hitting 40+ packages across maintainers
Dead-simple, stateless logging utility for JavaScript and TypeScript. Pure functions. No dependencies. Just log.
Kliedz is a stateless logging utility for JavaScript and TypeScript written with functional approach.
npm install kliedz
This is a simple logging system for JS/TS. It lets you conditionally log messages based on a configured log level — without storing state, mutating anything, or pulling in extra dependencies.
It works around two main concepts: level and threshold.
level
The severity of the message you're logging that also determines how the message is printed (which console
method is used):
debug
→ console.log()
info
→ console.info()
warn
→ console.warn()
error
→ console.error()
threshold
A cutoff filter: only messages with level >= threshold
will be printed. Think of threshold
as the minimum severity required to be shown. This is useful when log visibility is controlled by a user or environment (e.g. --verbose
).
Supported values:
debug
→ everything logsinfo
→ skips only debug
(default)warn
→ logs only warn
and error
error
→ logs only error
silent
→ disables all loggingimport { logWithColor, logWithLevel } from "kliedz";
// Quick start
logWithColor("Hey!");
logWithLevel({ level: "warn" }, "Something feels off");
// ─────────────────────────────────────────────────────────────────────────────
// Basic "just log it" call (uses default level = "info", threshold = "info")
// ─────────────────────────────────────────────────────────────────────────────
logWithColor("Hello from the default logger");
// [INFO] Hello from the default logger
// printed in cyan color
logWithLevel("Just a plain info message", 42);
// [INFO] Just a plain info message 42
// printed without color
// ─────────────────────────────────────────────────────────────────────────────
// Fully configured log call
// ─────────────────────────────────────────────────────────────────────────────
logWithColor(
{
level: "warn", // threshold, is optional, defaults to "info"
},
"This is a warning with color"
);
// [WARN] This is a warning with color
// printed in orange
logWithLevel(
{
level: "debug",
threshold: "debug",
},
"Low-level debug info"
);
// [DEBUG] Low-level debug info
// printed without color
// ─────────────────────────────────────────────────────────────────────────────
// Including a timestamp in the prefix
// ─────────────────────────────────────────────────────────────────────────────
logWithColor(
{
level: "error",
threshold: "debug",
withTimestamp: true,
},
"Error occurred!",
);
// 2025-05-10T13:52:59.845Z [ERROR] Error occurred!
logWithLevel(
{
level: "info",
threshold: "debug",
withTimestamp: true,
},
"Startup complete"
);
// 2025-05-10T13:53:15.240Z [INFO] Startup complete
// ─────────────────────────────────────────────────────────────────────────────
// With a custom prefixBuilder
// ─────────────────────────────────────────────────────────────────────────────
logWithLevel(
{
level: "info",
threshold: "debug",
prefixBuilder: () => ">>> INFO <<<",
},
"Using a custom prefix builder"
);
// >>> INFO <<< Using a custom prefix builder
logWithColor(
{
level: "warn",
prefixBuilder: () => {
const ts = new Date().toISOString();
return `!!${ts}[WARNING]!!`;
},
},
"Custom warning with timestamped prefix"
);
// !!2025-05-10T14:03:32.302Z[WARNING]!! Custom warning with timestamped prefix
This package provides two main logging functions:
logWithLevel()
– logs plain messages (no colors)logWithColor()
– logs messages with ANSI-colored [LEVEL]
prefixesBoth functions use the same core logic under the hood. You can call them in two ways:
If you just want to log without caring about configuration:
logWithColor("hello world");
logWithLevel("something happened", { id: 123 });
This uses default settings:
level
: "info"
threshold
: "info"
(so messages with level "info"
, "warn"
, or "error"
will be printed)If you need to configure how a message is treated, pass a LogParams
object as the first argument:
logWithColor(
{ level: "warn", threshold: "debug", withTimestamp: true },
"warning issued"
);
logWithLevel(
{ level: "debug", threshold: "warn" },
"this will be filtered out"
);
You can control:
level
: The severity of the current message ("debug"
, "info"
, "warn"
, "error"
)threshold
: The cutoff level. Only messages with level >= threshold
are printed.withTimestamp
: If true, includes an ISO timestamp in the prefix.prefixBuilder
: Optional function to fully customize the prefix format.It's possible to create a new logger with a custom formatting logic. For example:
import { createLogger, getPrefix, formatArg } from "kliedz";
import type { Formatter, FormatterConfig } from "kliedz";
// Define a custom formatter
const jsonFormatter: Formatter = (config: FormatterConfig): string => {
const prefix = getPrefix(config); // builds [LEVEL] or timestamped prefix
// config.args contains one or multiple values to log
// Create your message, optionally use formatArg to format these arguments
const message = config.args.map(formatArg).join(" ");
// Return final string to log
return JSON.stringify({
timestamp: new Date().toISOString(),
level: config.level,
prefix,
message,
});
};
// Create logger with formatter
const logJson = createLogger(jsonFormatter);
// Use it, optionally providing level and threshold
logJson("This is a default info log");
logJson({ level: "warn" }, "Something might be wrong", { id: 123 });
logJson({ level: "error", withTimestamp: true }, new Error("kaboom"));
Licensed under MIT.
(c) Ilya Krukowski
FAQs
Dead-simple, stateless logging utility for JavaScript and TypeScript. Pure functions. No dependencies. Just log.
We found that kliedz demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
/Security News
Malicious update to @ctrl/tinycolor on npm is part of a supply-chain attack hitting 40+ packages across maintainers
Security News
pnpm's new minimumReleaseAge setting delays package updates to prevent supply chain attacks, with other tools like Taze and NCU following suit.
Security News
The Rust Security Response WG is warning of phishing emails from rustfoundation.dev targeting crates.io users.