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

ki1r0y.fs-store

v1.0.3

Published

A very simple file-based document store for (mostly) json.

Downloads

3

Readme

ki1r0y.fs-store

A very simple file-based document store for (mostly) json.

Intended for large numbers (millions) of small documents. HOWEVER: This version puts all the documents of a collection into the same directory. That puts a file-system-dependent limit on the number of documents in a collection. There is no memory cache and no (known) memory leaks.

Access is asynchronous, with standard NodeJS callbacks. Data read-write integrity is provided for overlapping aysnchronous requests, but not their asynchronous callbacks, and only within the application. I.e., read/write data integrity is not guaranteed between other processes using the same underlying files, or even separate processes using fs-store.

Results are undefined if an external program modifies json files with corrupt json.

No protection is given for having too many open files. The application should limit parallel requests as needed.

A collectionName is a string naming a directory in the file system. Missing directories will be created as needed. A documentName is a collectionName followed by path.sep and a documentId that must be unique within the collection. Both have the same case sensitivity and character requirements as the file system. (For portability, case-insenstive a collectionName and documentName is required.)

Document Operations

getBuffer(documentName, callback)
get(documentName, callback)
getWithModificationTime(documentName, callback)

Invoke callback(error, contentBuffer), callback(error, contentData), callback(error, contentData, DateTime), respectively. Here contentBuffer is as by fs.readFile, and contentData is the result of JSON.parse of the contentBuffer.

setBuffer(documentName, contentBuffer, callback)
set(documentName, contentData, callback)

Invoke callback(error) after storing contentBuffer or contentData at the specified documentName, respectively.

update(documentName, defaultValue, transformer, callback)

Invokes transformer(oldData, writerFunction) on the contents of the document, where oldData is the parsed content of documentName if the document exists, else defaultValue. The transformer must in turn call writerFunction(error, newData, optionalResult), which will leave newData as the sole content of the file unless newData is undefined or error is truthy, in which case no change is made to the document. (The writerFunction may be called synchronously. I.e., there is not need to delay it with setImmediate, etc.) Finally, callback(error, optionalResult) is invoked.

rename(sourcePathname, documentName, callback)
exists(documentName, callback)
destroy(documentName, callback)

These have the same semantics as fs.rename, fs.exists, and fs.unlink, except that they operate on documentName (e.g., creating missing directories).

ensure(documentName, callback)

Ensures that a document exists at documentName, without modifying any existing document there. However, it is not specified whether the modification time (as reported by getWithModificationTime) of an existing document is updated.

Collection Operations

ensureCollection(collectionName, callback)
destroyCollection(collectionName, callback)

Like ensure and destroy, but for collections. In both cases, the collection need not be empty.

iterateIdentifiers(collectionName, iterator, callback)
iterateDocuments(collectionName, iterator, callback)

Invoke iterator(doc, documentId, cb) on each document in the collection, in an unspecified order (and which may be in parallel). The doc is either the documentName or the contentData, respectively. The iterator must call cb(error), and it must do so asynchronously (e.g., using setImmediate, nextTick or similar if necessary). Per-document read/write consistency is guaranteed during the execution of each iterator. However, there are no guarantees on timeliness of coordination between iterator and additions/removals to the collection.

Other Operations

doesNotExist(error)

Answers true iff the specified document does not exist, where error is as above.