@ackplus/nest-seeder 0.1.35
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/README.md +412 -0
- package/package.json +37 -0
- package/src/cli.d.ts +3 -0
- package/src/cli.js +168 -0
- package/src/cli.js.map +1 -0
- package/src/index.d.ts +8 -0
- package/src/index.js +12 -0
- package/src/index.js.map +1 -0
- package/src/lib/decorators/factory.decorator.d.ts +6 -0
- package/src/lib/decorators/factory.decorator.js +17 -0
- package/src/lib/decorators/factory.decorator.js.map +1 -0
- package/src/lib/factory/data.factory.d.ts +6 -0
- package/src/lib/factory/data.factory.js +51 -0
- package/src/lib/factory/data.factory.js.map +1 -0
- package/src/lib/index.d.ts +4 -0
- package/src/lib/index.js +8 -0
- package/src/lib/index.js.map +1 -0
- package/src/lib/interfaces/factory.interface.d.ts +4 -0
- package/src/lib/interfaces/factory.interface.js +3 -0
- package/src/lib/interfaces/factory.interface.js.map +1 -0
- package/src/lib/interfaces/index.d.ts +2 -0
- package/src/lib/interfaces/index.js +6 -0
- package/src/lib/interfaces/index.js.map +1 -0
- package/src/lib/interfaces/property-metadata.interface.d.ts +6 -0
- package/src/lib/interfaces/property-metadata.interface.js +3 -0
- package/src/lib/interfaces/property-metadata.interface.js.map +1 -0
- package/src/lib/interfaces/seeder-module-async-options.interface.d.ts +10 -0
- package/src/lib/interfaces/seeder-module-async-options.interface.js +3 -0
- package/src/lib/interfaces/seeder-module-async-options.interface.js.map +1 -0
- package/src/lib/interfaces/seeder-options-factory.interface.d.ts +4 -0
- package/src/lib/interfaces/seeder-options-factory.interface.js +3 -0
- package/src/lib/interfaces/seeder-options-factory.interface.js.map +1 -0
- package/src/lib/seeder/seeder.d.ts +10 -0
- package/src/lib/seeder/seeder.interface.d.ts +9 -0
- package/src/lib/seeder/seeder.interface.js +3 -0
- package/src/lib/seeder/seeder.interface.js.map +1 -0
- package/src/lib/seeder/seeder.js +37 -0
- package/src/lib/seeder/seeder.js.map +1 -0
- package/src/lib/seeder/seeder.module.d.ts +17 -0
- package/src/lib/seeder/seeder.module.js +75 -0
- package/src/lib/seeder/seeder.module.js.map +1 -0
- package/src/lib/seeder/seeder.service.d.ts +10 -0
- package/src/lib/seeder/seeder.service.js +67 -0
- package/src/lib/seeder/seeder.service.js.map +1 -0
- package/src/lib/storages/factory.metadata.storage.d.ts +16 -0
- package/src/lib/storages/factory.metadata.storage.js +19 -0
- package/src/lib/storages/factory.metadata.storage.js.map +1 -0
- package/tsconfig.tsbuildinfo +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
# NestJS Seeder Module
|
|
2
|
+
|
|
3
|
+
A powerful and flexible seeding solution for NestJS applications with TypeORM support.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- ✅ **CLI Support** - Run seeders from command line
|
|
8
|
+
- ✅ **TypeORM Integration** - Works seamlessly with your existing TypeORM setup
|
|
9
|
+
- ✅ **Selective Seeding** - Run specific seeders by name
|
|
10
|
+
- ✅ **Data Refresh** - Drop and recreate data
|
|
11
|
+
- ✅ **TypeScript Support** - Full TypeScript support with ts-node
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @ackplus/nest-seeder
|
|
17
|
+
# Also install peer dependencies
|
|
18
|
+
npm install -D ts-node typescript
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
### 1. Create Your Seeders
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
// src/database/seeders/user.seeder.ts
|
|
27
|
+
import { Injectable } from '@nestjs/common';
|
|
28
|
+
import { InjectRepository } from '@nestjs/typeorm';
|
|
29
|
+
import { Repository } from 'typeorm';
|
|
30
|
+
import { Seeder, SeederServiceOptions } from '@ackplus/nest-seeder';
|
|
31
|
+
import { User } from '../../entities/user.entity';
|
|
32
|
+
|
|
33
|
+
@Injectable()
|
|
34
|
+
export class UserSeeder implements Seeder {
|
|
35
|
+
constructor(
|
|
36
|
+
@InjectRepository(User)
|
|
37
|
+
private readonly userRepository: Repository<User>,
|
|
38
|
+
) {}
|
|
39
|
+
|
|
40
|
+
async seed(options: SeederServiceOptions): Promise<any> {
|
|
41
|
+
const users = [
|
|
42
|
+
{ name: 'John Doe', email: 'john@example.com' },
|
|
43
|
+
{ name: 'Jane Smith', email: 'jane@example.com' },
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
for (const userData of users) {
|
|
47
|
+
const existingUser = await this.userRepository.findOne({
|
|
48
|
+
where: { email: userData.email }
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
if (!existingUser) {
|
|
52
|
+
const user = this.userRepository.create(userData);
|
|
53
|
+
await this.userRepository.save(user);
|
|
54
|
+
console.log(`Created user: ${user.name}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async drop(options: SeederServiceOptions): Promise<any> {
|
|
60
|
+
await this.userRepository.clear();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 2. Create Seeder Configuration File
|
|
66
|
+
|
|
67
|
+
Create a seeder configuration file (e.g., `seeder.config.ts`) in your project:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
// seeder.config.ts
|
|
71
|
+
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
72
|
+
import { SeederModuleOptions } from '@ackplus/nest-seeder';
|
|
73
|
+
import { UserSeeder } from './src/database/seeders/user.seeder';
|
|
74
|
+
import { User } from './src/entities/user.entity';
|
|
75
|
+
|
|
76
|
+
const seederConfig: SeederModuleOptions = {
|
|
77
|
+
imports: [
|
|
78
|
+
TypeOrmModule.forRoot({
|
|
79
|
+
type: 'postgres', // Change to your database type
|
|
80
|
+
host: process.env.DB_HOST || 'localhost',
|
|
81
|
+
port: parseInt(process.env.DB_PORT || '5432'),
|
|
82
|
+
username: process.env.DB_USERNAME || 'postgres',
|
|
83
|
+
password: process.env.DB_PASSWORD || 'password',
|
|
84
|
+
database: process.env.DB_NAME || 'your_database_name',
|
|
85
|
+
entities: [User], // Add your entities here
|
|
86
|
+
synchronize: false, // Set to false in production
|
|
87
|
+
}),
|
|
88
|
+
TypeOrmModule.forFeature([User]), // Add your entities here
|
|
89
|
+
],
|
|
90
|
+
providers: [UserSeeder],
|
|
91
|
+
seeders: [UserSeeder],
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export default seederConfig;
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 3. Add Scripts to package.json
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"scripts": {
|
|
102
|
+
"seed": "nest-seed -c ./seeder.config.ts",
|
|
103
|
+
"seed:refresh": "nest-seed -c ./seeder.config.ts --refresh",
|
|
104
|
+
"seed:user": "nest-seed -c ./seeder.config.ts --name UserSeeder"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 4. Run Your Seeders
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Run all seeders
|
|
113
|
+
npm run seed
|
|
114
|
+
|
|
115
|
+
# Drop all data and reseed
|
|
116
|
+
npm run seed:refresh
|
|
117
|
+
|
|
118
|
+
# Run specific seeder
|
|
119
|
+
npm run seed:user
|
|
120
|
+
|
|
121
|
+
# Run with dummy data flag
|
|
122
|
+
npm run seed -- --dummyData
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## CLI Usage
|
|
126
|
+
|
|
127
|
+
The CLI can import seeder configuration from any TypeScript or JavaScript file:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# Basic usage
|
|
131
|
+
nest-seed -c ./seeder.config.ts
|
|
132
|
+
|
|
133
|
+
# Different config file
|
|
134
|
+
nest-seed -c ./configs/development.seeder.ts
|
|
135
|
+
|
|
136
|
+
# Relative or absolute paths
|
|
137
|
+
nest-seed -c ../shared/seeder.config.ts
|
|
138
|
+
nest-seed -c /absolute/path/to/seeder.config.ts
|
|
139
|
+
|
|
140
|
+
# With options
|
|
141
|
+
nest-seed -c ./seeder.config.ts --refresh --name UserSeeder --dummyData
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## CLI Options
|
|
145
|
+
|
|
146
|
+
| Option | Alias | Description | Example |
|
|
147
|
+
|--------|-------|-------------|---------|
|
|
148
|
+
| `--config` | `-c` | Path to seeder configuration file | `--config ./seeder.config.ts` |
|
|
149
|
+
| `--refresh` | `-r` | Drop all data before seeding | `--refresh` |
|
|
150
|
+
| `--name` | `-n` | Run specific seeders | `--name UserSeeder PostSeeder` |
|
|
151
|
+
| `--dummyData` | `-d` | Include dummy data flag | `--dummyData` |
|
|
152
|
+
|
|
153
|
+
## Configuration Options
|
|
154
|
+
|
|
155
|
+
### Using Environment Variables
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
// seeder.config.ts
|
|
159
|
+
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
160
|
+
|
|
161
|
+
const seederConfig = {
|
|
162
|
+
imports: [
|
|
163
|
+
TypeOrmModule.forRoot({
|
|
164
|
+
type: process.env.DB_TYPE as any || 'postgres',
|
|
165
|
+
host: process.env.DB_HOST,
|
|
166
|
+
port: parseInt(process.env.DB_PORT || '5432'),
|
|
167
|
+
username: process.env.DB_USERNAME,
|
|
168
|
+
password: process.env.DB_PASSWORD,
|
|
169
|
+
database: process.env.DB_NAME,
|
|
170
|
+
entities: [User, Post],
|
|
171
|
+
}),
|
|
172
|
+
TypeOrmModule.forFeature([User, Post]),
|
|
173
|
+
],
|
|
174
|
+
seeders: [UserSeeder, PostSeeder],
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
export default seederConfig;
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Reusing Existing Database Configuration
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// seeder.config.ts
|
|
184
|
+
import { databaseConfig } from './src/config/database.config';
|
|
185
|
+
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
186
|
+
|
|
187
|
+
const seederConfig = {
|
|
188
|
+
imports: [
|
|
189
|
+
TypeOrmModule.forRoot(databaseConfig), // Reuse your existing config
|
|
190
|
+
TypeOrmModule.forFeature([User, Post]),
|
|
191
|
+
],
|
|
192
|
+
seeders: [UserSeeder, PostSeeder],
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
export default seederConfig;
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Multiple Environment Configurations
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
// seeder.config.dev.ts
|
|
202
|
+
export default {
|
|
203
|
+
imports: [
|
|
204
|
+
TypeOrmModule.forRoot({
|
|
205
|
+
database: 'myapp_dev',
|
|
206
|
+
// ... dev config
|
|
207
|
+
}),
|
|
208
|
+
],
|
|
209
|
+
seeders: [UserSeeder, PostSeeder, DummyDataSeeder],
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// seeder.config.prod.ts
|
|
213
|
+
export default {
|
|
214
|
+
imports: [
|
|
215
|
+
TypeOrmModule.forRoot({
|
|
216
|
+
database: 'myapp_prod',
|
|
217
|
+
// ... prod config
|
|
218
|
+
}),
|
|
219
|
+
],
|
|
220
|
+
seeders: [UserSeeder], // Only essential seeders
|
|
221
|
+
};
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
```json
|
|
225
|
+
{
|
|
226
|
+
"scripts": {
|
|
227
|
+
"seed:dev": "nest-seed -c ./seeder.config.dev.ts",
|
|
228
|
+
"seed:prod": "nest-seed -c ./seeder.config.prod.ts"
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Advanced Usage
|
|
234
|
+
|
|
235
|
+
### Conditional Seeding
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
async seed(options: SeederServiceOptions): Promise<any> {
|
|
239
|
+
if (options.dummyData) {
|
|
240
|
+
// Seed lots of fake data for development
|
|
241
|
+
await this.seedDummyUsers(1000);
|
|
242
|
+
} else {
|
|
243
|
+
// Seed only essential data
|
|
244
|
+
await this.seedEssentialUsers();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Seeder Dependencies
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
// Run seeders in order by organizing them properly
|
|
253
|
+
const seederConfig = {
|
|
254
|
+
seeders: [
|
|
255
|
+
UserSeeder, // Run first
|
|
256
|
+
PostSeeder, // Depends on users
|
|
257
|
+
CommentSeeder, // Depends on posts
|
|
258
|
+
],
|
|
259
|
+
};
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## Integration with Existing App
|
|
263
|
+
|
|
264
|
+
### Option A: Using register() method
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
// app.module.ts
|
|
268
|
+
import { Module } from '@nestjs/common';
|
|
269
|
+
import { SeederModule } from '@ackplus/nest-seeder';
|
|
270
|
+
|
|
271
|
+
@Module({
|
|
272
|
+
imports: [
|
|
273
|
+
// Your existing imports
|
|
274
|
+
SeederModule.register({
|
|
275
|
+
imports: [TypeOrmModule.forFeature([User])],
|
|
276
|
+
providers: [UserSeeder],
|
|
277
|
+
seeders: [UserSeeder],
|
|
278
|
+
}),
|
|
279
|
+
],
|
|
280
|
+
})
|
|
281
|
+
export class AppModule {}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Option B: Using forRootAsync() with useClass
|
|
285
|
+
|
|
286
|
+
Create a factory class:
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
// seeder-config.factory.ts
|
|
290
|
+
import { Injectable } from '@nestjs/common';
|
|
291
|
+
import { ConfigService } from '@nestjs/config';
|
|
292
|
+
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
293
|
+
import { SeederOptionsFactory, SeederModuleOptions } from '@ackplus/nest-seeder';
|
|
294
|
+
import { UserSeeder } from './database/seeders/user.seeder';
|
|
295
|
+
import { User } from './entities/user.entity';
|
|
296
|
+
|
|
297
|
+
@Injectable()
|
|
298
|
+
export class SeederConfigFactory implements SeederOptionsFactory {
|
|
299
|
+
constructor(private readonly configService: ConfigService) {}
|
|
300
|
+
|
|
301
|
+
createSeederOptions(): SeederModuleOptions {
|
|
302
|
+
return {
|
|
303
|
+
imports: [
|
|
304
|
+
TypeOrmModule.forRoot({
|
|
305
|
+
type: this.configService.get('DB_TYPE', 'postgres') as any,
|
|
306
|
+
host: this.configService.get('DB_HOST', 'localhost'),
|
|
307
|
+
port: this.configService.get('DB_PORT', 5432),
|
|
308
|
+
username: this.configService.get('DB_USERNAME', 'postgres'),
|
|
309
|
+
password: this.configService.get('DB_PASSWORD', 'password'),
|
|
310
|
+
database: this.configService.get('DB_NAME', 'myapp_db'),
|
|
311
|
+
entities: [User],
|
|
312
|
+
synchronize: false,
|
|
313
|
+
}),
|
|
314
|
+
TypeOrmModule.forFeature([User]),
|
|
315
|
+
],
|
|
316
|
+
providers: [UserSeeder],
|
|
317
|
+
seeders: [UserSeeder],
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
Use in your app module:
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
// app.module.ts
|
|
327
|
+
import { Module } from '@nestjs/common';
|
|
328
|
+
import { ConfigModule } from '@nestjs/config';
|
|
329
|
+
import { SeederModule } from '@ackplus/nest-seeder';
|
|
330
|
+
import { SeederConfigFactory } from './seeder-config.factory';
|
|
331
|
+
|
|
332
|
+
@Module({
|
|
333
|
+
imports: [
|
|
334
|
+
ConfigModule.forRoot(),
|
|
335
|
+
SeederModule.forRootAsync({
|
|
336
|
+
imports: [ConfigModule],
|
|
337
|
+
useClass: SeederConfigFactory,
|
|
338
|
+
}),
|
|
339
|
+
],
|
|
340
|
+
})
|
|
341
|
+
export class AppModule {}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Option C: Using forRootAsync() with useFactory
|
|
345
|
+
|
|
346
|
+
```typescript
|
|
347
|
+
// app.module.ts
|
|
348
|
+
import { Module } from '@nestjs/common';
|
|
349
|
+
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
350
|
+
import { SeederModule } from '@ackplus/nest-seeder';
|
|
351
|
+
|
|
352
|
+
@Module({
|
|
353
|
+
imports: [
|
|
354
|
+
ConfigModule.forRoot(),
|
|
355
|
+
SeederModule.forRootAsync({
|
|
356
|
+
imports: [ConfigModule, TypeOrmModule.forFeature([User])],
|
|
357
|
+
useFactory: (configService: ConfigService) => ({
|
|
358
|
+
imports: [
|
|
359
|
+
TypeOrmModule.forRoot({
|
|
360
|
+
type: configService.get('DB_TYPE', 'postgres') as any,
|
|
361
|
+
host: configService.get('DB_HOST', 'localhost'),
|
|
362
|
+
// ... other config
|
|
363
|
+
}),
|
|
364
|
+
TypeOrmModule.forFeature([User]),
|
|
365
|
+
],
|
|
366
|
+
providers: [UserSeeder],
|
|
367
|
+
seeders: [UserSeeder],
|
|
368
|
+
}),
|
|
369
|
+
inject: [ConfigService],
|
|
370
|
+
}),
|
|
371
|
+
],
|
|
372
|
+
})
|
|
373
|
+
export class AppModule {}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### Using SeederService
|
|
377
|
+
|
|
378
|
+
After registering the module, inject SeederService anywhere:
|
|
379
|
+
|
|
380
|
+
```typescript
|
|
381
|
+
constructor(private readonly seederService: SeederService) {}
|
|
382
|
+
await this.seederService.run();
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## Best Practices
|
|
386
|
+
|
|
387
|
+
1. **Environment Variables**: Use the same environment variables as your main app
|
|
388
|
+
2. **Idempotent Seeders**: Make seeders safe to run multiple times
|
|
389
|
+
3. **Order Dependencies**: Place dependent seeders after their dependencies
|
|
390
|
+
4. **Clean Drop Methods**: Implement proper cleanup in drop methods
|
|
391
|
+
5. **Separate Configs**: Use different config files for different environments
|
|
392
|
+
|
|
393
|
+
## Troubleshooting
|
|
394
|
+
|
|
395
|
+
### "Cannot find module" errors
|
|
396
|
+
- Make sure the config file path is correct relative to where you run the command
|
|
397
|
+
- Ensure all import paths in your config are correct
|
|
398
|
+
- Check that `ts-node` and `typescript` are installed for TypeScript files
|
|
399
|
+
|
|
400
|
+
### Database connection errors
|
|
401
|
+
- Verify your database configuration in the seeder config
|
|
402
|
+
- Ensure your database is running and accessible
|
|
403
|
+
- Check environment variables are properly set
|
|
404
|
+
|
|
405
|
+
### TypeScript compilation errors
|
|
406
|
+
- Make sure your `tsconfig.json` has `experimentalDecorators: true`
|
|
407
|
+
- Install missing dependencies: `npm install -D ts-node typescript`
|
|
408
|
+
- Verify your config file has proper exports
|
|
409
|
+
|
|
410
|
+
## Contributing
|
|
411
|
+
|
|
412
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ackplus/nest-seeder",
|
|
3
|
+
"version": "0.1.35",
|
|
4
|
+
"type": "commonjs",
|
|
5
|
+
"main": "./src/index.js",
|
|
6
|
+
"types": "./src/index.d.ts",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"postbuild": "chmod +x dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/ack-solutions/packages.git"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"bin": {
|
|
19
|
+
"nest-seed": "dist/cli.js"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://github.com/ack-solutions/packages.git#readme",
|
|
22
|
+
"peerDependencies": {
|
|
23
|
+
"typeorm": "^0.3.23",
|
|
24
|
+
"@nestjs/typeorm": "^11.0.0",
|
|
25
|
+
"@nestjs/common": "^10.4.5"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"typeorm": "^0.3.23",
|
|
29
|
+
"@nestjs/typeorm": "^11.0.0",
|
|
30
|
+
"@nestjs/common": "^10.4.5",
|
|
31
|
+
"tslib": "^2.3.0"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@faker-js/faker": "^9.8.0",
|
|
35
|
+
"yargs": "^18.0.0"
|
|
36
|
+
}
|
|
37
|
+
}
|
package/src/cli.d.ts
ADDED
package/src/cli.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.seeder = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const seeder_module_1 = require("./lib/seeder/seeder.module");
|
|
7
|
+
const yargs_1 = tslib_1.__importDefault(require("yargs"));
|
|
8
|
+
const core_1 = require("@nestjs/core");
|
|
9
|
+
const seeder_service_1 = require("./lib/seeder/seeder.service");
|
|
10
|
+
const path = tslib_1.__importStar(require("path"));
|
|
11
|
+
const fs = tslib_1.__importStar(require("fs"));
|
|
12
|
+
function parseArguments() {
|
|
13
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
14
|
+
const argv = yield (0, yargs_1.default)(process.argv.slice(2))
|
|
15
|
+
.option('refresh', {
|
|
16
|
+
alias: 'r',
|
|
17
|
+
type: 'boolean',
|
|
18
|
+
description: 'Drop all data before seeding',
|
|
19
|
+
default: false
|
|
20
|
+
})
|
|
21
|
+
.option('name', {
|
|
22
|
+
alias: 'n',
|
|
23
|
+
type: 'array',
|
|
24
|
+
string: true,
|
|
25
|
+
description: 'Specific seeder names to run',
|
|
26
|
+
})
|
|
27
|
+
.option('dummyData', {
|
|
28
|
+
alias: 'd',
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
description: 'Include dummy data',
|
|
31
|
+
default: false
|
|
32
|
+
})
|
|
33
|
+
.option('config', {
|
|
34
|
+
alias: 'c',
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Path to seeder configuration file',
|
|
37
|
+
demandOption: true
|
|
38
|
+
})
|
|
39
|
+
.help()
|
|
40
|
+
.example('nest-seed -c ./seeder.config.ts', 'Run all seeders')
|
|
41
|
+
.example('nest-seed -c ./seeder.config.ts --refresh', 'Drop and reseed all data')
|
|
42
|
+
.example('nest-seed -c ./seeder.config.ts --name UserSeeder', 'Run specific seeder')
|
|
43
|
+
.parseAsync();
|
|
44
|
+
return {
|
|
45
|
+
refresh: argv.refresh,
|
|
46
|
+
name: argv.name,
|
|
47
|
+
dummyData: argv.dummyData,
|
|
48
|
+
config: argv.config,
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function setupTsNode() {
|
|
53
|
+
try {
|
|
54
|
+
require('ts-node').register({
|
|
55
|
+
transpileOnly: true,
|
|
56
|
+
compilerOptions: {
|
|
57
|
+
module: 'commonjs',
|
|
58
|
+
experimentalDecorators: true,
|
|
59
|
+
emitDecoratorMetadata: true,
|
|
60
|
+
esModuleInterop: true,
|
|
61
|
+
allowSyntheticDefaultImports: true,
|
|
62
|
+
skipLibCheck: true,
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error('Failed to setup TypeScript support. Make sure ts-node is installed:');
|
|
68
|
+
console.error('npm install -D ts-node typescript');
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function loadSeederConfig(configPath) {
|
|
73
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
try {
|
|
75
|
+
const resolvedPath = path.resolve(process.cwd(), configPath);
|
|
76
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
77
|
+
throw new Error(`Configuration file not found: ${resolvedPath}`);
|
|
78
|
+
}
|
|
79
|
+
if (configPath.endsWith('.ts')) {
|
|
80
|
+
setupTsNode();
|
|
81
|
+
}
|
|
82
|
+
delete require.cache[resolvedPath];
|
|
83
|
+
const configModule = yield Promise.resolve(`${resolvedPath}`).then(s => tslib_1.__importStar(require(s)));
|
|
84
|
+
const config = configModule.default || configModule;
|
|
85
|
+
if (!config) {
|
|
86
|
+
throw new Error('Configuration file must export a default configuration object');
|
|
87
|
+
}
|
|
88
|
+
return config;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('Error loading seeder configuration:');
|
|
92
|
+
console.error(error.message);
|
|
93
|
+
console.error('\nMake sure your configuration file:');
|
|
94
|
+
console.error('1. Exists at the specified path');
|
|
95
|
+
console.error('2. Exports a default configuration object');
|
|
96
|
+
console.error('3. Has proper TypeScript setup if using .ts files');
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function runSeeder() {
|
|
102
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
try {
|
|
104
|
+
const args = yield parseArguments();
|
|
105
|
+
console.log('🌱 Starting NestJS Seeder...');
|
|
106
|
+
console.log(`📁 Loading configuration from: ${args.config}`);
|
|
107
|
+
const seederConfig = yield loadSeederConfig(args.config);
|
|
108
|
+
const cliOptions = {
|
|
109
|
+
refresh: args.refresh,
|
|
110
|
+
name: args.name,
|
|
111
|
+
dummyData: args.dummyData,
|
|
112
|
+
};
|
|
113
|
+
if (args.refresh) {
|
|
114
|
+
console.log('🔄 Refresh mode: Will drop existing data before seeding');
|
|
115
|
+
}
|
|
116
|
+
if (args.name && args.name.length > 0) {
|
|
117
|
+
console.log(`🎯 Running specific seeders: ${args.name.join(', ')}`);
|
|
118
|
+
}
|
|
119
|
+
if (args.dummyData) {
|
|
120
|
+
console.log('🎲 Dummy data mode enabled');
|
|
121
|
+
}
|
|
122
|
+
const app = yield core_1.NestFactory.createApplicationContext(seeder_module_1.SeederModule.register(Object.assign(Object.assign({}, seederConfig), cliOptions)));
|
|
123
|
+
const seedersService = app.get(seeder_service_1.SeederService);
|
|
124
|
+
yield seedersService.run();
|
|
125
|
+
yield app.close();
|
|
126
|
+
console.log('✅ Seeding completed successfully!');
|
|
127
|
+
process.exit(0);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.error('❌ Error running seeder:');
|
|
131
|
+
console.error(error.message);
|
|
132
|
+
if (error.stack && process.env.NODE_ENV === 'development') {
|
|
133
|
+
console.error('\nStack trace:');
|
|
134
|
+
console.error(error.stack);
|
|
135
|
+
}
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
const seeder = (options) => {
|
|
141
|
+
return {
|
|
142
|
+
run(extraOptions) {
|
|
143
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
144
|
+
const cliOptions = {};
|
|
145
|
+
const argv = (0, yargs_1.default)(process.argv).argv;
|
|
146
|
+
if (argv.r || argv.refresh) {
|
|
147
|
+
cliOptions.refresh = true;
|
|
148
|
+
}
|
|
149
|
+
if (argv.n || argv.name) {
|
|
150
|
+
cliOptions.name = argv.n || argv.name;
|
|
151
|
+
}
|
|
152
|
+
if (argv.d || argv.dummyData) {
|
|
153
|
+
cliOptions.dummyData = argv.d || argv.dummyData;
|
|
154
|
+
}
|
|
155
|
+
extraOptions = Object.assign(extraOptions, cliOptions);
|
|
156
|
+
const app = yield core_1.NestFactory.createApplicationContext(seeder_module_1.SeederModule.register(Object.assign(Object.assign({}, options), extraOptions)));
|
|
157
|
+
const seedersService = app.get(seeder_service_1.SeederService);
|
|
158
|
+
yield seedersService.run();
|
|
159
|
+
yield app.close();
|
|
160
|
+
});
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
exports.seeder = seeder;
|
|
165
|
+
if (require.main === module) {
|
|
166
|
+
runSeeder();
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=cli.js.map
|
package/src/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../packages/nest-seeder/src/cli.ts"],"names":[],"mappings":"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"}
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './lib/seeder/seeder';
|
|
2
|
+
export * from './lib/seeder/seeder.interface';
|
|
3
|
+
export * from './lib/seeder/seeder.module';
|
|
4
|
+
export * from './lib/seeder/seeder.service';
|
|
5
|
+
export * from './lib/factory/data.factory';
|
|
6
|
+
export * from './lib/decorators/factory.decorator';
|
|
7
|
+
export * from './lib/interfaces/seeder-options-factory.interface';
|
|
8
|
+
export * from './lib/interfaces/seeder-module-async-options.interface';
|
package/src/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./lib/seeder/seeder"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./lib/seeder/seeder.interface"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./lib/seeder/seeder.module"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./lib/seeder/seeder.service"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./lib/factory/data.factory"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./lib/decorators/factory.decorator"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./lib/interfaces/seeder-options-factory.interface"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./lib/interfaces/seeder-module-async-options.interface"), exports);
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/nest-seeder/src/index.ts"],"names":[],"mappings":";;;AAAA,8DAAoC;AAEpC,wEAA8C;AAE9C,qEAA2C;AAE3C,sEAA4C;AAE5C,qEAA2C;AAE3C,6EAAmD;AAEnD,4FAAkE;AAElE,iGAAuE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Faker } from '@faker-js/faker';
|
|
2
|
+
type BaseType = string | number | Date | Buffer | boolean | Record<string, any>;
|
|
3
|
+
export type FactoryValue = BaseType | Array<BaseType>;
|
|
4
|
+
export type FactoryValueGenerator = (faker?: Faker, ctx?: Record<string, any>) => FactoryValue;
|
|
5
|
+
export declare function Factory(generator: FactoryValueGenerator | FactoryValue, dependsOn?: string[]): (target: Record<string, any>, propertyKey: string | symbol) => void;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Factory = Factory;
|
|
4
|
+
const factory_metadata_storage_1 = require("../storages/factory.metadata.storage");
|
|
5
|
+
function Factory(generator, dependsOn) {
|
|
6
|
+
return (target, propertyKey) => {
|
|
7
|
+
factory_metadata_storage_1.FactoryMetadataStorage.addPropertyMetadata({
|
|
8
|
+
target: target.constructor,
|
|
9
|
+
propertyKey: propertyKey,
|
|
10
|
+
arg: {
|
|
11
|
+
generator,
|
|
12
|
+
dependsOn,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=factory.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.decorator.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/decorators/factory.decorator.ts"],"names":[],"mappings":";;AAcA,0BAiBC;AA7BD,mFAA8E;AAY9E,SAAgB,OAAO,CACnB,SAA+C,EAC/C,SAAoB;IAEpB,OAAO,CACH,MAA2B,EAC3B,WAA4B,EACxB,EAAE;QACN,iDAAsB,CAAC,mBAAmB,CAAC;YACvC,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,WAAW,EAAE,WAAqB;YAClC,GAAG,EAAE;gBACD,SAAS;gBACT,SAAS;aACZ;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataFactory = void 0;
|
|
4
|
+
const faker_1 = require("@faker-js/faker");
|
|
5
|
+
const factory_metadata_storage_1 = require("../storages/factory.metadata.storage");
|
|
6
|
+
class DataFactory {
|
|
7
|
+
static createForClass(target) {
|
|
8
|
+
if (!target) {
|
|
9
|
+
throw new Error(`Target class "${target}" passed in to the "TemplateFactory#createForClass()" method is "undefined".`);
|
|
10
|
+
}
|
|
11
|
+
const properties = factory_metadata_storage_1.FactoryMetadataStorage.getPropertyMetadatasByTarget(target);
|
|
12
|
+
return {
|
|
13
|
+
generate: (count, values = {}) => {
|
|
14
|
+
const ret = [];
|
|
15
|
+
for (let i = 0; i < count; i++) {
|
|
16
|
+
ret.push(this.generate(properties, values));
|
|
17
|
+
}
|
|
18
|
+
return ret;
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
static generate(properties, values) {
|
|
23
|
+
const ctx = Object.assign({}, values);
|
|
24
|
+
return properties.reduce((result, property) => {
|
|
25
|
+
const propertyKey = property.propertyKey;
|
|
26
|
+
const { generator, dependsOn } = property.arg;
|
|
27
|
+
if (ctx[propertyKey] !== undefined) {
|
|
28
|
+
return Object.assign({ [propertyKey]: ctx[propertyKey] }, result);
|
|
29
|
+
}
|
|
30
|
+
if (Array.isArray(dependsOn)) {
|
|
31
|
+
dependsOn.forEach((dependency) => {
|
|
32
|
+
if (ctx[dependency] === undefined) {
|
|
33
|
+
const dependentProperty = properties.find((p) => p.propertyKey === dependency);
|
|
34
|
+
if (dependentProperty) {
|
|
35
|
+
ctx[dependency] = typeof dependentProperty.arg.generator ===
|
|
36
|
+
'function' ?
|
|
37
|
+
dependentProperty.arg.generator(faker_1.faker, ctx) :
|
|
38
|
+
dependentProperty.arg;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
ctx[propertyKey] = typeof generator === 'function' ?
|
|
44
|
+
generator(faker_1.faker, ctx) :
|
|
45
|
+
generator;
|
|
46
|
+
return Object.assign({ [propertyKey]: ctx[propertyKey] }, result);
|
|
47
|
+
}, {});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.DataFactory = DataFactory;
|
|
51
|
+
//# sourceMappingURL=data.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.factory.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/factory/data.factory.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAKxC,mFAG8C;AAG9C,MAAa,WAAW;IAEpB,MAAM,CAAC,cAAc,CAAC,MAAqB;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACX,iBAAiB,MAAM,8EAA8E,CACxG,CAAC;QACN,CAAC;QAED,MAAM,UAAU,GAAG,iDAAsB,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAE/E,OAAO;YACH,QAAQ,EAAE,CACN,KAAa,EACb,SAA8B,EAAE,EACF,EAAE;gBAChC,MAAM,GAAG,GAAmC,EAAE,CAAC;gBAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO,GAAG,CAAC;YACf,CAAC;SACJ,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,QAAQ,CACnB,UAAkC,EAClC,MAA2B;QAE3B,MAAM,GAAG,qBAAQ,MAAM,CAAE,CAAC;QAE1B,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;YACzC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC;YAG9C,IAAI,GAAG,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,CAAC;gBACjC,uBACI,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,IAC5B,MAAM,EACX;YACN,CAAC;YAGD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,SAAS,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;oBAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;wBAEhC,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,UAAU,CACtC,CAAC;wBACF,IAAI,iBAAiB,EAAE,CAAC;4BACpB,GAAG,CAAC,UAAU,CAAC,GAAG,OAAO,iBAAiB,CAAC,GAAG,CAAC,SAAS;gCACpD,UAAU,CAAC,CAAC;gCACZ,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAC3B,aAAK,EACL,GAAG,CACN,CAAC,CAAC;gCACH,iBAAiB,CAAC,GAAG,CAAC;wBAC9B,CAAC;oBACL,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;YAGD,GAAG,CAAC,WAAW,CAAC,GAAG,OAAO,SAAS,KAAK,UAAU,CAAC,CAAC;gBAChD,SAAS,CAAC,aAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBACvB,SAAS,CAAC;YAEd,uBACI,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,IAC5B,MAAM,EACX;QACN,CAAC,EAAE,EAAE,CAAC,CAAC;IASX,CAAC;CAEJ;AApFD,kCAoFC"}
|
package/src/lib/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./seeder/seeder"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./seeder/seeder.interface"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./factory/data.factory"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./decorators/factory.decorator"), exports);
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/nest-seeder/src/lib/index.ts"],"names":[],"mappings":";;;AAAA,0DAAgC;AAEhC,oEAA0C;AAE1C,iEAAuC;AAEvC,yEAA+C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.interface.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/interfaces/factory.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./property-metadata.interface"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./factory.interface"), exports);
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/interfaces/index.ts"],"names":[],"mappings":";;;AAAA,wEAA8C;AAE9C,8DAAoC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-metadata.interface.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/interfaces/property-metadata.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Type, ModuleMetadata } from '@nestjs/common';
|
|
2
|
+
import { SeederModuleOptions } from '../seeder/seeder.module';
|
|
3
|
+
import { SeederOptionsFactory } from './seeder-options-factory.interface';
|
|
4
|
+
export interface SeederModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
5
|
+
isGlobal?: boolean;
|
|
6
|
+
useFactory?: (...args: any[]) => Promise<SeederModuleOptions> | SeederModuleOptions;
|
|
7
|
+
useClass?: Type<SeederOptionsFactory>;
|
|
8
|
+
useExisting?: Type<SeederOptionsFactory>;
|
|
9
|
+
inject?: any[];
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder-module-async-options.interface.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/interfaces/seeder-module-async-options.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder-options-factory.interface.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/interfaces/seeder-options-factory.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Provider, Type, DynamicModule, ForwardReference } from '@nestjs/common';
|
|
2
|
+
import { SeederModuleExtraOptions } from './seeder.module';
|
|
3
|
+
export interface SeederOptions {
|
|
4
|
+
imports?: Array<Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
|
|
5
|
+
providers?: Provider[];
|
|
6
|
+
}
|
|
7
|
+
export interface SeederRunner {
|
|
8
|
+
run(extraOptions: SeederModuleExtraOptions): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare const seeder: (options: SeederOptions) => SeederRunner;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder.interface.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/seeder/seeder.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.seeder = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const core_1 = require("@nestjs/core");
|
|
6
|
+
const yargs_1 = tslib_1.__importDefault(require("yargs"));
|
|
7
|
+
const seeder_module_1 = require("./seeder.module");
|
|
8
|
+
const seeder_service_1 = require("./seeder.service");
|
|
9
|
+
function bootstrap(options) {
|
|
10
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
11
|
+
const app = yield core_1.NestFactory.createApplicationContext(seeder_module_1.SeederModule.register(options));
|
|
12
|
+
const seedersService = app.get(seeder_service_1.SeederService);
|
|
13
|
+
yield seedersService.run();
|
|
14
|
+
yield app.close();
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const seeder = (options) => {
|
|
18
|
+
return {
|
|
19
|
+
run(extraOptions) {
|
|
20
|
+
const cliOptions = {};
|
|
21
|
+
const argv = (0, yargs_1.default)(process.argv).argv;
|
|
22
|
+
if (argv.r || argv.refresh) {
|
|
23
|
+
cliOptions.refresh = true;
|
|
24
|
+
}
|
|
25
|
+
if (argv.n || argv.name) {
|
|
26
|
+
cliOptions.name = argv.n || argv.name;
|
|
27
|
+
}
|
|
28
|
+
if (argv.d || argv.dummyData) {
|
|
29
|
+
cliOptions.dummyData = argv.d || argv.dummyData;
|
|
30
|
+
}
|
|
31
|
+
extraOptions = Object.assign(extraOptions, cliOptions);
|
|
32
|
+
return bootstrap(Object.assign(Object.assign({}, options), extraOptions));
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
exports.seeder = seeder;
|
|
37
|
+
//# sourceMappingURL=seeder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/seeder/seeder.ts"],"names":[],"mappings":";;;;AAMA,uCAA2C;AAC3C,0DAA0B;AAG1B,mDAIyB;AACzB,qDAAiD;AAcjD,SAAe,SAAS,CAAC,OAA4B;;QACjD,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,wBAAwB,CAClD,4BAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CACjC,CAAC;QAEF,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,8BAAa,CAAC,CAAC;QAC9C,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC;QAE3B,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CAAA;AAEM,MAAM,MAAM,GAAG,CAAC,OAAsB,EAAgB,EAAE;IAC3D,OAAO;QACH,GAAG,CAAC,YAAsC;YACtC,MAAM,UAAU,GAAyB,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAO,IAAA,eAAK,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;YAC1C,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACzB,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9B,CAAC;YAED,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtB,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;YAC1C,CAAC;YAED,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC3B,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC;YACpD,CAAC;YAED,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YAEvD,OAAO,SAAS,iCACT,OAAO,GACP,YAAY,EACjB,CAAC;QACP,CAAC;KACJ,CAAC;AACN,CAAC,CAAC;AAzBW,QAAA,MAAM,UAyBjB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DynamicModule, Provider, Type, ForwardReference } from '@nestjs/common';
|
|
2
|
+
import { Seeder, SeederServiceOptions } from './seeder.interface';
|
|
3
|
+
import { SeederModuleAsyncOptions } from '../interfaces/seeder-module-async-options.interface';
|
|
4
|
+
export interface SeederModuleExtraOptions extends SeederServiceOptions {
|
|
5
|
+
seeders?: Provider<Seeder>[];
|
|
6
|
+
plugins?: any[];
|
|
7
|
+
}
|
|
8
|
+
export interface SeederModuleOptions extends SeederModuleExtraOptions {
|
|
9
|
+
imports?: Array<Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
|
|
10
|
+
providers?: Provider[];
|
|
11
|
+
}
|
|
12
|
+
export declare class SeederModule {
|
|
13
|
+
static register(options: SeederModuleOptions): DynamicModule;
|
|
14
|
+
static forRootAsync(options: SeederModuleAsyncOptions): DynamicModule;
|
|
15
|
+
private static createAsyncProviders;
|
|
16
|
+
private static createAsyncOptionsProvider;
|
|
17
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var SeederModule_1;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.SeederModule = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const common_1 = require("@nestjs/common");
|
|
7
|
+
const seeder_service_1 = require("./seeder.service");
|
|
8
|
+
const SEEDER_MODULE_OPTIONS = 'SEEDER_MODULE_OPTIONS';
|
|
9
|
+
let SeederModule = SeederModule_1 = class SeederModule {
|
|
10
|
+
static register(options) {
|
|
11
|
+
return {
|
|
12
|
+
module: SeederModule_1,
|
|
13
|
+
imports: options.imports || [],
|
|
14
|
+
providers: [
|
|
15
|
+
...(options.providers || []),
|
|
16
|
+
...options.seeders || [],
|
|
17
|
+
{
|
|
18
|
+
provide: seeder_service_1.SeederService,
|
|
19
|
+
useFactory: (...seeders) => {
|
|
20
|
+
return new seeder_service_1.SeederService(seeders, options);
|
|
21
|
+
},
|
|
22
|
+
inject: (options.seeders || []),
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
static forRootAsync(options) {
|
|
28
|
+
return {
|
|
29
|
+
module: SeederModule_1,
|
|
30
|
+
global: options.isGlobal,
|
|
31
|
+
imports: options.imports || [],
|
|
32
|
+
providers: [
|
|
33
|
+
...this.createAsyncProviders(options),
|
|
34
|
+
{
|
|
35
|
+
provide: seeder_service_1.SeederService,
|
|
36
|
+
useFactory: (seederOptions, ...seeders) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
return new seeder_service_1.SeederService(seeders, seederOptions);
|
|
38
|
+
}),
|
|
39
|
+
inject: [SEEDER_MODULE_OPTIONS, ...(options.inject || [])],
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
static createAsyncProviders(options) {
|
|
45
|
+
if (options.useExisting || options.useFactory) {
|
|
46
|
+
return [this.createAsyncOptionsProvider(options)];
|
|
47
|
+
}
|
|
48
|
+
return [
|
|
49
|
+
this.createAsyncOptionsProvider(options),
|
|
50
|
+
{
|
|
51
|
+
provide: options.useClass,
|
|
52
|
+
useClass: options.useClass,
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
static createAsyncOptionsProvider(options) {
|
|
57
|
+
if (options.useFactory) {
|
|
58
|
+
return {
|
|
59
|
+
provide: SEEDER_MODULE_OPTIONS,
|
|
60
|
+
useFactory: options.useFactory,
|
|
61
|
+
inject: options.inject || [],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
provide: SEEDER_MODULE_OPTIONS,
|
|
66
|
+
useFactory: (optionsFactory) => tslib_1.__awaiter(this, void 0, void 0, function* () { return yield optionsFactory.createSeederOptions(); }),
|
|
67
|
+
inject: [options.useExisting || options.useClass],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
exports.SeederModule = SeederModule;
|
|
72
|
+
exports.SeederModule = SeederModule = SeederModule_1 = tslib_1.__decorate([
|
|
73
|
+
(0, common_1.Module)({})
|
|
74
|
+
], SeederModule);
|
|
75
|
+
//# sourceMappingURL=seeder.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder.module.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/seeder/seeder.module.ts"],"names":[],"mappings":";;;;;AAAA,2CAMwB;AAGxB,qDAAiD;AAgBjD,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAG/C,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAErB,MAAM,CAAC,QAAQ,CAAC,OAA4B;QACxC,OAAO;YACH,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS,EAAE;gBACP,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;gBAC5B,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE;gBACxB;oBACI,OAAO,EAAE,8BAAa;oBACtB,UAAU,EAAE,CAAC,GAAG,OAAiB,EAAiB,EAAE;wBAChD,OAAO,IAAI,8BAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAC/C,CAAC;oBACD,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAgB;iBACjD;aACJ;SACJ,CAAC;IACN,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAiC;QACjD,OAAO;YACH,MAAM,EAAE,cAAY;YACpB,MAAM,EAAE,OAAO,CAAC,QAAQ;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS,EAAE;gBACP,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBACrC;oBACI,OAAO,EAAE,8BAAa;oBACtB,UAAU,EAAE,CAAO,aAAkC,EAAE,GAAG,OAAiB,EAA0B,EAAE;wBACnG,OAAO,IAAI,8BAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;oBACrD,CAAC,CAAA;oBACD,MAAM,EAAE,CAAC,qBAAqB,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;iBAC7D;aACJ;SACJ,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,OAAiC;QACjE,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,OAAO;YACH,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC;YACxC;gBACI,OAAO,EAAE,OAAO,CAAC,QAAS;gBAC1B,QAAQ,EAAE,OAAO,CAAC,QAAS;aAC9B;SACJ,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,0BAA0B,CAAC,OAAiC;QACvE,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;gBACH,OAAO,EAAE,qBAAqB;gBAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;aAC/B,CAAC;QACN,CAAC;QAED,OAAO;YACH,OAAO,EAAE,qBAAqB;YAC9B,UAAU,EAAE,CAAO,cAAoC,EAAE,EAAE,wDACvD,OAAA,MAAM,cAAc,CAAC,mBAAmB,EAAE,CAAA,GAAA;YAC9C,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAS,CAAC;SACrD,CAAC;IACN,CAAC;CACJ,CAAA;AApEY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,YAAY,CAoExB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Seeder, SeederServiceOptions } from './seeder.interface';
|
|
2
|
+
export declare class SeederService {
|
|
3
|
+
private readonly seeders;
|
|
4
|
+
private readonly options;
|
|
5
|
+
constructor(seeders: Seeder[], options?: SeederServiceOptions);
|
|
6
|
+
run(): Promise<any>;
|
|
7
|
+
seed(): Promise<any>;
|
|
8
|
+
drop(): Promise<any>;
|
|
9
|
+
getSeederToRun(): Seeder[];
|
|
10
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SeederService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
let SeederService = class SeederService {
|
|
7
|
+
constructor(seeders, options = {}) {
|
|
8
|
+
this.seeders = seeders;
|
|
9
|
+
this.options = options;
|
|
10
|
+
}
|
|
11
|
+
run() {
|
|
12
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
13
|
+
if (this.options.refresh) {
|
|
14
|
+
yield this.drop();
|
|
15
|
+
yield this.seed();
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
yield this.seed();
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
seed() {
|
|
23
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
24
|
+
const seeders = this.getSeederToRun();
|
|
25
|
+
for (const seeder of seeders) {
|
|
26
|
+
console.info(`${seeder.constructor.name} start`);
|
|
27
|
+
yield seeder.seed(this.options);
|
|
28
|
+
console.info(`${seeder.constructor.name} completed`);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
drop() {
|
|
33
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
const seeders = this.getSeederToRun();
|
|
35
|
+
for (const seeder of seeders) {
|
|
36
|
+
console.info(`Truncate ${seeder.constructor.name} start`);
|
|
37
|
+
yield seeder.drop(this.options);
|
|
38
|
+
console.info(`Truncate ${seeder.constructor.name} completed`);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
getSeederToRun() {
|
|
43
|
+
var _a, _b;
|
|
44
|
+
if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.name) && typeof this.options.name === 'string') {
|
|
45
|
+
this.options.name = [this.options.name];
|
|
46
|
+
}
|
|
47
|
+
if (this.options.name) {
|
|
48
|
+
const seeders = this.seeders.filter((s) => { var _a; return ((_a = this.options.name) === null || _a === void 0 ? void 0 : _a.indexOf(s.constructor.name)) >= 0; });
|
|
49
|
+
if ((seeders === null || seeders === void 0 ? void 0 : seeders.length) === 0) {
|
|
50
|
+
const allNames = this.seeders.map((s) => s.constructor.name);
|
|
51
|
+
console.warn('\x1b[43m', 'Warning : No Seeder Found. Available Name are', '\x1b[0m', '\x1b[32m', '\n', `${allNames.join('\n')}`, '\x1b[0m');
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
return seeders;
|
|
55
|
+
}
|
|
56
|
+
if (((_b = this.seeders) === null || _b === void 0 ? void 0 : _b.length) === 0) {
|
|
57
|
+
console.info('\x1b[43m', 'Warning : No seeders to run. Make sure you have passed default seeder', '\x1b[0m');
|
|
58
|
+
}
|
|
59
|
+
return this.seeders;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
exports.SeederService = SeederService;
|
|
63
|
+
exports.SeederService = SeederService = tslib_1.__decorate([
|
|
64
|
+
(0, common_1.Injectable)(),
|
|
65
|
+
tslib_1.__metadata("design:paramtypes", [Array, Object])
|
|
66
|
+
], SeederService);
|
|
67
|
+
//# sourceMappingURL=seeder.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder.service.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/seeder/seeder.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Type } from '@nestjs/common';
|
|
2
|
+
import { FactoryValue, FactoryValueGenerator } from '../decorators/factory.decorator';
|
|
3
|
+
export type PropertyMetadataType = {
|
|
4
|
+
target?: any;
|
|
5
|
+
propertyKey?: any;
|
|
6
|
+
arg: {
|
|
7
|
+
generator: FactoryValueGenerator | FactoryValue;
|
|
8
|
+
dependsOn?: string[];
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export declare class FactoryMetadataStorageHost {
|
|
12
|
+
private properties;
|
|
13
|
+
addPropertyMetadata(metadata: PropertyMetadataType): void;
|
|
14
|
+
getPropertyMetadatasByTarget(target: Type<unknown>): PropertyMetadataType[];
|
|
15
|
+
}
|
|
16
|
+
export declare const FactoryMetadataStorage: FactoryMetadataStorageHost;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FactoryMetadataStorage = exports.FactoryMetadataStorageHost = void 0;
|
|
4
|
+
class FactoryMetadataStorageHost {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.properties = [];
|
|
7
|
+
}
|
|
8
|
+
addPropertyMetadata(metadata) {
|
|
9
|
+
this.properties.push(metadata);
|
|
10
|
+
}
|
|
11
|
+
getPropertyMetadatasByTarget(target) {
|
|
12
|
+
return this.properties.filter((property) => property.target === target);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.FactoryMetadataStorageHost = FactoryMetadataStorageHost;
|
|
16
|
+
const globalRef = global;
|
|
17
|
+
exports.FactoryMetadataStorage = globalRef.FactoryMetadataStorage ||
|
|
18
|
+
(globalRef.FactoryMetadataStorage = new FactoryMetadataStorageHost());
|
|
19
|
+
//# sourceMappingURL=factory.metadata.storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.metadata.storage.js","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/storages/factory.metadata.storage.ts"],"names":[],"mappings":";;;AAiBA,MAAa,0BAA0B;IAAvC;QAEY,eAAU,GAA2B,EAAE,CAAC;IAYpD,CAAC;IAVG,mBAAmB,CAAC,QAA8B;QAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,4BAA4B,CACxB,MAAqB;QAErB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC5E,CAAC;CAEJ;AAdD,gEAcC;AAED,MAAM,SAAS,GAAG,MAAa,CAAC;AAEnB,QAAA,sBAAsB,GAA+B,SAAS,CAAC,sBAAsB;IAC9F,CAAC,SAAS,CAAC,sBAAsB,GAAG,IAAI,0BAA0B,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":"5.8.3"}
|