@ackplus/nest-seeder 1.1.1 → 1.1.2
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/package.json +2 -2
- package/src/cli.d.ts +4 -0
- package/src/cli.d.ts.map +1 -0
- package/src/{index.ts → index.d.ts} +1 -7
- package/src/index.d.ts.map +1 -0
- package/src/lib/decorators/factory.decorator.d.ts +7 -0
- package/src/lib/decorators/factory.decorator.d.ts.map +1 -0
- package/src/lib/factory/data.factory.d.ts +7 -0
- package/src/lib/factory/data.factory.d.ts.map +1 -0
- package/src/lib/{index.ts → index.d.ts} +1 -3
- package/src/lib/index.d.ts.map +1 -0
- package/src/lib/interfaces/factory.interface.d.ts +5 -0
- package/src/lib/interfaces/factory.interface.d.ts.map +1 -0
- package/src/lib/interfaces/{index.ts → index.d.ts} +1 -1
- package/src/lib/interfaces/index.d.ts.map +1 -0
- package/src/lib/interfaces/property-metadata.interface.d.ts +7 -0
- package/src/lib/interfaces/property-metadata.interface.d.ts.map +1 -0
- package/src/lib/interfaces/{seeder-module-async-options.interface.ts → seeder-module-async-options.interface.d.ts} +1 -5
- package/src/lib/interfaces/seeder-module-async-options.interface.d.ts.map +1 -0
- package/src/lib/interfaces/{seeder-options-factory.interface.ts → seeder-options-factory.interface.d.ts} +1 -1
- package/src/lib/interfaces/seeder-options-factory.interface.d.ts.map +1 -0
- package/src/lib/seeder/seeder.d.ts +11 -0
- package/src/lib/seeder/seeder.d.ts.map +1 -0
- package/src/lib/seeder/{seeder.interface.ts → seeder.interface.d.ts} +1 -1
- package/src/lib/seeder/seeder.interface.d.ts.map +1 -0
- package/src/lib/seeder/seeder.module.d.ts +18 -0
- package/src/lib/seeder/seeder.module.d.ts.map +1 -0
- package/src/lib/seeder/seeder.service.d.ts +11 -0
- package/src/lib/seeder/seeder.service.d.ts.map +1 -0
- package/src/lib/storages/factory.metadata.storage.d.ts +17 -0
- package/src/lib/storages/factory.metadata.storage.d.ts.map +1 -0
- package/eslint.config.mjs +0 -22
- package/jest.config.ts +0 -10
- package/project.json +0 -38
- package/src/cli.ts +0 -206
- package/src/lib/decorators/factory.decorator.ts +0 -32
- package/src/lib/factory/data.factory.ts +0 -96
- package/src/lib/interfaces/factory.interface.ts +0 -9
- package/src/lib/interfaces/property-metadata.interface.ts +0 -11
- package/src/lib/seeder/seeder.module.ts +0 -97
- package/src/lib/seeder/seeder.service.ts +0 -79
- package/src/lib/seeder/seeder.ts +0 -66
- package/src/lib/storages/factory.metadata.storage.ts +0 -37
- package/tsconfig.json +0 -17
- package/tsconfig.lib.json +0 -14
- package/tsconfig.spec.json +0 -15
package/package.json
CHANGED
package/src/cli.d.ts
ADDED
package/src/cli.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../../packages/nest-seeder/src/cli.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAyB,MAAM,OAAO,CAAC;AAqK3E,eAAO,MAAM,MAAM,GAAI,SAAS,aAAa,KAAG,YAgC/C,CAAC"}
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
export * from './lib/seeder/seeder';
|
|
2
|
-
|
|
3
2
|
export * from './lib/seeder/seeder.interface';
|
|
4
|
-
|
|
5
3
|
export * from './lib/seeder/seeder.module';
|
|
6
|
-
|
|
7
4
|
export * from './lib/seeder/seeder.service';
|
|
8
|
-
|
|
9
5
|
export * from './lib/factory/data.factory';
|
|
10
|
-
|
|
11
6
|
export * from './lib/decorators/factory.decorator';
|
|
12
|
-
|
|
13
7
|
export * from './lib/interfaces/seeder-options-factory.interface';
|
|
14
|
-
|
|
15
8
|
export * from './lib/interfaces/seeder-module-async-options.interface';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/nest-seeder/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AAEpC,cAAc,+BAA+B,CAAC;AAE9C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,mDAAmD,CAAC;AAElE,cAAc,wDAAwD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
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 {};
|
|
7
|
+
//# sourceMappingURL=factory.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.decorator.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/decorators/factory.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAKxC,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;AAEtD,MAAM,MAAM,qBAAqB,GAAG,CAChC,KAAK,CAAC,EAAE,KAAK,EACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACxB,YAAY,CAAC;AAElB,wBAAgB,OAAO,CACnB,SAAS,EAAE,qBAAqB,GAAG,YAAY,EAC/C,SAAS,CAAC,EAAE,MAAM,EAAE,IAGhB,QAAQ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,aAAa,MAAM,GAAG,MAAM,KAC7B,IAAI,CAUV"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.factory.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/factory/data.factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAOxC,qBAAa,WAAW;IAEpB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO;IAuBrD,OAAO,CAAC,MAAM,CAAC,QAAQ;CA2D1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/nest-seeder/src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAEhC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,wBAAwB,CAAC;AAEvC,cAAc,gCAAgC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.interface.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/interfaces/factory.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,MAAM,WAAW,OAAO;IACpB,QAAQ,CACJ,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;CACrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAE9C,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FactoryValueGenerator, FactoryValue } from '../decorators/factory.decorator';
|
|
2
|
+
export interface PropertyMetadata {
|
|
3
|
+
target: () => void;
|
|
4
|
+
propertyKey: string;
|
|
5
|
+
arg: FactoryValueGenerator | FactoryValue;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=property-metadata.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-metadata.interface.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/interfaces/property-metadata.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,qBAAqB,EACrB,YAAY,EACf,MAAM,iCAAiC,CAAC;AAGzC,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,qBAAqB,GAAG,YAAY,CAAC;CAC7C"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Type, ModuleMetadata } from '@nestjs/common';
|
|
2
2
|
import { SeederModuleOptions } from '../seeder/seeder.module';
|
|
3
3
|
import { SeederOptionsFactory } from './seeder-options-factory.interface';
|
|
4
|
-
|
|
5
4
|
/**
|
|
6
5
|
* Async options for SeederModule configuration
|
|
7
6
|
*/
|
|
@@ -10,24 +9,21 @@ export interface SeederModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'
|
|
|
10
9
|
* Make the module global
|
|
11
10
|
*/
|
|
12
11
|
isGlobal?: boolean;
|
|
13
|
-
|
|
14
12
|
/**
|
|
15
13
|
* Use a factory function to create options
|
|
16
14
|
*/
|
|
17
15
|
useFactory?: (...args: any[]) => Promise<SeederModuleOptions> | SeederModuleOptions;
|
|
18
|
-
|
|
19
16
|
/**
|
|
20
17
|
* Use a class that implements SeederOptionsFactory
|
|
21
18
|
*/
|
|
22
19
|
useClass?: Type<SeederOptionsFactory>;
|
|
23
|
-
|
|
24
20
|
/**
|
|
25
21
|
* Use an existing provider
|
|
26
22
|
*/
|
|
27
23
|
useExisting?: Type<SeederOptionsFactory>;
|
|
28
|
-
|
|
29
24
|
/**
|
|
30
25
|
* Dependencies to inject into the factory function or class
|
|
31
26
|
*/
|
|
32
27
|
inject?: any[];
|
|
33
28
|
}
|
|
29
|
+
//# sourceMappingURL=seeder-module-async-options.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder-module-async-options.interface.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/interfaces/seeder-module-async-options.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;IAC7E;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;IAEpF;;OAEG;IACH,QAAQ,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAEtC;;OAEG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAEzC;;OAEG;IACH,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAClB"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { SeederModuleOptions } from '../seeder/seeder.module';
|
|
2
|
-
|
|
3
2
|
/**
|
|
4
3
|
* Interface for SeederOptionsFactory
|
|
5
4
|
* Implement this interface to create a factory class for seeder configuration
|
|
@@ -7,3 +6,4 @@ import { SeederModuleOptions } from '../seeder/seeder.module';
|
|
|
7
6
|
export interface SeederOptionsFactory {
|
|
8
7
|
createSeederOptions(): Promise<SeederModuleOptions> | SeederModuleOptions;
|
|
9
8
|
}
|
|
9
|
+
//# sourceMappingURL=seeder-options-factory.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder-options-factory.interface.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/interfaces/seeder-options-factory.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACjC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;CAC7E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
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;
|
|
11
|
+
//# sourceMappingURL=seeder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/seeder/seeder.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,QAAQ,EACR,IAAI,EACJ,aAAa,EACb,gBAAgB,EACnB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAEH,wBAAwB,EAE3B,MAAM,iBAAiB,CAAC;AAIzB,MAAM,WAAW,aAAa;IAC1B,OAAO,CAAC,EAAE,KAAK,CACX,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,gBAAgB,CACxE,CAAC;IACF,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IACzB,GAAG,CAAC,YAAY,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAaD,eAAO,MAAM,MAAM,GAAI,SAAS,aAAa,KAAG,YAyB/C,CAAC"}
|
|
@@ -3,8 +3,8 @@ export interface SeederServiceOptions {
|
|
|
3
3
|
refresh?: boolean;
|
|
4
4
|
dummyData?: boolean;
|
|
5
5
|
}
|
|
6
|
-
|
|
7
6
|
export interface Seeder {
|
|
8
7
|
seed(options: SeederServiceOptions): Promise<any>;
|
|
9
8
|
drop(options: SeederServiceOptions): Promise<any>;
|
|
10
9
|
}
|
|
10
|
+
//# sourceMappingURL=seeder.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder.interface.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/seeder/seeder.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,MAAM;IACnB,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACrD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
}
|
|
18
|
+
//# sourceMappingURL=seeder.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder.module.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/seeder/seeder.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,aAAa,EACb,QAAQ,EACR,IAAI,EACJ,gBAAgB,EACnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAC;AAG/F,MAAM,WAAW,wBAAyB,SAAQ,oBAAoB;IAClE,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,mBAAoB,SAAQ,wBAAwB;IACjE,OAAO,CAAC,EAAE,KAAK,CACX,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,gBAAgB,CACxE,CAAC;IACF,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC1B;AAID,qBACa,YAAY;IAErB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa;IAkB5D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,wBAAwB,GAAG,aAAa;IAkBrE,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAcnC,OAAO,CAAC,MAAM,CAAC,0BAA0B;CAgB5C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
}
|
|
11
|
+
//# sourceMappingURL=seeder.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeder.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/seeder/seeder.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAGlE,qBACa,aAAa;IAGlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,GAAE,oBAAyB;IAGjD,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IASnB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAYpB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAS1B,cAAc,IAAI,MAAM,EAAE;CAmC7B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
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;
|
|
17
|
+
//# sourceMappingURL=factory.metadata.storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.metadata.storage.d.ts","sourceRoot":"","sources":["../../../../../../packages/nest-seeder/src/lib/storages/factory.metadata.storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EACH,YAAY,EACZ,qBAAqB,EACxB,MAAM,iCAAiC,CAAC;AAGzC,MAAM,MAAM,oBAAoB,GAAG;IAC/B,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,GAAG,EAAE;QACD,SAAS,EAAE,qBAAqB,GAAG,YAAY,CAAC;QAChD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACL,CAAC;AAEF,qBAAa,0BAA0B;IAEnC,OAAO,CAAC,UAAU,CAA8B;IAEhD,mBAAmB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAIzD,4BAA4B,CACxB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GACtB,oBAAoB,EAAE;CAI5B;AAID,eAAO,MAAM,sBAAsB,EAAE,0BACoC,CAAC"}
|
package/eslint.config.mjs
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import baseConfig from '../../eslint.base.config';
|
|
2
|
-
|
|
3
|
-
export default [
|
|
4
|
-
...baseConfig,
|
|
5
|
-
{
|
|
6
|
-
files: ['**/*.json'],
|
|
7
|
-
rules: {
|
|
8
|
-
'@nx/dependency-checks': [
|
|
9
|
-
'error',
|
|
10
|
-
{
|
|
11
|
-
ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}'],
|
|
12
|
-
},
|
|
13
|
-
],
|
|
14
|
-
},
|
|
15
|
-
languageOptions: {
|
|
16
|
-
parser: await import('jsonc-eslint-parser'),
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
ignores: ['**/out-tsc'],
|
|
21
|
-
},
|
|
22
|
-
];
|
package/jest.config.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
displayName: 'test-nest-2',
|
|
3
|
-
preset: '../../jest.preset.js',
|
|
4
|
-
testEnvironment: 'node',
|
|
5
|
-
transform: {
|
|
6
|
-
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
|
|
7
|
-
},
|
|
8
|
-
moduleFileExtensions: ['ts', 'js', 'html'],
|
|
9
|
-
coverageDirectory: '../../coverage/packages/test-nest-2',
|
|
10
|
-
};
|
package/project.json
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "nest-seeder",
|
|
3
|
-
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
-
"sourceRoot": "packages/nest-seeder/src",
|
|
5
|
-
"projectType": "library",
|
|
6
|
-
"release": {
|
|
7
|
-
"version": {
|
|
8
|
-
"manifestRootsToUpdate": [
|
|
9
|
-
"dist/{projectRoot}"
|
|
10
|
-
],
|
|
11
|
-
"currentVersionResolver": "git-tag",
|
|
12
|
-
"fallbackCurrentVersionResolver": "disk"
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"tags": [],
|
|
16
|
-
"targets": {
|
|
17
|
-
"build": {
|
|
18
|
-
"executor": "@nx/js:tsc",
|
|
19
|
-
"outputs": [
|
|
20
|
-
"{options.outputPath}"
|
|
21
|
-
],
|
|
22
|
-
"options": {
|
|
23
|
-
"outputPath": "dist/packages/nest-seeder",
|
|
24
|
-
"tsConfig": "packages/nest-seeder/tsconfig.lib.json",
|
|
25
|
-
"packageJson": "packages/nest-seeder/package.json",
|
|
26
|
-
"main": "packages/nest-seeder/src/index.ts",
|
|
27
|
-
"assets": [
|
|
28
|
-
"packages/nest-seeder/*.md"
|
|
29
|
-
]
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
"nx-release-publish": {
|
|
33
|
-
"options": {
|
|
34
|
-
"packageRoot": "dist/{projectRoot}"
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
package/src/cli.ts
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { SeederModule, SeederModuleExtraOptions } from './lib/seeder/seeder.module';
|
|
4
|
-
import { SeederOptions, SeederRunner, SeederServiceOptions, } from './lib';
|
|
5
|
-
import yargs from 'yargs';
|
|
6
|
-
import { NestFactory } from '@nestjs/core';
|
|
7
|
-
import { SeederService } from './lib/seeder/seeder.service';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
import * as fs from 'fs';
|
|
10
|
-
|
|
11
|
-
interface CliArguments {
|
|
12
|
-
refresh: boolean;
|
|
13
|
-
name?: string[];
|
|
14
|
-
dummyData: boolean;
|
|
15
|
-
config: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async function parseArguments(): Promise<CliArguments> {
|
|
19
|
-
const argv = await yargs(process.argv.slice(2))
|
|
20
|
-
.option('refresh', {
|
|
21
|
-
alias: 'r',
|
|
22
|
-
type: 'boolean',
|
|
23
|
-
description: 'Drop all data before seeding',
|
|
24
|
-
default: false
|
|
25
|
-
})
|
|
26
|
-
.option('name', {
|
|
27
|
-
alias: 'n',
|
|
28
|
-
type: 'array',
|
|
29
|
-
string: true,
|
|
30
|
-
description: 'Specific seeder names to run',
|
|
31
|
-
})
|
|
32
|
-
.option('dummyData', {
|
|
33
|
-
alias: 'd',
|
|
34
|
-
type: 'boolean',
|
|
35
|
-
description: 'Include dummy data',
|
|
36
|
-
default: false
|
|
37
|
-
})
|
|
38
|
-
.option('config', {
|
|
39
|
-
alias: 'c',
|
|
40
|
-
type: 'string',
|
|
41
|
-
description: 'Path to seeder configuration file',
|
|
42
|
-
demandOption: true
|
|
43
|
-
})
|
|
44
|
-
.help()
|
|
45
|
-
.example('nest-seed -c ./seeder.config.ts', 'Run all seeders')
|
|
46
|
-
.example('nest-seed -c ./seeder.config.ts --refresh', 'Drop and reseed all data')
|
|
47
|
-
.example('nest-seed -c ./seeder.config.ts --name UserSeeder', 'Run specific seeder')
|
|
48
|
-
.parseAsync();
|
|
49
|
-
|
|
50
|
-
return {
|
|
51
|
-
refresh: argv.refresh,
|
|
52
|
-
name: argv.name,
|
|
53
|
-
dummyData: argv.dummyData,
|
|
54
|
-
config: argv.config,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function setupTsNode() {
|
|
59
|
-
try {
|
|
60
|
-
// Register ts-node for TypeScript support
|
|
61
|
-
require('ts-node').register({
|
|
62
|
-
transpileOnly: true,
|
|
63
|
-
compilerOptions: {
|
|
64
|
-
module: 'commonjs',
|
|
65
|
-
experimentalDecorators: true,
|
|
66
|
-
emitDecoratorMetadata: true,
|
|
67
|
-
esModuleInterop: true,
|
|
68
|
-
allowSyntheticDefaultImports: true,
|
|
69
|
-
skipLibCheck: true,
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
} catch (error) {
|
|
73
|
-
console.error('Failed to setup TypeScript support. Make sure ts-node is installed:');
|
|
74
|
-
console.error('npm install -D ts-node typescript');
|
|
75
|
-
process.exit(1);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async function loadSeederConfig(configPath: string) {
|
|
80
|
-
try {
|
|
81
|
-
// Resolve the config path relative to current working directory
|
|
82
|
-
const resolvedPath = path.resolve(process.cwd(), configPath);
|
|
83
|
-
|
|
84
|
-
// Check if file exists
|
|
85
|
-
if (!fs.existsSync(resolvedPath)) {
|
|
86
|
-
throw new Error(`Configuration file not found: ${resolvedPath}`);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Setup TypeScript support if needed
|
|
90
|
-
if (configPath.endsWith('.ts')) {
|
|
91
|
-
setupTsNode();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Clear require cache to ensure fresh import
|
|
95
|
-
delete require.cache[resolvedPath];
|
|
96
|
-
|
|
97
|
-
// Import the configuration
|
|
98
|
-
const configModule = await import(resolvedPath);
|
|
99
|
-
const config = configModule.default || configModule;
|
|
100
|
-
|
|
101
|
-
if (!config) {
|
|
102
|
-
throw new Error('Configuration file must export a default configuration object');
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return config;
|
|
106
|
-
} catch (error) {
|
|
107
|
-
console.error('Error loading seeder configuration:');
|
|
108
|
-
console.error(error.message);
|
|
109
|
-
console.error('\nMake sure your configuration file:');
|
|
110
|
-
console.error('1. Exists at the specified path');
|
|
111
|
-
console.error('2. Exports a default configuration object');
|
|
112
|
-
console.error('3. Has proper TypeScript setup if using .ts files');
|
|
113
|
-
process.exit(1);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
async function runSeeder() {
|
|
118
|
-
try {
|
|
119
|
-
const args = await parseArguments();
|
|
120
|
-
|
|
121
|
-
console.log('🌱 Starting NestJS Seeder...');
|
|
122
|
-
console.log(`📁 Loading configuration from: ${args.config}`);
|
|
123
|
-
|
|
124
|
-
// Load the seeder configuration from specified path
|
|
125
|
-
const seederConfig = await loadSeederConfig(args.config);
|
|
126
|
-
|
|
127
|
-
const cliOptions: SeederServiceOptions = {
|
|
128
|
-
refresh: args.refresh,
|
|
129
|
-
name: args.name,
|
|
130
|
-
dummyData: args.dummyData,
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
if (args.refresh) {
|
|
134
|
-
console.log('🔄 Refresh mode: Will drop existing data before seeding');
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (args.name && args.name.length > 0) {
|
|
138
|
-
console.log(`🎯 Running specific seeders: ${args.name.join(', ')}`);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (args.dummyData) {
|
|
142
|
-
console.log('🎲 Dummy data mode enabled');
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const app = await NestFactory.createApplicationContext(
|
|
146
|
-
SeederModule.register({
|
|
147
|
-
...seederConfig,
|
|
148
|
-
...cliOptions,
|
|
149
|
-
}),
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
const seedersService = app.get(SeederService);
|
|
153
|
-
await seedersService.run();
|
|
154
|
-
|
|
155
|
-
await app.close();
|
|
156
|
-
console.log('✅ Seeding completed successfully!');
|
|
157
|
-
process.exit(0);
|
|
158
|
-
} catch (error) {
|
|
159
|
-
console.error('❌ Error running seeder:');
|
|
160
|
-
console.error(error.message);
|
|
161
|
-
if (error.stack && process.env.NODE_ENV === 'development') {
|
|
162
|
-
console.error('\nStack trace:');
|
|
163
|
-
console.error(error.stack);
|
|
164
|
-
}
|
|
165
|
-
process.exit(1);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export const seeder = (options: SeederOptions): SeederRunner => {
|
|
170
|
-
return {
|
|
171
|
-
async run(extraOptions: SeederModuleExtraOptions): Promise<void> {
|
|
172
|
-
const cliOptions: SeederServiceOptions = {};
|
|
173
|
-
const argv: any = yargs(process.argv).argv;
|
|
174
|
-
if (argv.r || argv.refresh) {
|
|
175
|
-
cliOptions.refresh = true;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
if (argv.n || argv.name) {
|
|
179
|
-
cliOptions.name = argv.n || argv.name;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (argv.d || argv.dummyData) {
|
|
183
|
-
cliOptions.dummyData = argv.d || argv.dummyData;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
extraOptions = Object.assign(extraOptions, cliOptions);
|
|
187
|
-
|
|
188
|
-
const app = await NestFactory.createApplicationContext(
|
|
189
|
-
SeederModule.register({
|
|
190
|
-
...options,
|
|
191
|
-
...extraOptions,
|
|
192
|
-
}),
|
|
193
|
-
);
|
|
194
|
-
|
|
195
|
-
const seedersService = app.get(SeederService);
|
|
196
|
-
await seedersService.run();
|
|
197
|
-
|
|
198
|
-
await app.close();
|
|
199
|
-
},
|
|
200
|
-
};
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
// Only run if this file is executed directly
|
|
204
|
-
if (require.main === module) {
|
|
205
|
-
runSeeder();
|
|
206
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { Faker } from '@faker-js/faker';
|
|
2
|
-
|
|
3
|
-
import { FactoryMetadataStorage } from '../storages/factory.metadata.storage';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
type BaseType = string | number | Date | Buffer | boolean | Record<string, any>;
|
|
7
|
-
|
|
8
|
-
export type FactoryValue = BaseType | Array<BaseType>;
|
|
9
|
-
|
|
10
|
-
export type FactoryValueGenerator = (
|
|
11
|
-
faker?: Faker,
|
|
12
|
-
ctx?: Record<string, any>
|
|
13
|
-
) => FactoryValue;
|
|
14
|
-
|
|
15
|
-
export function Factory(
|
|
16
|
-
generator: FactoryValueGenerator | FactoryValue,
|
|
17
|
-
dependsOn?: string[],
|
|
18
|
-
) {
|
|
19
|
-
return (
|
|
20
|
-
target: Record<string, any>,
|
|
21
|
-
propertyKey: string | symbol,
|
|
22
|
-
): void => {
|
|
23
|
-
FactoryMetadataStorage.addPropertyMetadata({
|
|
24
|
-
target: target.constructor,
|
|
25
|
-
propertyKey: propertyKey as string,
|
|
26
|
-
arg: {
|
|
27
|
-
generator,
|
|
28
|
-
dependsOn,
|
|
29
|
-
},
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { faker } from '@faker-js/faker';
|
|
2
|
-
import { Type } from '@nestjs/common';
|
|
3
|
-
|
|
4
|
-
import { FactoryValue } from '../decorators/factory.decorator';
|
|
5
|
-
import { Factory } from '../interfaces';
|
|
6
|
-
import {
|
|
7
|
-
FactoryMetadataStorage,
|
|
8
|
-
PropertyMetadataType,
|
|
9
|
-
} from '../storages/factory.metadata.storage';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
export class DataFactory {
|
|
13
|
-
|
|
14
|
-
static createForClass(target: Type<unknown>): Factory {
|
|
15
|
-
if (!target) {
|
|
16
|
-
throw new Error(
|
|
17
|
-
`Target class "${target}" passed in to the "TemplateFactory#createForClass()" method is "undefined".`,
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const properties = FactoryMetadataStorage.getPropertyMetadatasByTarget(target);
|
|
22
|
-
|
|
23
|
-
return {
|
|
24
|
-
generate: (
|
|
25
|
-
count: number,
|
|
26
|
-
values: Record<string, any> = {},
|
|
27
|
-
): Record<string, FactoryValue>[] => {
|
|
28
|
-
const ret: Record<string, FactoryValue>[] = [];
|
|
29
|
-
for (let i = 0; i < count; i++) {
|
|
30
|
-
ret.push(this.generate(properties, values));
|
|
31
|
-
}
|
|
32
|
-
return ret;
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
private static generate(
|
|
38
|
-
properties: PropertyMetadataType[],
|
|
39
|
-
values: Record<string, any>,
|
|
40
|
-
): Record<string, FactoryValue> {
|
|
41
|
-
const ctx = { ...values };
|
|
42
|
-
|
|
43
|
-
return properties.reduce((result, property) => {
|
|
44
|
-
const propertyKey = property.propertyKey;
|
|
45
|
-
const { generator, dependsOn } = property.arg;
|
|
46
|
-
|
|
47
|
-
// Skip if the value is already generated in the context (ctx)
|
|
48
|
-
if (ctx[propertyKey] !== undefined) {
|
|
49
|
-
return {
|
|
50
|
-
[propertyKey]: ctx[propertyKey],
|
|
51
|
-
...result,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// If the property has dependencies, ensure they are generated first
|
|
56
|
-
if (Array.isArray(dependsOn)) {
|
|
57
|
-
dependsOn.forEach((dependency) => {
|
|
58
|
-
if (ctx[dependency] === undefined) {
|
|
59
|
-
// Find the dependent property and generate it if it hasn't been generated yet
|
|
60
|
-
const dependentProperty = properties.find(
|
|
61
|
-
(p) => p.propertyKey === dependency,
|
|
62
|
-
);
|
|
63
|
-
if (dependentProperty) {
|
|
64
|
-
ctx[dependency] = typeof dependentProperty.arg.generator ===
|
|
65
|
-
'function' ?
|
|
66
|
-
dependentProperty.arg.generator(
|
|
67
|
-
faker,
|
|
68
|
-
ctx,
|
|
69
|
-
) :
|
|
70
|
-
dependentProperty.arg;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Generate the current field
|
|
77
|
-
ctx[propertyKey] = typeof generator === 'function' ?
|
|
78
|
-
generator(faker, ctx) :
|
|
79
|
-
generator;
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
[propertyKey]: ctx[propertyKey],
|
|
83
|
-
...result,
|
|
84
|
-
};
|
|
85
|
-
}, {});
|
|
86
|
-
|
|
87
|
-
// return properties.reduce(
|
|
88
|
-
// (r, p) => ({
|
|
89
|
-
// [p.propertyKey]: ctx[p.propertyKey] = typeof p.arg === 'function' ? p.arg(faker, ctx) : p.arg,
|
|
90
|
-
// ...r,
|
|
91
|
-
// }),
|
|
92
|
-
// {},
|
|
93
|
-
// );
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Module,
|
|
3
|
-
DynamicModule,
|
|
4
|
-
Provider,
|
|
5
|
-
Type,
|
|
6
|
-
ForwardReference,
|
|
7
|
-
} from '@nestjs/common';
|
|
8
|
-
|
|
9
|
-
import { Seeder, SeederServiceOptions } from './seeder.interface';
|
|
10
|
-
import { SeederService } from './seeder.service';
|
|
11
|
-
import { SeederModuleAsyncOptions } from '../interfaces/seeder-module-async-options.interface';
|
|
12
|
-
import { SeederOptionsFactory } from '../interfaces/seeder-options-factory.interface';
|
|
13
|
-
|
|
14
|
-
export interface SeederModuleExtraOptions extends SeederServiceOptions {
|
|
15
|
-
seeders?: Provider<Seeder>[];
|
|
16
|
-
plugins?: any[];
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface SeederModuleOptions extends SeederModuleExtraOptions {
|
|
20
|
-
imports?: Array<
|
|
21
|
-
Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference
|
|
22
|
-
>;
|
|
23
|
-
providers?: Provider[];
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const SEEDER_MODULE_OPTIONS = 'SEEDER_MODULE_OPTIONS';
|
|
27
|
-
|
|
28
|
-
@Module({})
|
|
29
|
-
export class SeederModule {
|
|
30
|
-
|
|
31
|
-
static register(options: SeederModuleOptions): DynamicModule {
|
|
32
|
-
return {
|
|
33
|
-
module: SeederModule,
|
|
34
|
-
imports: options.imports || [],
|
|
35
|
-
providers: [
|
|
36
|
-
...(options.providers || []),
|
|
37
|
-
...options.seeders || [],
|
|
38
|
-
{
|
|
39
|
-
provide: SeederService,
|
|
40
|
-
useFactory: (...seeders: Seeder[]): SeederService => {
|
|
41
|
-
return new SeederService(seeders, options);
|
|
42
|
-
},
|
|
43
|
-
inject: (options.seeders || []) as Type<any>[],
|
|
44
|
-
},
|
|
45
|
-
],
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
static forRootAsync(options: SeederModuleAsyncOptions): DynamicModule {
|
|
50
|
-
return {
|
|
51
|
-
module: SeederModule,
|
|
52
|
-
global: options.isGlobal,
|
|
53
|
-
imports: options.imports || [],
|
|
54
|
-
providers: [
|
|
55
|
-
...this.createAsyncProviders(options),
|
|
56
|
-
{
|
|
57
|
-
provide: SeederService,
|
|
58
|
-
useFactory: async (seederOptions: SeederModuleOptions, ...seeders: Seeder[]): Promise<SeederService> => {
|
|
59
|
-
return new SeederService(seeders, seederOptions);
|
|
60
|
-
},
|
|
61
|
-
inject: [SEEDER_MODULE_OPTIONS, ...(options.inject || [])],
|
|
62
|
-
},
|
|
63
|
-
],
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
private static createAsyncProviders(options: SeederModuleAsyncOptions): Provider[] {
|
|
68
|
-
if (options.useExisting || options.useFactory) {
|
|
69
|
-
return [this.createAsyncOptionsProvider(options)];
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return [
|
|
73
|
-
this.createAsyncOptionsProvider(options),
|
|
74
|
-
{
|
|
75
|
-
provide: options.useClass!,
|
|
76
|
-
useClass: options.useClass!,
|
|
77
|
-
},
|
|
78
|
-
];
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
private static createAsyncOptionsProvider(options: SeederModuleAsyncOptions): Provider {
|
|
82
|
-
if (options.useFactory) {
|
|
83
|
-
return {
|
|
84
|
-
provide: SEEDER_MODULE_OPTIONS,
|
|
85
|
-
useFactory: options.useFactory,
|
|
86
|
-
inject: options.inject || [],
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return {
|
|
91
|
-
provide: SEEDER_MODULE_OPTIONS,
|
|
92
|
-
useFactory: async (optionsFactory: SeederOptionsFactory) =>
|
|
93
|
-
await optionsFactory.createSeederOptions(),
|
|
94
|
-
inject: [options.useExisting || options.useClass!],
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
|
|
3
|
-
import { Seeder, SeederServiceOptions } from './seeder.interface';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
@Injectable()
|
|
7
|
-
export class SeederService {
|
|
8
|
-
|
|
9
|
-
constructor(
|
|
10
|
-
private readonly seeders: Seeder[],
|
|
11
|
-
private readonly options: SeederServiceOptions = {},
|
|
12
|
-
) { }
|
|
13
|
-
|
|
14
|
-
async run(): Promise<any> {
|
|
15
|
-
if (this.options.refresh) {
|
|
16
|
-
await this.drop();
|
|
17
|
-
await this.seed();
|
|
18
|
-
} else {
|
|
19
|
-
await this.seed();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
async seed(): Promise<any> {
|
|
24
|
-
// Don't use `Promise.all` during insertion.
|
|
25
|
-
// `Promise.all` will run all promises in parallel which is not what we want.
|
|
26
|
-
const seeders = this.getSeederToRun();
|
|
27
|
-
|
|
28
|
-
for (const seeder of seeders) {
|
|
29
|
-
console.info(`${seeder.constructor.name} start`);
|
|
30
|
-
await seeder.seed(this.options);
|
|
31
|
-
console.info(`${seeder.constructor.name} completed`);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
async drop(): Promise<any> {
|
|
36
|
-
const seeders = this.getSeederToRun();
|
|
37
|
-
for (const seeder of seeders) {
|
|
38
|
-
console.info(`Truncate ${seeder.constructor.name} start`);
|
|
39
|
-
await seeder.drop(this.options);
|
|
40
|
-
console.info(`Truncate ${seeder.constructor.name} completed`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
getSeederToRun(): Seeder[] {
|
|
45
|
-
if (this.options?.name && typeof this.options.name === 'string') {
|
|
46
|
-
this.options.name = [this.options.name];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (this.options.name) {
|
|
50
|
-
const nameArray = Array.isArray(this.options.name) ? this.options.name : [this.options.name];
|
|
51
|
-
const seeders = this.seeders.filter(
|
|
52
|
-
(s) => nameArray.indexOf(s.constructor.name) >= 0,
|
|
53
|
-
);
|
|
54
|
-
if (seeders?.length === 0) {
|
|
55
|
-
const allNames = this.seeders.map((s) => s.constructor.name);
|
|
56
|
-
console.warn(
|
|
57
|
-
'\x1b[43m',
|
|
58
|
-
'Warning : No Seeder Found. Available Name are',
|
|
59
|
-
'\x1b[0m',
|
|
60
|
-
'\x1b[32m',
|
|
61
|
-
'\n',
|
|
62
|
-
`${allNames.join('\n')}`,
|
|
63
|
-
'\x1b[0m',
|
|
64
|
-
);
|
|
65
|
-
return [];
|
|
66
|
-
}
|
|
67
|
-
return seeders;
|
|
68
|
-
}
|
|
69
|
-
if (this.seeders?.length === 0) {
|
|
70
|
-
console.info(
|
|
71
|
-
'\x1b[43m',
|
|
72
|
-
'Warning : No seeders to run. Make sure you have passed default seeder',
|
|
73
|
-
'\x1b[0m',
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
return this.seeders;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
}
|
package/src/lib/seeder/seeder.ts
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Provider,
|
|
3
|
-
Type,
|
|
4
|
-
DynamicModule,
|
|
5
|
-
ForwardReference,
|
|
6
|
-
} from '@nestjs/common';
|
|
7
|
-
import { NestFactory } from '@nestjs/core';
|
|
8
|
-
import yargs from 'yargs';
|
|
9
|
-
|
|
10
|
-
import { SeederServiceOptions } from './seeder.interface';
|
|
11
|
-
import {
|
|
12
|
-
SeederModule,
|
|
13
|
-
SeederModuleExtraOptions,
|
|
14
|
-
SeederModuleOptions,
|
|
15
|
-
} from './seeder.module';
|
|
16
|
-
import { SeederService } from './seeder.service';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export interface SeederOptions {
|
|
20
|
-
imports?: Array<
|
|
21
|
-
Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference
|
|
22
|
-
>;
|
|
23
|
-
providers?: Provider[];
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface SeederRunner {
|
|
27
|
-
run(extraOptions: SeederModuleExtraOptions): Promise<void>;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async function bootstrap(options: SeederModuleOptions) {
|
|
31
|
-
const app = await NestFactory.createApplicationContext(
|
|
32
|
-
SeederModule.register(options),
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
const seedersService = app.get(SeederService);
|
|
36
|
-
await seedersService.run();
|
|
37
|
-
|
|
38
|
-
await app.close();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export const seeder = (options: SeederOptions): SeederRunner => {
|
|
42
|
-
return {
|
|
43
|
-
run(extraOptions: SeederModuleExtraOptions): Promise<void> {
|
|
44
|
-
const cliOptions: SeederServiceOptions = {};
|
|
45
|
-
const argv:any = yargs(process.argv).argv;
|
|
46
|
-
if (argv.r || argv.refresh) {
|
|
47
|
-
cliOptions.refresh = true;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (argv.n || argv.name) {
|
|
51
|
-
cliOptions.name = argv.n || argv.name;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (argv.d || argv.dummyData) {
|
|
55
|
-
cliOptions.dummyData = argv.d || argv.dummyData;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
extraOptions = Object.assign(extraOptions, cliOptions);
|
|
59
|
-
|
|
60
|
-
return bootstrap({
|
|
61
|
-
...options,
|
|
62
|
-
...extraOptions,
|
|
63
|
-
});
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { Type } from '@nestjs/common';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
FactoryValue,
|
|
5
|
-
FactoryValueGenerator,
|
|
6
|
-
} from '../decorators/factory.decorator';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export type PropertyMetadataType = {
|
|
10
|
-
target?: any;
|
|
11
|
-
propertyKey?: any;
|
|
12
|
-
arg: {
|
|
13
|
-
generator: FactoryValueGenerator | FactoryValue;
|
|
14
|
-
dependsOn?: string[];
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export class FactoryMetadataStorageHost {
|
|
19
|
-
|
|
20
|
-
private properties: PropertyMetadataType[] = [];
|
|
21
|
-
|
|
22
|
-
addPropertyMetadata(metadata: PropertyMetadataType): void {
|
|
23
|
-
this.properties.push(metadata);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
getPropertyMetadatasByTarget(
|
|
27
|
-
target: Type<unknown>,
|
|
28
|
-
): PropertyMetadataType[] {
|
|
29
|
-
return this.properties.filter((property) => property.target === target);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const globalRef = global as any;
|
|
35
|
-
|
|
36
|
-
export const FactoryMetadataStorage: FactoryMetadataStorageHost = globalRef.FactoryMetadataStorage ||
|
|
37
|
-
(globalRef.FactoryMetadataStorage = new FactoryMetadataStorageHost());
|
package/tsconfig.json
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.base.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"module": "commonjs",
|
|
5
|
-
"forceConsistentCasingInFileNames": true
|
|
6
|
-
},
|
|
7
|
-
"files": [],
|
|
8
|
-
"include": [],
|
|
9
|
-
"references": [
|
|
10
|
-
{
|
|
11
|
-
"path": "./tsconfig.lib.json"
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"path": "./tsconfig.spec.json"
|
|
15
|
-
}
|
|
16
|
-
]
|
|
17
|
-
}
|
package/tsconfig.lib.json
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"outDir": "../../dist/out-tsc",
|
|
5
|
-
"declaration": true,
|
|
6
|
-
"types": ["node"],
|
|
7
|
-
"target": "es2021",
|
|
8
|
-
"experimentalDecorators": true,
|
|
9
|
-
"emitDecoratorMetadata": true,
|
|
10
|
-
"forceConsistentCasingInFileNames": true
|
|
11
|
-
},
|
|
12
|
-
"include": ["src/**/*.ts"],
|
|
13
|
-
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
|
|
14
|
-
}
|
package/tsconfig.spec.json
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"outDir": "../../dist/out-tsc",
|
|
5
|
-
"module": "commonjs",
|
|
6
|
-
"moduleResolution": "node10",
|
|
7
|
-
"types": ["jest", "node"]
|
|
8
|
-
},
|
|
9
|
-
"include": [
|
|
10
|
-
"jest.config.ts",
|
|
11
|
-
"src/**/*.test.ts",
|
|
12
|
-
"src/**/*.spec.ts",
|
|
13
|
-
"src/**/*.d.ts"
|
|
14
|
-
]
|
|
15
|
-
}
|