@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,20 @@
1
+ import type { NormalizedRule, ValidationError } from '../types/index.js';
2
+ export interface LoadResult {
3
+ success: boolean;
4
+ rules: NormalizedRule[];
5
+ errors: ValidationError[];
6
+ configPath?: string;
7
+ }
8
+ /**
9
+ * Loads and validates a recheck configuration file
10
+ */
11
+ export declare function loadConfig(configPath: string): Promise<LoadResult>;
12
+ /**
13
+ * Finds a recheck configuration file in the current directory or parent directories
14
+ */
15
+ export declare function findConfigFile(startDir?: string): Promise<string | null>;
16
+ /**
17
+ * Loads configuration with automatic discovery
18
+ */
19
+ export declare function findAndLoadConfig(configPath?: string): Promise<LoadResult>;
20
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzE,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;AAID;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiCxE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuB7F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBhF"}
@@ -0,0 +1,85 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import * as yaml from 'js-yaml';
4
+ import { validate } from './validate.js';
5
+ const CONFIG_NAMES = ['recheck.yaml', 'recheck.yml'];
6
+ /**
7
+ * Loads and validates a recheck configuration file
8
+ */
9
+ export async function loadConfig(configPath) {
10
+ try {
11
+ const fileContent = await fs.readFile(configPath, 'utf8');
12
+ let config;
13
+ try {
14
+ config = yaml.load(fileContent);
15
+ }
16
+ catch (yamlError) {
17
+ return {
18
+ success: false,
19
+ rules: [],
20
+ errors: [{ message: `YAML parsing error: ${yamlError.message}` }],
21
+ configPath,
22
+ };
23
+ }
24
+ // Validate configuration
25
+ const validation = await validate(config);
26
+ return {
27
+ success: validation.isValid,
28
+ rules: validation.rules,
29
+ errors: validation.errors,
30
+ configPath,
31
+ };
32
+ }
33
+ catch (error) {
34
+ return {
35
+ success: false,
36
+ rules: [],
37
+ errors: [{ message: `Error loading configuration: ${error.message}` }],
38
+ configPath,
39
+ };
40
+ }
41
+ }
42
+ /**
43
+ * Finds a recheck configuration file in the current directory or parent directories
44
+ */
45
+ export async function findConfigFile(startDir = process.cwd()) {
46
+ let currentDir = startDir;
47
+ while (true) {
48
+ for (const configName of CONFIG_NAMES) {
49
+ const configPath = path.join(currentDir, configName);
50
+ try {
51
+ await fs.access(configPath);
52
+ return configPath;
53
+ }
54
+ catch {
55
+ // not found, continue
56
+ }
57
+ }
58
+ const parentDir = path.dirname(currentDir);
59
+ if (parentDir === currentDir) {
60
+ // Reached root directory
61
+ break;
62
+ }
63
+ currentDir = parentDir;
64
+ }
65
+ return null;
66
+ }
67
+ /**
68
+ * Loads configuration with automatic discovery
69
+ */
70
+ export async function findAndLoadConfig(configPath) {
71
+ const actualConfigPath = configPath || (await findConfigFile());
72
+ if (!actualConfigPath) {
73
+ return {
74
+ success: false,
75
+ rules: [],
76
+ errors: [
77
+ {
78
+ message: `No recheck configuration file found. Looking for: ${CONFIG_NAMES.join(', ')}`,
79
+ },
80
+ ],
81
+ };
82
+ }
83
+ return loadConfig(actualConfigPath);
84
+ }
85
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAIhC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AASzC,MAAM,YAAY,GAAG,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAE1D,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,uBAAuB,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;gBACjE,UAAU;aACX,CAAC;QACJ,CAAC;QAED,yBAAyB;QACzB,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE1C,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,UAAU;SACX,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,gCAAgC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACtE,UAAU;SACX,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IACnE,IAAI,UAAU,GAAG,QAAQ,CAAC;IAE1B,OAAO,IAAI,EAAE,CAAC;QACZ,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAC5B,OAAO,UAAU,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,yBAAyB;YACzB,MAAM;QACR,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAmB;IACzD,MAAM,gBAAgB,GAAG,UAAU,IAAI,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;IAEhE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE;YACT,MAAM,EAAE;gBACN;oBACE,OAAO,EAAE,qDAAqD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACxF;aACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,109 @@
1
+ export declare const RECHECK_CONFIG_SCHEMA: {
2
+ $schema: string;
3
+ type: string;
4
+ patternProperties: {
5
+ '^recheck/[a-z0-9-_]+$': {
6
+ type: string;
7
+ properties: {
8
+ severity: {
9
+ type: string;
10
+ enum: string[];
11
+ default: string;
12
+ };
13
+ message: {
14
+ type: string;
15
+ minLength: number;
16
+ };
17
+ enabled: {
18
+ type: string;
19
+ default: boolean;
20
+ };
21
+ autoFixable: {
22
+ type: string;
23
+ default: boolean;
24
+ };
25
+ tags: {
26
+ type: string;
27
+ items: {
28
+ type: string;
29
+ };
30
+ };
31
+ description: {
32
+ type: string;
33
+ };
34
+ link: {
35
+ type: string;
36
+ format: string;
37
+ };
38
+ scope: {
39
+ oneOf: ({
40
+ type: string;
41
+ anyOf: ({
42
+ enum: string[];
43
+ pattern?: undefined;
44
+ } | {
45
+ pattern: string;
46
+ enum?: undefined;
47
+ })[];
48
+ items?: undefined;
49
+ minItems?: undefined;
50
+ } | {
51
+ type: string;
52
+ items: {
53
+ type: string;
54
+ anyOf: ({
55
+ enum: string[];
56
+ pattern?: undefined;
57
+ } | {
58
+ pattern: string;
59
+ enum?: undefined;
60
+ })[];
61
+ };
62
+ minItems: number;
63
+ anyOf?: undefined;
64
+ })[];
65
+ default: string;
66
+ };
67
+ appliesTo: {
68
+ type: string;
69
+ items: {
70
+ type: string;
71
+ };
72
+ };
73
+ excludes: {
74
+ type: string;
75
+ items: {
76
+ type: string;
77
+ };
78
+ };
79
+ exceptions: {
80
+ type: string;
81
+ properties: {
82
+ files: {
83
+ type: string;
84
+ items: {
85
+ type: string;
86
+ };
87
+ };
88
+ lines: {
89
+ type: string;
90
+ items: {
91
+ type: string;
92
+ };
93
+ };
94
+ };
95
+ additionalProperties: boolean;
96
+ };
97
+ assertions: {
98
+ type: string;
99
+ additionalProperties: boolean;
100
+ minProperties: number;
101
+ };
102
+ };
103
+ required: string[];
104
+ additionalProperties: boolean;
105
+ };
106
+ };
107
+ additionalProperties: boolean;
108
+ };
109
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqGjC,CAAC"}
@@ -0,0 +1,103 @@
1
+ export const RECHECK_CONFIG_SCHEMA = {
2
+ $schema: 'http://json-schema.org/draft-07/schema#',
3
+ type: 'object',
4
+ patternProperties: {
5
+ '^recheck/[a-z0-9-_]+$': {
6
+ type: 'object',
7
+ properties: {
8
+ severity: {
9
+ type: 'string',
10
+ enum: ['off', 'info', 'warn', 'error'],
11
+ default: 'error',
12
+ },
13
+ message: {
14
+ type: 'string',
15
+ minLength: 1,
16
+ },
17
+ enabled: {
18
+ type: 'boolean',
19
+ default: true,
20
+ },
21
+ autoFixable: {
22
+ type: 'boolean',
23
+ default: false,
24
+ },
25
+ tags: {
26
+ type: 'array',
27
+ items: {
28
+ type: 'string',
29
+ },
30
+ },
31
+ description: {
32
+ type: 'string',
33
+ },
34
+ link: {
35
+ type: 'string',
36
+ format: 'uri',
37
+ },
38
+ scope: {
39
+ oneOf: [
40
+ {
41
+ type: 'string',
42
+ anyOf: [
43
+ { enum: ['all', 'heading', 'sentence', 'paragraph', 'code', 'default', 'raw'] },
44
+ { pattern: '^heading\\.h[1-6]$' },
45
+ ],
46
+ },
47
+ {
48
+ type: 'array',
49
+ items: {
50
+ type: 'string',
51
+ anyOf: [
52
+ { enum: ['all', 'heading', 'sentence', 'paragraph', 'code', 'default', 'raw'] },
53
+ { pattern: '^heading\\.h[1-6]$' },
54
+ ],
55
+ },
56
+ minItems: 1,
57
+ },
58
+ ],
59
+ default: 'all',
60
+ },
61
+ appliesTo: {
62
+ type: 'array',
63
+ items: {
64
+ type: 'string',
65
+ },
66
+ },
67
+ excludes: {
68
+ type: 'array',
69
+ items: {
70
+ type: 'string',
71
+ },
72
+ },
73
+ exceptions: {
74
+ type: 'object',
75
+ properties: {
76
+ files: {
77
+ type: 'array',
78
+ items: {
79
+ type: 'string',
80
+ },
81
+ },
82
+ lines: {
83
+ type: 'array',
84
+ items: {
85
+ type: 'string',
86
+ },
87
+ },
88
+ },
89
+ additionalProperties: false,
90
+ },
91
+ assertions: {
92
+ type: 'object',
93
+ additionalProperties: true,
94
+ minProperties: 1,
95
+ },
96
+ },
97
+ required: ['severity', 'message', 'assertions'],
98
+ additionalProperties: false,
99
+ },
100
+ },
101
+ additionalProperties: false,
102
+ };
103
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,OAAO,EAAE,yCAAyC;IAClD,IAAI,EAAE,QAAQ;IACd,iBAAiB,EAAE;QACjB,uBAAuB,EAAE;YACvB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;oBACtC,OAAO,EAAE,OAAO;iBACjB;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,CAAC;iBACb;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,IAAI;iBACd;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,KAAK;iBACf;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;qBACf;iBACF;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;iBACf;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,KAAK;iBACd;gBACD,KAAK,EAAE;oBACL,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,QAAQ;4BACd,KAAK,EAAE;gCACL,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE;gCAC/E,EAAE,OAAO,EAAE,oBAAoB,EAAE;6BAClC;yBACF;wBACD;4BACE,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,KAAK,EAAE;oCACL,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE;oCAC/E,EAAE,OAAO,EAAE,oBAAoB,EAAE;iCAClC;6BACF;4BACD,QAAQ,EAAE,CAAC;yBACZ;qBACF;oBACD,OAAO,EAAE,KAAK;iBACf;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;qBACf;iBACF;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;qBACf;iBACF;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE;4BACL,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;6BACf;yBACF;wBACD,KAAK,EAAE;4BACL,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;6BACf;yBACF;qBACF;oBACD,oBAAoB,EAAE,KAAK;iBAC5B;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,oBAAoB,EAAE,IAAI;oBAC1B,aAAa,EAAE,CAAC;iBACjB;aACF;YACD,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC;YAC/C,oBAAoB,EAAE,KAAK;SAC5B;KACF;IACD,oBAAoB,EAAE,KAAK;CAC5B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { NormalizedRule, ValidationError } from '../types/index.js';
2
+ /**
3
+ * Full validation pipeline
4
+ */
5
+ export declare function validate(config: any): Promise<{
6
+ isValid: boolean;
7
+ errors: ValidationError[];
8
+ rules: NormalizedRule[];
9
+ }>;
10
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/config/validate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,cAAc,EAAE,eAAe,EAAY,MAAM,mBAAmB,CAAC;AA4HlG;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB,CAAC,CAkBD"}
@@ -0,0 +1,129 @@
1
+ import Ajv from '@redocly/ajv';
2
+ import addFormats from 'ajv-formats';
3
+ import { RECHECK_CONFIG_SCHEMA } from './schema.js';
4
+ const ajv = new Ajv({
5
+ useDefaults: true,
6
+ allErrors: true,
7
+ verbose: true,
8
+ });
9
+ addFormats(ajv); // mismatching AJV typing due to fork
10
+ ajv.addSchema(RECHECK_CONFIG_SCHEMA, 'recheck-config');
11
+ /**
12
+ * Validates configuration structure using JSON Schema
13
+ */
14
+ function validateStructure(config) {
15
+ const validate = ajv.getSchema('recheck-config');
16
+ if (!validate) {
17
+ throw new Error('Schema not loaded');
18
+ }
19
+ const valid = validate(config);
20
+ if (!valid && validate.errors) {
21
+ return validate.errors.map((error) => ({
22
+ message: `${error.instancePath || '/'}: ${error.message}`,
23
+ path: error.instancePath,
24
+ value: error.data,
25
+ }));
26
+ }
27
+ return [];
28
+ }
29
+ /**
30
+ * Validates assertions in a rule
31
+ */
32
+ function validateAssertions(rule, name, errors) {
33
+ if (!rule.assertions || typeof rule.assertions !== 'object') {
34
+ errors.push({
35
+ message: `Rule "${name}": assertions must be an object`,
36
+ path: `${name}.assertions`,
37
+ });
38
+ return;
39
+ }
40
+ for (const [assertionType, _assertionConfig] of Object.entries(rule.assertions)) {
41
+ try {
42
+ switch (assertionType) {
43
+ case 'swap':
44
+ break;
45
+ case 'pattern':
46
+ break;
47
+ case 'max-image-size':
48
+ case 'max-line-length':
49
+ case 'no-trailing-spaces':
50
+ case 'bullet-style':
51
+ case 'semantic-line-breaks':
52
+ case 'no-hard-tabs':
53
+ case 'no-duplicate-headings':
54
+ case 'no-broken-fragment-links':
55
+ break;
56
+ default:
57
+ errors.push({
58
+ message: `Rule "${name}": unknown assertion type "${assertionType}"`,
59
+ path: `${name}.assertions.${assertionType}`,
60
+ });
61
+ }
62
+ }
63
+ catch (error) {
64
+ errors.push({
65
+ message: `Rule "${name}": error validating assertion "${assertionType}": ${error.message}`,
66
+ path: `${name}.assertions.${assertionType}`,
67
+ });
68
+ }
69
+ }
70
+ }
71
+ /**
72
+ * Performs semantic validation and normalization
73
+ */
74
+ function validateSemantics(config) {
75
+ const errors = [];
76
+ const rules = [];
77
+ for (const [key, rule] of Object.entries(config)) {
78
+ try {
79
+ // Derive name and shortName
80
+ const name = key;
81
+ const shortName = key.replace(/^recheck\//, '');
82
+ // Validate message placeholder count
83
+ const placeholderCount = (rule.message.match(/%s/g) || []).length;
84
+ if (placeholderCount > 2) {
85
+ errors.push({
86
+ message: `Rule "${name}": message can have at most 2 %s placeholders, found ${placeholderCount}`,
87
+ path: `${name}.message`,
88
+ });
89
+ }
90
+ // Assertions validation
91
+ validateAssertions(rule, name, errors);
92
+ // Create normalized rule
93
+ const normalizedRule = {
94
+ ...rule,
95
+ name,
96
+ shortName,
97
+ };
98
+ rules.push(normalizedRule);
99
+ }
100
+ catch (error) {
101
+ errors.push({
102
+ message: `Rule "${key}": ${error.message}`,
103
+ path: key,
104
+ });
105
+ }
106
+ }
107
+ return { errors, rules };
108
+ }
109
+ /**
110
+ * Full validation pipeline
111
+ */
112
+ export async function validate(config) {
113
+ const structureErrors = validateStructure(config);
114
+ if (structureErrors.length > 0) {
115
+ return {
116
+ isValid: false,
117
+ errors: structureErrors,
118
+ rules: [],
119
+ };
120
+ }
121
+ // Then validate semantics
122
+ const { errors: semanticErrors, rules } = validateSemantics(config);
123
+ return {
124
+ isValid: semanticErrors.length === 0,
125
+ errors: semanticErrors,
126
+ rules,
127
+ };
128
+ }
129
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/config/validate.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,UAAU,MAAM,aAAa,CAAC;AAIrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;IAClB,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,IAAI;CACd,CAAC,CAAC;AACH,UAAU,CAAC,GAAU,CAAC,CAAC,CAAC,qCAAqC;AAC7D,GAAG,CAAC,SAAS,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;AAEvD;;GAEG;AACH,SAAS,iBAAiB,CAAC,MAAW;IACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAY,CAAC;IAE1C,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;YAC1C,OAAO,EAAE,GAAG,KAAK,CAAC,YAAY,IAAI,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE;YACzD,IAAI,EAAE,KAAK,CAAC,YAAY;YACxB,KAAK,EAAE,KAAK,CAAC,IAAI;SAClB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAc,EAAE,IAAY,EAAE,MAAyB;IACjF,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,SAAS,IAAI,iCAAiC;YACvD,IAAI,EAAE,GAAG,IAAI,aAAa;SAC3B,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAChF,IAAI,CAAC;YACH,QAAQ,aAAa,EAAE,CAAC;gBACtB,KAAK,MAAM;oBACT,MAAM;gBACR,KAAK,SAAS;oBACZ,MAAM;gBACR,KAAK,gBAAgB,CAAC;gBACtB,KAAK,iBAAiB,CAAC;gBACvB,KAAK,oBAAoB,CAAC;gBAC1B,KAAK,cAAc,CAAC;gBACpB,KAAK,sBAAsB,CAAC;gBAC5B,KAAK,cAAc,CAAC;gBACpB,KAAK,uBAAuB,CAAC;gBAC7B,KAAK,0BAA0B;oBAC7B,MAAM;gBACR;oBACE,MAAM,CAAC,IAAI,CAAC;wBACV,OAAO,EAAE,SAAS,IAAI,8BAA8B,aAAa,GAAG;wBACpE,IAAI,EAAE,GAAG,IAAI,eAAe,aAAa,EAAE;qBAC5C,CAAC,CAAC;YACP,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,SAAS,IAAI,kCAAkC,aAAa,MAAM,KAAK,CAAC,OAAO,EAAE;gBAC1F,IAAI,EAAE,GAAG,IAAI,eAAe,aAAa,EAAE;aAC5C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,MAAqB;IAI9C,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAqB,EAAE,CAAC;IAEnC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC;YACH,4BAA4B;YAC5B,MAAM,IAAI,GAAG,GAAG,CAAC;YACjB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAEhD,qCAAqC;YACrC,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAClE,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,SAAS,IAAI,wDAAwD,gBAAgB,EAAE;oBAChG,IAAI,EAAE,GAAG,IAAI,UAAU;iBACxB,CAAC,CAAC;YACL,CAAC;YAED,wBAAwB;YACxB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAEvC,yBAAyB;YACzB,MAAM,cAAc,GAAmB;gBACrC,GAAG,IAAI;gBACP,IAAI;gBACJ,SAAS;aACV,CAAC;YAEF,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,SAAS,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;gBAC1C,IAAI,EAAE,GAAG;aACV,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAW;IAKxC,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAAC,MAAuB,CAAC,CAAC;IAErF,OAAO;QACL,OAAO,EAAE,cAAc,CAAC,MAAM,KAAK,CAAC;QACpC,MAAM,EAAE,cAAc;QACtB,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Fix, NormalizedRule } from '../types/index.js';
2
+ import type { Context } from '../assertions/index.js';
3
+ export interface FixContext {
4
+ content: string;
5
+ segments: any;
6
+ }
7
+ /**
8
+ * Collect all fixes for the given files and rules
9
+ */
10
+ export declare function collectFixes(files: string[], rules: NormalizedRule[], contentsByFile: Record<string, string>, segmentsByFile: Record<string, any>, metadataByFile?: Record<string, Context['fileMetadata']>): Promise<Fix[]>;
11
+ /**
12
+ * Apply fixes grouped by file. Within each file, sort fixes in reverse order of line/column
13
+ * so that earlier edits don't shift positions of later edits.
14
+ */
15
+ export declare function applyFixes(fixes: Fix[]): Promise<void>;
16
+ //# sourceMappingURL=auto-fix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fix.d.ts","sourceRoot":"","sources":["../../src/core/auto-fix.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAKtD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,cAAc,EAAE,EACvB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,cAAc,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAM,GAC3D,OAAO,CAAC,GAAG,EAAE,CAAC,CAwBhB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C5D"}
@@ -0,0 +1,82 @@
1
+ import * as fs from 'fs/promises';
2
+ import { shouldProcessFile } from '../assertions/utils.js';
3
+ import { getAssertion } from '../assertions/index.js';
4
+ /**
5
+ * Collect all fixes for the given files and rules
6
+ */
7
+ export async function collectFixes(files, rules, contentsByFile, segmentsByFile, metadataByFile = {}) {
8
+ const allFixes = [];
9
+ for (const file of files) {
10
+ for (const rule of rules) {
11
+ if (!rule.autoFixable || !shouldProcessFile(file, rule))
12
+ continue;
13
+ console.log(` Collecting fixes for: ${rule.shortName} on ${file}...`);
14
+ for (const [assertionType] of Object.entries(rule.assertions)) {
15
+ const assertion = getAssertion(assertionType);
16
+ if (assertion && assertion.fix) {
17
+ const fixes = await assertion.fix(rule, file, {
18
+ content: contentsByFile[file],
19
+ segments: segmentsByFile[file],
20
+ fileMetadata: metadataByFile[file],
21
+ });
22
+ allFixes.push(...fixes);
23
+ }
24
+ }
25
+ }
26
+ }
27
+ return allFixes;
28
+ }
29
+ /**
30
+ * Apply fixes grouped by file. Within each file, sort fixes in reverse order of line/column
31
+ * so that earlier edits don't shift positions of later edits.
32
+ */
33
+ export async function applyFixes(fixes) {
34
+ const byFile = {};
35
+ for (const fix of fixes) {
36
+ if (!byFile[fix.file])
37
+ byFile[fix.file] = [];
38
+ byFile[fix.file].push(fix);
39
+ }
40
+ for (const [file, fileFixes] of Object.entries(byFile)) {
41
+ try {
42
+ let content = await fs.readFile(file, 'utf8');
43
+ const lines = content.split('\n');
44
+ // Sort fixes descending by line then column
45
+ fileFixes.sort((a, b) => (a.line !== b.line ? b.line - a.line : b.column - a.column));
46
+ for (const fix of fileFixes) {
47
+ const lineIdx = Math.max(0, fix.line - 1);
48
+ if (lineIdx >= lines.length)
49
+ continue;
50
+ const lineText = lines[lineIdx];
51
+ // Apply the change at column (1-based). Replace oldText at that position if it matches; otherwise, fallback to global replace on the line end (for trailing spaces)
52
+ const colIdx = Math.max(0, fix.column - 1);
53
+ if (fix.oldText === '') {
54
+ // Pure insertion
55
+ lines[lineIdx] = lineText.slice(0, colIdx) + fix.newText + lineText.slice(colIdx);
56
+ }
57
+ else {
58
+ // Replacement or deletion
59
+ if (lineText.slice(colIdx, colIdx + fix.oldText.length) === fix.oldText) {
60
+ lines[lineIdx] =
61
+ lineText.slice(0, colIdx) + fix.newText + lineText.slice(colIdx + fix.oldText.length);
62
+ }
63
+ else if (/^[ \t]+$/.test(fix.oldText)) {
64
+ // Trailing space fallback: strip trailing space at end of line
65
+ lines[lineIdx] = lineText.replace(/[ \t]+$/, fix.newText);
66
+ }
67
+ else if (fix.oldText === '\t') {
68
+ // Tab replacement fallback: replace all tabs with configured spaces on this line
69
+ lines[lineIdx] = lineText.replace(/\t/g, fix.newText);
70
+ }
71
+ }
72
+ }
73
+ content = lines.join('\n');
74
+ await fs.writeFile(file, content, 'utf8');
75
+ }
76
+ catch (_error) {
77
+ // Skip files we cannot modify
78
+ continue;
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=auto-fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fix.js","sourceRoot":"","sources":["../../src/core/auto-fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function discoverMarkdownFiles(inputPath: string): Promise<string[]>;
2
+ /**
3
+ * Load list of changed files from either a file path or stdin
4
+ */
5
+ export declare function loadChangedFiles(changedListPath?: string): Promise<string[]>;
6
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/core/files.ts"],"names":[],"mappings":"AAMA,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqChF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BlF"}