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 🙏

© 2024 – Pkg Stats / Ryan Hefner

trdb

v0.0.9

Published

Develop the server side before your database is setup.

Downloads

1

Readme

trdb

Tobias Rapid Database

Rapid for rapid prototyping. The idea is, to instantly start coding and care about the database later. Trdb will store data into a json file. There are similar solutions already:

  • lowdb: expose all methods available in lodash.js, when an api get implemented using its sync API it can not easily migrate to a more sophisticated datastore. When query lowdb, and mutate the object without saving it back, but updating some other data through its API, the mutation can still end up in the db - because the data is not cloned, when insert or query, this can cause problems when you before returning the object to the client, add some statistics infos or related items to the object.

  • tFileMonk: A mongo compatible API, that store into a JS file. But the solution I made is kind of hacked and is likely to break when any of its dependencies has updates. Two times when I started a new prototype, I had to debug this solution. Also, this solution relied on having the app call periodically the persist (store to file) method.

  • sqlite3 Sqlite and sql.js are nice solutions if you want sqlite files. When starting out an app, I think working on a json file, can be much quicker, but it is a personal preference.

  • json-server A restAPI for a JSON file and is based on lowdb. It allow frontend developers to start developing the app, before the actual API is ready. And with tdrb, a node.js developer can start developing the server side, before the database is ready setup.

I want something that can easily added as db. That has a fully async API, so the module can easily be changed to mongo or SQL db implementations of a very simplistic API. When developing with this file database, you can still access the data directly, but the purpose is to have a limited API, not be full featured.

This db got started when I studied oauth. In oauth, you have communication between clients and servers and servers and servers. So you need a few server apps. For studying, each server should have its own small db. For such case, small JSON-file databases are great.

usage

This module is made using typescript, the API is small, simple and I hope without surprises. It is designed to be easily replaced by any other datastore. So this module might not give you all nitty gritty features with very fancy searching, but again, that is to make sure, your prototype can easily get migrated to a real project.

import new db:

const { newFileDB } = require('trdb');

// or in typescript:
import { newFileDB } from 'trdb';

Then use it. these examples present the complete API.:

// create a db
const db = newFileDB('./db.json');

// create a collection
const users = db.collection('users');

// insert a user (see without id!)
const user = await users.insert({
    name: 'Tobias Nickel',
    job: 'technical lead',
});

// update and save the user
user.favoriteHobby = 'programming';
await users.save(user);

// update many or update without loading the item from db.
// update job where name is Tobias Nickel.
await users.update({name: 'Tobias Nickel'}, { job: 'superstar' });

await users.insertMany([
    {
        name: 'Sebastian Sanchez',
    },
    {
        name: 'Firat Evander',
    },
    {
        name: 'Silpa Janz',
    }
]);

// When inserting or saving, internally a new copy of the object is created
// next the reloaded user represents the same user in DB, but is a separate object.
// this is the same behavior you get from a real databases or API.
const userReloaded = await users.findOne({id: user.id});
console.log(user !== userReloaded); // true

// pass in the properties all the resulting items should have.
// also allow to pass arrays for then the objects value need to be included.
const searchedUsers = await users.find({ name: ['Firat Evander', 'Tobias Nickel']});
console.log(searchedUsers.length);

// removing items just works just like search, if first search then removes.
await users.remove({ name: 'Tobias Nickel' });
await users.remove({ id: user.id });

// Feel free to create multiple dbs to put collections in separate files.
// This example also shows the options for custom idName and
// newId. This the newId defaults to uuid v4, and provides a method for
// generating autoIncrementIds. You can implement your own ID functions,
// returning and primitive like numbers and strings. 
const postsDB = newFileDB('posts.json', {
    idName: 'postId',
    newId: newAutoIncrementId
});
const posts = db.collection('posts');

This is all the API presented. Also, this module, will watch the json file. And if you or an other process will update the json-file. It get reloaded and populated in the db running process. This is very handy when inserting dummy data for test and quickly delete again. This will make your prototyping faster.

Currently there is no mechanism to close the db. Meaning that the file will be watched for the runtime of the process/server. Because of that, you should not use this module to access lots and lots of json-files. For that, just read and parse the files as json using the fs module. Trdb is meant to mimic a DB.

There was the idea, to have separate files for separate collections. But this does not need to be implemented by this library, as you can have a separate db for a collection.

expectations:

This module is developed out of a need, it might still be changed, but when there are breaking API changes it follows the semver versioning. currently the code has 100% test-coverage measured with nyc.

update 0.0.5

There is a new optional second parameter for the collection method. This parameter is absolutely not used by the code. However, it can help to provide types, without using typescript. The next example is in javascript:

const baseExample = {
    id: '', // type string
};
// create a db
const db = newFileDB('./db.json');

// create a collection
const users = db.collection('users', { name: '', ...baseExample });

const myUser = await users.findOne({ name: 'tobias' }); // ts tell you that name is a valid prop

myUser. // when using myUser. the editor will offer id and name.

update 0.0.7

no need to await db.connected.

update 0.0.8

Allow app to provide ID for insert.

let's get coding