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

bad.db

v0.0.3

Published

JSON file database.

Downloads

20

Readme

bad.db

NPM version code style: prettier

Simple JSON file based database with easy querying interface and common utilities.

For whatever reason, If you don't want to use a real database, and instead simply use a file. but also want some query and utility functions of a database. this is bad.db 😁.

👇 example :

db("users").create({ name: "virus", email: "[email protected]" });
db("users").read({ name: "virus" });
db("users").update({ name: "virus" }, { email: "[email protected]" });
db("users").delete({ name: "virus" });

bad.db is constituted of four (create, read, update, and delete) methods that represents the CRUD operations and three (or less) parameters (item, query, and options) considerably (more or less) recurring in the four methods.

📥 Installation

npm i bad.db
yarn add bad.db

🏁 Getting Started

👇 Learn by a simple common example :

// Require library
const virusDb = require("bad.db");

// Initialize database
// 💡 By default, A "db.json" file will be created in root directory
const db = await virusDb();

// Create a new item within a collection named "users"
// 💡 If the collection doesn't exist it will be created automatically
// 💡 With the utility option "encrypt", the "password" field
//    will be saved as an encrypted hash string instead of the original
const createdUser = await db("users").create(
  {
    name: "anyName",
    email: "[email protected]",
    password: "secret123",
  },
  {
    encrypt: "password",
  }
);

// Read all items from "users" collection where "name" is "anyName"
// 💡 The "omit" option hides the "password" and "email"
//    fields in the returned results
const users = await db("users").read(
  { name: "anyName" },
  {
    omit: ["password", "email"],
  }
);

// Update all "users" items where "name" is "anyName"
// with new values for "email" and "password"
const updatedUser = await db("users").update(
  { name: "anyName" },
  {
    email: "[email protected]",
    password: "NEW_SECRET_123456789",
  }
);

// Delete all "users" items where "email" is "[email protected]"
const deletedUser = await db("users").update({ email: "[email protected]" });

💡 A JSON file named bad.json (by default) is created in the root directory. This is an example of its content :

{
  "users": [
    {
      "name": "virus",
      "email": "[email protected]",
      "$id": "8c8f128e-4905-4e77-b664-e03f6de5e952",
      "$createdAt": "2021-09-05T21:40:27Z"
    },{
      "name": "hassona",
      "email": "[email protected]",
      "$id": "8c8f128e-4905-4e77-b664-e03f6de5e952",
      "$createdAt": "2021-09-05T21:40:27Z"
		}
  ]
}

💡 Note that the $id and $createdAt fields are created automatically when an item is created, and $updatedAt when it is updated.

🚩 Initialize

// Initialize with a "bad.json" file in the root directory
const db = await badDb();

// Initialize with a custom named JSON file in the root directory
const db = await badDb("my-database-file.json");

// Initialize with a custom named JSON file in the current directory
const db = await badDb(__dirname + "/my-database-file");

🔎 Query

Query parameter in Read, Update, and Delete methods is an object or function that allows targeting specific items in collection.

  • Query object :
{
  fieldName: fieldValue,
  fieldName: fieldValue,
  ...etc
}

Query object is an object of property values to match against collection items.

A comparison is performed between every item object property values in collection and the query object property values to determine if an item object contains equivalences.

The items containing the equivalences are returned.

Example:

const queryObj = {
  firstName: "virus",
  age: 20,
  rating: 5
};

const users = await db("users").read(queryObj);
  • Query function :
(item, index?, collection?) => [Boolean]

Query function is a predicate called for every item when iterating over items of collection.

All items predicate returns truthy for are returned.

The predicate is invoked with three arguments :

  • value : Required. The value of the current item.
  • index : Optional. The index of the current item in collection.
  • collection : Optional. The collection array-object the current item belongs to.

Example:

const queryFn = (user) => {
  return user.name.startsWith("v") && user.age >= 20 && rating >= 5;
};

const users = await db("users").read(queryFn);

☑️ Options

{
  optionName: optionValue,
  optionName: optionValue,
  ...etc
}

Options parameter in all methods is an object that allows to apply additional stuff to the method's subject item or to the method's returned items result. Every method can have specific options or common options depending on the context of the method.

Example :

const options = {
  unique: ["name", "email"],
  encrypt: "password",
  omit: ["email", "password"],
  nocase: true
};

const user = {
  name: "moulay-elhassan",
  email: "[email protected]",
  password: "secret#hassona?1980"
}

const createdUser = await db("users").create(user, options);

💠 CREATE

await db(collectionName).create(item?, options?);

Creates a new item in a collection.

💡 If the specified collection doesn't exist it will be created automatically.

💡 If no item object is specified (omitted, null, or undefined), an empty item is created with no fields except the system fields (with names starting with $ sign).

💡 The created item is returned.

| Parameter | Type | Default | Description | | -------------- | ------ | ------- | --------------------------------------- | | collectionName | String | | Targeted collection name | | item | Object | {} | Item to create | | options | Object | {} | CREATE options | | @returns | Object | | The created item | | @throws | Error | | If a unique field value is already used | | @throws | Error | | If a value to encrypt is not a string |

☑️ CREATE Options

| Property | Type | Default | Description | | -------- | ------------------ | ------- | -------------------------------- | | unique | String or String[] | "" | Fields to declare as unique | | encrypt | String or String[] | "" | Fields to encrypt | | pick | String or String[] | "" | Fields to pick in returned items | | omit | String or String[] | "" | Fields to omit in returned items | | nocase | Boolean | false | If true ignores case in search |

💡 When fields are declared as unique, a checking for duplicates is done before adding the item.

💡 If nocase is true, letter case comparison will be ignored in search operations, like for example checking unique values.

CREATE Examples

// Create an item within a collection named "players" (automatically created)
// The created item is returned
const createdPlayer = await db("players").create({
  name: "virus",
  level: 99,
  inventory: ["sword", "shield", "potion"],
});

// Create an item within a collection named "players" with some options
const createdPlayer = await db("players").create(
  {
    name: "virus",
    level: 99,
    inventory: ["sword", "shield", "potion"],
    password: "this_is_a_secret",
  },
  {
    // Options
    unique: "name", // Make "name" field unique
    encrypt: "password", // Encrypt "password" field
    omit: ["password", "level"], // Omit fields in the returned item object
    nocase: true, // Ignore case when comparing strings
  }
);

READ

await db(collectionName).read(query?, options?);

Reads an existing item in a collection. 💡 If the specified collection doesn't exist it will be created automatically. 💡 If no query is specified (omitted, null, or undefined), the query defaults to empty query {} which returns all items. 💡 The read items are returned.

| Parameter | Type | Default | Description | | -------------- | ------ | ------- | --------------------------------- | | collectionName | String | | Targeted collection name | | query | Object | {} | Query object or function | | options | Object | {} | READ options | | @returns | Array | | The read item | | @throws | Error | | If an encrypted field not matched |

☑️ READ Options

| Property | Type | Default | Description | | -------- | ------------------ | ------- | ---------------------------------- | | one | Boolean | false | Return only one result (Object) | | pick | String or String[] | [] | Fields to pick in returned items | | omit | String or String[] | [] | Fields to omit in returned items | | nocase | Boolean | false | Ignore case in search | | sort | String or String[] | "" | Fields to sort by returned items | | order | String or String[] | "asc" | Order of sorting of returned items | | encrypt | String or String[] | [] | Fields to encrypt | | limit | Number | MAX | Number of returned items | | page | Number | 0 | Index of pagination (with limit) | | expand | String | "" | Name of collection to expand to | | embed | String | "" | Name of collection to embed |

READ Examples

// Read all items in "players" collection
const players = await db("players").read();

// Read items matching a query object
const somePlayers = await db("players").read({ name: "virus" });

// Read items matching a query function
const someOtherPlayers = await db("players").read(
  (player) => player.level >= 90
);

// Read items matching a query with some options
const player = await db("players").read(
  { name: "virus" },
  {
    // Options
    nocase: true, // Ignore case when comparing strings
    one: true, // return only one result (an object instead of array)
  }
);

UPDATE

await db(collectionName).update(query?, changes?, options?);

Updates an existing item in a collection. 💡 If the specified collection doesn't exist it will be created automatically. 💡 If no query is specified (omitted, null, or undefined), no item is updated. 💡 If an empty query {} is specified, all items are updated. 💡 If no changes are specified (omitted, null, or undefined), the changes default to empty changes {} which only updates the $updatedAt field in targeted items. 💡 The updated items are returned.

| Parameter | Type | Default | Description | | -------------- | ------ | ------- | --------------------------------------- | | collectionName | String | | Targeted collection | | query | Object | {} | Query object or function | | changes | Object | {} | Changes to apply | | options | Object | {} | Additional options | | @returns | Array | | The updated item | | @throws | Error | | If Items matching query not found | | @throws | Error | | If a unique field value is already used | | @throws | Error | | If a value to encrypt is not a string |

☑️ UPDATE Options

| Property | Type | Default | Description | | -------- | ------------------ | ------- | --------------------------------- | | total | Boolean | false | If true overrides all item fields | | one | Boolean | false | Return only one result (Object) | | unique | String or String[] | "" | Fields to declare as unique | | encrypt | String or String[] | [] | Fields to encrypt | | pick | String or String[] | [] | Fields to pick in returned items | | omit | String or String[] | [] | Fields to omit in returned items | | nocase | Boolean | false | Ignore case in search |

UPDATE Examples

// Update item(s)
// The updated item is returned
const updatedPlayer = await db("players").update(
  { name: "virus" }, // Query can also be a function
  { name: "new name", level: 0 } // Changes to apply
);

// Update item(s) with some options
const updatedPlayer = await db("players").update(
  { name: "virus" }, // Query can also be a function
  { name: "new name", level: 0 }, // Changes to apply
  {
    // Options
  }
);

DELETE

await db(collectionName).delete(query?, options?);

Deletes an existing item in a collection.

💡 If the specified collection doesn't exist it will be created automatically.

💡 If no query is specified (omitted, null, or undefined), no item is deleted.

💡 If an empty query {} is specified, all items are deleted.

💡 The deleted items are returned.

| Parameter | Type | Default | Description | | -------------- | ------ | ------- | --------------------------------- | | collectionName | String | | Targeted collection name | | query | Object | {} | Query object or function | | options | Object | {} | Additional options | | @returns | Object | | The deleted item | | @throws | Error | | If Items matching query not found |

☑️ DELETE Options

| Property | Type | Default | Description | | -------- | ------------------ | ------- | -------------------------------- | | one | Boolean | false | Return only one result (Object) | | pick | String or String[] | [] | Fields to pick in returned items | | omit | String or String[] | [] | Fields to omit in returned items | | nocase | Boolean | false | Ignore case in search |

DELETE Examples

// Delete item(s)
// The deleted item is returned
const deletedPlayer = await db("players").delete(
  { name: "virus" } // Query can also be a function
);

// Delete item(s) with some options
const deletedPlayer = await db("players").delete(
  { name: "virus" }, // Query can also be a function
  {
    // Options
  }
);

↘️ Other

// Remove all collections
await db.drop();

// Remove a collection named "players"
await db("players").drop();

// Remove all items in a collection named "players" and keep it
await db("players").clear();

📃 License

MIT © Virus24