@aiready/consistency 0.18.17 → 0.18.21

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.
@@ -0,0 +1,1057 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/utils/context-detector.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/utils</a> context-detector.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">80.09% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>169/211</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">66.05% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>181/274</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">84.21% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>16/19</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">80.48% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>132/164</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 high'></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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
+ <span class="cline-any cline-neutral">&nbsp;</span>
393
+ <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-neutral">&nbsp;</span>
398
+ <span class="cline-any cline-neutral">&nbsp;</span>
399
+ <span class="cline-any cline-neutral">&nbsp;</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-neutral">&nbsp;</span>
407
+ <span class="cline-any cline-neutral">&nbsp;</span>
408
+ <span class="cline-any cline-yes">45x</span>
409
+ <span class="cline-any cline-neutral">&nbsp;</span>
410
+ <span class="cline-any cline-neutral">&nbsp;</span>
411
+ <span class="cline-any cline-yes">45x</span>
412
+ <span class="cline-any cline-yes">90x</span>
413
+ <span class="cline-any cline-yes">90x</span>
414
+ <span class="cline-any cline-neutral">&nbsp;</span>
415
+ <span class="cline-any cline-neutral">&nbsp;</span>
416
+ <span class="cline-any cline-yes">90x</span>
417
+ <span class="cline-any cline-yes">48x</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-no">&nbsp;</span>
421
+ <span class="cline-any cline-yes">42x</span>
422
+ <span class="cline-any cline-yes">3x</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-yes">45x</span>
425
+ <span class="cline-any cline-yes">84x</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-neutral">&nbsp;</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-yes">42x</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-neutral">&nbsp;</span>
432
+ <span class="cline-any cline-yes">87x</span>
433
+ <span class="cline-any cline-yes">48x</span>
434
+ <span class="cline-any cline-yes">87x</span>
435
+ <span class="cline-any cline-yes">45x</span>
436
+ <span class="cline-any cline-yes">39x</span>
437
+ <span class="cline-any cline-yes">45x</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-neutral">&nbsp;</span>
440
+ <span class="cline-any cline-yes">24642x</span>
441
+ <span class="cline-any cline-yes">138x</span>
442
+ <span class="cline-any cline-neutral">&nbsp;</span>
443
+ <span class="cline-any cline-yes">183x</span>
444
+ <span class="cline-any cline-yes">45x</span>
445
+ <span class="cline-any cline-yes">183x</span>
446
+ <span class="cline-any cline-yes">183x</span>
447
+ <span class="cline-any cline-no">&nbsp;</span>
448
+ <span class="cline-any cline-yes">45x</span>
449
+ <span class="cline-any cline-neutral">&nbsp;</span>
450
+ <span class="cline-any cline-neutral">&nbsp;</span>
451
+ <span class="cline-any cline-yes">24687x</span>
452
+ <span class="cline-any cline-yes">24780x</span>
453
+ <span class="cline-any cline-yes">24756x</span>
454
+ <span class="cline-any cline-yes">24780x</span>
455
+ <span class="cline-any cline-yes">24642x</span>
456
+ <span class="cline-any cline-yes">24756x</span>
457
+ <span class="cline-any cline-yes">24780x</span>
458
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
+ <span class="cline-any cline-neutral">&nbsp;</span>
460
+ <span class="cline-any cline-yes">24642x</span>
461
+ <span class="cline-any cline-yes">159x</span>
462
+ <span class="cline-any cline-yes">24669x</span>
463
+ <span class="cline-any cline-neutral">&nbsp;</span>
464
+ <span class="cline-any cline-neutral">&nbsp;</span>
465
+ <span class="cline-any cline-yes">24642x</span>
466
+ <span class="cline-any cline-yes">24756x</span>
467
+ <span class="cline-any cline-yes">24642x</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-yes">159x</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-yes">228x</span>
472
+ <span class="cline-any cline-yes">117x</span>
473
+ <span class="cline-any cline-neutral">&nbsp;</span>
474
+ <span class="cline-any cline-yes">24657x</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-yes">49284x</span>
478
+ <span class="cline-any cline-yes">24756x</span>
479
+ <span class="cline-any cline-yes">24792x</span>
480
+ <span class="cline-any cline-yes">24768x</span>
481
+ <span class="cline-any cline-yes">153x</span>
482
+ <span class="cline-any cline-yes">24717x</span>
483
+ <span class="cline-any cline-yes">24642x</span>
484
+ <span class="cline-any cline-neutral">&nbsp;</span>
485
+ <span class="cline-any cline-yes">159x</span>
486
+ <span class="cline-any cline-neutral">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-yes">45x</span>
489
+ <span class="cline-any cline-neutral">&nbsp;</span>
490
+ <span class="cline-any cline-neutral">&nbsp;</span>
491
+ <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-yes">159x</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-neutral">&nbsp;</span>
495
+ <span class="cline-any cline-neutral">&nbsp;</span>
496
+ <span class="cline-any cline-neutral">&nbsp;</span>
497
+ <span class="cline-any cline-yes">48x</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-yes">24687x</span>
500
+ <span class="cline-any cline-yes">90x</span>
501
+ <span class="cline-any cline-yes">66x</span>
502
+ <span class="cline-any cline-yes">24642x</span>
503
+ <span class="cline-any cline-neutral">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-yes">24666x</span>
506
+ <span class="cline-any cline-yes">24660x</span>
507
+ <span class="cline-any cline-yes">24660x</span>
508
+ <span class="cline-any cline-yes">150x</span>
509
+ <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-yes">126x</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-yes">75x</span>
513
+ <span class="cline-any cline-yes">75x</span>
514
+ <span class="cline-any cline-no">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-neutral">&nbsp;</span>
517
+ <span class="cline-any cline-yes">453x</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-yes">303x</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-yes">24258x</span>
523
+ <span class="cline-any cline-yes">24303x</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-neutral">&nbsp;</span>
530
+ <span class="cline-any cline-yes">24303x</span>
531
+ <span class="cline-any cline-yes">24303x</span>
532
+ <span class="cline-any cline-yes">24279x</span>
533
+ <span class="cline-any cline-yes">909x</span>
534
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
+ <span class="cline-any cline-neutral">&nbsp;</span>
536
+ <span class="cline-any cline-yes">24282x</span>
537
+ <span class="cline-any cline-yes">327x</span>
538
+ <span class="cline-any cline-yes">327x</span>
539
+ <span class="cline-any cline-yes">24258x</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span>
541
+ <span class="cline-any cline-yes">303x</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-yes">303x</span>
545
+ <span class="cline-any cline-neutral">&nbsp;</span>
546
+ <span class="cline-any cline-neutral">&nbsp;</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-yes">303x</span>
549
+ <span class="cline-any cline-neutral">&nbsp;</span>
550
+ <span class="cline-any cline-yes">303x</span>
551
+ <span class="cline-any cline-yes">348x</span>
552
+ <span class="cline-any cline-yes">348x</span>
553
+ <span class="cline-any cline-yes">24258x</span>
554
+ <span class="cline-any cline-neutral">&nbsp;</span>
555
+ <span class="cline-any cline-yes">24303x</span>
556
+ <span class="cline-any cline-yes">24303x</span>
557
+ <span class="cline-any cline-neutral">&nbsp;</span>
558
+ <span class="cline-any cline-yes">24303x</span>
559
+ <span class="cline-any cline-neutral">&nbsp;</span>
560
+ <span class="cline-any cline-yes">48900x</span>
561
+ <span class="cline-any cline-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-neutral">&nbsp;</span>
563
+ <span class="cline-any cline-yes">25506x</span>
564
+ <span class="cline-any cline-yes">25506x</span>
565
+ <span class="cline-any cline-yes">24561x</span>
566
+ <span class="cline-any cline-yes">24561x</span>
567
+ <span class="cline-any cline-yes">354x</span>
568
+ <span class="cline-any cline-yes">318x</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-yes">309x</span>
571
+ <span class="cline-any cline-yes">24303x</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-yes">45x</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-yes">348x</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-neutral">&nbsp;</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">45x</span>
586
+ <span class="cline-any cline-yes">45x</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-neutral">&nbsp;</span>
589
+ <span class="cline-any cline-yes">45x</span>
590
+ <span class="cline-any cline-yes">45x</span>
591
+ <span class="cline-any cline-yes">24x</span>
592
+ <span class="cline-any cline-yes">45x</span>
593
+ <span class="cline-any cline-yes">45x</span>
594
+ <span class="cline-any cline-yes">24642x</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-yes">24666x</span>
598
+ <span class="cline-any cline-yes">24642x</span>
599
+ <span class="cline-any cline-yes">327x</span>
600
+ <span class="cline-any cline-yes">303x</span>
601
+ <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-yes">24x</span>
603
+ <span class="cline-any cline-yes">45x</span>
604
+ <span class="cline-any cline-no">&nbsp;</span>
605
+ <span class="cline-any cline-yes">69x</span>
606
+ <span class="cline-any cline-neutral">&nbsp;</span>
607
+ <span class="cline-any cline-yes">45x</span>
608
+ <span class="cline-any cline-yes">69x</span>
609
+ <span class="cline-any cline-yes">51x</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-yes">18x</span>
614
+ <span class="cline-any cline-no">&nbsp;</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-yes">18x</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-neutral">&nbsp;</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-neutral">&nbsp;</span>
623
+ <span class="cline-any cline-neutral">&nbsp;</span>
624
+ <span class="cline-any cline-no">&nbsp;</span>
625
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
631
+ <span class="cline-any cline-no">&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-yes">1011x</span>
635
+ <span class="cline-any cline-yes">57x</span>
636
+ <span class="cline-any cline-yes">1011x</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-yes">954x</span>
640
+ <span class="cline-any cline-yes">954x</span>
641
+ <span class="cline-any cline-no">&nbsp;</span>
642
+ <span class="cline-any cline-no">&nbsp;</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-neutral">&nbsp;</span>
645
+ <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-yes">954x</span>
648
+ <span class="cline-any cline-yes">954x</span>
649
+ <span class="cline-any cline-yes">954x</span>
650
+ <span class="cline-any cline-neutral">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-yes">954x</span>
653
+ <span class="cline-any cline-yes">954x</span>
654
+ <span class="cline-any cline-yes">42x</span>
655
+ <span class="cline-any cline-no">&nbsp;</span>
656
+ <span class="cline-any cline-neutral">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-no">&nbsp;</span>
659
+ <span class="cline-any cline-no">&nbsp;</span>
660
+ <span class="cline-any cline-yes">954x</span>
661
+ <span class="cline-any cline-yes">69x</span>
662
+ <span class="cline-any cline-yes">63x</span>
663
+ <span class="cline-any cline-yes">69x</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-yes">891x</span>
667
+ <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
681
+ <span class="cline-any cline-no">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-neutral">&nbsp;</span>
685
+ <span class="cline-any cline-no">&nbsp;</span>
686
+ <span class="cline-any cline-neutral">&nbsp;</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
+ <span class="cline-any cline-no">&nbsp;</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-no">&nbsp;</span>
694
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-no">&nbsp;</span>
701
+ <span class="cline-any cline-no">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { TSESTree } from '@typescript-eslint/typescript-estree';
715
+ import { traverseAST } from './ast-parser';
716
+ import { Severity } from '@aiready/core';
717
+ &nbsp;
718
+ export type FileType = 'test' | 'production' | 'config' | 'types';
719
+ export type CodeLayer = 'api' | 'business' | 'data' | 'utility' | 'unknown';
720
+ &nbsp;
721
+ export interface CodeContext {
722
+ fileType: FileType;
723
+ codeLayer: CodeLayer;
724
+ complexity: number;
725
+ isTestFile: boolean;
726
+ isTypeDefinition: boolean;
727
+ }
728
+ &nbsp;
729
+ /**
730
+ * Detect the file type based on file path and content
731
+ */
732
+ export function detectFileType(
733
+ filePath: string,
734
+ ast: TSESTree.Program
735
+ ):<span class="missing-if-branch" title="if path not taken" >I</span> FileType {
736
+ void ast;
737
+ const path = filePath.toLowerCase();
738
+ &nbsp;
739
+ // Test files
740
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
741
+ path.match(/\.(test|spec)\.(ts|tsx|js|jsx)$/) ||
742
+ path.includes('__tests__')
743
+ ) {
744
+ <span class="cstat-no" title="statement not covered" > return 'test';</span>
745
+ }
746
+ &nbsp;
747
+ // Type definition files
748
+ if (path.endsWith('.d.ts') || path.includes('types')) {
749
+ return 'types';
750
+ }
751
+ &nbsp;
752
+ // Config files
753
+ if (
754
+ path.match(/config|\.config\.|rc\.|setup/) ||
755
+ path.includes('configuration')
756
+ ) {
757
+ return 'config';
758
+ }
759
+ &nbsp;
760
+ return 'production';
761
+ }
762
+ &nbsp;
763
+ /**
764
+ * Detect the code layer based on imports and exports
765
+ */
766
+ export function detectCodeLayer(ast: TSESTree.Program): CodeLayer {
767
+ let ha<span class="missing-if-branch" title="if path not taken" >I</span>sAPIIndicators = 0;
768
+ let hasB<span class="cstat-no" title="statement not covered" >usinessIndicators = 0;</span>
769
+ let hasDataIndicators = 0;
770
+ let ha<span class="missing-if-branch" title="if path not taken" >I</span>sUtilityIndicators = 0;
771
+ <span class="cstat-no" title="statement not covered" ></span>
772
+ traverseAST(ast, {
773
+ enter: (node) =&gt; {
774
+ // Check imports
775
+ if (node.type === 'ImportDeclaration') {
776
+ const source = node.source.value as string;
777
+ &nbsp;
778
+ if (source.match(/express|fastify|koa|@nestjs|axios|fetch|http/i)) {
779
+ hasAPIIndicators++;
780
+ }
781
+ if (
782
+ source.match(/database|prisma|typeorm|sequelize|mongoose|pg|mysql/i)
783
+ ) {
784
+ hasDataIndicators++;
785
+ }
786
+ }
787
+ &nbsp;
788
+ // Check function names for layer indicators
789
+ if (node.type === 'FunctionDeclaration' &amp;&amp; node.id) {
790
+ const name = node.id.name;
791
+ &nbsp;
792
+ // API layer patterns
793
+ if (
794
+ name.match(
795
+ /^(get|post|put|delete|patch|handle|api|route|controller)/i
796
+ )
797
+ ) {
798
+ hasAPIIndicators++;
799
+ }
800
+ &nbsp;
801
+ // Business logic patterns
802
+ if (
803
+ name.match(/^(calculate|process|validate|transform|compute|analyze)/i)
804
+ ) {
805
+ hasBusinessIndicators++;
806
+ }
807
+ &nbsp;
808
+ // Data layer patterns
809
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
810
+ name.match(/^(find|create|update|delete|save|fetch|query|insert)/i)
811
+ ) {
812
+ hasDataIndicators++;
813
+ }
814
+ &nbsp;
815
+ // Utility patterns
816
+ if (
817
+ name.match(
818
+ /^(format|parse|convert|normalize|sanitize|encode|decode)/i
819
+ )
820
+ ) {
821
+ hasUtilityIndicators++;
822
+ }
823
+ }
824
+ &nbsp;
825
+ // Check for exports
826
+ if (
827
+ node.type === 'ExportNamedDeclaration' ||
828
+ node.type === 'ExportDefaultDeclaration'
829
+ ) {
830
+ // Functions exported with "api", "handler", "route" suggest API layer
831
+ if (node.type === 'ExportNamedDeclaration' &amp;&amp; node.declaration) {
832
+ if (
833
+ node.declaration.type === 'FunctionDeclaration' &amp;&amp;
834
+ node.declaration.id
835
+ ) {
836
+ const name = node.declaration.id.name;
837
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (name.match(/handler|route|api|controller/i)) {
838
+ <span class="cstat-no" title="statement not covered" > hasAPIIndicators += 2; // Stronger signal</span>
839
+ }
840
+ }
841
+ }
842
+ }
843
+ },
844
+ });
845
+ &nbsp;
846
+ // Determine layer based on indicators
847
+ const scores = {
848
+ api: hasAPIIndicators,
849
+ business: hasBusinessIndicators,
850
+ data: hasDataIndicators,
851
+ utility: hasUtilityIndicators,
852
+ };
853
+ &nbsp;
854
+ const maxScore = Math.max(...Object.values(scores));
855
+ if (maxScore === 0) {
856
+ return 'unknown';
857
+ }
858
+ &nbsp;
859
+ // Return the layer with highest score
860
+ if (scores.api === maxScore) return 'api';
861
+ if (scores.data === maxScore) return 'data';
862
+ if (scores.business === maxScore) return 'business';
863
+ if (scores.utility === maxScore) return 'utility';
864
+ &nbsp;
865
+ return 'unknown';
866
+ }
867
+ &nbsp;
868
+ /**
869
+ * Calculate cyclomatic complexity for a function
870
+ */
871
+ export function calculateComplexity(node: TSESTree.Node): number {
872
+ let complexity = 1; // Base complexity
873
+ &nbsp;
874
+ traverseAST(node, {
875
+ enter: (childNode) =&gt; {
876
+ // Each decision point adds 1 to complexity
877
+ switch (childNode.type) {
878
+ case 'IfStatement':
879
+ case 'ConditionalExpression': // ternary
880
+ case 'SwitchCase':
881
+ case 'ForStatement':
882
+ case 'ForInStatement':
883
+ case 'ForOfStatement':
884
+ case 'WhileStatement':
885
+ case 'DoWhileStatement':
886
+ case 'CatchClause':
887
+ complexity++;
888
+ break;
889
+ case 'LogicalExpression':
890
+ // &amp;&amp; and || add complexity
891
+ if (childNode.operator === '&amp;&amp;' || childNode.operator === '||') {
892
+ complexity++;
893
+ }
894
+ break;
895
+ }
896
+ },
897
+ });
898
+ &nbsp;
899
+ return complexity;
900
+ }
901
+ &nbsp;
902
+ /**
903
+ * Build a complete context for a file
904
+ */
905
+ export function buildCodeContext(
906
+ filePath: string,
907
+ ast: TSESTree.Program
908
+ ): CodeContext {
909
+ const fileType = detectFileType(filePath, ast);
910
+ const codeLayer = detectCodeLayer(ast);
911
+ &nbsp;
912
+ // Calculate average complexity of functions in file
913
+ let totalComplexity = 0;
914
+ let functionCount = 0;
915
+ <span class="missing-if-branch" title="if path not taken" >I</span>
916
+ traverseAST(ast, {
917
+ enter: (node) =&gt; {
918
+ if (
919
+ node.type === 'FunctionDeclaration' ||
920
+ node.type === 'FunctionExpression' ||
921
+ node.type === 'ArrowFunctionExpression'
922
+ ) {
923
+ totalComplexity += calculateComplexity(node);
924
+ functionCount++;
925
+ }
926
+ <span class="missing-if-branch" title="if path not taken" >I</span> },
927
+ });
928
+ <span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ></span></span>
929
+ const avgComplexity = functionCount &gt; 0 ? totalComplexity / functionCount : 1;
930
+ &nbsp;
931
+ return {
932
+ fileType,
933
+ <span class="missing-if-branch" title="else path not taken" >E</span>codeLayer,
934
+ complexity: Math.round(avgComplexity),
935
+ isTestFile: fileType === 'test',
936
+ isTypeDefinition: fileType === 'types',
937
+ <span class="missing-if-branch" title="if path not taken" >I</span>};
938
+ }<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ></span></span>
939
+ &nbsp;
940
+ /**
941
+ * Get context-adjusted severity based on code context
942
+ */
943
+ export function <span class="fstat-no" title="function not covered" >adjustSeverity(</span>
944
+ baseSeverity: Severity | string,
945
+ context: CodeContext,
946
+ issueType: string
947
+ ): Severity {
948
+ const getEnum = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(s</span>: any): Severity =&gt; {</span>
949
+ <span class="cstat-no" title="statement not covered" > if (s === Severity.Critical || s === 'critical') <span class="cstat-no" title="statement not covered" >return Severity.Critical;</span></span>
950
+ <span class="cstat-no" title="statement not covered" > if (s === Severity.Major || s === 'major') <span class="cstat-no" title="statement not covered" >return Severity.Major;</span></span>
951
+ <span class="cstat-no" title="statement not covered" > if (s === Severity.Minor || s === 'minor') <span class="cstat-no" title="statement not covered" >return Severity.Minor;</span></span>
952
+ <span class="cstat-no" title="statement not covered" > return Severity.Info;</span>
953
+ };
954
+ &nbsp;
955
+ let currentSev = <span class="cstat-no" title="statement not covered" >getEnum(baseSeverity);</span>
956
+ &nbsp;
957
+ // Test files: Be more lenient
958
+ <span class="cstat-no" title="statement not covered" > if (context.isTestFile) {</span>
959
+ if (currentSev === Severity.Minor) currentSev = Severity.Info;
960
+ if (currentSev === Severity.Major) currentSev = Severity.Minor;
961
+ }
962
+ &nbsp;
963
+ <span class="missing-if-branch" title="if path not taken" >I</span>// Type definition files: Be more lenient (often use short generic names)
964
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (context.isTypeDefinition) {
965
+ <span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" > if (currentSev === Severity.Minor) <span class="cstat-no" title="statement not covered" >currentSev = Severity.Info;</span></span></span>
966
+ }<span class="cstat-no" title="statement not covered" ></span>
967
+ &nbsp;
968
+ // API layer: Be stricter (public interface)
969
+ <span class="cstat-no" title="statement not covered" > if (context.codeLayer === 'api') {</span>
970
+ <span class="cstat-no" title="statement not covered" > if (currentSev === Severity.Info &amp;&amp; issueType === 'unclear')</span>
971
+ <span class="missing-if-branch" title="if path not taken" >I</span> currentSev = Severity.Minor;<span class="branch-1 cbranch-no" title="branch not covered" ></span>
972
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (<span class="branch-0 cbranch-no" title="branch not covered" >currentSev === Severity.Minor &amp;&amp; i</span>ssueType === 'unclear')</span>
973
+ currentSev = Severity.Major;
974
+ }
975
+ &nbsp;
976
+ // High complexity: Be stricter (need clearer names)
977
+ if (context.complexity &gt; 10) {
978
+ <span class="missing-if-branch" title="if path not taken" >I</span><span class="missing-if-branch" title="if path not taken" >I</span>if (currentSev === Severity.Info) currentSev = Severity.Minor;
979
+ }<span class="cstat-no" title="statement not covered" ></span>
980
+ &nbsp;
981
+ // Utility/helper layer: Allow shorter names
982
+ <span class="cstat-no" title="statement not covered" > if (context.codeLayer === 'utility') {</span>
983
+ <span class="cstat-no" title="statement not covered" > if (currentSev === Severity.Minor &amp;&amp; issueType === 'abbreviation')</span>
984
+ currentSev = Severity.Info;<span class="branch-1 cbranch-no" title="branch not covered" ></span>
985
+ }
986
+ &nbsp;
987
+ return currentSev;
988
+ }
989
+ &nbsp;
990
+ /**
991
+ * Check if a short variable name is acceptable in this context
992
+ */
993
+ export function <span class="fstat-no" title="function not covered" >isAcceptableInContext(</span>
994
+ name: string,
995
+ context: CodeContext,
996
+ options: {
997
+ isLoopVariable?: boolean;
998
+ isParameter?: boolean;
999
+ isDestructured?: boolean;
1000
+ complexity?: number;
1001
+ }
1002
+ ): boolean {
1003
+ // Loop variables always acceptable
1004
+ <span class="cstat-no" title="statement not covered" > if (options.isLoopVariable &amp;&amp; ['i', 'j', 'k', 'l', 'n', 'm'].includes(name)) {</span>
1005
+ <span class="cstat-no" title="statement not covered" > return true;</span>
1006
+ }
1007
+ &nbsp;
1008
+ // Test files: More lenient
1009
+ <span class="cstat-no" title="statement not covered" > if (context.isTestFile) {</span>
1010
+ // Common test patterns: a/b for comparison, x/y for coordinates
1011
+ <span class="cstat-no" title="statement not covered" > if (['a', 'b', 'c', 'x', 'y', 'z'].includes(name) &amp;&amp; options.isParameter) {</span>
1012
+ <span class="cstat-no" title="statement not covered" > return true;</span>
1013
+ }
1014
+ }
1015
+ &nbsp;
1016
+ // Math/graphics context: x, y, z acceptable
1017
+ <span class="cstat-no" title="statement not covered" > if (context.codeLayer === 'utility' &amp;&amp; ['x', 'y', 'z'].includes(name)) {</span>
1018
+ <span class="cstat-no" title="statement not covered" > return true;</span>
1019
+ }
1020
+ &nbsp;
1021
+ // Destructured from well-named source: More lenient
1022
+ <span class="cstat-no" title="statement not covered" > if (options.isDestructured) {</span>
1023
+ // Coverage metrics s/b/f/l always acceptable when destructured
1024
+ <span class="cstat-no" title="statement not covered" > if (['s', 'b', 'f', 'l'].includes(name)) {</span>
1025
+ <span class="cstat-no" title="statement not covered" > return true;</span>
1026
+ }
1027
+ }
1028
+ &nbsp;
1029
+ // Simple functions (complexity &lt; 3): Allow short parameter names
1030
+ <span class="cstat-no" title="statement not covered" > if (options.isParameter &amp;&amp; (options.complexity ?? context.complexity) &lt; 3) {</span>
1031
+ <span class="cstat-no" title="statement not covered" > if (name.length &gt;= 2) {</span>
1032
+ <span class="cstat-no" title="statement not covered" > return true; // Two-letter names OK in simple functions</span>
1033
+ }
1034
+ }
1035
+ &nbsp;
1036
+ <span class="cstat-no" title="statement not covered" > return false;</span>
1037
+ }
1038
+ &nbsp;</pre></td></tr></table></pre>
1039
+
1040
+ <div class='push'></div><!-- for sticky footer -->
1041
+ </div><!-- /wrapper -->
1042
+ <div class='footer quiet pad2 space-top1 center small'>
1043
+ Code coverage generated by
1044
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1045
+ at 2026-03-09T03:06:05.217Z
1046
+ </div>
1047
+ <script src="../../prettify.js"></script>
1048
+ <script>
1049
+ window.onload = function () {
1050
+ prettyPrint();
1051
+ };
1052
+ </script>
1053
+ <script src="../../sorter.js"></script>
1054
+ <script src="../../block-navigation.js"></script>
1055
+ </body>
1056
+ </html>
1057
+