0.2.0 • Published 4 months ago

mongoose-seeder-ts v0.2.0

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

Mongoose Seeder TS

npm version TypeScript License: MIT

🌱 A robust, TypeScript-first MongoDB seeder built on top of Mongoose. Perfect for seeding test data, bootstrapping databases, and managing data migrations.

Keywords: mongodb, mongoose, seed, database, typescript, nodejs, data-seeding, testing, development, migration

A TypeScript-based MongoDB seeder that leverages Mongoose validation for reliable data seeding.

Installation

npm install mongoose-seed
# or
yarn add mongoose-seed

Features

  • Full TypeScript support
  • Modern async/await API
  • Mongoose validation
  • Customizable logging
  • Connection options support

Basic Example

import { Seeder } from 'mongoose-seed';
import mongoose from 'mongoose';

// Define models
interface IUserBase {
  name: string;
  email: string;
  isActive: boolean;
}

interface IUser extends IUserBase, Document {}

interface IUserModel extends Model<IUser> {}

interface IProductBase {
  name: string;
  price: number;
  inStock: boolean;
}

interface IProduct extends IProductBase, Document {}

interface IProductModel extends Model<IProduct> {}

const userSchema = new Schema<IUser>({
  name: {
    type: String,
    required: true,
    trim: true
  },
  email: {
    type: String, 
    required: true,
    unique: true,
    trim: true
  },
  isActive: {
    type: Boolean,
    default: true
  }
});

const productSchema = new Schema<IProduct>({
  name: {
    type: String,
    required: true,
    trim: true
  },
  price: {
    type: Number,
    required: true
  },
  inStock: {
    type: Boolean,
    default: false
  }
});

export const UserModel = model<IUser, IUserModel>('User', userSchema);
export const ProductModel = model<IProduct, IProductModel>('Product', productSchema);

async function seed() {
  // Initialize seeder
  const seeder = new Seeder(mongoose);
  
  try {
    // Connect to MongoDB
    await seeder.connect('mongodb://localhost/sample-dev', {
      useNewUrlParser: true
    });

    // Load Mongoose models
    seeder.loadModels([UserModel, ProductModel]);

    // Clear specified collections
    await seeder.clearModels(['User', 'Product']);

    // Seed data
    await seeder.populateModels([
      {
        model: 'User',
        documents: [
          {
            name: 'John Doe',
            email: 'john@example.com',
            isActive: true
          },
          {
            name: 'Jane Smith',
            email: 'jane@example.com',
            isActive: true
          }
        ]
      },
      {
        model: 'Product',
        documents: [
          {
            name: 'Product 1',
            price: 99.99,
            inStock: true
          }
        ]
      }
    ]);

    console.log('Database seeded successfully!');
  } catch (error) {
    console.error('Error seeding database:', error);
  }
}

seed();

API Reference

Constructor

new Seeder(mongoose: Mongoose, logger?: Logger)

Creates a new seeder instance. You can optionally provide a custom logger.

Methods

connect(db: string, options?: MongooseConnectionOptions): Promise

Connects to MongoDB using the provided connection string and options.

await seeder.connect('mongodb://localhost/db', {
  useNewUrlParser: true,
  // ... other mongoose options
});

loadModels(models: Model[]): Seeder

Loads Mongoose models into the seeder. Only loaded models can be cleared or populated.

seeder.loadModels([UserModel, ProductModel]);

clearModels(modelNames: string[]): Promise

Clears the specified collections.

await seeder.clearModels(['User', 'Product']);

populateModels(data: SeedData[]): Promise

Populates collections with the provided data. Data must follow the SeedData interface:

interface SeedData<T = any> {
  model: string;
  documents: T[];
}

await seeder.populateModels([
  {
    model: 'User',
    documents: [/* ... */]
  }
]);

setLogger(logger: Logger): void

Sets a custom logger. Logger must implement the Logger interface:

interface Logger {
  log(message: string): void;
  error(message: string): void;
}

const customLogger = {
  log: (msg) => console.log(`[SEED] ${msg}`),
  error: (msg) => console.error(`[SEED ERROR] ${msg}`)
};

seeder.setLogger(customLogger);

Error Handling

The seeder provides detailed error messages and proper error handling:

  • ConnectionError: When database connection fails
  • ModelError: When there are issues with models or documents
  • SeederError: Base class for all seeder-specific errors

TypeScript Support

The package includes TypeScript definitions and supports generic types for your models:

interface User {
  name: string;
  email: string;
  isActive: boolean;
}

const userData: SeedData<User> = {
  model: 'User',
  documents: [
    {
      name: 'John',
      email: 'john@example.com',
      isActive: true
    }
  ]
};

License

MIT

0.2.0

4 months ago

0.1.0

4 months ago