@codewithagents/openapi-react-query 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,1435 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/plugins/hooks.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/plugins</a> hooks.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">76.82% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>189/246</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">58.11% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>68/117</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">79.16% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>19/24</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">77.87% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>176/226</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line medium'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a>
511
- <a name='L446'></a><a href='#L446'>446</a>
512
- <a name='L447'></a><a href='#L447'>447</a>
513
- <a name='L448'></a><a href='#L448'>448</a>
514
- <a name='L449'></a><a href='#L449'>449</a>
515
- <a name='L450'></a><a href='#L450'>450</a>
516
- <a name='L451'></a><a href='#L451'>451</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-neutral">&nbsp;</span>
518
- <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-neutral">&nbsp;</span>
520
- <span class="cline-any cline-neutral">&nbsp;</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-neutral">&nbsp;</span>
523
- <span class="cline-any cline-neutral">&nbsp;</span>
524
- <span class="cline-any cline-neutral">&nbsp;</span>
525
- <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-neutral">&nbsp;</span>
528
- <span class="cline-any cline-neutral">&nbsp;</span>
529
- <span class="cline-any cline-yes">6x</span>
530
- <span class="cline-any cline-neutral">&nbsp;</span>
531
- <span class="cline-any cline-neutral">&nbsp;</span>
532
- <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-yes">2x</span>
534
- <span class="cline-any cline-yes">2x</span>
535
- <span class="cline-any cline-neutral">&nbsp;</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-yes">5x</span>
539
- <span class="cline-any cline-neutral">&nbsp;</span>
540
- <span class="cline-any cline-neutral">&nbsp;</span>
541
- <span class="cline-any cline-yes">1x</span>
542
- <span class="cline-any cline-neutral">&nbsp;</span>
543
- <span class="cline-any cline-neutral">&nbsp;</span>
544
- <span class="cline-any cline-neutral">&nbsp;</span>
545
- <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-no">&nbsp;</span>
547
- <span class="cline-any cline-neutral">&nbsp;</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-neutral">&nbsp;</span>
553
- <span class="cline-any cline-no">&nbsp;</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-no">&nbsp;</span>
557
- <span class="cline-any cline-neutral">&nbsp;</span>
558
- <span class="cline-any cline-no">&nbsp;</span>
559
- <span class="cline-any cline-no">&nbsp;</span>
560
- <span class="cline-any cline-no">&nbsp;</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-no">&nbsp;</span>
564
- <span class="cline-any cline-neutral">&nbsp;</span>
565
- <span class="cline-any cline-neutral">&nbsp;</span>
566
- <span class="cline-any cline-no">&nbsp;</span>
567
- <span class="cline-any cline-no">&nbsp;</span>
568
- <span class="cline-any cline-neutral">&nbsp;</span>
569
- <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-yes">5x</span>
572
- <span class="cline-any cline-yes">5x</span>
573
- <span class="cline-any cline-yes">3x</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-neutral">&nbsp;</span>
577
- <span class="cline-any cline-neutral">&nbsp;</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-yes">2x</span>
580
- <span class="cline-any cline-yes">2x</span>
581
- <span class="cline-any cline-neutral">&nbsp;</span>
582
- <span class="cline-any cline-yes">2x</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-neutral">&nbsp;</span>
585
- <span class="cline-any cline-neutral">&nbsp;</span>
586
- <span class="cline-any cline-neutral">&nbsp;</span>
587
- <span class="cline-any cline-neutral">&nbsp;</span>
588
- <span class="cline-any cline-yes">2x</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-yes">5x</span>
603
- <span class="cline-any cline-yes">5x</span>
604
- <span class="cline-any cline-yes">2x</span>
605
- <span class="cline-any cline-neutral">&nbsp;</span>
606
- <span class="cline-any cline-yes">2x</span>
607
- <span class="cline-any cline-yes">2x</span>
608
- <span class="cline-any cline-yes">2x</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-yes">2x</span>
612
- <span class="cline-any cline-no">&nbsp;</span>
613
- <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-yes">2x</span>
616
- <span class="cline-any cline-yes">2x</span>
617
- <span class="cline-any cline-no">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-neutral">&nbsp;</span>
620
- <span class="cline-any cline-yes">2x</span>
621
- <span class="cline-any cline-yes">2x</span>
622
- <span class="cline-any cline-yes">2x</span>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-no">&nbsp;</span>
628
- <span class="cline-any cline-no">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-neutral">&nbsp;</span>
635
- <span class="cline-any cline-neutral">&nbsp;</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-neutral">&nbsp;</span>
643
- <span class="cline-any cline-yes">1x</span>
644
- <span class="cline-any cline-yes">1x</span>
645
- <span class="cline-any cline-yes">1x</span>
646
- <span class="cline-any cline-yes">1x</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-yes">1x</span>
649
- <span class="cline-any cline-yes">2x</span>
650
- <span class="cline-any cline-neutral">&nbsp;</span>
651
- <span class="cline-any cline-yes">1x</span>
652
- <span class="cline-any cline-yes">1x</span>
653
- <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-no">&nbsp;</span>
655
- <span class="cline-any cline-yes">1x</span>
656
- <span class="cline-any cline-neutral">&nbsp;</span>
657
- <span class="cline-any cline-yes">1x</span>
658
- <span class="cline-any cline-yes">1x</span>
659
- <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-no">&nbsp;</span>
662
- <span class="cline-any cline-no">&nbsp;</span>
663
- <span class="cline-any cline-no">&nbsp;</span>
664
- <span class="cline-any cline-neutral">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-yes">1x</span>
668
- <span class="cline-any cline-yes">1x</span>
669
- <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-neutral">&nbsp;</span>
671
- <span class="cline-any cline-neutral">&nbsp;</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-neutral">&nbsp;</span>
679
- <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-yes">2x</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-yes">2x</span>
683
- <span class="cline-any cline-yes">2x</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-yes">2x</span>
687
- <span class="cline-any cline-yes">2x</span>
688
- <span class="cline-any cline-yes">1x</span>
689
- <span class="cline-any cline-neutral">&nbsp;</span>
690
- <span class="cline-any cline-yes">2x</span>
691
- <span class="cline-any cline-yes">1x</span>
692
- <span class="cline-any cline-neutral">&nbsp;</span>
693
- <span class="cline-any cline-yes">2x</span>
694
- <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-neutral">&nbsp;</span>
696
- <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-yes">2x</span>
698
- <span class="cline-any cline-yes">1x</span>
699
- <span class="cline-any cline-yes">1x</span>
700
- <span class="cline-any cline-no">&nbsp;</span>
701
- <span class="cline-any cline-yes">1x</span>
702
- <span class="cline-any cline-yes">1x</span>
703
- <span class="cline-any cline-no">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
706
- <span class="cline-any cline-neutral">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-yes">2x</span>
713
- <span class="cline-any cline-yes">2x</span>
714
- <span class="cline-any cline-yes">2x</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-yes">2x</span>
717
- <span class="cline-any cline-yes">2x</span>
718
- <span class="cline-any cline-yes">2x</span>
719
- <span class="cline-any cline-yes">2x</span>
720
- <span class="cline-any cline-yes">2x</span>
721
- <span class="cline-any cline-yes">2x</span>
722
- <span class="cline-any cline-yes">2x</span>
723
- <span class="cline-any cline-yes">2x</span>
724
- <span class="cline-any cline-yes">2x</span>
725
- <span class="cline-any cline-yes">2x</span>
726
- <span class="cline-any cline-yes">2x</span>
727
- <span class="cline-any cline-neutral">&nbsp;</span>
728
- <span class="cline-any cline-yes">2x</span>
729
- <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-neutral">&nbsp;</span>
731
- <span class="cline-any cline-neutral">&nbsp;</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-yes">3x</span>
735
- <span class="cline-any cline-yes">3x</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-neutral">&nbsp;</span>
739
- <span class="cline-any cline-neutral">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-yes">3x</span>
742
- <span class="cline-any cline-no">&nbsp;</span>
743
- <span class="cline-any cline-no">&nbsp;</span>
744
- <span class="cline-any cline-yes">3x</span>
745
- <span class="cline-any cline-yes">1x</span>
746
- <span class="cline-any cline-yes">1x</span>
747
- <span class="cline-any cline-yes">2x</span>
748
- <span class="cline-any cline-yes">1x</span>
749
- <span class="cline-any cline-yes">1x</span>
750
- <span class="cline-any cline-yes">1x</span>
751
- <span class="cline-any cline-yes">1x</span>
752
- <span class="cline-any cline-yes">1x</span>
753
- <span class="cline-any cline-yes">1x</span>
754
- <span class="cline-any cline-no">&nbsp;</span>
755
- <span class="cline-any cline-no">&nbsp;</span>
756
- <span class="cline-any cline-no">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-neutral">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-no">&nbsp;</span>
762
- <span class="cline-any cline-no">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-yes">3x</span>
768
- <span class="cline-any cline-yes">3x</span>
769
- <span class="cline-any cline-yes">3x</span>
770
- <span class="cline-any cline-yes">3x</span>
771
- <span class="cline-any cline-yes">3x</span>
772
- <span class="cline-any cline-yes">3x</span>
773
- <span class="cline-any cline-yes">3x</span>
774
- <span class="cline-any cline-yes">3x</span>
775
- <span class="cline-any cline-neutral">&nbsp;</span>
776
- <span class="cline-any cline-yes">3x</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-neutral">&nbsp;</span>
782
- <span class="cline-any cline-yes">2x</span>
783
- <span class="cline-any cline-yes">2x</span>
784
- <span class="cline-any cline-yes">2x</span>
785
- <span class="cline-any cline-yes">2x</span>
786
- <span class="cline-any cline-yes">2x</span>
787
- <span class="cline-any cline-yes">2x</span>
788
- <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-neutral">&nbsp;</span>
790
- <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-neutral">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-neutral">&nbsp;</span>
795
- <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-neutral">&nbsp;</span>
797
- <span class="cline-any cline-yes">1x</span>
798
- <span class="cline-any cline-yes">1x</span>
799
- <span class="cline-any cline-neutral">&nbsp;</span>
800
- <span class="cline-any cline-neutral">&nbsp;</span>
801
- <span class="cline-any cline-yes">1x</span>
802
- <span class="cline-any cline-neutral">&nbsp;</span>
803
- <span class="cline-any cline-yes">1x</span>
804
- <span class="cline-any cline-yes">1x</span>
805
- <span class="cline-any cline-yes">2x</span>
806
- <span class="cline-any cline-yes">10x</span>
807
- <span class="cline-any cline-yes">10x</span>
808
- <span class="cline-any cline-neutral">&nbsp;</span>
809
- <span class="cline-any cline-neutral">&nbsp;</span>
810
- <span class="cline-any cline-yes">5x</span>
811
- <span class="cline-any cline-yes">5x</span>
812
- <span class="cline-any cline-yes">5x</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-no">&nbsp;</span>
815
- <span class="cline-any cline-neutral">&nbsp;</span>
816
- <span class="cline-any cline-neutral">&nbsp;</span>
817
- <span class="cline-any cline-yes">5x</span>
818
- <span class="cline-any cline-yes">5x</span>
819
- <span class="cline-any cline-yes">5x</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-yes">5x</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-neutral">&nbsp;</span>
826
- <span class="cline-any cline-neutral">&nbsp;</span>
827
- <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-neutral">&nbsp;</span>
829
- <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-neutral">&nbsp;</span>
831
- <span class="cline-any cline-neutral">&nbsp;</span>
832
- <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-neutral">&nbsp;</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-yes">5x</span>
836
- <span class="cline-any cline-yes">5x</span>
837
- <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-neutral">&nbsp;</span>
839
- <span class="cline-any cline-yes">1x</span>
840
- <span class="cline-any cline-yes">1x</span>
841
- <span class="cline-any cline-yes">2x</span>
842
- <span class="cline-any cline-yes">2x</span>
843
- <span class="cline-any cline-yes">2x</span>
844
- <span class="cline-any cline-yes">2x</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-yes">1x</span>
849
- <span class="cline-any cline-yes">1x</span>
850
- <span class="cline-any cline-neutral">&nbsp;</span>
851
- <span class="cline-any cline-yes">1x</span>
852
- <span class="cline-any cline-yes">1x</span>
853
- <span class="cline-any cline-neutral">&nbsp;</span>
854
- <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-yes">2x</span>
856
- <span class="cline-any cline-yes">2x</span>
857
- <span class="cline-any cline-neutral">&nbsp;</span>
858
- <span class="cline-any cline-yes">1x</span>
859
- <span class="cline-any cline-neutral">&nbsp;</span>
860
- <span class="cline-any cline-yes">1x</span>
861
- <span class="cline-any cline-yes">1x</span>
862
- <span class="cline-any cline-yes">1x</span>
863
- <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-yes">1x</span>
866
- <span class="cline-any cline-yes">1x</span>
867
- <span class="cline-any cline-yes">1x</span>
868
- <span class="cline-any cline-no">&nbsp;</span>
869
- <span class="cline-any cline-no">&nbsp;</span>
870
- <span class="cline-any cline-no">&nbsp;</span>
871
- <span class="cline-any cline-neutral">&nbsp;</span>
872
- <span class="cline-any cline-neutral">&nbsp;</span>
873
- <span class="cline-any cline-no">&nbsp;</span>
874
- <span class="cline-any cline-no">&nbsp;</span>
875
- <span class="cline-any cline-no">&nbsp;</span>
876
- <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-neutral">&nbsp;</span>
878
- <span class="cline-any cline-neutral">&nbsp;</span>
879
- <span class="cline-any cline-yes">1x</span>
880
- <span class="cline-any cline-yes">1x</span>
881
- <span class="cline-any cline-yes">1x</span>
882
- <span class="cline-any cline-neutral">&nbsp;</span>
883
- <span class="cline-any cline-neutral">&nbsp;</span>
884
- <span class="cline-any cline-yes">1x</span>
885
- <span class="cline-any cline-yes">1x</span>
886
- <span class="cline-any cline-yes">1x</span>
887
- <span class="cline-any cline-no">&nbsp;</span>
888
- <span class="cline-any cline-no">&nbsp;</span>
889
- <span class="cline-any cline-no">&nbsp;</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-no">&nbsp;</span>
893
- <span class="cline-any cline-no">&nbsp;</span>
894
- <span class="cline-any cline-no">&nbsp;</span>
895
- <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-neutral">&nbsp;</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-yes">1x</span>
899
- <span class="cline-any cline-neutral">&nbsp;</span>
900
- <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-neutral">&nbsp;</span>
902
- <span class="cline-any cline-yes">1x</span>
903
- <span class="cline-any cline-yes">1x</span>
904
- <span class="cline-any cline-yes">2x</span>
905
- <span class="cline-any cline-yes">2x</span>
906
- <span class="cline-any cline-yes">2x</span>
907
- <span class="cline-any cline-yes">2x</span>
908
- <span class="cline-any cline-neutral">&nbsp;</span>
909
- <span class="cline-any cline-neutral">&nbsp;</span>
910
- <span class="cline-any cline-neutral">&nbsp;</span>
911
- <span class="cline-any cline-yes">1x</span>
912
- <span class="cline-any cline-yes">1x</span>
913
- <span class="cline-any cline-yes">3x</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-neutral">&nbsp;</span>
916
- <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-yes">1x</span>
918
- <span class="cline-any cline-yes">1x</span>
919
- <span class="cline-any cline-yes">1x</span>
920
- <span class="cline-any cline-yes">1x</span>
921
- <span class="cline-any cline-yes">1x</span>
922
- <span class="cline-any cline-neutral">&nbsp;</span>
923
- <span class="cline-any cline-neutral">&nbsp;</span>
924
- <span class="cline-any cline-yes">5x</span>
925
- <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-neutral">&nbsp;</span>
927
- <span class="cline-any cline-yes">1x</span>
928
- <span class="cline-any cline-yes">1x</span>
929
- <span class="cline-any cline-yes">1x</span>
930
- <span class="cline-any cline-yes">1x</span>
931
- <span class="cline-any cline-yes">1x</span>
932
- <span class="cline-any cline-neutral">&nbsp;</span>
933
- <span class="cline-any cline-yes">1x</span>
934
- <span class="cline-any cline-yes">1x</span>
935
- <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-no">&nbsp;</span>
937
- <span class="cline-any cline-neutral">&nbsp;</span>
938
- <span class="cline-any cline-yes">1x</span>
939
- <span class="cline-any cline-neutral">&nbsp;</span>
940
- <span class="cline-any cline-yes">1x</span>
941
- <span class="cline-any cline-yes">1x</span>
942
- <span class="cline-any cline-yes">1x</span>
943
- <span class="cline-any cline-yes">1x</span>
944
- <span class="cline-any cline-yes">1x</span>
945
- <span class="cline-any cline-neutral">&nbsp;</span>
946
- <span class="cline-any cline-neutral">&nbsp;</span>
947
- <span class="cline-any cline-yes">1x</span>
948
- <span class="cline-any cline-yes">1x</span>
949
- <span class="cline-any cline-yes">1x</span>
950
- <span class="cline-any cline-yes">1x</span>
951
- <span class="cline-any cline-yes">1x</span>
952
- <span class="cline-any cline-neutral">&nbsp;</span>
953
- <span class="cline-any cline-neutral">&nbsp;</span>
954
- <span class="cline-any cline-yes">1x</span>
955
- <span class="cline-any cline-yes">1x</span>
956
- <span class="cline-any cline-yes">1x</span>
957
- <span class="cline-any cline-yes">1x</span>
958
- <span class="cline-any cline-yes">1x</span>
959
- <span class="cline-any cline-neutral">&nbsp;</span>
960
- <span class="cline-any cline-neutral">&nbsp;</span>
961
- <span class="cline-any cline-yes">1x</span>
962
- <span class="cline-any cline-neutral">&nbsp;</span>
963
- <span class="cline-any cline-neutral">&nbsp;</span>
964
- <span class="cline-any cline-neutral">&nbsp;</span>
965
- <span class="cline-any cline-neutral">&nbsp;</span>
966
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { OpenAPIV3_1 } from 'openapi-types'
967
- &nbsp;
968
- type OperationObject = OpenAPIV3_1.OperationObject
969
- type ReferenceObject = OpenAPIV3_1.ReferenceObject
970
- &nbsp;
971
- export interface HookGenOptions {
972
- staleTime: number
973
- gcTime: number
974
- }
975
- &nbsp;
976
- // ── Helpers ───────────────────────────────────────────────────────────────────
977
- &nbsp;
978
- function isRef(obj: unknown): obj is ReferenceObject {
979
- return typeof obj === 'object' &amp;&amp; obj !== null &amp;&amp; '$ref' in obj
980
- }
981
- &nbsp;
982
- function refToName(ref: string): string {
983
- const parts = ref.split('/')
984
- return parts[parts.length - 1]!
985
- }
986
- &nbsp;
987
- function capitalize(s: string): string {
988
- return s.charAt(0).toUpperCase() + s.slice(1)
989
- }
990
- &nbsp;
991
- const SUPPORTED_METHODS = ['get', 'post', 'put', 'patch', 'delete'] as const
992
- type SupportedMethod = (typeof SUPPORTED_METHODS)[number]
993
- &nbsp;
994
- // Mirrors deriveOperationName from openapi-gen/src/plugins/client.ts
995
- function <span class="fstat-no" title="function not covered" >deriveOperationName(m</span>ethod: string, path: string): string {
996
- const prefixMap: Record&lt;string, string&gt; = <span class="cstat-no" title="statement not covered" >{</span>
997
- get: 'get',
998
- post: 'create',
999
- put: 'update',
1000
- patch: 'patch',
1001
- delete: 'delete',
1002
- }
1003
- const prefix = <span class="cstat-no" title="statement not covered" >prefixMap[method] ?? method</span>
1004
- &nbsp;
1005
- // Strip /api/v1/ prefix
1006
- let segments = <span class="cstat-no" title="statement not covered" >path.replace(/^\/api\/v\d+\//, '').replace(/^\//, '')</span>
1007
- &nbsp;
1008
- const parts = <span class="cstat-no" title="statement not covered" >segments.split('/').map(<span class="fstat-no" title="function not covered" >(s</span>eg) =&gt; {</span>
1009
- <span class="cstat-no" title="statement not covered" > if (seg.startsWith('{') &amp;&amp; seg.endsWith('}')) {</span>
1010
- const name = <span class="cstat-no" title="statement not covered" >seg.slice(1, -1)</span>
1011
- <span class="cstat-no" title="statement not covered" > return 'By' + name.charAt(0).toUpperCase() + name.slice(1)</span>
1012
- }
1013
- <span class="cstat-no" title="statement not covered" > return seg.charAt(0).toUpperCase() + seg.slice(1)</span>
1014
- })
1015
- &nbsp;
1016
- const joined = <span class="cstat-no" title="statement not covered" >parts.join('')</span>
1017
- <span class="cstat-no" title="statement not covered" > return prefix + joined</span>
1018
- }
1019
- &nbsp;
1020
- function extractPathParams(path: string): string[] {
1021
- const matches = path.match(/\{([^}]+)\}/g)
1022
- if (matches === null) return []
1023
- return matches.map((m) =&gt; m.slice(1, -1))
1024
- }
1025
- &nbsp;
1026
- /** Extract primary resource name from path (first static segment after stripping API prefix) */
1027
- function primaryResource(path: string): string {
1028
- // Strip /api/v{N}/ prefix or leading /
1029
- const stripped = path.replace(/^\/api\/v\d+\//, '').replace(/^\//, '')
1030
- const firstSegment = stripped.split('/')[0] ?? <span class="branch-1 cbranch-no" title="branch not covered" >'resource'</span>
1031
- // Remove any path param braces if somehow first seg is param
1032
- return firstSegment.replace(/[{}]/g, '')
1033
- }
1034
- &nbsp;
1035
- /** singularize resource name for key factory naming, e.g. tasks → task */
1036
- function toKeyFactoryName(resource: string): string {
1037
- // simple pluralization removal: trailing 's'
1038
- return resource.endsWith('s') ? resource.slice(0, -1) : <span class="branch-1 cbranch-no" title="branch not covered" >resource</span>
1039
- }
1040
- &nbsp;
1041
- interface OperationMeta {
1042
- funcName: string
1043
- hookName: string
1044
- method: SupportedMethod
1045
- path: string
1046
- pathParams: string[]
1047
- hasBody: boolean
1048
- bodyTypeName: string | undefined
1049
- }
1050
- &nbsp;
1051
- function getBodyInfo(operation: OperationObject): { hasBody: boolean; bodyTypeName: string | undefined } {
1052
- const requestBody = operation.requestBody as OpenAPIV3_1.RequestBodyObject | ReferenceObject | undefined
1053
- if (requestBody === undefined) return { hasBody: false, bodyTypeName: undefined }
1054
- <span class="missing-if-branch" title="if path not taken" >I</span>if (isRef(requestBody)) return { hasBody: true, bodyTypeName: undefined }
1055
- &nbsp;
1056
- const rb = requestBody as OpenAPIV3_1.RequestBodyObject
1057
- const content = rb.content as Record&lt;string, { schema?: OpenAPIV3_1.SchemaObject | ReferenceObject }&gt; | undefined
1058
- <span class="missing-if-branch" title="if path not taken" >I</span>if (content === undefined) <span class="cstat-no" title="statement not covered" >return { hasBody: true, bodyTypeName: undefined }</span>
1059
- &nbsp;
1060
- // Check multipart first
1061
- <span class="missing-if-branch" title="if path not taken" >I</span>if (content['multipart/form-data'] !== undefined) {
1062
- <span class="cstat-no" title="statement not covered" > return { hasBody: true, bodyTypeName: undefined }</span>
1063
- }
1064
- &nbsp;
1065
- const jsonContent = content['application/json']
1066
- <span class="missing-if-branch" title="if path not taken" >I</span>if (jsonContent === undefined || jsonContent.schema === undefined) {
1067
- <span class="cstat-no" title="statement not covered" > return { hasBody: true, bodyTypeName: undefined }</span>
1068
- }
1069
- &nbsp;
1070
- const schema = jsonContent.schema
1071
- <span class="missing-if-branch" title="else path not taken" >E</span>if (isRef(schema)) {
1072
- return { hasBody: true, bodyTypeName: refToName((schema as ReferenceObject).$ref) }
1073
- }
1074
- &nbsp;
1075
- // Inline schema
1076
- const s = <span class="cstat-no" title="statement not covered" >schema as OpenAPIV3_1.SchemaObject</span>
1077
- <span class="cstat-no" title="statement not covered" > if (s.type === 'object') {</span>
1078
- <span class="cstat-no" title="statement not covered" > return { hasBody: true, bodyTypeName: 'Record&lt;string, unknown&gt;' }</span>
1079
- }
1080
- <span class="cstat-no" title="statement not covered" > return { hasBody: true, bodyTypeName: undefined }</span>
1081
- }
1082
- &nbsp;
1083
- // ── Key factory generation ─────────────────────────────────────────────────────
1084
- &nbsp;
1085
- interface KeyEntry {
1086
- key: string // e.g. 'list' | 'detail' | operationId-derived
1087
- funcName: string // function to use in key factory
1088
- pathParams: string[]
1089
- hasQueryParams: boolean
1090
- }
1091
- &nbsp;
1092
- function buildKeyFactory(resource: string, entries: KeyEntry[]): string {
1093
- const factoryName = `${toKeyFactoryName(resource)}Keys`
1094
- const lines: string[] = []
1095
- lines.push(`export const ${factoryName} = {`)
1096
- lines.push(` all: () =&gt; ['${resource}'] as const,`)
1097
- &nbsp;
1098
- for (const entry of entries) {
1099
- if (entry.pathParams.length === 0 &amp;&amp; entry.hasQueryParams) {
1100
- // list: (params?) =&gt; ['resource', 'list', params]
1101
- lines.push(` ${entry.key}: (params?: Parameters&lt;typeof ${entry.funcName}&gt;[0]) =&gt; ['${resource}', '${entry.key}', params] as const,`)
1102
- <span class="missing-if-branch" title="if path not taken" >I</span>} else if (entry.pathParams.length === 0 &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!entry.hasQueryParams) {</span>
1103
- // list with no params
1104
- <span class="cstat-no" title="statement not covered" > lines.push(` ${entry.key}: () =&gt; ['${resource}', '${entry.key}'] as const,`)</span>
1105
- } else if (entry.pathParams.length === 1) {
1106
- // detail: (id: string) =&gt; ['resource', id]
1107
- const param = entry.pathParams[0]!
1108
- lines.push(` ${entry.key}: (${param}: string) =&gt; ['${resource}', ${param}] as const,`)
1109
- } else <span class="missing-if-branch" title="else path not taken" >E</span>{
1110
- // multiple path params
1111
- const paramList = <span class="cstat-no" title="statement not covered" >entry.pathParams.map(<span class="fstat-no" title="function not covered" >(p</span>) =&gt; <span class="cstat-no" title="statement not covered" >`${p}: string`)</span>.join(', ')</span>
1112
- const paramValues = <span class="cstat-no" title="statement not covered" >entry.pathParams.join(', ')</span>
1113
- <span class="cstat-no" title="statement not covered" > lines.push(` ${entry.key}: (${paramList}) =&gt; ['${resource}', ${paramValues}] as const,`)</span>
1114
- }
1115
- }
1116
- &nbsp;
1117
- lines.push(`}`)
1118
- return lines.join('\n')
1119
- }
1120
- &nbsp;
1121
- // ── Query hook generation ──────────────────────────────────────────────────────
1122
- &nbsp;
1123
- function buildQueryHook(
1124
- op: OperationMeta,
1125
- keyFactoryName: string,
1126
- keyEntry: KeyEntry,
1127
- staleTime: number,
1128
- gcTime: number,
1129
- ): string {
1130
- const lines: string[] = []
1131
- &nbsp;
1132
- const hasQueryParams = keyEntry.hasQueryParams
1133
- const pathParams = op.pathParams
1134
- &nbsp;
1135
- // Build parameter list
1136
- const sigParts: string[] = []
1137
- for (const p of pathParams) {
1138
- sigParts.push(`${p}: string`)
1139
- }
1140
- if (hasQueryParams) {
1141
- sigParts.push(`params?: Parameters&lt;typeof ${op.funcName}&gt;[${pathParams.length}]`)
1142
- }
1143
- sigParts.push(`options?: Omit&lt;UseQueryOptions&lt;Awaited&lt;ReturnType&lt;typeof ${op.funcName}&gt;&gt;, ApiError&gt;, 'queryKey' | 'queryFn'&gt;`)
1144
- &nbsp;
1145
- // Build queryKey call
1146
- let queryKeyCall: string
1147
- if (pathParams.length === 0 &amp;&amp; hasQueryParams) {
1148
- queryKeyCall = `${keyFactoryName}.${keyEntry.key}(params)`
1149
- <span class="missing-if-branch" title="if path not taken" >I</span>} else if (pathParams.length === 0 &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!hasQueryParams) {</span>
1150
- <span class="cstat-no" title="statement not covered" > queryKeyCall = `${keyFactoryName}.${keyEntry.key}()`</span>
1151
- } else if (pathParams.length === 1 &amp;&amp; !hasQueryParams) {
1152
- queryKeyCall = `${keyFactoryName}.${keyEntry.key}(${pathParams[0]})`
1153
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="else path not taken" >E</span>} else if (pathParams.length === 1 &amp;&amp; hasQueryParams) {</span>
1154
- // path param + query params
1155
- <span class="cstat-no" title="statement not covered" > queryKeyCall = `${keyFactoryName}.${keyEntry.key}(${pathParams[0]}, params)`</span>
1156
- } else {
1157
- const paramValues = <span class="cstat-no" title="statement not covered" >pathParams.join(', ')</span>
1158
- <span class="cstat-no" title="statement not covered" > queryKeyCall = `${keyFactoryName}.${keyEntry.key}(${paramValues})`</span>
1159
- }
1160
- &nbsp;
1161
- // Build queryFn call
1162
- let queryFnArgs: string[] = [...pathParams]
1163
- if (hasQueryParams) queryFnArgs.push('params')
1164
- const queryFnCall = `${op.funcName}(${queryFnArgs.join(', ')})`
1165
- &nbsp;
1166
- lines.push(`export function ${op.hookName}(`)
1167
- lines.push(` ${sigParts.join(',\n ')},`)
1168
- lines.push(`) {`)
1169
- lines.push(` return useQuery&lt;Awaited&lt;ReturnType&lt;typeof ${op.funcName}&gt;&gt;, ApiError&gt;({`)
1170
- lines.push(` queryKey: ${queryKeyCall},`)
1171
- lines.push(` queryFn: () =&gt; ${queryFnCall},`)
1172
- lines.push(` staleTime: ${staleTime},`)
1173
- lines.push(` gcTime: ${gcTime},`)
1174
- lines.push(` ...options,`)
1175
- lines.push(` })`)
1176
- lines.push(`}`)
1177
- &nbsp;
1178
- return lines.join('\n')
1179
- }
1180
- &nbsp;
1181
- // ── Mutation hook generation ───────────────────────────────────────────────────
1182
- &nbsp;
1183
- function buildMutationHook(op: OperationMeta): string {
1184
- const lines: string[] = []
1185
- const { funcName, hookName, pathParams, hasBody } = op
1186
- &nbsp;
1187
- // Determine variables type and mutationFn
1188
- let variablesType: string
1189
- let mutationFnBody: string
1190
- &nbsp;
1191
- <span class="missing-if-branch" title="if path not taken" >I</span>if (pathParams.length === 0 &amp;&amp; !hasBody) {
1192
- <span class="cstat-no" title="statement not covered" > variablesType = 'void'</span>
1193
- <span class="cstat-no" title="statement not covered" > mutationFnBody = `() =&gt; ${funcName}()`</span>
1194
- } else if (pathParams.length === 0 &amp;&amp; hasBody) {
1195
- variablesType = `Parameters&lt;typeof ${funcName}&gt;[0]`
1196
- mutationFnBody = `(vars) =&gt; ${funcName}(vars)`
1197
- } else if (pathParams.length === 1 &amp;&amp; !hasBody) {
1198
- variablesType = 'string'
1199
- mutationFnBody = `(${pathParams[0]}) =&gt; ${funcName}(${pathParams[0]})`
1200
- } else if (pathParams.length === 1 &amp;&amp; hasBody) {
1201
- const param = pathParams[0]!
1202
- variablesType = `{ ${param}: string; body: Parameters&lt;typeof ${funcName}&gt;[1] }`
1203
- mutationFnBody = `({ ${param}, body }) =&gt; ${funcName}(${param}, body)`
1204
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="else path not taken" >E</span>} else if (pathParams.length &gt; 1 &amp;&amp; !hasBody) {</span>
1205
- const fields = <span class="cstat-no" title="statement not covered" >pathParams.map(<span class="fstat-no" title="function not covered" >(p</span>) =&gt; <span class="cstat-no" title="statement not covered" >`${p}: string`)</span>.join('; ')</span>
1206
- <span class="cstat-no" title="statement not covered" > variablesType = `{ ${fields} }`</span>
1207
- const destructured = <span class="cstat-no" title="statement not covered" >pathParams.join(', ')</span>
1208
- <span class="cstat-no" title="statement not covered" > mutationFnBody = `({ ${destructured} }) =&gt; ${funcName}(${destructured})`</span>
1209
- } else {
1210
- // multiple path params + body
1211
- const fields = <span class="cstat-no" title="statement not covered" >pathParams.map(<span class="fstat-no" title="function not covered" >(p</span>) =&gt; <span class="cstat-no" title="statement not covered" >`${p}: string`)</span>.join('; ')</span>
1212
- <span class="cstat-no" title="statement not covered" > variablesType = `{ ${fields}; body: Parameters&lt;typeof ${funcName}&gt;[${pathParams.length}] }`</span>
1213
- const destructured = <span class="cstat-no" title="statement not covered" >[...pathParams, 'body'].join(', ')</span>
1214
- <span class="cstat-no" title="statement not covered" > mutationFnBody = `({ ${destructured} }) =&gt; ${funcName}(${[...pathParams, 'body'].join(', ')})`</span>
1215
- }
1216
- &nbsp;
1217
- lines.push(`export function ${hookName}(`)
1218
- lines.push(` options?: Omit&lt;UseMutationOptions&lt;Awaited&lt;ReturnType&lt;typeof ${funcName}&gt;&gt;, ApiError, ${variablesType}&gt;, 'mutationFn'&gt;,`)
1219
- lines.push(`) {`)
1220
- lines.push(` return useMutation&lt;Awaited&lt;ReturnType&lt;typeof ${funcName}&gt;&gt;, ApiError, ${variablesType}&gt;({`)
1221
- lines.push(` mutationFn: ${mutationFnBody},`)
1222
- lines.push(` ...options,`)
1223
- lines.push(` })`)
1224
- lines.push(`}`)
1225
- &nbsp;
1226
- return lines.join('\n')
1227
- }
1228
- &nbsp;
1229
- // ── hasQueryParams detection ───────────────────────────────────────────────────
1230
- &nbsp;
1231
- function operationHasQueryParams(operation: OperationObject): boolean {
1232
- const params = operation.parameters as (OpenAPIV3_1.ParameterObject | ReferenceObject)[] | undefined
1233
- <span class="missing-if-branch" title="if path not taken" >I</span>if (params === undefined) <span class="cstat-no" title="statement not covered" >return false</span>
1234
- return params.some((p) =&gt; {
1235
- <span class="missing-if-branch" title="if path not taken" >I</span>if (isRef(p)) <span class="cstat-no" title="statement not covered" >return false</span>
1236
- const param = p as OpenAPIV3_1.ParameterObject
1237
- return param.in === 'query'
1238
- })
1239
- }
1240
- &nbsp;
1241
- // ── Main generator ─────────────────────────────────────────────────────────────
1242
- &nbsp;
1243
- export function generateHooks(
1244
- spec: OpenAPIV3_1.Document,
1245
- options: HookGenOptions,
1246
- ): { filename: string; content: string } {
1247
- const { staleTime, gcTime } = options
1248
- const paths = spec.paths as Record&lt;string, Record&lt;string, OperationObject&gt;&gt; | undefined
1249
- &nbsp;
1250
- // Collect all operations
1251
- const operations: OperationMeta[] = []
1252
- &nbsp;
1253
- <span class="missing-if-branch" title="else path not taken" >E</span>if (paths !== undefined) {
1254
- for (const [path, pathItem] of Object.entries(paths)) {
1255
- for (const method of SUPPORTED_METHODS) {
1256
- const operation = pathItem[method] as OperationObject | undefined
1257
- if (operation === undefined) continue
1258
- &nbsp;
1259
- let funcName: string
1260
- if (operation.operationId !== undefined) {
1261
- const id = operation.operationId
1262
- funcName = id.charAt(0).toLowerCase() + id.slice(1)
1263
- } else <span class="missing-if-branch" title="else path not taken" >E</span>{
1264
- <span class="cstat-no" title="statement not covered" > funcName = deriveOperationName(method, path)</span>
1265
- }
1266
- &nbsp;
1267
- const hookName = 'use' + capitalize(funcName)
1268
- const pathParams = extractPathParams(path)
1269
- const { hasBody, bodyTypeName } = getBodyInfo(operation)
1270
- &nbsp;
1271
- operations.push({
1272
- funcName,
1273
- hookName,
1274
- method,
1275
- path,
1276
- pathParams,
1277
- hasBody,
1278
- bodyTypeName,
1279
- })
1280
- }
1281
- }
1282
- }
1283
- &nbsp;
1284
- // Separate GET vs mutation operations
1285
- const getOps = operations.filter((op) =&gt; op.method === 'get')
1286
- const mutationOps = operations.filter((op) =&gt; op.method !== 'get')
1287
- &nbsp;
1288
- // Group GET ops by resource for key factories
1289
- const resourceToGetOps = new Map&lt;string, OperationMeta[]&gt;()
1290
- for (const op of getOps) {
1291
- const resource = primaryResource(op.path)
1292
- const existing = resourceToGetOps.get(resource) ?? []
1293
- existing.push(op)
1294
- resourceToGetOps.set(resource, existing)
1295
- }
1296
- &nbsp;
1297
- // Build key factories and track which key factory + entry each GET op uses
1298
- const opToKeyInfo = new Map&lt;string, { factoryName: string; keyEntry: KeyEntry }&gt;()
1299
- const keyFactoryBlocks: string[] = []
1300
- &nbsp;
1301
- for (const [resource, ops] of resourceToGetOps.entries()) {
1302
- const factoryName = `${toKeyFactoryName(resource)}Keys`
1303
- &nbsp;
1304
- // Determine entry keys — list vs detail, or operationId-derived if ambiguous
1305
- const listOps = ops.filter((op) =&gt; op.pathParams.length === 0)
1306
- const detailOps = ops.filter((op) =&gt; op.pathParams.length &gt; 0)
1307
- &nbsp;
1308
- const entries: KeyEntry[] = []
1309
- &nbsp;
1310
- if (listOps.length === 1) {
1311
- const op = listOps[0]!
1312
- const hasQueryParams = operationHasQueryParams(
1313
- (paths![op.path] as Record&lt;string, OperationObject&gt;)[op.method]!,
1314
- )
1315
- const entry: KeyEntry = { key: 'list', funcName: op.funcName, pathParams: [], hasQueryParams }
1316
- entries.push(entry)
1317
- opToKeyInfo.set(op.funcName, { factoryName, keyEntry: entry })
1318
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="else path not taken" >E</span>} else if (listOps.length &gt; 1) {</span>
1319
- <span class="cstat-no" title="statement not covered" > for (const op of listOps) {</span>
1320
- const hasQueryParams = <span class="cstat-no" title="statement not covered" >operationHasQueryParams(</span>
1321
- (paths![op.path] as Record&lt;string, OperationObject&gt;)[op.method]!,
1322
- )
1323
- const entry: KeyEntry = <span class="cstat-no" title="statement not covered" >{ key: op.funcName, funcName: op.funcName, pathParams: [], hasQueryParams }</span>
1324
- <span class="cstat-no" title="statement not covered" > entries.push(entry)</span>
1325
- <span class="cstat-no" title="statement not covered" > opToKeyInfo.set(op.funcName, { factoryName, keyEntry: entry })</span>
1326
- }
1327
- }
1328
- &nbsp;
1329
- if (detailOps.length === 1) {
1330
- const op = detailOps[0]!
1331
- const hasQueryParams = operationHasQueryParams(
1332
- (paths![op.path] as Record&lt;string, OperationObject&gt;)[op.method]!,
1333
- )
1334
- const entry: KeyEntry = { key: 'detail', funcName: op.funcName, pathParams: op.pathParams, hasQueryParams }
1335
- entries.push(entry)
1336
- opToKeyInfo.set(op.funcName, { factoryName, keyEntry: entry })
1337
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="else path not taken" >E</span>} else if (detailOps.length &gt; 1) {</span>
1338
- <span class="cstat-no" title="statement not covered" > for (const op of detailOps) {</span>
1339
- const hasQueryParams = <span class="cstat-no" title="statement not covered" >operationHasQueryParams(</span>
1340
- (paths![op.path] as Record&lt;string, OperationObject&gt;)[op.method]!,
1341
- )
1342
- const entry: KeyEntry = <span class="cstat-no" title="statement not covered" >{ key: op.funcName, funcName: op.funcName, pathParams: op.pathParams, hasQueryParams }</span>
1343
- <span class="cstat-no" title="statement not covered" > entries.push(entry)</span>
1344
- <span class="cstat-no" title="statement not covered" > opToKeyInfo.set(op.funcName, { factoryName, keyEntry: entry })</span>
1345
- }
1346
- }
1347
- &nbsp;
1348
- keyFactoryBlocks.push(buildKeyFactory(resource, entries))
1349
- }
1350
- &nbsp;
1351
- // Build query hooks
1352
- const queryHookBlocks: string[] = []
1353
- for (const op of getOps) {
1354
- const info = opToKeyInfo.get(op.funcName)
1355
- <span class="missing-if-branch" title="if path not taken" >I</span>if (info === undefined) <span class="cstat-no" title="statement not covered" >continue</span>
1356
- const { factoryName, keyEntry } = info
1357
- queryHookBlocks.push(buildQueryHook(op, factoryName, keyEntry, staleTime, gcTime))
1358
- }
1359
- &nbsp;
1360
- // Build mutation hooks
1361
- const mutationHookBlocks: string[] = []
1362
- for (const op of mutationOps) {
1363
- mutationHookBlocks.push(buildMutationHook(op))
1364
- }
1365
- &nbsp;
1366
- // Determine which react-query exports to import
1367
- const needsUseQuery = getOps.length &gt; 0
1368
- const needsUseMutation = mutationOps.length &gt; 0
1369
- const rqImports: string[] = []
1370
- <span class="missing-if-branch" title="else path not taken" >E</span>if (needsUseQuery) rqImports.push('useQuery', 'type UseQueryOptions')
1371
- <span class="missing-if-branch" title="else path not taken" >E</span>if (needsUseMutation) rqImports.push('useMutation', 'type UseMutationOptions')
1372
- &nbsp;
1373
- // Collect all function names for client import
1374
- const allFuncNames = operations.map((op) =&gt; op.funcName).sort()
1375
- &nbsp;
1376
- // Build file content
1377
- const lines: string[] = []
1378
- lines.push('// This file is auto-generated by @codewithagents/openapi-react-query — do not edit')
1379
- lines.push('')
1380
- <span class="missing-if-branch" title="else path not taken" >E</span>if (rqImports.length &gt; 0) {
1381
- lines.push(`import { ${rqImports.join(', ')} } from '@tanstack/react-query'`)
1382
- }
1383
- if (allFuncNames.length &gt; 0) {
1384
- lines.push(`import { ${allFuncNames.join(', ')}, type ApiError } from './client.js'`)
1385
- } else <span class="missing-if-branch" title="else path not taken" >E</span>{
1386
- <span class="cstat-no" title="statement not covered" > lines.push(`import { type ApiError } from './client.js'`)</span>
1387
- }
1388
- lines.push('')
1389
- &nbsp;
1390
- <span class="missing-if-branch" title="else path not taken" >E</span>if (keyFactoryBlocks.length &gt; 0) {
1391
- lines.push('// ── Query key factories ──────────────────────────────────────')
1392
- lines.push('')
1393
- lines.push(keyFactoryBlocks.join('\n\n'))
1394
- lines.push('')
1395
- }
1396
- &nbsp;
1397
- <span class="missing-if-branch" title="else path not taken" >E</span>if (queryHookBlocks.length &gt; 0) {
1398
- lines.push('// ── Queries ──────────────────────────────────────────────────')
1399
- lines.push('')
1400
- lines.push(queryHookBlocks.join('\n\n'))
1401
- lines.push('')
1402
- }
1403
- &nbsp;
1404
- <span class="missing-if-branch" title="else path not taken" >E</span>if (mutationHookBlocks.length &gt; 0) {
1405
- lines.push('// ── Mutations ────────────────────────────────────────────────')
1406
- lines.push('')
1407
- lines.push(mutationHookBlocks.join('\n\n'))
1408
- lines.push('')
1409
- }
1410
- &nbsp;
1411
- return {
1412
- filename: 'hooks.ts',
1413
- content: lines.join('\n'),
1414
- }
1415
- }
1416
- &nbsp;</pre></td></tr></table></pre>
1417
-
1418
- <div class='push'></div><!-- for sticky footer -->
1419
- </div><!-- /wrapper -->
1420
- <div class='footer quiet pad2 space-top1 center small'>
1421
- Code coverage generated by
1422
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1423
- at 2026-05-24T06:58:43.776Z
1424
- </div>
1425
- <script src="../../prettify.js"></script>
1426
- <script>
1427
- window.onload = function () {
1428
- prettyPrint();
1429
- };
1430
- </script>
1431
- <script src="../../sorter.js"></script>
1432
- <script src="../../block-navigation.js"></script>
1433
- </body>
1434
- </html>
1435
-