@ackplus/nest-seeder 1.1.17 → 2.1.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 +90 -0
  2. package/MIGRATION.md +89 -0
  3. package/QUICKSTART.md +45 -149
  4. package/README.md +87 -521
  5. package/dist/cli.js +617 -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/CHANGELOG.md ADDED
@@ -0,0 +1,90 @@
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.1.0] - 2026-06-15
9
+
10
+ ### Added
11
+
12
+ - **`--project` / `-p`** CLI flag (and the `TS_NODE_PROJECT` environment variable) to point the
13
+ CLI's ts-node registration at your own `tsconfig.json`. Previously the CLI used
14
+ `skipProject: true`, so there was no clean way to control the compiler options used to load
15
+ `.ts` config files and entities.
16
+
17
+ ### Changed
18
+
19
+ - The CLI's default ts-node registration now uses **`strict: true`** (was `strict: false`), matching
20
+ how application code is normally compiled. With `strictNullChecks` disabled, some TypeScript
21
+ versions emit `design:type = Object` for string-literal-union columns (e.g.
22
+ `visibility: 'committee' | 'all-members'` with no explicit `@Column` type), which makes TypeORM
23
+ throw `DataTypeNotSupportedError: Data type "Object" … is not supported` on Postgres/MySQL — even
24
+ though the same entities compile fine under the app's own `strict` build. Pass
25
+ `--project ./tsconfig.json` (or set `TS_NODE_PROJECT`) to override.
26
+
27
+ ### Notes
28
+
29
+ - The version-independent fix is to give enum/union columns an explicit column type, e.g.
30
+ `@Column({ type: 'varchar' })`, so TypeORM never relies on reflect-metadata inference. Thanks to
31
+ the reporter for the detailed analysis.
32
+
33
+ ## [2.0.0] - 2026-06-15
34
+
35
+ A focused redesign that keeps the proven core (`@Factory`, `Seeder`, `DataFactory`) while
36
+ overhauling the CLI, configuration ergonomics, packaging, and documentation.
37
+
38
+ See the [Migration Guide](https://ack-solutions.github.io/nest-seeder/migration) for upgrade steps.
39
+
40
+ ### Added
41
+
42
+ - **`nest-seed init`** — scaffolds a `seeder.config.ts`, a factory, and a seeder (`--orm typeorm|mongoose`, `--force`).
43
+ - **`nest-seed list`** — lists registered seeders and their `--name` aliases.
44
+ - **Config auto-discovery** — the CLI finds `seeder.config.{ts,js,cjs,mjs}` automatically; `--config` is now optional.
45
+ - **`--dry-run`** — preview which seeders would run without writing data.
46
+ - **`--continue-on-error`** — keep going when a seeder throws instead of aborting.
47
+ - **`--context <json>`** — forward arbitrary JSON to every seeder via `options.context`.
48
+ - **`@SeederName('name')`** decorator and `getSeederName()` helper for stable, minification-safe seeder names.
49
+ - **`defineSeederConfig()`** — a typed identity helper for `seeder.config.ts`.
50
+ - **`DataFactory` `generateOne()`** convenience method.
51
+ - **Factory inheritance** — a factory that `extends` a base factory inherits its `@Factory` properties.
52
+ - **Dual ESM + CJS build** with a proper `exports` map and full TypeScript declarations.
53
+ - **Unit test suite** for the library (factory, service, decorators).
54
+ - **Documentation site** built with VitePress, plus this changelog and a migration guide.
55
+
56
+ ### Changed
57
+
58
+ - **CLI** rewritten with subcommands (`run`/`init`/`list`) and clearer, colorized output.
59
+ - **Logging** now uses the NestJS `Logger` instead of raw `console.*`.
60
+ - **Refresh** drops seeders in **reverse order** (foreign-key safe) before reseeding.
61
+ - **`drop()` is now optional** on the `Seeder` interface; seeders without it are skipped during refresh.
62
+ - **Factory overrides** now always appear in the generated record — including keys that are not
63
+ `@Factory` properties (e.g. a foreign key passed in a seeder).
64
+ - **`dependsOn`** is resolved transitively and is no longer sensitive to declaration order.
65
+ - **Build tooling** switched to `tsup`. Node `>= 18` is now required.
66
+ - `--dummyData` flag renamed to `--dummy-data` (the `options.dummyData` value is still delivered, deprecated).
67
+
68
+ ### Fixed
69
+
70
+ - Overrides for non-decorated properties were silently dropped, causing `NOT NULL` failures when
71
+ seeding relationships (e.g. `factory.generate(3, { authorId })`).
72
+ - Transitive `dependsOn` chains were not fully resolved.
73
+ - Generated property order was reversed relative to declaration order.
74
+ - Seeder selection mutated the shared options object in place.
75
+
76
+ ### Removed
77
+
78
+ - The bundled `examples/` directory and `seeder.config.example.ts` — replaced by the
79
+ [documentation site](https://ack-solutions.github.io/nest-seeder/) and the runnable example app.
80
+ - Deep imports of internal files (`@ackplus/nest-seeder/dist/lib/...`) are no longer supported;
81
+ import from the package root.
82
+
83
+ ## [1.1.16] - 2026-01-04
84
+
85
+ - Last release of the v1 line. Iterative fixes and packaging tweaks across the `1.1.x` series
86
+ (including the `1.1.15-beta.*` pre-releases).
87
+
88
+ [2.1.0]: https://github.com/ack-solutions/nest-seeder/releases/tag/2.1.0
89
+ [2.0.0]: https://github.com/ack-solutions/nest-seeder/releases/tag/2.0.0
90
+ [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,162 +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
- ```typescript
88
- // seeder.config.ts (in project root)
78
+ ```ts
89
79
  import { TypeOrmModule } from '@nestjs/typeorm';
90
- import { User } from './src/entities/user.entity';
91
- import { UserSeeder } from './src/seeders/user.seeder';
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';
92
83
 
93
- export default {
84
+ export default defineSeederConfig({
94
85
  imports: [
95
- TypeOrmModule.forRoot({
96
- type: 'postgres',
97
- host: 'localhost',
98
- port: 5432,
99
- username: 'postgres',
100
- password: 'postgres',
101
- database: 'mydb',
102
- entities: [User],
103
- synchronize: true,
104
- }),
86
+ TypeOrmModule.forRoot({ type: 'sqlite', database: 'db.sqlite', entities: [User], synchronize: true }),
105
87
  TypeOrmModule.forFeature([User]),
106
88
  ],
107
89
  seeders: [UserSeeder],
108
- };
90
+ });
109
91
  ```
110
92
 
111
- ## Step 5: Add Script & Run
112
-
113
- Add to `package.json`:
114
-
115
- ```json
116
- {
117
- "scripts": {
118
- "seed": "nest-seed -c seeder.config.ts",
119
- "seed:refresh": "nest-seed -c seeder.config.ts --refresh"
120
- }
121
- }
122
- ```
123
-
124
- Run it:
93
+ **4. Run**
125
94
 
126
95
  ```bash
127
- npm run seed
96
+ npm run seed # seed
97
+ npm run seed -- --refresh # drop (reverse order) then reseed
98
+ nest-seed list # see available seeders
128
99
  ```
129
100
 
130
- **Output:**
131
- ```
132
- 🌱 Starting NestJS Seeder...
133
- 📁 Loading configuration from: seeder.config.ts
134
- [Nest] Starting Nest application...
135
- [Nest] TypeOrmModule dependencies initialized
136
- ✅ Seeded 10 users
137
- ```
138
-
139
- ## 🎉 Success!
140
-
141
- You've successfully seeded your database!
142
-
143
- ## 📚 Next Steps
144
-
145
- ### Run with options:
146
-
147
- ```bash
148
- # Drop and reseed
149
- npm run seed:refresh
150
-
151
- # Run specific seeder
152
- npm run seed -- --name UserSeeder
153
-
154
- # With dummy data flag
155
- npm run seed -- --dummyData
156
- ```
157
-
158
- ### Add More Seeders
159
-
160
- 1. Create more factories and seeders
161
- 2. Add them to `seeder.config.ts`:
162
-
163
- ```typescript
164
- export default {
165
- imports: [/* ... */],
166
- seeders: [
167
- UserSeeder,
168
- PostSeeder,
169
- CommentSeeder,
170
- ],
171
- };
172
- ```
173
-
174
- ### Watch Mode for Development
175
-
176
- Add to `package.json`:
177
-
178
- ```json
179
- {
180
- "scripts": {
181
- "seed:watch": "nodemon --watch src/seeders --watch src/factories --ext ts --exec nest-seed -c seeder.config.ts"
182
- }
183
- }
184
- ```
185
-
186
- Run:
187
-
188
- ```bash
189
- npm run seed:watch
190
- ```
191
-
192
- Now your database will auto-reseed when you modify seeders or factories!
193
-
194
- ## 💡 Tips
195
-
196
- - **Start small**: Begin with one entity, then add more
197
- - **Use factories**: They make generating data super easy
198
- - **Order matters**: List seeders in dependency order
199
- - **Drop method**: Always implement drop() to clear data
200
- - **Environment variables**: Use them for database config
201
-
202
- ## 🔗 Resources
203
-
204
- - [Full Documentation](./README.md)
205
- - [Examples Directory](./examples/)
206
- - [GitHub Repository](https://github.com/ackplus/nest-seeder)
207
-
208
- ---
101
+ ## Next steps
209
102
 
210
- 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)