@birdbrain/typeorm-seeder v1.11.1
@birdbrain/typeorm-seeder
Seed TypeORM entities using decorators.
Be aware
This project is very much in development. Expect breaking changes between minor versions.
Table of contents
Prerequisites
Enable decorators in tsconfig.json
.
{
"compilerOptions": {
"emitDecoratorMetadata": true,
"experimentalDecorators": true
}
}
Installation
npm install @birdbrain/typeorm-seeder
TypeORM is required.
Quick start
Use the @Seed()
property decorator to generate property values. Relations are seeded the same way.
import { Entity, PrimaryGeneratedColumn } from 'typeorm';
import { Seed } from '@birdbrain/typeorm-seeder';
import * as faker from 'faker';
@Entity()
export class User {
@PrimaryGeneratedColumn()
public id: number;
@Column()
@Seed(() => faker.name.firstName())
public name: string;
}
Create a connection and seed the entity using the forEntity()
builder.
import { createConnection } from 'typeorm';
import { forEntity } from '@birdbrain/typeorm-seeder';
await createConnection();
const user = forEntity(User).create();
// User {
// name: 'Jack'
// }
Usage
Create
Entities are simply created, seeded and returned.
import { createConnection, getRepository } from 'typeorm';
import { forEntity } from '@birdbrain/typeorm-seeder';
await createConnection();
const user = forEntity(User).create();
// User {
// name: 'Jack'
// }
const users = forEntity(User).createMany(2);
// [
// User {
// name: 'Jack'
// },
// User {
// name: 'Matt'
// }
// ]
await getRepository(User).save(user);
Create and persist
Entities are created, seeded and persisted in the database. Returns the persisted entities.
import { createConnection } from 'typeorm';
import { forEntity } from '@birdbrain/typeorm-seeder';
await createConnection();
const user = await forEntity(User).persist();
// User {
// id: 1,
// name: 'Jack'
// }
const users = await forEntity(User).persistMany(2);
// [
// User {
// id: 1,
// name: 'Jack'
// },
// User {
// id: 2,
// name: 'Matt'
// }
// ]
Advanced usage
Relations
Relations are seeded like any other property. No callback is needed, the related entity is automatically resolved from the relation.
Seeding both sides of a relation is optional. It's only required on the entity passed to forEntity()
.
One-to-one
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm';
import { Seed } from '@birdbrain/typeorm-seeder';
@Entity()
export class User {
@PrimaryGeneratedColumn()
public id: number;
@Column()
@Seed(() => faker.name.firstName())
public name: string;
@OneToOne(() => House, (house) => post.owner)
@JoinColumn()
@Seed()
public house: House;
}
import { Entity, Column, OneToOne } from 'typeorm';
import { Seed } from '@birdbrain/typeorm-seeder';
@Entity()
export class House {
@PrimaryGeneratedColumn()
public id: number;
@Column()
@Seed(() => faker.address.streetName())
public streetName: string;
@OneToOne(() => User, (user) => user.house)
@Seed()
public owner: User;
}
import { createConnection } from 'typeorm';
import { forEntity } from '@birdbrain/typeorm-seeder';
await createConnection();
const users = await forEntity(User).persistMany(2);
// [
// User {
// id: 1,
// name: 'Jack',
// house: House { id: 1, streetName: 'Willow Avenue' }
// },
// User {
// id: 2,
// name: 'Bob',
// house: House { id: 2, streetName: 'Elm Street' }
// }
// ]
Relations where the join column is on the opposite side of the entry entity will also be seeded.
One-to-many, many-to-one, many-to-many
import { Entity, Column, OneToMany } from 'typeorm';
import { Seed } from '@birdbrain/typeorm-seeder';
@Entity()
export class User {
@Column()
@Seed(() => faker.name.firstName())
public name: string;
@OneToMany(() => House, (house) => post.owner)
@Seed({ amount: 2 })
public houses: House[];
}
import { Entity, Column, ManyToOne } from 'typeorm';
import { Seed } from '@birdbrain/typeorm-seeder';
@Entity()
export class House {
@Column()
@Seed(() => faker.address.streetName())
public streetName: string;
@ManyToOne(() => User, (user) => user.houses)
@Seed()
public owner: User;
}
import { createConnection } from 'typeorm';
import { forEntity } from '@birdbrain/typeorm-seeder';
await createConnection();
const users = await forEntity(User).persist();
// [
// User {
// id: 1,
// name: 'Jack',
// houses: [
// House { id: 1, streetName: 'Willow Avenue' }
// House { id: 2, streetName: 'Elm Street' }
// ]
// },
// ]
Seeders
Use seeders to easily organize seeding and separate concerns. A seeder is a class decorated with @Seeder()
. Use
the BaseSeeder
interface to construct seeders appropriately.
import { Seeder, BaseSeeder } from '@birdbrain/typeorm-seeder';
@Seeder()
export class UserSeeder implements BaseSeeder {
constructor() {}
public seed(): Promise<User[]> {
return forEntity(User).persistMany(5);
}
}
Use options to control the order in which seeders are executed.
import { Seeder, BaseSeeder } from '@birdbrain/typeorm-seeder';
@Seeder({ runsBefore: [SomeOtherSeeder] })
export class UserSeeder implements BaseSeeder {
public seed(): Promise<User[]> {
return forEntity(User).persistMany(5);
}
}
Use the forSeeders()
builder to run the seeders.
import { createConnection } from 'typeorm';
import { forSeeders } from '@birdbrain/typeorm-seeder';
await createConnection();
await forSeeders([UserSeeder, SomeOtherSeeder]).run();
As in TypeORM, seeders can be loaded by providing paths to the seeder files relative to project root.
import { createConnection } from 'typeorm';
import { forSeeders } from '@birdbrain/typeorm-seeder';
await createConnection();
await forSeeders(['seeders/*.ts']).run();
Builders
The forEntity()
and forSeeders()
methods are factories instantiating respectively EntityBuilder
and SeederBuilder
. Use the builders directly for a more fine-tuned seeding.
EntityBuilder
import { createConnection } from 'typeorm';
import { EntityBuilder } from '@birdbrain/typeorm-seeder';
const connection = await createConnection();
const users = await new EntityBuilder()
.connection(connection)
.entity(User)
.options({ skipProperties: ['posts'] })
.persistMany(2);
SeederBuilder
import { createConnection } from 'typeorm';
import { SeederBuilder } from '@birdbrain/typeorm-seeder';
await createConnection();
await new SeederBuilder().seeders([UserSeeder, 'seeders/*.ts']).run();
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago