registryx-server 0.1.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.
- package/README.md +203 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +146 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/adapters/crates.ts.html +847 -0
- package/coverage/lcov-report/src/adapters/index.html +176 -0
- package/coverage/lcov-report/src/adapters/index.ts.html +97 -0
- package/coverage/lcov-report/src/adapters/maven.ts.html +637 -0
- package/coverage/lcov-report/src/adapters/npm.ts.html +817 -0
- package/coverage/lcov-report/src/adapters/pypi.ts.html +730 -0
- package/coverage/lcov-report/src/cache.ts.html +202 -0
- package/coverage/lcov-report/src/config.ts.html +208 -0
- package/coverage/lcov-report/src/index.html +161 -0
- package/coverage/lcov-report/src/server.ts.html +1339 -0
- package/coverage/lcov-report/src/types.ts.html +373 -0
- package/coverage/lcov-report/src/utils/fetch.ts.html +220 -0
- package/coverage/lcov-report/src/utils/format.ts.html +130 -0
- package/coverage/lcov-report/src/utils/index.html +131 -0
- package/coverage/lcov.info +1686 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1210 -0
- package/eslint.config.mjs +16 -0
- package/package.json +41 -0
- package/src/adapters/crates.ts +254 -0
- package/src/adapters/index.ts +4 -0
- package/src/adapters/maven.ts +184 -0
- package/src/adapters/npm.ts +244 -0
- package/src/adapters/pypi.ts +215 -0
- package/src/cache.ts +39 -0
- package/src/config.ts +41 -0
- package/src/index.ts +25 -0
- package/src/server.ts +418 -0
- package/src/types.ts +96 -0
- package/src/utils/fetch.ts +45 -0
- package/src/utils/format.ts +15 -0
- package/test/adapters.test.ts +575 -0
- package/test/cache.test.ts +47 -0
- package/test/config.test.ts +69 -0
- package/test/fetch.test.ts +51 -0
- package/test/format.test.ts +35 -0
- package/test/server.test.ts +23 -0
- package/tsconfig.json +18 -0
- package/tsup.config.ts +11 -0
- package/vitest.config.ts +19 -0
|
@@ -0,0 +1,1339 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/server.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</a> server.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">43.01% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>157/365</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">100% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>7/7</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">75% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>6/8</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">43.01% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>157/365</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 low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
485
|
+
<span class="cline-any cline-neutral"> </span>
|
|
486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
489
|
+
<span class="cline-any cline-neutral"> </span>
|
|
490
|
+
<span class="cline-any cline-neutral"> </span>
|
|
491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
492
|
+
<span class="cline-any cline-yes">2x</span>
|
|
493
|
+
<span class="cline-any cline-yes">2x</span>
|
|
494
|
+
<span class="cline-any cline-yes">2x</span>
|
|
495
|
+
<span class="cline-any cline-yes">2x</span>
|
|
496
|
+
<span class="cline-any cline-yes">2x</span>
|
|
497
|
+
<span class="cline-any cline-yes">2x</span>
|
|
498
|
+
<span class="cline-any cline-yes">2x</span>
|
|
499
|
+
<span class="cline-any cline-yes">2x</span>
|
|
500
|
+
<span class="cline-any cline-yes">2x</span>
|
|
501
|
+
<span class="cline-any cline-yes">5x</span>
|
|
502
|
+
<span class="cline-any cline-yes">5x</span>
|
|
503
|
+
<span class="cline-any cline-yes">2x</span>
|
|
504
|
+
<span class="cline-any cline-yes">2x</span>
|
|
505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
506
|
+
<span class="cline-any cline-no"> </span>
|
|
507
|
+
<span class="cline-any cline-no"> </span>
|
|
508
|
+
<span class="cline-any cline-no"> </span>
|
|
509
|
+
<span class="cline-any cline-no"> </span>
|
|
510
|
+
<span class="cline-any cline-no"> </span>
|
|
511
|
+
<span class="cline-any cline-no"> </span>
|
|
512
|
+
<span class="cline-any cline-no"> </span>
|
|
513
|
+
<span class="cline-any cline-no"> </span>
|
|
514
|
+
<span class="cline-any cline-no"> </span>
|
|
515
|
+
<span class="cline-any cline-no"> </span>
|
|
516
|
+
<span class="cline-any cline-no"> </span>
|
|
517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
518
|
+
<span class="cline-any cline-no"> </span>
|
|
519
|
+
<span class="cline-any cline-no"> </span>
|
|
520
|
+
<span class="cline-any cline-no"> </span>
|
|
521
|
+
<span class="cline-any cline-no"> </span>
|
|
522
|
+
<span class="cline-any cline-no"> </span>
|
|
523
|
+
<span class="cline-any cline-no"> </span>
|
|
524
|
+
<span class="cline-any cline-no"> </span>
|
|
525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
526
|
+
<span class="cline-any cline-yes">1x</span>
|
|
527
|
+
<span class="cline-any cline-yes">1x</span>
|
|
528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
529
|
+
<span class="cline-any cline-yes">1x</span>
|
|
530
|
+
<span class="cline-any cline-yes">2x</span>
|
|
531
|
+
<span class="cline-any cline-yes">2x</span>
|
|
532
|
+
<span class="cline-any cline-neutral"> </span>
|
|
533
|
+
<span class="cline-any cline-yes">2x</span>
|
|
534
|
+
<span class="cline-any cline-yes">2x</span>
|
|
535
|
+
<span class="cline-any cline-yes">2x</span>
|
|
536
|
+
<span class="cline-any cline-yes">2x</span>
|
|
537
|
+
<span class="cline-any cline-neutral"> </span>
|
|
538
|
+
<span class="cline-any cline-neutral"> </span>
|
|
539
|
+
<span class="cline-any cline-yes">2x</span>
|
|
540
|
+
<span class="cline-any cline-yes">2x</span>
|
|
541
|
+
<span class="cline-any cline-yes">2x</span>
|
|
542
|
+
<span class="cline-any cline-yes">2x</span>
|
|
543
|
+
<span class="cline-any cline-yes">2x</span>
|
|
544
|
+
<span class="cline-any cline-yes">2x</span>
|
|
545
|
+
<span class="cline-any cline-yes">2x</span>
|
|
546
|
+
<span class="cline-any cline-yes">2x</span>
|
|
547
|
+
<span class="cline-any cline-yes">2x</span>
|
|
548
|
+
<span class="cline-any cline-no"> </span>
|
|
549
|
+
<span class="cline-any cline-no"> </span>
|
|
550
|
+
<span class="cline-any cline-neutral"> </span>
|
|
551
|
+
<span class="cline-any cline-no"> </span>
|
|
552
|
+
<span class="cline-any cline-no"> </span>
|
|
553
|
+
<span class="cline-any cline-no"> </span>
|
|
554
|
+
<span class="cline-any cline-neutral"> </span>
|
|
555
|
+
<span class="cline-any cline-no"> </span>
|
|
556
|
+
<span class="cline-any cline-no"> </span>
|
|
557
|
+
<span class="cline-any cline-no"> </span>
|
|
558
|
+
<span class="cline-any cline-no"> </span>
|
|
559
|
+
<span class="cline-any cline-no"> </span>
|
|
560
|
+
<span class="cline-any cline-no"> </span>
|
|
561
|
+
<span class="cline-any cline-no"> </span>
|
|
562
|
+
<span class="cline-any cline-no"> </span>
|
|
563
|
+
<span class="cline-any cline-no"> </span>
|
|
564
|
+
<span class="cline-any cline-no"> </span>
|
|
565
|
+
<span class="cline-any cline-no"> </span>
|
|
566
|
+
<span class="cline-any cline-no"> </span>
|
|
567
|
+
<span class="cline-any cline-no"> </span>
|
|
568
|
+
<span class="cline-any cline-no"> </span>
|
|
569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
570
|
+
<span class="cline-any cline-no"> </span>
|
|
571
|
+
<span class="cline-any cline-no"> </span>
|
|
572
|
+
<span class="cline-any cline-yes">2x</span>
|
|
573
|
+
<span class="cline-any cline-neutral"> </span>
|
|
574
|
+
<span class="cline-any cline-neutral"> </span>
|
|
575
|
+
<span class="cline-any cline-yes">2x</span>
|
|
576
|
+
<span class="cline-any cline-yes">2x</span>
|
|
577
|
+
<span class="cline-any cline-yes">2x</span>
|
|
578
|
+
<span class="cline-any cline-yes">2x</span>
|
|
579
|
+
<span class="cline-any cline-yes">2x</span>
|
|
580
|
+
<span class="cline-any cline-yes">2x</span>
|
|
581
|
+
<span class="cline-any cline-yes">2x</span>
|
|
582
|
+
<span class="cline-any cline-yes">2x</span>
|
|
583
|
+
<span class="cline-any cline-yes">2x</span>
|
|
584
|
+
<span class="cline-any cline-no"> </span>
|
|
585
|
+
<span class="cline-any cline-no"> </span>
|
|
586
|
+
<span class="cline-any cline-no"> </span>
|
|
587
|
+
<span class="cline-any cline-no"> </span>
|
|
588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
589
|
+
<span class="cline-any cline-no"> </span>
|
|
590
|
+
<span class="cline-any cline-no"> </span>
|
|
591
|
+
<span class="cline-any cline-no"> </span>
|
|
592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
593
|
+
<span class="cline-any cline-no"> </span>
|
|
594
|
+
<span class="cline-any cline-no"> </span>
|
|
595
|
+
<span class="cline-any cline-no"> </span>
|
|
596
|
+
<span class="cline-any cline-neutral"> </span>
|
|
597
|
+
<span class="cline-any cline-no"> </span>
|
|
598
|
+
<span class="cline-any cline-no"> </span>
|
|
599
|
+
<span class="cline-any cline-no"> </span>
|
|
600
|
+
<span class="cline-any cline-neutral"> </span>
|
|
601
|
+
<span class="cline-any cline-no"> </span>
|
|
602
|
+
<span class="cline-any cline-no"> </span>
|
|
603
|
+
<span class="cline-any cline-no"> </span>
|
|
604
|
+
<span class="cline-any cline-no"> </span>
|
|
605
|
+
<span class="cline-any cline-no"> </span>
|
|
606
|
+
<span class="cline-any cline-no"> </span>
|
|
607
|
+
<span class="cline-any cline-no"> </span>
|
|
608
|
+
<span class="cline-any cline-no"> </span>
|
|
609
|
+
<span class="cline-any cline-no"> </span>
|
|
610
|
+
<span class="cline-any cline-no"> </span>
|
|
611
|
+
<span class="cline-any cline-no"> </span>
|
|
612
|
+
<span class="cline-any cline-no"> </span>
|
|
613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
614
|
+
<span class="cline-any cline-no"> </span>
|
|
615
|
+
<span class="cline-any cline-no"> </span>
|
|
616
|
+
<span class="cline-any cline-yes">2x</span>
|
|
617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
619
|
+
<span class="cline-any cline-yes">2x</span>
|
|
620
|
+
<span class="cline-any cline-yes">2x</span>
|
|
621
|
+
<span class="cline-any cline-yes">2x</span>
|
|
622
|
+
<span class="cline-any cline-yes">2x</span>
|
|
623
|
+
<span class="cline-any cline-yes">2x</span>
|
|
624
|
+
<span class="cline-any cline-yes">2x</span>
|
|
625
|
+
<span class="cline-any cline-yes">2x</span>
|
|
626
|
+
<span class="cline-any cline-yes">2x</span>
|
|
627
|
+
<span class="cline-any cline-no"> </span>
|
|
628
|
+
<span class="cline-any cline-no"> </span>
|
|
629
|
+
<span class="cline-any cline-no"> </span>
|
|
630
|
+
<span class="cline-any cline-no"> </span>
|
|
631
|
+
<span class="cline-any cline-no"> </span>
|
|
632
|
+
<span class="cline-any cline-no"> </span>
|
|
633
|
+
<span class="cline-any cline-no"> </span>
|
|
634
|
+
<span class="cline-any cline-no"> </span>
|
|
635
|
+
<span class="cline-any cline-no"> </span>
|
|
636
|
+
<span class="cline-any cline-no"> </span>
|
|
637
|
+
<span class="cline-any cline-no"> </span>
|
|
638
|
+
<span class="cline-any cline-no"> </span>
|
|
639
|
+
<span class="cline-any cline-yes">2x</span>
|
|
640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
642
|
+
<span class="cline-any cline-yes">2x</span>
|
|
643
|
+
<span class="cline-any cline-yes">2x</span>
|
|
644
|
+
<span class="cline-any cline-yes">2x</span>
|
|
645
|
+
<span class="cline-any cline-yes">2x</span>
|
|
646
|
+
<span class="cline-any cline-yes">2x</span>
|
|
647
|
+
<span class="cline-any cline-yes">2x</span>
|
|
648
|
+
<span class="cline-any cline-yes">2x</span>
|
|
649
|
+
<span class="cline-any cline-yes">2x</span>
|
|
650
|
+
<span class="cline-any cline-no"> </span>
|
|
651
|
+
<span class="cline-any cline-no"> </span>
|
|
652
|
+
<span class="cline-any cline-no"> </span>
|
|
653
|
+
<span class="cline-any cline-no"> </span>
|
|
654
|
+
<span class="cline-any cline-yes">2x</span>
|
|
655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
657
|
+
<span class="cline-any cline-yes">2x</span>
|
|
658
|
+
<span class="cline-any cline-yes">2x</span>
|
|
659
|
+
<span class="cline-any cline-yes">2x</span>
|
|
660
|
+
<span class="cline-any cline-yes">2x</span>
|
|
661
|
+
<span class="cline-any cline-yes">2x</span>
|
|
662
|
+
<span class="cline-any cline-yes">2x</span>
|
|
663
|
+
<span class="cline-any cline-yes">2x</span>
|
|
664
|
+
<span class="cline-any cline-yes">2x</span>
|
|
665
|
+
<span class="cline-any cline-no"> </span>
|
|
666
|
+
<span class="cline-any cline-no"> </span>
|
|
667
|
+
<span class="cline-any cline-no"> </span>
|
|
668
|
+
<span class="cline-any cline-no"> </span>
|
|
669
|
+
<span class="cline-any cline-no"> </span>
|
|
670
|
+
<span class="cline-any cline-no"> </span>
|
|
671
|
+
<span class="cline-any cline-no"> </span>
|
|
672
|
+
<span class="cline-any cline-no"> </span>
|
|
673
|
+
<span class="cline-any cline-no"> </span>
|
|
674
|
+
<span class="cline-any cline-no"> </span>
|
|
675
|
+
<span class="cline-any cline-yes">2x</span>
|
|
676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
678
|
+
<span class="cline-any cline-yes">2x</span>
|
|
679
|
+
<span class="cline-any cline-yes">2x</span>
|
|
680
|
+
<span class="cline-any cline-yes">2x</span>
|
|
681
|
+
<span class="cline-any cline-yes">2x</span>
|
|
682
|
+
<span class="cline-any cline-yes">2x</span>
|
|
683
|
+
<span class="cline-any cline-yes">2x</span>
|
|
684
|
+
<span class="cline-any cline-yes">2x</span>
|
|
685
|
+
<span class="cline-any cline-yes">2x</span>
|
|
686
|
+
<span class="cline-any cline-yes">2x</span>
|
|
687
|
+
<span class="cline-any cline-yes">2x</span>
|
|
688
|
+
<span class="cline-any cline-no"> </span>
|
|
689
|
+
<span class="cline-any cline-no"> </span>
|
|
690
|
+
<span class="cline-any cline-no"> </span>
|
|
691
|
+
<span class="cline-any cline-no"> </span>
|
|
692
|
+
<span class="cline-any cline-no"> </span>
|
|
693
|
+
<span class="cline-any cline-no"> </span>
|
|
694
|
+
<span class="cline-any cline-no"> </span>
|
|
695
|
+
<span class="cline-any cline-no"> </span>
|
|
696
|
+
<span class="cline-any cline-no"> </span>
|
|
697
|
+
<span class="cline-any cline-no"> </span>
|
|
698
|
+
<span class="cline-any cline-yes">2x</span>
|
|
699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
701
|
+
<span class="cline-any cline-yes">2x</span>
|
|
702
|
+
<span class="cline-any cline-yes">2x</span>
|
|
703
|
+
<span class="cline-any cline-yes">2x</span>
|
|
704
|
+
<span class="cline-any cline-yes">2x</span>
|
|
705
|
+
<span class="cline-any cline-yes">2x</span>
|
|
706
|
+
<span class="cline-any cline-yes">2x</span>
|
|
707
|
+
<span class="cline-any cline-yes">2x</span>
|
|
708
|
+
<span class="cline-any cline-yes">2x</span>
|
|
709
|
+
<span class="cline-any cline-yes">2x</span>
|
|
710
|
+
<span class="cline-any cline-no"> </span>
|
|
711
|
+
<span class="cline-any cline-no"> </span>
|
|
712
|
+
<span class="cline-any cline-no"> </span>
|
|
713
|
+
<span class="cline-any cline-no"> </span>
|
|
714
|
+
<span class="cline-any cline-no"> </span>
|
|
715
|
+
<span class="cline-any cline-no"> </span>
|
|
716
|
+
<span class="cline-any cline-no"> </span>
|
|
717
|
+
<span class="cline-any cline-no"> </span>
|
|
718
|
+
<span class="cline-any cline-no"> </span>
|
|
719
|
+
<span class="cline-any cline-no"> </span>
|
|
720
|
+
<span class="cline-any cline-no"> </span>
|
|
721
|
+
<span class="cline-any cline-no"> </span>
|
|
722
|
+
<span class="cline-any cline-no"> </span>
|
|
723
|
+
<span class="cline-any cline-no"> </span>
|
|
724
|
+
<span class="cline-any cline-no"> </span>
|
|
725
|
+
<span class="cline-any cline-no"> </span>
|
|
726
|
+
<span class="cline-any cline-no"> </span>
|
|
727
|
+
<span class="cline-any cline-yes">2x</span>
|
|
728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
730
|
+
<span class="cline-any cline-yes">2x</span>
|
|
731
|
+
<span class="cline-any cline-yes">2x</span>
|
|
732
|
+
<span class="cline-any cline-yes">2x</span>
|
|
733
|
+
<span class="cline-any cline-yes">2x</span>
|
|
734
|
+
<span class="cline-any cline-yes">2x</span>
|
|
735
|
+
<span class="cline-any cline-yes">2x</span>
|
|
736
|
+
<span class="cline-any cline-yes">2x</span>
|
|
737
|
+
<span class="cline-any cline-yes">2x</span>
|
|
738
|
+
<span class="cline-any cline-yes">2x</span>
|
|
739
|
+
<span class="cline-any cline-yes">2x</span>
|
|
740
|
+
<span class="cline-any cline-no"> </span>
|
|
741
|
+
<span class="cline-any cline-no"> </span>
|
|
742
|
+
<span class="cline-any cline-no"> </span>
|
|
743
|
+
<span class="cline-any cline-no"> </span>
|
|
744
|
+
<span class="cline-any cline-no"> </span>
|
|
745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
746
|
+
<span class="cline-any cline-no"> </span>
|
|
747
|
+
<span class="cline-any cline-no"> </span>
|
|
748
|
+
<span class="cline-any cline-no"> </span>
|
|
749
|
+
<span class="cline-any cline-no"> </span>
|
|
750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
751
|
+
<span class="cline-any cline-no"> </span>
|
|
752
|
+
<span class="cline-any cline-no"> </span>
|
|
753
|
+
<span class="cline-any cline-no"> </span>
|
|
754
|
+
<span class="cline-any cline-no"> </span>
|
|
755
|
+
<span class="cline-any cline-no"> </span>
|
|
756
|
+
<span class="cline-any cline-no"> </span>
|
|
757
|
+
<span class="cline-any cline-neutral"> </span>
|
|
758
|
+
<span class="cline-any cline-no"> </span>
|
|
759
|
+
<span class="cline-any cline-no"> </span>
|
|
760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
761
|
+
<span class="cline-any cline-no"> </span>
|
|
762
|
+
<span class="cline-any cline-no"> </span>
|
|
763
|
+
<span class="cline-any cline-yes">2x</span>
|
|
764
|
+
<span class="cline-any cline-neutral"> </span>
|
|
765
|
+
<span class="cline-any cline-neutral"> </span>
|
|
766
|
+
<span class="cline-any cline-yes">2x</span>
|
|
767
|
+
<span class="cline-any cline-yes">2x</span>
|
|
768
|
+
<span class="cline-any cline-yes">2x</span>
|
|
769
|
+
<span class="cline-any cline-yes">2x</span>
|
|
770
|
+
<span class="cline-any cline-yes">2x</span>
|
|
771
|
+
<span class="cline-any cline-yes">2x</span>
|
|
772
|
+
<span class="cline-any cline-yes">2x</span>
|
|
773
|
+
<span class="cline-any cline-yes">2x</span>
|
|
774
|
+
<span class="cline-any cline-yes">2x</span>
|
|
775
|
+
<span class="cline-any cline-yes">2x</span>
|
|
776
|
+
<span class="cline-any cline-no"> </span>
|
|
777
|
+
<span class="cline-any cline-no"> </span>
|
|
778
|
+
<span class="cline-any cline-no"> </span>
|
|
779
|
+
<span class="cline-any cline-no"> </span>
|
|
780
|
+
<span class="cline-any cline-no"> </span>
|
|
781
|
+
<span class="cline-any cline-no"> </span>
|
|
782
|
+
<span class="cline-any cline-no"> </span>
|
|
783
|
+
<span class="cline-any cline-neutral"> </span>
|
|
784
|
+
<span class="cline-any cline-no"> </span>
|
|
785
|
+
<span class="cline-any cline-no"> </span>
|
|
786
|
+
<span class="cline-any cline-no"> </span>
|
|
787
|
+
<span class="cline-any cline-no"> </span>
|
|
788
|
+
<span class="cline-any cline-no"> </span>
|
|
789
|
+
<span class="cline-any cline-no"> </span>
|
|
790
|
+
<span class="cline-any cline-yes">2x</span>
|
|
791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
792
|
+
<span class="cline-any cline-neutral"> </span>
|
|
793
|
+
<span class="cline-any cline-yes">2x</span>
|
|
794
|
+
<span class="cline-any cline-yes">2x</span>
|
|
795
|
+
<span class="cline-any cline-yes">2x</span>
|
|
796
|
+
<span class="cline-any cline-yes">2x</span>
|
|
797
|
+
<span class="cline-any cline-yes">2x</span>
|
|
798
|
+
<span class="cline-any cline-yes">2x</span>
|
|
799
|
+
<span class="cline-any cline-yes">2x</span>
|
|
800
|
+
<span class="cline-any cline-yes">2x</span>
|
|
801
|
+
<span class="cline-any cline-yes">2x</span>
|
|
802
|
+
<span class="cline-any cline-no"> </span>
|
|
803
|
+
<span class="cline-any cline-no"> </span>
|
|
804
|
+
<span class="cline-any cline-no"> </span>
|
|
805
|
+
<span class="cline-any cline-no"> </span>
|
|
806
|
+
<span class="cline-any cline-no"> </span>
|
|
807
|
+
<span class="cline-any cline-no"> </span>
|
|
808
|
+
<span class="cline-any cline-no"> </span>
|
|
809
|
+
<span class="cline-any cline-no"> </span>
|
|
810
|
+
<span class="cline-any cline-no"> </span>
|
|
811
|
+
<span class="cline-any cline-no"> </span>
|
|
812
|
+
<span class="cline-any cline-no"> </span>
|
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
|
+
<span class="cline-any cline-no"> </span>
|
|
815
|
+
<span class="cline-any cline-no"> </span>
|
|
816
|
+
<span class="cline-any cline-no"> </span>
|
|
817
|
+
<span class="cline-any cline-no"> </span>
|
|
818
|
+
<span class="cline-any cline-no"> </span>
|
|
819
|
+
<span class="cline-any cline-no"> </span>
|
|
820
|
+
<span class="cline-any cline-yes">2x</span>
|
|
821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
822
|
+
<span class="cline-any cline-neutral"> </span>
|
|
823
|
+
<span class="cline-any cline-yes">2x</span>
|
|
824
|
+
<span class="cline-any cline-yes">2x</span>
|
|
825
|
+
<span class="cline-any cline-yes">2x</span>
|
|
826
|
+
<span class="cline-any cline-yes">2x</span>
|
|
827
|
+
<span class="cline-any cline-yes">2x</span>
|
|
828
|
+
<span class="cline-any cline-yes">2x</span>
|
|
829
|
+
<span class="cline-any cline-yes">2x</span>
|
|
830
|
+
<span class="cline-any cline-yes">2x</span>
|
|
831
|
+
<span class="cline-any cline-yes">2x</span>
|
|
832
|
+
<span class="cline-any cline-yes">2x</span>
|
|
833
|
+
<span class="cline-any cline-yes">2x</span>
|
|
834
|
+
<span class="cline-any cline-yes">2x</span>
|
|
835
|
+
<span class="cline-any cline-no"> </span>
|
|
836
|
+
<span class="cline-any cline-no"> </span>
|
|
837
|
+
<span class="cline-any cline-no"> </span>
|
|
838
|
+
<span class="cline-any cline-no"> </span>
|
|
839
|
+
<span class="cline-any cline-no"> </span>
|
|
840
|
+
<span class="cline-any cline-no"> </span>
|
|
841
|
+
<span class="cline-any cline-no"> </span>
|
|
842
|
+
<span class="cline-any cline-no"> </span>
|
|
843
|
+
<span class="cline-any cline-no"> </span>
|
|
844
|
+
<span class="cline-any cline-yes">2x</span>
|
|
845
|
+
<span class="cline-any cline-neutral"> </span>
|
|
846
|
+
<span class="cline-any cline-neutral"> </span>
|
|
847
|
+
<span class="cline-any cline-yes">2x</span>
|
|
848
|
+
<span class="cline-any cline-yes">2x</span>
|
|
849
|
+
<span class="cline-any cline-yes">2x</span>
|
|
850
|
+
<span class="cline-any cline-yes">2x</span>
|
|
851
|
+
<span class="cline-any cline-yes">2x</span>
|
|
852
|
+
<span class="cline-any cline-yes">2x</span>
|
|
853
|
+
<span class="cline-any cline-yes">2x</span>
|
|
854
|
+
<span class="cline-any cline-yes">2x</span>
|
|
855
|
+
<span class="cline-any cline-no"> </span>
|
|
856
|
+
<span class="cline-any cline-no"> </span>
|
|
857
|
+
<span class="cline-any cline-no"> </span>
|
|
858
|
+
<span class="cline-any cline-no"> </span>
|
|
859
|
+
<span class="cline-any cline-no"> </span>
|
|
860
|
+
<span class="cline-any cline-no"> </span>
|
|
861
|
+
<span class="cline-any cline-no"> </span>
|
|
862
|
+
<span class="cline-any cline-no"> </span>
|
|
863
|
+
<span class="cline-any cline-no"> </span>
|
|
864
|
+
<span class="cline-any cline-no"> </span>
|
|
865
|
+
<span class="cline-any cline-no"> </span>
|
|
866
|
+
<span class="cline-any cline-no"> </span>
|
|
867
|
+
<span class="cline-any cline-no"> </span>
|
|
868
|
+
<span class="cline-any cline-no"> </span>
|
|
869
|
+
<span class="cline-any cline-no"> </span>
|
|
870
|
+
<span class="cline-any cline-yes">2x</span>
|
|
871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
873
|
+
<span class="cline-any cline-yes">2x</span>
|
|
874
|
+
<span class="cline-any cline-yes">2x</span>
|
|
875
|
+
<span class="cline-any cline-yes">2x</span>
|
|
876
|
+
<span class="cline-any cline-yes">2x</span>
|
|
877
|
+
<span class="cline-any cline-yes">2x</span>
|
|
878
|
+
<span class="cline-any cline-yes">2x</span>
|
|
879
|
+
<span class="cline-any cline-yes">2x</span>
|
|
880
|
+
<span class="cline-any cline-yes">2x</span>
|
|
881
|
+
<span class="cline-any cline-yes">2x</span>
|
|
882
|
+
<span class="cline-any cline-no"> </span>
|
|
883
|
+
<span class="cline-any cline-no"> </span>
|
|
884
|
+
<span class="cline-any cline-no"> </span>
|
|
885
|
+
<span class="cline-any cline-no"> </span>
|
|
886
|
+
<span class="cline-any cline-no"> </span>
|
|
887
|
+
<span class="cline-any cline-no"> </span>
|
|
888
|
+
<span class="cline-any cline-no"> </span>
|
|
889
|
+
<span class="cline-any cline-no"> </span>
|
|
890
|
+
<span class="cline-any cline-no"> </span>
|
|
891
|
+
<span class="cline-any cline-no"> </span>
|
|
892
|
+
<span class="cline-any cline-no"> </span>
|
|
893
|
+
<span class="cline-any cline-no"> </span>
|
|
894
|
+
<span class="cline-any cline-no"> </span>
|
|
895
|
+
<span class="cline-any cline-no"> </span>
|
|
896
|
+
<span class="cline-any cline-no"> </span>
|
|
897
|
+
<span class="cline-any cline-no"> </span>
|
|
898
|
+
<span class="cline-any cline-yes">2x</span>
|
|
899
|
+
<span class="cline-any cline-neutral"> </span>
|
|
900
|
+
<span class="cline-any cline-yes">2x</span>
|
|
901
|
+
<span class="cline-any cline-yes">2x</span>
|
|
902
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
903
|
+
import { z } from 'zod';
|
|
904
|
+
import type { Config } from './config.js';
|
|
905
|
+
import type { RegistryAdapter, RegistryName } from './types.js';
|
|
906
|
+
import { Cache } from './cache.js';
|
|
907
|
+
import { NpmAdapter, PypiAdapter, MavenAdapter, CratesAdapter } from './adapters/index.js';
|
|
908
|
+
import { formatNumber, padRight, truncate } from './utils/format.js';
|
|
909
|
+
|
|
910
|
+
function buildAdapters(config: Config, cache: Cache): Map<RegistryName, RegistryAdapter> {
|
|
911
|
+
const map = new Map<RegistryName, RegistryAdapter>();
|
|
912
|
+
const factories: Record<RegistryName, () => RegistryAdapter> = {
|
|
913
|
+
npm: () => new NpmAdapter(config, cache),
|
|
914
|
+
pypi: () => new PypiAdapter(config, cache),
|
|
915
|
+
maven: () => new MavenAdapter(config, cache),
|
|
916
|
+
crates: () => new CratesAdapter(config, cache),
|
|
917
|
+
};
|
|
918
|
+
for (const reg of config.registries) {
|
|
919
|
+
map.set(reg, factories[reg]());
|
|
920
|
+
}
|
|
921
|
+
return map;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getAdapter(</span></span>
|
|
925
|
+
<span class="cstat-no" title="statement not covered" > adapters: Map<RegistryName, RegistryAdapter>,</span>
|
|
926
|
+
<span class="cstat-no" title="statement not covered" > name: RegistryName</span>
|
|
927
|
+
<span class="cstat-no" title="statement not covered" >): RegistryAdapter {</span>
|
|
928
|
+
<span class="cstat-no" title="statement not covered" > const adapter = adapters.get(name);</span>
|
|
929
|
+
<span class="cstat-no" title="statement not covered" > if (!adapter)</span>
|
|
930
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
931
|
+
<span class="cstat-no" title="statement not covered" > `Registry "${name}" is not enabled. Enabled: ${[...adapters.keys()].join(', ')}`</span>
|
|
932
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
933
|
+
<span class="cstat-no" title="statement not covered" > return adapter;</span>
|
|
934
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
935
|
+
|
|
936
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getAdaptersForRegistry(</span></span>
|
|
937
|
+
<span class="cstat-no" title="statement not covered" > adapters: Map<RegistryName, RegistryAdapter>,</span>
|
|
938
|
+
<span class="cstat-no" title="statement not covered" > registry: string</span>
|
|
939
|
+
<span class="cstat-no" title="statement not covered" >): RegistryAdapter[] {</span>
|
|
940
|
+
<span class="cstat-no" title="statement not covered" > if (registry === 'all') return [...adapters.values()];</span>
|
|
941
|
+
<span class="cstat-no" title="statement not covered" > return [getAdapter(adapters, registry as RegistryName)];</span>
|
|
942
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
943
|
+
|
|
944
|
+
const registryEnum = z.enum(['npm', 'pypi', 'maven', 'crates']);
|
|
945
|
+
const registryOrAll = z.enum(['npm', 'pypi', 'maven', 'crates', 'all']).default('all');
|
|
946
|
+
|
|
947
|
+
export function createServer(config: Config): McpServer {
|
|
948
|
+
const cache = new Cache(config.cacheTtlMs);
|
|
949
|
+
const adapters = buildAdapters(config, cache);
|
|
950
|
+
|
|
951
|
+
const server = new McpServer({
|
|
952
|
+
name: 'registryx',
|
|
953
|
+
version: '0.1.0',
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
// ── 1. registryx_search ──
|
|
957
|
+
server.tool(
|
|
958
|
+
'registryx_search',
|
|
959
|
+
'Search packages across npm, PyPI, Maven Central, and crates.io registries',
|
|
960
|
+
{
|
|
961
|
+
query: z.string().describe('Package search text'),
|
|
962
|
+
registry: registryOrAll.describe('Registry to search (default: all)'),
|
|
963
|
+
limit: z.number().min(1).max(50).default(10).describe('Max results per registry'),
|
|
964
|
+
},
|
|
965
|
+
async ({ query, registry, limit }) => {
|
|
966
|
+
<span class="cstat-no" title="statement not covered" > const targets = getAdaptersForRegistry(adapters, registry);</span>
|
|
967
|
+
<span class="cstat-no" title="statement not covered" > const sections: string[] = [`RegistryX Search — "${query}"\n`];</span>
|
|
968
|
+
|
|
969
|
+
<span class="cstat-no" title="statement not covered" > const results = await Promise.allSettled(</span>
|
|
970
|
+
<span class="cstat-no" title="statement not covered" > targets.map(async (a) => ({ name: a.name, results: await a.search(query, limit) }))</span>
|
|
971
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
972
|
+
|
|
973
|
+
<span class="cstat-no" title="statement not covered" > for (const r of results) {</span>
|
|
974
|
+
<span class="cstat-no" title="statement not covered" > if (r.status === 'fulfilled') {</span>
|
|
975
|
+
<span class="cstat-no" title="statement not covered" > const { name, results: pkgs } = r.value;</span>
|
|
976
|
+
<span class="cstat-no" title="statement not covered" > sections.push(`📦 ${name} (${pkgs.length} results):`);</span>
|
|
977
|
+
<span class="cstat-no" title="statement not covered" > for (const p of pkgs) {</span>
|
|
978
|
+
<span class="cstat-no" title="statement not covered" > sections.push(</span>
|
|
979
|
+
<span class="cstat-no" title="statement not covered" > ` ${padRight(p.name, 30)} ${padRight(p.version, 12)} ${p.downloads ? padRight(p.downloads, 14) : ''}${truncate(p.description, 60)}`</span>
|
|
980
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
981
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
982
|
+
<span class="cstat-no" title="statement not covered" > sections.push('');</span>
|
|
983
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
984
|
+
<span class="cstat-no" title="statement not covered" > sections.push(`❌ Error: ${r.reason}`);</span>
|
|
985
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
986
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
987
|
+
|
|
988
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: sections.join('\n') }] };</span>
|
|
989
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
990
|
+
);
|
|
991
|
+
|
|
992
|
+
// ── 2. registryx_search_alternatives ──
|
|
993
|
+
server.tool(
|
|
994
|
+
'registryx_search_alternatives',
|
|
995
|
+
'Find equivalent packages across different registries',
|
|
996
|
+
{
|
|
997
|
+
packageName: z.string().describe('Package name to find alternatives for'),
|
|
998
|
+
sourceRegistry: registryEnum.describe('Registry the package is from'),
|
|
999
|
+
targetRegistries: z.array(registryEnum).optional().describe('Registries to search in'),
|
|
1000
|
+
},
|
|
1001
|
+
async ({ packageName, sourceRegistry, targetRegistries }) => {
|
|
1002
|
+
<span class="cstat-no" title="statement not covered" > const source = getAdapter(adapters, sourceRegistry);</span>
|
|
1003
|
+
<span class="cstat-no" title="statement not covered" > const pkg = await source.getPackage(packageName);</span>
|
|
1004
|
+
<span class="cstat-no" title="statement not covered" > const searchTerms = [pkg.name.replace(/[^a-zA-Z0-9 ]/g, ' '), ...pkg.keywords.slice(0, 3)];</span>
|
|
1005
|
+
<span class="cstat-no" title="statement not covered" > const query = searchTerms.join(' ');</span>
|
|
1006
|
+
|
|
1007
|
+
<span class="cstat-no" title="statement not covered" > const targets = targetRegistries</span>
|
|
1008
|
+
<span class="cstat-no" title="statement not covered" > ? targetRegistries.filter((r) => r !== sourceRegistry).map((r) => getAdapter(adapters, r))</span>
|
|
1009
|
+
<span class="cstat-no" title="statement not covered" > : [...adapters.values()].filter((a) => a.name !== sourceRegistry);</span>
|
|
1010
|
+
|
|
1011
|
+
<span class="cstat-no" title="statement not covered" > const sections: string[] = [</span>
|
|
1012
|
+
<span class="cstat-no" title="statement not covered" > `Alternatives for "${packageName}" (${sourceRegistry}): ${pkg.description}\n`,</span>
|
|
1013
|
+
<span class="cstat-no" title="statement not covered" > ];</span>
|
|
1014
|
+
|
|
1015
|
+
<span class="cstat-no" title="statement not covered" > const results = await Promise.allSettled(</span>
|
|
1016
|
+
<span class="cstat-no" title="statement not covered" > targets.map(async (a) => ({ name: a.name, results: await a.search(query, 5) }))</span>
|
|
1017
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1018
|
+
|
|
1019
|
+
<span class="cstat-no" title="statement not covered" > for (const r of results) {</span>
|
|
1020
|
+
<span class="cstat-no" title="statement not covered" > if (r.status === 'fulfilled') {</span>
|
|
1021
|
+
<span class="cstat-no" title="statement not covered" > const { name, results: pkgs } = r.value;</span>
|
|
1022
|
+
<span class="cstat-no" title="statement not covered" > sections.push(`📦 ${name}:`);</span>
|
|
1023
|
+
<span class="cstat-no" title="statement not covered" > for (const p of pkgs) {</span>
|
|
1024
|
+
<span class="cstat-no" title="statement not covered" > sections.push(</span>
|
|
1025
|
+
<span class="cstat-no" title="statement not covered" > ` ${padRight(p.name, 30)} ${padRight(p.version, 12)} ${truncate(p.description, 60)}`</span>
|
|
1026
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1027
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1028
|
+
<span class="cstat-no" title="statement not covered" > sections.push('');</span>
|
|
1029
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1030
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1031
|
+
|
|
1032
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: sections.join('\n') }] };</span>
|
|
1033
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1034
|
+
);
|
|
1035
|
+
|
|
1036
|
+
// ── 3. registryx_get_package ──
|
|
1037
|
+
server.tool(
|
|
1038
|
+
'registryx_get_package',
|
|
1039
|
+
'Get detailed package metadata from a registry',
|
|
1040
|
+
{
|
|
1041
|
+
name: z.string().describe('Package name (Maven: groupId:artifactId)'),
|
|
1042
|
+
registry: registryEnum.describe('Package registry'),
|
|
1043
|
+
},
|
|
1044
|
+
async ({ name, registry }) => {
|
|
1045
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1046
|
+
<span class="cstat-no" title="statement not covered" > const pkg = await adapter.getPackage(name);</span>
|
|
1047
|
+
<span class="cstat-no" title="statement not covered" > const lines = [</span>
|
|
1048
|
+
<span class="cstat-no" title="statement not covered" > `📦 ${pkg.name} v${pkg.version} (${pkg.registry})`,</span>
|
|
1049
|
+
<span class="cstat-no" title="statement not covered" > `Description: ${pkg.description}`,</span>
|
|
1050
|
+
<span class="cstat-no" title="statement not covered" > `License: ${pkg.license}`,</span>
|
|
1051
|
+
<span class="cstat-no" title="statement not covered" > `Homepage: ${pkg.homepage || 'N/A'}`,</span>
|
|
1052
|
+
<span class="cstat-no" title="statement not covered" > `Repository: ${pkg.repository || 'N/A'}`,</span>
|
|
1053
|
+
<span class="cstat-no" title="statement not covered" > `Keywords: ${pkg.keywords.join(', ') || 'N/A'}`,</span>
|
|
1054
|
+
<span class="cstat-no" title="statement not covered" > ];</span>
|
|
1055
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: lines.join('\n') }] };</span>
|
|
1056
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1057
|
+
);
|
|
1058
|
+
|
|
1059
|
+
// ── 4. registryx_get_readme ──
|
|
1060
|
+
server.tool(
|
|
1061
|
+
'registryx_get_readme',
|
|
1062
|
+
'Get README content for a package',
|
|
1063
|
+
{
|
|
1064
|
+
name: z.string().describe('Package name'),
|
|
1065
|
+
registry: registryEnum.describe('Package registry'),
|
|
1066
|
+
},
|
|
1067
|
+
async ({ name, registry }) => {
|
|
1068
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1069
|
+
<span class="cstat-no" title="statement not covered" > const readme = await adapter.getReadme(name);</span>
|
|
1070
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: truncate(readme, 8000) }] };</span>
|
|
1071
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1072
|
+
);
|
|
1073
|
+
|
|
1074
|
+
// ── 5. registryx_get_maintainers ──
|
|
1075
|
+
server.tool(
|
|
1076
|
+
'registryx_get_maintainers',
|
|
1077
|
+
'Get package maintainers/authors',
|
|
1078
|
+
{
|
|
1079
|
+
name: z.string().describe('Package name'),
|
|
1080
|
+
registry: registryEnum.describe('Package registry'),
|
|
1081
|
+
},
|
|
1082
|
+
async ({ name, registry }) => {
|
|
1083
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1084
|
+
<span class="cstat-no" title="statement not covered" > const maintainers = await adapter.getMaintainers(name);</span>
|
|
1085
|
+
<span class="cstat-no" title="statement not covered" > if (maintainers.length === 0)</span>
|
|
1086
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: 'No maintainer info available.' }] };</span>
|
|
1087
|
+
<span class="cstat-no" title="statement not covered" > const lines = [`Maintainers for ${name} (${registry}):`];</span>
|
|
1088
|
+
<span class="cstat-no" title="statement not covered" > for (const m of maintainers) {</span>
|
|
1089
|
+
<span class="cstat-no" title="statement not covered" > lines.push(` 👤 ${m.name}${m.email ? ` <${m.email}>` : ''}${m.url ? ` (${m.url})` : ''}`);</span>
|
|
1090
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1091
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: lines.join('\n') }] };</span>
|
|
1092
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1093
|
+
);
|
|
1094
|
+
|
|
1095
|
+
// ── 6. registryx_list_versions ──
|
|
1096
|
+
server.tool(
|
|
1097
|
+
'registryx_list_versions',
|
|
1098
|
+
'List available versions for a package',
|
|
1099
|
+
{
|
|
1100
|
+
name: z.string().describe('Package name'),
|
|
1101
|
+
registry: registryEnum.describe('Package registry'),
|
|
1102
|
+
limit: z.number().min(1).max(100).default(20).describe('Max versions to return'),
|
|
1103
|
+
stable: z.boolean().default(true).describe('Exclude pre-release versions'),
|
|
1104
|
+
},
|
|
1105
|
+
async ({ name, registry, limit, stable }) => {
|
|
1106
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1107
|
+
<span class="cstat-no" title="statement not covered" > const versions = await adapter.listVersions(name, limit, stable);</span>
|
|
1108
|
+
<span class="cstat-no" title="statement not covered" > const lines = [`Versions for ${name} (${registry}) — ${stable ? 'stable only' : 'all'}:`];</span>
|
|
1109
|
+
<span class="cstat-no" title="statement not covered" > for (const v of versions) {</span>
|
|
1110
|
+
<span class="cstat-no" title="statement not covered" > lines.push(</span>
|
|
1111
|
+
<span class="cstat-no" title="statement not covered" > ` ${padRight(v.version, 20)} ${v.date ? v.date.split('T')[0] : ''}${v.prerelease ? ' [pre]' : ''}`</span>
|
|
1112
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1113
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1114
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: lines.join('\n') }] };</span>
|
|
1115
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1116
|
+
);
|
|
1117
|
+
|
|
1118
|
+
// ── 7. registryx_get_version ──
|
|
1119
|
+
server.tool(
|
|
1120
|
+
'registryx_get_version',
|
|
1121
|
+
'Get details for a specific package version',
|
|
1122
|
+
{
|
|
1123
|
+
name: z.string().describe('Package name'),
|
|
1124
|
+
registry: registryEnum.describe('Package registry'),
|
|
1125
|
+
version: z.string().describe('Version string'),
|
|
1126
|
+
},
|
|
1127
|
+
async ({ name, registry, version }) => {
|
|
1128
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1129
|
+
<span class="cstat-no" title="statement not covered" > const vd = await adapter.getVersion(name, version);</span>
|
|
1130
|
+
<span class="cstat-no" title="statement not covered" > const lines = [</span>
|
|
1131
|
+
<span class="cstat-no" title="statement not covered" > `📦 ${vd.name} v${vd.version} (${vd.registry})`,</span>
|
|
1132
|
+
<span class="cstat-no" title="statement not covered" > `Date: ${vd.date || 'Unknown'}`,</span>
|
|
1133
|
+
<span class="cstat-no" title="statement not covered" > `License: ${vd.license}`,</span>
|
|
1134
|
+
<span class="cstat-no" title="statement not covered" > `Size: ${vd.size}`,</span>
|
|
1135
|
+
<span class="cstat-no" title="statement not covered" > `Dependencies: ${vd.dependencies.length}`,</span>
|
|
1136
|
+
<span class="cstat-no" title="statement not covered" > ];</span>
|
|
1137
|
+
<span class="cstat-no" title="statement not covered" > if (vd.dependencies.length > 0) {</span>
|
|
1138
|
+
<span class="cstat-no" title="statement not covered" > lines.push('');</span>
|
|
1139
|
+
<span class="cstat-no" title="statement not covered" > for (const d of vd.dependencies.slice(0, 20)) {</span>
|
|
1140
|
+
<span class="cstat-no" title="statement not covered" > lines.push(` ${d.type === 'dev' ? '[dev] ' : ''}${d.name} ${d.version}`);</span>
|
|
1141
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1142
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1143
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: lines.join('\n') }] };</span>
|
|
1144
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1145
|
+
);
|
|
1146
|
+
|
|
1147
|
+
// ── 8. registryx_compare_versions ──
|
|
1148
|
+
server.tool(
|
|
1149
|
+
'registryx_compare_versions',
|
|
1150
|
+
'Compare two versions of a package',
|
|
1151
|
+
{
|
|
1152
|
+
name: z.string().describe('Package name'),
|
|
1153
|
+
registry: registryEnum.describe('Package registry'),
|
|
1154
|
+
version1: z.string().describe('First version'),
|
|
1155
|
+
version2: z.string().describe('Second version'),
|
|
1156
|
+
},
|
|
1157
|
+
async ({ name, registry, version1, version2 }) => {
|
|
1158
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1159
|
+
<span class="cstat-no" title="statement not covered" > const [v1, v2] = await Promise.all([</span>
|
|
1160
|
+
<span class="cstat-no" title="statement not covered" > adapter.getVersion(name, version1),</span>
|
|
1161
|
+
<span class="cstat-no" title="statement not covered" > adapter.getVersion(name, version2),</span>
|
|
1162
|
+
<span class="cstat-no" title="statement not covered" > ]);</span>
|
|
1163
|
+
|
|
1164
|
+
<span class="cstat-no" title="statement not covered" > const deps1 = new Set(v1.dependencies.map((d) => d.name));</span>
|
|
1165
|
+
<span class="cstat-no" title="statement not covered" > const deps2 = new Set(v2.dependencies.map((d) => d.name));</span>
|
|
1166
|
+
<span class="cstat-no" title="statement not covered" > const added = [...deps2].filter((d) => !deps1.has(d));</span>
|
|
1167
|
+
<span class="cstat-no" title="statement not covered" > const removed = [...deps1].filter((d) => !deps2.has(d));</span>
|
|
1168
|
+
|
|
1169
|
+
<span class="cstat-no" title="statement not covered" > const lines = [</span>
|
|
1170
|
+
<span class="cstat-no" title="statement not covered" > `Comparing ${name} v${version1} ↔ v${version2} (${registry})`,</span>
|
|
1171
|
+
<span class="cstat-no" title="statement not covered" > '',</span>
|
|
1172
|
+
<span class="cstat-no" title="statement not covered" > ` v${version1}: ${v1.date || 'Unknown'} | ${v1.license} | ${v1.size} | ${v1.dependencies.length} deps`,</span>
|
|
1173
|
+
<span class="cstat-no" title="statement not covered" > ` v${version2}: ${v2.date || 'Unknown'} | ${v2.license} | ${v2.size} | ${v2.dependencies.length} deps`,</span>
|
|
1174
|
+
<span class="cstat-no" title="statement not covered" > ];</span>
|
|
1175
|
+
|
|
1176
|
+
<span class="cstat-no" title="statement not covered" > if (added.length > 0) lines.push(`\n ➕ Added: ${added.join(', ')}`);</span>
|
|
1177
|
+
<span class="cstat-no" title="statement not covered" > if (removed.length > 0) lines.push(` ➖ Removed: ${removed.join(', ')}`);</span>
|
|
1178
|
+
|
|
1179
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: lines.join('\n') }] };</span>
|
|
1180
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1181
|
+
);
|
|
1182
|
+
|
|
1183
|
+
// ── 9. registryx_get_dependencies ──
|
|
1184
|
+
server.tool(
|
|
1185
|
+
'registryx_get_dependencies',
|
|
1186
|
+
'Get package dependencies',
|
|
1187
|
+
{
|
|
1188
|
+
name: z.string().describe('Package name'),
|
|
1189
|
+
registry: registryEnum.describe('Package registry'),
|
|
1190
|
+
version: z.string().optional().describe('Version (latest if omitted)'),
|
|
1191
|
+
type: z.enum(['runtime', 'dev', 'all']).default('runtime').describe('Dependency type'),
|
|
1192
|
+
},
|
|
1193
|
+
async ({ name, registry, version, type }) => {
|
|
1194
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1195
|
+
<span class="cstat-no" title="statement not covered" > const ver = version ?? (await adapter.getPackage(name)).version;</span>
|
|
1196
|
+
<span class="cstat-no" title="statement not covered" > const deps = await adapter.getDependencies(name, ver, type);</span>
|
|
1197
|
+
<span class="cstat-no" title="statement not covered" > if (deps.length === 0)</span>
|
|
1198
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1199
|
+
<span class="cstat-no" title="statement not covered" > content: [{ type: 'text', text: `No ${type} dependencies found for ${name}@${ver}.` }],</span>
|
|
1200
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1201
|
+
|
|
1202
|
+
<span class="cstat-no" title="statement not covered" > const lines = [`Dependencies for ${name}@${ver} (${registry}, ${type}):`];</span>
|
|
1203
|
+
<span class="cstat-no" title="statement not covered" > for (const d of deps) {</span>
|
|
1204
|
+
<span class="cstat-no" title="statement not covered" > lines.push(` ${d.type === 'dev' ? '[dev] ' : ''}${padRight(d.name, 30)} ${d.version}`);</span>
|
|
1205
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1206
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: lines.join('\n') }] };</span>
|
|
1207
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1208
|
+
);
|
|
1209
|
+
|
|
1210
|
+
// ── 10. registryx_reverse_dependencies ──
|
|
1211
|
+
server.tool(
|
|
1212
|
+
'registryx_reverse_dependencies',
|
|
1213
|
+
'Find packages that depend on this one',
|
|
1214
|
+
{
|
|
1215
|
+
name: z.string().describe('Package name'),
|
|
1216
|
+
registry: registryEnum.describe('Package registry'),
|
|
1217
|
+
limit: z.number().min(1).max(100).default(20).describe('Max results'),
|
|
1218
|
+
},
|
|
1219
|
+
async ({ name, registry, limit }) => {
|
|
1220
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1221
|
+
<span class="cstat-no" title="statement not covered" > const rdeps = await adapter.getReverseDependencies(name, limit);</span>
|
|
1222
|
+
<span class="cstat-no" title="statement not covered" > if (rdeps.length === 0)</span>
|
|
1223
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1224
|
+
<span class="cstat-no" title="statement not covered" > content: [</span>
|
|
1225
|
+
<span class="cstat-no" title="statement not covered" > {</span>
|
|
1226
|
+
<span class="cstat-no" title="statement not covered" > type: 'text',</span>
|
|
1227
|
+
<span class="cstat-no" title="statement not covered" > text: `No reverse dependency data available for ${name} on ${registry}.`,</span>
|
|
1228
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
1229
|
+
<span class="cstat-no" title="statement not covered" > ],</span>
|
|
1230
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1231
|
+
|
|
1232
|
+
<span class="cstat-no" title="statement not covered" > const lines = [`Packages that depend on ${name} (${registry}):`];</span>
|
|
1233
|
+
<span class="cstat-no" title="statement not covered" > for (const p of rdeps) {</span>
|
|
1234
|
+
<span class="cstat-no" title="statement not covered" > lines.push(` ${padRight(p.name, 30)} ${p.version}`);</span>
|
|
1235
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1236
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: lines.join('\n') }] };</span>
|
|
1237
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1238
|
+
);
|
|
1239
|
+
|
|
1240
|
+
// ── 11. registryx_download_stats ──
|
|
1241
|
+
server.tool(
|
|
1242
|
+
'registryx_download_stats',
|
|
1243
|
+
'Get download statistics for a package',
|
|
1244
|
+
{
|
|
1245
|
+
name: z.string().describe('Package name'),
|
|
1246
|
+
registry: registryEnum.describe('Package registry'),
|
|
1247
|
+
period: z
|
|
1248
|
+
.enum(['last-day', 'last-week', 'last-month', 'last-year'])
|
|
1249
|
+
.default('last-month')
|
|
1250
|
+
.describe('Time period'),
|
|
1251
|
+
},
|
|
1252
|
+
async ({ name, registry, period }) => {
|
|
1253
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1254
|
+
<span class="cstat-no" title="statement not covered" > const stats = await adapter.getDownloadStats(name, period);</span>
|
|
1255
|
+
<span class="cstat-no" title="statement not covered" > const lines = [</span>
|
|
1256
|
+
<span class="cstat-no" title="statement not covered" > `📊 Download stats for ${name} (${registry})`,</span>
|
|
1257
|
+
<span class="cstat-no" title="statement not covered" > `Period: ${stats.period}`,</span>
|
|
1258
|
+
<span class="cstat-no" title="statement not covered" > `Total: ${formatNumber(stats.total)}`,</span>
|
|
1259
|
+
<span class="cstat-no" title="statement not covered" > ];</span>
|
|
1260
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: lines.join('\n') }] };</span>
|
|
1261
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1262
|
+
);
|
|
1263
|
+
|
|
1264
|
+
// ── 12. registryx_package_health ──
|
|
1265
|
+
server.tool(
|
|
1266
|
+
'registryx_package_health',
|
|
1267
|
+
'Get package health score and maintenance signals',
|
|
1268
|
+
{
|
|
1269
|
+
name: z.string().describe('Package name'),
|
|
1270
|
+
registry: registryEnum.describe('Package registry'),
|
|
1271
|
+
},
|
|
1272
|
+
async ({ name, registry }) => {
|
|
1273
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1274
|
+
<span class="cstat-no" title="statement not covered" > const health = await adapter.getPackageHealth(name);</span>
|
|
1275
|
+
<span class="cstat-no" title="statement not covered" > const lines = [</span>
|
|
1276
|
+
<span class="cstat-no" title="statement not covered" > `🏥 Health for ${name} (${registry})`,</span>
|
|
1277
|
+
<span class="cstat-no" title="statement not covered" > `Score: ${health.score}/10`,</span>
|
|
1278
|
+
<span class="cstat-no" title="statement not covered" > `Last publish: ${health.lastPublish || 'Unknown'}`,</span>
|
|
1279
|
+
<span class="cstat-no" title="statement not covered" > `Dependencies: ${health.dependencyCount}`,</span>
|
|
1280
|
+
<span class="cstat-no" title="statement not covered" > `Has typings: ${health.hasTypings ? '✅' : '❌'}`,</span>
|
|
1281
|
+
<span class="cstat-no" title="statement not covered" > `Has tests: ${health.hasTests ? '✅' : '❌'}`,</span>
|
|
1282
|
+
<span class="cstat-no" title="statement not covered" > '',</span>
|
|
1283
|
+
<span class="cstat-no" title="statement not covered" > 'Signals:',</span>
|
|
1284
|
+
<span class="cstat-no" title="statement not covered" > ...health.signals.map((s) => ` ✅ ${s}`),</span>
|
|
1285
|
+
<span class="cstat-no" title="statement not covered" > ];</span>
|
|
1286
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: lines.join('\n') }] };</span>
|
|
1287
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1288
|
+
);
|
|
1289
|
+
|
|
1290
|
+
// ── 13. registryx_security_advisories ──
|
|
1291
|
+
server.tool(
|
|
1292
|
+
'registryx_security_advisories',
|
|
1293
|
+
'Check for security advisories (via OSV.dev)',
|
|
1294
|
+
{
|
|
1295
|
+
name: z.string().describe('Package name'),
|
|
1296
|
+
registry: registryEnum.describe('Package registry'),
|
|
1297
|
+
version: z.string().optional().describe('Specific version to check'),
|
|
1298
|
+
},
|
|
1299
|
+
async ({ name, registry, version }) => {
|
|
1300
|
+
<span class="cstat-no" title="statement not covered" > const adapter = getAdapter(adapters, registry);</span>
|
|
1301
|
+
<span class="cstat-no" title="statement not covered" > const advisories = await adapter.getSecurityAdvisories(name, version);</span>
|
|
1302
|
+
<span class="cstat-no" title="statement not covered" > if (advisories.length === 0) {</span>
|
|
1303
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1304
|
+
<span class="cstat-no" title="statement not covered" > content: [</span>
|
|
1305
|
+
<span class="cstat-no" title="statement not covered" > { type: 'text', text: `✅ No known security advisories for ${name} (${registry}).` },</span>
|
|
1306
|
+
<span class="cstat-no" title="statement not covered" > ],</span>
|
|
1307
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1308
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1309
|
+
<span class="cstat-no" title="statement not covered" > const lines = [`🔒 Security advisories for ${name} (${registry}):`];</span>
|
|
1310
|
+
<span class="cstat-no" title="statement not covered" > for (const a of advisories) {</span>
|
|
1311
|
+
<span class="cstat-no" title="statement not covered" > lines.push(` ⚠️ ${a.id}: ${a.title}`);</span>
|
|
1312
|
+
<span class="cstat-no" title="statement not covered" > lines.push(` Severity: ${a.severity} | ${a.url}`);</span>
|
|
1313
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1314
|
+
<span class="cstat-no" title="statement not covered" > return { content: [{ type: 'text', text: lines.join('\n') }] };</span>
|
|
1315
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1316
|
+
);
|
|
1317
|
+
|
|
1318
|
+
return server;
|
|
1319
|
+
}
|
|
1320
|
+
</pre></td></tr></table></pre>
|
|
1321
|
+
|
|
1322
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1323
|
+
</div><!-- /wrapper -->
|
|
1324
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1325
|
+
Code coverage generated by
|
|
1326
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1327
|
+
at 2026-05-14T16:40:53.899Z
|
|
1328
|
+
</div>
|
|
1329
|
+
<script src="../prettify.js"></script>
|
|
1330
|
+
<script>
|
|
1331
|
+
window.onload = function () {
|
|
1332
|
+
prettyPrint();
|
|
1333
|
+
};
|
|
1334
|
+
</script>
|
|
1335
|
+
<script src="../sorter.js"></script>
|
|
1336
|
+
<script src="../block-navigation.js"></script>
|
|
1337
|
+
</body>
|
|
1338
|
+
</html>
|
|
1339
|
+
|