A lightweight, zero-dependency seeder toolkit for Mongoose. Run one-time database seed scripts on app startup, track execution status, and manage seeders via CLI — all without registering any Mongoose models.
npm install mongoose-seed-kitPeer dependency: mongoose >= 6.0.0
Create mongoose-seed-kit.config.js in your project root:
module.exports = { seedersPath: "./src/db/seeders" };npx mongoose-seed-kit create userThis generates src/db/seeders/20260320120000-user.seeder.ts.
Edit the generated file:
const seed = async (): Promise<void> => {
const User = require("../models/User").default;
const exists = await User.findOne({ email: "admin@example.com" });
if (exists) return;
await User.create({ email: "admin@example.com", role: "admin" });
};
export default seed;import mongoose from "mongoose";
import { runPendingSeeders } from "mongoose-seed-kit";
await mongoose.connect(process.env.DATABASE_URL);
const results = await runPendingSeeders();- Seeder files are sorted alphabetically — the timestamp prefix (
20260320120000-) ensures chronological order. - On each
runPendingSeeders()call, only seeders without asuccessrecord in the tracking collection are executed. - If a seeder fails, it is recorded as
failedand will be retried on the next run. Execution continues with remaining seeders regardless. - Tracking is stored in a MongoDB collection (
seedersby default) — no Mongoose model registration required.
Runs all seeders that haven't been successfully executed yet. Returns SeederRunResult[].
const results = await runPendingSeeders();
// [{ name: "20260320120000-user.seeder", status: "success" }]Force-runs a specific seeder by name (even if already executed). Returns SeederRunResult[].
const results = await runSeederByName("20260320120000-user.seeder");Lists all seeders with their status (pending, success, or failed). Returns SeederStatus[].
const statuses = await getSeederStatuses();
// [{ name: "20260320120000-user.seeder", status: "success", executedAt: Date, error: null }]Marks a seeder as pending again so it will re-run on next runPendingSeeders() call.
await resetSeeder("20260320120000-user.seeder");All functions accept an optional inline config. If omitted, the config file is loaded automatically.
| Option | Type | Default | Description |
|---|---|---|---|
seedersPath |
string |
— | Path to directory containing seeder files |
collectionName |
string |
"seeders" |
MongoDB collection for tracking execution |
filePattern |
RegExp |
/^\d{14}-.+\.seeder\.(ts|js)$/ |
Pattern to match seeder files |
Config is resolved from (in order):
mongoose-seed-kit.config.jsmongoose-seed-kit.config.json"mongoose-seed-kit"key inpackage.json
Or pass config inline:
await runPendingSeeders({ seedersPath: "./seeders", collectionName: "my_seeders" });npx mongoose-seed-kit create <name> # Scaffold a new seeder fileThe package exposes helper functions — build your own routes:
import { getSeederStatuses, runSeederByName, runPendingSeeders, resetSeeder } from "mongoose-seed-kit";
router.get("/seeders", async (req, res) => {
res.json(await getSeederStatuses());
});
router.post("/seeders/run", async (req, res) => {
const results = req.body.name
? await runSeederByName(req.body.name)
: await runPendingSeeders();
res.json(results);
});
router.post("/seeders/reset", async (req, res) => {
await resetSeeder(req.body.name);
res.json({ ok: true });
});Submit a pull request or open an issue on GitHub.
This project is licensed under the MIT License.
For more information, visit the GitHub repository.