@redocly/recheck 0.1.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 (182) hide show
  1. package/README.md +544 -0
  2. package/dist/assertions/bullet-style.d.ts +3 -0
  3. package/dist/assertions/bullet-style.d.ts.map +1 -0
  4. package/dist/assertions/bullet-style.js +60 -0
  5. package/dist/assertions/bullet-style.js.map +1 -0
  6. package/dist/assertions/index.d.ts +21 -0
  7. package/dist/assertions/index.d.ts.map +1 -0
  8. package/dist/assertions/index.js +30 -0
  9. package/dist/assertions/index.js.map +1 -0
  10. package/dist/assertions/max-image-size.d.ts +3 -0
  11. package/dist/assertions/max-image-size.d.ts.map +1 -0
  12. package/dist/assertions/max-image-size.js +73 -0
  13. package/dist/assertions/max-image-size.js.map +1 -0
  14. package/dist/assertions/max-line-length.d.ts +3 -0
  15. package/dist/assertions/max-line-length.d.ts.map +1 -0
  16. package/dist/assertions/max-line-length.js +68 -0
  17. package/dist/assertions/max-line-length.js.map +1 -0
  18. package/dist/assertions/no-broken-fragment-links.d.ts +3 -0
  19. package/dist/assertions/no-broken-fragment-links.d.ts.map +1 -0
  20. package/dist/assertions/no-broken-fragment-links.js +79 -0
  21. package/dist/assertions/no-broken-fragment-links.js.map +1 -0
  22. package/dist/assertions/no-duplicate-headings.d.ts +3 -0
  23. package/dist/assertions/no-duplicate-headings.d.ts.map +1 -0
  24. package/dist/assertions/no-duplicate-headings.js +66 -0
  25. package/dist/assertions/no-duplicate-headings.js.map +1 -0
  26. package/dist/assertions/no-hard-tabs.d.ts +3 -0
  27. package/dist/assertions/no-hard-tabs.d.ts.map +1 -0
  28. package/dist/assertions/no-hard-tabs.js +63 -0
  29. package/dist/assertions/no-hard-tabs.js.map +1 -0
  30. package/dist/assertions/no-trailing-spaces.d.ts +3 -0
  31. package/dist/assertions/no-trailing-spaces.d.ts.map +1 -0
  32. package/dist/assertions/no-trailing-spaces.js +72 -0
  33. package/dist/assertions/no-trailing-spaces.js.map +1 -0
  34. package/dist/assertions/pattern.d.ts +3 -0
  35. package/dist/assertions/pattern.d.ts.map +1 -0
  36. package/dist/assertions/pattern.js +39 -0
  37. package/dist/assertions/pattern.js.map +1 -0
  38. package/dist/assertions/semantic-line-breaks.d.ts +3 -0
  39. package/dist/assertions/semantic-line-breaks.d.ts.map +1 -0
  40. package/dist/assertions/semantic-line-breaks.js +152 -0
  41. package/dist/assertions/semantic-line-breaks.js.map +1 -0
  42. package/dist/assertions/swap.d.ts +3 -0
  43. package/dist/assertions/swap.d.ts.map +1 -0
  44. package/dist/assertions/swap.js +39 -0
  45. package/dist/assertions/swap.js.map +1 -0
  46. package/dist/assertions/utils.d.ts +8 -0
  47. package/dist/assertions/utils.d.ts.map +1 -0
  48. package/dist/assertions/utils.js +57 -0
  49. package/dist/assertions/utils.js.map +1 -0
  50. package/dist/cli.d.ts +3 -0
  51. package/dist/cli.d.ts.map +1 -0
  52. package/dist/cli.js +125 -0
  53. package/dist/cli.js.map +1 -0
  54. package/dist/commands/run.d.ts +20 -0
  55. package/dist/commands/run.d.ts.map +1 -0
  56. package/dist/commands/run.js +115 -0
  57. package/dist/commands/run.js.map +1 -0
  58. package/dist/commands/validate.d.ts +8 -0
  59. package/dist/commands/validate.d.ts.map +1 -0
  60. package/dist/commands/validate.js +43 -0
  61. package/dist/commands/validate.js.map +1 -0
  62. package/dist/config/load.d.ts +20 -0
  63. package/dist/config/load.d.ts.map +1 -0
  64. package/dist/config/load.js +85 -0
  65. package/dist/config/load.js.map +1 -0
  66. package/dist/config/schema.d.ts +109 -0
  67. package/dist/config/schema.d.ts.map +1 -0
  68. package/dist/config/schema.js +103 -0
  69. package/dist/config/schema.js.map +1 -0
  70. package/dist/config/validate.d.ts +10 -0
  71. package/dist/config/validate.d.ts.map +1 -0
  72. package/dist/config/validate.js +129 -0
  73. package/dist/config/validate.js.map +1 -0
  74. package/dist/core/auto-fix.d.ts +16 -0
  75. package/dist/core/auto-fix.d.ts.map +1 -0
  76. package/dist/core/auto-fix.js +82 -0
  77. package/dist/core/auto-fix.js.map +1 -0
  78. package/dist/core/files.d.ts +6 -0
  79. package/dist/core/files.d.ts.map +1 -0
  80. package/dist/core/files.js +75 -0
  81. package/dist/core/files.js.map +1 -0
  82. package/dist/core/rule-filters.d.ts +28 -0
  83. package/dist/core/rule-filters.d.ts.map +1 -0
  84. package/dist/core/rule-filters.js +54 -0
  85. package/dist/core/rule-filters.js.map +1 -0
  86. package/dist/core/runner.d.ts +4 -0
  87. package/dist/core/runner.d.ts.map +1 -0
  88. package/dist/core/runner.js +135 -0
  89. package/dist/core/runner.js.map +1 -0
  90. package/dist/core/scope-parser.d.ts +26 -0
  91. package/dist/core/scope-parser.d.ts.map +1 -0
  92. package/dist/core/scope-parser.js +110 -0
  93. package/dist/core/scope-parser.js.map +1 -0
  94. package/dist/core/timing.d.ts +24 -0
  95. package/dist/core/timing.d.ts.map +1 -0
  96. package/dist/core/timing.js +39 -0
  97. package/dist/core/timing.js.map +1 -0
  98. package/dist/files.d.ts +2 -0
  99. package/dist/files.d.ts.map +1 -0
  100. package/dist/files.js +39 -0
  101. package/dist/files.js.map +1 -0
  102. package/dist/load-config.d.ts +25 -0
  103. package/dist/load-config.d.ts.map +1 -0
  104. package/dist/load-config.js +104 -0
  105. package/dist/load-config.js.map +1 -0
  106. package/dist/load.d.ts +25 -0
  107. package/dist/load.d.ts.map +1 -0
  108. package/dist/load.js +112 -0
  109. package/dist/load.js.map +1 -0
  110. package/dist/reporter/fixes.d.ts +3 -0
  111. package/dist/reporter/fixes.d.ts.map +1 -0
  112. package/dist/reporter/fixes.js +20 -0
  113. package/dist/reporter/fixes.js.map +1 -0
  114. package/dist/reporter/formats/github-actions.d.ts +6 -0
  115. package/dist/reporter/formats/github-actions.d.ts.map +1 -0
  116. package/dist/reporter/formats/github-actions.js +20 -0
  117. package/dist/reporter/formats/github-actions.js.map +1 -0
  118. package/dist/reporter/formats/json.d.ts +6 -0
  119. package/dist/reporter/formats/json.d.ts.map +1 -0
  120. package/dist/reporter/formats/json.js +24 -0
  121. package/dist/reporter/formats/json.js.map +1 -0
  122. package/dist/reporter/formats/sarif.d.ts +10 -0
  123. package/dist/reporter/formats/sarif.d.ts.map +1 -0
  124. package/dist/reporter/formats/sarif.js +66 -0
  125. package/dist/reporter/formats/sarif.js.map +1 -0
  126. package/dist/reporter/formats/table.d.ts +6 -0
  127. package/dist/reporter/formats/table.d.ts.map +1 -0
  128. package/dist/reporter/formats/table.js +38 -0
  129. package/dist/reporter/formats/table.js.map +1 -0
  130. package/dist/reporter/index.d.ts +10 -0
  131. package/dist/reporter/index.d.ts.map +1 -0
  132. package/dist/reporter/index.js +42 -0
  133. package/dist/reporter/index.js.map +1 -0
  134. package/dist/reporter/prioritize-problems.d.ts +7 -0
  135. package/dist/reporter/prioritize-problems.d.ts.map +1 -0
  136. package/dist/reporter/prioritize-problems.js +29 -0
  137. package/dist/reporter/prioritize-problems.js.map +1 -0
  138. package/dist/reporter/statistics.d.ts +17 -0
  139. package/dist/reporter/statistics.d.ts.map +1 -0
  140. package/dist/reporter/statistics.js +52 -0
  141. package/dist/reporter/statistics.js.map +1 -0
  142. package/dist/reporter/summary.d.ts +10 -0
  143. package/dist/reporter/summary.d.ts.map +1 -0
  144. package/dist/reporter/summary.js +48 -0
  145. package/dist/reporter/summary.js.map +1 -0
  146. package/dist/scope.d.ts +26 -0
  147. package/dist/scope.d.ts.map +1 -0
  148. package/dist/scope.js +110 -0
  149. package/dist/scope.js.map +1 -0
  150. package/dist/types/assertions.d.ts +56 -0
  151. package/dist/types/assertions.d.ts.map +1 -0
  152. package/dist/types/assertions.js +2 -0
  153. package/dist/types/assertions.js.map +1 -0
  154. package/dist/types/index.d.ts +6 -0
  155. package/dist/types/index.d.ts.map +1 -0
  156. package/dist/types/index.js +6 -0
  157. package/dist/types/index.js.map +1 -0
  158. package/dist/types/problems.d.ts +21 -0
  159. package/dist/types/problems.d.ts.map +1 -0
  160. package/dist/types/problems.js +2 -0
  161. package/dist/types/problems.js.map +1 -0
  162. package/dist/types/reporting.d.ts +23 -0
  163. package/dist/types/reporting.d.ts.map +1 -0
  164. package/dist/types/reporting.js +2 -0
  165. package/dist/types/reporting.js.map +1 -0
  166. package/dist/types/rules.d.ts +43 -0
  167. package/dist/types/rules.d.ts.map +1 -0
  168. package/dist/types/rules.js +2 -0
  169. package/dist/types/rules.js.map +1 -0
  170. package/dist/types/validation.d.ts +6 -0
  171. package/dist/types/validation.d.ts.map +1 -0
  172. package/dist/types/validation.js +2 -0
  173. package/dist/types/validation.js.map +1 -0
  174. package/dist/types.d.ts +109 -0
  175. package/dist/types.d.ts.map +1 -0
  176. package/dist/types.js +2 -0
  177. package/dist/types.js.map +1 -0
  178. package/dist/validate.d.ts +31 -0
  179. package/dist/validate.d.ts.map +1 -0
  180. package/dist/validate.js +154 -0
  181. package/dist/validate.js.map +1 -0
  182. package/package.json +43 -0
@@ -0,0 +1,75 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import picomatch from 'picomatch';
4
+ const SKIP_DIRS = ['node_modules', 'dist', 'build'];
5
+ export async function discoverMarkdownFiles(inputPath) {
6
+ async function walkDir(dir) {
7
+ const files = [];
8
+ try {
9
+ const entries = await fs.readdir(dir, { withFileTypes: true });
10
+ for (const entry of entries) {
11
+ const fullPath = path.join(dir, entry.name);
12
+ if (entry.isDirectory()) {
13
+ if (entry.name.startsWith('.') || SKIP_DIRS.includes(entry.name)) {
14
+ continue;
15
+ }
16
+ files.push(...(await walkDir(fullPath)));
17
+ }
18
+ else if (entry.isFile() &&
19
+ picomatch.isMatch(entry.name, '*.{md,markdown}', { nocase: true })) {
20
+ files.push(fullPath);
21
+ }
22
+ }
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ return files;
28
+ }
29
+ const stat = await fs.stat(inputPath);
30
+ if (stat.isFile()) {
31
+ return [inputPath];
32
+ }
33
+ else if (stat.isDirectory()) {
34
+ return walkDir(inputPath);
35
+ }
36
+ else {
37
+ return [];
38
+ }
39
+ }
40
+ /**
41
+ * Load list of changed files from either a file path or stdin
42
+ */
43
+ export async function loadChangedFiles(changedListPath) {
44
+ // 1) Prefer explicit file path
45
+ if (changedListPath && changedListPath.length > 0) {
46
+ try {
47
+ const content = await fs.readFile(changedListPath, 'utf8');
48
+ return content
49
+ .split(/\r?\n/)
50
+ .map((s) => s.trim())
51
+ .filter(Boolean);
52
+ }
53
+ catch (_err) {
54
+ return [];
55
+ }
56
+ }
57
+ // 2) Otherwise try to read from stdin if piped
58
+ if (process.stdin.isTTY)
59
+ return [];
60
+ const chunks = [];
61
+ return await new Promise((resolve) => {
62
+ process.stdin.setEncoding('utf8');
63
+ process.stdin.on('data', (d) => chunks.push(String(d)));
64
+ process.stdin.on('end', () => {
65
+ const text = chunks.join('');
66
+ const lines = text
67
+ .split(/\r?\n/)
68
+ .map((s) => s.trim())
69
+ .filter(Boolean);
70
+ resolve(lines);
71
+ });
72
+ process.stdin.resume();
73
+ });
74
+ }
75
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/core/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { NormalizedRule } from '../types/index.js';
2
+ export interface FilterOptions {
3
+ severity?: 'off' | 'info' | 'warn' | 'warning' | 'error';
4
+ tags?: (string | number)[];
5
+ }
6
+ /**
7
+ * Filter out disabled rules (severity: 'off')
8
+ */
9
+ export declare function filterEnabledRules(rules: NormalizedRule[]): {
10
+ enabled: NormalizedRule[];
11
+ disabledCount: number;
12
+ };
13
+ /**
14
+ * Filter rules by minimum severity level
15
+ */
16
+ export declare function filterBySeverity(rules: NormalizedRule[], minSeverity: string): NormalizedRule[];
17
+ /**
18
+ * Filter rules by tags
19
+ */
20
+ export declare function filterByTags(rules: NormalizedRule[], tags: (string | number)[]): NormalizedRule[];
21
+ /**
22
+ * Apply all filters to rules
23
+ */
24
+ export declare function applyFilters(rules: NormalizedRule[], options: FilterOptions): {
25
+ filtered: NormalizedRule[];
26
+ disabledCount: number;
27
+ };
28
+ //# sourceMappingURL=rule-filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-filters.d.ts","sourceRoot":"","sources":["../../src/core/rule-filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CAC5B;AAUD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG;IAC3D,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB,CAIA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAS/F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,cAAc,EAAE,CAIjG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,EAAE,aAAa,GACrB;IACD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACvB,CAgBA"}
@@ -0,0 +1,54 @@
1
+ const SEVERITY_LEVELS = {
2
+ off: -1,
3
+ info: 0,
4
+ warn: 1,
5
+ warning: 1,
6
+ error: 2,
7
+ };
8
+ /**
9
+ * Filter out disabled rules (severity: 'off')
10
+ */
11
+ export function filterEnabledRules(rules) {
12
+ const enabled = rules.filter((rule) => rule.severity !== 'off');
13
+ const disabledCount = rules.length - enabled.length;
14
+ return { enabled, disabledCount };
15
+ }
16
+ /**
17
+ * Filter rules by minimum severity level
18
+ */
19
+ export function filterBySeverity(rules, minSeverity) {
20
+ const minLevel = SEVERITY_LEVELS[minSeverity];
21
+ if (minLevel === undefined)
22
+ return rules;
23
+ return rules.filter((rule) => {
24
+ const ruleSeverity = rule.severity === 'warning' ? 'warn' : rule.severity;
25
+ const ruleLevel = SEVERITY_LEVELS[ruleSeverity];
26
+ return ruleLevel >= minLevel;
27
+ });
28
+ }
29
+ /**
30
+ * Filter rules by tags
31
+ */
32
+ export function filterByTags(rules, tags) {
33
+ if (!tags.length)
34
+ return rules;
35
+ return rules.filter((rule) => rule.tags?.some((tag) => tags.includes(tag)));
36
+ }
37
+ /**
38
+ * Apply all filters to rules
39
+ */
40
+ export function applyFilters(rules, options) {
41
+ // Filter out disabled rules first
42
+ const { enabled, disabledCount } = filterEnabledRules(rules);
43
+ let filtered = enabled;
44
+ // Filter by severity if specified
45
+ if (options.severity) {
46
+ filtered = filterBySeverity(filtered, options.severity);
47
+ }
48
+ // Filter by tags if specified
49
+ if (options.tags?.length) {
50
+ filtered = filterByTags(filtered, options.tags);
51
+ }
52
+ return { filtered, disabledCount };
53
+ }
54
+ //# sourceMappingURL=rule-filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-filters.js","sourceRoot":"","sources":["../../src/core/rule-filters.ts"],"names":[],"mappings":"AAOA,MAAM,eAAe,GAA2B;IAC9C,GAAG,EAAE,CAAC,CAAC;IACP,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;CACT,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAuB;IAIxD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACpD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAuB,EAAE,WAAmB;IAC3E,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAEzC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,KAAM,SAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QACnF,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;QAChD,OAAO,SAAS,IAAI,QAAQ,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAuB,EAAE,IAAyB;IAC7E,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAa,CAAC,CAAC,CAAC,CAAC;AACxF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAuB,EACvB,OAAsB;IAKtB,kCAAkC;IAClC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,QAAQ,GAAG,OAAO,CAAC;IAEvB,kCAAkC;IAClC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACzB,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Problem, NormalizedRule } from '../types/index.js';
2
+ import type { RunOptions } from '../commands/run.js';
3
+ export declare function runRecheck(files: string[], rules: NormalizedRule[], options?: RunOptions): Promise<Problem[]>;
4
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AA0DrD,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,OAAO,EAAE,CAAC,CAsGpB"}
@@ -0,0 +1,135 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { cyan, green, red, yellow } from 'colorette';
4
+ import { shouldProcessFile, shouldSkipLine } from '../assertions/utils.js';
5
+ import { getAssertion } from '../assertions/index.js';
6
+ import { MarkdownScopeParser } from './scope-parser.js';
7
+ import { reportFixes } from '../reporter/fixes.js';
8
+ import { applyFixes, collectFixes } from './auto-fix.js';
9
+ function needsImageMetadata(rules) {
10
+ return rules.some((rule) => Object.keys(rule.assertions).includes('max-image-size'));
11
+ }
12
+ function extractImageReferences(content) {
13
+ const images = [];
14
+ const imageRegex = /!\[([^\]]*)\]\(([^)\s]+)(?:[^\)]*)?\)/g;
15
+ let match;
16
+ while ((match = imageRegex.exec(content)) !== null) {
17
+ const imagePath = match[2];
18
+ if (imagePath.startsWith('http://') || imagePath.startsWith('https://')) {
19
+ continue;
20
+ }
21
+ images.push(imagePath);
22
+ }
23
+ return images;
24
+ }
25
+ async function loadImageMetadata(file, content) {
26
+ const images = new Map();
27
+ const baseDir = path.dirname(file);
28
+ const imageReferences = extractImageReferences(content);
29
+ for (const imagePath of imageReferences) {
30
+ const fullPath = path.resolve(baseDir, imagePath);
31
+ try {
32
+ const stats = await fs.stat(fullPath);
33
+ images.set(imagePath, {
34
+ path: imagePath,
35
+ size: stats.size,
36
+ exists: true,
37
+ });
38
+ }
39
+ catch {
40
+ images.set(imagePath, {
41
+ path: imagePath,
42
+ size: 0,
43
+ exists: false,
44
+ });
45
+ }
46
+ }
47
+ return images.size > 0 ? { images } : undefined;
48
+ }
49
+ export async function runRecheck(files, rules, options = {}) {
50
+ const allProblems = [];
51
+ const scopeParser = new MarkdownScopeParser();
52
+ const segmentsByFile = {};
53
+ const contentsByFile = {};
54
+ const metadataByFile = {};
55
+ // Check if we need to load image metadata
56
+ const loadImageMeta = needsImageMetadata(rules);
57
+ for (const file of files) {
58
+ try {
59
+ const content = await fs.readFile(file, 'utf8');
60
+ contentsByFile[file] = content;
61
+ segmentsByFile[file] = scopeParser.parse(content);
62
+ // Load image metadata if needed
63
+ if (loadImageMeta) {
64
+ metadataByFile[file] = await loadImageMetadata(file, content);
65
+ }
66
+ }
67
+ catch (_error) {
68
+ console.log(yellow(` Warning: Could not read file ${file}`));
69
+ continue;
70
+ }
71
+ }
72
+ for (const file of files) {
73
+ for (const rule of rules) {
74
+ if (!shouldProcessFile(file, rule))
75
+ continue;
76
+ if (options.verbose) {
77
+ console.log(` Checking rule: ${rule.shortName} on ${file}...`);
78
+ }
79
+ for (const [assertionType] of Object.entries(rule.assertions)) {
80
+ const assertion = getAssertion(assertionType);
81
+ if (assertion) {
82
+ try {
83
+ const content = contentsByFile[file];
84
+ const segments = segmentsByFile[file];
85
+ const fileMetadata = metadataByFile[file];
86
+ if (rule.scope && rule.scope !== 'all') {
87
+ const scopedSegments = segments.filter((segment) => segment.scope === rule.scope);
88
+ for (const segment of scopedSegments) {
89
+ if (shouldSkipLine(segment.content, rule)) {
90
+ continue;
91
+ }
92
+ const segmentProblems = await assertion.execute(rule, file, {
93
+ content: segment.content,
94
+ segments: [segment],
95
+ fileMetadata,
96
+ });
97
+ const adjustedProblems = segmentProblems.map((problem) => ({
98
+ ...problem,
99
+ line: problem.line + segment.startLine - 1,
100
+ }));
101
+ allProblems.push(...adjustedProblems);
102
+ }
103
+ }
104
+ else {
105
+ const problems = await assertion.execute(rule, file, {
106
+ content,
107
+ segments,
108
+ fileMetadata,
109
+ });
110
+ allProblems.push(...problems);
111
+ }
112
+ }
113
+ catch (err) {
114
+ console.error(red(`Error executing assertion ${assertionType} on ${file}: ${err.message}`));
115
+ continue;
116
+ }
117
+ }
118
+ }
119
+ }
120
+ }
121
+ if (options.fix) {
122
+ console.log(cyan(`\n🔧 Auto-fixing issues...`));
123
+ const allFixes = await collectFixes(files, rules, contentsByFile, segmentsByFile, metadataByFile);
124
+ if (allFixes.length > 0) {
125
+ await applyFixes(allFixes);
126
+ console.log(green(`✅ Auto-fixed ${allFixes.length} issue(s)!`));
127
+ reportFixes(allFixes);
128
+ }
129
+ else {
130
+ console.log(yellow(`⚠️ No auto-fixable issues found.`));
131
+ }
132
+ }
133
+ return allProblems;
134
+ }
135
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Markdown scope types for semantic content linting
3
+ */
4
+ export type ScopeType = 'all' | 'heading' | 'paragraph' | 'sentence' | 'code' | 'default' | 'table' | 'frontmatter' | 'raw';
5
+ /**
6
+ * Represents a scoped segment of markdown content
7
+ */
8
+ export interface ScopedSegment {
9
+ /** The type of scope this segment represents */
10
+ scope: ScopeType;
11
+ /** The text content of this segment */
12
+ content: string;
13
+ /** Starting line number (1-based) */
14
+ startLine: number;
15
+ /** Ending line number (1-based) */
16
+ endLine: number;
17
+ /** Additional metadata specific to scope type */
18
+ metadata?: Record<string, any>;
19
+ }
20
+ /**
21
+ * Parses markdown content into scoped segments
22
+ */
23
+ export declare class MarkdownScopeParser {
24
+ parse(content: string): ScopedSegment[];
25
+ }
26
+ //# sourceMappingURL=scope-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-parser.d.ts","sourceRoot":"","sources":["../../src/core/scope-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,KAAK,GACL,SAAS,GACT,WAAW,GACX,UAAU,GACV,MAAM,GACN,SAAS,GACT,OAAO,GACP,aAAa,GACb,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,KAAK,EAAE,SAAS,CAAC;IAEjB,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAEhB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAElB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAEhB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE;CAgHxC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Parses markdown content into scoped segments
3
+ */
4
+ export class MarkdownScopeParser {
5
+ parse(content) {
6
+ const segments = [];
7
+ const lines = content.split('\n');
8
+ let lineIndex = 0;
9
+ while (lineIndex < lines.length) {
10
+ const line = lines[lineIndex];
11
+ const lineNumber = lineIndex + 1;
12
+ // Frontmatter
13
+ if (lineNumber === 1 && line === '---') {
14
+ let endIndex = lineIndex + 1;
15
+ while (endIndex < lines.length && lines[endIndex] !== '---') {
16
+ endIndex++;
17
+ }
18
+ if (endIndex < lines.length) {
19
+ segments.push({
20
+ scope: 'frontmatter',
21
+ startLine: lineNumber,
22
+ endLine: endIndex + 1,
23
+ content: lines.slice(lineIndex, endIndex + 1).join('\n'),
24
+ });
25
+ lineIndex = endIndex + 1;
26
+ continue;
27
+ }
28
+ }
29
+ // Code blocks
30
+ if (line.startsWith('```') || line.startsWith('~~~')) {
31
+ const fenceType = line.substring(0, 3);
32
+ let endIndex = lineIndex + 1;
33
+ while (endIndex < lines.length && !lines[endIndex].startsWith(fenceType)) {
34
+ endIndex++;
35
+ }
36
+ segments.push({
37
+ scope: 'code',
38
+ startLine: lineNumber,
39
+ endLine: endIndex + 1,
40
+ content: lines.slice(lineIndex, endIndex + 1).join('\n'),
41
+ metadata: { language: line.substring(3) },
42
+ });
43
+ lineIndex = endIndex + 1;
44
+ continue;
45
+ }
46
+ // Tables
47
+ if (line.includes('|')) {
48
+ let endIndex = lineIndex;
49
+ while (endIndex < lines.length && lines[endIndex].includes('|')) {
50
+ endIndex++;
51
+ }
52
+ segments.push({
53
+ scope: 'table',
54
+ startLine: lineNumber,
55
+ endLine: endIndex,
56
+ content: lines.slice(lineIndex, endIndex).join('\n'),
57
+ });
58
+ lineIndex = endIndex;
59
+ continue;
60
+ }
61
+ // Headings
62
+ const headingMatch = line.match(/^(#{1,6})\s/);
63
+ if (headingMatch) {
64
+ segments.push({
65
+ scope: 'heading',
66
+ startLine: lineNumber,
67
+ endLine: lineNumber,
68
+ content: line,
69
+ metadata: { level: headingMatch[1].length },
70
+ });
71
+ lineIndex++;
72
+ continue;
73
+ }
74
+ // HTML comments
75
+ if (line.trim().startsWith('<!--')) {
76
+ let endIndex = lineIndex;
77
+ while (endIndex < lines.length && !lines[endIndex].trim().endsWith('-->')) {
78
+ endIndex++;
79
+ }
80
+ segments.push({
81
+ scope: 'code',
82
+ startLine: lineNumber,
83
+ endLine: endIndex + 1,
84
+ content: lines.slice(lineIndex, endIndex + 1).join('\n'),
85
+ metadata: { language: 'html-comment' },
86
+ });
87
+ lineIndex = endIndex + 1;
88
+ continue;
89
+ }
90
+ // Paragraphs (simple version)
91
+ if (line.trim() !== '') {
92
+ let endIndex = lineIndex;
93
+ while (endIndex + 1 < lines.length && lines[endIndex + 1].trim() !== '') {
94
+ endIndex++;
95
+ }
96
+ segments.push({
97
+ scope: 'paragraph',
98
+ startLine: lineNumber,
99
+ endLine: endIndex + 1,
100
+ content: lines.slice(lineIndex, endIndex + 1).join('\n'),
101
+ });
102
+ lineIndex = endIndex + 1;
103
+ continue;
104
+ }
105
+ lineIndex++;
106
+ }
107
+ return segments;
108
+ }
109
+ }
110
+ //# sourceMappingURL=scope-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-parser.js","sourceRoot":"","sources":["../../src/core/scope-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Format elapsed time in milliseconds to a human readable string
3
+ */
4
+ export declare function formatElapsedTime(elapsedMs: number): string;
5
+ /**
6
+ * Simple timer utility for measuring execution time
7
+ */
8
+ export declare class Timer {
9
+ private startTime;
10
+ constructor();
11
+ /**
12
+ * Get elapsed time since timer creation
13
+ */
14
+ elapsed(): number;
15
+ /**
16
+ * Get formatted elapsed time string
17
+ */
18
+ elapsedString(): string;
19
+ /**
20
+ * Reset the timer
21
+ */
22
+ reset(): void;
23
+ }
24
+ //# sourceMappingURL=timing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/core/timing.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,SAAS,CAAS;;IAM1B;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Format elapsed time in milliseconds to a human readable string
3
+ */
4
+ export function formatElapsedTime(elapsedMs) {
5
+ return elapsedMs < 1000 ? `${elapsedMs}ms` : `${(elapsedMs / 1000).toFixed(1)}s`;
6
+ }
7
+ /**
8
+ * Simple timer utility for measuring execution time
9
+ */
10
+ export class Timer {
11
+ constructor() {
12
+ Object.defineProperty(this, "startTime", {
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true,
16
+ value: void 0
17
+ });
18
+ this.startTime = Date.now();
19
+ }
20
+ /**
21
+ * Get elapsed time since timer creation
22
+ */
23
+ elapsed() {
24
+ return Date.now() - this.startTime;
25
+ }
26
+ /**
27
+ * Get formatted elapsed time string
28
+ */
29
+ elapsedString() {
30
+ return formatElapsedTime(this.elapsed());
31
+ }
32
+ /**
33
+ * Reset the timer
34
+ */
35
+ reset() {
36
+ this.startTime = Date.now();
37
+ }
38
+ }
39
+ //# sourceMappingURL=timing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/core/timing.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,KAAK;IAGhB;QAFQ;;;;;WAAkB;QAGxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export declare function getMarkdownFiles(inputPath: string): Promise<string[]>;
2
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAMA,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkC3E"}
package/dist/files.js ADDED
@@ -0,0 +1,39 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { minimatch } from 'minimatch';
4
+ const SKIP_DIRS = ['node_modules', 'dist', 'build'];
5
+ export async function getMarkdownFiles(inputPath) {
6
+ async function walkDir(dir) {
7
+ const files = [];
8
+ try {
9
+ const entries = await fs.readdir(dir, { withFileTypes: true });
10
+ for (const entry of entries) {
11
+ const fullPath = path.join(dir, entry.name);
12
+ if (entry.isDirectory()) {
13
+ if (entry.name.startsWith('.') || SKIP_DIRS.includes(entry.name)) {
14
+ continue;
15
+ }
16
+ files.push(...(await walkDir(fullPath)));
17
+ }
18
+ else if (entry.isFile() && minimatch(entry.name, '*.{md,markdown}', { nocase: true })) {
19
+ files.push(fullPath);
20
+ }
21
+ }
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ return files;
27
+ }
28
+ const stat = await fs.stat(inputPath);
29
+ if (stat.isFile()) {
30
+ return [inputPath];
31
+ }
32
+ else if (stat.isDirectory()) {
33
+ return walkDir(inputPath);
34
+ }
35
+ else {
36
+ return [];
37
+ }
38
+ }
39
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IACtD,KAAK,UAAU,OAAO,CAAC,GAAW;QAChC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBACjE,SAAS;oBACX,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC3C,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;oBACxF,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;SAAM,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { NormalizedRule, ValidationError } from './types.js';
2
+ export interface LoadResult {
3
+ success: boolean;
4
+ rules: NormalizedRule[];
5
+ errors: ValidationError[];
6
+ configPath?: string;
7
+ }
8
+ export declare class ConfigLoader {
9
+ private validator;
10
+ private constructor();
11
+ static create(): Promise<ConfigLoader>;
12
+ /**
13
+ * Loads and validates a recheck configuration file
14
+ */
15
+ loadConfig(configPath: string): Promise<LoadResult>;
16
+ /**
17
+ * Finds a recheck configuration file in the current directory or parent directories
18
+ */
19
+ findConfigFile(startDir?: string): Promise<string | null>;
20
+ /**
21
+ * Loads configuration with automatic discovery
22
+ */
23
+ loadConfigAuto(configPath?: string): Promise<LoadResult>;
24
+ }
25
+ //# sourceMappingURL=load-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../src/load-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAkB;IAEnC,OAAO;WAIM,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAK5C;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAwCzD;;OAEG;IACG,cAAc,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA2B9E;;OAEG;IACG,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAkB/D"}