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

@gonk/utils

v0.0.20

Published

Zero-dependency utility primitives for the gonk harness. Code-split per concern and per platform: @gonk/utils/path is pure, browser-safe path containment; @gonk/utils/fs is Node-only atomic writes. Import the subpath so unbundled (and non-Node) consumers

Downloads

488

Readme

@gonk/utils

Zero-dependency utility primitives shared across the gonk foundation and the extension ecosystem. Code-split per concern and per platform, so a consumer imports exactly the silo it needs.

Import the subpath, not the barrel. Extensions run as unbundled Node ESM, where tree-shaking does not apply: a named subpath import only evaluates the file it points at. The split is also a platform boundary — see below.

@gonk/utils/path — pure, browser-safe

Path-containment logic with no node:* in its import graph (no node:fs, no node:path, no process). It bundles for a browser/edge target as-is, no shim or aliasing. POSIX-oriented: both / and \ are treated as separators and results join with /.

import { safeJoin, safeKeyPath } from "@gonk/utils/path";

| Export | Purpose | | --- | --- | | safeJoin(root, rel) | Resolve rel under root; throw if it escapes (via .., an absolute segment). Internal .. that stays inside is normalized. | | safeKeyPath(root, subDir, key) | Stricter variant for stable storage keys: rejects absolute/.. keys outright so a key round-trips to exactly the path it names. |

@gonk/utils/fs — Node-only

Atomic writes (temp-file + rename). Uses node:fs and process, so this entry is fundamentally non-browser; it is kept apart from ./path precisely so a browser bundle importing @gonk/utils/path can never transitively reach node:fs.

import { atomicWriteText, atomicWriteBytes, atomicWriteJson } from "@gonk/utils/fs";

| Export | Purpose | | --- | --- | | atomicWriteText(path, text) | Atomic UTF-8 text write. A reader never sees a torn file. | | atomicWriteBytes(path, bytes) | Atomic raw-bytes write. | | atomicWriteJson(path, value) | Atomic pretty-JSON write with a trailing newline. |

The default barrel (@gonk/utils) re-exports both and is therefore Node-only. Browser/edge code must import @gonk/utils/path directly.