@ackplus/nest-seeder 1.1.17 โ†’ 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/MIGRATION.md +89 -0
  3. package/QUICKSTART.md +45 -149
  4. package/README.md +87 -521
  5. package/dist/cli.js +595 -235
  6. package/dist/cli.js.map +1 -1
  7. package/dist/index.d.mts +88 -0
  8. package/dist/index.d.ts +88 -8
  9. package/dist/index.js +417 -24
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.mjs +390 -0
  12. package/dist/index.mjs.map +1 -0
  13. package/package.json +46 -25
  14. package/dist/cli.d.ts +0 -3
  15. package/dist/lib/decorators/factory.decorator.d.ts +0 -6
  16. package/dist/lib/decorators/factory.decorator.js +0 -17
  17. package/dist/lib/decorators/factory.decorator.js.map +0 -1
  18. package/dist/lib/factory/data.factory.d.ts +0 -6
  19. package/dist/lib/factory/data.factory.js +0 -57
  20. package/dist/lib/factory/data.factory.js.map +0 -1
  21. package/dist/lib/index.d.ts +0 -4
  22. package/dist/lib/index.js +0 -21
  23. package/dist/lib/index.js.map +0 -1
  24. package/dist/lib/interfaces/factory.interface.d.ts +0 -4
  25. package/dist/lib/interfaces/factory.interface.js +0 -3
  26. package/dist/lib/interfaces/factory.interface.js.map +0 -1
  27. package/dist/lib/interfaces/index.d.ts +0 -2
  28. package/dist/lib/interfaces/index.js +0 -19
  29. package/dist/lib/interfaces/index.js.map +0 -1
  30. package/dist/lib/interfaces/property-metadata.interface.d.ts +0 -6
  31. package/dist/lib/interfaces/property-metadata.interface.js +0 -3
  32. package/dist/lib/interfaces/property-metadata.interface.js.map +0 -1
  33. package/dist/lib/interfaces/seeder-module-async-options.interface.d.ts +0 -10
  34. package/dist/lib/interfaces/seeder-module-async-options.interface.js +0 -3
  35. package/dist/lib/interfaces/seeder-module-async-options.interface.js.map +0 -1
  36. package/dist/lib/interfaces/seeder-options-factory.interface.d.ts +0 -4
  37. package/dist/lib/interfaces/seeder-options-factory.interface.js +0 -3
  38. package/dist/lib/interfaces/seeder-options-factory.interface.js.map +0 -1
  39. package/dist/lib/seeder/seeder.d.ts +0 -10
  40. package/dist/lib/seeder/seeder.interface.d.ts +0 -9
  41. package/dist/lib/seeder/seeder.interface.js +0 -3
  42. package/dist/lib/seeder/seeder.interface.js.map +0 -1
  43. package/dist/lib/seeder/seeder.js +0 -40
  44. package/dist/lib/seeder/seeder.js.map +0 -1
  45. package/dist/lib/seeder/seeder.module.d.ts +0 -17
  46. package/dist/lib/seeder/seeder.module.js +0 -80
  47. package/dist/lib/seeder/seeder.module.js.map +0 -1
  48. package/dist/lib/seeder/seeder.service.d.ts +0 -10
  49. package/dist/lib/seeder/seeder.service.js +0 -73
  50. package/dist/lib/seeder/seeder.service.js.map +0 -1
  51. package/dist/lib/storages/factory.metadata.storage.d.ts +0 -16
  52. package/dist/lib/storages/factory.metadata.storage.js +0 -17
  53. package/dist/lib/storages/factory.metadata.storage.js.map +0 -1
  54. package/dist/tsconfig.build.tsbuildinfo +0 -1
  55. package/examples/post.seeder.example.ts +0 -65
  56. package/examples/product.factory.example.ts +0 -84
  57. package/examples/seed.script.example.ts +0 -32
  58. package/examples/seeder.config.example.ts +0 -50
  59. package/examples/user.factory.example.ts +0 -59
  60. package/examples/user.seeder.example.ts +0 -55
package/README.md CHANGED
@@ -1,69 +1,76 @@
1
1
  # @ackplus/nest-seeder
2
2
 
3
- A powerful and flexible database seeding library for NestJS applications with support for factories, data generation using Faker.js, and CLI commands.
3
+ <p align="center">
4
+ <a href="https://nestjs.com/" target="_blank"><img src="https://nestjs.com/img/logo-small.svg" width="110" alt="Nest Logo" /></a>
5
+ </p>
6
+
7
+ <p align="center">A powerful, CLI-first database seeding library for NestJS โ€” factories, Faker.js, and a great DX.</p>
8
+
9
+ <p align="center">
10
+ <a href="https://www.npmjs.com/package/@ackplus/nest-seeder"><img src="https://img.shields.io/npm/v/@ackplus/nest-seeder.svg" alt="NPM Version" /></a>
11
+ <a href="https://www.npmjs.com/package/@ackplus/nest-seeder"><img src="https://img.shields.io/npm/l/@ackplus/nest-seeder.svg" alt="License" /></a>
12
+ <a href="https://www.npmjs.com/package/@ackplus/nest-seeder"><img src="https://img.shields.io/npm/dm/@ackplus/nest-seeder.svg" alt="Downloads" /></a>
13
+ </p>
14
+
15
+ ## ๐Ÿ“š Documentation
16
+
17
+ **๐Ÿ‘‰ Full documentation & guides: [ack-solutions.github.io/nest-seeder](https://ack-solutions.github.io/nest-seeder/)**
18
+
19
+ | | |
20
+ | --- | --- |
21
+ | ๐Ÿš€ [Getting Started](https://ack-solutions.github.io/nest-seeder/guide/getting-started) | 5-minute quickstart |
22
+ | ๐Ÿญ [Factories](https://ack-solutions.github.io/nest-seeder/guide/factories) | Generate realistic data |
23
+ | ๐ŸŒฑ [Seeders](https://ack-solutions.github.io/nest-seeder/guide/seeders) | Insert & drop data |
24
+ | ๐Ÿ–ฅ๏ธ [CLI Reference](https://ack-solutions.github.io/nest-seeder/guide/cli) | Every command & flag |
25
+ | ๐Ÿ“– [API Reference](https://ack-solutions.github.io/nest-seeder/api/) | Full API |
26
+ | ๐Ÿ”€ [Migration v1 โ†’ v2](https://ack-solutions.github.io/nest-seeder/migration) | Upgrade guide |
27
+ | ๐Ÿ“ [Changelog](https://ack-solutions.github.io/nest-seeder/changelog) | What changed |
4
28
 
5
29
  ## โœจ Features
6
30
 
7
- - ๐ŸŒฑ **CLI-Based** - Simple command-line interface, no app code modifications needed
8
- - ๐Ÿญ **Factory Pattern** - Generate realistic test data with Faker.js
9
- - ๐Ÿ”„ **Multiple ORMs** - Support for TypeORM, Mongoose, and Prisma
10
- - ๐Ÿ“ฆ **Batch Operations** - Efficient bulk data insertion
11
- - ๐ŸŽฏ **Selective Seeding** - Run specific seeders by name
12
- - ๐Ÿ”ฅ **Refresh Mode** - Drop existing data before seeding
13
- - ๐Ÿงช **Test-Friendly** - Perfect for testing and development
14
- - ๐Ÿ“ **TypeScript** - Full TypeScript support with type safety
31
+ - ๐Ÿ–ฅ๏ธ **CLI-first** โ€” run `nest-seed` with zero changes to your app code. Auto-detects your config.
32
+ - ๐Ÿญ **Factories + Faker.js** โ€” declare data with the `@Factory` decorator; supports dependent fields, inheritance, and overrides.
33
+ - ๐Ÿ”„ **Any ORM** โ€” TypeORM, Mongoose, Prisma, or anything Nest can inject.
34
+ - ๐ŸŽฏ **Selective & safe** โ€” run seeders by name, `--refresh` in foreign-key-safe order, or preview with `--dry-run`.
35
+ - ๐Ÿ› ๏ธ **Scaffolding** โ€” `nest-seed init` generates a config, factory, and seeder.
36
+ - ๐Ÿ“ฆ **Dual ESM + CJS** with full TypeScript declarations.
15
37
 
16
38
  ## ๐Ÿ“ฆ Installation
17
39
 
18
40
  ```bash
19
41
  npm install @ackplus/nest-seeder @faker-js/faker
20
- # or
21
- pnpm add @ackplus/nest-seeder @faker-js/faker
22
- # or
23
- yarn add @ackplus/nest-seeder @faker-js/faker
24
- ```
25
-
26
- **For TypeScript config files**, also install:
27
-
28
- ```bash
42
+ # For TypeScript config files:
29
43
  npm install -D ts-node typescript
30
44
  ```
31
45
 
32
- ## ๐Ÿš€ Quick Start (5 Steps)
33
-
34
- ### Step 1: Create Entity
46
+ > Requires Node 18+ and NestJS 10 or 11.
35
47
 
36
- ```typescript
37
- // src/entities/user.entity.ts
38
- import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
48
+ ## ๐Ÿš€ Quick Start
39
49
 
40
- @Entity('users')
41
- export class User {
42
- @PrimaryGeneratedColumn()
43
- id: number;
50
+ The fastest path is to scaffold the files:
44
51
 
45
- @Column()
46
- name: string;
47
-
48
- @Column({ unique: true })
49
- email: string;
50
-
51
- @Column()
52
- role: string;
53
- }
52
+ ```bash
53
+ npx nest-seed init
54
54
  ```
55
55
 
56
- ### Step 2: Create Factory
56
+ โ€ฆor wire them up by hand:
57
+
58
+ **1. Factory** โ€” `src/database/factories/user.factory.ts`
57
59
 
58
- ```typescript
59
- // src/factories/user.factory.ts
60
+ ```ts
60
61
  import { Factory } from '@ackplus/nest-seeder';
61
62
 
62
63
  export class UserFactory {
63
- @Factory((faker) => faker.person.fullName())
64
- name: string;
64
+ @Factory((faker) => faker.person.firstName())
65
+ firstName: string;
65
66
 
66
- @Factory((faker) => faker.internet.email())
67
+ @Factory((faker) => faker.person.lastName())
68
+ lastName: string;
69
+
70
+ @Factory(
71
+ (faker, ctx) => faker.internet.email({ firstName: ctx.firstName, lastName: ctx.lastName }).toLowerCase(),
72
+ ['firstName', 'lastName'],
73
+ )
67
74
  email: string;
68
75
 
69
76
  @Factory((faker) => faker.helpers.arrayElement(['admin', 'user', 'guest']))
@@ -71,546 +78,105 @@ export class UserFactory {
71
78
  }
72
79
  ```
73
80
 
74
- ### Step 3: Create Seeder
81
+ **2. Seeder** โ€” `src/database/seeders/user.seeder.ts`
75
82
 
76
- ```typescript
77
- // src/seeders/user.seeder.ts
83
+ ```ts
78
84
  import { Injectable } from '@nestjs/common';
79
85
  import { InjectRepository } from '@nestjs/typeorm';
80
86
  import { Repository } from 'typeorm';
81
- import { Seeder, DataFactory } from '@ackplus/nest-seeder';
87
+ import { Seeder, SeederName, DataFactory } from '@ackplus/nest-seeder';
82
88
  import { User } from '../entities/user.entity';
83
89
  import { UserFactory } from '../factories/user.factory';
84
90
 
85
91
  @Injectable()
92
+ @SeederName('users')
86
93
  export class UserSeeder implements Seeder {
87
94
  constructor(
88
- @InjectRepository(User)
89
- private readonly userRepository: Repository<User>,
95
+ @InjectRepository(User) private readonly userRepository: Repository<User>,
90
96
  ) {}
91
97
 
92
98
  async seed(): Promise<void> {
93
- // Create factory instance
94
99
  const factory = DataFactory.createForClass(UserFactory);
95
-
96
- // Generate 10 users
97
100
  const users = factory.generate(10);
98
-
99
- // Save to database
100
101
  await this.userRepository.save(users);
101
-
102
- console.log('โœ… Seeded 10 users');
103
102
  }
104
103
 
105
104
  async drop(): Promise<void> {
106
- // Clear all users
107
- await this.userRepository.delete({});
108
-
109
- console.log('๐Ÿ—‘๏ธ Dropped all users');
105
+ await this.userRepository.createQueryBuilder().delete().execute();
110
106
  }
111
107
  }
112
108
  ```
113
109
 
114
- ### Step 4: Create Configuration File
115
-
116
- Create `seeder.config.ts` in your **project root**:
110
+ **3. Config** โ€” `seeder.config.ts` (project root)
117
111
 
118
- ```typescript
119
- // seeder.config.ts
112
+ ```ts
120
113
  import { TypeOrmModule } from '@nestjs/typeorm';
121
- import { User } from './src/entities/user.entity';
122
- import { UserSeeder } from './src/seeders/user.seeder';
114
+ import { defineSeederConfig } from '@ackplus/nest-seeder';
115
+ import { User } from './src/database/entities/user.entity';
116
+ import { UserSeeder } from './src/database/seeders/user.seeder';
123
117
 
124
- export default {
118
+ export default defineSeederConfig({
125
119
  imports: [
126
- // Database configuration
127
120
  TypeOrmModule.forRoot({
128
121
  type: 'postgres',
129
- host: 'localhost',
130
- port: 5432,
131
- username: 'postgres',
132
- password: 'postgres',
133
- database: 'mydb',
122
+ host: process.env.DB_HOST ?? 'localhost',
123
+ port: Number(process.env.DB_PORT ?? 5432),
124
+ username: process.env.DB_USERNAME ?? 'postgres',
125
+ password: process.env.DB_PASSWORD ?? 'postgres',
126
+ database: process.env.DB_DATABASE ?? 'app',
134
127
  entities: [User],
135
128
  synchronize: true,
136
129
  }),
137
-
138
- // Register repositories
139
130
  TypeOrmModule.forFeature([User]),
140
131
  ],
141
-
142
- // List seeders (run in order)
143
132
  seeders: [UserSeeder],
144
- };
133
+ });
145
134
  ```
146
135
 
147
- ### Step 5: Run Seeder
148
-
149
- Add script to `package.json`:
136
+ **4. Run** โ€” add a script and go
150
137
 
151
138
  ```json
152
139
  {
153
140
  "scripts": {
154
- "seed": "nest-seed -c seeder.config.ts"
141
+ "seed": "nest-seed"
155
142
  }
156
143
  }
157
144
  ```
158
145
 
159
- Run it:
160
-
161
146
  ```bash
162
147
  npm run seed
163
148
  ```
164
149
 
165
- **That's it!** Your database is now seeded! ๐ŸŽ‰
166
-
167
- ## ๐Ÿ–ฅ๏ธ CLI Commands
150
+ That's it โ€” the CLI auto-discovers `seeder.config.ts` and seeds your database. ๐ŸŽ‰
168
151
 
169
- ### Basic Usage
152
+ ## ๐Ÿ–ฅ๏ธ CLI at a glance
170
153
 
171
154
  ```bash
172
- # Run all seeders
173
- nest-seed -c seeder.config.ts
174
-
175
- # Drop and reseed
176
- nest-seed -c seeder.config.ts --refresh
177
-
178
- # Run specific seeder
179
- nest-seed -c seeder.config.ts --name UserSeeder
180
-
181
- # Run multiple seeders
182
- nest-seed -c seeder.config.ts --name UserSeeder ProductSeeder
155
+ nest-seed # run all seeders (config auto-detected)
156
+ nest-seed --refresh # drop (reverse order) then reseed
157
+ nest-seed --name users posts # run only specific seeders
158
+ nest-seed --dry-run # preview without writing
159
+ nest-seed list # list registered seeders
160
+ nest-seed init --orm mongoose # scaffold starter files
161
+ nest-seed --help # all options
183
162
  ```
184
163
 
185
- ### Available Options
164
+ See the [full CLI reference](https://ack-solutions.github.io/nest-seeder/guide/cli).
186
165
 
187
- | Option | Alias | Description | Default |
188
- |--------|-------|-------------|---------|
189
- | `--config` | `-c` | Path to configuration file | (required) |
190
- | `--refresh` | `-r` | Drop data before seeding | `false` |
191
- | `--name` | `-n` | Run specific seeder(s) | (all) |
192
- | `--dummyData` | `-d` | Include dummy data flag | `false` |
193
- | `--help` | `-h` | Show help | |
166
+ ## ๐Ÿ”€ Upgrading from v1?
194
167
 
195
- ### Package.json Scripts
196
-
197
- ```json
198
- {
199
- "scripts": {
200
- "seed": "nest-seed -c seeder.config.ts",
201
- "seed:refresh": "nest-seed -c seeder.config.ts -r",
202
- "seed:users": "nest-seed -c seeder.config.ts -n UserSeeder",
203
- "seed:watch": "nodemon --watch src/seeders --ext ts --exec nest-seed -c seeder.config.ts"
204
- }
205
- }
206
- ```
207
-
208
- ## โš™๏ธ Configuration
209
-
210
- ### TypeORM Example
211
-
212
- ```typescript
213
- // seeder.config.ts
214
- import { TypeOrmModule } from '@nestjs/typeorm';
215
- import { User, Post, Comment } from './src/entities';
216
- import { UserSeeder, PostSeeder, CommentSeeder } from './src/seeders';
217
-
218
- export default {
219
- imports: [
220
- TypeOrmModule.forRoot({
221
- type: 'postgres',
222
- host: process.env.DB_HOST || 'localhost',
223
- port: parseInt(process.env.DB_PORT) || 5432,
224
- username: process.env.DB_USER || 'postgres',
225
- password: process.env.DB_PASSWORD || 'postgres',
226
- database: process.env.DB_NAME || 'mydb',
227
- entities: [User, Post, Comment],
228
- synchronize: true,
229
- }),
230
- TypeOrmModule.forFeature([User, Post, Comment]),
231
- ],
232
- seeders: [UserSeeder, PostSeeder, CommentSeeder],
233
- };
234
- ```
235
-
236
- ### MongoDB/Mongoose Example
237
-
238
- ```typescript
239
- // seeder.config.ts
240
- import { MongooseModule } from '@nestjs/mongoose';
241
- import { User, UserSchema } from './src/schemas/user.schema';
242
- import { UserSeeder } from './src/seeders/user.seeder';
243
-
244
- export default {
245
- imports: [
246
- MongooseModule.forRoot('mongodb://localhost/mydb'),
247
- MongooseModule.forFeature([
248
- { name: User.name, schema: UserSchema }
249
- ]),
250
- ],
251
- seeders: [UserSeeder],
252
- };
253
- ```
254
-
255
- ### SQLite Example
256
-
257
- ```typescript
258
- // seeder.config.ts
259
- import { TypeOrmModule } from '@nestjs/typeorm';
260
- import { User } from './src/entities/user.entity';
261
- import { UserSeeder } from './src/seeders/user.seeder';
262
-
263
- export default {
264
- imports: [
265
- TypeOrmModule.forRoot({
266
- type: 'sqlite',
267
- database: 'database.sqlite',
268
- entities: [User],
269
- synchronize: true,
270
- }),
271
- TypeOrmModule.forFeature([User]),
272
- ],
273
- seeders: [UserSeeder],
274
- };
275
- ```
276
-
277
- ## ๐Ÿญ Factories
278
-
279
- ### Basic Factory
280
-
281
- ```typescript
282
- import { Factory } from '@ackplus/nest-seeder';
283
-
284
- export class UserFactory {
285
- @Factory((faker) => faker.person.fullName())
286
- name: string;
287
-
288
- @Factory((faker) => faker.internet.email())
289
- email: string;
290
-
291
- @Factory((faker) => faker.datatype.number({ min: 18, max: 80 }))
292
- age: number;
293
- }
294
- ```
295
-
296
- ### Using Factory
297
-
298
- ```typescript
299
- import { DataFactory } from '@ackplus/nest-seeder';
300
- import { UserFactory } from './user.factory';
301
-
302
- // Create factory
303
- const factory = DataFactory.createForClass(UserFactory);
304
-
305
- // Generate one object
306
- const user = factory.generate(1)[0];
307
-
308
- // Generate multiple objects
309
- const users = factory.generate(10);
310
-
311
- // Generate with overrides
312
- const admin = factory.generate(1, { role: 'admin' })[0];
313
- ```
314
-
315
- ### Factory with Relationships
316
-
317
- ```typescript
318
- import { Factory } from '@ackplus/nest-seeder';
319
-
320
- export class PostFactory {
321
- @Factory((faker) => faker.lorem.sentence())
322
- title: string;
323
-
324
- @Factory((faker) => faker.lorem.paragraphs(3))
325
- content: string;
326
-
327
- // Will be set manually in seeder
328
- authorId: number;
329
- }
330
- ```
331
-
332
- ## ๐ŸŒฑ Seeders
333
-
334
- ### Basic Seeder
335
-
336
- ```typescript
337
- import { Injectable } from '@nestjs/common';
338
- import { InjectRepository } from '@nestjs/typeorm';
339
- import { Repository } from 'typeorm';
340
- import { Seeder, DataFactory } from '@ackplus/nest-seeder';
341
- import { User } from '../entities/user.entity';
342
- import { UserFactory } from '../factories/user.factory';
343
-
344
- @Injectable()
345
- export class UserSeeder implements Seeder {
346
- constructor(
347
- @InjectRepository(User)
348
- private readonly userRepository: Repository<User>,
349
- ) {}
350
-
351
- async seed(): Promise<void> {
352
- const factory = DataFactory.createForClass(UserFactory);
353
- const users = factory.generate(10);
354
- await this.userRepository.save(users);
355
- }
356
-
357
- async drop(): Promise<void> {
358
- await this.userRepository.delete({});
359
- }
360
- }
361
- ```
362
-
363
- ### Seeder with Relationships
364
-
365
- ```typescript
366
- import { Injectable } from '@nestjs/common';
367
- import { InjectRepository } from '@nestjs/typeorm';
368
- import { Repository } from 'typeorm';
369
- import { Seeder, DataFactory } from '@ackplus/nest-seeder';
370
- import { User } from '../entities/user.entity';
371
- import { Post } from '../entities/post.entity';
372
- import { UserFactory } from '../factories/user.factory';
373
- import { PostFactory } from '../factories/post.factory';
374
-
375
- @Injectable()
376
- export class PostSeeder implements Seeder {
377
- constructor(
378
- @InjectRepository(User)
379
- private readonly userRepository: Repository<User>,
380
- @InjectRepository(Post)
381
- private readonly postRepository: Repository<Post>,
382
- ) {}
383
-
384
- async seed(): Promise<void> {
385
- // Get existing users
386
- const users = await this.userRepository.find();
387
-
388
- if (users.length === 0) {
389
- console.log('โš ๏ธ No users found. Run UserSeeder first.');
390
- return;
391
- }
392
-
393
- // Create posts for each user
394
- const postFactory = DataFactory.createForClass(PostFactory);
395
-
396
- for (const user of users) {
397
- // Generate 3 posts per user
398
- const posts = postFactory.generate(3).map(post => ({
399
- ...post,
400
- author: user,
401
- }));
402
-
403
- await this.postRepository.save(posts);
404
- }
405
-
406
- console.log(`โœ… Seeded ${users.length * 3} posts`);
407
- }
408
-
409
- async drop(): Promise<void> {
410
- await this.postRepository.delete({});
411
- }
412
- }
413
- ```
414
-
415
- ### Conditional Seeding
416
-
417
- ```typescript
418
- import { Injectable } from '@nestjs/common';
419
- import { Seeder, SeederServiceOptions, DataFactory } from '@ackplus/nest-seeder';
420
-
421
- @Injectable()
422
- export class UserSeeder implements Seeder {
423
- async seed(options?: SeederServiceOptions): Promise<void> {
424
- const factory = DataFactory.createForClass(UserFactory);
425
-
426
- // Seed more data if dummyData flag is set
427
- const count = options?.dummyData ? 100 : 10;
428
- const users = factory.generate(count);
429
-
430
- await this.userRepository.save(users);
431
- console.log(`โœ… Seeded ${count} users`);
432
- }
433
-
434
- async drop(): Promise<void> {
435
- await this.userRepository.delete({});
436
- }
437
- }
438
- ```
439
-
440
- Run with dummy data:
441
-
442
- ```bash
443
- nest-seed -c seeder.config.ts --dummyData
444
- ```
445
-
446
- ### MongoDB/Mongoose Seeder
447
-
448
- ```typescript
449
- import { Injectable } from '@nestjs/common';
450
- import { InjectModel } from '@nestjs/mongoose';
451
- import { Model } from 'mongoose';
452
- import { Seeder, DataFactory } from '@ackplus/nest-seeder';
453
- import { User } from '../schemas/user.schema';
454
- import { UserFactory } from '../factories/user.factory';
455
-
456
- @Injectable()
457
- export class UserSeeder implements Seeder {
458
- constructor(
459
- @InjectModel(User.name)
460
- private readonly userModel: Model<User>,
461
- ) {}
462
-
463
- async seed(): Promise<void> {
464
- const factory = DataFactory.createForClass(UserFactory);
465
- const users = factory.generate(10);
466
- await this.userModel.insertMany(users);
467
- }
468
-
469
- async drop(): Promise<void> {
470
- await this.userModel.deleteMany({});
471
- }
472
- }
473
- ```
474
-
475
- ## ๐Ÿ”ฅ Advanced Examples
476
-
477
- ### Custom Providers in Config
478
-
479
- ```typescript
480
- // seeder.config.ts
481
- import { CustomService } from './src/services/custom.service';
482
-
483
- export default {
484
- imports: [
485
- TypeOrmModule.forRoot({ /* ... */ }),
486
- TypeOrmModule.forFeature([User]),
487
- ],
488
- seeders: [UserSeeder],
489
- providers: [CustomService], // Inject custom services
490
- };
491
- ```
492
-
493
- ### Environment-Based Configuration
494
-
495
- ```typescript
496
- // seeder.config.ts
497
- import * as dotenv from 'dotenv';
498
- dotenv.config();
499
-
500
- const isDev = process.env.NODE_ENV === 'development';
501
-
502
- export default {
503
- imports: [
504
- TypeOrmModule.forRoot({
505
- type: 'postgres',
506
- host: process.env.DB_HOST,
507
- database: isDev ? 'mydb_dev' : 'mydb_prod',
508
- synchronize: isDev,
509
- }),
510
- TypeOrmModule.forFeature([User, Post]),
511
- ],
512
- seeders: isDev
513
- ? [UserSeeder, PostSeeder, TestDataSeeder]
514
- : [UserSeeder, PostSeeder],
515
- };
516
- ```
517
-
518
- ### Batch Insert for Performance
519
-
520
- ```typescript
521
- @Injectable()
522
- export class UserSeeder implements Seeder {
523
- async seed(): Promise<void> {
524
- const factory = DataFactory.createForClass(UserFactory);
525
- const batchSize = 1000;
526
- const totalRecords = 10000;
527
-
528
- for (let i = 0; i < totalRecords; i += batchSize) {
529
- const users = factory.generate(batchSize);
530
- await this.userRepository.save(users);
531
- console.log(`โœ… Seeded ${Math.min(i + batchSize, totalRecords)}/${totalRecords} users`);
532
- }
533
- }
534
-
535
- async drop(): Promise<void> {
536
- await this.userRepository.delete({});
537
- }
538
- }
539
- ```
540
-
541
- ## ๐Ÿ“š API Reference
542
-
543
- ### DataFactory
544
-
545
- ```typescript
546
- class DataFactory {
547
- // Create factory for a class
548
- static createForClass<T>(factoryClass: new () => T): DataFactory<T>
549
-
550
- // Generate instances
551
- generate(count: number, override?: Partial<T>): T[]
552
- }
553
- ```
554
-
555
- ### Seeder Interface
556
-
557
- ```typescript
558
- interface Seeder {
559
- // Seed data into database
560
- seed(options?: SeederServiceOptions): Promise<void>
561
-
562
- // Drop/clear data from database
563
- drop(options?: SeederServiceOptions): Promise<void>
564
- }
565
- ```
566
-
567
- ### @Factory Decorator
568
-
569
- ```typescript
570
- // Simple factory
571
- @Factory((faker) => faker.person.fullName())
572
- name: string;
573
-
574
- // With options
575
- @Factory((faker) => faker.datatype.number({ min: 1, max: 100 }))
576
- age: number;
577
-
578
- // Array values
579
- @Factory((faker) => faker.helpers.arrayElement(['admin', 'user']))
580
- role: string;
581
- ```
582
-
583
- ### SeederServiceOptions
584
-
585
- ```typescript
586
- interface SeederServiceOptions {
587
- refresh?: boolean; // Drop before seeding
588
- name?: string[]; // Run specific seeders
589
- dummyData?: boolean; // Custom flag for your logic
590
- }
591
- ```
168
+ v2 keeps the `@Factory` / `Seeder` / `DataFactory` core and modernizes the CLI, config, and
169
+ packaging. Most apps upgrade in minutes โ€” follow the
170
+ **[Migration Guide](https://ack-solutions.github.io/nest-seeder/migration)**.
592
171
 
593
172
  ## ๐Ÿค Contributing
594
173
 
595
- Contributions are welcome! Please feel free to submit a Pull Request.
174
+ Contributions welcome! See the [Contributing Guide](https://github.com/ack-solutions/nest-seeder/blob/main/CONTRIBUTING.md).
596
175
 
597
176
  ## ๐Ÿ“„ License
598
177
 
599
- This project is licensed under the MIT License.
600
-
601
- ## ๐Ÿ™ Acknowledgments
602
-
603
- - Built with [NestJS](https://nestjs.com/)
604
- - Powered by [Faker.js](https://fakerjs.dev/)
605
- - Inspired by database seeding patterns from Laravel and other frameworks
606
-
607
- ## ๐Ÿ“ฎ Support
608
-
609
- If you have any questions or need help:
610
- - Open an issue on [GitHub](https://github.com/ackplus/nest-seeder/issues)
611
- - Check the [examples](./examples/) directory
612
- - Review the [Quick Start Guide](./QUICKSTART.md)
178
+ [MIT](./LICENSE) ยฉ AckPlus
613
179
 
614
180
  ---
615
181
 
616
- Made with โค๏ธ for the NestJS community
182
+ Built with [NestJS](https://nestjs.com/) ยท Powered by [Faker.js](https://fakerjs.dev/)