@claude-flow/deployment 3.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/.agentic-flow/intelligence.json +16 -0
  2. package/QUICK_START.md +281 -0
  3. package/README.md +333 -0
  4. package/__tests__/coverage/base.css +224 -0
  5. package/__tests__/coverage/block-navigation.js +87 -0
  6. package/__tests__/coverage/coverage-final.json +4 -0
  7. package/__tests__/coverage/favicon.png +0 -0
  8. package/__tests__/coverage/index.html +146 -0
  9. package/__tests__/coverage/lcov-report/base.css +224 -0
  10. package/__tests__/coverage/lcov-report/block-navigation.js +87 -0
  11. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  12. package/__tests__/coverage/lcov-report/index.html +146 -0
  13. package/__tests__/coverage/lcov-report/prettify.css +1 -0
  14. package/__tests__/coverage/lcov-report/prettify.js +2 -0
  15. package/__tests__/coverage/lcov-report/publisher.ts.html +811 -0
  16. package/__tests__/coverage/lcov-report/release-manager.ts.html +1120 -0
  17. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  18. package/__tests__/coverage/lcov-report/sorter.js +210 -0
  19. package/__tests__/coverage/lcov-report/validator.ts.html +940 -0
  20. package/__tests__/coverage/lcov.info +908 -0
  21. package/__tests__/coverage/prettify.css +1 -0
  22. package/__tests__/coverage/prettify.js +2 -0
  23. package/__tests__/coverage/publisher.ts.html +811 -0
  24. package/__tests__/coverage/release-manager.ts.html +1120 -0
  25. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  26. package/__tests__/coverage/sorter.js +210 -0
  27. package/__tests__/coverage/validator.ts.html +940 -0
  28. package/dist/__tests__/release-manager.test.d.ts +2 -0
  29. package/dist/__tests__/release-manager.test.d.ts.map +1 -0
  30. package/dist/__tests__/release-manager.test.js +62 -0
  31. package/dist/__tests__/release-manager.test.js.map +1 -0
  32. package/dist/index.d.ts +33 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +45 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/publisher.d.ts +58 -0
  37. package/dist/publisher.d.ts.map +1 -0
  38. package/dist/publisher.js +229 -0
  39. package/dist/publisher.js.map +1 -0
  40. package/dist/release-manager.d.ts +46 -0
  41. package/dist/release-manager.d.ts.map +1 -0
  42. package/dist/release-manager.js +282 -0
  43. package/dist/release-manager.js.map +1 -0
  44. package/dist/types.d.ts +168 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +5 -0
  47. package/dist/types.js.map +1 -0
  48. package/dist/validator.d.ts +46 -0
  49. package/dist/validator.d.ts.map +1 -0
  50. package/dist/validator.js +251 -0
  51. package/dist/validator.js.map +1 -0
  52. package/examples/basic-release.ts +92 -0
  53. package/examples/dry-run.ts +70 -0
  54. package/examples/prerelease-workflow.ts +98 -0
  55. package/package.json +27 -0
  56. package/src/__tests__/release-manager.test.ts +72 -0
  57. package/src/index.ts +88 -0
  58. package/src/publisher.ts +273 -0
  59. package/src/release-manager.ts +345 -0
  60. package/src/types.ts +159 -0
  61. package/src/validator.ts +285 -0
  62. package/tsconfig.json +9 -0
  63. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,1120 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for release-manager.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> release-manager.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/345</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/1</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/1</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/345</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></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
412
+ <span class="cline-any cline-no">&nbsp;</span>
413
+ <span class="cline-any cline-no">&nbsp;</span>
414
+ <span class="cline-any cline-no">&nbsp;</span>
415
+ <span class="cline-any cline-no">&nbsp;</span>
416
+ <span class="cline-any cline-no">&nbsp;</span>
417
+ <span class="cline-any cline-no">&nbsp;</span>
418
+ <span class="cline-any cline-no">&nbsp;</span>
419
+ <span class="cline-any cline-no">&nbsp;</span>
420
+ <span class="cline-any cline-no">&nbsp;</span>
421
+ <span class="cline-any cline-no">&nbsp;</span>
422
+ <span class="cline-any cline-no">&nbsp;</span>
423
+ <span class="cline-any cline-no">&nbsp;</span>
424
+ <span class="cline-any cline-no">&nbsp;</span>
425
+ <span class="cline-any cline-no">&nbsp;</span>
426
+ <span class="cline-any cline-no">&nbsp;</span>
427
+ <span class="cline-any cline-no">&nbsp;</span>
428
+ <span class="cline-any cline-no">&nbsp;</span>
429
+ <span class="cline-any cline-no">&nbsp;</span>
430
+ <span class="cline-any cline-no">&nbsp;</span>
431
+ <span class="cline-any cline-no">&nbsp;</span>
432
+ <span class="cline-any cline-no">&nbsp;</span>
433
+ <span class="cline-any cline-no">&nbsp;</span>
434
+ <span class="cline-any cline-no">&nbsp;</span>
435
+ <span class="cline-any cline-no">&nbsp;</span>
436
+ <span class="cline-any cline-no">&nbsp;</span>
437
+ <span class="cline-any cline-no">&nbsp;</span>
438
+ <span class="cline-any cline-no">&nbsp;</span>
439
+ <span class="cline-any cline-no">&nbsp;</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-no">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
+ <span class="cline-any cline-no">&nbsp;</span>
444
+ <span class="cline-any cline-no">&nbsp;</span>
445
+ <span class="cline-any cline-no">&nbsp;</span>
446
+ <span class="cline-any cline-no">&nbsp;</span>
447
+ <span class="cline-any cline-no">&nbsp;</span>
448
+ <span class="cline-any cline-no">&nbsp;</span>
449
+ <span class="cline-any cline-no">&nbsp;</span>
450
+ <span class="cline-any cline-no">&nbsp;</span>
451
+ <span class="cline-any cline-no">&nbsp;</span>
452
+ <span class="cline-any cline-no">&nbsp;</span>
453
+ <span class="cline-any cline-no">&nbsp;</span>
454
+ <span class="cline-any cline-no">&nbsp;</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
456
+ <span class="cline-any cline-no">&nbsp;</span>
457
+ <span class="cline-any cline-no">&nbsp;</span>
458
+ <span class="cline-any cline-no">&nbsp;</span>
459
+ <span class="cline-any cline-no">&nbsp;</span>
460
+ <span class="cline-any cline-no">&nbsp;</span>
461
+ <span class="cline-any cline-no">&nbsp;</span>
462
+ <span class="cline-any cline-no">&nbsp;</span>
463
+ <span class="cline-any cline-no">&nbsp;</span>
464
+ <span class="cline-any cline-no">&nbsp;</span>
465
+ <span class="cline-any cline-no">&nbsp;</span>
466
+ <span class="cline-any cline-no">&nbsp;</span>
467
+ <span class="cline-any cline-no">&nbsp;</span>
468
+ <span class="cline-any cline-no">&nbsp;</span>
469
+ <span class="cline-any cline-no">&nbsp;</span>
470
+ <span class="cline-any cline-no">&nbsp;</span>
471
+ <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-no">&nbsp;</span>
473
+ <span class="cline-any cline-no">&nbsp;</span>
474
+ <span class="cline-any cline-no">&nbsp;</span>
475
+ <span class="cline-any cline-no">&nbsp;</span>
476
+ <span class="cline-any cline-no">&nbsp;</span>
477
+ <span class="cline-any cline-no">&nbsp;</span>
478
+ <span class="cline-any cline-no">&nbsp;</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-no">&nbsp;</span>
481
+ <span class="cline-any cline-no">&nbsp;</span>
482
+ <span class="cline-any cline-no">&nbsp;</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-no">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-no">&nbsp;</span>
487
+ <span class="cline-any cline-no">&nbsp;</span>
488
+ <span class="cline-any cline-no">&nbsp;</span>
489
+ <span class="cline-any cline-no">&nbsp;</span>
490
+ <span class="cline-any cline-no">&nbsp;</span>
491
+ <span class="cline-any cline-no">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-no">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-no">&nbsp;</span>
497
+ <span class="cline-any cline-no">&nbsp;</span>
498
+ <span class="cline-any cline-no">&nbsp;</span>
499
+ <span class="cline-any cline-no">&nbsp;</span>
500
+ <span class="cline-any cline-no">&nbsp;</span>
501
+ <span class="cline-any cline-no">&nbsp;</span>
502
+ <span class="cline-any cline-no">&nbsp;</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-no">&nbsp;</span>
505
+ <span class="cline-any cline-no">&nbsp;</span>
506
+ <span class="cline-any cline-no">&nbsp;</span>
507
+ <span class="cline-any cline-no">&nbsp;</span>
508
+ <span class="cline-any cline-no">&nbsp;</span>
509
+ <span class="cline-any cline-no">&nbsp;</span>
510
+ <span class="cline-any cline-no">&nbsp;</span>
511
+ <span class="cline-any cline-no">&nbsp;</span>
512
+ <span class="cline-any cline-no">&nbsp;</span>
513
+ <span class="cline-any cline-no">&nbsp;</span>
514
+ <span class="cline-any cline-no">&nbsp;</span>
515
+ <span class="cline-any cline-no">&nbsp;</span>
516
+ <span class="cline-any cline-no">&nbsp;</span>
517
+ <span class="cline-any cline-no">&nbsp;</span>
518
+ <span class="cline-any cline-no">&nbsp;</span>
519
+ <span class="cline-any cline-no">&nbsp;</span>
520
+ <span class="cline-any cline-no">&nbsp;</span>
521
+ <span class="cline-any cline-no">&nbsp;</span>
522
+ <span class="cline-any cline-no">&nbsp;</span>
523
+ <span class="cline-any cline-no">&nbsp;</span>
524
+ <span class="cline-any cline-no">&nbsp;</span>
525
+ <span class="cline-any cline-no">&nbsp;</span>
526
+ <span class="cline-any cline-no">&nbsp;</span>
527
+ <span class="cline-any cline-no">&nbsp;</span>
528
+ <span class="cline-any cline-no">&nbsp;</span>
529
+ <span class="cline-any cline-no">&nbsp;</span>
530
+ <span class="cline-any cline-no">&nbsp;</span>
531
+ <span class="cline-any cline-no">&nbsp;</span>
532
+ <span class="cline-any cline-no">&nbsp;</span>
533
+ <span class="cline-any cline-no">&nbsp;</span>
534
+ <span class="cline-any cline-no">&nbsp;</span>
535
+ <span class="cline-any cline-no">&nbsp;</span>
536
+ <span class="cline-any cline-no">&nbsp;</span>
537
+ <span class="cline-any cline-no">&nbsp;</span>
538
+ <span class="cline-any cline-no">&nbsp;</span>
539
+ <span class="cline-any cline-no">&nbsp;</span>
540
+ <span class="cline-any cline-no">&nbsp;</span>
541
+ <span class="cline-any cline-no">&nbsp;</span>
542
+ <span class="cline-any cline-no">&nbsp;</span>
543
+ <span class="cline-any cline-no">&nbsp;</span>
544
+ <span class="cline-any cline-no">&nbsp;</span>
545
+ <span class="cline-any cline-no">&nbsp;</span>
546
+ <span class="cline-any cline-no">&nbsp;</span>
547
+ <span class="cline-any cline-no">&nbsp;</span>
548
+ <span class="cline-any cline-no">&nbsp;</span>
549
+ <span class="cline-any cline-no">&nbsp;</span>
550
+ <span class="cline-any cline-no">&nbsp;</span>
551
+ <span class="cline-any cline-no">&nbsp;</span>
552
+ <span class="cline-any cline-no">&nbsp;</span>
553
+ <span class="cline-any cline-no">&nbsp;</span>
554
+ <span class="cline-any cline-no">&nbsp;</span>
555
+ <span class="cline-any cline-no">&nbsp;</span>
556
+ <span class="cline-any cline-no">&nbsp;</span>
557
+ <span class="cline-any cline-no">&nbsp;</span>
558
+ <span class="cline-any cline-no">&nbsp;</span>
559
+ <span class="cline-any cline-no">&nbsp;</span>
560
+ <span class="cline-any cline-no">&nbsp;</span>
561
+ <span class="cline-any cline-no">&nbsp;</span>
562
+ <span class="cline-any cline-no">&nbsp;</span>
563
+ <span class="cline-any cline-no">&nbsp;</span>
564
+ <span class="cline-any cline-no">&nbsp;</span>
565
+ <span class="cline-any cline-no">&nbsp;</span>
566
+ <span class="cline-any cline-no">&nbsp;</span>
567
+ <span class="cline-any cline-no">&nbsp;</span>
568
+ <span class="cline-any cline-no">&nbsp;</span>
569
+ <span class="cline-any cline-no">&nbsp;</span>
570
+ <span class="cline-any cline-no">&nbsp;</span>
571
+ <span class="cline-any cline-no">&nbsp;</span>
572
+ <span class="cline-any cline-no">&nbsp;</span>
573
+ <span class="cline-any cline-no">&nbsp;</span>
574
+ <span class="cline-any cline-no">&nbsp;</span>
575
+ <span class="cline-any cline-no">&nbsp;</span>
576
+ <span class="cline-any cline-no">&nbsp;</span>
577
+ <span class="cline-any cline-no">&nbsp;</span>
578
+ <span class="cline-any cline-no">&nbsp;</span>
579
+ <span class="cline-any cline-no">&nbsp;</span>
580
+ <span class="cline-any cline-no">&nbsp;</span>
581
+ <span class="cline-any cline-no">&nbsp;</span>
582
+ <span class="cline-any cline-no">&nbsp;</span>
583
+ <span class="cline-any cline-no">&nbsp;</span>
584
+ <span class="cline-any cline-no">&nbsp;</span>
585
+ <span class="cline-any cline-no">&nbsp;</span>
586
+ <span class="cline-any cline-no">&nbsp;</span>
587
+ <span class="cline-any cline-no">&nbsp;</span>
588
+ <span class="cline-any cline-no">&nbsp;</span>
589
+ <span class="cline-any cline-no">&nbsp;</span>
590
+ <span class="cline-any cline-no">&nbsp;</span>
591
+ <span class="cline-any cline-no">&nbsp;</span>
592
+ <span class="cline-any cline-no">&nbsp;</span>
593
+ <span class="cline-any cline-no">&nbsp;</span>
594
+ <span class="cline-any cline-no">&nbsp;</span>
595
+ <span class="cline-any cline-no">&nbsp;</span>
596
+ <span class="cline-any cline-no">&nbsp;</span>
597
+ <span class="cline-any cline-no">&nbsp;</span>
598
+ <span class="cline-any cline-no">&nbsp;</span>
599
+ <span class="cline-any cline-no">&nbsp;</span>
600
+ <span class="cline-any cline-no">&nbsp;</span>
601
+ <span class="cline-any cline-no">&nbsp;</span>
602
+ <span class="cline-any cline-no">&nbsp;</span>
603
+ <span class="cline-any cline-no">&nbsp;</span>
604
+ <span class="cline-any cline-no">&nbsp;</span>
605
+ <span class="cline-any cline-no">&nbsp;</span>
606
+ <span class="cline-any cline-no">&nbsp;</span>
607
+ <span class="cline-any cline-no">&nbsp;</span>
608
+ <span class="cline-any cline-no">&nbsp;</span>
609
+ <span class="cline-any cline-no">&nbsp;</span>
610
+ <span class="cline-any cline-no">&nbsp;</span>
611
+ <span class="cline-any cline-no">&nbsp;</span>
612
+ <span class="cline-any cline-no">&nbsp;</span>
613
+ <span class="cline-any cline-no">&nbsp;</span>
614
+ <span class="cline-any cline-no">&nbsp;</span>
615
+ <span class="cline-any cline-no">&nbsp;</span>
616
+ <span class="cline-any cline-no">&nbsp;</span>
617
+ <span class="cline-any cline-no">&nbsp;</span>
618
+ <span class="cline-any cline-no">&nbsp;</span>
619
+ <span class="cline-any cline-no">&nbsp;</span>
620
+ <span class="cline-any cline-no">&nbsp;</span>
621
+ <span class="cline-any cline-no">&nbsp;</span>
622
+ <span class="cline-any cline-no">&nbsp;</span>
623
+ <span class="cline-any cline-no">&nbsp;</span>
624
+ <span class="cline-any cline-no">&nbsp;</span>
625
+ <span class="cline-any cline-no">&nbsp;</span>
626
+ <span class="cline-any cline-no">&nbsp;</span>
627
+ <span class="cline-any cline-no">&nbsp;</span>
628
+ <span class="cline-any cline-no">&nbsp;</span>
629
+ <span class="cline-any cline-no">&nbsp;</span>
630
+ <span class="cline-any cline-no">&nbsp;</span>
631
+ <span class="cline-any cline-no">&nbsp;</span>
632
+ <span class="cline-any cline-no">&nbsp;</span>
633
+ <span class="cline-any cline-no">&nbsp;</span>
634
+ <span class="cline-any cline-no">&nbsp;</span>
635
+ <span class="cline-any cline-no">&nbsp;</span>
636
+ <span class="cline-any cline-no">&nbsp;</span>
637
+ <span class="cline-any cline-no">&nbsp;</span>
638
+ <span class="cline-any cline-no">&nbsp;</span>
639
+ <span class="cline-any cline-no">&nbsp;</span>
640
+ <span class="cline-any cline-no">&nbsp;</span>
641
+ <span class="cline-any cline-no">&nbsp;</span>
642
+ <span class="cline-any cline-no">&nbsp;</span>
643
+ <span class="cline-any cline-no">&nbsp;</span>
644
+ <span class="cline-any cline-no">&nbsp;</span>
645
+ <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-no">&nbsp;</span>
648
+ <span class="cline-any cline-no">&nbsp;</span>
649
+ <span class="cline-any cline-no">&nbsp;</span>
650
+ <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-no">&nbsp;</span>
652
+ <span class="cline-any cline-no">&nbsp;</span>
653
+ <span class="cline-any cline-no">&nbsp;</span>
654
+ <span class="cline-any cline-no">&nbsp;</span>
655
+ <span class="cline-any cline-no">&nbsp;</span>
656
+ <span class="cline-any cline-no">&nbsp;</span>
657
+ <span class="cline-any cline-no">&nbsp;</span>
658
+ <span class="cline-any cline-no">&nbsp;</span>
659
+ <span class="cline-any cline-no">&nbsp;</span>
660
+ <span class="cline-any cline-no">&nbsp;</span>
661
+ <span class="cline-any cline-no">&nbsp;</span>
662
+ <span class="cline-any cline-no">&nbsp;</span>
663
+ <span class="cline-any cline-no">&nbsp;</span>
664
+ <span class="cline-any cline-no">&nbsp;</span>
665
+ <span class="cline-any cline-no">&nbsp;</span>
666
+ <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-no">&nbsp;</span>
668
+ <span class="cline-any cline-no">&nbsp;</span>
669
+ <span class="cline-any cline-no">&nbsp;</span>
670
+ <span class="cline-any cline-no">&nbsp;</span>
671
+ <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-no">&nbsp;</span>
673
+ <span class="cline-any cline-no">&nbsp;</span>
674
+ <span class="cline-any cline-no">&nbsp;</span>
675
+ <span class="cline-any cline-no">&nbsp;</span>
676
+ <span class="cline-any cline-no">&nbsp;</span>
677
+ <span class="cline-any cline-no">&nbsp;</span>
678
+ <span class="cline-any cline-no">&nbsp;</span>
679
+ <span class="cline-any cline-no">&nbsp;</span>
680
+ <span class="cline-any cline-no">&nbsp;</span>
681
+ <span class="cline-any cline-no">&nbsp;</span>
682
+ <span class="cline-any cline-no">&nbsp;</span>
683
+ <span class="cline-any cline-no">&nbsp;</span>
684
+ <span class="cline-any cline-no">&nbsp;</span>
685
+ <span class="cline-any cline-no">&nbsp;</span>
686
+ <span class="cline-any cline-no">&nbsp;</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
+ <span class="cline-any cline-no">&nbsp;</span>
689
+ <span class="cline-any cline-no">&nbsp;</span>
690
+ <span class="cline-any cline-no">&nbsp;</span>
691
+ <span class="cline-any cline-no">&nbsp;</span>
692
+ <span class="cline-any cline-no">&nbsp;</span>
693
+ <span class="cline-any cline-no">&nbsp;</span>
694
+ <span class="cline-any cline-no">&nbsp;</span>
695
+ <span class="cline-any cline-no">&nbsp;</span>
696
+ <span class="cline-any cline-no">&nbsp;</span>
697
+ <span class="cline-any cline-no">&nbsp;</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-no">&nbsp;</span>
700
+ <span class="cline-any cline-no">&nbsp;</span>
701
+ <span class="cline-any cline-no">&nbsp;</span>
702
+ <span class="cline-any cline-no">&nbsp;</span>
703
+ <span class="cline-any cline-no">&nbsp;</span>
704
+ <span class="cline-any cline-no">&nbsp;</span>
705
+ <span class="cline-any cline-no">&nbsp;</span>
706
+ <span class="cline-any cline-no">&nbsp;</span>
707
+ <span class="cline-any cline-no">&nbsp;</span>
708
+ <span class="cline-any cline-no">&nbsp;</span>
709
+ <span class="cline-any cline-no">&nbsp;</span>
710
+ <span class="cline-any cline-no">&nbsp;</span>
711
+ <span class="cline-any cline-no">&nbsp;</span>
712
+ <span class="cline-any cline-no">&nbsp;</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-no">&nbsp;</span>
716
+ <span class="cline-any cline-no">&nbsp;</span>
717
+ <span class="cline-any cline-no">&nbsp;</span>
718
+ <span class="cline-any cline-no">&nbsp;</span>
719
+ <span class="cline-any cline-no">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-no">&nbsp;</span>
722
+ <span class="cline-any cline-no">&nbsp;</span>
723
+ <span class="cline-any cline-no">&nbsp;</span>
724
+ <span class="cline-any cline-no">&nbsp;</span>
725
+ <span class="cline-any cline-no">&nbsp;</span>
726
+ <span class="cline-any cline-no">&nbsp;</span>
727
+ <span class="cline-any cline-no">&nbsp;</span>
728
+ <span class="cline-any cline-no">&nbsp;</span>
729
+ <span class="cline-any cline-no">&nbsp;</span>
730
+ <span class="cline-any cline-no">&nbsp;</span>
731
+ <span class="cline-any cline-no">&nbsp;</span>
732
+ <span class="cline-any cline-no">&nbsp;</span>
733
+ <span class="cline-any cline-no">&nbsp;</span>
734
+ <span class="cline-any cline-no">&nbsp;</span>
735
+ <span class="cline-any cline-no">&nbsp;</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-no">&nbsp;</span>
738
+ <span class="cline-any cline-no">&nbsp;</span>
739
+ <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-no">&nbsp;</span>
744
+ <span class="cline-any cline-no">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-no">&nbsp;</span>
748
+ <span class="cline-any cline-no">&nbsp;</span>
749
+ <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-no">&nbsp;</span>
751
+ <span class="cline-any cline-no">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-no">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
757
+ <span class="cstat-no" title="statement not covered" > * Release Manager</span>
758
+ <span class="cstat-no" title="statement not covered" > * Handles version bumping, changelog generation, and git tagging</span>
759
+ <span class="cstat-no" title="statement not covered" > */</span>
760
+ <span class="cstat-no" title="statement not covered" ></span>
761
+ <span class="cstat-no" title="statement not covered" >import { execSync } from 'child_process';</span>
762
+ <span class="cstat-no" title="statement not covered" >import { readFileSync, writeFileSync, existsSync } from 'fs';</span>
763
+ <span class="cstat-no" title="statement not covered" >import { join } from 'path';</span>
764
+ <span class="cstat-no" title="statement not covered" >import type {</span>
765
+ <span class="cstat-no" title="statement not covered" > ReleaseOptions,</span>
766
+ <span class="cstat-no" title="statement not covered" > ReleaseResult,</span>
767
+ <span class="cstat-no" title="statement not covered" > PackageInfo,</span>
768
+ <span class="cstat-no" title="statement not covered" > GitCommit,</span>
769
+ <span class="cstat-no" title="statement not covered" > ChangelogEntry,</span>
770
+ <span class="cstat-no" title="statement not covered" > VersionBumpType</span>
771
+ <span class="cstat-no" title="statement not covered" >} from './types.js';</span>
772
+ <span class="cstat-no" title="statement not covered" ></span>
773
+ <span class="cstat-no" title="statement not covered" >export class ReleaseManager {</span>
774
+ <span class="cstat-no" title="statement not covered" > private cwd: string;</span>
775
+ <span class="cstat-no" title="statement not covered" ></span>
776
+ <span class="cstat-no" title="statement not covered" > constructor(cwd: string = process.cwd()) {</span>
777
+ <span class="cstat-no" title="statement not covered" > this.cwd = cwd;</span>
778
+ <span class="cstat-no" title="statement not covered" > }</span>
779
+ <span class="cstat-no" title="statement not covered" ></span>
780
+ <span class="cstat-no" title="statement not covered" > /**</span>
781
+ <span class="cstat-no" title="statement not covered" > * Prepare a release with version bumping, changelog, and git tagging</span>
782
+ <span class="cstat-no" title="statement not covered" > */</span>
783
+ <span class="cstat-no" title="statement not covered" > async prepareRelease(options: ReleaseOptions = {}): Promise&lt;ReleaseResult&gt; {</span>
784
+ <span class="cstat-no" title="statement not covered" > const {</span>
785
+ <span class="cstat-no" title="statement not covered" > bumpType = 'patch',</span>
786
+ <span class="cstat-no" title="statement not covered" > version,</span>
787
+ <span class="cstat-no" title="statement not covered" > channel = 'latest',</span>
788
+ <span class="cstat-no" title="statement not covered" > generateChangelog = true,</span>
789
+ <span class="cstat-no" title="statement not covered" > createTag = true,</span>
790
+ <span class="cstat-no" title="statement not covered" > commit = true,</span>
791
+ <span class="cstat-no" title="statement not covered" > dryRun = false,</span>
792
+ <span class="cstat-no" title="statement not covered" > skipValidation = false,</span>
793
+ <span class="cstat-no" title="statement not covered" > tagPrefix = 'v',</span>
794
+ <span class="cstat-no" title="statement not covered" > changelogPath = 'CHANGELOG.md'</span>
795
+ <span class="cstat-no" title="statement not covered" > } = options;</span>
796
+ <span class="cstat-no" title="statement not covered" ></span>
797
+ <span class="cstat-no" title="statement not covered" > const result: ReleaseResult = {</span>
798
+ <span class="cstat-no" title="statement not covered" > oldVersion: '',</span>
799
+ <span class="cstat-no" title="statement not covered" > newVersion: '',</span>
800
+ <span class="cstat-no" title="statement not covered" > success: false,</span>
801
+ <span class="cstat-no" title="statement not covered" > warnings: []</span>
802
+ <span class="cstat-no" title="statement not covered" > };</span>
803
+ <span class="cstat-no" title="statement not covered" ></span>
804
+ <span class="cstat-no" title="statement not covered" > try {</span>
805
+ <span class="cstat-no" title="statement not covered" > // Read package.json</span>
806
+ <span class="cstat-no" title="statement not covered" > const pkgPath = join(this.cwd, 'package.json');</span>
807
+ <span class="cstat-no" title="statement not covered" > if (!existsSync(pkgPath)) {</span>
808
+ <span class="cstat-no" title="statement not covered" > throw new Error('package.json not found');</span>
809
+ <span class="cstat-no" title="statement not covered" > }</span>
810
+ <span class="cstat-no" title="statement not covered" ></span>
811
+ <span class="cstat-no" title="statement not covered" > const pkg: PackageInfo = JSON.parse(readFileSync(pkgPath, 'utf-8'));</span>
812
+ <span class="cstat-no" title="statement not covered" > result.oldVersion = pkg.version;</span>
813
+ <span class="cstat-no" title="statement not covered" ></span>
814
+ <span class="cstat-no" title="statement not covered" > // Check for uncommitted changes</span>
815
+ <span class="cstat-no" title="statement not covered" > if (!skipValidation) {</span>
816
+ <span class="cstat-no" title="statement not covered" > const gitStatus = this.execCommand('git status --porcelain', true);</span>
817
+ <span class="cstat-no" title="statement not covered" > if (gitStatus &amp;&amp; !dryRun) {</span>
818
+ <span class="cstat-no" title="statement not covered" > result.warnings?.push('Uncommitted changes detected');</span>
819
+ <span class="cstat-no" title="statement not covered" > }</span>
820
+ <span class="cstat-no" title="statement not covered" > }</span>
821
+ <span class="cstat-no" title="statement not covered" ></span>
822
+ <span class="cstat-no" title="statement not covered" > // Determine new version</span>
823
+ <span class="cstat-no" title="statement not covered" > result.newVersion = version || this.bumpVersion(pkg.version, bumpType, channel);</span>
824
+ <span class="cstat-no" title="statement not covered" ></span>
825
+ <span class="cstat-no" title="statement not covered" > // Generate changelog if requested</span>
826
+ <span class="cstat-no" title="statement not covered" > if (generateChangelog) {</span>
827
+ <span class="cstat-no" title="statement not covered" > const commits = this.getCommitsSinceLastTag();</span>
828
+ <span class="cstat-no" title="statement not covered" > const changelogEntry = this.generateChangelogEntry(result.newVersion, commits);</span>
829
+ <span class="cstat-no" title="statement not covered" > result.changelog = this.formatChangelogEntry(changelogEntry);</span>
830
+ <span class="cstat-no" title="statement not covered" ></span>
831
+ <span class="cstat-no" title="statement not covered" > if (!dryRun) {</span>
832
+ <span class="cstat-no" title="statement not covered" > this.updateChangelogFile(changelogPath, result.changelog);</span>
833
+ <span class="cstat-no" title="statement not covered" > }</span>
834
+ <span class="cstat-no" title="statement not covered" > }</span>
835
+ <span class="cstat-no" title="statement not covered" ></span>
836
+ <span class="cstat-no" title="statement not covered" > // Update package.json version</span>
837
+ <span class="cstat-no" title="statement not covered" > if (!dryRun) {</span>
838
+ <span class="cstat-no" title="statement not covered" > pkg.version = result.newVersion;</span>
839
+ <span class="cstat-no" title="statement not covered" > writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');</span>
840
+ <span class="cstat-no" title="statement not covered" > }</span>
841
+ <span class="cstat-no" title="statement not covered" ></span>
842
+ <span class="cstat-no" title="statement not covered" > // Create git commit</span>
843
+ <span class="cstat-no" title="statement not covered" > if (commit &amp;&amp; !dryRun) {</span>
844
+ <span class="cstat-no" title="statement not covered" > const commitMessage = `chore(release): ${result.newVersion}`;</span>
845
+ <span class="cstat-no" title="statement not covered" ></span>
846
+ <span class="cstat-no" title="statement not covered" > // Stage changes</span>
847
+ <span class="cstat-no" title="statement not covered" > this.execCommand(`git add package.json ${changelogPath}`);</span>
848
+ <span class="cstat-no" title="statement not covered" ></span>
849
+ <span class="cstat-no" title="statement not covered" > // Commit</span>
850
+ <span class="cstat-no" title="statement not covered" > this.execCommand(`git commit -m "${commitMessage}"`);</span>
851
+ <span class="cstat-no" title="statement not covered" ></span>
852
+ <span class="cstat-no" title="statement not covered" > result.commitHash = this.execCommand('git rev-parse HEAD', true).trim();</span>
853
+ <span class="cstat-no" title="statement not covered" > }</span>
854
+ <span class="cstat-no" title="statement not covered" ></span>
855
+ <span class="cstat-no" title="statement not covered" > // Create git tag</span>
856
+ <span class="cstat-no" title="statement not covered" > if (createTag &amp;&amp; !dryRun) {</span>
857
+ <span class="cstat-no" title="statement not covered" > result.tag = `${tagPrefix}${result.newVersion}`;</span>
858
+ <span class="cstat-no" title="statement not covered" > const tagMessage = `Release ${result.newVersion}`;</span>
859
+ <span class="cstat-no" title="statement not covered" > this.execCommand(`git tag -a ${result.tag} -m "${tagMessage}"`);</span>
860
+ <span class="cstat-no" title="statement not covered" > }</span>
861
+ <span class="cstat-no" title="statement not covered" ></span>
862
+ <span class="cstat-no" title="statement not covered" > result.success = true;</span>
863
+ <span class="cstat-no" title="statement not covered" > return result;</span>
864
+ <span class="cstat-no" title="statement not covered" ></span>
865
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
866
+ <span class="cstat-no" title="statement not covered" > result.error = error instanceof Error ? error.message : String(error);</span>
867
+ <span class="cstat-no" title="statement not covered" > return result;</span>
868
+ <span class="cstat-no" title="statement not covered" > }</span>
869
+ <span class="cstat-no" title="statement not covered" > }</span>
870
+ <span class="cstat-no" title="statement not covered" ></span>
871
+ <span class="cstat-no" title="statement not covered" > /**</span>
872
+ <span class="cstat-no" title="statement not covered" > * Bump version based on type</span>
873
+ <span class="cstat-no" title="statement not covered" > */</span>
874
+ <span class="cstat-no" title="statement not covered" > private bumpVersion(</span>
875
+ <span class="cstat-no" title="statement not covered" > currentVersion: string,</span>
876
+ <span class="cstat-no" title="statement not covered" > bumpType: VersionBumpType,</span>
877
+ <span class="cstat-no" title="statement not covered" > channel: string</span>
878
+ <span class="cstat-no" title="statement not covered" > ): string {</span>
879
+ <span class="cstat-no" title="statement not covered" > const versionMatch = currentVersion.match(/^(\d+)\.(\d+)\.(\d+)(?:-([a-z]+)\.(\d+))?$/);</span>
880
+ <span class="cstat-no" title="statement not covered" ></span>
881
+ <span class="cstat-no" title="statement not covered" > if (!versionMatch) {</span>
882
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Invalid version format: ${currentVersion}`);</span>
883
+ <span class="cstat-no" title="statement not covered" > }</span>
884
+ <span class="cstat-no" title="statement not covered" ></span>
885
+ <span class="cstat-no" title="statement not covered" > let [, major, minor, patch, prerelease, prereleaseNum] = versionMatch;</span>
886
+ <span class="cstat-no" title="statement not covered" > let newMajor = parseInt(major);</span>
887
+ <span class="cstat-no" title="statement not covered" > let newMinor = parseInt(minor);</span>
888
+ <span class="cstat-no" title="statement not covered" > let newPatch = parseInt(patch);</span>
889
+ <span class="cstat-no" title="statement not covered" > let newPrerelease: string | undefined = prerelease;</span>
890
+ <span class="cstat-no" title="statement not covered" > let newPrereleaseNum = prereleaseNum ? parseInt(prereleaseNum) : 0;</span>
891
+ <span class="cstat-no" title="statement not covered" ></span>
892
+ <span class="cstat-no" title="statement not covered" > switch (bumpType) {</span>
893
+ <span class="cstat-no" title="statement not covered" > case 'major':</span>
894
+ <span class="cstat-no" title="statement not covered" > newMajor++;</span>
895
+ <span class="cstat-no" title="statement not covered" > newMinor = 0;</span>
896
+ <span class="cstat-no" title="statement not covered" > newPatch = 0;</span>
897
+ <span class="cstat-no" title="statement not covered" > newPrerelease = undefined;</span>
898
+ <span class="cstat-no" title="statement not covered" > break;</span>
899
+ <span class="cstat-no" title="statement not covered" ></span>
900
+ <span class="cstat-no" title="statement not covered" > case 'minor':</span>
901
+ <span class="cstat-no" title="statement not covered" > newMinor++;</span>
902
+ <span class="cstat-no" title="statement not covered" > newPatch = 0;</span>
903
+ <span class="cstat-no" title="statement not covered" > newPrerelease = undefined;</span>
904
+ <span class="cstat-no" title="statement not covered" > break;</span>
905
+ <span class="cstat-no" title="statement not covered" ></span>
906
+ <span class="cstat-no" title="statement not covered" > case 'patch':</span>
907
+ <span class="cstat-no" title="statement not covered" > newPatch++;</span>
908
+ <span class="cstat-no" title="statement not covered" > newPrerelease = undefined;</span>
909
+ <span class="cstat-no" title="statement not covered" > break;</span>
910
+ <span class="cstat-no" title="statement not covered" ></span>
911
+ <span class="cstat-no" title="statement not covered" > case 'prerelease':</span>
912
+ <span class="cstat-no" title="statement not covered" > if (newPrerelease &amp;&amp; channel === newPrerelease) {</span>
913
+ <span class="cstat-no" title="statement not covered" > newPrereleaseNum++;</span>
914
+ <span class="cstat-no" title="statement not covered" > } else {</span>
915
+ <span class="cstat-no" title="statement not covered" > newPrereleaseNum = 1;</span>
916
+ <span class="cstat-no" title="statement not covered" > newPrerelease = channel;</span>
917
+ <span class="cstat-no" title="statement not covered" > }</span>
918
+ <span class="cstat-no" title="statement not covered" > break;</span>
919
+ <span class="cstat-no" title="statement not covered" > }</span>
920
+ <span class="cstat-no" title="statement not covered" ></span>
921
+ <span class="cstat-no" title="statement not covered" > let version = `${newMajor}.${newMinor}.${newPatch}`;</span>
922
+ <span class="cstat-no" title="statement not covered" > if (newPrerelease &amp;&amp; bumpType === 'prerelease') {</span>
923
+ <span class="cstat-no" title="statement not covered" > version += `-${newPrerelease}.${newPrereleaseNum}`;</span>
924
+ <span class="cstat-no" title="statement not covered" > }</span>
925
+ <span class="cstat-no" title="statement not covered" ></span>
926
+ <span class="cstat-no" title="statement not covered" > return version;</span>
927
+ <span class="cstat-no" title="statement not covered" > }</span>
928
+ <span class="cstat-no" title="statement not covered" ></span>
929
+ <span class="cstat-no" title="statement not covered" > /**</span>
930
+ <span class="cstat-no" title="statement not covered" > * Get git commits since last tag</span>
931
+ <span class="cstat-no" title="statement not covered" > */</span>
932
+ <span class="cstat-no" title="statement not covered" > private getCommitsSinceLastTag(): GitCommit[] {</span>
933
+ <span class="cstat-no" title="statement not covered" > try {</span>
934
+ <span class="cstat-no" title="statement not covered" > const lastTag = this.execCommand('git describe --tags --abbrev=0', true).trim();</span>
935
+ <span class="cstat-no" title="statement not covered" > const range = `${lastTag}..HEAD`;</span>
936
+ <span class="cstat-no" title="statement not covered" > return this.parseCommits(range);</span>
937
+ <span class="cstat-no" title="statement not covered" > } catch {</span>
938
+ <span class="cstat-no" title="statement not covered" > // No tags found, get all commits</span>
939
+ <span class="cstat-no" title="statement not covered" > return this.parseCommits('');</span>
940
+ <span class="cstat-no" title="statement not covered" > }</span>
941
+ <span class="cstat-no" title="statement not covered" > }</span>
942
+ <span class="cstat-no" title="statement not covered" ></span>
943
+ <span class="cstat-no" title="statement not covered" > /**</span>
944
+ <span class="cstat-no" title="statement not covered" > * Parse git commits</span>
945
+ <span class="cstat-no" title="statement not covered" > */</span>
946
+ <span class="cstat-no" title="statement not covered" > private parseCommits(range: string): GitCommit[] {</span>
947
+ <span class="cstat-no" title="statement not covered" > const format = '--pretty=format:%H%n%s%n%an%n%ai%n---COMMIT---';</span>
948
+ <span class="cstat-no" title="statement not covered" > const cmd = range</span>
949
+ <span class="cstat-no" title="statement not covered" > ? `git log ${range} ${format}`</span>
950
+ <span class="cstat-no" title="statement not covered" > : `git log ${format}`;</span>
951
+ <span class="cstat-no" title="statement not covered" ></span>
952
+ <span class="cstat-no" title="statement not covered" > const output = this.execCommand(cmd, true);</span>
953
+ <span class="cstat-no" title="statement not covered" > const commits: GitCommit[] = [];</span>
954
+ <span class="cstat-no" title="statement not covered" ></span>
955
+ <span class="cstat-no" title="statement not covered" > const commitBlocks = output.split('---COMMIT---').filter(Boolean);</span>
956
+ <span class="cstat-no" title="statement not covered" ></span>
957
+ <span class="cstat-no" title="statement not covered" > for (const block of commitBlocks) {</span>
958
+ <span class="cstat-no" title="statement not covered" > const lines = block.trim().split('\n');</span>
959
+ <span class="cstat-no" title="statement not covered" > if (lines.length &lt; 4) continue;</span>
960
+ <span class="cstat-no" title="statement not covered" ></span>
961
+ <span class="cstat-no" title="statement not covered" > const [hash, message, author, date] = lines;</span>
962
+ <span class="cstat-no" title="statement not covered" ></span>
963
+ <span class="cstat-no" title="statement not covered" > // Parse conventional commit format</span>
964
+ <span class="cstat-no" title="statement not covered" > const conventionalMatch = message.match(/^(\w+)(?:\(([^)]+)\))?: (.+)$/);</span>
965
+ <span class="cstat-no" title="statement not covered" ></span>
966
+ <span class="cstat-no" title="statement not covered" > commits.push({</span>
967
+ <span class="cstat-no" title="statement not covered" > hash: hash.trim(),</span>
968
+ <span class="cstat-no" title="statement not covered" > message: message.trim(),</span>
969
+ <span class="cstat-no" title="statement not covered" > author: author.trim(),</span>
970
+ <span class="cstat-no" title="statement not covered" > date: date.trim(),</span>
971
+ <span class="cstat-no" title="statement not covered" > type: conventionalMatch?.[1],</span>
972
+ <span class="cstat-no" title="statement not covered" > scope: conventionalMatch?.[2],</span>
973
+ <span class="cstat-no" title="statement not covered" > breaking: message.includes('BREAKING CHANGE')</span>
974
+ <span class="cstat-no" title="statement not covered" > });</span>
975
+ <span class="cstat-no" title="statement not covered" > }</span>
976
+ <span class="cstat-no" title="statement not covered" ></span>
977
+ <span class="cstat-no" title="statement not covered" > return commits;</span>
978
+ <span class="cstat-no" title="statement not covered" > }</span>
979
+ <span class="cstat-no" title="statement not covered" ></span>
980
+ <span class="cstat-no" title="statement not covered" > /**</span>
981
+ <span class="cstat-no" title="statement not covered" > * Generate changelog entry from commits</span>
982
+ <span class="cstat-no" title="statement not covered" > */</span>
983
+ <span class="cstat-no" title="statement not covered" > private generateChangelogEntry(version: string, commits: GitCommit[]): ChangelogEntry {</span>
984
+ <span class="cstat-no" title="statement not covered" > const entry: ChangelogEntry = {</span>
985
+ <span class="cstat-no" title="statement not covered" > version,</span>
986
+ <span class="cstat-no" title="statement not covered" > date: new Date().toISOString().split('T')[0],</span>
987
+ <span class="cstat-no" title="statement not covered" > changes: {</span>
988
+ <span class="cstat-no" title="statement not covered" > breaking: [],</span>
989
+ <span class="cstat-no" title="statement not covered" > features: [],</span>
990
+ <span class="cstat-no" title="statement not covered" > fixes: [],</span>
991
+ <span class="cstat-no" title="statement not covered" > chore: [],</span>
992
+ <span class="cstat-no" title="statement not covered" > docs: [],</span>
993
+ <span class="cstat-no" title="statement not covered" > other: []</span>
994
+ <span class="cstat-no" title="statement not covered" > }</span>
995
+ <span class="cstat-no" title="statement not covered" > };</span>
996
+ <span class="cstat-no" title="statement not covered" ></span>
997
+ <span class="cstat-no" title="statement not covered" > for (const commit of commits) {</span>
998
+ <span class="cstat-no" title="statement not covered" > const message = commit.scope</span>
999
+ <span class="cstat-no" title="statement not covered" > ? `**${commit.scope}**: ${commit.message.split(':').slice(1).join(':').trim()}`</span>
1000
+ <span class="cstat-no" title="statement not covered" > : commit.message;</span>
1001
+ <span class="cstat-no" title="statement not covered" ></span>
1002
+ <span class="cstat-no" title="statement not covered" > if (commit.breaking) {</span>
1003
+ <span class="cstat-no" title="statement not covered" > entry.changes.breaking?.push(message);</span>
1004
+ <span class="cstat-no" title="statement not covered" > } else if (commit.type === 'feat') {</span>
1005
+ <span class="cstat-no" title="statement not covered" > entry.changes.features?.push(message);</span>
1006
+ <span class="cstat-no" title="statement not covered" > } else if (commit.type === 'fix') {</span>
1007
+ <span class="cstat-no" title="statement not covered" > entry.changes.fixes?.push(message);</span>
1008
+ <span class="cstat-no" title="statement not covered" > } else if (commit.type === 'chore') {</span>
1009
+ <span class="cstat-no" title="statement not covered" > entry.changes.chore?.push(message);</span>
1010
+ <span class="cstat-no" title="statement not covered" > } else if (commit.type === 'docs') {</span>
1011
+ <span class="cstat-no" title="statement not covered" > entry.changes.docs?.push(message);</span>
1012
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1013
+ <span class="cstat-no" title="statement not covered" > entry.changes.other?.push(message);</span>
1014
+ <span class="cstat-no" title="statement not covered" > }</span>
1015
+ <span class="cstat-no" title="statement not covered" > }</span>
1016
+ <span class="cstat-no" title="statement not covered" ></span>
1017
+ <span class="cstat-no" title="statement not covered" > return entry;</span>
1018
+ <span class="cstat-no" title="statement not covered" > }</span>
1019
+ <span class="cstat-no" title="statement not covered" ></span>
1020
+ <span class="cstat-no" title="statement not covered" > /**</span>
1021
+ <span class="cstat-no" title="statement not covered" > * Format changelog entry as markdown</span>
1022
+ <span class="cstat-no" title="statement not covered" > */</span>
1023
+ <span class="cstat-no" title="statement not covered" > private formatChangelogEntry(entry: ChangelogEntry): string {</span>
1024
+ <span class="cstat-no" title="statement not covered" > let markdown = `## [${entry.version}] - ${entry.date}\n\n`;</span>
1025
+ <span class="cstat-no" title="statement not covered" ></span>
1026
+ <span class="cstat-no" title="statement not covered" > const sections = [</span>
1027
+ <span class="cstat-no" title="statement not covered" > { title: 'BREAKING CHANGES', items: entry.changes.breaking },</span>
1028
+ <span class="cstat-no" title="statement not covered" > { title: 'Features', items: entry.changes.features },</span>
1029
+ <span class="cstat-no" title="statement not covered" > { title: 'Bug Fixes', items: entry.changes.fixes },</span>
1030
+ <span class="cstat-no" title="statement not covered" > { title: 'Documentation', items: entry.changes.docs },</span>
1031
+ <span class="cstat-no" title="statement not covered" > { title: 'Chores', items: entry.changes.chore },</span>
1032
+ <span class="cstat-no" title="statement not covered" > { title: 'Other Changes', items: entry.changes.other }</span>
1033
+ <span class="cstat-no" title="statement not covered" > ];</span>
1034
+ <span class="cstat-no" title="statement not covered" ></span>
1035
+ <span class="cstat-no" title="statement not covered" > for (const section of sections) {</span>
1036
+ <span class="cstat-no" title="statement not covered" > if (section.items &amp;&amp; section.items.length &gt; 0) {</span>
1037
+ <span class="cstat-no" title="statement not covered" > markdown += `### ${section.title}\n\n`;</span>
1038
+ <span class="cstat-no" title="statement not covered" > for (const item of section.items) {</span>
1039
+ <span class="cstat-no" title="statement not covered" > markdown += `- ${item}\n`;</span>
1040
+ <span class="cstat-no" title="statement not covered" > }</span>
1041
+ <span class="cstat-no" title="statement not covered" > markdown += '\n';</span>
1042
+ <span class="cstat-no" title="statement not covered" > }</span>
1043
+ <span class="cstat-no" title="statement not covered" > }</span>
1044
+ <span class="cstat-no" title="statement not covered" ></span>
1045
+ <span class="cstat-no" title="statement not covered" > return markdown;</span>
1046
+ <span class="cstat-no" title="statement not covered" > }</span>
1047
+ <span class="cstat-no" title="statement not covered" ></span>
1048
+ <span class="cstat-no" title="statement not covered" > /**</span>
1049
+ <span class="cstat-no" title="statement not covered" > * Update CHANGELOG.md file</span>
1050
+ <span class="cstat-no" title="statement not covered" > */</span>
1051
+ <span class="cstat-no" title="statement not covered" > private updateChangelogFile(path: string, newEntry: string): void {</span>
1052
+ <span class="cstat-no" title="statement not covered" > const changelogPath = join(this.cwd, path);</span>
1053
+ <span class="cstat-no" title="statement not covered" > let content = '';</span>
1054
+ <span class="cstat-no" title="statement not covered" ></span>
1055
+ <span class="cstat-no" title="statement not covered" > if (existsSync(changelogPath)) {</span>
1056
+ <span class="cstat-no" title="statement not covered" > content = readFileSync(changelogPath, 'utf-8');</span>
1057
+ <span class="cstat-no" title="statement not covered" ></span>
1058
+ <span class="cstat-no" title="statement not covered" > // Insert after header</span>
1059
+ <span class="cstat-no" title="statement not covered" > const headerEnd = content.indexOf('\n\n') + 2;</span>
1060
+ <span class="cstat-no" title="statement not covered" > if (headerEnd &gt; 1) {</span>
1061
+ <span class="cstat-no" title="statement not covered" > content = content.slice(0, headerEnd) + newEntry + content.slice(headerEnd);</span>
1062
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1063
+ <span class="cstat-no" title="statement not covered" > content = newEntry + '\n' + content;</span>
1064
+ <span class="cstat-no" title="statement not covered" > }</span>
1065
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1066
+ <span class="cstat-no" title="statement not covered" > content = `# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n${newEntry}`;</span>
1067
+ <span class="cstat-no" title="statement not covered" > }</span>
1068
+ <span class="cstat-no" title="statement not covered" ></span>
1069
+ <span class="cstat-no" title="statement not covered" > writeFileSync(changelogPath, content);</span>
1070
+ <span class="cstat-no" title="statement not covered" > }</span>
1071
+ <span class="cstat-no" title="statement not covered" ></span>
1072
+ <span class="cstat-no" title="statement not covered" > /**</span>
1073
+ <span class="cstat-no" title="statement not covered" > * Execute command</span>
1074
+ <span class="cstat-no" title="statement not covered" > */</span>
1075
+ <span class="cstat-no" title="statement not covered" > private execCommand(cmd: string, returnOutput = false): string {</span>
1076
+ <span class="cstat-no" title="statement not covered" > try {</span>
1077
+ <span class="cstat-no" title="statement not covered" > const output = execSync(cmd, {</span>
1078
+ <span class="cstat-no" title="statement not covered" > cwd: this.cwd,</span>
1079
+ <span class="cstat-no" title="statement not covered" > encoding: 'utf-8',</span>
1080
+ <span class="cstat-no" title="statement not covered" > stdio: returnOutput ? 'pipe' : 'inherit'</span>
1081
+ <span class="cstat-no" title="statement not covered" > });</span>
1082
+ <span class="cstat-no" title="statement not covered" > return returnOutput ? output : '';</span>
1083
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1084
+ <span class="cstat-no" title="statement not covered" > if (returnOutput &amp;&amp; error instanceof Error) {</span>
1085
+ <span class="cstat-no" title="statement not covered" > return '';</span>
1086
+ <span class="cstat-no" title="statement not covered" > }</span>
1087
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1088
+ <span class="cstat-no" title="statement not covered" > }</span>
1089
+ <span class="cstat-no" title="statement not covered" > }</span>
1090
+ <span class="cstat-no" title="statement not covered" >}</span>
1091
+ <span class="cstat-no" title="statement not covered" ></span>
1092
+ <span class="cstat-no" title="statement not covered" >/**</span>
1093
+ <span class="cstat-no" title="statement not covered" > * Convenience function to prepare a release</span>
1094
+ <span class="cstat-no" title="statement not covered" > */</span>
1095
+ <span class="cstat-no" title="statement not covered" >export async function prepareRelease(</span>
1096
+ <span class="cstat-no" title="statement not covered" > options: ReleaseOptions = {}</span>
1097
+ <span class="cstat-no" title="statement not covered" >): Promise&lt;ReleaseResult&gt; {</span>
1098
+ <span class="cstat-no" title="statement not covered" > const manager = new ReleaseManager();</span>
1099
+ <span class="cstat-no" title="statement not covered" > return manager.prepareRelease(options);</span>
1100
+ <span class="cstat-no" title="statement not covered" >}</span>
1101
+ &nbsp;</pre></td></tr></table></pre>
1102
+
1103
+ <div class='push'></div><!-- for sticky footer -->
1104
+ </div><!-- /wrapper -->
1105
+ <div class='footer quiet pad2 space-top1 center small'>
1106
+ Code coverage generated by
1107
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1108
+ at 2026-01-05T21:16:58.098Z
1109
+ </div>
1110
+ <script src="prettify.js"></script>
1111
+ <script>
1112
+ window.onload = function () {
1113
+ prettyPrint();
1114
+ };
1115
+ </script>
1116
+ <script src="sorter.js"></script>
1117
+ <script src="block-navigation.js"></script>
1118
+ </body>
1119
+ </html>
1120
+