@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.
- package/CHANGELOG.md +36 -0
- package/coverage/coverage-final.json +6 -5
- package/coverage/index.html +52 -37
- package/coverage/lcov-report/index.html +52 -37
- package/coverage/lcov-report/src/filters/index.html +1 -1
- package/coverage/lcov-report/src/filters/index.ts.html +1 -1
- package/coverage/lcov-report/src/index.html +5 -5
- package/coverage/lcov-report/src/index.ts.html +13 -4
- package/coverage/lcov-report/src/parser/index.html +17 -17
- package/coverage/lcov-report/src/parser/index.ts.html +181 -13
- package/coverage/lcov-report/src/parser/patterns.ts.html +18 -9
- package/coverage/lcov-report/src/scanner/index.html +15 -15
- package/coverage/lcov-report/src/scanner/index.ts.html +83 -8
- package/coverage/lcov-report/src/sorting/index.html +1 -1
- package/coverage/lcov-report/src/sorting/index.ts.html +1 -1
- package/coverage/lcov-report/src/utils/dates.ts.html +169 -25
- package/coverage/lcov-report/src/utils/id.ts.html +1 -1
- package/coverage/lcov-report/src/utils/index.html +19 -19
- package/coverage/lcov-report/src/warnings/filter.ts.html +364 -0
- package/coverage/lcov-report/src/warnings/index.html +116 -0
- package/coverage/lcov-report/src/writer/index.html +1 -1
- package/coverage/lcov-report/src/writer/index.ts.html +1 -1
- package/coverage/lcov.info +760 -512
- package/coverage/src/filters/index.html +1 -1
- package/coverage/src/filters/index.ts.html +1 -1
- package/coverage/src/index.html +5 -5
- package/coverage/src/index.ts.html +13 -4
- package/coverage/src/parser/index.html +17 -17
- package/coverage/src/parser/index.ts.html +181 -13
- package/coverage/src/parser/patterns.ts.html +18 -9
- package/coverage/src/scanner/index.html +15 -15
- package/coverage/src/scanner/index.ts.html +83 -8
- package/coverage/src/sorting/index.html +1 -1
- package/coverage/src/sorting/index.ts.html +1 -1
- package/coverage/src/utils/dates.ts.html +169 -25
- package/coverage/src/utils/id.ts.html +1 -1
- package/coverage/src/utils/index.html +19 -19
- package/coverage/src/warnings/filter.ts.html +364 -0
- package/coverage/src/warnings/index.html +116 -0
- package/coverage/src/writer/index.html +1 -1
- package/coverage/src/writer/index.ts.html +1 -1
- package/dist/index.d.mts +103 -12
- package/dist/index.d.ts +103 -12
- package/dist/index.js +125 -11
- package/dist/index.mjs +125 -12
- package/package.json +1 -1
- package/src/index.ts +3 -0
- package/src/parser/index.ts +61 -5
- package/src/parser/patterns.ts +8 -5
- package/src/scanner/index.ts +25 -0
- package/src/types/index.ts +35 -2
- package/src/utils/dates.ts +58 -10
- package/src/warnings/filter.ts +93 -0
|
@@ -23,16 +23,16 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">96.96% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
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">
|
|
33
|
+
<span class="strong">93.58% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>73/
|
|
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">
|
|
47
|
+
<span class="strong">96.96% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
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
|
|
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"> </span>
|
|
576
|
+
<span class="cline-any cline-no"> </span>
|
|
577
|
+
<span class="cline-any cline-no"> </span>
|
|
578
|
+
<span class="cline-any cline-no"> </span>
|
|
579
|
+
<span class="cline-any cline-no"> </span>
|
|
580
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
594
|
+
<span class="cline-any cline-no"> </span>
|
|
595
|
+
<span class="cline-any cline-no"> </span>
|
|
596
|
+
<span class="cline-any cline-no"> </span>
|
|
597
|
+
<span class="cline-any cline-no"> </span>
|
|
598
|
+
<span class="cline-any cline-no"> </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
|
|
965
|
+
const dateStr = absoluteMatch[1];
|
|
966
|
+
let timeStr = absoluteMatch[2]; // May be undefined
|
|
967
|
+
|
|
968
|
+
// If no time specified, apply default from workday config
|
|
969
|
+
if (!timeStr && 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' && 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' && 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
|
+
|
|
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
|
|
|
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
|
-
|
|
984
|
+
let timeStr: string | undefined;
|
|
985
|
+
|
|
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' && 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' && 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
|
+
|
|
995
|
+
const date = parseAbsoluteDate(shortMatch[1], timeStr);
|
|
861
996
|
return { date: date ?? undefined };
|
|
862
997
|
}
|
|
863
998
|
|
|
@@ -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 && !dueDateResult.date && !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 && !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-
|
|
1258
|
+
at 2026-02-05T05:58:13.697Z
|
|
1091
1259
|
</div>
|
|
1092
1260
|
<script src="../../prettify.js"></script>
|
|
1093
1261
|
<script>
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">100% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>195/195</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">100% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>195/195</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -255,7 +255,13 @@
|
|
|
255
255
|
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
256
|
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
257
|
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
-
<a name='L193'></a><a href='#L193'>193</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></td><td class="line-coverage quiet"><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>
|
|
259
265
|
<span class="cline-any cline-yes">1x</span>
|
|
260
266
|
<span class="cline-any cline-yes">1x</span>
|
|
261
267
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -512,17 +518,20 @@ export const PRIORITY_HIGH = /!!/;
|
|
|
512
518
|
export const PRIORITY_NORMAL = /(?<!!)!(?!!)/;
|
|
513
519
|
|
|
514
520
|
/**
|
|
515
|
-
* Matches absolute due date in ISO format [due: YYYY-MM-DD]
|
|
521
|
+
* Matches absolute due date in ISO format [due: YYYY-MM-DD] with optional time [due: YYYY-MM-DD HH:MM]
|
|
516
522
|
*
|
|
517
523
|
* Examples:
|
|
518
|
-
* "[due: 2026-01-25]" → "2026-01-25"
|
|
519
|
-
* "[due:2026-01-25]" → "2026-01-25"
|
|
520
|
-
* "[due:
|
|
524
|
+
* "[due: 2026-01-25]" → "2026-01-25", undefined
|
|
525
|
+
* "[due: 2026-01-25 17:00]" → "2026-01-25", "17:00"
|
|
526
|
+
* "[due: 2026-01-25 9:00]" → "2026-01-25", "9:00"
|
|
527
|
+
* "[due:2026-01-25]" → "2026-01-25", undefined (spaces optional)
|
|
521
528
|
*
|
|
522
529
|
* Groups:
|
|
523
530
|
* [1] - Date string in YYYY-MM-DD format
|
|
531
|
+
* [2] - Optional time string in H:MM or HH:MM format (24-hour)
|
|
524
532
|
*/
|
|
525
|
-
export const DUE_DATE_ABSOLUTE =
|
|
533
|
+
export const DUE_DATE_ABSOLUTE =
|
|
534
|
+
/\[due:\s*(\d{4}-\d{2}-\d{2})(?:\s+(\d{1,2}:\d{2}))?\s*\]/i;
|
|
526
535
|
|
|
527
536
|
/**
|
|
528
537
|
* Matches relative due date keywords
|
|
@@ -646,7 +655,7 @@ export const PATTERNS = {
|
|
|
646
655
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
647
656
|
Code coverage generated by
|
|
648
657
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
649
|
-
at 2026-
|
|
658
|
+
at 2026-02-05T05:58:13.697Z
|
|
650
659
|
</div>
|
|
651
660
|
<script src="../../prettify.js"></script>
|
|
652
661
|
<script>
|
|
@@ -23,16 +23,16 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">97.22% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>210/216</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">79.31% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>23/
|
|
35
|
+
<span class='fraction'>23/29</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">
|
|
47
|
+
<span class="strong">97.22% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>210/216</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="
|
|
84
|
-
<div class="chart"><div class="cover-fill
|
|
83
|
+
<td data-value="97.22" class="pic high">
|
|
84
|
+
<div class="chart"><div class="cover-fill" style="width: 97%"></div><div class="cover-empty" style="width: 3%"></div></div>
|
|
85
85
|
</td>
|
|
86
|
-
<td data-value="
|
|
87
|
-
<td data-value="
|
|
88
|
-
<td data-value="
|
|
89
|
-
<td data-value="
|
|
86
|
+
<td data-value="97.22" class="pct high">97.22%</td>
|
|
87
|
+
<td data-value="216" class="abs high">210/216</td>
|
|
88
|
+
<td data-value="79.31" class="pct medium">79.31%</td>
|
|
89
|
+
<td data-value="29" class="abs medium">23/29</td>
|
|
90
90
|
<td data-value="100" class="pct high">100%</td>
|
|
91
91
|
<td data-value="4" class="abs high">4/4</td>
|
|
92
|
-
<td data-value="
|
|
93
|
-
<td data-value="
|
|
92
|
+
<td data-value="97.22" class="pct high">97.22%</td>
|
|
93
|
+
<td data-value="216" class="abs high">210/216</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-
|
|
104
|
+
at 2026-02-05T05:58:13.697Z
|
|
105
105
|
</div>
|
|
106
106
|
<script src="../../prettify.js"></script>
|
|
107
107
|
<script>
|