Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
src
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

πŸ”’ DDB-Table

Strongly typed library for querying and modeling DynamoDB documents in TypeScript.

View On NPM Build Status Dependency Status Coverage Status License


DDB-Table was built to provide strongly-typed data structures over DynamoDB tables. Using AWS DocumentClient & TypeScript you can easily fetch and store any JSON document and validate it’s structure statically. Query secondary indexes and run complicated update expressions without any error on runtime.

await table
  .update('demo@example.com')
  .set('FullName', 'John Doe')
  // 🚨 TypeScript Error: 'fullName' is not assignable to 'Email' | 'FullName'
  .condition(cond => cond.eq('fullName', 'Johnny Doe'))
  .exec();

Main Features

  • Strongly Typed - End-to-end TypeScript validation for your data.
  • Easy Query Expressions - Automatically escape name attributes and values.
  • Smart Projections - Make sure you only access the fields you project.
  • Query & Scan Indexes - Complete support for global or local indexes.
  • Pure JavaScript - Also works without TypeScript.

Install

npm i ddb-table

Usage

import Table, { Set, setOf } from 'ddb-table';

interface MessageSchema {
  threadId: string;
  timestamp: number;
  senderId: string;
  message: string;
  status: 'sent' | 'received';
  tags?: Set<string>;
  attachments: {
    name: string;
    URL: string;
  }[];
}

// create the basic table definition
const messages = new Table<MessageSchema, 'threadId', 'timestamp'>({
  tableName: 'Messages',
  primaryKey: 'threadId',
  sortKey: 'timestamp',
});

const updateRes = await messages
  .update('john@gmail.com', 1588191225322)
  .set('message', 'Hello World!')
  .add('tags', setOf('unread', 'important'))
  .set('attachments', (exp) =>
    exp.listAppend([{ name: 'Test', URL: 'demo.com' }]),
  )
  .return('ALL_NEW')
  .exec(); 

console.log(updateRes.Attributes);

Working with indexes as well:

// create a secondary index definition
type SenderTimestampIndex = Pick<
  MessageSchema,
  'threadId' | 'timestamp' | 'senderId'
>;

const outboxIndex = messages.index<
  SenderTimestampIndex,
  'senderId',
  'timestamp'
>('senderId-timestamp-index', 'senderId', 'timestamp');

const it = outboxIndex
  .query()
  .keyCondition(cond => cond.eq('senderId', 'john@gmail.com'))
  .keyCondition(cond => cond.between('timestamp', Date.now() - 3600e3, Date.now()))
  .project({ threadId: 1, message: 1 })
  .reverseIndex()
  .entries();

for await (const item of it) {
  console.log(item);
}

License

MIT license Β© 2020 Neuledge

About

πŸ”’ Strongly typed library for querying and modeling DynamoDB documents in TypeScript.

Topics

Resources

License

Packages

No packages published
You can’t perform that action at this time.