Seeders
Seeders now live in one shared directory and are composed from DatabaseSeeder.js instead of relying on driver-specific folder splits or alphabetical order alone.
Generated seeders use the shared log helper, so local seeding output matches the rest of the framework.
Quick Example
// database/seeders/DatabaseSeeder.js
export async function run(db) {
await db.call([
"UserSeeder",
"PostSeeder",
]);
}
// database/seeders/PostSeeder.js
import { log } from "@admicaa/netpress";
export async function run(db) {
const Post = db.model("Post");
if (!Post) {
throw new Error("Post model is not registered.");
}
const existing = await Post.first({ title: "Hello Netpress" });
if (!existing) {
await Post.create({
userId: 1,
title: "Hello Netpress",
body: "Shared seeders now compose from DatabaseSeeder.",
status: "published",
});
}
log.success("PostSeeder completed.");
}
db.model("Post") returns the regular discovered Post model class for the active runtime. Once you have it, methods like Post.create(), Post.query(), and Post.first() are the normal model API.
Seeder examples use db.model(...) because that is the helper Netpress passes into run(db), and it matches the generated seeder stubs. In regular application code, you will usually import Post directly.
What db Gives You
Inside a seeder, Netpress passes a helper object with:
| Helper | Purpose |
|---|---|
db.defaultConnection | the default configured connection name |
db.model(name) | resolve the regular discovered model class by name inside a seeder |
await db.connection(name) | resolve a live connection handle |
await db.call(target) | run another seeder target |
db.call(...) accepts:
- a seeder name like
"UserSeeder" - an array of seeder names
- an imported module
- a class with
run() - a function
Commands
npm run artisan -- make:seeder DatabaseSeeder
npm run artisan -- make:seeder PostSeeder
npm run artisan -- db:seed
npm run artisan -- db:seed --seeder=PostSeeder
npm run artisan -- migrate:fresh --seed
Seeder Discovery Rules
Seeder discovery now prefers:
database/seeders/- legacy fallback folders only when the shared root has no top-level seeders
That matches the model and migration discovery strategy.
Recommended Pattern
- keep
DatabaseSeeder.jsas the root entry point - use
db.call(...)to compose other seeders - make seeders idempotent so reruns stay safe
- prefer shared models over raw inserts unless you intentionally want to bypass model logic
When To Use Raw Connections
If a seed really needs lower-level access, you can ask for a connection explicitly:
export async function run(db) {
const knex = await db.connection("mysql");
await knex("roles").insert({ name: "admin" });
}
Most starter seeders should still stay on shared models.