@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
@@ -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.066Z
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'>192/192</span>
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'>192/192</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
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 = /(?&lt;!!)!(?!!)/;
513
519
  &nbsp;
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" (spaces optional)
520
- * "[due: 2026-01-25 ]" → "2026-01-25" (whitespace allowed)
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 = /\[due:\s*(\d{4}-\d{2}-\d{2})\s*\]/i;
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
  &nbsp;
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-01-26T03:50:53.066Z
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">100% </span>
26
+ <span class="strong">97.22% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>191/191</span>
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">100% </span>
33
+ <span class="strong">79.31% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>23/23</span>
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">100% </span>
47
+ <span class="strong">97.22% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>191/191</span>
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="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="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="100" class="pct high">100%</td>
87
- <td data-value="191" class="abs high">191/191</td>
88
- <td data-value="100" class="pct high">100%</td>
89
- <td data-value="23" class="abs high">23/23</td>
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="100" class="pct high">100%</td>
93
- <td data-value="191" class="abs high">191/191</td>
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-01-26T03:50:53.066Z
104
+ at 2026-02-05T05:58:13.697Z
105
105
  </div>
106
106
  <script src="../../prettify.js"></script>
107
107
  <script>