@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,658 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/scanner/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/scanner</a> index.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">100% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>191/191</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>23/23</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'>4/4</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>191/191</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
258
- <span class="cline-any cline-yes">1x</span>
259
- <span class="cline-any cline-yes">1x</span>
260
- <span class="cline-any cline-yes">1x</span>
261
- <span class="cline-any cline-yes">1x</span>
262
- <span class="cline-any cline-yes">1x</span>
263
- <span class="cline-any cline-yes">1x</span>
264
- <span class="cline-any cline-yes">1x</span>
265
- <span class="cline-any cline-yes">1x</span>
266
- <span class="cline-any cline-yes">1x</span>
267
- <span class="cline-any cline-yes">1x</span>
268
- <span class="cline-any cline-yes">1x</span>
269
- <span class="cline-any cline-yes">1x</span>
270
- <span class="cline-any cline-yes">1x</span>
271
- <span class="cline-any cline-yes">1x</span>
272
- <span class="cline-any cline-yes">1x</span>
273
- <span class="cline-any cline-yes">1x</span>
274
- <span class="cline-any cline-yes">1x</span>
275
- <span class="cline-any cline-yes">51x</span>
276
- <span class="cline-any cline-yes">51x</span>
277
- <span class="cline-any cline-yes">51x</span>
278
- <span class="cline-any cline-yes">1x</span>
279
- <span class="cline-any cline-yes">1x</span>
280
- <span class="cline-any cline-yes">1x</span>
281
- <span class="cline-any cline-yes">1x</span>
282
- <span class="cline-any cline-yes">1x</span>
283
- <span class="cline-any cline-yes">1x</span>
284
- <span class="cline-any cline-yes">1x</span>
285
- <span class="cline-any cline-yes">1x</span>
286
- <span class="cline-any cline-yes">1x</span>
287
- <span class="cline-any cline-yes">1x</span>
288
- <span class="cline-any cline-yes">1x</span>
289
- <span class="cline-any cline-yes">1x</span>
290
- <span class="cline-any cline-yes">1x</span>
291
- <span class="cline-any cline-yes">1x</span>
292
- <span class="cline-any cline-yes">1x</span>
293
- <span class="cline-any cline-yes">50x</span>
294
- <span class="cline-any cline-yes">50x</span>
295
- <span class="cline-any cline-yes">50x</span>
296
- <span class="cline-any cline-yes">50x</span>
297
- <span class="cline-any cline-yes">50x</span>
298
- <span class="cline-any cline-yes">1x</span>
299
- <span class="cline-any cline-yes">1x</span>
300
- <span class="cline-any cline-yes">1x</span>
301
- <span class="cline-any cline-yes">1x</span>
302
- <span class="cline-any cline-yes">1x</span>
303
- <span class="cline-any cline-yes">1x</span>
304
- <span class="cline-any cline-yes">1x</span>
305
- <span class="cline-any cline-yes">1x</span>
306
- <span class="cline-any cline-yes">1x</span>
307
- <span class="cline-any cline-yes">1x</span>
308
- <span class="cline-any cline-yes">1x</span>
309
- <span class="cline-any cline-yes">1x</span>
310
- <span class="cline-any cline-yes">1x</span>
311
- <span class="cline-any cline-yes">1x</span>
312
- <span class="cline-any cline-yes">1x</span>
313
- <span class="cline-any cline-yes">1x</span>
314
- <span class="cline-any cline-yes">1x</span>
315
- <span class="cline-any cline-yes">1x</span>
316
- <span class="cline-any cline-yes">1x</span>
317
- <span class="cline-any cline-yes">1x</span>
318
- <span class="cline-any cline-yes">1x</span>
319
- <span class="cline-any cline-yes">1x</span>
320
- <span class="cline-any cline-yes">1x</span>
321
- <span class="cline-any cline-yes">1x</span>
322
- <span class="cline-any cline-yes">1x</span>
323
- <span class="cline-any cline-yes">1x</span>
324
- <span class="cline-any cline-yes">44x</span>
325
- <span class="cline-any cline-yes">44x</span>
326
- <span class="cline-any cline-yes">44x</span>
327
- <span class="cline-any cline-yes">44x</span>
328
- <span class="cline-any cline-yes">44x</span>
329
- <span class="cline-any cline-yes">44x</span>
330
- <span class="cline-any cline-yes">44x</span>
331
- <span class="cline-any cline-yes">44x</span>
332
- <span class="cline-any cline-yes">44x</span>
333
- <span class="cline-any cline-yes">44x</span>
334
- <span class="cline-any cline-yes">44x</span>
335
- <span class="cline-any cline-yes">44x</span>
336
- <span class="cline-any cline-yes">44x</span>
337
- <span class="cline-any cline-yes">44x</span>
338
- <span class="cline-any cline-yes">44x</span>
339
- <span class="cline-any cline-yes">44x</span>
340
- <span class="cline-any cline-yes">44x</span>
341
- <span class="cline-any cline-yes">44x</span>
342
- <span class="cline-any cline-yes">44x</span>
343
- <span class="cline-any cline-yes">44x</span>
344
- <span class="cline-any cline-yes">44x</span>
345
- <span class="cline-any cline-yes">44x</span>
346
- <span class="cline-any cline-yes">44x</span>
347
- <span class="cline-any cline-yes">44x</span>
348
- <span class="cline-any cline-yes">44x</span>
349
- <span class="cline-any cline-yes">133x</span>
350
- <span class="cline-any cline-yes">133x</span>
351
- <span class="cline-any cline-yes">105x</span>
352
- <span class="cline-any cline-yes">105x</span>
353
- <span class="cline-any cline-yes">105x</span>
354
- <span class="cline-any cline-yes">105x</span>
355
- <span class="cline-any cline-yes">105x</span>
356
- <span class="cline-any cline-yes">133x</span>
357
- <span class="cline-any cline-yes">13x</span>
358
- <span class="cline-any cline-yes">13x</span>
359
- <span class="cline-any cline-yes">13x</span>
360
- <span class="cline-any cline-yes">13x</span>
361
- <span class="cline-any cline-yes">92x</span>
362
- <span class="cline-any cline-yes">92x</span>
363
- <span class="cline-any cline-yes">92x</span>
364
- <span class="cline-any cline-yes">92x</span>
365
- <span class="cline-any cline-yes">133x</span>
366
- <span class="cline-any cline-yes">75x</span>
367
- <span class="cline-any cline-yes">75x</span>
368
- <span class="cline-any cline-yes">75x</span>
369
- <span class="cline-any cline-yes">75x</span>
370
- <span class="cline-any cline-yes">18x</span>
371
- <span class="cline-any cline-yes">18x</span>
372
- <span class="cline-any cline-yes">5x</span>
373
- <span class="cline-any cline-yes">5x</span>
374
- <span class="cline-any cline-yes">5x</span>
375
- <span class="cline-any cline-yes">5x</span>
376
- <span class="cline-any cline-yes">5x</span>
377
- <span class="cline-any cline-yes">5x</span>
378
- <span class="cline-any cline-yes">18x</span>
379
- <span class="cline-any cline-yes">13x</span>
380
- <span class="cline-any cline-yes">13x</span>
381
- <span class="cline-any cline-yes">13x</span>
382
- <span class="cline-any cline-yes">13x</span>
383
- <span class="cline-any cline-yes">13x</span>
384
- <span class="cline-any cline-yes">18x</span>
385
- <span class="cline-any cline-yes">75x</span>
386
- <span class="cline-any cline-yes">92x</span>
387
- <span class="cline-any cline-yes">133x</span>
388
- <span class="cline-any cline-yes">34x</span>
389
- <span class="cline-any cline-yes">34x</span>
390
- <span class="cline-any cline-yes">133x</span>
391
- <span class="cline-any cline-yes">44x</span>
392
- <span class="cline-any cline-yes">44x</span>
393
- <span class="cline-any cline-yes">44x</span>
394
- <span class="cline-any cline-yes">1x</span>
395
- <span class="cline-any cline-yes">1x</span>
396
- <span class="cline-any cline-yes">1x</span>
397
- <span class="cline-any cline-yes">1x</span>
398
- <span class="cline-any cline-yes">1x</span>
399
- <span class="cline-any cline-yes">1x</span>
400
- <span class="cline-any cline-yes">1x</span>
401
- <span class="cline-any cline-yes">1x</span>
402
- <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">5x</span>
406
- <span class="cline-any cline-yes">5x</span>
407
- <span class="cline-any cline-yes">5x</span>
408
- <span class="cline-any cline-yes">5x</span>
409
- <span class="cline-any cline-yes">5x</span>
410
- <span class="cline-any cline-yes">5x</span>
411
- <span class="cline-any cline-yes">5x</span>
412
- <span class="cline-any cline-yes">5x</span>
413
- <span class="cline-any cline-yes">5x</span>
414
- <span class="cline-any cline-yes">5x</span>
415
- <span class="cline-any cline-yes">9x</span>
416
- <span class="cline-any cline-yes">9x</span>
417
- <span class="cline-any cline-yes">9x</span>
418
- <span class="cline-any cline-yes">9x</span>
419
- <span class="cline-any cline-yes">9x</span>
420
- <span class="cline-any cline-yes">9x</span>
421
- <span class="cline-any cline-yes">9x</span>
422
- <span class="cline-any cline-yes">2x</span>
423
- <span class="cline-any cline-yes">2x</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">2x</span>
439
- <span class="cline-any cline-yes">9x</span>
440
- <span class="cline-any cline-yes">9x</span>
441
- <span class="cline-any cline-yes">5x</span>
442
- <span class="cline-any cline-yes">5x</span>
443
- <span class="cline-any cline-yes">5x</span>
444
- <span class="cline-any cline-yes">5x</span>
445
- <span class="cline-any cline-yes">5x</span>
446
- <span class="cline-any cline-yes">5x</span>
447
- <span class="cline-any cline-yes">1x</span>
448
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { Task, ParsingContext, Warning } from '../types/index.js';
449
- import { parseTask } from '../parser/index.js';
450
- import { extractDateFromHeading } from '../utils/dates.js';
451
- &nbsp;
452
- /**
453
- * Extract project name from file path
454
- *
455
- * Looks for "projects/" directory in path and returns the
456
- * immediate subdirectory name.
457
- *
458
- * @param filePath - Relative file path
459
- * @returns Project name or undefined
460
- *
461
- * @example
462
- * extractProjectFromPath('projects/acme-app/notes.md') // =&gt; 'acme-app'
463
- * extractProjectFromPath('1-1s/jane.md') // =&gt; undefined
464
- */
465
- export function extractProjectFromPath(filePath: string): string | undefined {
466
- const match = filePath.match(/projects\/([^/]+)/);
467
- return match?.[1];
468
- }
469
- &nbsp;
470
- /**
471
- * Extract person name from file path
472
- *
473
- * Looks for "1-1s/" directory in path and extracts the filename
474
- * (without extension) as the person identifier.
475
- *
476
- * @param filePath - Relative file path
477
- * @returns Person identifier or undefined
478
- *
479
- * @example
480
- * extractPersonFromFilename('1-1s/jane-doe.md') // =&gt; 'jane-doe'
481
- * extractPersonFromFilename('projects/acme/notes.md') // =&gt; undefined
482
- */
483
- export function extractPersonFromFilename(
484
- filePath: string,
485
- ): string | undefined {
486
- const match = filePath.match(/1-1s\/([^/]+)\.md$/);
487
- return match?.[1];
488
- }
489
- &nbsp;
490
- /**
491
- * MarkdownScanner scans markdown file content and extracts tasks
492
- *
493
- * Key features:
494
- * - Context tracking: Maintains project, person, and heading date context
495
- * - Pure function: No I/O, just string processing
496
- * - Warning collection: Reports issues like relative dates without context
497
- *
498
- * @example
499
- * const scanner = new MarkdownScanner();
500
- * const result = scanner.scanFile('projects/acme-app/notes.md', fileContent);
501
- * console.log(result.tasks); // Array of Task objects
502
- * console.log(result.warnings); // Array of Warning objects
503
- */
504
- export class MarkdownScanner {
505
- /**
506
- * Scan a single markdown file's content
507
- *
508
- * Processes the file line-by-line, tracking context and extracting tasks.
509
- *
510
- * @param filePath - Relative file path (for context extraction)
511
- * @param content - File content as string
512
- * @returns Object containing tasks and warnings
513
- */
514
- scanFile(
515
- filePath: string,
516
- content: string,
517
- ): {
518
- tasks: Task[];
519
- warnings: Warning[];
520
- } {
521
- const tasks: Task[] = [];
522
- const warnings: Warning[] = [];
523
- &nbsp;
524
- // Track Todoist IDs to detect duplicates
525
- const todoistIds = new Map&lt;string, { file: string; line: number }&gt;();
526
- &nbsp;
527
- // Initialize context from file path
528
- const context: ParsingContext = {};
529
- &nbsp;
530
- const project = extractProjectFromPath(filePath);
531
- if (project !== undefined) context.project = project;
532
- &nbsp;
533
- const person = extractPersonFromFilename(filePath);
534
- if (person !== undefined) context.person = person;
535
- &nbsp;
536
- // Process file line by line
537
- const lines = content.split('\n');
538
- &nbsp;
539
- for (let i = 0; i &lt; lines.length; i++) {
540
- const line = lines[i];
541
- if (!line) continue; // Skip undefined lines
542
- &nbsp;
543
- const lineNumber = i + 1; // 1-indexed
544
- &nbsp;
545
- // Check if line is a heading with a date
546
- const headingDate = extractDateFromHeading(line);
547
- if (headingDate) {
548
- context.currentDate = headingDate;
549
- context.currentHeading = line.trim();
550
- continue; // Headings are not tasks
551
- }
552
- &nbsp;
553
- // Try to parse as task
554
- const result = parseTask(line, lineNumber, filePath, context);
555
- &nbsp;
556
- if (result.task) {
557
- tasks.push(result.task);
558
- &nbsp;
559
- // Check for duplicate Todoist IDs
560
- if (result.task.todoistId) {
561
- const existing = todoistIds.get(result.task.todoistId);
562
- if (existing) {
563
- warnings.push({
564
- file: filePath,
565
- line: lineNumber,
566
- text: result.task.text,
567
- reason: `Duplicate Todoist ID [todoist:${result.task.todoistId}]. Also found at ${existing.file}:${existing.line}.`,
568
- });
569
- } else {
570
- todoistIds.set(result.task.todoistId, {
571
- file: filePath,
572
- line: lineNumber,
573
- });
574
- }
575
- }
576
- }
577
- &nbsp;
578
- if (result.warnings.length &gt; 0) {
579
- warnings.push(...result.warnings);
580
- }
581
- }
582
- &nbsp;
583
- return { tasks, warnings };
584
- }
585
- &nbsp;
586
- /**
587
- * Scan multiple files
588
- *
589
- * Note: This method expects file contents to be provided by the caller.
590
- * File I/O should be handled in the CLI package using fast-glob.
591
- *
592
- * @param files - Array of {path, content} objects
593
- * @returns Combined scan results from all files
594
- */
595
- scanFiles(files: Array&lt;{ path: string; content: string }&gt;): {
596
- tasks: Task[];
597
- warnings: Warning[];
598
- } {
599
- const allTasks: Task[] = [];
600
- const allWarnings: Warning[] = [];
601
- &nbsp;
602
- // Track Todoist IDs across all files
603
- const todoistIds = new Map&lt;string, { file: string; line: number }&gt;();
604
- &nbsp;
605
- for (const file of files) {
606
- const result = this.scanFile(file.path, file.content);
607
- allTasks.push(...result.tasks);
608
- allWarnings.push(...result.warnings);
609
- &nbsp;
610
- // Check for duplicate Todoist IDs across files
611
- for (const task of result.tasks) {
612
- if (task.todoistId) {
613
- const existing = todoistIds.get(task.todoistId);
614
- if (existing &amp;&amp; existing.file !== task.file) {
615
- // Only add warning if duplicate is in a different file
616
- // (same-file duplicates are already caught by scanFile)
617
- allWarnings.push({
618
- file: task.file,
619
- line: task.line,
620
- text: task.text,
621
- reason: `Duplicate Todoist ID [todoist:${task.todoistId}] across files. Also found at ${existing.file}:${existing.line}.`,
622
- });
623
- } else if (!existing) {
624
- todoistIds.set(task.todoistId, {
625
- file: task.file,
626
- line: task.line,
627
- });
628
- }
629
- }
630
- }
631
- }
632
- &nbsp;
633
- return {
634
- tasks: allTasks,
635
- warnings: allWarnings,
636
- };
637
- }
638
- }
639
- &nbsp;</pre></td></tr></table></pre>
640
-
641
- <div class='push'></div><!-- for sticky footer -->
642
- </div><!-- /wrapper -->
643
- <div class='footer quiet pad2 space-top1 center small'>
644
- Code coverage generated by
645
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
646
- at 2026-01-26T03:50:53.053Z
647
- </div>
648
- <script src="../../prettify.js"></script>
649
- <script>
650
- window.onload = function () {
651
- prettyPrint();
652
- };
653
- </script>
654
- <script src="../../sorter.js"></script>
655
- <script src="../../block-navigation.js"></script>
656
- </body>
657
- </html>
658
-