@@ -2,21 +2,27 @@ import { printSchema, parse, visit, ASTKindToNode, NamedTypeNode, TypeNode, Visi
2
2
import casual from 'casual' ;
3
3
import { PluginFunction } from '@graphql-codegen/plugin-helpers' ;
4
4
import { pascalCase } from 'pascal-case' ;
5
+ import { upperCase } from 'upper-case' ;
6
+
7
+ type EnumValuesTypes = 'upper-case#upperCase' | 'pascal-case#pascalCase' ;
8
+
9
+ const toMockName = ( name : string ) => {
10
+ const isVowel = name . match ( / ^ [ A E I O ] / ) ;
11
+ return isVowel ? `an${ name } ` : `a${ name } ` ;
12
+ } ;
13
+
14
+ const updateTextCase = ( str : string , enumValues : EnumValuesTypes ) => {
15
+ const convert = ( value : string ) =>
16
+ enumValues === 'upper-case#upperCase' ? upperCase ( value || '' ) : pascalCase ( value || '' ) ;
5
17
6
- export function toPascalCase ( str : string ) {
7
18
if ( str . charAt ( 0 ) === '_' ) {
8
19
return str . replace (
9
20
/ ^ ( _ * ) ( .* ) / ,
10
- ( _match , underscorePrefix , typeName ) => `${ underscorePrefix } ${ pascalCase ( typeName || '' ) } ` ,
21
+ ( _match , underscorePrefix , typeName ) => `${ underscorePrefix } ${ convert ( typeName ) } ` ,
11
22
) ;
12
23
}
13
24
14
- return pascalCase ( str || '' ) ;
15
- }
16
-
17
- const toMockName = ( name : string ) => {
18
- const isVowel = name . match ( / ^ [ A E I O ] / ) ;
19
- return isVowel ? `an${ name } ` : `a${ name } ` ;
25
+ return convert ( str ) ;
20
26
} ;
21
27
22
28
const hashedString = ( value : string ) => {
@@ -38,6 +44,7 @@ const getNamedType = (
38
44
typeName : string ,
39
45
fieldName : string ,
40
46
types : TypeItem [ ] ,
47
+ enumValues : EnumValuesTypes ,
41
48
namedType ?: NamedTypeNode ,
42
49
) : string | number | boolean => {
43
50
if ( ! namedType ) {
@@ -66,11 +73,17 @@ const getNamedType = (
66
73
case 'enum' : {
67
74
// It's an enum
68
75
const value = foundType . values ? foundType . values [ 0 ] : '' ;
69
- return `${ foundType . name } .${ toPascalCase ( value ) } ` ;
76
+ return `${ foundType . name } .${ updateTextCase ( value , enumValues ) } ` ;
70
77
}
71
78
case 'union' :
72
79
// Return the first union type node.
73
- return getNamedType ( typeName , fieldName , types , foundType . types && foundType . types [ 0 ] ) ;
80
+ return getNamedType (
81
+ typeName ,
82
+ fieldName ,
83
+ types ,
84
+ enumValues ,
85
+ foundType . types && foundType . types [ 0 ] ,
86
+ ) ;
74
87
default :
75
88
throw `foundType is unknown: ${ foundType . name } : ${ foundType . type } ` ;
76
89
}
@@ -84,15 +97,16 @@ const generateMockValue = (
84
97
typeName : string ,
85
98
fieldName : string ,
86
99
types : TypeItem [ ] ,
100
+ enumValues : EnumValuesTypes ,
87
101
currentType : TypeNode ,
88
102
) : string | number | boolean => {
89
103
switch ( currentType . kind ) {
90
104
case 'NamedType' :
91
- return getNamedType ( typeName , fieldName , types , currentType as NamedTypeNode ) ;
105
+ return getNamedType ( typeName , fieldName , types , enumValues , currentType as NamedTypeNode ) ;
92
106
case 'NonNullType' :
93
- return generateMockValue ( typeName , fieldName , types , currentType . type ) ;
107
+ return generateMockValue ( typeName , fieldName , types , enumValues , currentType . type ) ;
94
108
case 'ListType' : {
95
- const value = generateMockValue ( typeName , fieldName , types , currentType . type ) ;
109
+ const value = generateMockValue ( typeName , fieldName , types , enumValues , currentType . type ) ;
96
110
return `[${ value } ]` ;
97
111
}
98
112
}
@@ -104,21 +118,21 @@ const getMockString = (typeName: string, fields: string, addTypename = false) =>
104
118
export const ${ toMockName ( typeName ) } = (overrides?: Partial<${ typeName } >): ${ typeName } => {
105
119
return {${ typename }
106
120
${ fields }
107
- ...overrides
108
121
};
109
122
};` ;
110
123
} ;
111
124
112
125
export interface TypescriptMocksPluginConfig {
113
126
typesFile ?: string ;
127
+ enumValues ?: EnumValuesTypes ;
114
128
addTypename ?: boolean ;
115
129
}
116
130
117
131
interface TypeItem {
118
132
name : string ;
119
133
type : string ;
120
134
values ?: string [ ] ;
121
- types ?: ReadonlyArray < NamedTypeNode > ;
135
+ types ?: readonly NamedTypeNode [ ] ;
122
136
}
123
137
124
138
type VisitorType = { [ K in keyof ASTKindToNode ] ?: VisitFn < ASTKindToNode [ keyof ASTKindToNode ] , ASTKindToNode [ K ] > } ;
@@ -129,6 +143,8 @@ type VisitorType = { [K in keyof ASTKindToNode]?: VisitFn<ASTKindToNode[keyof AS
129
143
export const plugin : PluginFunction < TypescriptMocksPluginConfig > = ( schema , documents , config ) => {
130
144
const printedSchema = printSchema ( schema ) ; // Returns a string representation of the schema
131
145
const astNode = parse ( printedSchema ) ; // Transforms the string into ASTNode
146
+
147
+ const enumValues = config . enumValues || 'pascal-case#pascalCase' ;
132
148
// List of types that are enums
133
149
const types : TypeItem [ ] = [ ] ;
134
150
const visitor : VisitorType = {
@@ -158,9 +174,9 @@ export const plugin: PluginFunction<TypescriptMocksPluginConfig> = (schema, docu
158
174
return {
159
175
name : fieldName ,
160
176
mockFn : ( typeName : string ) => {
161
- const value = generateMockValue ( typeName , fieldName , types , node . type ) ;
177
+ const value = generateMockValue ( typeName , fieldName , types , enumValues , node . type ) ;
162
178
163
- return ` ${ fieldName } : ${ value } ,` ;
179
+ return ` ${ fieldName } : overrides && overrides.hasOwnProperty(' ${ fieldName } ') ? overrides. ${ fieldName } ! : ${ value } ,` ;
164
180
} ,
165
181
} ;
166
182
} ,
@@ -173,9 +189,15 @@ export const plugin: PluginFunction<TypescriptMocksPluginConfig> = (schema, docu
173
189
const mockFields = node . fields
174
190
? node . fields
175
191
. map ( ( field ) => {
176
- const value = generateMockValue ( fieldName , field . name . value , types , field . type ) ;
177
-
178
- return ` ${ field . name . value } : ${ value } ,` ;
192
+ const value = generateMockValue (
193
+ fieldName ,
194
+ field . name . value ,
195
+ types ,
196
+ enumValues ,
197
+ field . type ,
198
+ ) ;
199
+
200
+ return ` ${ field . name . value } : overrides && overrides.hasOwnProperty('${ field . name . value } ') ? overrides.${ field . name . value } ! : ${ value } ,` ;
179
201
} )
180
202
. join ( '\n' )
181
203
: '' ;
0 commit comments