@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.
- package/LICENSE +22 -0
- package/README.md +611 -6
- package/{src → dist}/index.d.ts +0 -1
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/{src → dist}/lib/constant.d.ts +0 -1
- package/{src → dist}/lib/constant.js +1 -0
- package/dist/lib/constant.js.map +1 -0
- package/{src → dist}/lib/dto/create-template-layout.dto.d.ts +0 -1
- package/{src → dist}/lib/dto/create-template-layout.dto.js +46 -31
- package/dist/lib/dto/create-template-layout.dto.js.map +1 -0
- package/{src → dist}/lib/dto/create-template.dto.d.ts +0 -1
- package/{src → dist}/lib/dto/create-template.dto.js +52 -35
- package/dist/lib/dto/create-template.dto.js.map +1 -0
- package/{src → dist}/lib/dto/render-content-template-layout.dto.d.ts +0 -1
- package/{src → dist}/lib/dto/render-content-template-layout.dto.js +22 -9
- package/dist/lib/dto/render-content-template-layout.dto.js.map +1 -0
- package/{src → dist}/lib/dto/render-content-template.dto.d.ts +0 -1
- package/{src → dist}/lib/dto/render-content-template.dto.js +25 -11
- package/dist/lib/dto/render-content-template.dto.js.map +1 -0
- package/{src → dist}/lib/dto/render-template-layout.dto.d.ts +0 -1
- package/{src → dist}/lib/dto/render-template-layout.dto.js +28 -16
- package/dist/lib/dto/render-template-layout.dto.js.map +1 -0
- package/{src → dist}/lib/dto/render-template.dto.d.ts +0 -1
- package/{src → dist}/lib/dto/render-template.dto.js +37 -23
- package/dist/lib/dto/render-template.dto.js.map +1 -0
- package/{src → dist}/lib/dto/template-filter.dto.d.ts +0 -1
- package/{src → dist}/lib/dto/template-filter.dto.js +25 -11
- package/dist/lib/dto/template-filter.dto.js.map +1 -0
- package/{src → dist}/lib/dto/template-layout-filter.dto.d.ts +0 -1
- package/{src → dist}/lib/dto/template-layout-filter.dto.js +25 -11
- package/dist/lib/dto/template-layout-filter.dto.js.map +1 -0
- package/{src → dist}/lib/engines/language/html.engine.d.ts +0 -1
- package/dist/lib/engines/language/html.engine.js +47 -0
- package/dist/lib/engines/language/html.engine.js.map +1 -0
- package/{src → dist}/lib/engines/language/index.d.ts +0 -1
- package/{src → dist}/lib/engines/language/index.js +1 -0
- package/dist/lib/engines/language/index.js.map +1 -0
- package/{src → dist}/lib/engines/language/markdown.engine.d.ts +0 -1
- package/dist/lib/engines/language/markdown.engine.js +35 -0
- package/dist/lib/engines/language/markdown.engine.js.map +1 -0
- package/{src → dist}/lib/engines/language/mjml.engine.d.ts +0 -1
- package/dist/lib/engines/language/mjml.engine.js +43 -0
- package/dist/lib/engines/language/mjml.engine.js.map +1 -0
- package/{src → dist}/lib/engines/language/text.engine.d.ts +0 -1
- package/{src → dist}/lib/engines/language/text.engine.js +2 -1
- package/dist/lib/engines/language/text.engine.js.map +1 -0
- package/{src → dist}/lib/engines/language-engine.d.ts +0 -1
- package/{src → dist}/lib/engines/language-engine.js +2 -0
- package/dist/lib/engines/language-engine.js.map +1 -0
- package/{src → dist}/lib/engines/template/ejs.engine.d.ts +0 -1
- package/dist/lib/engines/template/ejs.engine.js +34 -0
- package/dist/lib/engines/template/ejs.engine.js.map +1 -0
- package/{src → dist}/lib/engines/template/handlebars.engine.d.ts +0 -1
- package/dist/lib/engines/template/handlebars.engine.js +35 -0
- package/dist/lib/engines/template/handlebars.engine.js.map +1 -0
- package/{src → dist}/lib/engines/template/index.d.ts +0 -1
- package/{src → dist}/lib/engines/template/index.js +1 -0
- package/dist/lib/engines/template/index.js.map +1 -0
- package/{src → dist}/lib/engines/template/nunjucks.engine.d.ts +1 -2
- package/{src → dist}/lib/engines/template/nunjucks.engine.js +5 -3
- package/dist/lib/engines/template/nunjucks.engine.js.map +1 -0
- package/{src → dist}/lib/engines/template/pug.engine.d.ts +1 -2
- package/dist/lib/engines/template/pug.engine.js +44 -0
- package/dist/lib/engines/template/pug.engine.js.map +1 -0
- package/{src → dist}/lib/engines/template-engine.d.ts +0 -1
- package/{src → dist}/lib/engines/template-engine.js +2 -0
- package/dist/lib/engines/template-engine.js.map +1 -0
- package/{src → dist}/lib/entities/template-layout.entity.d.ts +0 -1
- package/{src → dist}/lib/entities/template-layout.entity.js +59 -34
- package/dist/lib/entities/template-layout.entity.js.map +1 -0
- package/{src → dist}/lib/entities/template.entity.d.ts +0 -1
- package/{src → dist}/lib/entities/template.entity.js +62 -36
- package/dist/lib/entities/template.entity.js.map +1 -0
- package/{src → dist}/lib/errors/template.errors.d.ts +0 -1
- package/{src → dist}/lib/errors/template.errors.js +1 -0
- package/dist/lib/errors/template.errors.js.map +1 -0
- package/{src → dist}/lib/interfaces/module-config.interface.d.ts +0 -7
- package/{src → dist}/lib/interfaces/module-config.interface.js +1 -0
- package/dist/lib/interfaces/module-config.interface.js.map +1 -0
- package/{src → dist}/lib/interfaces/template.types.d.ts +0 -1
- package/{src → dist}/lib/interfaces/template.types.js +1 -0
- package/dist/lib/interfaces/template.types.js.map +1 -0
- package/{src → dist}/lib/nest-dynamic-templates.module.d.ts +0 -1
- package/{src → dist}/lib/nest-dynamic-templates.module.js +15 -6
- package/dist/lib/nest-dynamic-templates.module.js.map +1 -0
- package/{src → dist}/lib/services/template-config.service.d.ts +0 -37
- package/{src → dist}/lib/services/template-config.service.js +15 -44
- package/dist/lib/services/template-config.service.js.map +1 -0
- package/{src → dist}/lib/services/template-engine.registry.d.ts +0 -1
- package/{src → dist}/lib/services/template-engine.registry.js +15 -5
- package/dist/lib/services/template-engine.registry.js.map +1 -0
- package/{src → dist}/lib/services/template-layout.service.d.ts +0 -13
- package/{src → dist}/lib/services/template-layout.service.js +19 -48
- package/dist/lib/services/template-layout.service.js.map +1 -0
- package/{src → dist}/lib/services/template.service.d.ts +0 -13
- package/{src → dist}/lib/services/template.service.js +20 -51
- package/dist/lib/services/template.service.js.map +1 -0
- package/{src → dist}/test/helpers.d.ts +0 -1
- package/{src → dist}/test/helpers.js +1 -0
- package/dist/test/helpers.js.map +1 -0
- package/{src → dist}/test/test-database.config.d.ts +0 -1
- package/{src → dist}/test/test-database.config.js +3 -2
- package/dist/test/test-database.config.js.map +1 -0
- package/{src → dist}/test/test.setup.d.ts +0 -1
- package/{src → dist}/test/test.setup.js +1 -2
- package/dist/test/test.setup.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/examples/post.seeder.example.ts +65 -0
- package/examples/product.factory.example.ts +84 -0
- package/examples/seed.script.example.ts +32 -0
- package/examples/seeder.config.example.ts +50 -0
- package/examples/user.factory.example.ts +59 -0
- package/examples/user.seeder.example.ts +55 -0
- package/package.json +167 -6
- package/src/index.d.ts.map +0 -1
- package/src/index.js +0 -25
- package/src/lib/constant.d.ts.map +0 -1
- package/src/lib/dto/create-template-layout.dto.d.ts.map +0 -1
- package/src/lib/dto/create-template.dto.d.ts.map +0 -1
- package/src/lib/dto/render-content-template-layout.dto.d.ts.map +0 -1
- package/src/lib/dto/render-content-template.dto.d.ts.map +0 -1
- package/src/lib/dto/render-template-layout.dto.d.ts.map +0 -1
- package/src/lib/dto/render-template.dto.d.ts.map +0 -1
- package/src/lib/dto/template-filter.dto.d.ts.map +0 -1
- package/src/lib/dto/template-layout-filter.dto.d.ts.map +0 -1
- package/src/lib/engines/language/html.engine.d.ts.map +0 -1
- package/src/lib/engines/language/html.engine.js +0 -80
- package/src/lib/engines/language/index.d.ts.map +0 -1
- package/src/lib/engines/language/markdown.engine.d.ts.map +0 -1
- package/src/lib/engines/language/markdown.engine.js +0 -39
- package/src/lib/engines/language/mjml.engine.d.ts.map +0 -1
- package/src/lib/engines/language/mjml.engine.js +0 -75
- package/src/lib/engines/language/text.engine.d.ts.map +0 -1
- package/src/lib/engines/language-engine.d.ts.map +0 -1
- package/src/lib/engines/template/ejs.engine.d.ts.map +0 -1
- package/src/lib/engines/template/ejs.engine.js +0 -65
- package/src/lib/engines/template/handlebars.engine.d.ts.map +0 -1
- package/src/lib/engines/template/handlebars.engine.js +0 -66
- package/src/lib/engines/template/index.d.ts.map +0 -1
- package/src/lib/engines/template/nunjucks.engine.d.ts.map +0 -1
- package/src/lib/engines/template/pug.engine.d.ts.map +0 -1
- package/src/lib/engines/template/pug.engine.js +0 -74
- package/src/lib/engines/template-engine.d.ts.map +0 -1
- package/src/lib/entities/template-layout.entity.d.ts.map +0 -1
- package/src/lib/entities/template.entity.d.ts.map +0 -1
- package/src/lib/errors/template.errors.d.ts.map +0 -1
- package/src/lib/interfaces/module-config.interface.d.ts.map +0 -1
- package/src/lib/interfaces/template.types.d.ts.map +0 -1
- package/src/lib/nest-dynamic-templates.module.d.ts.map +0 -1
- package/src/lib/services/template-config.service.d.ts.map +0 -1
- package/src/lib/services/template-engine.registry.d.ts.map +0 -1
- package/src/lib/services/template-layout.service.d.ts.map +0 -1
- package/src/lib/services/template.service.d.ts.map +0 -1
- package/src/test/helpers.d.ts.map +0 -1
- package/src/test/test-database.config.d.ts.map +0 -1
- 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-
|
|
1
|
+
# @ackplus/nest-dynamic-templates
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
##
|
|
5
|
+
## ✨ Features
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
##
|
|
16
|
+
## 📦 Installation
|
|
10
17
|
|
|
11
|
-
|
|
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
|
package/{src → dist}/index.d.ts
RENAMED
|
@@ -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"}
|
|
@@ -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"}
|