@dougis/markdown-lint-mcp 1.0.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 (246) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/CONTRIBUTING.md +474 -0
  3. package/LICENSE +21 -0
  4. package/README.md +240 -0
  5. package/USAGE.md +40 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +39 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/rules/index.d.ts +22 -0
  11. package/dist/rules/index.d.ts.map +1 -0
  12. package/dist/rules/index.js +144 -0
  13. package/dist/rules/index.js.map +1 -0
  14. package/dist/rules/md001.d.ts +25 -0
  15. package/dist/rules/md001.d.ts.map +1 -0
  16. package/dist/rules/md001.js +79 -0
  17. package/dist/rules/md001.js.map +1 -0
  18. package/dist/rules/md003.d.ts +41 -0
  19. package/dist/rules/md003.d.ts.map +1 -0
  20. package/dist/rules/md003.js +130 -0
  21. package/dist/rules/md003.js.map +1 -0
  22. package/dist/rules/md004.d.ts +28 -0
  23. package/dist/rules/md004.d.ts.map +1 -0
  24. package/dist/rules/md004.js +79 -0
  25. package/dist/rules/md004.js.map +1 -0
  26. package/dist/rules/md005.d.ts +21 -0
  27. package/dist/rules/md005.d.ts.map +1 -0
  28. package/dist/rules/md005.js +88 -0
  29. package/dist/rules/md005.js.map +1 -0
  30. package/dist/rules/md007.d.ts +21 -0
  31. package/dist/rules/md007.d.ts.map +1 -0
  32. package/dist/rules/md007.js +66 -0
  33. package/dist/rules/md007.js.map +1 -0
  34. package/dist/rules/md009.d.ts +35 -0
  35. package/dist/rules/md009.d.ts.map +1 -0
  36. package/dist/rules/md009.js +122 -0
  37. package/dist/rules/md009.js.map +1 -0
  38. package/dist/rules/md010.d.ts +34 -0
  39. package/dist/rules/md010.d.ts.map +1 -0
  40. package/dist/rules/md010.js +75 -0
  41. package/dist/rules/md010.js.map +1 -0
  42. package/dist/rules/md011.d.ts +30 -0
  43. package/dist/rules/md011.d.ts.map +1 -0
  44. package/dist/rules/md011.js +123 -0
  45. package/dist/rules/md011.js.map +1 -0
  46. package/dist/rules/md012.d.ts +33 -0
  47. package/dist/rules/md012.d.ts.map +1 -0
  48. package/dist/rules/md012.js +125 -0
  49. package/dist/rules/md012.js.map +1 -0
  50. package/dist/rules/md013.d.ts +26 -0
  51. package/dist/rules/md013.d.ts.map +1 -0
  52. package/dist/rules/md013.js +32 -0
  53. package/dist/rules/md013.js.map +1 -0
  54. package/dist/rules/md014.d.ts +29 -0
  55. package/dist/rules/md014.d.ts.map +1 -0
  56. package/dist/rules/md014.js +176 -0
  57. package/dist/rules/md014.js.map +1 -0
  58. package/dist/rules/md018.d.ts +22 -0
  59. package/dist/rules/md018.d.ts.map +1 -0
  60. package/dist/rules/md018.js +27 -0
  61. package/dist/rules/md018.js.map +1 -0
  62. package/dist/rules/md019.d.ts +22 -0
  63. package/dist/rules/md019.d.ts.map +1 -0
  64. package/dist/rules/md019.js +27 -0
  65. package/dist/rules/md019.js.map +1 -0
  66. package/dist/rules/md020.d.ts +22 -0
  67. package/dist/rules/md020.d.ts.map +1 -0
  68. package/dist/rules/md020.js +27 -0
  69. package/dist/rules/md020.js.map +1 -0
  70. package/dist/rules/md021.d.ts +22 -0
  71. package/dist/rules/md021.d.ts.map +1 -0
  72. package/dist/rules/md021.js +27 -0
  73. package/dist/rules/md021.js.map +1 -0
  74. package/dist/rules/md022.d.ts +21 -0
  75. package/dist/rules/md022.d.ts.map +1 -0
  76. package/dist/rules/md022.js +43 -0
  77. package/dist/rules/md022.js.map +1 -0
  78. package/dist/rules/md023.d.ts +21 -0
  79. package/dist/rules/md023.d.ts.map +1 -0
  80. package/dist/rules/md023.js +34 -0
  81. package/dist/rules/md023.js.map +1 -0
  82. package/dist/rules/md024.d.ts +30 -0
  83. package/dist/rules/md024.d.ts.map +1 -0
  84. package/dist/rules/md024.js +123 -0
  85. package/dist/rules/md024.js.map +1 -0
  86. package/dist/rules/md025.d.ts +34 -0
  87. package/dist/rules/md025.d.ts.map +1 -0
  88. package/dist/rules/md025.js +134 -0
  89. package/dist/rules/md025.js.map +1 -0
  90. package/dist/rules/md026.d.ts +21 -0
  91. package/dist/rules/md026.d.ts.map +1 -0
  92. package/dist/rules/md026.js +31 -0
  93. package/dist/rules/md026.js.map +1 -0
  94. package/dist/rules/md027.d.ts +22 -0
  95. package/dist/rules/md027.d.ts.map +1 -0
  96. package/dist/rules/md027.js +27 -0
  97. package/dist/rules/md027.js.map +1 -0
  98. package/dist/rules/md028.d.ts +37 -0
  99. package/dist/rules/md028.d.ts.map +1 -0
  100. package/dist/rules/md028.js +84 -0
  101. package/dist/rules/md028.js.map +1 -0
  102. package/dist/rules/md029.d.ts +30 -0
  103. package/dist/rules/md029.d.ts.map +1 -0
  104. package/dist/rules/md029.js +36 -0
  105. package/dist/rules/md029.js.map +1 -0
  106. package/dist/rules/md030.d.ts +28 -0
  107. package/dist/rules/md030.d.ts.map +1 -0
  108. package/dist/rules/md030.js +76 -0
  109. package/dist/rules/md030.js.map +1 -0
  110. package/dist/rules/md031.d.ts +22 -0
  111. package/dist/rules/md031.d.ts.map +1 -0
  112. package/dist/rules/md031.js +55 -0
  113. package/dist/rules/md031.js.map +1 -0
  114. package/dist/rules/md032.d.ts +21 -0
  115. package/dist/rules/md032.d.ts.map +1 -0
  116. package/dist/rules/md032.js +69 -0
  117. package/dist/rules/md032.js.map +1 -0
  118. package/dist/rules/md033.d.ts +28 -0
  119. package/dist/rules/md033.d.ts.map +1 -0
  120. package/dist/rules/md033.js +34 -0
  121. package/dist/rules/md033.js.map +1 -0
  122. package/dist/rules/md034.d.ts +28 -0
  123. package/dist/rules/md034.d.ts.map +1 -0
  124. package/dist/rules/md034.js +100 -0
  125. package/dist/rules/md034.js.map +1 -0
  126. package/dist/rules/md035.d.ts +23 -0
  127. package/dist/rules/md035.d.ts.map +1 -0
  128. package/dist/rules/md035.js +52 -0
  129. package/dist/rules/md035.js.map +1 -0
  130. package/dist/rules/md036.d.ts +34 -0
  131. package/dist/rules/md036.d.ts.map +1 -0
  132. package/dist/rules/md036.js +112 -0
  133. package/dist/rules/md036.js.map +1 -0
  134. package/dist/rules/md037.d.ts +28 -0
  135. package/dist/rules/md037.d.ts.map +1 -0
  136. package/dist/rules/md037.js +122 -0
  137. package/dist/rules/md037.js.map +1 -0
  138. package/dist/rules/md038.d.ts +28 -0
  139. package/dist/rules/md038.d.ts.map +1 -0
  140. package/dist/rules/md038.js +62 -0
  141. package/dist/rules/md038.js.map +1 -0
  142. package/dist/rules/md039.d.ts +21 -0
  143. package/dist/rules/md039.d.ts.map +1 -0
  144. package/dist/rules/md039.js +34 -0
  145. package/dist/rules/md039.js.map +1 -0
  146. package/dist/rules/md040.d.ts +21 -0
  147. package/dist/rules/md040.d.ts.map +1 -0
  148. package/dist/rules/md040.js +46 -0
  149. package/dist/rules/md040.js.map +1 -0
  150. package/dist/rules/md041.d.ts +33 -0
  151. package/dist/rules/md041.d.ts.map +1 -0
  152. package/dist/rules/md041.js +92 -0
  153. package/dist/rules/md041.js.map +1 -0
  154. package/dist/rules/md042.d.ts +22 -0
  155. package/dist/rules/md042.d.ts.map +1 -0
  156. package/dist/rules/md042.js +50 -0
  157. package/dist/rules/md042.js.map +1 -0
  158. package/dist/rules/md043.d.ts +39 -0
  159. package/dist/rules/md043.d.ts.map +1 -0
  160. package/dist/rules/md043.js +116 -0
  161. package/dist/rules/md043.js.map +1 -0
  162. package/dist/rules/md044.d.ts +40 -0
  163. package/dist/rules/md044.d.ts.map +1 -0
  164. package/dist/rules/md044.js +167 -0
  165. package/dist/rules/md044.js.map +1 -0
  166. package/dist/rules/md045.d.ts +22 -0
  167. package/dist/rules/md045.d.ts.map +1 -0
  168. package/dist/rules/md045.js +57 -0
  169. package/dist/rules/md045.js.map +1 -0
  170. package/dist/rules/md046.d.ts +23 -0
  171. package/dist/rules/md046.d.ts.map +1 -0
  172. package/dist/rules/md046.js +174 -0
  173. package/dist/rules/md046.js.map +1 -0
  174. package/dist/rules/md047.d.ts +22 -0
  175. package/dist/rules/md047.d.ts.map +1 -0
  176. package/dist/rules/md047.js +35 -0
  177. package/dist/rules/md047.js.map +1 -0
  178. package/dist/rules/md048.d.ts +22 -0
  179. package/dist/rules/md048.d.ts.map +1 -0
  180. package/dist/rules/md048.js +80 -0
  181. package/dist/rules/md048.js.map +1 -0
  182. package/dist/rules/md049.d.ts +33 -0
  183. package/dist/rules/md049.d.ts.map +1 -0
  184. package/dist/rules/md049.js +189 -0
  185. package/dist/rules/md049.js.map +1 -0
  186. package/dist/rules/md050.d.ts +22 -0
  187. package/dist/rules/md050.d.ts.map +1 -0
  188. package/dist/rules/md050.js +32 -0
  189. package/dist/rules/md050.js.map +1 -0
  190. package/dist/rules/md051.d.ts +23 -0
  191. package/dist/rules/md051.d.ts.map +1 -0
  192. package/dist/rules/md051.js +63 -0
  193. package/dist/rules/md051.js.map +1 -0
  194. package/dist/rules/md052.d.ts +21 -0
  195. package/dist/rules/md052.d.ts.map +1 -0
  196. package/dist/rules/md052.js +71 -0
  197. package/dist/rules/md052.js.map +1 -0
  198. package/dist/rules/md053.d.ts +21 -0
  199. package/dist/rules/md053.d.ts.map +1 -0
  200. package/dist/rules/md053.js +95 -0
  201. package/dist/rules/md053.js.map +1 -0
  202. package/dist/rules/md054.d.ts +21 -0
  203. package/dist/rules/md054.d.ts.map +1 -0
  204. package/dist/rules/md054.js +87 -0
  205. package/dist/rules/md054.js.map +1 -0
  206. package/dist/rules/md055.d.ts +22 -0
  207. package/dist/rules/md055.d.ts.map +1 -0
  208. package/dist/rules/md055.js +157 -0
  209. package/dist/rules/md055.js.map +1 -0
  210. package/dist/rules/md056.d.ts +21 -0
  211. package/dist/rules/md056.d.ts.map +1 -0
  212. package/dist/rules/md056.js +154 -0
  213. package/dist/rules/md056.js.map +1 -0
  214. package/dist/rules/md058.d.ts +27 -0
  215. package/dist/rules/md058.d.ts.map +1 -0
  216. package/dist/rules/md058.js +71 -0
  217. package/dist/rules/md058.js.map +1 -0
  218. package/dist/rules/md059.d.ts +22 -0
  219. package/dist/rules/md059.d.ts.map +1 -0
  220. package/dist/rules/md059.js +161 -0
  221. package/dist/rules/md059.js.map +1 -0
  222. package/dist/rules/rule-interface.d.ts +51 -0
  223. package/dist/rules/rule-interface.d.ts.map +1 -0
  224. package/dist/rules/rule-interface.js +2 -0
  225. package/dist/rules/rule-interface.js.map +1 -0
  226. package/dist/server.d.ts +59 -0
  227. package/dist/server.d.ts.map +1 -0
  228. package/dist/server.js +419 -0
  229. package/dist/server.js.map +1 -0
  230. package/dist/types.d.ts +74 -0
  231. package/dist/types.d.ts.map +1 -0
  232. package/dist/types.js +14 -0
  233. package/dist/types.js.map +1 -0
  234. package/dist/utils/file.d.ts +39 -0
  235. package/dist/utils/file.d.ts.map +1 -0
  236. package/dist/utils/file.js +124 -0
  237. package/dist/utils/file.js.map +1 -0
  238. package/dist/utils/logger.d.ts +61 -0
  239. package/dist/utils/logger.d.ts.map +1 -0
  240. package/dist/utils/logger.js +85 -0
  241. package/dist/utils/logger.js.map +1 -0
  242. package/dist/utils/safe-match.d.ts +4 -0
  243. package/dist/utils/safe-match.d.ts.map +1 -0
  244. package/dist/utils/safe-match.js +51 -0
  245. package/dist/utils/safe-match.js.map +1 -0
  246. package/package.json +85 -0
@@ -0,0 +1,130 @@
1
+ /**
2
+ * MD003: Heading style
3
+ *
4
+ * This rule enforces a consistent heading style, which could be:
5
+ * - atx: # Heading
6
+ * - atx_closed: # Heading #
7
+ * - setext: Heading
8
+ * =======
9
+ *
10
+ * The default is atx, but this can be configured in .markdownlint.json.
11
+ */
12
+ export const name = 'MD003';
13
+ export const description = 'Heading style';
14
+ /**
15
+ * Enum for heading styles
16
+ */
17
+ var HeadingStyle;
18
+ (function (HeadingStyle) {
19
+ HeadingStyle["ATX"] = "atx";
20
+ HeadingStyle["ATX_CLOSED"] = "atx_closed";
21
+ HeadingStyle["SETEXT"] = "setext";
22
+ })(HeadingStyle || (HeadingStyle = {}));
23
+ /**
24
+ * Detect if a line is a heading and what style it uses
25
+ * @param line The line to check
26
+ * @returns An object with the heading level and style, or null if not a heading
27
+ */
28
+ function detectHeadingStyle(line, nextLine) {
29
+ // ATX style: # Heading
30
+ const atxMatch = line.match(/^(#{1,6})\s+(.+?)(?:\s+#*)?$/);
31
+ if (atxMatch) {
32
+ // Check if it's closed style: # Heading #
33
+ const isClosed = line.trim().endsWith('#');
34
+ return {
35
+ level: atxMatch[1].length,
36
+ style: isClosed ? HeadingStyle.ATX_CLOSED : HeadingStyle.ATX,
37
+ content: atxMatch[2].trim(),
38
+ };
39
+ }
40
+ // Setext style: Heading
41
+ // =======
42
+ if (nextLine && /^[=-]+$/.test(nextLine.trim())) {
43
+ return {
44
+ level: nextLine.trim()[0] === '=' ? 1 : 2,
45
+ style: HeadingStyle.SETEXT,
46
+ content: line.trim(),
47
+ };
48
+ }
49
+ return null;
50
+ }
51
+ /**
52
+ * Convert a heading to the specified style
53
+ * @param headingInfo The heading information (level, style, content)
54
+ * @param targetStyle The style to convert to
55
+ * @returns An array of lines for the new heading (could be 1 or 2 lines)
56
+ */
57
+ function convertHeadingStyle(headingInfo, targetStyle) {
58
+ const { level, content } = headingInfo;
59
+ // Cannot convert to setext if level > 2
60
+ if (targetStyle === HeadingStyle.SETEXT && level > 2) {
61
+ targetStyle = HeadingStyle.ATX;
62
+ }
63
+ switch (targetStyle) {
64
+ case HeadingStyle.ATX:
65
+ return [`${'#'.repeat(level)} ${content}`];
66
+ case HeadingStyle.ATX_CLOSED:
67
+ return [`${'#'.repeat(level)} ${content} ${'#'.repeat(level)}`];
68
+ case HeadingStyle.SETEXT:
69
+ const underline = level === 1 ? '='.repeat(content.length) : '-'.repeat(content.length);
70
+ return [content, underline];
71
+ default:
72
+ return [`${'#'.repeat(level)} ${content}`]; // Default to ATX
73
+ }
74
+ }
75
+ /**
76
+ * Fix headings to use a consistent style
77
+ * @param lines Array of string lines to fix
78
+ * @param config Optional configuration object
79
+ * @returns Fixed lines array with consistent heading styles
80
+ */
81
+ export function fix(lines, config) {
82
+ if (lines.length === 0)
83
+ return lines;
84
+ // Default to ATX style if not configured
85
+ const targetStyle = config?.style || HeadingStyle.ATX;
86
+ const result = [];
87
+ for (let i = 0; i < lines.length; i++) {
88
+ const line = lines[i];
89
+ const nextLine = i < lines.length - 1 ? lines[i + 1] : undefined;
90
+ // Check if this line is a heading
91
+ const headingInfo = detectHeadingStyle(line, nextLine);
92
+ if (headingInfo) {
93
+ // We found a heading, let's check if it needs to be converted
94
+ if (headingInfo.style !== targetStyle) {
95
+ // Convert to the target style
96
+ const newHeadingLines = convertHeadingStyle(headingInfo, targetStyle);
97
+ // Add the new heading lines
98
+ result.push(...newHeadingLines);
99
+ // If we processed a setext heading, skip the next line (the underline)
100
+ if (headingInfo.style === HeadingStyle.SETEXT) {
101
+ i++;
102
+ }
103
+ }
104
+ else {
105
+ // Heading is already in the correct style
106
+ result.push(line);
107
+ // If it's a setext heading, also add the underline
108
+ if (headingInfo.style === HeadingStyle.SETEXT) {
109
+ result.push(nextLine);
110
+ i++;
111
+ }
112
+ }
113
+ }
114
+ else {
115
+ // Not a heading, just add the line
116
+ result.push(line);
117
+ }
118
+ }
119
+ return result;
120
+ }
121
+ /**
122
+ * Rule implementation for MD003
123
+ */
124
+ export const rule = {
125
+ name,
126
+ description,
127
+ fix,
128
+ };
129
+ export default rule;
130
+ //# sourceMappingURL=md003.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md003.js","sourceRoot":"","sources":["../../src/rules/md003.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { Rule, RuleViolation } from './rule-interface';
2
+ /**
3
+ * MD004: Unordered list style
4
+ *
5
+ * This rule is triggered when the list style of unordered lists is inconsistent.
6
+ * The rule ensures consistent use of bullet markers (*, +, -) in unordered lists.
7
+ * By default, this rule enforces a consistent style, using the first style detected.
8
+ */
9
+ export declare const name = "MD004";
10
+ export declare const description = "Unordered list style";
11
+ /**
12
+ * Fix unordered lists by ensuring consistent bullet marker style
13
+ * @param lines Array of string lines to fix
14
+ * @returns Fixed lines array with consistent bullet markers
15
+ */
16
+ export declare function fix(lines: string[]): string[];
17
+ /**
18
+ * Validate lines for inconsistent unordered list styles
19
+ * @param lines Array of string lines to validate
20
+ * @returns Array of rule violations
21
+ */
22
+ export declare function validate(lines: string[]): RuleViolation[];
23
+ /**
24
+ * Rule implementation for MD004
25
+ */
26
+ export declare const rule: Rule;
27
+ export default rule;
28
+ //# sourceMappingURL=md004.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md004.d.ts","sourceRoot":"","sources":["../../src/rules/md004.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,UAAU,CAAC;AAC5B,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA4B7C;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAwBzD;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,IAKlB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * MD004: Unordered list style
3
+ *
4
+ * This rule is triggered when the list style of unordered lists is inconsistent.
5
+ * The rule ensures consistent use of bullet markers (*, +, -) in unordered lists.
6
+ * By default, this rule enforces a consistent style, using the first style detected.
7
+ */
8
+ export const name = 'MD004';
9
+ export const description = 'Unordered list style';
10
+ /**
11
+ * Fix unordered lists by ensuring consistent bullet marker style
12
+ * @param lines Array of string lines to fix
13
+ * @returns Fixed lines array with consistent bullet markers
14
+ */
15
+ export function fix(lines) {
16
+ // First, detect what style is used in the first list
17
+ let firstBulletStyle = null;
18
+ // Detect the first bullet style used
19
+ for (const line of lines) {
20
+ const match = line.match(/^\s*([-+*])\s+/);
21
+ if (match) {
22
+ firstBulletStyle = match[1];
23
+ break;
24
+ }
25
+ }
26
+ // If no bullet style was found, return the lines unchanged
27
+ if (!firstBulletStyle) {
28
+ return lines;
29
+ }
30
+ // Now apply the consistent style to all list items
31
+ return lines.map(line => {
32
+ // Check if this line is a list item with a different bullet style
33
+ const match = line.match(/^(\s*)([-+*])(\s+.*)/);
34
+ if (match && match[2] !== firstBulletStyle) {
35
+ // Replace the bullet style while keeping indentation and content
36
+ return `${match[1]}${firstBulletStyle}${match[3]}`;
37
+ }
38
+ return line;
39
+ });
40
+ }
41
+ /**
42
+ * Validate lines for inconsistent unordered list styles
43
+ * @param lines Array of string lines to validate
44
+ * @returns Array of rule violations
45
+ */
46
+ export function validate(lines) {
47
+ const violations = [];
48
+ let firstBulletStyle = null;
49
+ lines.forEach((line, index) => {
50
+ const match = line.match(/^\s*([-+*])\s+/);
51
+ if (match) {
52
+ const bulletStyle = match[1];
53
+ if (firstBulletStyle === null) {
54
+ // Set the first bullet style as the expected style
55
+ firstBulletStyle = bulletStyle;
56
+ }
57
+ else if (bulletStyle !== firstBulletStyle) {
58
+ // Found inconsistent bullet style
59
+ violations.push({
60
+ lineNumber: index + 1,
61
+ details: `Expected '${firstBulletStyle}' for unordered list item, found '${bulletStyle}'`,
62
+ range: [match.index || 0, match[0].length],
63
+ });
64
+ }
65
+ }
66
+ });
67
+ return violations;
68
+ }
69
+ /**
70
+ * Rule implementation for MD004
71
+ */
72
+ export const rule = {
73
+ name,
74
+ description,
75
+ validate,
76
+ fix,
77
+ };
78
+ export default rule;
79
+ //# sourceMappingURL=md004.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md004.js","sourceRoot":"","sources":["../../src/rules/md004.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC;AAC5B,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,qDAAqD;IACrD,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAE3C,qCAAqC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM;QACR,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mDAAmD;IACnD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACtB,kEAAkE;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjD,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,EAAE,CAAC;YAC3C,iEAAiE;YACjE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAe;IACtC,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAE3C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE7B,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC9B,mDAAmD;gBACnD,gBAAgB,GAAG,WAAW,CAAC;YACjC,CAAC;iBAAM,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;gBAC5C,kCAAkC;gBAClC,UAAU,CAAC,IAAI,CAAC;oBACd,UAAU,EAAE,KAAK,GAAG,CAAC;oBACrB,OAAO,EAAE,aAAa,gBAAgB,qCAAqC,WAAW,GAAG;oBACzF,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;iBAC3C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAS;IACxB,IAAI;IACJ,WAAW;IACX,QAAQ;IACR,GAAG;CACJ,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Rule } from './rule-interface';
2
+ /**
3
+ * MD005: Inconsistent indentation for list items at the same level
4
+ *
5
+ * This rule is triggered when list items at the same level have different indentation.
6
+ * List items should be consistently indented for readability.
7
+ */
8
+ export declare const name = "MD005";
9
+ export declare const description = "Inconsistent indentation for list items at the same level";
10
+ /**
11
+ * Fix inconsistently indented list items by standardizing indentation
12
+ * @param lines Array of string lines to fix
13
+ * @returns Fixed lines array with consistent list indentation
14
+ */
15
+ export declare function fix(lines: string[]): string[];
16
+ /**
17
+ * Rule implementation for MD005
18
+ */
19
+ export declare const rule: Rule;
20
+ export default rule;
21
+ //# sourceMappingURL=md005.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md005.d.ts","sourceRoot":"","sources":["../../src/rules/md005.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC;;;;;GAKG;AACH,eAAO,MAAM,IAAI,UAAU,CAAC;AAC5B,eAAO,MAAM,WAAW,8DAA8D,CAAC;AAEvF;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAuE7C;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,IAIlB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * MD005: Inconsistent indentation for list items at the same level
3
+ *
4
+ * This rule is triggered when list items at the same level have different indentation.
5
+ * List items should be consistently indented for readability.
6
+ */
7
+ export const name = 'MD005';
8
+ export const description = 'Inconsistent indentation for list items at the same level';
9
+ /**
10
+ * Fix inconsistently indented list items by standardizing indentation
11
+ * @param lines Array of string lines to fix
12
+ * @returns Fixed lines array with consistent list indentation
13
+ */
14
+ export function fix(lines) {
15
+ const listItemRegex = /^(\s*)([*+-]|\d+[.)])\s+(.*)$/;
16
+ // Maps indentation level (number of parent lists) to space count
17
+ const levelToSpaces = {};
18
+ // Track current list level - increments on nested lists, decrements when nesting ends
19
+ let currentLevel = 0;
20
+ // First pass: detect the correct indentation for each level
21
+ lines.forEach(line => {
22
+ const match = line.match(listItemRegex);
23
+ if (!match)
24
+ return;
25
+ const indentation = match[1].length;
26
+ // If this is the first item at this level or has less indentation than what we've seen
27
+ if (!(currentLevel in levelToSpaces) || indentation < levelToSpaces[currentLevel]) {
28
+ levelToSpaces[currentLevel] = indentation;
29
+ }
30
+ // Check for new list level by looking at indentation
31
+ if (currentLevel === 0 || indentation > levelToSpaces[currentLevel - 1]) {
32
+ currentLevel++;
33
+ }
34
+ else if (currentLevel > 0 && indentation <= levelToSpaces[currentLevel - 1]) {
35
+ // Find the right level based on indentation
36
+ while (currentLevel > 0 && indentation <= levelToSpaces[currentLevel - 1]) {
37
+ currentLevel--;
38
+ }
39
+ // If still a list item, we're at the correct level
40
+ if (indentation > 0) {
41
+ currentLevel++;
42
+ }
43
+ }
44
+ });
45
+ // Reset for second pass
46
+ currentLevel = 0;
47
+ // Second pass: fix inconsistent indentation
48
+ return lines.map(line => {
49
+ const match = line.match(listItemRegex);
50
+ if (!match) {
51
+ // Not a list item, but if blank line or non-list content, may affect list nesting
52
+ if (line.trim() === '' || !line.trim().startsWith(' ')) {
53
+ // Reset level when we encounter non-list content
54
+ currentLevel = 0;
55
+ }
56
+ return line;
57
+ }
58
+ const indentation = match[1].length;
59
+ const marker = match[2];
60
+ const content = match[3];
61
+ // Update current level based on indentation
62
+ if (currentLevel === 0 || indentation > levelToSpaces[currentLevel - 1]) {
63
+ currentLevel++;
64
+ }
65
+ else if (currentLevel > 0 && indentation <= levelToSpaces[currentLevel - 1]) {
66
+ while (currentLevel > 0 && indentation <= levelToSpaces[currentLevel - 1]) {
67
+ currentLevel--;
68
+ }
69
+ if (indentation > 0) {
70
+ currentLevel++;
71
+ }
72
+ }
73
+ // Calculate correct indentation for this level
74
+ const correctIndentation = ' '.repeat(levelToSpaces[currentLevel - 1] || 0);
75
+ // Return fixed line with correct indentation
76
+ return `${correctIndentation}${marker} ${content}`;
77
+ });
78
+ }
79
+ /**
80
+ * Rule implementation for MD005
81
+ */
82
+ export const rule = {
83
+ name,
84
+ description,
85
+ fix,
86
+ };
87
+ export default rule;
88
+ //# sourceMappingURL=md005.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md005.js","sourceRoot":"","sources":["../../src/rules/md005.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Rule } from './rule-interface';
2
+ /**
3
+ * MD007: Unordered list indentation
4
+ *
5
+ * This rule is triggered when unordered list items are not properly indented.
6
+ * By default, this rule enforces a 2-space indentation for nested lists.
7
+ */
8
+ export declare const name = "MD007";
9
+ export declare const description = "Unordered list indentation";
10
+ /**
11
+ * Fix unordered list indentation by standardizing to 2 spaces per level
12
+ * @param lines Array of string lines to fix
13
+ * @returns Fixed lines array with proper list indentation
14
+ */
15
+ export declare function fix(lines: string[]): string[];
16
+ /**
17
+ * Rule implementation for MD007
18
+ */
19
+ export declare const rule: Rule;
20
+ export default rule;
21
+ //# sourceMappingURL=md007.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md007.d.ts","sourceRoot":"","sources":["../../src/rules/md007.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC;;;;;GAKG;AACH,eAAO,MAAM,IAAI,UAAU,CAAC;AAC5B,eAAO,MAAM,WAAW,+BAA+B,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA8C7C;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,IAIlB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * MD007: Unordered list indentation
3
+ *
4
+ * This rule is triggered when unordered list items are not properly indented.
5
+ * By default, this rule enforces a 2-space indentation for nested lists.
6
+ */
7
+ export const name = 'MD007';
8
+ export const description = 'Unordered list indentation';
9
+ /**
10
+ * Fix unordered list indentation by standardizing to 2 spaces per level
11
+ * @param lines Array of string lines to fix
12
+ * @returns Fixed lines array with proper list indentation
13
+ */
14
+ export function fix(lines) {
15
+ const indentationAmount = 2; // Standard indentation (2 spaces)
16
+ const unorderedListItemRegex = /^(\s*)([*+-])\s+(.*)$/;
17
+ // Track list nesting levels
18
+ let nestingStack = [];
19
+ let currentLevel = 0;
20
+ return lines.map(line => {
21
+ const match = line.match(unorderedListItemRegex);
22
+ if (!match) {
23
+ // If we hit a non-list line, reset tracking
24
+ if (line.trim() === '' || !line.trim().startsWith(' ')) {
25
+ nestingStack.length = 0;
26
+ currentLevel = 0;
27
+ }
28
+ return line;
29
+ }
30
+ const indentation = match[1].length;
31
+ const marker = match[2];
32
+ const content = match[3];
33
+ // Determine nesting level based on indentation
34
+ if (indentation === 0) {
35
+ // Top-level list item
36
+ nestingStack = [];
37
+ currentLevel = 0;
38
+ }
39
+ else if (nestingStack.length === 0 || indentation > nestingStack[nestingStack.length - 1]) {
40
+ // New nested level
41
+ nestingStack.push(indentation);
42
+ currentLevel++;
43
+ }
44
+ else if (indentation < nestingStack[nestingStack.length - 1]) {
45
+ // Moving back up in nesting levels
46
+ while (nestingStack.length > 0 && indentation < nestingStack[nestingStack.length - 1]) {
47
+ nestingStack.pop();
48
+ currentLevel--;
49
+ }
50
+ }
51
+ // Calculate correct indentation for this level
52
+ const correctIndentation = ' '.repeat(currentLevel * indentationAmount);
53
+ // Return fixed line with correct indentation
54
+ return `${correctIndentation}${marker} ${content}`;
55
+ });
56
+ }
57
+ /**
58
+ * Rule implementation for MD007
59
+ */
60
+ export const rule = {
61
+ name,
62
+ description,
63
+ fix,
64
+ };
65
+ export default rule;
66
+ //# sourceMappingURL=md007.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md007.js","sourceRoot":"","sources":["../../src/rules/md007.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC;AAC5B,MAAM,CAAC,MAAM,WAAW,GAAG,4BAA4B,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC,kCAAkC;IAC/D,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;IAEvD,4BAA4B;IAC5B,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,4CAA4C;YAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;gBACxB,YAAY,GAAG,CAAC,CAAC;YACnB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzB,+CAA+C;QAC/C,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,sBAAsB;YACtB,YAAY,GAAG,EAAE,CAAC;YAClB,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5F,mBAAmB;YACnB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/B,YAAY,EAAE,CAAC;QACjB,CAAC;aAAM,IAAI,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YAC/D,mCAAmC;YACnC,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBACtF,YAAY,CAAC,GAAG,EAAE,CAAC;gBACnB,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,MAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,iBAAiB,CAAC,CAAC;QAExE,6CAA6C;QAC7C,OAAO,GAAG,kBAAkB,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAS;IACxB,IAAI;IACJ,WAAW;IACX,GAAG;CACJ,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { Rule, RuleViolation } from './rule-interface';
2
+ /**
3
+ * MD009: Trailing spaces
4
+ *
5
+ * This rule is triggered when trailing spaces are found at the end of a line.
6
+ * Trailing spaces can cause unnecessary diffs in version control systems and
7
+ * can be confusing in a text editor.
8
+ */
9
+ export declare const name = "MD009";
10
+ export declare const description = "Trailing spaces";
11
+ interface MD009Config {
12
+ br_spaces?: number;
13
+ list_item_empty_lines?: boolean;
14
+ strict?: boolean;
15
+ }
16
+ /**
17
+ * Validate lines for trailing spaces
18
+ * @param lines Array of string lines to validate
19
+ * @param config Rule configuration
20
+ * @returns Array of rule violations
21
+ */
22
+ export declare function validate(lines: string[], config?: MD009Config): RuleViolation[];
23
+ /**
24
+ * Fix trailing spaces by removing them from the end of each line
25
+ * @param lines Array of string lines to fix
26
+ * @param config Rule configuration
27
+ * @returns Fixed lines array with trailing spaces removed
28
+ */
29
+ export declare function fix(lines: string[], config?: MD009Config): string[];
30
+ /**
31
+ * Rule implementation for MD009
32
+ */
33
+ export declare const rule: Rule;
34
+ export default rule;
35
+ //# sourceMappingURL=md009.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md009.d.ts","sourceRoot":"","sources":["../../src/rules/md009.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,UAAU,CAAC;AAC5B,eAAO,MAAM,WAAW,oBAAoB,CAAC;AAE7C,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,WAAgB,GAAG,aAAa,EAAE,CAgDnF;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,WAAgB,GAAG,MAAM,EAAE,CAuDvE;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,IAKlB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * MD009: Trailing spaces
3
+ *
4
+ * This rule is triggered when trailing spaces are found at the end of a line.
5
+ * Trailing spaces can cause unnecessary diffs in version control systems and
6
+ * can be confusing in a text editor.
7
+ */
8
+ export const name = 'MD009';
9
+ export const description = 'Trailing spaces';
10
+ /**
11
+ * Validate lines for trailing spaces
12
+ * @param lines Array of string lines to validate
13
+ * @param config Rule configuration
14
+ * @returns Array of rule violations
15
+ */
16
+ export function validate(lines, config = {}) {
17
+ const violations = [];
18
+ const brSpaces = config.br_spaces ?? 0;
19
+ const strictMode = config.strict === true;
20
+ for (let i = 0; i < lines.length; i++) {
21
+ const line = lines[i];
22
+ const trailingSpaceMatch = line.match(/[ \t]+$/);
23
+ if (trailingSpaceMatch) {
24
+ const trailingSpaces = trailingSpaceMatch[0];
25
+ // In strict mode, any trailing whitespace is a violation
26
+ if (strictMode) {
27
+ violations.push({
28
+ lineNumber: i + 1,
29
+ details: `Trailing spaces${trailingSpaces.length > 0 ? ` (${trailingSpaces.length})` : ''}`,
30
+ range: [line.length - trailingSpaces.length, trailingSpaces.length],
31
+ });
32
+ continue;
33
+ }
34
+ // Check if line is blank (only whitespace)
35
+ const isBlankLine = line.trim() === '';
36
+ // Check if this line has a valid line break (exactly br_spaces trailing spaces)
37
+ const hasContent = line.trim().length > 0;
38
+ const isLineBreak = brSpaces > 0 && hasContent && trailingSpaces.length === brSpaces;
39
+ // Report a violation if:
40
+ // 1. It's not a valid line break (and br_spaces is set)
41
+ // 2. It's a blank line with trailing spaces
42
+ // 3. Any trailing spaces when br_spaces is 0
43
+ if ((brSpaces > 0 && !isLineBreak && hasContent) ||
44
+ (isBlankLine && trailingSpaces.length > 0) ||
45
+ brSpaces === 0) {
46
+ violations.push({
47
+ lineNumber: i + 1,
48
+ details: `Trailing spaces${trailingSpaces.length > 0 ? ` (${trailingSpaces.length})` : ''}`,
49
+ range: [line.length - trailingSpaces.length, trailingSpaces.length],
50
+ });
51
+ }
52
+ }
53
+ }
54
+ return violations;
55
+ }
56
+ /**
57
+ * Fix trailing spaces by removing them from the end of each line
58
+ * @param lines Array of string lines to fix
59
+ * @param config Rule configuration
60
+ * @returns Fixed lines array with trailing spaces removed
61
+ */
62
+ export function fix(lines, config = {}) {
63
+ const brSpaces = config.br_spaces ?? 0;
64
+ const strictMode = config.strict === true;
65
+ return lines.map(line => {
66
+ // Check if line has trailing spaces
67
+ const trailingSpaceMatch = line.match(/[ \t]+$/);
68
+ if (!trailingSpaceMatch)
69
+ return line;
70
+ // Check if line is blank (only whitespace)
71
+ const isBlankLine = line.trim() === '';
72
+ // If it's a blank line, always remove all trailing whitespace
73
+ if (isBlankLine) {
74
+ return '';
75
+ }
76
+ // Handle strict mode differently
77
+ if (strictMode) {
78
+ // In strict mode, if br_spaces is set, normalize to exactly that many spaces
79
+ if (brSpaces > 0) {
80
+ const hasContent = line.trim().length > 0;
81
+ if (hasContent) {
82
+ // Example: Line with trailing spaces. -> Line with trailing spaces.
83
+ return line.replace(/[ \t]+$/, ' '.repeat(brSpaces));
84
+ }
85
+ else {
86
+ // Empty lines should have no trailing spaces
87
+ return '';
88
+ }
89
+ }
90
+ else {
91
+ // If br_spaces is not set, remove all trailing spaces
92
+ return line.replace(/[ \t]+$/, '');
93
+ }
94
+ }
95
+ // Non-strict mode handling
96
+ if (brSpaces > 0) {
97
+ // If trailing spaces are already exactly br_spaces, keep them
98
+ if (trailingSpaceMatch[0].length === brSpaces) {
99
+ return line;
100
+ }
101
+ // If trailing spaces are fewer than br_spaces, replace with br_spaces
102
+ if (trailingSpaceMatch[0].length < brSpaces) {
103
+ return line.replace(/[ \t]+$/, ' '.repeat(brSpaces));
104
+ }
105
+ // If trailing spaces are more than br_spaces, replace with br_spaces
106
+ return line.replace(/[ \t]+$/, ' '.repeat(brSpaces));
107
+ }
108
+ // If br_spaces is 0 or not specified, remove all trailing whitespace
109
+ return line.replace(/[ \t]+$/, '');
110
+ });
111
+ }
112
+ /**
113
+ * Rule implementation for MD009
114
+ */
115
+ export const rule = {
116
+ name,
117
+ description,
118
+ validate,
119
+ fix,
120
+ };
121
+ export default rule;
122
+ //# sourceMappingURL=md009.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md009.js","sourceRoot":"","sources":["../../src/rules/md009.ts"],"names":[],"mappings":"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"}