@@ -10,7 +10,7 @@ import {
10
10
import { TypeComposer , InputTypeComposer } from 'graphql-compose' ;
11
11
import { getIndexesFromModel } from '../../utils/getIndexesFromModel' ;
12
12
import { isObject } from '../../utils/is' ;
13
- import { toDottedObject , upperFirst } from '../../utils' ;
13
+ import { toMongoDottedObject , upperFirst } from '../../utils' ;
14
14
import typeStorage from '../../typeStorage' ;
15
15
import type {
16
16
GraphQLFieldConfigArgumentMap ,
@@ -23,24 +23,27 @@ import type {
23
23
24
24
export const OPERATORS_FIELDNAME = '_operators' ;
25
25
26
-
27
26
export const filterHelperArgs = (
28
27
typeComposer : TypeComposer ,
29
28
model : MongooseModelT ,
30
- opts : filterHelperArgsOpts
29
+ opts : filterHelperArgsOpts ,
31
30
) : GraphQLFieldConfigArgumentMap => {
32
31
if ( ! ( typeComposer instanceof TypeComposer ) ) {
33
- throw new Error ( 'First arg for filterHelperArgs() should be instance of TypeComposer.' ) ;
32
+ throw new Error (
33
+ 'First arg for filterHelperArgs() should be instance of TypeComposer.' ,
34
+ ) ;
34
35
}
35
36
36
37
if ( ! model || ! model . modelName || ! model . schema ) {
37
38
throw new Error (
38
- 'Second arg for filterHelperArgs() should be instance of MongooseModel.'
39
+ 'Second arg for filterHelperArgs() should be instance of MongooseModel.' ,
39
40
) ;
40
41
}
41
42
42
43
if ( ! opts || ! opts . filterTypeName ) {
43
- throw new Error ( 'You should provide non-empty `filterTypeName` in options.' ) ;
44
+ throw new Error (
45
+ 'You should provide non-empty `filterTypeName` in options.' ,
46
+ ) ;
44
47
}
45
48
46
49
const removeFields = [ ] ;
@@ -54,28 +57,32 @@ export const filterHelperArgs = (
54
57
55
58
if ( opts . onlyIndexed ) {
56
59
const indexedFieldNames = getIndexedFieldNames ( model ) ;
57
- Object . keys ( typeComposer . getFields ( ) ) . forEach ( ( fieldName ) => {
60
+ Object . keys ( typeComposer . getFields ( ) ) . forEach ( fieldName => {
58
61
if ( indexedFieldNames . indexOf ( fieldName ) === - 1 ) {
59
62
removeFields . push ( fieldName ) ;
60
63
}
61
64
} ) ;
62
65
}
63
66
64
67
const filterTypeName : string = opts . filterTypeName ;
65
- const inputComposer = typeComposer . getInputTypeComposer ( ) . clone ( filterTypeName ) ;
68
+ const inputComposer = typeComposer
69
+ . getInputTypeComposer ( )
70
+ . clone ( filterTypeName ) ;
66
71
inputComposer . removeField ( removeFields ) ;
67
72
68
73
if ( opts . requiredFields ) {
69
74
inputComposer . makeRequired ( opts . requiredFields ) ;
70
75
}
71
76
72
- if ( ! { } . hasOwnProperty . call ( opts , 'operators' ) || opts . operators !== false ) {
77
+ if (
78
+ ! ( { } ) . hasOwnProperty . call ( opts , 'operators' ) || opts . operators !== false
79
+ ) {
73
80
addFieldsWithOperator (
74
81
// $FlowFixMe
75
82
`Operators${ opts . filterTypeName } ` ,
76
83
inputComposer ,
77
84
model ,
78
- opts . operators || { }
85
+ opts . operators || { } ,
79
86
) ;
80
87
}
81
88
@@ -102,25 +109,28 @@ export function filterHelper(resolveParams: ExtendedResolveParams): void {
102
109
if ( filter && typeof filter === 'object' && Object . keys ( filter ) . length > 0 ) {
103
110
const modelFields = resolveParams . query . schema . paths ;
104
111
const clearedFilter = { } ;
105
- Object . keys ( filter ) . forEach ( ( key ) => {
112
+ Object . keys ( filter ) . forEach ( key => {
106
113
if ( modelFields [ key ] ) {
107
114
clearedFilter [ key ] = filter [ key ] ;
108
115
}
109
116
} ) ;
110
117
if ( Object . keys ( clearedFilter ) . length > 0 ) {
111
- resolveParams . query = resolveParams . query . where ( toDottedObject ( clearedFilter ) ) ; // eslint-disable-line
118
+ resolveParams . query = resolveParams . query . where (
119
+ toMongoDottedObject ( clearedFilter ) ,
120
+ ) ; // eslint-disable-line
112
121
}
113
122
114
123
if ( filter [ OPERATORS_FIELDNAME ] ) {
115
124
const operatorFields = filter [ OPERATORS_FIELDNAME ] ;
116
- Object . keys ( operatorFields ) . forEach ( ( fieldName ) => {
125
+ Object . keys ( operatorFields ) . forEach ( fieldName => {
117
126
const fieldOperators = Object . assign ( { } , operatorFields [ fieldName ] ) ;
118
127
const criteria = { } ;
119
- Object . keys ( fieldOperators ) . forEach ( ( operatorName ) => {
128
+ Object . keys ( fieldOperators ) . forEach ( operatorName => {
120
129
criteria [ `$${ operatorName } ` ] = fieldOperators [ operatorName ] ;
121
130
} ) ;
122
131
if ( Object . keys ( criteria ) . length > 0 ) {
123
- resolveParams . query = resolveParams . query . where ( { // eslint-disable-line
132
+ resolveParams . query = resolveParams . query . where ( {
133
+ // eslint-disable-line
124
134
[ fieldName ] : criteria ,
125
135
} ) ;
126
136
}
@@ -129,18 +139,19 @@ export function filterHelper(resolveParams: ExtendedResolveParams): void {
129
139
}
130
140
131
141
if ( isObject ( resolveParams . rawQuery ) ) {
132
- resolveParams . query = resolveParams . query . where ( // eslint-disable-line
133
- // $FlowFixMe
134
- resolveParams . rawQuery
135
- ) ;
142
+ resolveParams . query = resolveParams . query
143
+ . where ( // eslint-disable-line
144
+ // $FlowFixMe
145
+ resolveParams . rawQuery ,
146
+ ) ;
136
147
}
137
148
}
138
149
139
150
export function getIndexedFieldNames ( model : MongooseModelT ) : string [ ] {
140
151
const indexes = getIndexesFromModel ( model ) ;
141
152
142
153
const fieldNames = [ ] ;
143
- indexes . forEach ( ( indexData ) => {
154
+ indexes . forEach ( indexData => {
144
155
const keys = Object . keys ( indexData ) ;
145
156
const clearedName = keys [ 0 ] . replace ( / [ ^ _ a - z A - Z 0 - 9 ] / i, '__' ) ;
146
157
fieldNames . push ( clearedName ) ;
@@ -153,32 +164,39 @@ export function addFieldsWithOperator(
153
164
typeName : string ,
154
165
inputComposer : InputTypeComposer ,
155
166
model : MongooseModelT ,
156
- operatorsOpts : filterOperatorsOpts
167
+ operatorsOpts : filterOperatorsOpts ,
157
168
) : InputTypeComposer {
158
169
const operatorsComposer = new InputTypeComposer (
159
170
typeStorage . getOrSet (
160
171
typeName ,
161
172
new GraphQLInputObjectType ( {
162
173
name : typeName ,
163
174
fields : { } ,
164
- } )
165
- )
175
+ } ) ,
176
+ ) ,
166
177
) ;
167
178
168
- const availableOperators : filterOperatorNames [ ]
169
- = [ 'gt' , 'gte' , 'lt' , 'lte' , 'ne' , 'in[]' , 'nin[]' ] ;
179
+ const availableOperators : filterOperatorNames [ ] = [
180
+ 'gt' ,
181
+ 'gte' ,
182
+ 'lt' ,
183
+ 'lte' ,
184
+ 'ne' ,
185
+ 'in[]' ,
186
+ 'nin[]' ,
187
+ ] ;
170
188
171
189
// if `opts.resolvers.[resolverName].filter.operators` is empty and not disabled via `false`
172
190
// then fill it up with indexed fields
173
191
const indexedFields = getIndexedFieldNames ( model ) ;
174
192
if ( operatorsOpts !== false && Object . keys ( operatorsOpts ) . length === 0 ) {
175
- indexedFields . forEach ( ( fieldName ) => {
193
+ indexedFields . forEach ( fieldName => {
176
194
operatorsOpts [ fieldName ] = availableOperators ; // eslint-disable-line
177
195
} ) ;
178
196
}
179
197
180
198
const existedFields = inputComposer . getFields ( ) ;
181
- Object . keys ( existedFields ) . forEach ( ( fieldName ) => {
199
+ Object . keys ( existedFields ) . forEach ( fieldName => {
182
200
if ( operatorsOpts [ fieldName ] && operatorsOpts [ fieldName ] !== false ) {
183
201
const fields = { } ;
184
202
let operators ;
@@ -187,7 +205,7 @@ export function addFieldsWithOperator(
187
205
} else {
188
206
operators = availableOperators ;
189
207
}
190
- operators . forEach ( ( operatorName ) => {
208
+ operators . forEach ( operatorName => {
191
209
// unwrap from GraphQLNonNull and GraphQLList, if present
192
210
const namedType = getNamedType ( existedFields [ fieldName ] . type ) ;
193
211
if ( namedType ) {
@@ -214,7 +232,7 @@ export function addFieldsWithOperator(
214
232
new GraphQLInputObjectType ( {
215
233
name : operatorTypeName ,
216
234
fields,
217
- } )
235
+ } ) ,
218
236
) ,
219
237
description : 'Filter value by operator(s)' ,
220
238
} ) ;
0 commit comments