npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details


  • User packages



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.


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 🙏

© 2021 – Pkg Stats / Ryan Hefner




Abstraction Layer for File Management.





Build Status Test Coverage Dependabot Status Dependencies NPM Downloads Semantic-Release Gardener

Abstraction Layer for File Management.

Drop in replacement for fs.

Getting Started

$ npm install --save smart-fs


guessFile(filepath, { exclude = [] })

Extends and returns filepath with the file extension as appropriate. Returns null if no good match was found.

A few notes:

  • Only extends extensions, not partial file names
  • Will prefer to match the exact file
  • Will return null when multiple possible extensions are found

To exclude certain extensions from being matched provide them in the exclude option.


Iteratively walk dirpath and return relative paths of all files contained.

Will only return entries where fs.lstatSync(...).isFile() evaluates to true (this excludes symlinks).


Delete file and all empty parent directories.

smartParse(content, options = { treatAs = null, resolve = true, refPath = process.cwd() })

Core logic of smartRead but takes content and refPath.

smartRead(filepath, options = { treatAs = null, resolve = true })

Read and parse file based on file extension.

The following extensions are handled in order:

  • .json: Loads file using JSON.parse.
  • .xml: Loads file using xml-js.
  • .yml and .yaml: Loads file using yaml-boost.
  • .js: Loads file using "hacked" require.
  • .*: Treats file as text file and loads as array of lines.

Note that the required cache is not automatically invalidated when loading cached .js files.

To ignore file extension and force treat the file as a certain type, you can pass the option treatAs as e.g. json.

To simply load yml files without resolving them pass resolve as false

smartWrite(filepath. content, options = { treatAs = null, mergeStrategy = (existing, changeset) => changeset, create = true, pretty = false, keepOrder = true, resolve = false })

Serialize and write content to file based on file extension.

The file and all necessary folders are created if not present.

The file is only actually written if the content has changed. Returns true if the file was written, false otherwise.

The following extension are handled in order:

  • .json: Serialize uses JSON.stringify.
  • .xml: Serialize using xml-js.
  • .yml and .yaml: Serialize uses yaml-boost.
  • .*: Expects content as array and serializes by joining array using new line character.

To ignore file extension and force treat the file as a certain type, you can pass the option treatAs as e.g. json.

The mergeStrategy option can be used to customize how the new content is merged if the target file already exists. By default the file is simply overwritten.

When create is set to false no action is taken if the file does not already exist.

When pretty is set to true, the output is formatted more compact.

When keepOrder is set to true and a file is overwritten, the new content is ordered according to the existing content (e.g. for json and yml)

To resolve the original file before overwrite merging pass the option as true.


Do not use this library for loading if you don't trust the source of the files you are loading!