@ackplus/nest-dynamic-templates 1.1.9 → 1.1.10

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 (157) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +611 -6
  3. package/{src → dist}/index.d.ts +0 -1
  4. package/dist/index.js +36 -0
  5. package/dist/index.js.map +1 -0
  6. package/{src → dist}/lib/constant.d.ts +0 -1
  7. package/{src → dist}/lib/constant.js +1 -0
  8. package/dist/lib/constant.js.map +1 -0
  9. package/{src → dist}/lib/dto/create-template-layout.dto.d.ts +0 -1
  10. package/{src → dist}/lib/dto/create-template-layout.dto.js +46 -31
  11. package/dist/lib/dto/create-template-layout.dto.js.map +1 -0
  12. package/{src → dist}/lib/dto/create-template.dto.d.ts +0 -1
  13. package/{src → dist}/lib/dto/create-template.dto.js +52 -35
  14. package/dist/lib/dto/create-template.dto.js.map +1 -0
  15. package/{src → dist}/lib/dto/render-content-template-layout.dto.d.ts +0 -1
  16. package/{src → dist}/lib/dto/render-content-template-layout.dto.js +22 -9
  17. package/dist/lib/dto/render-content-template-layout.dto.js.map +1 -0
  18. package/{src → dist}/lib/dto/render-content-template.dto.d.ts +0 -1
  19. package/{src → dist}/lib/dto/render-content-template.dto.js +25 -11
  20. package/dist/lib/dto/render-content-template.dto.js.map +1 -0
  21. package/{src → dist}/lib/dto/render-template-layout.dto.d.ts +0 -1
  22. package/{src → dist}/lib/dto/render-template-layout.dto.js +28 -16
  23. package/dist/lib/dto/render-template-layout.dto.js.map +1 -0
  24. package/{src → dist}/lib/dto/render-template.dto.d.ts +0 -1
  25. package/{src → dist}/lib/dto/render-template.dto.js +37 -23
  26. package/dist/lib/dto/render-template.dto.js.map +1 -0
  27. package/{src → dist}/lib/dto/template-filter.dto.d.ts +0 -1
  28. package/{src → dist}/lib/dto/template-filter.dto.js +25 -11
  29. package/dist/lib/dto/template-filter.dto.js.map +1 -0
  30. package/{src → dist}/lib/dto/template-layout-filter.dto.d.ts +0 -1
  31. package/{src → dist}/lib/dto/template-layout-filter.dto.js +25 -11
  32. package/dist/lib/dto/template-layout-filter.dto.js.map +1 -0
  33. package/{src → dist}/lib/engines/language/html.engine.d.ts +0 -1
  34. package/dist/lib/engines/language/html.engine.js +47 -0
  35. package/dist/lib/engines/language/html.engine.js.map +1 -0
  36. package/{src → dist}/lib/engines/language/index.d.ts +0 -1
  37. package/{src → dist}/lib/engines/language/index.js +1 -0
  38. package/dist/lib/engines/language/index.js.map +1 -0
  39. package/{src → dist}/lib/engines/language/markdown.engine.d.ts +0 -1
  40. package/dist/lib/engines/language/markdown.engine.js +35 -0
  41. package/dist/lib/engines/language/markdown.engine.js.map +1 -0
  42. package/{src → dist}/lib/engines/language/mjml.engine.d.ts +0 -1
  43. package/dist/lib/engines/language/mjml.engine.js +43 -0
  44. package/dist/lib/engines/language/mjml.engine.js.map +1 -0
  45. package/{src → dist}/lib/engines/language/text.engine.d.ts +0 -1
  46. package/{src → dist}/lib/engines/language/text.engine.js +2 -1
  47. package/dist/lib/engines/language/text.engine.js.map +1 -0
  48. package/{src → dist}/lib/engines/language-engine.d.ts +0 -1
  49. package/{src → dist}/lib/engines/language-engine.js +2 -0
  50. package/dist/lib/engines/language-engine.js.map +1 -0
  51. package/{src → dist}/lib/engines/template/ejs.engine.d.ts +0 -1
  52. package/dist/lib/engines/template/ejs.engine.js +34 -0
  53. package/dist/lib/engines/template/ejs.engine.js.map +1 -0
  54. package/{src → dist}/lib/engines/template/handlebars.engine.d.ts +0 -1
  55. package/dist/lib/engines/template/handlebars.engine.js +35 -0
  56. package/dist/lib/engines/template/handlebars.engine.js.map +1 -0
  57. package/{src → dist}/lib/engines/template/index.d.ts +0 -1
  58. package/{src → dist}/lib/engines/template/index.js +1 -0
  59. package/dist/lib/engines/template/index.js.map +1 -0
  60. package/{src → dist}/lib/engines/template/nunjucks.engine.d.ts +1 -2
  61. package/{src → dist}/lib/engines/template/nunjucks.engine.js +5 -3
  62. package/dist/lib/engines/template/nunjucks.engine.js.map +1 -0
  63. package/{src → dist}/lib/engines/template/pug.engine.d.ts +1 -2
  64. package/dist/lib/engines/template/pug.engine.js +44 -0
  65. package/dist/lib/engines/template/pug.engine.js.map +1 -0
  66. package/{src → dist}/lib/engines/template-engine.d.ts +0 -1
  67. package/{src → dist}/lib/engines/template-engine.js +2 -0
  68. package/dist/lib/engines/template-engine.js.map +1 -0
  69. package/{src → dist}/lib/entities/template-layout.entity.d.ts +0 -1
  70. package/{src → dist}/lib/entities/template-layout.entity.js +59 -34
  71. package/dist/lib/entities/template-layout.entity.js.map +1 -0
  72. package/{src → dist}/lib/entities/template.entity.d.ts +0 -1
  73. package/{src → dist}/lib/entities/template.entity.js +62 -36
  74. package/dist/lib/entities/template.entity.js.map +1 -0
  75. package/{src → dist}/lib/errors/template.errors.d.ts +0 -1
  76. package/{src → dist}/lib/errors/template.errors.js +1 -0
  77. package/dist/lib/errors/template.errors.js.map +1 -0
  78. package/{src → dist}/lib/interfaces/module-config.interface.d.ts +0 -7
  79. package/{src → dist}/lib/interfaces/module-config.interface.js +1 -0
  80. package/dist/lib/interfaces/module-config.interface.js.map +1 -0
  81. package/{src → dist}/lib/interfaces/template.types.d.ts +0 -1
  82. package/{src → dist}/lib/interfaces/template.types.js +1 -0
  83. package/dist/lib/interfaces/template.types.js.map +1 -0
  84. package/{src → dist}/lib/nest-dynamic-templates.module.d.ts +0 -1
  85. package/{src → dist}/lib/nest-dynamic-templates.module.js +15 -6
  86. package/dist/lib/nest-dynamic-templates.module.js.map +1 -0
  87. package/{src → dist}/lib/services/template-config.service.d.ts +0 -37
  88. package/{src → dist}/lib/services/template-config.service.js +15 -44
  89. package/dist/lib/services/template-config.service.js.map +1 -0
  90. package/{src → dist}/lib/services/template-engine.registry.d.ts +0 -1
  91. package/{src → dist}/lib/services/template-engine.registry.js +15 -5
  92. package/dist/lib/services/template-engine.registry.js.map +1 -0
  93. package/{src → dist}/lib/services/template-layout.service.d.ts +0 -13
  94. package/{src → dist}/lib/services/template-layout.service.js +19 -48
  95. package/dist/lib/services/template-layout.service.js.map +1 -0
  96. package/{src → dist}/lib/services/template.service.d.ts +0 -13
  97. package/{src → dist}/lib/services/template.service.js +20 -51
  98. package/dist/lib/services/template.service.js.map +1 -0
  99. package/{src → dist}/test/helpers.d.ts +0 -1
  100. package/{src → dist}/test/helpers.js +1 -0
  101. package/dist/test/helpers.js.map +1 -0
  102. package/{src → dist}/test/test-database.config.d.ts +0 -1
  103. package/{src → dist}/test/test-database.config.js +3 -2
  104. package/dist/test/test-database.config.js.map +1 -0
  105. package/{src → dist}/test/test.setup.d.ts +0 -1
  106. package/{src → dist}/test/test.setup.js +1 -2
  107. package/dist/test/test.setup.js.map +1 -0
  108. package/dist/tsconfig.build.tsbuildinfo +1 -0
  109. package/examples/post.seeder.example.ts +65 -0
  110. package/examples/product.factory.example.ts +84 -0
  111. package/examples/seed.script.example.ts +32 -0
  112. package/examples/seeder.config.example.ts +50 -0
  113. package/examples/user.factory.example.ts +59 -0
  114. package/examples/user.seeder.example.ts +55 -0
  115. package/package.json +167 -6
  116. package/src/index.d.ts.map +0 -1
  117. package/src/index.js +0 -25
  118. package/src/lib/constant.d.ts.map +0 -1
  119. package/src/lib/dto/create-template-layout.dto.d.ts.map +0 -1
  120. package/src/lib/dto/create-template.dto.d.ts.map +0 -1
  121. package/src/lib/dto/render-content-template-layout.dto.d.ts.map +0 -1
  122. package/src/lib/dto/render-content-template.dto.d.ts.map +0 -1
  123. package/src/lib/dto/render-template-layout.dto.d.ts.map +0 -1
  124. package/src/lib/dto/render-template.dto.d.ts.map +0 -1
  125. package/src/lib/dto/template-filter.dto.d.ts.map +0 -1
  126. package/src/lib/dto/template-layout-filter.dto.d.ts.map +0 -1
  127. package/src/lib/engines/language/html.engine.d.ts.map +0 -1
  128. package/src/lib/engines/language/html.engine.js +0 -80
  129. package/src/lib/engines/language/index.d.ts.map +0 -1
  130. package/src/lib/engines/language/markdown.engine.d.ts.map +0 -1
  131. package/src/lib/engines/language/markdown.engine.js +0 -39
  132. package/src/lib/engines/language/mjml.engine.d.ts.map +0 -1
  133. package/src/lib/engines/language/mjml.engine.js +0 -75
  134. package/src/lib/engines/language/text.engine.d.ts.map +0 -1
  135. package/src/lib/engines/language-engine.d.ts.map +0 -1
  136. package/src/lib/engines/template/ejs.engine.d.ts.map +0 -1
  137. package/src/lib/engines/template/ejs.engine.js +0 -65
  138. package/src/lib/engines/template/handlebars.engine.d.ts.map +0 -1
  139. package/src/lib/engines/template/handlebars.engine.js +0 -66
  140. package/src/lib/engines/template/index.d.ts.map +0 -1
  141. package/src/lib/engines/template/nunjucks.engine.d.ts.map +0 -1
  142. package/src/lib/engines/template/pug.engine.d.ts.map +0 -1
  143. package/src/lib/engines/template/pug.engine.js +0 -74
  144. package/src/lib/engines/template-engine.d.ts.map +0 -1
  145. package/src/lib/entities/template-layout.entity.d.ts.map +0 -1
  146. package/src/lib/entities/template.entity.d.ts.map +0 -1
  147. package/src/lib/errors/template.errors.d.ts.map +0 -1
  148. package/src/lib/interfaces/module-config.interface.d.ts.map +0 -1
  149. package/src/lib/interfaces/template.types.d.ts.map +0 -1
  150. package/src/lib/nest-dynamic-templates.module.d.ts.map +0 -1
  151. package/src/lib/services/template-config.service.d.ts.map +0 -1
  152. package/src/lib/services/template-engine.registry.d.ts.map +0 -1
  153. package/src/lib/services/template-layout.service.d.ts.map +0 -1
  154. package/src/lib/services/template.service.d.ts.map +0 -1
  155. package/src/test/helpers.d.ts.map +0 -1
  156. package/src/test/test-database.config.d.ts.map +0 -1
  157. package/src/test/test.setup.d.ts.map +0 -1
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 AckPlus
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md CHANGED
@@ -1,11 +1,616 @@
1
- # nest-auth
1
+ # @ackplus/nest-dynamic-templates
2
2
 
3
- This library was generated with [Nx](https://nx.dev).
3
+ A powerful and flexible database seeding library for NestJS applications with support for factories, data generation using Faker.js, and CLI commands.
4
4
 
5
- ## Building
5
+ ## ✨ Features
6
6
 
7
- Run `nx build nest-auth` to build the library.
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
8
15
 
9
- ## Running unit tests
16
+ ## 📦 Installation
10
17
 
11
- Run `nx test nest-auth` to execute the unit tests via [Jest](https://jestjs.io).
18
+ ```bash
19
+ npm install @ackplus/nest-dynamic-templates @faker-js/faker
20
+ # or
21
+ pnpm add @ackplus/nest-dynamic-templates @faker-js/faker
22
+ # or
23
+ yarn add @ackplus/nest-dynamic-templates @faker-js/faker
24
+ ```
25
+
26
+ **For TypeScript config files**, also install:
27
+
28
+ ```bash
29
+ npm install -D ts-node typescript
30
+ ```
31
+
32
+ ## 🚀 Quick Start (5 Steps)
33
+
34
+ ### Step 1: Create Entity
35
+
36
+ ```typescript
37
+ // src/entities/user.entity.ts
38
+ import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
39
+
40
+ @Entity('users')
41
+ export class User {
42
+ @PrimaryGeneratedColumn()
43
+ id: number;
44
+
45
+ @Column()
46
+ name: string;
47
+
48
+ @Column({ unique: true })
49
+ email: string;
50
+
51
+ @Column()
52
+ role: string;
53
+ }
54
+ ```
55
+
56
+ ### Step 2: Create Factory
57
+
58
+ ```typescript
59
+ // src/factories/user.factory.ts
60
+ import { Factory } from '@ackplus/nest-dynamic-templates';
61
+
62
+ export class UserFactory {
63
+ @Factory((faker) => faker.person.fullName())
64
+ name: string;
65
+
66
+ @Factory((faker) => faker.internet.email())
67
+ email: string;
68
+
69
+ @Factory((faker) => faker.helpers.arrayElement(['admin', 'user', 'guest']))
70
+ role: string;
71
+ }
72
+ ```
73
+
74
+ ### Step 3: Create Seeder
75
+
76
+ ```typescript
77
+ // src/seeders/user.seeder.ts
78
+ import { Injectable } from '@nestjs/common';
79
+ import { InjectRepository } from '@nestjs/typeorm';
80
+ import { Repository } from 'typeorm';
81
+ import { Seeder, DataFactory } from '@ackplus/nest-dynamic-templates';
82
+ import { User } from '../entities/user.entity';
83
+ import { UserFactory } from '../factories/user.factory';
84
+
85
+ @Injectable()
86
+ export class UserSeeder implements Seeder {
87
+ constructor(
88
+ @InjectRepository(User)
89
+ private readonly userRepository: Repository<User>,
90
+ ) {}
91
+
92
+ async seed(): Promise<void> {
93
+ // Create factory instance
94
+ const factory = DataFactory.createForClass(UserFactory);
95
+
96
+ // Generate 10 users
97
+ const users = factory.generate(10);
98
+
99
+ // Save to database
100
+ await this.userRepository.save(users);
101
+
102
+ console.log('✅ Seeded 10 users');
103
+ }
104
+
105
+ async drop(): Promise<void> {
106
+ // Clear all users
107
+ await this.userRepository.delete({});
108
+
109
+ console.log('🗑️ Dropped all users');
110
+ }
111
+ }
112
+ ```
113
+
114
+ ### Step 4: Create Configuration File
115
+
116
+ Create `seeder.config.ts` in your **project root**:
117
+
118
+ ```typescript
119
+ // seeder.config.ts
120
+ import { TypeOrmModule } from '@nestjs/typeorm';
121
+ import { User } from './src/entities/user.entity';
122
+ import { UserSeeder } from './src/seeders/user.seeder';
123
+
124
+ export default {
125
+ imports: [
126
+ // Database configuration
127
+ TypeOrmModule.forRoot({
128
+ type: 'postgres',
129
+ host: 'localhost',
130
+ port: 5432,
131
+ username: 'postgres',
132
+ password: 'postgres',
133
+ database: 'mydb',
134
+ entities: [User],
135
+ synchronize: true,
136
+ }),
137
+
138
+ // Register repositories
139
+ TypeOrmModule.forFeature([User]),
140
+ ],
141
+
142
+ // List seeders (run in order)
143
+ seeders: [UserSeeder],
144
+ };
145
+ ```
146
+
147
+ ### Step 5: Run Seeder
148
+
149
+ Add script to `package.json`:
150
+
151
+ ```json
152
+ {
153
+ "scripts": {
154
+ "seed": "nest-seed -c seeder.config.ts"
155
+ }
156
+ }
157
+ ```
158
+
159
+ Run it:
160
+
161
+ ```bash
162
+ npm run seed
163
+ ```
164
+
165
+ **That's it!** Your database is now seeded! 🎉
166
+
167
+ ## 🖥️ CLI Commands
168
+
169
+ ### Basic Usage
170
+
171
+ ```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
183
+ ```
184
+
185
+ ### Available Options
186
+
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 | |
194
+
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-dynamic-templates';
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-dynamic-templates';
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-dynamic-templates';
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-dynamic-templates';
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-dynamic-templates';
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-dynamic-templates';
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-dynamic-templates';
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
+ ```
592
+
593
+ ## 🤝 Contributing
594
+
595
+ Contributions are welcome! Please feel free to submit a Pull Request.
596
+
597
+ ## 📄 License
598
+
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-dynamic-templates/issues)
611
+ - Check the [examples](./examples/) directory
612
+ - Review the [Quick Start Guide](./QUICKSTART.md)
613
+
614
+ ---
615
+
616
+ Made with ❤️ for the NestJS community
@@ -12,4 +12,3 @@ export * from './lib/dto/create-template-layout.dto';
12
12
  export * from './lib/dto/render-template-layout.dto';
13
13
  export * from './lib/dto/template-layout-filter.dto';
14
14
  export declare const NestDynamicTemplatesEntities: (typeof NestDynamicTemplateLayout)[];
15
- //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.NestDynamicTemplatesEntities = void 0;
18
+ const template_layout_entity_1 = require("./lib/entities/template-layout.entity");
19
+ const template_entity_1 = require("./lib/entities/template.entity");
20
+ __exportStar(require("./lib/nest-dynamic-templates.module"), exports);
21
+ __exportStar(require("./lib/services/template.service"), exports);
22
+ __exportStar(require("./lib/services/template-layout.service"), exports);
23
+ __exportStar(require("./lib/services/template-config.service"), exports);
24
+ __exportStar(require("./lib/interfaces/module-config.interface"), exports);
25
+ __exportStar(require("./lib/interfaces/template.types"), exports);
26
+ __exportStar(require("./lib/dto/create-template.dto"), exports);
27
+ __exportStar(require("./lib/dto/render-template.dto"), exports);
28
+ __exportStar(require("./lib/dto/template-filter.dto"), exports);
29
+ __exportStar(require("./lib/dto/create-template-layout.dto"), exports);
30
+ __exportStar(require("./lib/dto/render-template-layout.dto"), exports);
31
+ __exportStar(require("./lib/dto/template-layout-filter.dto"), exports);
32
+ exports.NestDynamicTemplatesEntities = [
33
+ template_entity_1.NestDynamicTemplate,
34
+ template_layout_entity_1.NestDynamicTemplateLayout,
35
+ ];
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,kFAAkF;AAClF,oEAAqE;AAErE,sEAAoD;AAGpD,kEAAgD;AAChD,yEAAuD;AACvD,yEAAuD;AAGvD,2EAAyD;AACzD,kEAAgD;AAGhD,gEAA8C;AAC9C,gEAA8C;AAC9C,gEAA8C;AAC9C,uEAAqD;AACrD,uEAAqD;AACrD,uEAAqD;AAGxC,QAAA,4BAA4B,GAAG;IACxC,qCAAmB;IACnB,kDAAyB;CAC5B,CAAC"}
@@ -1,3 +1,2 @@
1
1
  export declare const NEST_DYNAMIC_TEMPLATES_MODULE_CONFIG: unique symbol;
2
2
  export declare const NEST_DYNAMIC_TEMPLATES_ASYNC_OPTIONS_PROVIDER = "NEST_DYNAMIC_TEMPLATES_ASYNC_OPTIONS_PROVIDER";
3
- //# sourceMappingURL=constant.d.ts.map
@@ -3,3 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NEST_DYNAMIC_TEMPLATES_ASYNC_OPTIONS_PROVIDER = exports.NEST_DYNAMIC_TEMPLATES_MODULE_CONFIG = void 0;
4
4
  exports.NEST_DYNAMIC_TEMPLATES_MODULE_CONFIG = Symbol('NEST_DYNAMIC_TEMPLATES_MODULE_CONFIG');
5
5
  exports.NEST_DYNAMIC_TEMPLATES_ASYNC_OPTIONS_PROVIDER = 'NEST_DYNAMIC_TEMPLATES_ASYNC_OPTIONS_PROVIDER';
6
+ //# sourceMappingURL=constant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constant.js","sourceRoot":"","sources":["../../src/lib/constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,oCAAoC,GAAG,MAAM,CAAC,sCAAsC,CAAC,CAAC;AACtF,QAAA,6CAA6C,GAAG,+CAA+C,CAAC"}
@@ -13,4 +13,3 @@ export declare class CreateTemplateLayoutDto {
13
13
  previewContext?: Record<string, any>;
14
14
  isActive?: boolean;
15
15
  }
16
- //# sourceMappingURL=create-template-layout.dto.d.ts.map