@@ -6,44 +6,108 @@ import {
66 MockPropertyMetadata ,
77 MockPropertyDecorator ,
88 ArrayConfig ,
9- MockPropertyDecoratorProps
9+ MockPropertyDecoratorProps ,
10+ MockClassDecorator ,
11+ MockClassDecoratorProps
1012} from '@/utils/types-helper'
1113
12- export function ConfigDecorator < T extends MockPropertyDecoratorConfig = MockPropertyDecoratorConfig > (
13- config : T = < T > { }
14- ) : MockPropertyDecorator < T > {
15- const createConfigDecorator = ( config : T = < T > { } ) => {
14+ export interface ConfigDecoratorOptions < IsClass extends boolean = false > {
15+ /**
16+ * for class decorator
17+ */
18+ overridePropertyKey ?: string
19+
20+ /**
21+ * for class decorator
22+ */
23+ isClass ?: IsClass
24+ }
25+ export function ConfigDecorator <
26+ T extends MockPropertyDecoratorConfig = MockPropertyDecoratorConfig ,
27+ IsClass extends boolean = false
28+ > (
29+ config : T = < T > { } ,
30+ options : ConfigDecoratorOptions < IsClass > = { }
31+ ) : IsClass extends true ? MockClassDecorator < T > : MockPropertyDecorator < T > {
32+ const { overridePropertyKey, isClass} = options
33+
34+ const createConfigDecorator = < IsClass extends boolean = false > (
35+ config : T = < T > { }
36+ ) : IsClass extends true ? MockClassDecorator < T > : MockPropertyDecorator < T > => {
1637 const decorator = ( target : any , propertyKey : string | symbol ) => {
17- const propertyName = propertyKey as string
38+ const propertyName = overridePropertyKey ? overridePropertyKey : ( propertyKey as string )
1839 const _target = getTarget ( target )
19- const preMetadata = MetadataStorage . instance . findMockMetadata ( _target , propertyName )
20- const metadata : MockPropertyMetadata = mergeConfig ( preMetadata , {
21- target : _target ,
22- propertyName,
23- ...config
24- } )
25-
26- MetadataStorage . instance . addMockMetadata ( metadata )
40+ if ( ! isClass ) {
41+ const preMetadata = MetadataStorage . instance . findMockMetadata ( _target , propertyName )
42+ const metadata : MockPropertyMetadata = mergeConfig ( preMetadata , {
43+ target : _target ,
44+ propertyName,
45+ ...config
46+ } )
47+
48+ MetadataStorage . instance . setMockMetadata ( metadata )
49+ } else {
50+ MetadataStorage . instance . mergeAllPropertyMockMetadata ( _target , config , ( oldMeta , mergeMeta ) => {
51+ const finalPartial =
52+ oldMeta . partial === undefined || oldMeta . partial === null || oldMeta . partial === 'auto'
53+ ? mergeMeta ?. partial ?? oldMeta . partial
54+ : oldMeta . partial
55+
56+ const finalAlwaysRandom =
57+ oldMeta . alwaysRandom === undefined || oldMeta . alwaysRandom === null
58+ ? mergeMeta ?. alwaysRandom ?? oldMeta . alwaysRandom
59+ : oldMeta . alwaysRandom
60+
61+ MetadataStorage . instance . updateMockMetadata ( oldMeta . target , oldMeta . propertyName , {
62+ partial : finalPartial ,
63+ alwaysRandom : finalAlwaysRandom
64+ } )
65+ } )
66+ }
2767 }
2868
29- const createMergeConfigDecorator = ( newConfig : T = < T > { } ) => createConfigDecorator ( mergeConfig ( config , newConfig ) )
69+ const createMergeConfigDecorator = < IsClass extends boolean = false > ( newConfig : T = < T > { } ) =>
70+ createConfigDecorator < IsClass > ( mergeConfig ( config , newConfig ) )
3071
31- const decoratorProto : MockPropertyDecoratorProps < T > = {
72+ const propertyDecoratorProto : MockPropertyDecoratorProps < T > = {
3273 config : ( _config : T = < T > { } ) => createMergeConfigDecorator ( _config ) ,
3374 isPartial : ( ) => createMergeConfigDecorator ( < T > { partial : 'partial' } ) ,
3475 isInclude : ( ) => createMergeConfigDecorator ( < T > { partial : 'include' } ) ,
3576 isExclude : ( ) => createMergeConfigDecorator ( < T > { partial : 'exclude' } ) ,
3677 isAlwaysRandom : ( ) => createMergeConfigDecorator ( < T > { alwaysRandom : true } ) ,
3778 isNotAlwaysRandom : ( ) => createMergeConfigDecorator ( < T > { alwaysRandom : false } ) ,
38- isArray : ( arrayConfig ?: ArrayConfig ) => createMergeConfigDecorator ( < T > { array : true , ...arrayConfig } ) ,
79+ isArray : ( arrayConfig ?: ArrayConfig | number ) =>
80+ createMergeConfigDecorator ( < T > {
81+ array : true ,
82+ ...( typeof arrayConfig === 'number' ? { length : arrayConfig } : arrayConfig )
83+ } ) ,
3984 isNotArray : ( ) => createMergeConfigDecorator ( < T > { array : false } ) ,
4085 groups : ( groups : string [ ] ) => createMergeConfigDecorator ( < T > { groups} )
4186 }
4287
43- Object . assign ( decorator , decoratorProto )
88+ const classDecoratorProto : MockClassDecoratorProps < T > = {
89+ DefaultPartial : ( ) => createMergeConfigDecorator < true > ( < T > { partial : 'partial' } ) ,
90+ DefaultInclude : ( ) => createMergeConfigDecorator < true > ( < T > { partial : 'include' } ) ,
91+ DefaultExclude : ( ) => createMergeConfigDecorator < true > ( < T > { partial : 'exclude' } ) ,
92+ DefaultAlwaysRandom : ( ) => createMergeConfigDecorator < true > ( < T > { alwaysRandom : true } ) ,
93+ DefaultNotAlwaysRandom : ( ) => createMergeConfigDecorator < true > ( < T > { alwaysRandom : false } )
94+ }
95+
96+ Object . assign ( decorator , isClass ? classDecoratorProto : propertyDecoratorProto )
4497
45- return decorator as MockPropertyDecorator < T >
98+ return decorator as IsClass extends true ? MockClassDecorator < T > : MockPropertyDecorator < T >
4699 }
47100
48101 return createConfigDecorator ( config )
49102}
103+
104+ const _decoratorProto = ConfigDecorator ( )
105+ export const Config = _decoratorProto . config
106+ export const IsPartial = _decoratorProto . isPartial
107+ export const IsInclude = _decoratorProto . isInclude
108+ export const IsExclude = _decoratorProto . isExclude
109+ export const IsAlwaysRandom = _decoratorProto . isAlwaysRandom
110+ export const IsNotAlwaysRandom = _decoratorProto . isNotAlwaysRandom
111+ export const IsArray = _decoratorProto . isArray
112+ export const IsNotArray = _decoratorProto . isNotArray
113+ export const Groups = _decoratorProto . groups
0 commit comments