@aiready/context-analyzer 0.21.22 → 0.21.23

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.
Files changed (61) hide show
  1. package/.turbo/turbo-build.log +26 -25
  2. package/.turbo/turbo-lint.log +5 -5
  3. package/.turbo/turbo-test.log +104 -41
  4. package/coverage/clover.xml +2615 -1242
  5. package/coverage/coverage-final.json +30 -13
  6. package/coverage/dist/chunk-64U3PNO3.mjs.html +367 -0
  7. package/coverage/dist/chunk-J3MUOWHC.mjs.html +5326 -0
  8. package/coverage/dist/index.html +146 -0
  9. package/coverage/{classifier.ts.html → dist/index.mjs.html} +537 -912
  10. package/coverage/index.html +84 -189
  11. package/coverage/src/analyzer.ts.html +88 -0
  12. package/coverage/src/analyzers/index.html +116 -0
  13. package/coverage/src/analyzers/python-context.ts.html +910 -0
  14. package/coverage/{ast-utils.ts.html → src/ast-utils.ts.html} +84 -54
  15. package/coverage/src/classifier.ts.html +892 -0
  16. package/coverage/src/classify/classification-patterns.ts.html +307 -0
  17. package/coverage/src/classify/file-classifiers.ts.html +973 -0
  18. package/coverage/src/classify/index.html +131 -0
  19. package/coverage/{cluster-detector.ts.html → src/cluster-detector.ts.html} +154 -91
  20. package/coverage/{defaults.ts.html → src/defaults.ts.html} +74 -65
  21. package/coverage/{graph-builder.ts.html → src/graph-builder.ts.html} +268 -229
  22. package/coverage/src/index.html +341 -0
  23. package/coverage/{index.ts.html → src/index.ts.html} +70 -13
  24. package/coverage/{scoring.ts.html → src/issue-analyzer.ts.html} +201 -261
  25. package/coverage/src/mapper.ts.html +439 -0
  26. package/coverage/{metrics.ts.html → src/metrics.ts.html} +201 -132
  27. package/coverage/src/orchestrator.ts.html +493 -0
  28. package/coverage/{provider.ts.html → src/provider.ts.html} +21 -21
  29. package/coverage/{remediation.ts.html → src/remediation.ts.html} +112 -52
  30. package/coverage/src/report/console-report.ts.html +415 -0
  31. package/coverage/src/report/html-report.ts.html +361 -0
  32. package/coverage/src/report/index.html +146 -0
  33. package/coverage/src/report/interactive-setup.ts.html +373 -0
  34. package/coverage/src/scoring.ts.html +895 -0
  35. package/coverage/src/semantic/co-usage.ts.html +340 -0
  36. package/coverage/src/semantic/consolidation.ts.html +223 -0
  37. package/coverage/src/semantic/domain-inference.ts.html +859 -0
  38. package/coverage/src/semantic/index.html +161 -0
  39. package/coverage/src/semantic/type-graph.ts.html +163 -0
  40. package/coverage/{summary.ts.html → src/summary.ts.html} +155 -275
  41. package/coverage/{types.ts.html → src/types.ts.html} +133 -31
  42. package/coverage/src/utils/dependency-graph-utils.ts.html +463 -0
  43. package/coverage/src/utils/index.html +131 -0
  44. package/coverage/src/utils/string-utils.ts.html +148 -0
  45. package/dist/chunk-J3MUOWHC.mjs +1747 -0
  46. package/dist/cli.js +59 -171
  47. package/dist/cli.mjs +1 -1
  48. package/dist/index.js +55 -167
  49. package/dist/index.mjs +1 -1
  50. package/package.json +2 -2
  51. package/src/__tests__/consolidation.test.ts +247 -0
  52. package/src/__tests__/defaults.test.ts +121 -0
  53. package/src/__tests__/domain-inference.test.ts +420 -0
  54. package/src/__tests__/issue-analyzer.test.ts +155 -0
  55. package/src/__tests__/orchestrator.test.ts +143 -0
  56. package/src/__tests__/python-context.test.ts +98 -0
  57. package/src/__tests__/report/console-report.test.ts +292 -0
  58. package/src/__tests__/report/html-report.test.ts +232 -0
  59. package/src/report/html-report.ts +58 -174
  60. package/coverage/analyzer.ts.html +0 -1369
  61. package/coverage/semantic-analysis.ts.html +0 -1201
@@ -0,0 +1,973 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/classify/file-classifiers.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/classify</a> file-classifiers.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">96.11% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>99/103</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">75% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>84/112</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>33/33</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>96/96</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-neutral">&nbsp;</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-neutral">&nbsp;</span>
371
+ <span class="cline-any cline-neutral">&nbsp;</span>
372
+ <span class="cline-any cline-neutral">&nbsp;</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-neutral">&nbsp;</span>
379
+ <span class="cline-any cline-neutral">&nbsp;</span>
380
+ <span class="cline-any cline-neutral">&nbsp;</span>
381
+ <span class="cline-any cline-neutral">&nbsp;</span>
382
+ <span class="cline-any cline-neutral">&nbsp;</span>
383
+ <span class="cline-any cline-yes">112x</span>
384
+ <span class="cline-any cline-yes">112x</span>
385
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-neutral">&nbsp;</span>
387
+ <span class="cline-any cline-yes">123x</span>
388
+ <span class="cline-any cline-yes">112x</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-yes">4x</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-yes">13x</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-yes">4x</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-yes">4x</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-yes">112x</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-neutral">&nbsp;</span>
415
+ <span class="cline-any cline-yes">55x</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-yes">55x</span>
418
+ <span class="cline-any cline-yes">55x</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-yes">55x</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-yes">55x</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-yes">55x</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-yes">10x</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-yes">55x</span>
432
+ <span class="cline-any cline-neutral">&nbsp;</span>
433
+ <span class="cline-any cline-neutral">&nbsp;</span>
434
+ <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-neutral">&nbsp;</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
441
+ <span class="cline-any cline-neutral">&nbsp;</span>
442
+ <span class="cline-any cline-yes">51x</span>
443
+ <span class="cline-any cline-yes">51x</span>
444
+ <span class="cline-any cline-neutral">&nbsp;</span>
445
+ <span class="cline-any cline-yes">51x</span>
446
+ <span class="cline-any cline-yes">51x</span>
447
+ <span class="cline-any cline-neutral">&nbsp;</span>
448
+ <span class="cline-any cline-yes">51x</span>
449
+ <span class="cline-any cline-neutral">&nbsp;</span>
450
+ <span class="cline-any cline-yes">58x</span>
451
+ <span class="cline-any cline-neutral">&nbsp;</span>
452
+ <span class="cline-any cline-neutral">&nbsp;</span>
453
+ <span class="cline-any cline-yes">51x</span>
454
+ <span class="cline-any cline-yes">51x</span>
455
+ <span class="cline-any cline-neutral">&nbsp;</span>
456
+ <span class="cline-any cline-neutral">&nbsp;</span>
457
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
461
+ <span class="cline-any cline-neutral">&nbsp;</span>
462
+ <span class="cline-any cline-neutral">&nbsp;</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">30x</span>
466
+ <span class="cline-any cline-yes">30x</span>
467
+ <span class="cline-any cline-yes">30x</span>
468
+ <span class="cline-any cline-yes">30x</span>
469
+ <span class="cline-any cline-yes">30x</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-neutral">&nbsp;</span>
472
+ <span class="cline-any cline-neutral">&nbsp;</span>
473
+ <span class="cline-any cline-neutral">&nbsp;</span>
474
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-yes">44x</span>
481
+ <span class="cline-any cline-yes">44x</span>
482
+ <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-yes">44x</span>
484
+ <span class="cline-any cline-yes">264x</span>
485
+ <span class="cline-any cline-neutral">&nbsp;</span>
486
+ <span class="cline-any cline-yes">44x</span>
487
+ <span class="cline-any cline-yes">44x</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-yes">66x</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">44x</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-neutral">&nbsp;</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-neutral">&nbsp;</span>
500
+ <span class="cline-any cline-neutral">&nbsp;</span>
501
+ <span class="cline-any cline-neutral">&nbsp;</span>
502
+ <span class="cline-any cline-neutral">&nbsp;</span>
503
+ <span class="cline-any cline-yes">40x</span>
504
+ <span class="cline-any cline-yes">40x</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-yes">40x</span>
507
+ <span class="cline-any cline-yes">154x</span>
508
+ <span class="cline-any cline-neutral">&nbsp;</span>
509
+ <span class="cline-any cline-yes">40x</span>
510
+ <span class="cline-any cline-yes">40x</span>
511
+ <span class="cline-any cline-yes">62x</span>
512
+ <span class="cline-any cline-neutral">&nbsp;</span>
513
+ <span class="cline-any cline-yes">40x</span>
514
+ <span class="cline-any cline-yes">60x</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-yes">40x</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">37x</span>
530
+ <span class="cline-any cline-yes">37x</span>
531
+ <span class="cline-any cline-neutral">&nbsp;</span>
532
+ <span class="cline-any cline-yes">37x</span>
533
+ <span class="cline-any cline-yes">292x</span>
534
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
+ <span class="cline-any cline-yes">37x</span>
536
+ <span class="cline-any cline-yes">37x</span>
537
+ <span class="cline-any cline-neutral">&nbsp;</span>
538
+ <span class="cline-any cline-yes">58x</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-neutral">&nbsp;</span>
542
+ <span class="cline-any cline-yes">37x</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-neutral">&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-yes">34x</span>
554
+ <span class="cline-any cline-yes">34x</span>
555
+ <span class="cline-any cline-neutral">&nbsp;</span>
556
+ <span class="cline-any cline-yes">34x</span>
557
+ <span class="cline-any cline-yes">256x</span>
558
+ <span class="cline-any cline-neutral">&nbsp;</span>
559
+ <span class="cline-any cline-yes">34x</span>
560
+ <span class="cline-any cline-yes">34x</span>
561
+ <span class="cline-any cline-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-yes">53x</span>
563
+ <span class="cline-any cline-neutral">&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-yes">34x</span>
567
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">31x</span>
578
+ <span class="cline-any cline-yes">31x</span>
579
+ <span class="cline-any cline-neutral">&nbsp;</span>
580
+ <span class="cline-any cline-yes">31x</span>
581
+ <span class="cline-any cline-yes">121x</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-yes">31x</span>
584
+ <span class="cline-any cline-yes">31x</span>
585
+ <span class="cline-any cline-yes">47x</span>
586
+ <span class="cline-any cline-yes">139x</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">31x</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-yes">47x</span>
601
+ <span class="cline-any cline-yes">47x</span>
602
+ <span class="cline-any cline-yes">47x</span>
603
+ <span class="cline-any cline-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-yes">47x</span>
606
+ <span class="cline-any cline-yes">47x</span>
607
+ <span class="cline-any cline-yes">44x</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-yes">3x</span>
610
+ <span class="cline-any cline-yes">8x</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">47x</span>
614
+ <span class="cline-any cline-yes">3x</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">47x</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-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-neutral">&nbsp;</span>
626
+ <span class="cline-any cline-neutral">&nbsp;</span>
627
+ <span class="cline-any cline-neutral">&nbsp;</span>
628
+ <span class="cline-any cline-yes">25x</span>
629
+ <span class="cline-any cline-yes">25x</span>
630
+ <span class="cline-any cline-yes">25x</span>
631
+ <span class="cline-any cline-neutral">&nbsp;</span>
632
+ <span class="cline-any cline-yes">25x</span>
633
+ <span class="cline-any cline-yes">175x</span>
634
+ <span class="cline-any cline-neutral">&nbsp;</span>
635
+ <span class="cline-any cline-yes">25x</span>
636
+ <span class="cline-any cline-yes">25x</span>
637
+ <span class="cline-any cline-yes">34x</span>
638
+ <span class="cline-any cline-yes">100x</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-yes">25x</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-neutral">&nbsp;</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-neutral">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-yes">24x</span>
656
+ <span class="cline-any cline-yes">24x</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { DependencyNode } from '../types';
659
+ import {
660
+ BARREL_EXPORT_MIN_EXPORTS,
661
+ BARREL_EXPORT_TOKEN_LIMIT,
662
+ HANDLER_NAME_PATTERNS,
663
+ SERVICE_NAME_PATTERNS,
664
+ EMAIL_NAME_PATTERNS,
665
+ PARSER_NAME_PATTERNS,
666
+ SESSION_NAME_PATTERNS,
667
+ NEXTJS_METADATA_EXPORTS,
668
+ CONFIG_NAME_PATTERNS,
669
+ } from './classification-patterns';
670
+ &nbsp;
671
+ /**
672
+ * Detect if a file is a boilerplate barrel (architectural theater).
673
+ * A boilerplate barrel re-exports from other sources without adding value.
674
+ *
675
+ * @param node - The dependency node to analyze.
676
+ * @returns True if the file matches boilerplate barrel patterns.
677
+ */
678
+ export function isBoilerplateBarrel(node: DependencyNode): boolean {
679
+ const { exports, tokenCost } = node;
680
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!exports || exports.length === 0) <span class="cstat-no" title="statement not covered" >return false;</span>
681
+ &nbsp;
682
+ // 1. Must be purely re-exports
683
+ const isPurelyReexports = exports.every((exp: any) =&gt; !!exp.source);
684
+ if (!isPurelyReexports) return false;
685
+ &nbsp;
686
+ // 2. Must be low local token cost (no actual logic)
687
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (tokenCost &gt; 500) <span class="cstat-no" title="statement not covered" >return false;</span>
688
+ &nbsp;
689
+ // 3. Detect "Architectural Theater"
690
+ // If it re-exports everything from exactly ONE source, it's a pass-through
691
+ const sources = new Set(exports.map((exp: any) =&gt; exp.source));
692
+ &nbsp;
693
+ // Pattern: export * from '../actual'
694
+ const isSingleSourcePassThrough = sources.size === 1;
695
+ &nbsp;
696
+ // Pattern: multi-file 1-to-1 re-exports that don't aggregate much
697
+ // (e.g., 6 files each re-exporting from exactly one other file)
698
+ const isMeaninglessAggregation = sources.size &gt; 0 &amp;&amp; sources.size &lt; 3;
699
+ &nbsp;
700
+ return isSingleSourcePassThrough || isMeaninglessAggregation;
701
+ }
702
+ &nbsp;
703
+ /**
704
+ * Detect if a file is a barrel export (index.ts).
705
+ *
706
+ * @param node - The dependency node to analyze.
707
+ * @returns True if the file matches barrel export patterns.
708
+ * @lastUpdated 2026-03-20
709
+ */
710
+ export function isBarrelExport(node: DependencyNode): boolean {
711
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (isBoilerplateBarrel(node)) <span class="cstat-no" title="statement not covered" >return false; // Already handled by more specific check</span>
712
+ &nbsp;
713
+ const { file, exports } = node;
714
+ const fileName = file.split('/').pop()?.toLowerCase();
715
+ &nbsp;
716
+ const isIndexFile = fileName === 'index.ts' || fileName === 'index.js';
717
+ const isSmallAndManyExports =
718
+ node.tokenCost &lt; BARREL_EXPORT_TOKEN_LIMIT &amp;&amp;
719
+ (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).l</span>ength &gt; BARREL_EXPORT_MIN_EXPORTS;
720
+ &nbsp;
721
+ const isReexportPattern =
722
+ (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).l</span>ength &gt;= BARREL_EXPORT_MIN_EXPORTS &amp;&amp;
723
+ (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).e</span>very((exp: any) =&gt;
724
+ ['const', 'function', 'type', 'interface'].includes(exp.type)
725
+ );
726
+ &nbsp;
727
+ return !!isIndexFile || !!isSmallAndManyExports || !!isReexportPattern;
728
+ }
729
+ &nbsp;
730
+ /**
731
+ * Detect if a file is primarily type definitions.
732
+ *
733
+ * @param node - The dependency node to analyze.
734
+ * @returns True if the file contains primarily types or matches type paths.
735
+ * @lastUpdated 2026-03-18
736
+ */
737
+ export function isTypeDefinition(node: DependencyNode): boolean {
738
+ const { file } = node;
739
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (file.endsWith('.d.ts')) <span class="cstat-no" title="statement not covered" >return true;</span>
740
+ &nbsp;
741
+ const nodeExports = node.exports || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
742
+ const hasExports = nodeExports.length &gt; 0;
743
+ const areAllTypes =
744
+ hasExports &amp;&amp;
745
+ nodeExports.every(
746
+ (exp: any) =&gt; exp.type === 'type' || exp.type === 'interface'
747
+ );
748
+ &nbsp;
749
+ const isTypePath = /\/(types|interfaces|models)\//i.test(file);
750
+ return !!areAllTypes || (isTypePath &amp;&amp; <span class="branch-2 cbranch-no" title="branch not covered" >hasExports);</span>
751
+ }
752
+ &nbsp;
753
+ /**
754
+ * Detect if a file is a utility module.
755
+ *
756
+ * @param node - The dependency node to analyze.
757
+ * @returns True if the file path or name suggests a utility/helper role.
758
+ * @lastUpdated 2026-03-18
759
+ */
760
+ export function isUtilityModule(node: DependencyNode): boolean {
761
+ const { file } = node;
762
+ const isUtilPath = /\/(utils|helpers|util|helper)\//i.test(file);
763
+ const fileName = file.split('/').pop()?.toLowerCase() || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
764
+ const isUtilName = /(utils\.|helpers\.|util\.|helper\.)/i.test(fileName);
765
+ return isUtilPath || isUtilName;
766
+ }
767
+ &nbsp;
768
+ /**
769
+ * Detect if a file is a Lambda/API handler.
770
+ *
771
+ * @param node - The dependency node to analyze.
772
+ * @returns True if the file serves as a coordination point for requests/lambdas.
773
+ * @lastUpdated 2026-03-18
774
+ */
775
+ export function isLambdaHandler(node: DependencyNode): boolean {
776
+ const { file, exports } = node;
777
+ const fileName = file.split('/').pop()?.toLowerCase() || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
778
+ &nbsp;
779
+ const isHandlerName = HANDLER_NAME_PATTERNS.some((pattern: string) =&gt;
780
+ fileName.includes(pattern)
781
+ );
782
+ const isHandlerPath = /\/(handlers|lambdas|lambda|functions)\//i.test(file);
783
+ const hasHandlerExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome(
784
+ (exp: any) =&gt;
785
+ ['handler', 'main', 'lambdahandler'].includes(exp.name.toLowerCase()) ||
786
+ exp.name.toLowerCase().endsWith('handler')
787
+ );
788
+ return isHandlerName || isHandlerPath || hasHandlerExport;
789
+ }
790
+ &nbsp;
791
+ /**
792
+ * Detect if a file is a service file.
793
+ *
794
+ * @param node - The dependency node to analyze.
795
+ * @returns True if the file orchestrates logic or matches service patterns.
796
+ * @lastUpdated 2026-03-18
797
+ */
798
+ export function isServiceFile(node: DependencyNode): boolean {
799
+ const { file, exports } = node;
800
+ const fileName = file.split('/').pop()?.toLowerCase() || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
801
+ &nbsp;
802
+ const isServiceName = SERVICE_NAME_PATTERNS.some((pattern: string) =&gt;
803
+ fileName.includes(pattern)
804
+ );
805
+ const isServicePath = file.toLowerCase().includes('/services/');
806
+ const hasServiceNamedExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome((exp: any) =&gt;
807
+ exp.name.toLowerCase().includes('service')
808
+ );
809
+ const hasClassExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome(
810
+ (exp: any) =&gt; exp.type === 'class'
811
+ );
812
+ return (
813
+ isServiceName || isServicePath || (hasServiceNamedExport &amp;&amp; <span class="branch-3 cbranch-no" title="branch not covered" >hasClassExport)</span>
814
+ );
815
+ }
816
+ &nbsp;
817
+ /**
818
+ * Detect if a file is an email template/layout.
819
+ *
820
+ * @param node - The dependency node to analyze.
821
+ * @returns True if the file is used for rendering notifications or emails.
822
+ * @lastUpdated 2026-03-18
823
+ */
824
+ export function isEmailTemplate(node: DependencyNode): boolean {
825
+ const { file, exports } = node;
826
+ const fileName = file.split('/').pop()?.toLowerCase() || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
827
+ &nbsp;
828
+ const isEmailName = EMAIL_NAME_PATTERNS.some((pattern: string) =&gt;
829
+ fileName.includes(pattern)
830
+ );
831
+ const isEmailPath = /\/(emails|mail|notifications)\//i.test(file);
832
+ const hasTemplateFunction = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome(
833
+ (exp: any) =&gt;
834
+ exp.type === 'function' &amp;&amp;
835
+ (exp.name.toLowerCase().startsWith('render') ||
836
+ exp.name.toLowerCase().startsWith('generate'))
837
+ );
838
+ return isEmailPath || isEmailName || hasTemplateFunction;
839
+ }
840
+ &nbsp;
841
+ /**
842
+ * Detect if a file is a parser/transformer.
843
+ *
844
+ * @param node - The dependency node to analyze.
845
+ * @returns True if the file handles data conversion or serialization.
846
+ * @lastUpdated 2026-03-18
847
+ */
848
+ export function isParserFile(node: DependencyNode): boolean {
849
+ const { file, exports } = node;
850
+ const fileName = file.split('/').pop()?.toLowerCase() || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
851
+ &nbsp;
852
+ const isParserName = PARSER_NAME_PATTERNS.some((pattern: string) =&gt;
853
+ fileName.includes(pattern)
854
+ );
855
+ const isParserPath = /\/(parsers|transformers)\//i.test(file);
856
+ const hasParseFunction = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome(
857
+ (exp: any) =&gt;
858
+ exp.type === 'function' &amp;&amp;
859
+ (exp.name.toLowerCase().startsWith('parse') ||
860
+ exp.name.toLowerCase().startsWith('transform'))
861
+ );
862
+ return isParserName || isParserPath || hasParseFunction;
863
+ }
864
+ &nbsp;
865
+ /**
866
+ * Detect if a file is a session/state management file.
867
+ *
868
+ * @param node - The dependency node to analyze.
869
+ * @returns True if the file manages application state or sessions.
870
+ * @lastUpdated 2026-03-18
871
+ */
872
+ export function isSessionFile(node: DependencyNode): boolean {
873
+ const { file, exports } = node;
874
+ const fileName = file.split('/').pop()?.toLowerCase() || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
875
+ &nbsp;
876
+ const isSessionName = SESSION_NAME_PATTERNS.some((pattern: string) =&gt;
877
+ fileName.includes(pattern)
878
+ );
879
+ const isSessionPath = /\/(sessions|state)\//i.test(file);
880
+ const hasSessionExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome((exp: any) =&gt;
881
+ ['session', 'state', 'store'].some((pattern: string) =&gt;
882
+ exp.name.toLowerCase().includes(pattern)
883
+ )
884
+ );
885
+ return isSessionName || isSessionPath || hasSessionExport;
886
+ }
887
+ &nbsp;
888
+ /**
889
+ * Detect if a file is a Next.js App Router page.
890
+ *
891
+ * @param node - The dependency node to analyze.
892
+ * @returns True if the file is a Next.js page or metadata entry.
893
+ * @lastUpdated 2026-03-18
894
+ */
895
+ export function isNextJsPage(node: DependencyNode): boolean {
896
+ const { file, exports } = node;
897
+ const lowerPath = file.toLowerCase();
898
+ const fileName = file.split('/').pop()?.toLowerCase() || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
899
+ &nbsp;
900
+ const isInAppDir =
901
+ lowerPath.includes('/app/') || lowerPath.startsWith('app/');
902
+ if (!isInAppDir || (fileName !== 'page.tsx' &amp;&amp; fileName !== 'page.ts'))
903
+ return false;
904
+ &nbsp;
905
+ const hasDefaultExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome(
906
+ (exp: any) =&gt; exp.type === 'default'
907
+ );
908
+ &nbsp;
909
+ const hasNextJsExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome((exp: any) =&gt;
910
+ NEXTJS_METADATA_EXPORTS.includes(exp.name.toLowerCase())
911
+ );
912
+ &nbsp;
913
+ return hasDefaultExport || <span class="branch-1 cbranch-no" title="branch not covered" >hasNextJsExport;</span>
914
+ }
915
+ &nbsp;
916
+ /**
917
+ * Detect if a file is a configuration or schema file.
918
+ *
919
+ * @param node - The dependency node to analyze.
920
+ * @returns True if the file matches configuration, setting, or schema patterns.
921
+ * @lastUpdated 2026-03-18
922
+ */
923
+ export function isConfigFile(node: DependencyNode): boolean {
924
+ const { file, exports } = node;
925
+ const lowerPath = file.toLowerCase();
926
+ const fileName = file.split('/').pop()?.toLowerCase() || <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
927
+ &nbsp;
928
+ const isConfigName = CONFIG_NAME_PATTERNS.some((pattern: string) =&gt;
929
+ fileName.includes(pattern)
930
+ );
931
+ const isConfigPath = /\/(config|settings|schemas)\//i.test(lowerPath);
932
+ const hasSchemaExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome((exp: any) =&gt;
933
+ ['schema', 'config', 'setting'].some((pattern: string) =&gt;
934
+ exp.name.toLowerCase().includes(pattern)
935
+ )
936
+ );
937
+ &nbsp;
938
+ return isConfigName || isConfigPath || hasSchemaExport;
939
+ }
940
+ &nbsp;
941
+ /**
942
+ * Detect if a file is part of a hub-and-spoke monorepo architecture.
943
+ *
944
+ * Many files spread across multiple packages (spokes) is intentional in
945
+ * AIReady and shouldn't be penalized as heavily for fragmentation.
946
+ *
947
+ * @param node - The dependency node to analyze.
948
+ * @returns True if the file path suggests it belongs to a spoke package.
949
+ */
950
+ export function isHubAndSpokeFile(node: DependencyNode): boolean {
951
+ const { file } = node;
952
+ return /\/packages\/[a-zA-Z0-9-]+\/src\//.test(file);
953
+ }
954
+ &nbsp;</pre></td></tr></table></pre>
955
+
956
+ <div class='push'></div><!-- for sticky footer -->
957
+ </div><!-- /wrapper -->
958
+ <div class='footer quiet pad2 space-top1 center small'>
959
+ Code coverage generated by
960
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
961
+ at 2026-03-21T12:52:37.698Z
962
+ </div>
963
+ <script src="../../prettify.js"></script>
964
+ <script>
965
+ window.onload = function () {
966
+ prettyPrint();
967
+ };
968
+ </script>
969
+ <script src="../../sorter.js"></script>
970
+ <script src="../../block-navigation.js"></script>
971
+ </body>
972
+ </html>
973
+