@@ -35,13 +35,27 @@ export function getQueryValue(
35
35
}
36
36
37
37
if ( arg . type === TSESTree . AST_NODE_TYPES . TemplateLiteral ) {
38
- if ( arg . expressions . every ( ( expr ) => isVariableParameterExpression ( expr ) ) ) {
39
- return {
40
- value : arg . quasis . map ( ( quasi ) => quasi . value . cooked ) . join ( "?" ) ,
41
- } ;
38
+ let query = "" ;
39
+
40
+ for ( let i = 0 ; i < arg . quasis . length ; i ++ ) {
41
+ const quasi = arg . quasis [ i ] ;
42
+ if ( quasi ) {
43
+ query += quasi . value . cooked ;
44
+
45
+ const expr = arg . expressions [ i ] ;
46
+ if ( expr ) {
47
+ const value = getParameterExpressionValue ( expr ) ;
48
+ if ( value == null ) {
49
+ return null ;
50
+ }
51
+ query += value ;
52
+ }
53
+ }
42
54
}
43
55
44
- return null ;
56
+ return {
57
+ value : query ,
58
+ } ;
45
59
}
46
60
47
61
if ( arg . type === TSESTree . AST_NODE_TYPES . Identifier ) {
@@ -63,61 +77,62 @@ export function getQueryValue(
63
77
}
64
78
65
79
/**
66
- * Checks if the expression looks like `foo.map(() => '?').join(',')`
80
+ * If the expression looks like `foo.map(() => '<value>').join('<separator>')`
81
+ * then the value of the map callback is returned.
67
82
*/
68
- function isVariableParameterExpression ( expr : TSESTree . Expression ) {
83
+ function getParameterExpressionValue ( expr : TSESTree . Expression ) {
69
84
if ( expr . type !== TSESTree . AST_NODE_TYPES . CallExpression || expr . optional ) {
70
- return false ;
85
+ return null ;
71
86
}
72
87
73
88
if ( expr . callee . type !== TSESTree . AST_NODE_TYPES . MemberExpression ) {
74
- return false ;
89
+ return null ;
75
90
}
76
91
77
92
if ( ! expr . arguments [ 0 ] ) {
78
- return false ;
93
+ return null ;
79
94
}
80
95
81
96
if ( ASTUtils . getPropertyName ( expr . callee ) !== "join" ) {
82
- return false ;
97
+ return null ;
83
98
}
84
99
85
100
const joinValue = ASTUtils . getStaticValue ( expr . arguments [ 0 ] ) ;
86
- if ( typeof joinValue ?. value !== "string" || joinValue . value . trim ( ) !== "," ) {
87
- return false ;
101
+ if ( typeof joinValue ?. value !== "string" ) {
102
+ return null ;
88
103
}
89
104
90
105
if (
91
106
expr . callee . object . type !== TSESTree . AST_NODE_TYPES . CallExpression ||
92
107
expr . callee . object . optional
93
108
) {
94
- return false ;
109
+ return null ;
95
110
}
96
111
97
112
const maybeMapExpr = expr . callee . object ;
98
113
99
114
if ( maybeMapExpr . callee . type !== TSESTree . AST_NODE_TYPES . MemberExpression ) {
100
- return false ;
115
+ return null ;
101
116
}
102
117
103
118
if ( ASTUtils . getPropertyName ( maybeMapExpr . callee ) !== "map" ) {
104
- return false ;
119
+ return null ;
105
120
}
106
121
107
122
if ( ! maybeMapExpr . arguments [ 0 ] ) {
108
- return false ;
123
+ return null ;
109
124
}
110
125
111
126
const maybeCallback = maybeMapExpr . arguments [ 0 ] ;
112
127
113
128
if ( maybeCallback . type !== TSESTree . AST_NODE_TYPES . ArrowFunctionExpression ) {
114
- return false ;
129
+ return null ;
115
130
}
116
131
117
132
const mapValue = ASTUtils . getStaticValue ( maybeCallback . body ) ;
118
- if ( typeof mapValue ?. value !== "string" || mapValue . value . trim ( ) !== "?" ) {
119
- return false ;
133
+ if ( typeof mapValue ?. value !== "string" ) {
134
+ return null ;
120
135
}
121
136
122
- return true ;
137
+ return mapValue . value ;
123
138
}
0 commit comments