0.6.13 • Published 4 months ago

betterddb v0.6.13

Weekly downloads
-
License
MIT
Repository
-
Last release
4 months ago

BetterDDB

npm version License: MIT

BetterDDB is a type-safe DynamoDB wrapper library that combines runtime validation with compile-time type checking. It provides a high-level, opinionated interface for DynamoDB operations with built-in schema validation using Zod.

Key Features

  • 🔒 Type Safety: Full TypeScript support with compile-time type checking using zod.infer<T>
  • Runtime Validation: Schema validation using Zod ensures data integrity
  • 🎯 Smart Key Management: Automatic computation of partition keys, sort keys, and GSI keys
  • 🛠️ Fluent Query API: Intuitive builder pattern for all DynamoDB operations
  • Developer Experience: Reduced boilerplate and improved code maintainability
  • 🔄 Built-in Conveniences: Automatic timestamp handling, versioning support

Installation

npm install betterddb

Quick Start

import { BetterDDB } from 'betterddb';
import { z } from 'zod';
import { DynamoDBDocumentClient, DynamoDB } from '@aws-sdk/lib-dynamodb';

// 1. Define your schema with Zod
const UserSchema = z.object({
  id: z.string(),
  name: z.string(),
  email: z.string().email(),
});

// Type inference from schema
type User = z.infer<typeof UserSchema>;

// 2. Initialize DynamoDB client
const client = DynamoDBDocumentClient.from(new DynamoDB({
  region: 'us-east-1',
}));

// 3. Create your BetterDDB instance
const userDdb = new BetterDDB<User>({
  schema: UserSchema,
  tableName: 'Users',
  entityType: 'USER',
  keys: {
    primary: { 
      name: 'pk', 
      definition: { build: (raw) => `USER#${raw.id}` } 
    },
    sort: { 
      name: 'sk', 
      definition: { build: (raw) => `EMAIL#${raw.email}` } 
    },
    gsis: {
      EmailIndex: {
        name: 'EmailIndex',
        primary: { 
          name: 'gsi1pk', 
          definition: { build: (raw) => `USER#${raw.email}` } 
        },
        sort: { 
          name: 'gsi1sk', 
          definition: { build: (raw) => `USER#${raw.email}` } 
        }
      }
    }
  },
  client,
  timestamps: true,
});

// 4. Use the fluent API for operations
async function example() {
  // Create with automatic validation
  const user = await userDdb.create({
    id: 'user-123',
    name: 'Alice',
    email: 'alice@example.com'
  }).execute();

  // Query with type-safe filters
  const results = await userDdb.query({ email: 'alice@example.com' })
    .usingIndex('EmailIndex')
    .filter('name', 'begins_with', 'A')
    .limitResults(10)
    .execute();

  // Update with automatic timestamp handling
  const updated = await userDdb.update({ id: 'user-123' })
    .set({ name: 'Alice B.' })
    .execute();
}

Core Concepts

Schema Validation

BetterDDB uses Zod for both runtime validation and TypeScript type inference:

const Schema = z.object({
  id: z.string(),
  name: z.string(),
  email: z.string().email(),
}).passthrough(); // Allow computed fields

type Entity = z.infer<typeof Schema>; // TypeScript type inference

Key Management

Define how your keys should be computed from your entity:

const ddb = new BetterDDB<User>({
  keys: {
    primary: {
      name: 'pk',
      definition: { build: (raw) => `USER#${raw.id}` }
    },
    sort: {
      name: 'sk',
      definition: { build: (raw) => `TYPE#${raw.type}` }
    }
  }
});

Query Building

Fluent API for building type-safe queries:

const results = await ddb.query({ id: 'user-123' })
  .usingIndex('EmailIndex')
  .where('begins_with', { email: 'alice' })
  .filter('name', 'contains', 'Smith')
  .limitResults(10)
  .execute();

API Reference

For detailed API documentation, see our API Reference.

This documentation covers:

  • Initialization and configuration
  • CRUD operations (Create, Read, Update, Delete)
  • Query and Scan operations with filtering
  • Batch and transaction operations
  • Advanced features like automatic timestamps and versioning
  • Schema validation and key management

Contributing

We welcome contributions! Please see our Contributing Guide for details.

License

MIT © Ryan Krumholz

0.6.12

5 months ago

0.6.11

5 months ago

0.6.13

4 months ago

0.6.7

5 months ago

0.6.6

5 months ago

0.6.9

5 months ago

0.6.8

5 months ago

0.6.10

5 months ago

0.6.5

5 months ago

0.6.4

5 months ago

0.5.4

5 months ago

0.5.3

5 months ago

0.5.5

5 months ago

0.6.1

5 months ago

0.5.2

5 months ago

0.6.0

5 months ago

0.5.1

5 months ago

0.5.0

5 months ago

0.4.9

5 months ago

0.4.8

5 months ago

0.4.7

5 months ago

0.4.6

5 months ago

0.4.5

5 months ago

0.4.4

5 months ago

0.4.3

5 months ago

0.4.2

5 months ago

0.4.1

5 months ago

0.4.0

5 months ago

0.3.0

5 months ago

0.2.0

5 months ago

0.1.0

5 months ago