npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

kliedz

v2.0.0

Published

Dead-simple, stateless logging utility for JavaScript and TypeScript. Pure functions. No dependencies. Just log.

Readme

Kliedz

npm CI NPM Downloads Code Coverage Maintainability

Kliedz is a stateless logging utility for JavaScript and TypeScript written with functional approach.

Installation

npm install kliedz

What is this?

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):

  • debugconsole.log()
  • infoconsole.info()
  • warnconsole.warn()
  • errorconsole.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 logs
  • info → skips only debug (default)
  • warn → logs only warn and error
  • error → logs only error
  • silent → disables all logging

Usage

import { 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

How it works

This package provides two main logging functions:

  • logWithLevel() – logs plain messages (no colors)
  • logWithColor() – logs messages with ANSI-colored [LEVEL] prefixes

Both functions use the same core logic under the hood. You can call them in two ways:

Option 1: Just log something (default config)

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)

Option 2: Log with full control

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.

Creating custom logger

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"));

License

Licensed under MIT.

(c) Ilya Krukowski