Skip to content

Dynamo Document Builder

DynamoDB single table design and data validation made easy using TypeScript and Zod ⚡️

Schema Validation

Define schemas for your data model using Zod to enforce powerful, type-safe validation.

Single Table Design

Designed from the ground up to follow the Single Table design pattern.

Ergonomic API

All Document Builder APIs are designed to be functional and easy to use, making working with DynamoDB that much easier.

Type-safe

Built from the ground up to be not only type-safe, but to be able to infer your data model TypeScript types based on your Zod schemas.

Tree-shakeable

When bundle size matters, Document Builder is completely tree-shakeable to remove the parts you aren’t using.

Extensively Documented

The documentation you’re reading right now has complete guides, example code, and a detailed API reference.

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, // Validated against the Zod schema
}))
const retrievedUser = await userEntity.send(new Get({
// PK and SK auto-built from the key functions in the Entity
key: {
id: '123',
email: 'johndoe@example.com',
},
}));