@aiready/doc-drift 0.11.18 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
 
2
2
  
3
- > @aiready/doc-drift@0.11.17 build /Users/pengcao/projects/aiready/packages/doc-drift
3
+ > @aiready/doc-drift@0.11.21 build /Users/pengcao/projects/aiready/packages/doc-drift
4
4
  > tsup src/index.ts src/cli.ts --format cjs,esm --dts
5
5
 
6
6
  CLI Building entry: src/cli.ts, src/index.ts
@@ -9,16 +9,16 @@
9
9
  CLI Target: es2020
10
10
  CJS Build start
11
11
  ESM Build start
12
- CJS dist/cli.js 6.48 KB
13
- CJS dist/index.js 6.09 KB
14
- CJS ⚡️ Build success in 190ms
15
12
  ESM dist/chunk-5BGWZWHD.mjs 3.81 KB
13
+ ESM dist/index.mjs 3.05 KB
16
14
  ESM dist/cli.mjs 1.39 KB
17
- ESM dist/index.mjs 1.63 KB
18
- ESM ⚡️ Build success in 200ms
15
+ ESM ⚡️ Build success in 55ms
16
+ CJS dist/cli.js 6.48 KB
17
+ CJS dist/index.js 7.57 KB
18
+ CJS ⚡️ Build success in 62ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 4432ms
20
+ DTS ⚡️ Build success in 2456ms
21
21
  DTS dist/cli.d.ts 108.00 B
22
- DTS dist/index.d.ts 1.07 KB
22
+ DTS dist/index.d.ts 1.25 KB
23
23
  DTS dist/cli.d.mts 108.00 B
24
- DTS dist/index.d.mts 1.07 KB
24
+ DTS dist/index.d.mts 1.25 KB
@@ -1,5 +1,6 @@
1
1
 
2
2
  
3
- > @aiready/doc-drift@0.9.5 lint /Users/pengcao/projects/aiready/packages/doc-drift
3
+ > @aiready/doc-drift@0.11.18 lint /Users/pengcao/projects/aiready/packages/doc-drift
4
4
  > eslint src --ext .ts
5
5
 
6
+  ELIFECYCLE  Command failed.
@@ -1,16 +1,18 @@
1
1
 
2
2
  
3
- > @aiready/doc-drift@0.11.17 test /Users/pengcao/projects/aiready/packages/doc-drift
3
+ > @aiready/doc-drift@0.11.21 test /Users/pengcao/projects/aiready/packages/doc-drift
4
4
  > vitest run
5
5
 
6
6
  [?25l
7
7
   RUN  v4.0.18 /Users/pengcao/projects/aiready/packages/doc-drift
8
8
 
9
- ✓ src/__tests__/analyzer.test.ts (1 test) 128ms
9
+ ✓ src/__tests__/scoring.test.ts (2 tests) 5ms
10
+ ✓ src/__tests__/provider.test.ts (2 tests) 23ms
11
+ ✓ src/__tests__/analyzer.test.ts (1 test) 267ms
10
12
 
11
-  Test Files  1 passed (1)
12
-  Tests  1 passed (1)
13
-  Start at  17:27:52
14
-  Duration  2.40s (transform 470ms, setup 0ms, import 1.49s, tests 128ms, environment 1ms)
13
+  Test Files  3 passed (3)
14
+  Tests  5 passed (5)
15
+  Start at  18:20:54
16
+  Duration  2.80s (transform 917ms, setup 0ms, import 4.99s, tests 295ms, environment 0ms)
15
17
 
16
18
  [?25h
@@ -0,0 +1,559 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for analyzer.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> analyzer.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">80.76% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>42/52</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">43.75% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>14/32</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'>2/2</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">82% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>41/50</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
225
+ <span class="cline-any cline-neutral">&nbsp;</span>
226
+ <span class="cline-any cline-neutral">&nbsp;</span>
227
+ <span class="cline-any cline-neutral">&nbsp;</span>
228
+ <span class="cline-any cline-neutral">&nbsp;</span>
229
+ <span class="cline-any cline-neutral">&nbsp;</span>
230
+ <span class="cline-any cline-neutral">&nbsp;</span>
231
+ <span class="cline-any cline-neutral">&nbsp;</span>
232
+ <span class="cline-any cline-neutral">&nbsp;</span>
233
+ <span class="cline-any cline-neutral">&nbsp;</span>
234
+ <span class="cline-any cline-neutral">&nbsp;</span>
235
+ <span class="cline-any cline-neutral">&nbsp;</span>
236
+ <span class="cline-any cline-neutral">&nbsp;</span>
237
+ <span class="cline-any cline-neutral">&nbsp;</span>
238
+ <span class="cline-any cline-neutral">&nbsp;</span>
239
+ <span class="cline-any cline-neutral">&nbsp;</span>
240
+ <span class="cline-any cline-neutral">&nbsp;</span>
241
+ <span class="cline-any cline-neutral">&nbsp;</span>
242
+ <span class="cline-any cline-yes">1x</span>
243
+ <span class="cline-any cline-yes">1x</span>
244
+ <span class="cline-any cline-yes">1x</span>
245
+ <span class="cline-any cline-yes">1x</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-yes">1x</span>
248
+ <span class="cline-any cline-yes">1x</span>
249
+ <span class="cline-any cline-yes">1x</span>
250
+ <span class="cline-any cline-yes">1x</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-yes">1x</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-yes">1x</span>
255
+ <span class="cline-any cline-yes">1x</span>
256
+ <span class="cline-any cline-yes">2x</span>
257
+ <span class="cline-any cline-yes">2x</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-neutral">&nbsp;</span>
260
+ <span class="cline-any cline-neutral">&nbsp;</span>
261
+ <span class="cline-any cline-neutral">&nbsp;</span>
262
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-neutral">&nbsp;</span>
265
+ <span class="cline-any cline-yes">2x</span>
266
+ <span class="cline-any cline-yes">2x</span>
267
+ <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
+ <span class="cline-any cline-yes">2x</span>
270
+ <span class="cline-any cline-yes">2x</span>
271
+ <span class="cline-any cline-neutral">&nbsp;</span>
272
+ <span class="cline-any cline-no">&nbsp;</span>
273
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span>
275
+ <span class="cline-any cline-yes">2x</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-yes">2x</span>
278
+ <span class="cline-any cline-yes">2x</span>
279
+ <span class="cline-any cline-neutral">&nbsp;</span>
280
+ <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-yes">2x</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-yes">2x</span>
285
+ <span class="cline-any cline-yes">2x</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-yes">2x</span>
288
+ <span class="cline-any cline-yes">1x</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-yes">1x</span>
292
+ <span class="cline-any cline-yes">1x</span>
293
+ <span class="cline-any cline-yes">1x</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-yes">1x</span>
297
+ <span class="cline-any cline-yes">1x</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-yes">1x</span>
301
+ <span class="cline-any cline-yes">1x</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-yes">1x</span>
305
+ <span class="cline-any cline-yes">2x</span>
306
+ <span class="cline-any cline-yes">2x</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-yes">1x</span>
310
+ <span class="cline-any cline-yes">1x</span>
311
+ <span class="cline-any cline-yes">1x</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-yes">1x</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-no">&nbsp;</span>
324
+ <span class="cline-any cline-no">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-no">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-no">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-no">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-neutral">&nbsp;</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-no">&nbsp;</span>
354
+ <span class="cline-any cline-no">&nbsp;</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
356
+ <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-neutral">&nbsp;</span>
358
+ <span class="cline-any cline-yes">1x</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <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-yes">1x</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></td><td class="text"><pre class="prettyprint lang-js">import {
383
+ scanFiles,
384
+ calculateDocDrift,
385
+ getFileCommitTimestamps,
386
+ getLineRangeLastModifiedCached,
387
+ Severity,
388
+ IssueType,
389
+ emitProgress,
390
+ getParser,
391
+ Language,
392
+ } from '@aiready/core';
393
+ import type { DocDriftOptions, DocDriftReport, DocDriftIssue } from './types';
394
+ import { readFileSync } from 'fs';
395
+ &nbsp;
396
+ export async function analyzeDocDrift(
397
+ options: DocDriftOptions
398
+ ): Promise&lt;DocDriftReport&gt; {
399
+ // Use core scanFiles which respects .gitignore recursively
400
+ const files = await scanFiles(options);
401
+ const issues: DocDriftIssue[] = [];
402
+ const staleMonths = options.staleMonths ?? 6;
403
+ const staleSeconds = staleMonths * 30 * 24 * 60 * 60;
404
+ &nbsp;
405
+ let uncommentedExports = 0;
406
+ let totalExports = 0;
407
+ let outdatedComments = 0;
408
+ let undocumentedComplexity = 0;
409
+ &nbsp;
410
+ const now = Math.floor(Date.now() / 1000);
411
+ &nbsp;
412
+ let processed = 0;
413
+ for (const file of files) {
414
+ processed++;
415
+ emitProgress(
416
+ processed,
417
+ files.length,
418
+ 'doc-drift',
419
+ 'analyzing files',
420
+ options.onProgress
421
+ );
422
+ &nbsp;
423
+ const parser = getParser(file);
424
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!parser) <span class="cstat-no" title="statement not covered" >continue;</span>
425
+ &nbsp;
426
+ let code: string;
427
+ try {
428
+ code = readFileSync(file, 'utf-8');
429
+ } catch {
430
+ <span class="cstat-no" title="statement not covered" > continue;</span>
431
+ }
432
+ &nbsp;
433
+ try {
434
+ // Initialize parser (it's a singleton in core, but ensures WASM is loaded)
435
+ await parser.initialize();
436
+ const parseResult = parser.parse(code, file);
437
+ &nbsp;
438
+ let fileLineStamps: Record&lt;number, number&gt; | undefined;
439
+ &nbsp;
440
+ for (const exp of parseResult.exports) {
441
+ // Only analyze functions and classes for documentation drift
442
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (exp.type === 'function' || <span class="branch-1 cbranch-no" title="branch not covered" >exp.type === 'class') {</span>
443
+ totalExports++;
444
+ &nbsp;
445
+ if (!exp.documentation) {
446
+ uncommentedExports++;
447
+ &nbsp;
448
+ // Complexity check (heuristic based on line count if range available)
449
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (exp.loc) {
450
+ const lines = exp.loc.end.line - exp.loc.start.line;
451
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (lines &gt; 20) undocumentedComplexity++;
452
+ }
453
+ } else {
454
+ const doc = exp.documentation;
455
+ const docContent = doc.content;
456
+ &nbsp;
457
+ // Signature mismatch detection (generalized heuristic)
458
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (exp.type === 'function' &amp;&amp; exp.parameters) {
459
+ const params = exp.parameters;
460
+ // Check if params mentioned in doc (standard @param or simple mention)
461
+ // Use regex with word boundaries to avoid partial matches (e.g. 'b' in 'numbers')
462
+ const missingParams = params.filter((p) =&gt; {
463
+ const regex = new RegExp(`\\b${p}\\b`, 'i');
464
+ return !regex.test(docContent);
465
+ });
466
+ &nbsp;
467
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (missingParams.length &gt; 0) {
468
+ outdatedComments++;
469
+ issues.push({
470
+ type: IssueType.DocDrift,
471
+ severity: Severity.Major,
472
+ message: `Documentation mismatch: function parameters (${missingParams.join(', ')}) are not mentioned in the docs.`,
473
+ location: { file, line: exp.loc?.start.line || <span class="branch-1 cbranch-no" title="branch not covered" >1 }</span>,
474
+ });
475
+ continue;
476
+ }
477
+ }
478
+ &nbsp;
479
+ // Timestamp comparison
480
+ <span class="cstat-no" title="statement not covered" > if (exp.loc) {</span>
481
+ <span class="cstat-no" title="statement not covered" > if (!fileLineStamps) {</span>
482
+ <span class="cstat-no" title="statement not covered" > fileLineStamps = getFileCommitTimestamps(file);</span>
483
+ }
484
+ &nbsp;
485
+ // We don't have exact lines for the doc node in ExportInfo yet,
486
+ // but we know it precedes the export. Using export start as a proxy for drift check.
487
+ const <span class="cstat-no" title="statement not covered" >bodyModified = getLineRangeLastModifiedCached(</span>
488
+ fileLineStamps,
489
+ exp.loc.start.line,
490
+ exp.loc.end.line
491
+ );
492
+ &nbsp;
493
+ <span class="cstat-no" title="statement not covered" > if (bodyModified &gt; 0) {</span>
494
+ // If body was modified much later than the "stale" threshold
495
+ <span class="cstat-no" title="statement not covered" > if (</span>
496
+ now - bodyModified &lt; staleSeconds / 4 &amp;&amp;
497
+ exp.documentation.isStale === true
498
+ ) {
499
+ // This would require isStale to be set by the parser if it knew history
500
+ // For now, we compare body modification vs current time if docs look very old (heuristic)
501
+ }
502
+ &nbsp;
503
+ // If the file itself is very old but has no issues, it's fine.
504
+ // Doc-drift is really about implementation changing without doc updates.
505
+ }
506
+ }
507
+ }
508
+ }
509
+ }
510
+ } catch (error) {
511
+ <span class="cstat-no" title="statement not covered" > console.warn(`Doc-drift: Failed to parse ${file}: ${error}`);</span>
512
+ <span class="cstat-no" title="statement not covered" > continue;</span>
513
+ }
514
+ }
515
+ &nbsp;
516
+ const riskResult = calculateDocDrift({
517
+ uncommentedExports,
518
+ totalExports,
519
+ outdatedComments,
520
+ undocumentedComplexity,
521
+ });
522
+ &nbsp;
523
+ return {
524
+ summary: {
525
+ filesAnalyzed: files.length,
526
+ functionsAnalyzed: totalExports,
527
+ score: riskResult.score,
528
+ rating: riskResult.rating,
529
+ },
530
+ issues,
531
+ rawData: {
532
+ uncommentedExports,
533
+ totalExports,
534
+ outdatedComments,
535
+ undocumentedComplexity,
536
+ },
537
+ recommendations: riskResult.recommendations,
538
+ };
539
+ }
540
+ &nbsp;</pre></td></tr></table></pre>
541
+
542
+ <div class='push'></div><!-- for sticky footer -->
543
+ </div><!-- /wrapper -->
544
+ <div class='footer quiet pad2 space-top1 center small'>
545
+ Code coverage generated by
546
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
547
+ at 2026-03-09T02:51:15.767Z
548
+ </div>
549
+ <script src="prettify.js"></script>
550
+ <script>
551
+ window.onload = function () {
552
+ prettyPrint();
553
+ };
554
+ </script>
555
+ <script src="sorter.js"></script>
556
+ <script src="block-navigation.js"></script>
557
+ </body>
558
+ </html>
559
+