@ackplus/nest-seeder 1.1.16 → 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 (54) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/MIGRATION.md +89 -0
  3. package/QUICKSTART.md +45 -162
  4. package/README.md +91 -537
  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 +38 -7
  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
package/CHANGELOG.md ADDED
@@ -0,0 +1,64 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@ackplus/nest-seeder` are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [2.0.0] - 2026-06-15
9
+
10
+ A focused redesign that keeps the proven core (`@Factory`, `Seeder`, `DataFactory`) while
11
+ overhauling the CLI, configuration ergonomics, packaging, and documentation.
12
+
13
+ See the [Migration Guide](https://ack-solutions.github.io/nest-seeder/migration) for upgrade steps.
14
+
15
+ ### Added
16
+
17
+ - **`nest-seed init`** — scaffolds a `seeder.config.ts`, a factory, and a seeder (`--orm typeorm|mongoose`, `--force`).
18
+ - **`nest-seed list`** — lists registered seeders and their `--name` aliases.
19
+ - **Config auto-discovery** — the CLI finds `seeder.config.{ts,js,cjs,mjs}` automatically; `--config` is now optional.
20
+ - **`--dry-run`** — preview which seeders would run without writing data.
21
+ - **`--continue-on-error`** — keep going when a seeder throws instead of aborting.
22
+ - **`--context <json>`** — forward arbitrary JSON to every seeder via `options.context`.
23
+ - **`@SeederName('name')`** decorator and `getSeederName()` helper for stable, minification-safe seeder names.
24
+ - **`defineSeederConfig()`** — a typed identity helper for `seeder.config.ts`.
25
+ - **`DataFactory` `generateOne()`** convenience method.
26
+ - **Factory inheritance** — a factory that `extends` a base factory inherits its `@Factory` properties.
27
+ - **Dual ESM + CJS build** with a proper `exports` map and full TypeScript declarations.
28
+ - **Unit test suite** for the library (factory, service, decorators).
29
+ - **Documentation site** built with VitePress, plus this changelog and a migration guide.
30
+
31
+ ### Changed
32
+
33
+ - **CLI** rewritten with subcommands (`run`/`init`/`list`) and clearer, colorized output.
34
+ - **Logging** now uses the NestJS `Logger` instead of raw `console.*`.
35
+ - **Refresh** drops seeders in **reverse order** (foreign-key safe) before reseeding.
36
+ - **`drop()` is now optional** on the `Seeder` interface; seeders without it are skipped during refresh.
37
+ - **Factory overrides** now always appear in the generated record — including keys that are not
38
+ `@Factory` properties (e.g. a foreign key passed in a seeder).
39
+ - **`dependsOn`** is resolved transitively and is no longer sensitive to declaration order.
40
+ - **Build tooling** switched to `tsup`. Node `>= 18` is now required.
41
+ - `--dummyData` flag renamed to `--dummy-data` (the `options.dummyData` value is still delivered, deprecated).
42
+
43
+ ### Fixed
44
+
45
+ - Overrides for non-decorated properties were silently dropped, causing `NOT NULL` failures when
46
+ seeding relationships (e.g. `factory.generate(3, { authorId })`).
47
+ - Transitive `dependsOn` chains were not fully resolved.
48
+ - Generated property order was reversed relative to declaration order.
49
+ - Seeder selection mutated the shared options object in place.
50
+
51
+ ### Removed
52
+
53
+ - The bundled `examples/` directory and `seeder.config.example.ts` — replaced by the
54
+ [documentation site](https://ack-solutions.github.io/nest-seeder/) and the runnable example app.
55
+ - Deep imports of internal files (`@ackplus/nest-seeder/dist/lib/...`) are no longer supported;
56
+ import from the package root.
57
+
58
+ ## [1.1.16] - 2026-01-04
59
+
60
+ - Last release of the v1 line. Iterative fixes and packaging tweaks across the `1.1.x` series
61
+ (including the `1.1.15-beta.*` pre-releases).
62
+
63
+ [2.0.0]: https://github.com/ack-solutions/nest-seeder/releases/tag/2.0.0
64
+ [1.1.16]: https://github.com/ack-solutions/nest-seeder/releases/tag/1.1.16
package/MIGRATION.md ADDED
@@ -0,0 +1,89 @@
1
+ # Migrating from v1 to v2
2
+
3
+ `@ackplus/nest-seeder` v2 is a **focused redesign**. The core — the `@Factory` decorator, the
4
+ `Seeder` interface, and `DataFactory` — is unchanged, so most apps upgrade in a few minutes.
5
+ Breaking changes are concentrated in the **CLI**, **config ergonomics**, and **packaging**.
6
+
7
+ > 📖 Full, searchable guide: https://ack-solutions.github.io/nest-seeder/migration
8
+
9
+ ## TL;DR
10
+
11
+ 1. `npm install @ackplus/nest-seeder@^2`
12
+ 2. Replace your long seed script with `"seed": "nest-seed"`.
13
+ 3. Rename the `--dummyData` flag to `--dummy-data`.
14
+ 4. If your `drop()` uses `repository.delete({})`, switch to `repository.createQueryBuilder().delete().execute()`.
15
+
16
+ Everything else is optional polish.
17
+
18
+ ## At a glance
19
+
20
+ | Area | v1 | v2 |
21
+ | --- | --- | --- |
22
+ | Run command | `node -r ts-node/register … dist/cli.js -c ./seeder.config.ts` | `nest-seed` (config auto-detected) |
23
+ | `--config` | Required | Optional (auto-discovers `seeder.config.{ts,js,cjs,mjs}`) |
24
+ | Dummy-data flag | `--dummyData` | `--dummy-data` (or the new `--context`) |
25
+ | Scaffolding | none | `nest-seed init` |
26
+ | Inspect seeders | none | `nest-seed list` |
27
+ | Preview | none | `nest-seed --dry-run` |
28
+ | `drop()` | required | optional |
29
+ | Refresh drop order | same as list | reverse of list (foreign-key safe) |
30
+ | Build output | CommonJS only | Dual ESM + CJS with an `exports` map |
31
+
32
+ ## Steps
33
+
34
+ ### 1. Update the dependency
35
+
36
+ ```bash
37
+ npm install @ackplus/nest-seeder@^2 @faker-js/faker
38
+ npm install -D ts-node typescript # for .ts config files
39
+ ```
40
+
41
+ ### 2. Simplify your run script
42
+
43
+ ```json
44
+ {
45
+ "scripts": {
46
+ "seed": "nest-seed",
47
+ "seed:refresh": "nest-seed --refresh"
48
+ }
49
+ }
50
+ ```
51
+
52
+ The verbose v1 command still works; the `dist/cli.js` path is preserved.
53
+
54
+ ### 3. Rename the dummy-data flag
55
+
56
+ ```bash
57
+ nest-seed --dummy-data # was: --dummyData
58
+ ```
59
+
60
+ For new code prefer the general-purpose `--context '{ "size": "large" }'`, read via `options.context`.
61
+
62
+ ### 4. Fix your `drop()` (⚠️ important)
63
+
64
+ ```ts
65
+ // before — modern TypeORM throws "Empty criteria(s) are not allowed"
66
+ await this.userRepository.delete({});
67
+
68
+ // after
69
+ await this.userRepository.createQueryBuilder().delete().execute();
70
+ ```
71
+
72
+ Mongoose is unchanged: `await this.userModel.deleteMany({})`.
73
+
74
+ ### 5. Optional polish
75
+
76
+ - Wrap your config in `defineSeederConfig({ … })` for full type-checking.
77
+ - Add `@SeederName('users')` to seeders for stable `--name users` selection (run `nest-seed list` to verify).
78
+
79
+ ## Behavior changes
80
+
81
+ - **Overrides are always applied** — `factory.generate(3, { authorId })` now includes `authorId`
82
+ even though it isn't a `@Factory` field (v1 dropped it; this fixes relationship seeding).
83
+ - **`dependsOn` is transitive** and order-independent.
84
+ - **Factory inheritance works** — `extends` a base factory to reuse its fields.
85
+ - **Refresh drops in reverse order**; keep your seeder list parent-first.
86
+ - **`drop()` is optional**.
87
+ - **Deep imports** (`@ackplus/nest-seeder/dist/lib/...`) are gone — import from the package root.
88
+
89
+ Questions? https://github.com/ack-solutions/nest-seeder/issues
package/QUICKSTART.md CHANGED
@@ -1,45 +1,41 @@
1
- # ⚡ Quick Start - 5 Minutes to Seeding!
1
+ # ⚡ Quick Start
2
2
 
3
- Get started with `@ackplus/nest-seeder` in just 5 simple steps.
3
+ Get seeding with `@ackplus/nest-seeder` in a few minutes.
4
+ For the full guide, see **[ack-solutions.github.io/nest-seeder](https://ack-solutions.github.io/nest-seeder/guide/getting-started)**.
4
5
 
5
- ## 📦 Installation
6
+ ## Install
6
7
 
7
8
  ```bash
8
9
  npm install @ackplus/nest-seeder @faker-js/faker
9
- npm install -D ts-node typescript
10
+ npm install -D ts-node typescript # for .ts config files
10
11
  ```
11
12
 
12
- ## Step 1: Create an Entity
13
+ ## Scaffold (fastest)
13
14
 
14
- ```typescript
15
- // src/entities/user.entity.ts
16
- import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
17
-
18
- @Entity('users')
19
- export class User {
20
- @PrimaryGeneratedColumn()
21
- id: number;
15
+ ```bash
16
+ npx nest-seed init
17
+ ```
22
18
 
23
- @Column()
24
- name: string;
19
+ This creates `seeder.config.ts`, a factory, and a seeder. Point the config at your database, then:
25
20
 
26
- @Column({ unique: true })
27
- email: string;
21
+ ```json
22
+ { "scripts": { "seed": "nest-seed" } }
23
+ ```
28
24
 
29
- @Column({ default: 'user' })
30
- role: string;
31
- }
25
+ ```bash
26
+ npm run seed
32
27
  ```
33
28
 
34
- ## Step 2: Create a Factory
29
+ ## Or wire it up by hand
30
+
31
+ **1. Factory** — `src/database/factories/user.factory.ts`
35
32
 
36
- ```typescript
37
- // src/factories/user.factory.ts
33
+ ```ts
38
34
  import { Factory } from '@ackplus/nest-seeder';
39
35
 
40
36
  export class UserFactory {
41
- @Factory((faker) => faker.person.fullName())
42
- name: string;
37
+ @Factory((faker) => faker.person.firstName())
38
+ firstName: string;
43
39
 
44
40
  @Factory((faker) => faker.internet.email())
45
41
  email: string;
@@ -49,175 +45,62 @@ export class UserFactory {
49
45
  }
50
46
  ```
51
47
 
52
- ## Step 3: Create a Seeder
48
+ **2. Seeder** `src/database/seeders/user.seeder.ts`
53
49
 
54
- ```typescript
55
- // src/seeders/user.seeder.ts
50
+ ```ts
56
51
  import { Injectable } from '@nestjs/common';
57
52
  import { InjectRepository } from '@nestjs/typeorm';
58
53
  import { Repository } from 'typeorm';
59
- import { Seeder, DataFactory } from '@ackplus/nest-seeder';
54
+ import { Seeder, SeederName, DataFactory } from '@ackplus/nest-seeder';
60
55
  import { User } from '../entities/user.entity';
61
56
  import { UserFactory } from '../factories/user.factory';
62
57
 
63
58
  @Injectable()
59
+ @SeederName('users')
64
60
  export class UserSeeder implements Seeder {
65
61
  constructor(
66
- @InjectRepository(User)
67
- private readonly userRepository: Repository<User>,
62
+ @InjectRepository(User) private readonly userRepository: Repository<User>,
68
63
  ) {}
69
64
 
70
65
  async seed(): Promise<void> {
71
- const factory = DataFactory.createForClass(UserFactory);
72
- const users = factory.generate(10);
66
+ const users = DataFactory.createForClass(UserFactory).generate(10);
73
67
  await this.userRepository.save(users);
74
- console.log('✅ Seeded 10 users');
75
68
  }
76
69
 
77
70
  async drop(): Promise<void> {
78
- await this.userRepository.delete({});
71
+ await this.userRepository.createQueryBuilder().delete().execute();
79
72
  }
80
73
  }
81
74
  ```
82
75
 
83
- ## Step 4: Create Seeder Configuration
76
+ **3. Config** `seeder.config.ts`
84
77
 
85
- Create `seeder.config.ts` in your **project root**:
86
-
87
- > **Note:** The seeder configuration is independent and does not require importing your main `AppModule`.
88
-
89
- ```typescript
90
- // seeder.config.ts (in project root)
78
+ ```ts
91
79
  import { TypeOrmModule } from '@nestjs/typeorm';
92
- import { ConfigModule, ConfigService } from '@nestjs/config';
93
- import { User } from './src/entities/user.entity';
94
- import { UserSeeder } from './src/seeders/user.seeder';
95
- import * as dotenv from 'dotenv';
96
-
97
- dotenv.config();
80
+ import { defineSeederConfig } from '@ackplus/nest-seeder';
81
+ import { User } from './src/database/entities/user.entity';
82
+ import { UserSeeder } from './src/database/seeders/user.seeder';
98
83
 
99
- export default {
84
+ export default defineSeederConfig({
100
85
  imports: [
101
- ConfigModule.forRoot({
102
- isGlobal: true,
103
- }),
104
- TypeOrmModule.forRootAsync({
105
- imports: [ConfigModule],
106
- inject: [ConfigService],
107
- useFactory: (config: ConfigService) => ({
108
- type: 'postgres',
109
- host: config.get<string>('DB_HOST'),
110
- port: config.get<number>('DB_PORT'),
111
- username: config.get<string>('DB_USERNAME'),
112
- password: config.get<string>('DB_PASSWORD'),
113
- database: config.get<string>('DB_DATABASE'),
114
- entities: [User],
115
- synchronize: true,
116
- }),
117
- }),
86
+ TypeOrmModule.forRoot({ type: 'sqlite', database: 'db.sqlite', entities: [User], synchronize: true }),
118
87
  TypeOrmModule.forFeature([User]),
119
88
  ],
120
89
  seeders: [UserSeeder],
121
- };
90
+ });
122
91
  ```
123
92
 
124
- ## Step 5: Add Script & Run
125
-
126
- Add to `package.json`:
127
-
128
- ```json
129
- {
130
- "scripts": {
131
- "seed": "node -r ts-node/register -r tsconfig-paths/register ./node_modules/@ackplus/nest-seeder/dist/cli.js -c ./seeder.config.ts",
132
- "seed:refresh": "npm run seed -- --refresh"
133
- }
134
- }
135
- ```
136
-
137
- Run it:
93
+ **4. Run**
138
94
 
139
95
  ```bash
140
- npm run seed
141
- ```
142
-
143
- **Output:**
144
- ```
145
- 🌱 Starting NestJS Seeder...
146
- 📁 Loading configuration from: seeder.config.ts
147
- [Nest] Starting Nest application...
148
- [Nest] TypeOrmModule dependencies initialized
149
- ✅ Seeded 10 users
96
+ npm run seed # seed
97
+ npm run seed -- --refresh # drop (reverse order) then reseed
98
+ nest-seed list # see available seeders
150
99
  ```
151
100
 
152
- ## 🎉 Success!
153
-
154
- You've successfully seeded your database!
155
-
156
- ## 📚 Next Steps
157
-
158
- ### Run with options:
159
-
160
- ```bash
161
- # Drop and reseed
162
- npm run seed:refresh
163
-
164
- # Run specific seeder
165
- npm run seed -- --name UserSeeder
166
-
167
- # With dummy data flag
168
- npm run seed -- --dummyData
169
- ```
170
-
171
- ### Add More Seeders
172
-
173
- 1. Create more factories and seeders
174
- 2. Add them to `seeder.config.ts`:
175
-
176
- ```typescript
177
- export default {
178
- imports: [/* ... */],
179
- seeders: [
180
- UserSeeder,
181
- PostSeeder,
182
- CommentSeeder,
183
- ],
184
- };
185
- ```
186
-
187
- ### Watch Mode for Development
188
-
189
- Add to `package.json`:
190
-
191
- ```json
192
- {
193
- "scripts": {
194
- "seed:watch": "nodemon --watch src/seeders --watch src/factories --ext ts --exec \"npm run seed\""
195
- }
196
- }
197
- ```
198
-
199
- Run:
200
-
201
- ```bash
202
- npm run seed:watch
203
- ```
204
-
205
- Now your database will auto-reseed when you modify seeders or factories!
206
-
207
- ## 💡 Tips
208
-
209
- - **Start small**: Begin with one entity, then add more
210
- - **Use factories**: They make generating data super easy
211
- - **Order matters**: List seeders in dependency order
212
- - **Drop method**: Always implement drop() to clear data
213
- - **Environment variables**: Use them for database config
214
-
215
- ## 🔗 Resources
216
-
217
- - [Full Documentation](./README.md)
218
- - [Examples Directory](./examples/)
219
- - [GitHub Repository](https://github.com/ackplus/nest-seeder)
220
-
221
- ---
101
+ ## Next steps
222
102
 
223
- Ready to seed! 🌱
103
+ - [Factories](https://ack-solutions.github.io/nest-seeder/guide/factories)
104
+ - [Seeders](https://ack-solutions.github.io/nest-seeder/guide/seeders)
105
+ - [CLI reference](https://ack-solutions.github.io/nest-seeder/guide/cli)
106
+ - [Migration v1 → v2](https://ack-solutions.github.io/nest-seeder/migration)