@@ -7,51 +7,103 @@ module.exports = function ConnectionArgFilterPlugin(
77 } = { }
88) {
99 builder . hook ( "build" , build => {
10- const connectionFilterOperators = { } ;
11- return build . extend ( build , {
12- connectionFilterOperators,
13- addConnectionFilterOperator (
14- defaultName ,
15- description ,
16- resolveType ,
17- resolveWhereClause ,
18- options = { }
10+ const connectionFilterOperatorsByFieldType = { } ;
11+ const connectionFilterOperatorsGlobal = { } ;
12+
13+ const addConnectionFilterOperator = (
14+ defaultName ,
15+ description ,
16+ resolveType ,
17+ resolveWhereClause ,
18+ options = { }
19+ ) => {
20+ if ( ! defaultName ) {
21+ throw new Error (
22+ `Missing argument 'defaultName' in call to 'addConnectionFilterOperator'`
23+ ) ;
24+ }
25+ if ( ! resolveType ) {
26+ throw new Error (
27+ `Missing argument 'resolveType' for filter operator '${ defaultName } '`
28+ ) ;
29+ }
30+ if ( ! resolveWhereClause ) {
31+ throw new Error (
32+ `Missing argument 'resolveWhereClause' for filter operator '${ defaultName } '`
33+ ) ;
34+ }
35+
36+ // If `connectionFilterOperatorNames` is specified, override the operator name
37+ const operatorName =
38+ connectionFilterOperatorNames [ defaultName ] || defaultName ;
39+
40+ // If `connectionFilterAllowedOperators` is specified and this operator isn't included, skip it
41+ if (
42+ connectionFilterAllowedOperators &&
43+ ! connectionFilterAllowedOperators . includes ( operatorName )
1944 ) {
20- if ( ! defaultName ) {
21- throw new Error ( "No filter operator defaultName specified" ) ;
22- }
23- const name = connectionFilterOperatorNames [ defaultName ] || defaultName ;
24- if ( connectionFilterOperators [ name ] ) {
25- throw new Error (
26- "There is already a filter operator with the name '" + name + "'"
27- ) ;
28- }
29- if ( ! resolveType ) {
30- throw new Error (
31- "No filter operator type specified for '" + name + "'"
32- ) ;
33- }
34- if ( ! resolveWhereClause ) {
35- throw new Error (
36- "No filter operator where clause resolver specified for '" +
37- name +
38- "'"
39- ) ;
40- }
41- if (
42- ! connectionFilterAllowedOperators ||
43- connectionFilterAllowedOperators . includes ( defaultName )
44- ) {
45- connectionFilterOperators [ name ] = {
46- name ,
45+ return ;
46+ }
47+
48+ if ( connectionFilterOperatorsGlobal [ operatorName ] ) {
49+ throw new Error (
50+ `Failed to register filter operator ' ${ operatorName } ' because this operator is already registered globally`
51+ ) ;
52+ }
53+
54+ if ( options . allowedFieldTypes ) {
55+ // Operator has an `allowedFieldTypes` whitelist
56+ for ( const fieldTypeName of options . allowedFieldTypes ) {
57+ // Ensure operator name hasn't already been registered for this field type
58+ if (
59+ connectionFilterOperatorsByFieldType [ fieldTypeName ] &&
60+ connectionFilterOperatorsByFieldType [ fieldTypeName ] [ operatorName ]
61+ ) {
62+ throw new Error (
63+ `Failed to register filter operator ' ${ operatorName } ' because this operator is already registered for type ' ${ fieldTypeName } '`
64+ ) ;
65+ }
66+
67+ // Register operator for this field type
68+ if ( ! connectionFilterOperatorsByFieldType [ fieldTypeName ] ) {
69+ connectionFilterOperatorsByFieldType [ fieldTypeName ] = { } ;
70+ }
71+ connectionFilterOperatorsByFieldType [ fieldTypeName ] [ operatorName ] = {
4772 description,
4873 resolveType,
4974 resolveWhereClause,
5075 options,
5176 } ;
5277 }
53- } ,
78+ } else {
79+ // Operator does not have an `allowedFieldTypes` whitelist
80+
81+ // Ensure operator name hasn't been registered for any field type
82+ Object . entries ( connectionFilterOperatorsByFieldType ) . forEach (
83+ ( [ fieldTypeName , operators ] ) => {
84+ if ( Object . keys ( operators ) . includes ( operatorName ) ) {
85+ throw new Error (
86+ `Failed to register global filter operator '${ operatorName } ' because this operator is already registered for type '${ fieldTypeName } '`
87+ ) ;
88+ }
89+ }
90+ ) ;
91+
92+ // Register operator globally
93+ connectionFilterOperatorsGlobal [ operatorName ] = {
94+ description,
95+ resolveType,
96+ resolveWhereClause,
97+ options,
98+ } ;
99+ }
100+ } ;
101+
102+ return build . extend ( build , {
103+ addConnectionFilterOperator,
54104 connectionFilterAllowedFieldTypes,
105+ connectionFilterOperatorsByFieldType,
106+ connectionFilterOperatorsGlobal,
55107 } ) ;
56108 } ) ;
57109
0 commit comments