Seed File: A seed file contains real/dummy data that you want to default to your database.
Factory File: A factory file is a function or method that returns objects of class, which is assumed to be "new".
How to run a seed file?
To run a seed file you must be run the command:
npm run db:seed
Note: you must be very careful when creating factories or seeders since every time you execute the npm run db:seed command they will be executed.
It is recommended to use some validation to verify that the record does not exist.
In the src/common/database/init.seeder.ts file is the main configuration to be able to run all the seeds and factories files.
import { DataSource } from 'typeorm';
import { runSeeders, Seeder } from 'typeorm-extension';
export default class InitSeeder implements Seeder {
public async run(dataSource: DataSource): Promise<any> {
await runSeeders(dataSource, {
seeds: ['src/common/database/seeds/**/*.seeder{.ts,.js}'],
factories: ['src/common/database/factories/**/*.factory{.ts,.js}'],
});
}
}
When you create a new seed file you should create it in src/common/database/seeds/ since the init.seeder.ts file is configured to read seeds only from this folder.
Seeder example:
import { User } from 'src/features/user/user.entity';
import { DataSource } from 'typeorm';
import { Seeder } from 'typeorm-extension';
import { v4 as uuidv4 } from 'uuid';
export default class UserSeeder implements Seeder {
public async run(dataSource: DataSource): Promise<void> {
const records = [
{
firstName: 'Timber',
lastName: 'Saw',
externalId: uuidv4(),
email: 'example@gmail.com',
},
{
firstName: 'John',
lastName: 'Due',
externalId: uuidv4(),
email: 'johndue@gmail.com',
},
];
const repository = dataSource.getRepository(User);
for (const record of records) {
const dbRecord = await repository.findOne({
where: { email: record.email },
});
if (dbRecord) {
continue;
}
await repository.save(record);
}
}
}
If you need to create factories to be able to generate data dummy in your database, you must be create the factory file in src/common/databases/factories
Factory example:
import { faker } from '@faker-js/faker';
import { User } from 'src/features/user/user.entity';
import { setSeederFactory } from 'typeorm-extension';
import { v4 as uuidv4 } from 'uuid';
export default setSeederFactory(User, async () => {
const user = new User();
user.id = uuidv4();
user.firstName = faker.person.firstName();
user.lastName = faker.person.lastName();
user.email = faker.internet.email({
firstName: user.firstName.toLowerCase(),
lastName: user.lastName.toLowerCase(),
});
user.externalId = uuidv4();
return user;
});
How to use a factory file in Seed file?
Now in the file the factoryManager.get() method is used to call the factory created for the Entity "user". And with the saveMany() method we establish how many records we want to generate.
Example:
import { User } from 'src/features/user/user.entity';
import { DataSource } from 'typeorm';
import { Seeder, SeederFactoryManager } from 'typeorm-extension';
export default class UserExampleFactorySeeder implements Seeder {
public async run(
dataSource: DataSource,
factoryManager: SeederFactoryManager,
): Promise<void> {
const userFactory = await factoryManager.get(User);
await userFactory.saveMany(40);
}
}