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

nodenamo

v2.2.0

Published

A powerful ORM for DynamoDb

Downloads

3,175

Readme

nodenamo

A lightweight, high-level ORM for DynamoDB that will make you fall in love with DynamoDB.

Tests

Introduction

Nodenamo is a lightweight ORM framework for DynamoDB that is designed to wrap DynamoDB logics and allowed you to focus on designing data models and queries instead.

Example

A simple usecase without any hash/range keys


import { DBTable, DBColumn, NodeNamo } from 'nodenamo';

@DBTable()
class User
{
    @DBColumn({id:true})
    id:number

    @DBColumn()
    name:string

    @DBColumn()
    email:string

    constructor(id?:number, name?:string, email?:string)
    {
        this.id = id;
        this.name = name;
        this.email = email;
    }
}

let nodenamo = new NodeNamo({ region: 'us-east-1' });

//Create a table
await nodenamo.createTable().for(User).execute();

//Insert a user
let user = new User(1, 'Some One', '[email protected]');

await nodenamo.insert(user).into(User).execute();

//Get a user by 'id'
let user1 = await nodenamo.get(1).from(User).execute<User>();  
    /* Returns User { id: 1, name: 'Some One', email: '[email protected]' } */

//Update the user
user1.name = 'This One';
let originalUser = await nodenamo.update(user1).from(User).returning(ReturnValue.AllOld).execute(); 
    /* Returns User { id: 1, name: 'Some One', email: '[email protected]' } */

//List all users
let users = await nodenamo.list().from(User).execute<User>();
    /* Returns { items: [ User { id: 1, name: 'This One', email: '[email protected]' } ],
                 lastEvaluatedKey: undefined } */

//Delete the user by id
await nodenamo.delete(1).from(User).execute();

Requirements

Because nodenamo manages the DynamoDB table for you, it has the following requirements:

  1. Data to be inserted into the database must be defined as a class decorated with @DBTable()
  2. Properties to be saved into the database must be decorated with @DBColumn()
  3. At least, one of the properties must be decorated with @DBColumn({id:true}) to represent a unique ID.
  4. The DynamoDB table must be created using the nodenamo.createTable() function or be manually created using the following schema:
    1. A partition key named hash of type string.
    2. A sort key named range of type string.
    3. A GSI named objid-index for a string property objid and projects all.

Operations

  1. Table creation
  2. Table deletion
  3. Insert an object
  4. Get an object
  5. List objects
  6. Find objects
  7. Update an object
  8. Delete an object
  9. Transaction

Table creation

Create a table in DynamoDB to store a certain class of objects.

Example

await nodenamo.createTable().for(T).execute();

where:

  • T is a class decorated with @DBTable()

Table deletion

Delete a table in DynamoDB that is used to store a certain class of objects.

Example

await nodenamo.deleteTable().for(T).execute();

where:

  • T is a class decorated with @DBTable()

Insert an object

Insert an object into DynamoDB

await nodenamo.insert(obj).into(T).execute();

where:

  • obj is an object created from a class decorated with @DBTable()
  • T is a class decorated with @DBTable()

Get an object

Get an object from DynamoDB by the object's ID

// Get an object
await nodenamo.get(id).from(T).execute<T>();
// Get an object with a strongly consistent read
await nodenamo.get(id).from(T).stronglyConsistent(true).execute<T>();

where:

  • id is the ID of an object to be deleted. The id is the value of a property that is tagged with @DBColumn{id:true}
  • T is a class decorated with @DBTable()

List objects

List objects from DynamoDB.

//List all objects from T
await nodenamo.list().from(T).execute<T>();
//List all objects from T with a strongly consistent read
await nodenamo.list().from(T).stronglyConsistent(true).execute<T>();
//List all objects from T that have a certain hash. 
await nodenamo.list().from(T).by(hash).execute<T>();
//List all objects from T that have a certain hash and start with a certain range key value. 
await nodenamo.list().from(T).by(hash, range).execute<T>();

/***
 * Paging
 **/
//List the top 10 objects from T 
let page = await nodenamo.list().from(T).limit(10).execute<T>();
//List the next 10 objects from T and sorted in a reverse order
await nodenamo.list().from(T).limit(10).resume(page.lastEvaluatedKey).execute<T>();();

/***
 * Ordering
 **/
//List all objects from T and sorted in a reverse order
await nodenamo.list().from(T).order(false).execute<T>

/***
 * Custom index.
 **/
await nodenamo.list().from(T).using(indexName).execute<T>();

/***
 * All operations above can be chained together.
 ***/
await nodenamo.list()
              .from(T)
              .by(hash, range)
              .limit(10)
              .using(indexName)
              .order(false)
              .resume(page.lastEvaluatedKey)
              .stronglyConsistent(true)
              .execute<T>();

where:

  • T is a class decorated with @DBTable()
  • hash is the value of a hash key defined by @DBColumn({hash:true})
  • range is the prefix value of a range key defined by @DBColumn({range:true})
  • indexName is the name of an index to be used with the query.

Update an object

Get an object from DynamoDB by the object's ID

// Update an object
await nodenamo.update(object).from(T).execute<T>();

// Update an object with a condition expression
await nodenamo.update(object).from(T).where(conditionExpression, expressionAttributeNames, expressionAttributeValues).execute<T>();

// Update an object and requesting for a return value.
import { ReturnValue } from 'nodenamo';

await nodenamo.update(object).from(T).returning(ReturnValue.AllOld).execute<T>();

// Update an object with a version check
await nodenamo.update(object).from(T).withVersionCheck().execute<T>();

/***
 * All operations above can be chained together.
 ***/
await nodenamo.update(obj)
              .from(T)
              .where(conditionExpression, expressionAttributeNames, expressionAttributeValues)
              .withVersionCheck()
              .returning(ReturnValue.AllNew)
              .execute<T>();

where:

  • obj is an object retrieved from the Get or List operations or an object created from a class decorated with @DBTable()
  • T is a class decorated with @DBTable()
  • conditionExpression is a string representing a conditional expression for DynamoDB's PUT operation. For example, "#name = :name"
  • expressionAttributeNames is an object representing attribute names for the conditionExpression. For example, { '#name': 'name' }
  • expressionAttributeValues is an object representing attribute values for the conditionExpression. For example, { ':name': 'Some One' }

Delete an object

Delete an object from DynamoDB by the object's ID.

await nodenamo.delete(id).from(T).execute();

where:

  • id is the ID of an object to be deleted. The id is the value of a property that is tagged with @DBColumn{id:true}
  • T is a class decorated with @DBTable()