Type-safe Dynamoose schema generation from Zod.
Easily build and validate your models with Zod, then convert them into Dynamoose schemas — including support for nullable, optional, keys, and indexes.
- Add Dynamoose metadata to your Zod schemas using
.dynamoose() - Generate Dynamoose-compatible
SchemaDefinitionwith.toDynamoose() - Supports:
hashKey,rangeKeyindexoptional(),nullable(), default values- Nested objects and arrays
- Avoids duplicate
dynamoose.type.NULLby injecting the runtime instance
npm install dynamoose-zod zod dynamoose
# or
yarn add dynamoose-zod zod dynamoose
⚠️ Make sure to installdynamooseandzodin your app as peer dependencies.
import { z } from 'zod';
import { extendZodWithDynamoose } from 'dynamoose-zod';
import * as dynamoose from 'dynamoose';
// Apply the extension (must pass the same instance of `dynamoose`)
extendZodWithDynamoose(z, dynamoose);
const ZUserSchema = z.object({
id: z.string().dynamoose({ hashKey: true }),
email: z.string(),
name: z.string().nullable().optional(),
createdAt: z.string(),
});
const UserSchema = new dynamoose.Schema(ZUserSchema.toDynamoose());Add Dynamoose metadata directly to fields:
z.string().dynamoose({ hashKey: true });
z.string().dynamoose({ rangeKey: true });
z.string().dynamoose({
index: { name: 'my_index', type: 'global' },
});Combine with .nullable() and .optional():
z.string().nullable().optional().dynamoose({ required: false });| Zod Type | Dynamoose Mapping |
|---|---|
z.string() |
✅ String |
z.number() |
✅ Number |
z.boolean() |
✅ Boolean |
z.array() |
✅ Array |
z.object() |
✅ Object |
nullable() / optional() |
✅ required: false and dynamoose.type.NULL when needed |
Extends Zod with:
.dynamoose(meta: ZodDynamooseMeta)on all Zod types.toDynamoose()onz.object()types
Make sure to use the same dynamoose instance passed into this function as the one used to define your models.
type ZodDynamooseMeta = {
hashKey?: boolean;
rangeKey?: boolean;
index?: {
name: string;
type: 'global' | 'local';
};
required?: boolean;
};- Always pass the same instance of
dynamoosetoextendZodWithDynamoose()that you're using in your app. This avoids issues withdynamoose.type.NULL. - Do not install
dynamooseas a dependency of this package — it must be listed as apeerDependency.
MIT © 2025 Bruno Agutoli - @agutoli