doc-freshness-checker 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/LICENSE +21 -0
  2. package/README.md +305 -0
  3. package/dist/cache/cacheManager.d.ts +42 -0
  4. package/dist/cache/cacheManager.js +138 -0
  5. package/dist/cache/cacheManager.js.map +1 -0
  6. package/dist/cache/cacheManager.test.d.ts +1 -0
  7. package/dist/cache/cacheManager.test.js +142 -0
  8. package/dist/cache/cacheManager.test.js.map +1 -0
  9. package/dist/cli.d.ts +32 -0
  10. package/dist/cli.js +137 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/cli.test.d.ts +1 -0
  13. package/dist/cli.test.js +184 -0
  14. package/dist/cli.test.js.map +1 -0
  15. package/dist/config/defaults.d.ts +5 -0
  16. package/dist/config/defaults.js +135 -0
  17. package/dist/config/defaults.js.map +1 -0
  18. package/dist/config/defineConfig.d.ts +28 -0
  19. package/dist/config/defineConfig.js +30 -0
  20. package/dist/config/defineConfig.js.map +1 -0
  21. package/dist/config/defineConfig.test.d.ts +1 -0
  22. package/dist/config/defineConfig.test.js +10 -0
  23. package/dist/config/defineConfig.test.js.map +1 -0
  24. package/dist/config/loader.d.ts +7 -0
  25. package/dist/config/loader.js +250 -0
  26. package/dist/config/loader.js.map +1 -0
  27. package/dist/config/loader.test.d.ts +1 -0
  28. package/dist/config/loader.test.js +276 -0
  29. package/dist/config/loader.test.js.map +1 -0
  30. package/dist/git/changeTracker.d.ts +44 -0
  31. package/dist/git/changeTracker.js +149 -0
  32. package/dist/git/changeTracker.js.map +1 -0
  33. package/dist/git/changeTracker.test.d.ts +1 -0
  34. package/dist/git/changeTracker.test.js +184 -0
  35. package/dist/git/changeTracker.test.js.map +1 -0
  36. package/dist/graph/codeDocGraph.d.ts +43 -0
  37. package/dist/graph/codeDocGraph.js +103 -0
  38. package/dist/graph/codeDocGraph.js.map +1 -0
  39. package/dist/graph/codeDocGraph.test.d.ts +1 -0
  40. package/dist/graph/codeDocGraph.test.js +78 -0
  41. package/dist/graph/codeDocGraph.test.js.map +1 -0
  42. package/dist/graph/graphBuilder.d.ts +17 -0
  43. package/dist/graph/graphBuilder.js +76 -0
  44. package/dist/graph/graphBuilder.js.map +1 -0
  45. package/dist/graph/graphBuilder.test.d.ts +1 -0
  46. package/dist/graph/graphBuilder.test.js +87 -0
  47. package/dist/graph/graphBuilder.test.js.map +1 -0
  48. package/dist/index.d.ts +37 -0
  49. package/dist/index.js +37 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/parsers/documentParser.d.ts +22 -0
  52. package/dist/parsers/documentParser.js +76 -0
  53. package/dist/parsers/documentParser.js.map +1 -0
  54. package/dist/parsers/documentParser.test.d.ts +1 -0
  55. package/dist/parsers/documentParser.test.js +116 -0
  56. package/dist/parsers/documentParser.test.js.map +1 -0
  57. package/dist/parsers/extractors/baseExtractor.d.ts +19 -0
  58. package/dist/parsers/extractors/baseExtractor.js +33 -0
  59. package/dist/parsers/extractors/baseExtractor.js.map +1 -0
  60. package/dist/parsers/extractors/baseExtractor.test.d.ts +1 -0
  61. package/dist/parsers/extractors/baseExtractor.test.js +43 -0
  62. package/dist/parsers/extractors/baseExtractor.test.js.map +1 -0
  63. package/dist/parsers/extractors/codePatternExtractor.d.ts +13 -0
  64. package/dist/parsers/extractors/codePatternExtractor.js +108 -0
  65. package/dist/parsers/extractors/codePatternExtractor.js.map +1 -0
  66. package/dist/parsers/extractors/codePatternExtractor.test.d.ts +1 -0
  67. package/dist/parsers/extractors/codePatternExtractor.test.js +49 -0
  68. package/dist/parsers/extractors/codePatternExtractor.test.js.map +1 -0
  69. package/dist/parsers/extractors/dependencyExtractor.d.ts +12 -0
  70. package/dist/parsers/extractors/dependencyExtractor.js +92 -0
  71. package/dist/parsers/extractors/dependencyExtractor.js.map +1 -0
  72. package/dist/parsers/extractors/dependencyExtractor.test.d.ts +1 -0
  73. package/dist/parsers/extractors/dependencyExtractor.test.js +48 -0
  74. package/dist/parsers/extractors/dependencyExtractor.test.js.map +1 -0
  75. package/dist/parsers/extractors/directoryStructureExtractor.d.ts +34 -0
  76. package/dist/parsers/extractors/directoryStructureExtractor.js +168 -0
  77. package/dist/parsers/extractors/directoryStructureExtractor.js.map +1 -0
  78. package/dist/parsers/extractors/directoryStructureExtractor.test.d.ts +1 -0
  79. package/dist/parsers/extractors/directoryStructureExtractor.test.js +121 -0
  80. package/dist/parsers/extractors/directoryStructureExtractor.test.js.map +1 -0
  81. package/dist/parsers/extractors/externalUrlExtractor.d.ts +14 -0
  82. package/dist/parsers/extractors/externalUrlExtractor.js +53 -0
  83. package/dist/parsers/extractors/externalUrlExtractor.js.map +1 -0
  84. package/dist/parsers/extractors/externalUrlExtractor.test.d.ts +1 -0
  85. package/dist/parsers/extractors/externalUrlExtractor.test.js +85 -0
  86. package/dist/parsers/extractors/externalUrlExtractor.test.js.map +1 -0
  87. package/dist/parsers/extractors/filePathExtractor.d.ts +18 -0
  88. package/dist/parsers/extractors/filePathExtractor.js +72 -0
  89. package/dist/parsers/extractors/filePathExtractor.js.map +1 -0
  90. package/dist/parsers/extractors/filePathExtractor.test.d.ts +1 -0
  91. package/dist/parsers/extractors/filePathExtractor.test.js +73 -0
  92. package/dist/parsers/extractors/filePathExtractor.test.js.map +1 -0
  93. package/dist/parsers/extractors/versionExtractor.d.ts +11 -0
  94. package/dist/parsers/extractors/versionExtractor.js +74 -0
  95. package/dist/parsers/extractors/versionExtractor.js.map +1 -0
  96. package/dist/parsers/extractors/versionExtractor.test.d.ts +1 -0
  97. package/dist/parsers/extractors/versionExtractor.test.js +55 -0
  98. package/dist/parsers/extractors/versionExtractor.test.js.map +1 -0
  99. package/dist/plugins/plugin.d.ts +32 -0
  100. package/dist/plugins/plugin.js +40 -0
  101. package/dist/plugins/plugin.js.map +1 -0
  102. package/dist/plugins/plugin.test.d.ts +1 -0
  103. package/dist/plugins/plugin.test.js +23 -0
  104. package/dist/plugins/plugin.test.js.map +1 -0
  105. package/dist/reporters/consoleReporter.d.ts +15 -0
  106. package/dist/reporters/consoleReporter.js +73 -0
  107. package/dist/reporters/consoleReporter.js.map +1 -0
  108. package/dist/reporters/consoleReporter.test.d.ts +1 -0
  109. package/dist/reporters/consoleReporter.test.js +155 -0
  110. package/dist/reporters/consoleReporter.test.js.map +1 -0
  111. package/dist/reporters/enhancedReporter.d.ts +12 -0
  112. package/dist/reporters/enhancedReporter.js +81 -0
  113. package/dist/reporters/enhancedReporter.js.map +1 -0
  114. package/dist/reporters/enhancedReporter.test.d.ts +1 -0
  115. package/dist/reporters/enhancedReporter.test.js +152 -0
  116. package/dist/reporters/enhancedReporter.test.js.map +1 -0
  117. package/dist/reporters/jsonReporter.d.ts +11 -0
  118. package/dist/reporters/jsonReporter.js +20 -0
  119. package/dist/reporters/jsonReporter.js.map +1 -0
  120. package/dist/reporters/jsonReporter.test.d.ts +1 -0
  121. package/dist/reporters/jsonReporter.test.js +31 -0
  122. package/dist/reporters/jsonReporter.test.js.map +1 -0
  123. package/dist/reporters/markdownReporter.d.ts +11 -0
  124. package/dist/reporters/markdownReporter.js +55 -0
  125. package/dist/reporters/markdownReporter.js.map +1 -0
  126. package/dist/reporters/markdownReporter.test.d.ts +1 -0
  127. package/dist/reporters/markdownReporter.test.js +136 -0
  128. package/dist/reporters/markdownReporter.test.js.map +1 -0
  129. package/dist/runner.d.ts +9 -0
  130. package/dist/runner.js +265 -0
  131. package/dist/runner.js.map +1 -0
  132. package/dist/runner.test.d.ts +1 -0
  133. package/dist/runner.test.js +353 -0
  134. package/dist/runner.test.js.map +1 -0
  135. package/dist/scoring/freshnessScorer.d.ts +40 -0
  136. package/dist/scoring/freshnessScorer.js +170 -0
  137. package/dist/scoring/freshnessScorer.js.map +1 -0
  138. package/dist/scoring/freshnessScorer.test.d.ts +1 -0
  139. package/dist/scoring/freshnessScorer.test.js +397 -0
  140. package/dist/scoring/freshnessScorer.test.js.map +1 -0
  141. package/dist/semantic/vectorSearch.d.ts +84 -0
  142. package/dist/semantic/vectorSearch.js +484 -0
  143. package/dist/semantic/vectorSearch.js.map +1 -0
  144. package/dist/semantic/vectorSearch.test.d.ts +1 -0
  145. package/dist/semantic/vectorSearch.test.js +660 -0
  146. package/dist/semantic/vectorSearch.test.js.map +1 -0
  147. package/dist/setupTests.d.ts +4 -0
  148. package/dist/setupTests.js +11 -0
  149. package/dist/setupTests.js.map +1 -0
  150. package/dist/test-utils/console.d.ts +2 -0
  151. package/dist/test-utils/console.js +3 -0
  152. package/dist/test-utils/console.js.map +1 -0
  153. package/dist/test-utils/factories.d.ts +3 -0
  154. package/dist/test-utils/factories.js +25 -0
  155. package/dist/test-utils/factories.js.map +1 -0
  156. package/dist/test-utils/tempFiles.d.ts +1 -0
  157. package/dist/test-utils/tempFiles.js +12 -0
  158. package/dist/test-utils/tempFiles.js.map +1 -0
  159. package/dist/types.d.ts +304 -0
  160. package/dist/types.js +5 -0
  161. package/dist/types.js.map +1 -0
  162. package/dist/utils/boundedMap.d.ts +8 -0
  163. package/dist/utils/boundedMap.js +22 -0
  164. package/dist/utils/boundedMap.js.map +1 -0
  165. package/dist/utils/boundedMap.test.d.ts +1 -0
  166. package/dist/utils/boundedMap.test.js +57 -0
  167. package/dist/utils/boundedMap.test.js.map +1 -0
  168. package/dist/utils/illustrativePatterns.d.ts +28 -0
  169. package/dist/utils/illustrativePatterns.js +80 -0
  170. package/dist/utils/illustrativePatterns.js.map +1 -0
  171. package/dist/utils/illustrativePatterns.test.d.ts +1 -0
  172. package/dist/utils/illustrativePatterns.test.js +48 -0
  173. package/dist/utils/illustrativePatterns.test.js.map +1 -0
  174. package/dist/utils/incremental.d.ts +36 -0
  175. package/dist/utils/incremental.js +87 -0
  176. package/dist/utils/incremental.js.map +1 -0
  177. package/dist/utils/incremental.test.d.ts +1 -0
  178. package/dist/utils/incremental.test.js +84 -0
  179. package/dist/utils/incremental.test.js.map +1 -0
  180. package/dist/utils/parallel.d.ts +14 -0
  181. package/dist/utils/parallel.js +43 -0
  182. package/dist/utils/parallel.js.map +1 -0
  183. package/dist/utils/parallel.test.d.ts +1 -0
  184. package/dist/utils/parallel.test.js +48 -0
  185. package/dist/utils/parallel.test.js.map +1 -0
  186. package/dist/utils/pathSecurity.d.ts +12 -0
  187. package/dist/utils/pathSecurity.js +22 -0
  188. package/dist/utils/pathSecurity.js.map +1 -0
  189. package/dist/utils/pathSecurity.test.d.ts +1 -0
  190. package/dist/utils/pathSecurity.test.js +34 -0
  191. package/dist/utils/pathSecurity.test.js.map +1 -0
  192. package/dist/utils/similarity.d.ts +12 -0
  193. package/dist/utils/similarity.js +64 -0
  194. package/dist/utils/similarity.js.map +1 -0
  195. package/dist/utils/similarity.test.d.ts +1 -0
  196. package/dist/utils/similarity.test.js +49 -0
  197. package/dist/utils/similarity.test.js.map +1 -0
  198. package/dist/utils/validation.d.ts +13 -0
  199. package/dist/utils/validation.js +24 -0
  200. package/dist/utils/validation.js.map +1 -0
  201. package/dist/utils/validation.test.d.ts +1 -0
  202. package/dist/utils/validation.test.js +28 -0
  203. package/dist/utils/validation.test.js.map +1 -0
  204. package/dist/validators/codePatternValidator.d.ts +28 -0
  205. package/dist/validators/codePatternValidator.js +200 -0
  206. package/dist/validators/codePatternValidator.js.map +1 -0
  207. package/dist/validators/codePatternValidator.test.d.ts +1 -0
  208. package/dist/validators/codePatternValidator.test.js +86 -0
  209. package/dist/validators/codePatternValidator.test.js.map +1 -0
  210. package/dist/validators/dependencyValidator.d.ts +12 -0
  211. package/dist/validators/dependencyValidator.js +102 -0
  212. package/dist/validators/dependencyValidator.js.map +1 -0
  213. package/dist/validators/dependencyValidator.test.d.ts +1 -0
  214. package/dist/validators/dependencyValidator.test.js +179 -0
  215. package/dist/validators/dependencyValidator.test.js.map +1 -0
  216. package/dist/validators/directoryValidator.d.ts +30 -0
  217. package/dist/validators/directoryValidator.js +192 -0
  218. package/dist/validators/directoryValidator.js.map +1 -0
  219. package/dist/validators/directoryValidator.test.d.ts +1 -0
  220. package/dist/validators/directoryValidator.test.js +193 -0
  221. package/dist/validators/directoryValidator.test.js.map +1 -0
  222. package/dist/validators/fileValidator.d.ts +16 -0
  223. package/dist/validators/fileValidator.js +114 -0
  224. package/dist/validators/fileValidator.js.map +1 -0
  225. package/dist/validators/fileValidator.test.d.ts +1 -0
  226. package/dist/validators/fileValidator.test.js +108 -0
  227. package/dist/validators/fileValidator.test.js.map +1 -0
  228. package/dist/validators/urlValidator.d.ts +25 -0
  229. package/dist/validators/urlValidator.js +320 -0
  230. package/dist/validators/urlValidator.js.map +1 -0
  231. package/dist/validators/urlValidator.test.d.ts +1 -0
  232. package/dist/validators/urlValidator.test.js +252 -0
  233. package/dist/validators/urlValidator.test.js.map +1 -0
  234. package/dist/validators/validationEngine.d.ts +23 -0
  235. package/dist/validators/validationEngine.js +117 -0
  236. package/dist/validators/validationEngine.js.map +1 -0
  237. package/dist/validators/validationEngine.test.d.ts +1 -0
  238. package/dist/validators/validationEngine.test.js +82 -0
  239. package/dist/validators/validationEngine.test.js.map +1 -0
  240. package/dist/validators/versionValidator.d.ts +18 -0
  241. package/dist/validators/versionValidator.js +211 -0
  242. package/dist/validators/versionValidator.js.map +1 -0
  243. package/dist/validators/versionValidator.test.d.ts +1 -0
  244. package/dist/validators/versionValidator.test.js +308 -0
  245. package/dist/validators/versionValidator.test.js.map +1 -0
  246. package/package.json +98 -0
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Orchestrates validation of extracted references
3
+ */
4
+ export class ValidationEngine {
5
+ config;
6
+ validators;
7
+ constructor(config) {
8
+ this.config = config;
9
+ this.validators = new Map();
10
+ }
11
+ /**
12
+ * Register a validator for a specific reference type
13
+ */
14
+ registerValidator(type, validator) {
15
+ this.validators.set(type, validator);
16
+ }
17
+ /**
18
+ * Validate all references from parsed documents
19
+ */
20
+ async validate(documents) {
21
+ const results = {
22
+ documents: [],
23
+ summary: {
24
+ total: 0,
25
+ valid: 0,
26
+ errors: 0,
27
+ warnings: 0,
28
+ skipped: 0,
29
+ },
30
+ };
31
+ for (const doc of documents) {
32
+ const docResult = {
33
+ path: doc.path,
34
+ issues: [],
35
+ };
36
+ // Group references by type for batch validation
37
+ const refsByType = this.groupByType(doc.references);
38
+ for (const [type, refs] of refsByType) {
39
+ // Check if this rule is explicitly disabled
40
+ const ruleConfig = this.config.rules?.[type];
41
+ if (ruleConfig?.enabled === false) {
42
+ results.summary.total += refs.length;
43
+ results.summary.skipped += refs.length;
44
+ continue;
45
+ }
46
+ const validator = this.validators.get(type);
47
+ if (!validator) {
48
+ results.summary.total += refs.length;
49
+ results.summary.skipped += refs.length;
50
+ continue;
51
+ }
52
+ try {
53
+ const validationResults = await validator.validateBatch(refs, doc, this.config);
54
+ for (const result of validationResults) {
55
+ const bucket = this.classifyResult(result);
56
+ this.incrementSummary(results, bucket);
57
+ if (bucket === 'error' || bucket === 'warning')
58
+ docResult.issues.push(result);
59
+ }
60
+ }
61
+ catch (error) {
62
+ if (this.config.verbose) {
63
+ console.warn(`Warning: Validator for ${type} failed: ${error.message}`);
64
+ }
65
+ results.summary.total += refs.length;
66
+ results.summary.skipped += refs.length;
67
+ }
68
+ }
69
+ if (docResult.issues.length > 0) {
70
+ results.documents.push(docResult);
71
+ }
72
+ }
73
+ return results;
74
+ }
75
+ /**
76
+ * Group references by type
77
+ */
78
+ groupByType(references) {
79
+ const grouped = new Map();
80
+ for (const ref of references) {
81
+ if (!grouped.has(ref.type)) {
82
+ grouped.set(ref.type, []);
83
+ }
84
+ grouped.get(ref.type).push(ref);
85
+ }
86
+ return grouped;
87
+ }
88
+ classifyResult(result) {
89
+ if (result.skipped)
90
+ return 'skipped';
91
+ if (result.valid || result.severity === 'info')
92
+ return 'valid';
93
+ if (result.severity === 'error')
94
+ return 'error';
95
+ if (result.severity === 'warning')
96
+ return 'warning';
97
+ return 'valid';
98
+ }
99
+ incrementSummary(results, bucket) {
100
+ results.summary.total++;
101
+ switch (bucket) {
102
+ case 'valid':
103
+ results.summary.valid++;
104
+ break;
105
+ case 'error':
106
+ results.summary.errors++;
107
+ break;
108
+ case 'warning':
109
+ results.summary.warnings++;
110
+ break;
111
+ case 'skipped':
112
+ results.summary.skipped++;
113
+ break;
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=validationEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationEngine.js","sourceRoot":"","sources":["../../src/validators/validationEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,82 @@
1
+ import { ValidationEngine } from './validationEngine.js';
2
+ function makeDoc(refs) {
3
+ return {
4
+ path: 'docs/test.md',
5
+ absolutePath: '/project/docs/test.md',
6
+ content: '',
7
+ format: 'markdown',
8
+ lines: [],
9
+ references: refs,
10
+ };
11
+ }
12
+ function makeRef(type, value) {
13
+ return { type, value, lineNumber: 1, raw: value, sourceFile: 'test.md' };
14
+ }
15
+ class StubValidator {
16
+ results;
17
+ constructor(results) {
18
+ this.results = results;
19
+ }
20
+ async validateBatch() {
21
+ return this.results;
22
+ }
23
+ }
24
+ describe('ValidationEngine', () => {
25
+ const config = { rules: { 'file-path': { enabled: true, severity: 'error' } } };
26
+ it('validates references using registered validators', async () => {
27
+ const engine = new ValidationEngine(config);
28
+ const ref = makeRef('file-path', './file.ts');
29
+ engine.registerValidator('file-path', new StubValidator([{ reference: ref, valid: true }]));
30
+ const results = await engine.validate([makeDoc([ref])]);
31
+ expect(results.summary.total).toBe(1);
32
+ expect(results.summary.valid).toBe(1);
33
+ });
34
+ it('counts errors, warnings, and skipped correctly', async () => {
35
+ const engine = new ValidationEngine(config);
36
+ const refs = [makeRef('file-path', 'a.ts'), makeRef('file-path', 'b.ts'), makeRef('file-path', 'c.ts'), makeRef('file-path', 'd.ts')];
37
+ engine.registerValidator('file-path', new StubValidator([
38
+ { reference: refs[0], valid: true },
39
+ { reference: refs[1], valid: false, severity: 'error', message: 'not found' },
40
+ { reference: refs[2], valid: false, severity: 'warning', message: 'stale' },
41
+ { reference: refs[3], valid: true, skipped: true },
42
+ ]));
43
+ const results = await engine.validate([makeDoc(refs)]);
44
+ expect(results.summary).toMatchObject({ total: 4, valid: 1, errors: 1, warnings: 1, skipped: 1 });
45
+ expect(results.documents).toHaveLength(1);
46
+ expect(results.documents[0].issues).toHaveLength(2);
47
+ });
48
+ it('skips disabled rules', async () => {
49
+ const cfg = { rules: { 'file-path': { enabled: false } } };
50
+ const engine = new ValidationEngine(cfg);
51
+ engine.registerValidator('file-path', new StubValidator([]));
52
+ const results = await engine.validate([makeDoc([makeRef('file-path', 'a.ts')])]);
53
+ expect(results.summary.skipped).toBe(1);
54
+ expect(results.summary.total).toBe(1);
55
+ });
56
+ it('skips references with no registered validator', async () => {
57
+ const engine = new ValidationEngine(config);
58
+ const results = await engine.validate([makeDoc([makeRef('unknown-type', 'val')])]);
59
+ expect(results.summary.skipped).toBe(1);
60
+ });
61
+ it('handles validator errors gracefully', async () => {
62
+ const engine = new ValidationEngine({ ...config, verbose: false });
63
+ const failValidator = {
64
+ async validateBatch() {
65
+ throw new Error('validator crashed');
66
+ },
67
+ };
68
+ engine.registerValidator('file-path', failValidator);
69
+ const results = await engine.validate([makeDoc([makeRef('file-path', 'a.ts')])]);
70
+ expect(results.summary.skipped).toBe(1);
71
+ });
72
+ it('treats info-level issues as valid', async () => {
73
+ const engine = new ValidationEngine(config);
74
+ const ref = makeRef('file-path', 'a.ts');
75
+ engine.registerValidator('file-path', new StubValidator([{ reference: ref, valid: false, severity: 'info', message: 'info only' }]));
76
+ const results = await engine.validate([makeDoc([ref])]);
77
+ expect(results.summary.valid).toBe(1);
78
+ expect(results.summary.errors).toBe(0);
79
+ expect(results.documents).toHaveLength(0);
80
+ });
81
+ });
82
+ //# sourceMappingURL=validationEngine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationEngine.test.js","sourceRoot":"","sources":["../../src/validators/validationEngine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { DocFreshnessConfig, Document, ManifestParser, Reference, ValidationResult } from '../types.js';
2
+ /**
3
+ * Manifest file parsers for different ecosystems
4
+ */
5
+ declare const manifestParsers: Record<string, ManifestParser>;
6
+ /**
7
+ * Validates version references against manifest files
8
+ */
9
+ export declare class VersionValidator {
10
+ private packageVersions;
11
+ private technologyMap;
12
+ private loadedFromKey;
13
+ constructor();
14
+ private loadPackageVersions;
15
+ validateBatch(references: Reference[], _document: Document, config: DocFreshnessConfig): Promise<ValidationResult[]>;
16
+ private getMajorVersion;
17
+ }
18
+ export { manifestParsers };
@@ -0,0 +1,211 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import semver from 'semver';
4
+ /**
5
+ * Manifest file parsers for different ecosystems
6
+ */
7
+ const manifestParsers = {
8
+ // Node.js: package.json
9
+ 'package.json': async (filePath) => {
10
+ const content = JSON.parse(await fs.promises.readFile(filePath, 'utf-8'));
11
+ const versions = new Map();
12
+ if (content.engines?.node) {
13
+ versions.set('node', normalizeVersion(content.engines.node));
14
+ versions.set('nodejs', normalizeVersion(content.engines.node));
15
+ }
16
+ if (content.engines?.npm) {
17
+ versions.set('npm', normalizeVersion(content.engines.npm));
18
+ }
19
+ const allDeps = { ...content.dependencies, ...content.devDependencies };
20
+ for (const [name, version] of Object.entries(allDeps)) {
21
+ versions.set(name.toLowerCase(), normalizeVersion(version));
22
+ }
23
+ return versions;
24
+ },
25
+ // Python: requirements.txt
26
+ 'requirements.txt': async (filePath) => {
27
+ const content = await fs.promises.readFile(filePath, 'utf-8');
28
+ const versions = new Map();
29
+ for (const line of content.split('\n')) {
30
+ const trimmed = line.trim();
31
+ if (!trimmed || trimmed.startsWith('#'))
32
+ continue;
33
+ const match = trimmed.match(/^([a-zA-Z0-9\-_]+)([<>=!]+)?(.+)?$/);
34
+ if (!match)
35
+ continue;
36
+ versions.set(match[1].toLowerCase(), match[3] ? normalizeVersion(match[3]) : 'any');
37
+ }
38
+ return versions;
39
+ },
40
+ // Python: pyproject.toml
41
+ 'pyproject.toml': async (filePath) => {
42
+ const content = await fs.promises.readFile(filePath, 'utf-8');
43
+ const versions = new Map();
44
+ // Basic TOML parsing for dependencies
45
+ const depsMatch = content.match(/\[project\.dependencies\]([\s\S]*?)(?:\[|$)/);
46
+ if (depsMatch) {
47
+ const depEntries = Array.from(depsMatch[1].matchAll(/"([^"]+)"/g), (match) => match[1]);
48
+ for (const dep of depEntries) {
49
+ const [pkg, version = 'any'] = dep.split(/[<>=!]+/);
50
+ if (pkg) {
51
+ versions.set(pkg.toLowerCase(), version);
52
+ }
53
+ }
54
+ }
55
+ return versions;
56
+ },
57
+ // Go: go.mod
58
+ 'go.mod': async (filePath) => {
59
+ const content = await fs.promises.readFile(filePath, 'utf-8');
60
+ const versions = new Map();
61
+ const goMatch = content.match(/^go\s+(\d+\.\d+)/m);
62
+ if (goMatch) {
63
+ versions.set('go', goMatch[1]);
64
+ versions.set('golang', goMatch[1]);
65
+ }
66
+ const requireMatch = content.match(/require\s+\(([\s\S]*?)\)/);
67
+ if (requireMatch) {
68
+ for (const line of requireMatch[1].split('\n')) {
69
+ const match = line.trim().match(/^([^\s]+)\s+v?([^\s]+)/);
70
+ if (!match)
71
+ continue;
72
+ versions.set(match[1], normalizeVersion(match[2]));
73
+ }
74
+ }
75
+ return versions;
76
+ },
77
+ // Rust: Cargo.toml
78
+ 'Cargo.toml': async (filePath) => {
79
+ const content = await fs.promises.readFile(filePath, 'utf-8');
80
+ const versions = new Map();
81
+ const depsMatch = content.match(/\[dependencies\]([\s\S]*?)(?:\[|$)/);
82
+ if (depsMatch) {
83
+ for (const line of depsMatch[1].split('\n')) {
84
+ const match = line.match(/^([a-zA-Z0-9\-_]+)\s*=\s*"?([^"\n]+)"?/);
85
+ if (!match)
86
+ continue;
87
+ versions.set(match[1].toLowerCase(), normalizeVersion(match[2]));
88
+ }
89
+ }
90
+ return versions;
91
+ },
92
+ // Java: pom.xml (basic parsing)
93
+ 'pom.xml': async (filePath) => {
94
+ const content = await fs.promises.readFile(filePath, 'utf-8');
95
+ const versions = new Map();
96
+ const javaMatch = content.match(/<java\.version>([^<]+)<\/java\.version>/);
97
+ if (javaMatch) {
98
+ versions.set('java', javaMatch[1]);
99
+ }
100
+ for (const match of content.matchAll(/<dependency>[\s\S]*?<artifactId>([^<]+)<\/artifactId>[\s\S]*?<version>([^<]+)<\/version>[\s\S]*?<\/dependency>/g)) {
101
+ versions.set(match[1].toLowerCase(), normalizeVersion(match[2]));
102
+ }
103
+ return versions;
104
+ },
105
+ };
106
+ function normalizeVersion(version) {
107
+ if (!version)
108
+ return 'any';
109
+ return version.replace(/^[\^~>=<]+/, '').replace(/\.x$/i, '.0');
110
+ }
111
+ /**
112
+ * Validates version references against manifest files
113
+ */
114
+ export class VersionValidator {
115
+ packageVersions;
116
+ technologyMap;
117
+ loadedFromKey;
118
+ constructor() {
119
+ this.packageVersions = null;
120
+ this.loadedFromKey = null;
121
+ this.technologyMap = {
122
+ react: ['react'],
123
+ typescript: ['typescript'],
124
+ node: ['node'],
125
+ nodejs: ['node'],
126
+ python: ['python'],
127
+ go: ['go'],
128
+ rust: ['rust'],
129
+ java: ['java'],
130
+ };
131
+ }
132
+ async loadPackageVersions(config) {
133
+ const rootDir = config.rootDir || process.cwd();
134
+ const manifestFiles = config.manifestFiles || ['package.json'];
135
+ const configKey = `${rootDir}::${manifestFiles.join('|')}`;
136
+ if (this.packageVersions && this.loadedFromKey === configKey)
137
+ return;
138
+ this.packageVersions = new Map();
139
+ this.loadedFromKey = configKey;
140
+ for (const manifestPath of manifestFiles) {
141
+ const fullPath = path.join(rootDir, manifestPath);
142
+ const fileName = path.basename(manifestPath);
143
+ const parser = manifestParsers[fileName];
144
+ if (!parser)
145
+ continue;
146
+ try {
147
+ const versions = await parser(fullPath);
148
+ for (const [name, version] of versions) {
149
+ this.packageVersions.set(name, version);
150
+ }
151
+ }
152
+ catch {
153
+ // Manifest file not found or parse error
154
+ }
155
+ }
156
+ }
157
+ async validateBatch(references, _document, config) {
158
+ await this.loadPackageVersions(config);
159
+ const results = [];
160
+ for (const ref of references) {
161
+ if (!ref.technology) {
162
+ results.push({ reference: ref, valid: true });
163
+ continue;
164
+ }
165
+ const tech = ref.technology.toLowerCase();
166
+ const docVersion = ref.version;
167
+ // Find actual version
168
+ const pkgNames = this.technologyMap[tech] || [tech];
169
+ let actualVersion = null;
170
+ for (const pkgName of pkgNames) {
171
+ if (this.packageVersions.has(pkgName)) {
172
+ actualVersion = this.packageVersions.get(pkgName);
173
+ break;
174
+ }
175
+ }
176
+ if (!actualVersion || actualVersion === 'any') {
177
+ results.push({
178
+ reference: ref,
179
+ valid: true,
180
+ message: `Could not find ${tech} in dependencies`,
181
+ });
182
+ continue;
183
+ }
184
+ // Compare versions
185
+ const docMajor = this.getMajorVersion(docVersion || '');
186
+ const actualMajor = this.getMajorVersion(actualVersion);
187
+ if (docMajor !== null && actualMajor !== null && docMajor !== actualMajor) {
188
+ results.push({
189
+ reference: ref,
190
+ valid: false,
191
+ severity: config.rules?.version?.severity || 'warning',
192
+ message: `Version mismatch: doc says ${ref.technology} ${docVersion}, actual is ${actualVersion}`,
193
+ suggestion: `Update to ${ref.technology} ${actualVersion}`,
194
+ });
195
+ }
196
+ else {
197
+ results.push({
198
+ reference: ref,
199
+ valid: true,
200
+ });
201
+ }
202
+ }
203
+ return results;
204
+ }
205
+ getMajorVersion(version) {
206
+ const parsed = semver.coerce(version);
207
+ return parsed ? parsed.major : null;
208
+ }
209
+ }
210
+ export { manifestParsers };
211
+ //# sourceMappingURL=versionValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versionValidator.js","sourceRoot":"","sources":["../../src/validators/versionValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};