@md2do/core 0.3.0 → 0.5.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 (62) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +6 -6
  3. package/dist/index.d.mts +40 -10
  4. package/dist/index.d.ts +40 -10
  5. package/dist/index.js +59 -11
  6. package/dist/index.mjs +61 -12
  7. package/package.json +1 -1
  8. package/src/parser/index.ts +28 -5
  9. package/src/parser/patterns.ts +8 -5
  10. package/src/scanner/index.ts +17 -0
  11. package/src/types/index.ts +4 -0
  12. package/src/utils/dates.ts +58 -10
  13. package/coverage/base.css +0 -224
  14. package/coverage/block-navigation.js +0 -87
  15. package/coverage/coverage-final.json +0 -10
  16. package/coverage/favicon.png +0 -0
  17. package/coverage/index.html +0 -206
  18. package/coverage/lcov-report/base.css +0 -224
  19. package/coverage/lcov-report/block-navigation.js +0 -87
  20. package/coverage/lcov-report/favicon.png +0 -0
  21. package/coverage/lcov-report/index.html +0 -206
  22. package/coverage/lcov-report/prettify.css +0 -1
  23. package/coverage/lcov-report/prettify.js +0 -2
  24. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  25. package/coverage/lcov-report/sorter.js +0 -210
  26. package/coverage/lcov-report/src/filters/index.html +0 -116
  27. package/coverage/lcov-report/src/filters/index.ts.html +0 -1156
  28. package/coverage/lcov-report/src/index.html +0 -116
  29. package/coverage/lcov-report/src/index.ts.html +0 -157
  30. package/coverage/lcov-report/src/parser/index.html +0 -131
  31. package/coverage/lcov-report/src/parser/index.ts.html +0 -1102
  32. package/coverage/lcov-report/src/parser/patterns.ts.html +0 -661
  33. package/coverage/lcov-report/src/scanner/index.html +0 -116
  34. package/coverage/lcov-report/src/scanner/index.ts.html +0 -658
  35. package/coverage/lcov-report/src/sorting/index.html +0 -116
  36. package/coverage/lcov-report/src/sorting/index.ts.html +0 -736
  37. package/coverage/lcov-report/src/utils/dates.ts.html +0 -499
  38. package/coverage/lcov-report/src/utils/id.ts.html +0 -169
  39. package/coverage/lcov-report/src/utils/index.html +0 -131
  40. package/coverage/lcov-report/src/writer/index.html +0 -116
  41. package/coverage/lcov-report/src/writer/index.ts.html +0 -1093
  42. package/coverage/lcov.info +0 -2294
  43. package/coverage/prettify.css +0 -1
  44. package/coverage/prettify.js +0 -2
  45. package/coverage/sort-arrow-sprite.png +0 -0
  46. package/coverage/sorter.js +0 -210
  47. package/coverage/src/filters/index.html +0 -116
  48. package/coverage/src/filters/index.ts.html +0 -1156
  49. package/coverage/src/index.html +0 -116
  50. package/coverage/src/index.ts.html +0 -157
  51. package/coverage/src/parser/index.html +0 -131
  52. package/coverage/src/parser/index.ts.html +0 -1102
  53. package/coverage/src/parser/patterns.ts.html +0 -661
  54. package/coverage/src/scanner/index.html +0 -116
  55. package/coverage/src/scanner/index.ts.html +0 -658
  56. package/coverage/src/sorting/index.html +0 -116
  57. package/coverage/src/sorting/index.ts.html +0 -736
  58. package/coverage/src/utils/dates.ts.html +0 -499
  59. package/coverage/src/utils/id.ts.html +0 -169
  60. package/coverage/src/utils/index.html +0 -131
  61. package/coverage/src/writer/index.html +0 -116
  62. package/coverage/src/writer/index.ts.html +0 -1093
@@ -1,1093 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/writer/index.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/writer</a> index.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">93.75% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>315/336</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">86.04% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>37/43</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>3/3</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">93.75% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>315/336</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
403
- <span class="cline-any cline-yes">1x</span>
404
- <span class="cline-any cline-yes">1x</span>
405
- <span class="cline-any cline-yes">1x</span>
406
- <span class="cline-any cline-yes">1x</span>
407
- <span class="cline-any cline-yes">1x</span>
408
- <span class="cline-any cline-yes">1x</span>
409
- <span class="cline-any cline-yes">1x</span>
410
- <span class="cline-any cline-yes">1x</span>
411
- <span class="cline-any cline-yes">1x</span>
412
- <span class="cline-any cline-yes">1x</span>
413
- <span class="cline-any cline-yes">1x</span>
414
- <span class="cline-any cline-yes">1x</span>
415
- <span class="cline-any cline-yes">1x</span>
416
- <span class="cline-any cline-yes">1x</span>
417
- <span class="cline-any cline-yes">1x</span>
418
- <span class="cline-any cline-yes">1x</span>
419
- <span class="cline-any cline-yes">1x</span>
420
- <span class="cline-any cline-yes">1x</span>
421
- <span class="cline-any cline-yes">1x</span>
422
- <span class="cline-any cline-yes">1x</span>
423
- <span class="cline-any cline-yes">1x</span>
424
- <span class="cline-any cline-yes">1x</span>
425
- <span class="cline-any cline-yes">1x</span>
426
- <span class="cline-any cline-yes">1x</span>
427
- <span class="cline-any cline-yes">1x</span>
428
- <span class="cline-any cline-yes">1x</span>
429
- <span class="cline-any cline-yes">1x</span>
430
- <span class="cline-any cline-yes">1x</span>
431
- <span class="cline-any cline-yes">1x</span>
432
- <span class="cline-any cline-yes">1x</span>
433
- <span class="cline-any cline-yes">1x</span>
434
- <span class="cline-any cline-yes">1x</span>
435
- <span class="cline-any cline-yes">1x</span>
436
- <span class="cline-any cline-yes">1x</span>
437
- <span class="cline-any cline-yes">1x</span>
438
- <span class="cline-any cline-yes">1x</span>
439
- <span class="cline-any cline-yes">1x</span>
440
- <span class="cline-any cline-yes">1x</span>
441
- <span class="cline-any cline-yes">1x</span>
442
- <span class="cline-any cline-yes">1x</span>
443
- <span class="cline-any cline-yes">1x</span>
444
- <span class="cline-any cline-yes">1x</span>
445
- <span class="cline-any cline-yes">1x</span>
446
- <span class="cline-any cline-yes">1x</span>
447
- <span class="cline-any cline-yes">1x</span>
448
- <span class="cline-any cline-yes">1x</span>
449
- <span class="cline-any cline-yes">1x</span>
450
- <span class="cline-any cline-yes">1x</span>
451
- <span class="cline-any cline-yes">1x</span>
452
- <span class="cline-any cline-yes">1x</span>
453
- <span class="cline-any cline-yes">1x</span>
454
- <span class="cline-any cline-yes">1x</span>
455
- <span class="cline-any cline-yes">1x</span>
456
- <span class="cline-any cline-yes">1x</span>
457
- <span class="cline-any cline-yes">1x</span>
458
- <span class="cline-any cline-yes">1x</span>
459
- <span class="cline-any cline-yes">1x</span>
460
- <span class="cline-any cline-yes">7x</span>
461
- <span class="cline-any cline-yes">7x</span>
462
- <span class="cline-any cline-yes">7x</span>
463
- <span class="cline-any cline-yes">7x</span>
464
- <span class="cline-any cline-yes">7x</span>
465
- <span class="cline-any cline-yes">7x</span>
466
- <span class="cline-any cline-yes">7x</span>
467
- <span class="cline-any cline-yes">7x</span>
468
- <span class="cline-any cline-yes">6x</span>
469
- <span class="cline-any cline-yes">6x</span>
470
- <span class="cline-any cline-yes">6x</span>
471
- <span class="cline-any cline-yes">7x</span>
472
- <span class="cline-any cline-yes">1x</span>
473
- <span class="cline-any cline-yes">1x</span>
474
- <span class="cline-any cline-yes">1x</span>
475
- <span class="cline-any cline-yes">1x</span>
476
- <span class="cline-any cline-yes">1x</span>
477
- <span class="cline-any cline-yes">5x</span>
478
- <span class="cline-any cline-yes">5x</span>
479
- <span class="cline-any cline-yes">5x</span>
480
- <span class="cline-any cline-yes">5x</span>
481
- <span class="cline-any cline-yes">5x</span>
482
- <span class="cline-any cline-yes">5x</span>
483
- <span class="cline-any cline-yes">7x</span>
484
- <span class="cline-any cline-yes">1x</span>
485
- <span class="cline-any cline-yes">1x</span>
486
- <span class="cline-any cline-yes">1x</span>
487
- <span class="cline-any cline-yes">1x</span>
488
- <span class="cline-any cline-yes">1x</span>
489
- <span class="cline-any cline-yes">4x</span>
490
- <span class="cline-any cline-yes">4x</span>
491
- <span class="cline-any cline-yes">4x</span>
492
- <span class="cline-any cline-yes">4x</span>
493
- <span class="cline-any cline-yes">7x</span>
494
- <span class="cline-any cline-yes">1x</span>
495
- <span class="cline-any cline-yes">1x</span>
496
- <span class="cline-any cline-yes">7x</span>
497
- <span class="cline-any cline-yes">3x</span>
498
- <span class="cline-any cline-yes">3x</span>
499
- <span class="cline-any cline-yes">3x</span>
500
- <span class="cline-any cline-yes">3x</span>
501
- <span class="cline-any cline-yes">2x</span>
502
- <span class="cline-any cline-yes">2x</span>
503
- <span class="cline-any cline-yes">2x</span>
504
- <span class="cline-any cline-yes">1x</span>
505
- <span class="cline-any cline-yes">1x</span>
506
- <span class="cline-any cline-yes">1x</span>
507
- <span class="cline-any cline-yes">1x</span>
508
- <span class="cline-any cline-yes">2x</span>
509
- <span class="cline-any cline-yes">3x</span>
510
- <span class="cline-any cline-yes">3x</span>
511
- <span class="cline-any cline-yes">1x</span>
512
- <span class="cline-any cline-yes">1x</span>
513
- <span class="cline-any cline-yes">1x</span>
514
- <span class="cline-any cline-yes">1x</span>
515
- <span class="cline-any cline-yes">1x</span>
516
- <span class="cline-any cline-yes">1x</span>
517
- <span class="cline-any cline-yes">3x</span>
518
- <span class="cline-any cline-yes">4x</span>
519
- <span class="cline-any cline-yes">4x</span>
520
- <span class="cline-any cline-yes">4x</span>
521
- <span class="cline-any cline-yes">4x</span>
522
- <span class="cline-any cline-yes">4x</span>
523
- <span class="cline-any cline-yes">4x</span>
524
- <span class="cline-any cline-yes">4x</span>
525
- <span class="cline-any cline-yes">4x</span>
526
- <span class="cline-any cline-yes">4x</span>
527
- <span class="cline-any cline-yes">4x</span>
528
- <span class="cline-any cline-yes">4x</span>
529
- <span class="cline-any cline-yes">4x</span>
530
- <span class="cline-any cline-yes">4x</span>
531
- <span class="cline-any cline-yes">4x</span>
532
- <span class="cline-any cline-yes">4x</span>
533
- <span class="cline-any cline-yes">4x</span>
534
- <span class="cline-any cline-yes">4x</span>
535
- <span class="cline-any cline-yes">4x</span>
536
- <span class="cline-any cline-yes">4x</span>
537
- <span class="cline-any cline-yes">4x</span>
538
- <span class="cline-any cline-yes">4x</span>
539
- <span class="cline-any cline-yes">4x</span>
540
- <span class="cline-any cline-yes">4x</span>
541
- <span class="cline-any cline-yes">4x</span>
542
- <span class="cline-any cline-yes">4x</span>
543
- <span class="cline-any cline-yes">7x</span>
544
- <span class="cline-any cline-yes">1x</span>
545
- <span class="cline-any cline-yes">1x</span>
546
- <span class="cline-any cline-yes">1x</span>
547
- <span class="cline-any cline-yes">1x</span>
548
- <span class="cline-any cline-yes">1x</span>
549
- <span class="cline-any cline-yes">7x</span>
550
- <span class="cline-any cline-yes">1x</span>
551
- <span class="cline-any cline-yes">1x</span>
552
- <span class="cline-any cline-yes">1x</span>
553
- <span class="cline-any cline-yes">1x</span>
554
- <span class="cline-any cline-yes">1x</span>
555
- <span class="cline-any cline-yes">3x</span>
556
- <span class="cline-any cline-yes">3x</span>
557
- <span class="cline-any cline-yes">3x</span>
558
- <span class="cline-any cline-yes">3x</span>
559
- <span class="cline-any cline-yes">3x</span>
560
- <span class="cline-any cline-yes">3x</span>
561
- <span class="cline-any cline-yes">3x</span>
562
- <span class="cline-any cline-yes">3x</span>
563
- <span class="cline-any cline-yes">3x</span>
564
- <span class="cline-any cline-yes">3x</span>
565
- <span class="cline-any cline-yes">3x</span>
566
- <span class="cline-any cline-yes">3x</span>
567
- <span class="cline-any cline-yes">3x</span>
568
- <span class="cline-any cline-yes">3x</span>
569
- <span class="cline-any cline-yes">3x</span>
570
- <span class="cline-any cline-yes">3x</span>
571
- <span class="cline-any cline-yes">3x</span>
572
- <span class="cline-any cline-yes">3x</span>
573
- <span class="cline-any cline-yes">3x</span>
574
- <span class="cline-any cline-yes">3x</span>
575
- <span class="cline-any cline-yes">3x</span>
576
- <span class="cline-any cline-yes">3x</span>
577
- <span class="cline-any cline-yes">3x</span>
578
- <span class="cline-any cline-yes">3x</span>
579
- <span class="cline-any cline-yes">6x</span>
580
- <span class="cline-any cline-yes">6x</span>
581
- <span class="cline-any cline-yes">6x</span>
582
- <span class="cline-any cline-yes">6x</span>
583
- <span class="cline-any cline-yes">1x</span>
584
- <span class="cline-any cline-yes">1x</span>
585
- <span class="cline-any cline-yes">1x</span>
586
- <span class="cline-any cline-yes">1x</span>
587
- <span class="cline-any cline-yes">1x</span>
588
- <span class="cline-any cline-yes">1x</span>
589
- <span class="cline-any cline-yes">5x</span>
590
- <span class="cline-any cline-yes">5x</span>
591
- <span class="cline-any cline-yes">5x</span>
592
- <span class="cline-any cline-yes">5x</span>
593
- <span class="cline-any cline-yes">5x</span>
594
- <span class="cline-any cline-yes">6x</span>
595
- <span class="cline-any cline-yes">1x</span>
596
- <span class="cline-any cline-yes">1x</span>
597
- <span class="cline-any cline-yes">1x</span>
598
- <span class="cline-any cline-yes">1x</span>
599
- <span class="cline-any cline-yes">1x</span>
600
- <span class="cline-any cline-yes">1x</span>
601
- <span class="cline-any cline-yes">4x</span>
602
- <span class="cline-any cline-yes">4x</span>
603
- <span class="cline-any cline-yes">4x</span>
604
- <span class="cline-any cline-yes">4x</span>
605
- <span class="cline-any cline-yes">6x</span>
606
- <span class="cline-any cline-no">&nbsp;</span>
607
- <span class="cline-any cline-yes">6x</span>
608
- <span class="cline-any cline-yes">4x</span>
609
- <span class="cline-any cline-yes">3x</span>
610
- <span class="cline-any cline-yes">3x</span>
611
- <span class="cline-any cline-yes">3x</span>
612
- <span class="cline-any cline-yes">3x</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-yes">3x</span>
616
- <span class="cline-any cline-yes">4x</span>
617
- <span class="cline-any cline-yes">4x</span>
618
- <span class="cline-any cline-yes">1x</span>
619
- <span class="cline-any cline-yes">1x</span>
620
- <span class="cline-any cline-yes">1x</span>
621
- <span class="cline-any cline-yes">1x</span>
622
- <span class="cline-any cline-yes">1x</span>
623
- <span class="cline-any cline-yes">4x</span>
624
- <span class="cline-any cline-yes">4x</span>
625
- <span class="cline-any cline-yes">4x</span>
626
- <span class="cline-any cline-yes">4x</span>
627
- <span class="cline-any cline-yes">4x</span>
628
- <span class="cline-any cline-yes">3x</span>
629
- <span class="cline-any cline-yes">3x</span>
630
- <span class="cline-any cline-yes">3x</span>
631
- <span class="cline-any cline-yes">3x</span>
632
- <span class="cline-any cline-yes">3x</span>
633
- <span class="cline-any cline-yes">3x</span>
634
- <span class="cline-any cline-yes">3x</span>
635
- <span class="cline-any cline-yes">3x</span>
636
- <span class="cline-any cline-yes">3x</span>
637
- <span class="cline-any cline-yes">3x</span>
638
- <span class="cline-any cline-yes">3x</span>
639
- <span class="cline-any cline-yes">3x</span>
640
- <span class="cline-any cline-yes">3x</span>
641
- <span class="cline-any cline-yes">3x</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-yes">3x</span>
654
- <span class="cline-any cline-yes">1x</span>
655
- <span class="cline-any cline-yes">1x</span>
656
- <span class="cline-any cline-yes">1x</span>
657
- <span class="cline-any cline-yes">1x</span>
658
- <span class="cline-any cline-yes">5x</span>
659
- <span class="cline-any cline-yes">5x</span>
660
- <span class="cline-any cline-yes">5x</span>
661
- <span class="cline-any cline-yes">5x</span>
662
- <span class="cline-any cline-yes">5x</span>
663
- <span class="cline-any cline-yes">5x</span>
664
- <span class="cline-any cline-yes">5x</span>
665
- <span class="cline-any cline-yes">5x</span>
666
- <span class="cline-any cline-yes">5x</span>
667
- <span class="cline-any cline-yes">5x</span>
668
- <span class="cline-any cline-yes">5x</span>
669
- <span class="cline-any cline-yes">5x</span>
670
- <span class="cline-any cline-yes">5x</span>
671
- <span class="cline-any cline-yes">5x</span>
672
- <span class="cline-any cline-yes">5x</span>
673
- <span class="cline-any cline-yes">5x</span>
674
- <span class="cline-any cline-yes">5x</span>
675
- <span class="cline-any cline-yes">5x</span>
676
- <span class="cline-any cline-yes">5x</span>
677
- <span class="cline-any cline-yes">5x</span>
678
- <span class="cline-any cline-yes">5x</span>
679
- <span class="cline-any cline-yes">5x</span>
680
- <span class="cline-any cline-yes">5x</span>
681
- <span class="cline-any cline-yes">5x</span>
682
- <span class="cline-any cline-yes">5x</span>
683
- <span class="cline-any cline-yes">1x</span>
684
- <span class="cline-any cline-yes">1x</span>
685
- <span class="cline-any cline-yes">1x</span>
686
- <span class="cline-any cline-yes">1x</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-yes">1x</span>
690
- <span class="cline-any cline-yes">5x</span>
691
- <span class="cline-any cline-yes">5x</span>
692
- <span class="cline-any cline-yes">5x</span>
693
- <span class="cline-any cline-yes">5x</span>
694
- <span class="cline-any cline-yes">5x</span>
695
- <span class="cline-any cline-yes">2x</span>
696
- <span class="cline-any cline-yes">2x</span>
697
- <span class="cline-any cline-yes">1x</span>
698
- <span class="cline-any cline-yes">1x</span>
699
- <span class="cline-any cline-yes">1x</span>
700
- <span class="cline-any cline-yes">1x</span>
701
- <span class="cline-any cline-yes">1x</span>
702
- <span class="cline-any cline-yes">1x</span>
703
- <span class="cline-any cline-yes">5x</span>
704
- <span class="cline-any cline-yes">3x</span>
705
- <span class="cline-any cline-yes">3x</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">3x</span>
709
- <span class="cline-any cline-yes">3x</span>
710
- <span class="cline-any cline-yes">4x</span>
711
- <span class="cline-any cline-yes">4x</span>
712
- <span class="cline-any cline-yes">4x</span>
713
- <span class="cline-any cline-yes">4x</span>
714
- <span class="cline-any cline-yes">4x</span>
715
- <span class="cline-any cline-yes">4x</span>
716
- <span class="cline-any cline-yes">4x</span>
717
- <span class="cline-any cline-yes">4x</span>
718
- <span class="cline-any cline-yes">4x</span>
719
- <span class="cline-any cline-yes">5x</span>
720
- <span class="cline-any cline-yes">5x</span>
721
- <span class="cline-any cline-yes">5x</span>
722
- <span class="cline-any cline-yes">5x</span>
723
- <span class="cline-any cline-yes">5x</span>
724
- <span class="cline-any cline-yes">5x</span>
725
- <span class="cline-any cline-yes">5x</span>
726
- <span class="cline-any cline-yes">5x</span>
727
- <span class="cline-any cline-yes">4x</span>
728
- <span class="cline-any cline-yes">4x</span>
729
- <span class="cline-any cline-yes">4x</span>
730
- <span class="cline-any cline-yes">4x</span>
731
- <span class="cline-any cline-yes">5x</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-yes">5x</span>
738
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as fs from 'fs/promises';
739
- import { TASK_CHECKBOX } from '../parser/patterns.js';
740
- import { parseTask } from '../parser/index.js';
741
- import type { Task } from '../types/index.js';
742
- &nbsp;
743
- export interface UpdateTaskOptions {
744
- /**
745
- * Path to the markdown file
746
- */
747
- file: string;
748
- &nbsp;
749
- /**
750
- * Line number (1-indexed) of the task to update
751
- */
752
- line: number;
753
- &nbsp;
754
- /**
755
- * Updates to apply to the task
756
- */
757
- updates: {
758
- /**
759
- * Mark task as completed or incomplete
760
- */
761
- completed?: boolean;
762
- &nbsp;
763
- /**
764
- * Update the task text
765
- */
766
- text?: string;
767
- &nbsp;
768
- /**
769
- * Replace the entire line
770
- */
771
- replaceLine?: string;
772
- };
773
- }
774
- &nbsp;
775
- export interface WriteTaskResult {
776
- /**
777
- * Whether the task was successfully updated
778
- */
779
- success: boolean;
780
- &nbsp;
781
- /**
782
- * The updated task (after changes)
783
- */
784
- task?: Task;
785
- &nbsp;
786
- /**
787
- * Error message if update failed
788
- */
789
- error?: string;
790
- }
791
- &nbsp;
792
- /**
793
- * Update a task in a markdown file
794
- * This performs an atomic write using a temporary file
795
- */
796
- export async function updateTask(
797
- options: UpdateTaskOptions,
798
- ): Promise&lt;WriteTaskResult&gt; {
799
- const { file, line, updates } = options;
800
- &nbsp;
801
- try {
802
- // Read the file
803
- const content = await fs.readFile(file, 'utf-8');
804
- const lines = content.split('\n');
805
- &nbsp;
806
- // Validate line number
807
- if (line &lt; 1 || line &gt; lines.length) {
808
- return {
809
- success: false,
810
- error: `Invalid line number ${line}. File has ${lines.length} lines.`,
811
- };
812
- }
813
- &nbsp;
814
- // Get the target line (convert from 1-indexed to 0-indexed)
815
- const lineIndex = line - 1;
816
- const originalLine = lines[lineIndex];
817
- &nbsp;
818
- // Validate that it's a task
819
- if (!originalLine || !TASK_CHECKBOX.test(originalLine)) {
820
- return {
821
- success: false,
822
- error: `Line ${line} is not a task: ${originalLine}`,
823
- };
824
- }
825
- &nbsp;
826
- // Apply updates
827
- let updatedLine: string;
828
- &nbsp;
829
- if (updates.replaceLine !== undefined) {
830
- // Replace the entire line
831
- updatedLine = updates.replaceLine;
832
- } else {
833
- // Apply individual updates
834
- updatedLine = originalLine;
835
- &nbsp;
836
- if (updates.completed !== undefined) {
837
- // Update completion status
838
- const isCurrentlyCompleted = /- \[x\]/i.test(updatedLine);
839
- if (updates.completed &amp;&amp; !isCurrentlyCompleted) {
840
- updatedLine = updatedLine.replace(/- \[ \]/, '- [x]');
841
- } else if (!updates.completed &amp;&amp; isCurrentlyCompleted) {
842
- updatedLine = updatedLine.replace(/- \[x\]/i, '- [ ]');
843
- }
844
- }
845
- &nbsp;
846
- if (updates.text !== undefined) {
847
- // Replace task text while preserving checkbox
848
- const checkboxMatch = updatedLine.match(/^(\s*- \[[x ]\]\s*)/i);
849
- if (checkboxMatch) {
850
- updatedLine = checkboxMatch[1] + updates.text;
851
- }
852
- }
853
- }
854
- &nbsp;
855
- // Update the line in the array
856
- lines[lineIndex] = updatedLine;
857
- &nbsp;
858
- // Write to temporary file first (atomic write)
859
- const tempFile = `${file}.md2do.tmp`;
860
- const newContent = lines.join('\n');
861
- &nbsp;
862
- await fs.writeFile(tempFile, newContent, 'utf-8');
863
- &nbsp;
864
- // Rename temp file to original (atomic on most filesystems)
865
- await fs.rename(tempFile, file);
866
- &nbsp;
867
- // Parse the updated task
868
- const parseResult = parseTask(updatedLine, line, file, {});
869
- &nbsp;
870
- const result: WriteTaskResult = {
871
- success: true,
872
- };
873
- &nbsp;
874
- if (parseResult.task) {
875
- result.task = parseResult.task;
876
- }
877
- &nbsp;
878
- return result;
879
- } catch (error) {
880
- return {
881
- success: false,
882
- error: `Failed to update task: ${error instanceof Error ? error.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(error)}</span>`,
883
- };
884
- }
885
- }
886
- &nbsp;
887
- /**
888
- * Batch update multiple tasks in a file
889
- * More efficient than calling updateTask multiple times
890
- */
891
- export async function updateTasks(
892
- file: string,
893
- updates: Array&lt;{
894
- line: number;
895
- updates: UpdateTaskOptions['updates'];
896
- }&gt;,
897
- ): Promise&lt;{
898
- success: boolean;
899
- updatedCount: number;
900
- errors: Array&lt;{ line: number; error: string }&gt;;
901
- }&gt; {
902
- try {
903
- // Read the file once
904
- const content = await fs.readFile(file, 'utf-8');
905
- const lines = content.split('\n');
906
- &nbsp;
907
- const errors: Array&lt;{ line: number; error: string }&gt; = [];
908
- let updatedCount = 0;
909
- &nbsp;
910
- // Sort updates by line number to process in order
911
- const sortedUpdates = [...updates].sort((a, b) =&gt; a.line - b.line);
912
- &nbsp;
913
- // Apply all updates
914
- for (const update of sortedUpdates) {
915
- const { line: lineNumber, updates: taskUpdates } = update;
916
- &nbsp;
917
- // Validate line number
918
- if (lineNumber &lt; 1 || lineNumber &gt; lines.length) {
919
- errors.push({
920
- line: lineNumber,
921
- error: `Invalid line number ${lineNumber}`,
922
- });
923
- continue;
924
- }
925
- &nbsp;
926
- const lineIndex = lineNumber - 1;
927
- const originalLine = lines[lineIndex];
928
- &nbsp;
929
- // Validate that it's a task
930
- if (!originalLine || !TASK_CHECKBOX.test(originalLine)) {
931
- errors.push({
932
- line: lineNumber,
933
- error: `Line ${lineNumber} is not a task`,
934
- });
935
- continue;
936
- }
937
- &nbsp;
938
- // Apply updates
939
- let updatedLine = originalLine;
940
- &nbsp;
941
- if (taskUpdates.replaceLine !== undefined) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
942
- <span class="cstat-no" title="statement not covered" > updatedLine = taskUpdates.replaceLine;</span>
943
- } else {
944
- if (taskUpdates.completed !== undefined) {
945
- const isCurrentlyCompleted = /- \[x\]/i.test(updatedLine);
946
- if (taskUpdates.completed &amp;&amp; !isCurrentlyCompleted) {
947
- updatedLine = updatedLine.replace(/- \[ \]/, '- [x]');
948
- <span class="branch-0 cbranch-no" title="branch not covered" > } else if (!taskUpdates.completed &amp;&amp; isCurrentlyCompleted) {</span>
949
- <span class="cstat-no" title="statement not covered" > updatedLine = updatedLine.replace(/- \[x\]/i, '- [ ]');</span>
950
- <span class="cstat-no" title="statement not covered" > }</span>
951
- }
952
- &nbsp;
953
- if (taskUpdates.text !== undefined) {
954
- const checkboxMatch = updatedLine.match(/^(\s*- \[[x ]\]\s*)/i);
955
- if (checkboxMatch) {
956
- updatedLine = checkboxMatch[1] + taskUpdates.text;
957
- }
958
- }
959
- }
960
- &nbsp;
961
- lines[lineIndex] = updatedLine;
962
- updatedCount++;
963
- }
964
- &nbsp;
965
- // Write atomically
966
- const tempFile = `${file}.md2do.tmp`;
967
- const newContent = lines.join('\n');
968
- &nbsp;
969
- await fs.writeFile(tempFile, newContent, 'utf-8');
970
- await fs.rename(tempFile, file);
971
- &nbsp;
972
- return {
973
- success: errors.length === 0,
974
- updatedCount,
975
- errors,
976
- };
977
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
978
- <span class="cstat-no" title="statement not covered" > return {</span>
979
- <span class="cstat-no" title="statement not covered" > success: false,</span>
980
- <span class="cstat-no" title="statement not covered" > updatedCount: 0,</span>
981
- <span class="cstat-no" title="statement not covered" > errors: [</span>
982
- <span class="cstat-no" title="statement not covered" > {</span>
983
- <span class="cstat-no" title="statement not covered" > line: 0,</span>
984
- <span class="cstat-no" title="statement not covered" > error: `Failed to update tasks: ${error instanceof Error ? error.message : String(error)}`,</span>
985
- <span class="cstat-no" title="statement not covered" > },</span>
986
- <span class="cstat-no" title="statement not covered" > ],</span>
987
- <span class="cstat-no" title="statement not covered" > };</span>
988
- <span class="cstat-no" title="statement not covered" > }</span>
989
- }
990
- &nbsp;
991
- /**
992
- * Add a task to a markdown file
993
- */
994
- export async function addTask(
995
- file: string,
996
- text: string,
997
- options: {
998
- /**
999
- * Line number to insert at (1-indexed)
1000
- * If not specified, appends to end of file
1001
- */
1002
- line?: number;
1003
- &nbsp;
1004
- /**
1005
- * Whether the task is completed
1006
- */
1007
- completed?: boolean;
1008
- } = {},
1009
- ): Promise&lt;WriteTaskResult&gt; {
1010
- try {
1011
- const checkbox = options.completed ? '- [x]' : '- [ ]';
1012
- const taskLine = `${checkbox} ${text}`;
1013
- &nbsp;
1014
- // Read existing content
1015
- let content: string;
1016
- try {
1017
- content = await fs.readFile(file, 'utf-8');
1018
- } catch (error) {
1019
- // File doesn't exist, create it
1020
- if ((error as NodeJS.ErrnoException).code === 'ENOENT') {
1021
- content = '';
1022
- <span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
1023
- <span class="cstat-no" title="statement not covered" > throw error;</span>
1024
- <span class="cstat-no" title="statement not covered" > }</span>
1025
- }
1026
- &nbsp;
1027
- const lines = content.split('\n');
1028
- &nbsp;
1029
- // Insert the task
1030
- if (options.line !== undefined) {
1031
- // Validate line number
1032
- if (options.line &lt; 1 || options.line &gt; lines.length + 1) {
1033
- return {
1034
- success: false,
1035
- error: `Invalid line number ${options.line}`,
1036
- };
1037
- }
1038
- lines.splice(options.line - 1, 0, taskLine);
1039
- } else {
1040
- // Append to end
1041
- if (content.length &gt; 0 &amp;&amp; !content.endsWith('\n')) {
1042
- lines.push('');
1043
- }
1044
- lines.push(taskLine);
1045
- }
1046
- &nbsp;
1047
- // Write atomically
1048
- const tempFile = `${file}.md2do.tmp`;
1049
- const newContent = lines.join('\n');
1050
- &nbsp;
1051
- await fs.writeFile(tempFile, newContent, 'utf-8');
1052
- await fs.rename(tempFile, file);
1053
- &nbsp;
1054
- // Parse the new task
1055
- const insertedLine = options.line ?? lines.length;
1056
- const parseResult = parseTask(taskLine, insertedLine, file, {});
1057
- &nbsp;
1058
- const result: WriteTaskResult = {
1059
- success: true,
1060
- };
1061
- &nbsp;
1062
- if (parseResult.task) {
1063
- result.task = parseResult.task;
1064
- }
1065
- &nbsp;
1066
- return result;
1067
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
1068
- <span class="cstat-no" title="statement not covered" > return {</span>
1069
- <span class="cstat-no" title="statement not covered" > success: false,</span>
1070
- <span class="cstat-no" title="statement not covered" > error: `Failed to add task: ${error instanceof Error ? error.message : String(error)}`,</span>
1071
- <span class="cstat-no" title="statement not covered" > };</span>
1072
- <span class="cstat-no" title="statement not covered" > }</span>
1073
- }
1074
- &nbsp;</pre></td></tr></table></pre>
1075
-
1076
- <div class='push'></div><!-- for sticky footer -->
1077
- </div><!-- /wrapper -->
1078
- <div class='footer quiet pad2 space-top1 center small'>
1079
- Code coverage generated by
1080
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1081
- at 2026-01-26T03:50:53.053Z
1082
- </div>
1083
- <script src="../../prettify.js"></script>
1084
- <script>
1085
- window.onload = function () {
1086
- prettyPrint();
1087
- };
1088
- </script>
1089
- <script src="../../sorter.js"></script>
1090
- <script src="../../block-navigation.js"></script>
1091
- </body>
1092
- </html>
1093
-