Schema Validation
Define schemas for your data model using Zod to enforce powerful, type-safe validation.
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', },}));