Dynamo Document Builder
DynamoDB single table design and data validation made easy using TypeScript and Zod ⚡️
Full documentation can be found at dynamodocumentbuilder.com.
Features
- Data integraty using Zod for schema validation
- Follows Single Table Design principles
- Easy ergonomic API for a better DynamoDB developer experience
- Built from the group up to be type-safe
- Completely tree-shakable for minimal bundle sizes
- Extensively documented with guides, example code, and complete API reference
Installation
npm i dynamo-document-builder zod @aws-sdk/client-dynamodb @aws-sdk/lib-dynamodb
Getting Started
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
import { DynamoTable, DynamoEntity, type Entity, Put, Get } from 'dynamo-document-builder';
import { z } from 'zod';
const dynamoDbClient = new DynamoDBClient();
const docClient = DynamoDBDocumentClient.from(dynamoDbClient);
const myTable = new DynamoTable({
tableName: 'MyDynamoTable',
documentClient: docClient,
keyNames: {
partitionKey: 'PK',
sortKey: 'SK',
},
});
const userEntity = new DynamoEntity({
table: myTable,
schema: z.object({
id: z.string(),
name: z.string(),
email: z.string().email(),
}),
partitionKey: user => `USER#${user.id}`,
sortKey: user => `EMAIL#${user.email}`,
});
type User = Entity<typeof userEntity>;
const newUser: User = {
id: '123',
name: 'John Doe',
email: 'johndoe@example.com',
};
await userEntity.send(new Put({
item: newUser,
}))
const retrievedUser = await userEntity.send(new Get({
key: {
id: '123',
email: 'johndoe@example.com',
},
}));