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

twin-db

v2.0.0

Published

A usefully local database.

Readme

Before All

Make sure to pass just values that JSON accepts, if not, the values will be changed to null.

How to Use?

To create a new database make the following step:

import { TwinDB } from 'twin-db';
const database = new TwinDB('database/twin');

or

const { TwinDB } = require('twin-db');
const database = new TwinDB('database/twin');

And your database is done.

You can make various databases too:

import { TwinDB } from 'twin-db';
const database = new TwinDB('database/db');
const coolDatabase = new TwinDB('database/cool');

The first argument is a file path — folders in it are created automatically if they don't exist. If you don't pass one, it defaults to database/twin.

Storages

By default, TwinDB saves your data in a local .json file (JSONStorage). If you'd rather store it in a local SQLite database, pass SqliteStorage in the options:

import { TwinDB, SqliteStorage } from 'twin-db';

const database = new TwinDB('database/db', { storage: SqliteStorage });

SqliteStorage also accepts an optional table and key, in case you want more than one database sharing the same .db file:

const database = new TwinDB('database/db', {
  storage: SqliteStorage,
  table: 'users', // defaults to "twin"
  key: 'main',    // defaults to "data"
});

Both storages implement the same interface, so switching between them doesn't change any of the methods in Database Methods.

TwinMongoDB

If you'd rather store your data in MongoDB instead of locally, use TwinMongoDB. It shares the exact same methods as TwinDB (set, get, delete, sum, sub, concat, push, pull, all with the same fetch parameter), the only difference is how you create it and that every method is asynchronous:

import { TwinMongoDB } from 'twin-db';

const database = new TwinMongoDB('mongodb://localhost:27017/mydb', 'myCollection', 'myId');

await database.set('name', 'De');
const name = await database.get('name');
await database.push('hobbies', ['sleep'], true);
  • connectionURI (required) — your MongoDB connection string.
  • modelName (optional) — the collection name, defaults to "twin".
  • id (optional) — the document _id used to store your data, defaults to "data". Useful if you want multiple independent databases inside the same collection.

When you're done with it (e.g. before your process exits), make sure to close the connection so it doesn't hang:

await database.close();

Database Methods

Now we going to explain you the database methods. Imagine the following data from a random database:

{
  "name": "Daniel",
  "surname": "Costa",
  "age": 60,
  "cool": false,
  "hobbies": ["cs", "pizza"],
  "address": {
    "city": "I dont",
    "state": "ES",
    "country": "Brazil"
  }
}

1. Set Method

This one changes the value of a path to the value you passed.

database.set('name', 'De'); // now the name is "De".
database.set('age', 50); // now the age is 50.
  • To go through the object, make sure to use ".", like address.city.

2. Get Method

Get a value from a given path.

database.get('surname'); // returns "Costa".

3. Delete/Remove Method

Deletes a value from data.

database.delete('cool') // now the cool value no longer exists.
database.delete('address.country') // now the country no longer exists too.

4. Sum/Add Method

Sum the current value of the given path with the given value.

database.sum('age', 30); // now the age is 80.

5. Sub/Subtract Method

Subtract the current value of the given path with the given value.

database.sub('age', 10); // now the age is 70.

6. Concat Method

Concatenate the current value of the given path with the given value.

database.concat('address.city', ' know'); // now the city is "I dont know".

7. Push Method

Push the given values into the current value array. The values must be passed as an array, even if it's just one value.

database.push('hobbies', ['sleep', 'valorant']); // now the hobbies is ["cs", "pizza", "sleep", "valorant"].

8. Pull Method

Removes the given values from the current value array. The values must be passed as an array, even if it's just one value.

database.pull('hobbies', ['cs', 'sleep']) // now the hobbies is ["pizza", "valorant"].

Now the data object will looks like that:

{
  "name": "De",
  "surname": "Costa",
  "age": 70,
  "hobbies": ["pizza", "valorant"],
  "address": {
    "city": "I dont know",
    "state": "ES"
  }
}

The fetch parameter

Every method above accepts an optional fetch boolean as its last parameter (default false). When true, it re-reads the storage before running the operation and refreshes the cache with it — useful if another process might have written to the same storage since your last read.

database.get('name', true);
database.push('hobbies', ['sleep'], true);

Updates

See new updates here.