@md2do/core 0.2.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/coverage/coverage-final.json +6 -5
  3. package/coverage/index.html +52 -37
  4. package/coverage/lcov-report/index.html +52 -37
  5. package/coverage/lcov-report/src/filters/index.html +1 -1
  6. package/coverage/lcov-report/src/filters/index.ts.html +1 -1
  7. package/coverage/lcov-report/src/index.html +5 -5
  8. package/coverage/lcov-report/src/index.ts.html +13 -4
  9. package/coverage/lcov-report/src/parser/index.html +17 -17
  10. package/coverage/lcov-report/src/parser/index.ts.html +181 -13
  11. package/coverage/lcov-report/src/parser/patterns.ts.html +18 -9
  12. package/coverage/lcov-report/src/scanner/index.html +15 -15
  13. package/coverage/lcov-report/src/scanner/index.ts.html +83 -8
  14. package/coverage/lcov-report/src/sorting/index.html +1 -1
  15. package/coverage/lcov-report/src/sorting/index.ts.html +1 -1
  16. package/coverage/lcov-report/src/utils/dates.ts.html +169 -25
  17. package/coverage/lcov-report/src/utils/id.ts.html +1 -1
  18. package/coverage/lcov-report/src/utils/index.html +19 -19
  19. package/coverage/lcov-report/src/warnings/filter.ts.html +364 -0
  20. package/coverage/lcov-report/src/warnings/index.html +116 -0
  21. package/coverage/lcov-report/src/writer/index.html +1 -1
  22. package/coverage/lcov-report/src/writer/index.ts.html +1 -1
  23. package/coverage/lcov.info +760 -512
  24. package/coverage/src/filters/index.html +1 -1
  25. package/coverage/src/filters/index.ts.html +1 -1
  26. package/coverage/src/index.html +5 -5
  27. package/coverage/src/index.ts.html +13 -4
  28. package/coverage/src/parser/index.html +17 -17
  29. package/coverage/src/parser/index.ts.html +181 -13
  30. package/coverage/src/parser/patterns.ts.html +18 -9
  31. package/coverage/src/scanner/index.html +15 -15
  32. package/coverage/src/scanner/index.ts.html +83 -8
  33. package/coverage/src/sorting/index.html +1 -1
  34. package/coverage/src/sorting/index.ts.html +1 -1
  35. package/coverage/src/utils/dates.ts.html +169 -25
  36. package/coverage/src/utils/id.ts.html +1 -1
  37. package/coverage/src/utils/index.html +19 -19
  38. package/coverage/src/warnings/filter.ts.html +364 -0
  39. package/coverage/src/warnings/index.html +116 -0
  40. package/coverage/src/writer/index.html +1 -1
  41. package/coverage/src/writer/index.ts.html +1 -1
  42. package/dist/index.d.mts +103 -12
  43. package/dist/index.d.ts +103 -12
  44. package/dist/index.js +125 -11
  45. package/dist/index.mjs +125 -12
  46. package/package.json +1 -1
  47. package/src/index.ts +3 -0
  48. package/src/parser/index.ts +61 -5
  49. package/src/parser/patterns.ts +8 -5
  50. package/src/scanner/index.ts +25 -0
  51. package/src/types/index.ts +35 -2
  52. package/src/utils/dates.ts +58 -10
  53. package/src/warnings/filter.ts +93 -0
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-01-26T03:50:53.053Z
104
+ at 2026-02-05T05:58:13.685Z
105
105
  </div>
106
106
  <script src="../../prettify.js"></script>
107
107
  <script>
@@ -1141,7 +1141,7 @@ export function not(filter: TaskFilter): TaskFilter {
1141
1141
  <div class='footer quiet pad2 space-top1 center small'>
1142
1142
  Code coverage generated by
1143
1143
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1144
- at 2026-01-26T03:50:53.053Z
1144
+ at 2026-02-05T05:58:13.685Z
1145
1145
  </div>
1146
1146
  <script src="../../prettify.js"></script>
1147
1147
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/24</span>
28
+ <span class='fraction'>0/27</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/24</span>
49
+ <span class='fraction'>0/27</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,13 @@
84
84
  <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
85
85
  </td>
86
86
  <td data-value="0" class="pct low">0%</td>
87
- <td data-value="24" class="abs low">0/24</td>
87
+ <td data-value="27" class="abs low">0/27</td>
88
88
  <td data-value="0" class="pct low">0%</td>
89
89
  <td data-value="1" class="abs low">0/1</td>
90
90
  <td data-value="0" class="pct low">0%</td>
91
91
  <td data-value="1" class="abs low">0/1</td>
92
92
  <td data-value="0" class="pct low">0%</td>
93
- <td data-value="24" class="abs low">0/24</td>
93
+ <td data-value="27" class="abs low">0/27</td>
94
94
  </tr>
95
95
 
96
96
  </tbody>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-01-26T03:50:53.053Z
104
+ at 2026-02-05T05:58:13.685Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/24</span>
28
+ <span class='fraction'>0/27</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/24</span>
49
+ <span class='fraction'>0/27</span>
50
50
  </div>
51
51
 
52
52
 
@@ -87,7 +87,13 @@
87
87
  <a name='L22'></a><a href='#L22'>22</a>
88
88
  <a name='L23'></a><a href='#L23'>23</a>
89
89
  <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
94
+ <span class="cline-any cline-no">&nbsp;</span>
95
+ <span class="cline-any cline-no">&nbsp;</span>
96
+ <span class="cline-any cline-no">&nbsp;</span>
91
97
  <span class="cline-any cline-no">&nbsp;</span>
92
98
  <span class="cline-any cline-no">&nbsp;</span>
93
99
  <span class="cline-any cline-no">&nbsp;</span>
@@ -132,6 +138,9 @@
132
138
  <span class="cstat-no" title="statement not covered" >// Sorting (export as namespace to avoid conflicts)</span>
133
139
  <span class="cstat-no" title="statement not covered" >export * as sorting from './sorting/index.js';</span>
134
140
  <span class="cstat-no" title="statement not covered" ></span>
141
+ <span class="cstat-no" title="statement not covered" >// Warnings</span>
142
+ <span class="cstat-no" title="statement not covered" >export * from './warnings/filter.js';</span>
143
+ <span class="cstat-no" title="statement not covered" ></span>
135
144
  <span class="cstat-no" title="statement not covered" >// Utilities</span>
136
145
  <span class="cstat-no" title="statement not covered" >export * from './utils/dates.js';</span>
137
146
  <span class="cstat-no" title="statement not covered" >export * from './utils/id.js';</span>
@@ -142,7 +151,7 @@
142
151
  <div class='footer quiet pad2 space-top1 center small'>
143
152
  Code coverage generated by
144
153
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
145
- at 2026-01-26T03:50:53.053Z
154
+ at 2026-02-05T05:58:13.685Z
146
155
  </div>
147
156
  <script src="../prettify.js"></script>
148
157
  <script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">100% </span>
26
+ <span class="strong">97.96% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>531/531</span>
28
+ <span class='fraction'>578/590</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">96.05% </span>
33
+ <span class="strong">93.58% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>73/76</span>
35
+ <span class='fraction'>73/78</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
47
+ <span class="strong">97.96% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>531/531</span>
49
+ <span class='fraction'>578/590</span>
50
50
  </div>
51
51
 
52
52
 
@@ -80,17 +80,17 @@
80
80
  </thead>
81
81
  <tbody><tr>
82
82
  <td class="file high" data-value="index.ts"><a href="index.ts.html">index.ts</a></td>
83
- <td data-value="100" class="pic high">
84
- <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
83
+ <td data-value="96.96" class="pic high">
84
+ <div class="chart"><div class="cover-fill" style="width: 96%"></div><div class="cover-empty" style="width: 4%"></div></div>
85
85
  </td>
86
- <td data-value="100" class="pct high">100%</td>
87
- <td data-value="339" class="abs high">339/339</td>
88
- <td data-value="96.05" class="pct high">96.05%</td>
89
- <td data-value="76" class="abs high">73/76</td>
86
+ <td data-value="96.96" class="pct high">96.96%</td>
87
+ <td data-value="395" class="abs high">383/395</td>
88
+ <td data-value="93.58" class="pct high">93.58%</td>
89
+ <td data-value="78" class="abs high">73/78</td>
90
90
  <td data-value="100" class="pct high">100%</td>
91
91
  <td data-value="8" class="abs high">8/8</td>
92
- <td data-value="100" class="pct high">100%</td>
93
- <td data-value="339" class="abs high">339/339</td>
92
+ <td data-value="96.96" class="pct high">96.96%</td>
93
+ <td data-value="395" class="abs high">383/395</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -99,13 +99,13 @@
99
99
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
100
100
  </td>
101
101
  <td data-value="100" class="pct high">100%</td>
102
- <td data-value="192" class="abs high">192/192</td>
102
+ <td data-value="195" class="abs high">195/195</td>
103
103
  <td data-value="100" class="pct high">100%</td>
104
104
  <td data-value="0" class="abs high">0/0</td>
105
105
  <td data-value="100" class="pct high">100%</td>
106
106
  <td data-value="0" class="abs high">0/0</td>
107
107
  <td data-value="100" class="pct high">100%</td>
108
- <td data-value="192" class="abs high">192/192</td>
108
+ <td data-value="195" class="abs high">195/195</td>
109
109
  </tr>
110
110
 
111
111
  </tbody>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-01-26T03:50:53.053Z
119
+ at 2026-02-05T05:58:13.685Z
120
120
  </div>
121
121
  <script src="../../prettify.js"></script>
122
122
  <script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">100% </span>
26
+ <span class="strong">96.96% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>339/339</span>
28
+ <span class='fraction'>383/395</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">96.05% </span>
33
+ <span class="strong">93.58% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>73/76</span>
35
+ <span class='fraction'>73/78</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
47
+ <span class="strong">96.96% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>339/339</span>
49
+ <span class='fraction'>383/395</span>
50
50
  </div>
51
51
 
52
52
 
@@ -402,7 +402,63 @@
402
402
  <a name='L337'></a><a href='#L337'>337</a>
403
403
  <a name='L338'></a><a href='#L338'>338</a>
404
404
  <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
406
462
  <span class="cline-any cline-yes">1x</span>
407
463
  <span class="cline-any cline-yes">1x</span>
408
464
  <span class="cline-any cline-yes">1x</span>
@@ -514,6 +570,18 @@
514
570
  <span class="cline-any cline-yes">23x</span>
515
571
  <span class="cline-any cline-yes">23x</span>
516
572
  <span class="cline-any cline-yes">23x</span>
573
+ <span class="cline-any cline-yes">23x</span>
574
+ <span class="cline-any cline-yes">23x</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-yes">23x</span>
582
+ <span class="cline-any cline-yes">23x</span>
583
+ <span class="cline-any cline-yes">23x</span>
584
+ <span class="cline-any cline-yes">23x</span>
517
585
  <span class="cline-any cline-yes">106x</span>
518
586
  <span class="cline-any cline-yes">106x</span>
519
587
  <span class="cline-any cline-yes">106x</span>
@@ -521,6 +589,17 @@
521
589
  <span class="cline-any cline-yes">5x</span>
522
590
  <span class="cline-any cline-yes">5x</span>
523
591
  <span class="cline-any cline-yes">5x</span>
592
+ <span class="cline-any cline-yes">5x</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-yes">5x</span>
600
+ <span class="cline-any cline-yes">5x</span>
601
+ <span class="cline-any cline-yes">5x</span>
602
+ <span class="cline-any cline-yes">5x</span>
524
603
  <span class="cline-any cline-yes">101x</span>
525
604
  <span class="cline-any cline-yes">101x</span>
526
605
  <span class="cline-any cline-yes">101x</span>
@@ -538,6 +617,11 @@
538
617
  <span class="cline-any cline-yes">6x</span>
539
618
  <span class="cline-any cline-yes">6x</span>
540
619
  <span class="cline-any cline-yes">6x</span>
620
+ <span class="cline-any cline-yes">6x</span>
621
+ <span class="cline-any cline-yes">6x</span>
622
+ <span class="cline-any cline-yes">6x</span>
623
+ <span class="cline-any cline-yes">6x</span>
624
+ <span class="cline-any cline-yes">6x</span>
541
625
  <span class="cline-any cline-yes">13x</span>
542
626
  <span class="cline-any cline-yes">13x</span>
543
627
  <span class="cline-any cline-yes">19x</span>
@@ -624,6 +708,11 @@
624
708
  <span class="cline-any cline-yes">2x</span>
625
709
  <span class="cline-any cline-yes">2x</span>
626
710
  <span class="cline-any cline-yes">2x</span>
711
+ <span class="cline-any cline-yes">2x</span>
712
+ <span class="cline-any cline-yes">2x</span>
713
+ <span class="cline-any cline-yes">2x</span>
714
+ <span class="cline-any cline-yes">2x</span>
715
+ <span class="cline-any cline-yes">2x</span>
627
716
  <span class="cline-any cline-yes">143x</span>
628
717
  <span class="cline-any cline-yes">143x</span>
629
718
  <span class="cline-any cline-yes">145x</span>
@@ -636,6 +725,11 @@
636
725
  <span class="cline-any cline-yes">2x</span>
637
726
  <span class="cline-any cline-yes">2x</span>
638
727
  <span class="cline-any cline-yes">2x</span>
728
+ <span class="cline-any cline-yes">2x</span>
729
+ <span class="cline-any cline-yes">2x</span>
730
+ <span class="cline-any cline-yes">2x</span>
731
+ <span class="cline-any cline-yes">2x</span>
732
+ <span class="cline-any cline-yes">2x</span>
639
733
  <span class="cline-any cline-yes">141x</span>
640
734
  <span class="cline-any cline-yes">141x</span>
641
735
  <span class="cline-any cline-yes">145x</span>
@@ -647,6 +741,10 @@
647
741
  <span class="cline-any cline-yes">1x</span>
648
742
  <span class="cline-any cline-yes">1x</span>
649
743
  <span class="cline-any cline-yes">1x</span>
744
+ <span class="cline-any cline-yes">1x</span>
745
+ <span class="cline-any cline-yes">1x</span>
746
+ <span class="cline-any cline-yes">1x</span>
747
+ <span class="cline-any cline-yes">1x</span>
650
748
  <span class="cline-any cline-yes">140x</span>
651
749
  <span class="cline-any cline-yes">140x</span>
652
750
  <span class="cline-any cline-yes">145x</span>
@@ -658,6 +756,10 @@
658
756
  <span class="cline-any cline-yes">1x</span>
659
757
  <span class="cline-any cline-yes">1x</span>
660
758
  <span class="cline-any cline-yes">1x</span>
759
+ <span class="cline-any cline-yes">1x</span>
760
+ <span class="cline-any cline-yes">1x</span>
761
+ <span class="cline-any cline-yes">1x</span>
762
+ <span class="cline-any cline-yes">1x</span>
661
763
  <span class="cline-any cline-yes">139x</span>
662
764
  <span class="cline-any cline-yes">139x</span>
663
765
  <span class="cline-any cline-yes">139x</span>
@@ -699,6 +801,11 @@
699
801
  <span class="cline-any cline-yes">58x</span>
700
802
  <span class="cline-any cline-yes">58x</span>
701
803
  <span class="cline-any cline-yes">58x</span>
804
+ <span class="cline-any cline-yes">58x</span>
805
+ <span class="cline-any cline-yes">58x</span>
806
+ <span class="cline-any cline-yes">58x</span>
807
+ <span class="cline-any cline-yes">58x</span>
808
+ <span class="cline-any cline-yes">58x</span>
702
809
  <span class="cline-any cline-yes">119x</span>
703
810
  <span class="cline-any cline-yes">119x</span>
704
811
  <span class="cline-any cline-yes">145x</span>
@@ -710,6 +817,11 @@
710
817
  <span class="cline-any cline-yes">8x</span>
711
818
  <span class="cline-any cline-yes">8x</span>
712
819
  <span class="cline-any cline-yes">8x</span>
820
+ <span class="cline-any cline-yes">8x</span>
821
+ <span class="cline-any cline-yes">8x</span>
822
+ <span class="cline-any cline-yes">8x</span>
823
+ <span class="cline-any cline-yes">8x</span>
824
+ <span class="cline-any cline-yes">8x</span>
713
825
  <span class="cline-any cline-yes">119x</span>
714
826
  <span class="cline-any cline-yes">119x</span>
715
827
  <span class="cline-any cline-yes">119x</span>
@@ -837,27 +949,50 @@ export function extractCompletedDate(text: string): Date | undefined {
837
949
  * Extract due date from task text with context awareness
838
950
  *
839
951
  * Handles both absolute dates ([due: 2026-01-25]) and relative dates
840
- * ([due: tomorrow]) which require context.
952
+ * ([due: tomorrow]) which require context. Supports optional time ([due: 2026-01-25 17:00]).
841
953
  *
842
954
  * @param text - Task text
843
- * @param context - Parsing context (for relative dates)
955
+ * @param context - Parsing context (for relative dates and workday config)
844
956
  * @returns Object with parsed date and optional warning
845
957
  */
846
958
  export function extractDueDate(
847
959
  text: string,
848
960
  context: ParsingContext,
849
961
  ): { date: Date | undefined; warning?: Warning } {
850
- // Try absolute date first
962
+ // Try absolute date first (with optional time)
851
963
  const absoluteMatch = text.match(PATTERNS.DUE_DATE_ABSOLUTE);
852
964
  if (absoluteMatch?.[1]) {
853
- const date = parseAbsoluteDate(absoluteMatch[1]);
965
+ const dateStr = absoluteMatch[1];
966
+ let timeStr = absoluteMatch[2]; // May be undefined
967
+ &nbsp;
968
+ // If no time specified, apply default from workday config
969
+ if (!timeStr &amp;&amp; context.defaultDueTime) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
970
+ <span class="cstat-no" title="statement not covered" > if (context.defaultDueTime === 'start' &amp;&amp; context.workdayStartTime) {</span>
971
+ <span class="cstat-no" title="statement not covered" > timeStr = context.workdayStartTime;</span>
972
+ <span class="cstat-no" title="statement not covered" > } else if (context.defaultDueTime === 'end' &amp;&amp; context.workdayEndTime) {</span>
973
+ <span class="cstat-no" title="statement not covered" > timeStr = context.workdayEndTime;</span>
974
+ <span class="cstat-no" title="statement not covered" > }</span>
975
+ <span class="cstat-no" title="statement not covered" > }</span>
976
+ &nbsp;
977
+ const date = parseAbsoluteDate(dateStr, timeStr);
854
978
  return { date: <span class="branch-0 cbranch-no" title="branch not covered" >date ?? undefined }</span>;
855
979
  }
856
980
  &nbsp;
857
981
  // Try short format (M/D or M/D/YY)
858
982
  const shortMatch = text.match(PATTERNS.DUE_DATE_SHORT);
859
983
  if (shortMatch?.[1]) {
860
- const date = parseAbsoluteDate(shortMatch[1]);
984
+ let timeStr: string | undefined;
985
+ &nbsp;
986
+ // Apply default time from workday config
987
+ if (context.defaultDueTime) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
988
+ <span class="cstat-no" title="statement not covered" > if (context.defaultDueTime === 'start' &amp;&amp; context.workdayStartTime) {</span>
989
+ <span class="cstat-no" title="statement not covered" > timeStr = context.workdayStartTime;</span>
990
+ <span class="cstat-no" title="statement not covered" > } else if (context.defaultDueTime === 'end' &amp;&amp; context.workdayEndTime) {</span>
991
+ <span class="cstat-no" title="statement not covered" > timeStr = context.workdayEndTime;</span>
992
+ <span class="cstat-no" title="statement not covered" > }</span>
993
+ <span class="cstat-no" title="statement not covered" > }</span>
994
+ &nbsp;
995
+ const date = parseAbsoluteDate(shortMatch[1], timeStr);
861
996
  return { date: date ?? undefined };
862
997
  }
863
998
  &nbsp;
@@ -869,9 +1004,14 @@ export function extractDueDate(
869
1004
  return {
870
1005
  date: undefined,
871
1006
  warning: {
1007
+ severity: 'warning',
1008
+ source: 'md2do',
1009
+ ruleId: 'relative-date-no-context',
872
1010
  file: '', // Will be filled in by caller
873
1011
  line: 0, // Will be filled in by caller
874
1012
  text: text.trim(),
1013
+ message:
1014
+ 'Relative due date without context date from heading. Add a heading with a date above this task.',
875
1015
  reason:
876
1016
  'Relative due date without context date from heading. Add a heading with a date above this task.',
877
1017
  },
@@ -955,9 +1095,14 @@ export function parseTask(
955
1095
  // Check for asterisk/plus bullet markers (not supported)
956
1096
  if (/^\s*[*+]\s+\[[ xX]\]/.test(line)) {
957
1097
  warnings.push({
1098
+ severity: 'warning',
1099
+ source: 'md2do',
1100
+ ruleId: 'unsupported-bullet',
958
1101
  file,
959
1102
  line: lineNumber,
960
1103
  text: line.trim(),
1104
+ message:
1105
+ 'Unsupported bullet marker (* or +). Use dash (-) for task lists.',
961
1106
  reason:
962
1107
  'Unsupported bullet marker (* or +). Use dash (-) for task lists.',
963
1108
  });
@@ -967,9 +1112,14 @@ export function parseTask(
967
1112
  // Check for extra spaces inside checkbox: [x ] or [ x]
968
1113
  if (/^\s*-\s+\[[xX]\s+\]/.test(line) || /^\s*-\s+\[\s+[xX]\]/.test(line)) {
969
1114
  warnings.push({
1115
+ severity: 'warning',
1116
+ source: 'md2do',
1117
+ ruleId: 'malformed-checkbox',
970
1118
  file,
971
1119
  line: lineNumber,
972
1120
  text: line.trim(),
1121
+ message:
1122
+ 'Malformed checkbox with extra spaces. Use [x] or [ ] without extra spaces.',
973
1123
  reason:
974
1124
  'Malformed checkbox with extra spaces. Use [x] or [ ] without extra spaces.',
975
1125
  });
@@ -979,9 +1129,13 @@ export function parseTask(
979
1129
  // Check for missing space after checkbox: [x]Task
980
1130
  if (/^\s*-\s+\[[ xX]\][^\s]/.test(line)) {
981
1131
  warnings.push({
1132
+ severity: 'warning',
1133
+ source: 'md2do',
1134
+ ruleId: 'missing-space-after',
982
1135
  file,
983
1136
  line: lineNumber,
984
1137
  text: line.trim(),
1138
+ message: 'Missing space after checkbox. Use "- [x] Task" format.',
985
1139
  reason: 'Missing space after checkbox. Use "- [x] Task" format.',
986
1140
  });
987
1141
  return { task: null, warnings };
@@ -990,9 +1144,13 @@ export function parseTask(
990
1144
  // Check for missing space before checkbox: -[x]
991
1145
  if (/^\s*-\[[ xX]\]/.test(line)) {
992
1146
  warnings.push({
1147
+ severity: 'warning',
1148
+ source: 'md2do',
1149
+ ruleId: 'missing-space-before',
993
1150
  file,
994
1151
  line: lineNumber,
995
1152
  text: line.trim(),
1153
+ message: 'Missing space before checkbox. Use "- [x] Task" format.',
996
1154
  reason: 'Missing space before checkbox. Use "- [x] Task" format.',
997
1155
  });
998
1156
  return { task: null, warnings };
@@ -1031,9 +1189,14 @@ export function parseTask(
1031
1189
  // Incomplete tasks without any date (no explicit due date and no context date)
1032
1190
  if (!completed &amp;&amp; !dueDateResult.date &amp;&amp; !context.currentDate) {
1033
1191
  warnings.push({
1192
+ severity: 'info',
1193
+ source: 'md2do',
1194
+ ruleId: 'missing-due-date',
1034
1195
  file,
1035
1196
  line: lineNumber,
1036
1197
  text: fullText.trim(),
1198
+ message:
1199
+ 'Task has no due date. Add [due: YYYY-MM-DD] or place under a heading with a date.',
1037
1200
  reason:
1038
1201
  'Task has no due date. Add [due: YYYY-MM-DD] or place under a heading with a date.',
1039
1202
  });
@@ -1042,9 +1205,14 @@ export function parseTask(
1042
1205
  // Completed tasks should have completion dates
1043
1206
  if (completed &amp;&amp; !completedDate) {
1044
1207
  warnings.push({
1208
+ severity: 'info',
1209
+ source: 'md2do',
1210
+ ruleId: 'missing-completed-date',
1045
1211
  file,
1046
1212
  line: lineNumber,
1047
1213
  text: fullText.trim(),
1214
+ message:
1215
+ 'Completed task missing completion date. Add [completed: YYYY-MM-DD].',
1048
1216
  reason:
1049
1217
  'Completed task missing completion date. Add [completed: YYYY-MM-DD].',
1050
1218
  });
@@ -1087,7 +1255,7 @@ export function parseTask(
1087
1255
  <div class='footer quiet pad2 space-top1 center small'>
1088
1256
  Code coverage generated by
1089
1257
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1090
- at 2026-01-26T03:50:53.053Z
1258
+ at 2026-02-05T05:58:13.685Z
1091
1259
  </div>
1092
1260
  <script src="../../prettify.js"></script>
1093
1261
  <script>