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.
- package/LICENSE +21 -0
- package/README.md +305 -0
- package/dist/cache/cacheManager.d.ts +42 -0
- package/dist/cache/cacheManager.js +138 -0
- package/dist/cache/cacheManager.js.map +1 -0
- package/dist/cache/cacheManager.test.d.ts +1 -0
- package/dist/cache/cacheManager.test.js +142 -0
- package/dist/cache/cacheManager.test.js.map +1 -0
- package/dist/cli.d.ts +32 -0
- package/dist/cli.js +137 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.test.d.ts +1 -0
- package/dist/cli.test.js +184 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/config/defaults.d.ts +5 -0
- package/dist/config/defaults.js +135 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/defineConfig.d.ts +28 -0
- package/dist/config/defineConfig.js +30 -0
- package/dist/config/defineConfig.js.map +1 -0
- package/dist/config/defineConfig.test.d.ts +1 -0
- package/dist/config/defineConfig.test.js +10 -0
- package/dist/config/defineConfig.test.js.map +1 -0
- package/dist/config/loader.d.ts +7 -0
- package/dist/config/loader.js +250 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/loader.test.d.ts +1 -0
- package/dist/config/loader.test.js +276 -0
- package/dist/config/loader.test.js.map +1 -0
- package/dist/git/changeTracker.d.ts +44 -0
- package/dist/git/changeTracker.js +149 -0
- package/dist/git/changeTracker.js.map +1 -0
- package/dist/git/changeTracker.test.d.ts +1 -0
- package/dist/git/changeTracker.test.js +184 -0
- package/dist/git/changeTracker.test.js.map +1 -0
- package/dist/graph/codeDocGraph.d.ts +43 -0
- package/dist/graph/codeDocGraph.js +103 -0
- package/dist/graph/codeDocGraph.js.map +1 -0
- package/dist/graph/codeDocGraph.test.d.ts +1 -0
- package/dist/graph/codeDocGraph.test.js +78 -0
- package/dist/graph/codeDocGraph.test.js.map +1 -0
- package/dist/graph/graphBuilder.d.ts +17 -0
- package/dist/graph/graphBuilder.js +76 -0
- package/dist/graph/graphBuilder.js.map +1 -0
- package/dist/graph/graphBuilder.test.d.ts +1 -0
- package/dist/graph/graphBuilder.test.js +87 -0
- package/dist/graph/graphBuilder.test.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/documentParser.d.ts +22 -0
- package/dist/parsers/documentParser.js +76 -0
- package/dist/parsers/documentParser.js.map +1 -0
- package/dist/parsers/documentParser.test.d.ts +1 -0
- package/dist/parsers/documentParser.test.js +116 -0
- package/dist/parsers/documentParser.test.js.map +1 -0
- package/dist/parsers/extractors/baseExtractor.d.ts +19 -0
- package/dist/parsers/extractors/baseExtractor.js +33 -0
- package/dist/parsers/extractors/baseExtractor.js.map +1 -0
- package/dist/parsers/extractors/baseExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/baseExtractor.test.js +43 -0
- package/dist/parsers/extractors/baseExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/codePatternExtractor.d.ts +13 -0
- package/dist/parsers/extractors/codePatternExtractor.js +108 -0
- package/dist/parsers/extractors/codePatternExtractor.js.map +1 -0
- package/dist/parsers/extractors/codePatternExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/codePatternExtractor.test.js +49 -0
- package/dist/parsers/extractors/codePatternExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/dependencyExtractor.d.ts +12 -0
- package/dist/parsers/extractors/dependencyExtractor.js +92 -0
- package/dist/parsers/extractors/dependencyExtractor.js.map +1 -0
- package/dist/parsers/extractors/dependencyExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/dependencyExtractor.test.js +48 -0
- package/dist/parsers/extractors/dependencyExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/directoryStructureExtractor.d.ts +34 -0
- package/dist/parsers/extractors/directoryStructureExtractor.js +168 -0
- package/dist/parsers/extractors/directoryStructureExtractor.js.map +1 -0
- package/dist/parsers/extractors/directoryStructureExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/directoryStructureExtractor.test.js +121 -0
- package/dist/parsers/extractors/directoryStructureExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/externalUrlExtractor.d.ts +14 -0
- package/dist/parsers/extractors/externalUrlExtractor.js +53 -0
- package/dist/parsers/extractors/externalUrlExtractor.js.map +1 -0
- package/dist/parsers/extractors/externalUrlExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/externalUrlExtractor.test.js +85 -0
- package/dist/parsers/extractors/externalUrlExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/filePathExtractor.d.ts +18 -0
- package/dist/parsers/extractors/filePathExtractor.js +72 -0
- package/dist/parsers/extractors/filePathExtractor.js.map +1 -0
- package/dist/parsers/extractors/filePathExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/filePathExtractor.test.js +73 -0
- package/dist/parsers/extractors/filePathExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/versionExtractor.d.ts +11 -0
- package/dist/parsers/extractors/versionExtractor.js +74 -0
- package/dist/parsers/extractors/versionExtractor.js.map +1 -0
- package/dist/parsers/extractors/versionExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/versionExtractor.test.js +55 -0
- package/dist/parsers/extractors/versionExtractor.test.js.map +1 -0
- package/dist/plugins/plugin.d.ts +32 -0
- package/dist/plugins/plugin.js +40 -0
- package/dist/plugins/plugin.js.map +1 -0
- package/dist/plugins/plugin.test.d.ts +1 -0
- package/dist/plugins/plugin.test.js +23 -0
- package/dist/plugins/plugin.test.js.map +1 -0
- package/dist/reporters/consoleReporter.d.ts +15 -0
- package/dist/reporters/consoleReporter.js +73 -0
- package/dist/reporters/consoleReporter.js.map +1 -0
- package/dist/reporters/consoleReporter.test.d.ts +1 -0
- package/dist/reporters/consoleReporter.test.js +155 -0
- package/dist/reporters/consoleReporter.test.js.map +1 -0
- package/dist/reporters/enhancedReporter.d.ts +12 -0
- package/dist/reporters/enhancedReporter.js +81 -0
- package/dist/reporters/enhancedReporter.js.map +1 -0
- package/dist/reporters/enhancedReporter.test.d.ts +1 -0
- package/dist/reporters/enhancedReporter.test.js +152 -0
- package/dist/reporters/enhancedReporter.test.js.map +1 -0
- package/dist/reporters/jsonReporter.d.ts +11 -0
- package/dist/reporters/jsonReporter.js +20 -0
- package/dist/reporters/jsonReporter.js.map +1 -0
- package/dist/reporters/jsonReporter.test.d.ts +1 -0
- package/dist/reporters/jsonReporter.test.js +31 -0
- package/dist/reporters/jsonReporter.test.js.map +1 -0
- package/dist/reporters/markdownReporter.d.ts +11 -0
- package/dist/reporters/markdownReporter.js +55 -0
- package/dist/reporters/markdownReporter.js.map +1 -0
- package/dist/reporters/markdownReporter.test.d.ts +1 -0
- package/dist/reporters/markdownReporter.test.js +136 -0
- package/dist/reporters/markdownReporter.test.js.map +1 -0
- package/dist/runner.d.ts +9 -0
- package/dist/runner.js +265 -0
- package/dist/runner.js.map +1 -0
- package/dist/runner.test.d.ts +1 -0
- package/dist/runner.test.js +353 -0
- package/dist/runner.test.js.map +1 -0
- package/dist/scoring/freshnessScorer.d.ts +40 -0
- package/dist/scoring/freshnessScorer.js +170 -0
- package/dist/scoring/freshnessScorer.js.map +1 -0
- package/dist/scoring/freshnessScorer.test.d.ts +1 -0
- package/dist/scoring/freshnessScorer.test.js +397 -0
- package/dist/scoring/freshnessScorer.test.js.map +1 -0
- package/dist/semantic/vectorSearch.d.ts +84 -0
- package/dist/semantic/vectorSearch.js +484 -0
- package/dist/semantic/vectorSearch.js.map +1 -0
- package/dist/semantic/vectorSearch.test.d.ts +1 -0
- package/dist/semantic/vectorSearch.test.js +660 -0
- package/dist/semantic/vectorSearch.test.js.map +1 -0
- package/dist/setupTests.d.ts +4 -0
- package/dist/setupTests.js +11 -0
- package/dist/setupTests.js.map +1 -0
- package/dist/test-utils/console.d.ts +2 -0
- package/dist/test-utils/console.js +3 -0
- package/dist/test-utils/console.js.map +1 -0
- package/dist/test-utils/factories.d.ts +3 -0
- package/dist/test-utils/factories.js +25 -0
- package/dist/test-utils/factories.js.map +1 -0
- package/dist/test-utils/tempFiles.d.ts +1 -0
- package/dist/test-utils/tempFiles.js +12 -0
- package/dist/test-utils/tempFiles.js.map +1 -0
- package/dist/types.d.ts +304 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/boundedMap.d.ts +8 -0
- package/dist/utils/boundedMap.js +22 -0
- package/dist/utils/boundedMap.js.map +1 -0
- package/dist/utils/boundedMap.test.d.ts +1 -0
- package/dist/utils/boundedMap.test.js +57 -0
- package/dist/utils/boundedMap.test.js.map +1 -0
- package/dist/utils/illustrativePatterns.d.ts +28 -0
- package/dist/utils/illustrativePatterns.js +80 -0
- package/dist/utils/illustrativePatterns.js.map +1 -0
- package/dist/utils/illustrativePatterns.test.d.ts +1 -0
- package/dist/utils/illustrativePatterns.test.js +48 -0
- package/dist/utils/illustrativePatterns.test.js.map +1 -0
- package/dist/utils/incremental.d.ts +36 -0
- package/dist/utils/incremental.js +87 -0
- package/dist/utils/incremental.js.map +1 -0
- package/dist/utils/incremental.test.d.ts +1 -0
- package/dist/utils/incremental.test.js +84 -0
- package/dist/utils/incremental.test.js.map +1 -0
- package/dist/utils/parallel.d.ts +14 -0
- package/dist/utils/parallel.js +43 -0
- package/dist/utils/parallel.js.map +1 -0
- package/dist/utils/parallel.test.d.ts +1 -0
- package/dist/utils/parallel.test.js +48 -0
- package/dist/utils/parallel.test.js.map +1 -0
- package/dist/utils/pathSecurity.d.ts +12 -0
- package/dist/utils/pathSecurity.js +22 -0
- package/dist/utils/pathSecurity.js.map +1 -0
- package/dist/utils/pathSecurity.test.d.ts +1 -0
- package/dist/utils/pathSecurity.test.js +34 -0
- package/dist/utils/pathSecurity.test.js.map +1 -0
- package/dist/utils/similarity.d.ts +12 -0
- package/dist/utils/similarity.js +64 -0
- package/dist/utils/similarity.js.map +1 -0
- package/dist/utils/similarity.test.d.ts +1 -0
- package/dist/utils/similarity.test.js +49 -0
- package/dist/utils/similarity.test.js.map +1 -0
- package/dist/utils/validation.d.ts +13 -0
- package/dist/utils/validation.js +24 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/validation.test.d.ts +1 -0
- package/dist/utils/validation.test.js +28 -0
- package/dist/utils/validation.test.js.map +1 -0
- package/dist/validators/codePatternValidator.d.ts +28 -0
- package/dist/validators/codePatternValidator.js +200 -0
- package/dist/validators/codePatternValidator.js.map +1 -0
- package/dist/validators/codePatternValidator.test.d.ts +1 -0
- package/dist/validators/codePatternValidator.test.js +86 -0
- package/dist/validators/codePatternValidator.test.js.map +1 -0
- package/dist/validators/dependencyValidator.d.ts +12 -0
- package/dist/validators/dependencyValidator.js +102 -0
- package/dist/validators/dependencyValidator.js.map +1 -0
- package/dist/validators/dependencyValidator.test.d.ts +1 -0
- package/dist/validators/dependencyValidator.test.js +179 -0
- package/dist/validators/dependencyValidator.test.js.map +1 -0
- package/dist/validators/directoryValidator.d.ts +30 -0
- package/dist/validators/directoryValidator.js +192 -0
- package/dist/validators/directoryValidator.js.map +1 -0
- package/dist/validators/directoryValidator.test.d.ts +1 -0
- package/dist/validators/directoryValidator.test.js +193 -0
- package/dist/validators/directoryValidator.test.js.map +1 -0
- package/dist/validators/fileValidator.d.ts +16 -0
- package/dist/validators/fileValidator.js +114 -0
- package/dist/validators/fileValidator.js.map +1 -0
- package/dist/validators/fileValidator.test.d.ts +1 -0
- package/dist/validators/fileValidator.test.js +108 -0
- package/dist/validators/fileValidator.test.js.map +1 -0
- package/dist/validators/urlValidator.d.ts +25 -0
- package/dist/validators/urlValidator.js +320 -0
- package/dist/validators/urlValidator.js.map +1 -0
- package/dist/validators/urlValidator.test.d.ts +1 -0
- package/dist/validators/urlValidator.test.js +252 -0
- package/dist/validators/urlValidator.test.js.map +1 -0
- package/dist/validators/validationEngine.d.ts +23 -0
- package/dist/validators/validationEngine.js +117 -0
- package/dist/validators/validationEngine.js.map +1 -0
- package/dist/validators/validationEngine.test.d.ts +1 -0
- package/dist/validators/validationEngine.test.js +82 -0
- package/dist/validators/validationEngine.test.js.map +1 -0
- package/dist/validators/versionValidator.d.ts +18 -0
- package/dist/validators/versionValidator.js +211 -0
- package/dist/validators/versionValidator.js.map +1 -0
- package/dist/validators/versionValidator.test.d.ts +1 -0
- package/dist/validators/versionValidator.test.js +308 -0
- package/dist/validators/versionValidator.test.js.map +1 -0
- package/package.json +98 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { VersionValidator, manifestParsers } from './versionValidator.js';
|
|
4
|
+
import { makeDoc, makeRef as makeBaseRef } from '../test-utils/factories.js';
|
|
5
|
+
function makeRef(technology, version) {
|
|
6
|
+
return makeBaseRef('version', `${technology} ${version}`, { technology, version });
|
|
7
|
+
}
|
|
8
|
+
const doc = makeDoc();
|
|
9
|
+
const tmpDir = path.join(process.cwd(), '.doc-freshness-cache', 'manifest-test');
|
|
10
|
+
describe('VersionValidator', () => {
|
|
11
|
+
it('validates matching major versions as valid', async () => {
|
|
12
|
+
const validator = new VersionValidator();
|
|
13
|
+
const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
|
|
14
|
+
const pkg = JSON.parse(await fs.promises.readFile(`${process.cwd()}/package.json`, 'utf-8'));
|
|
15
|
+
const tsVersion = pkg.devDependencies?.typescript;
|
|
16
|
+
if (tsVersion) {
|
|
17
|
+
const major = tsVersion.replace(/^[\^~]/, '').split('.')[0];
|
|
18
|
+
const results = await validator.validateBatch([makeRef('TypeScript', `${major}.0`)], doc, config);
|
|
19
|
+
expect(results[0].valid).toBe(true);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
it('detects major version mismatches', async () => {
|
|
23
|
+
const validator = new VersionValidator();
|
|
24
|
+
const config = {
|
|
25
|
+
rootDir: process.cwd(),
|
|
26
|
+
manifestFiles: ['package.json'],
|
|
27
|
+
rules: { version: { severity: 'warning' } },
|
|
28
|
+
};
|
|
29
|
+
const results = await validator.validateBatch([makeRef('TypeScript', '1.0')], doc, config);
|
|
30
|
+
expect(results[0].valid).toBe(false);
|
|
31
|
+
expect(results[0].severity).toBe('warning');
|
|
32
|
+
expect(results[0].suggestion).toContain('Update to');
|
|
33
|
+
});
|
|
34
|
+
it('passes when technology is not found in dependencies', async () => {
|
|
35
|
+
const validator = new VersionValidator();
|
|
36
|
+
const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
|
|
37
|
+
const results = await validator.validateBatch([makeRef('UnknownTech', '1.0')], doc, config);
|
|
38
|
+
expect(results[0].valid).toBe(true);
|
|
39
|
+
expect(results[0].message).toContain('Could not find');
|
|
40
|
+
});
|
|
41
|
+
it('handles references without technology field', async () => {
|
|
42
|
+
const validator = new VersionValidator();
|
|
43
|
+
const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
|
|
44
|
+
const ref = { type: 'version', value: '1.0', lineNumber: 1, raw: '1.0', sourceFile: 'doc.md' };
|
|
45
|
+
const results = await validator.validateBatch([ref], doc, config);
|
|
46
|
+
expect(results[0].valid).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
it('uses technologyMap aliases (node, react, etc.)', async () => {
|
|
49
|
+
const validator = new VersionValidator();
|
|
50
|
+
const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
|
|
51
|
+
const results = await validator.validateBatch([makeRef('react', '999.0')], doc, config);
|
|
52
|
+
// If react is in deps, version 999 mismatches; if not, "could not find" → valid
|
|
53
|
+
expect(results[0]).toBeDefined();
|
|
54
|
+
});
|
|
55
|
+
it('skips unknown manifest file types', async () => {
|
|
56
|
+
const validator = new VersionValidator();
|
|
57
|
+
const config = { rootDir: process.cwd(), manifestFiles: ['unknown-manifest.xyz'] };
|
|
58
|
+
const results = await validator.validateBatch([makeRef('SomeTech', '1.0')], doc, config);
|
|
59
|
+
expect(results[0].valid).toBe(true);
|
|
60
|
+
expect(results[0].message).toContain('Could not find');
|
|
61
|
+
});
|
|
62
|
+
it('handles manifest parse errors gracefully', async () => {
|
|
63
|
+
const validator = new VersionValidator();
|
|
64
|
+
const config = { rootDir: process.cwd(), manifestFiles: ['nonexistent-file.json'] };
|
|
65
|
+
const results = await validator.validateBatch([makeRef('SomeTech', '1.0')], doc, config);
|
|
66
|
+
expect(results[0].valid).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
it('treats version "any" as not constraining', async () => {
|
|
69
|
+
const dir = path.join(tmpDir, 'any-ver');
|
|
70
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
71
|
+
await fs.promises.writeFile(path.join(dir, 'requirements.txt'), 'flask\n');
|
|
72
|
+
const validator = new VersionValidator();
|
|
73
|
+
const config = {
|
|
74
|
+
rootDir: process.cwd(),
|
|
75
|
+
manifestFiles: [path.relative(process.cwd(), path.join(dir, 'requirements.txt'))],
|
|
76
|
+
};
|
|
77
|
+
const results = await validator.validateBatch([makeRef('flask', '2.0')], doc, config);
|
|
78
|
+
expect(results[0].valid).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
it('caches loaded versions across calls', async () => {
|
|
81
|
+
const validator = new VersionValidator();
|
|
82
|
+
const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
|
|
83
|
+
await validator.validateBatch([makeRef('TypeScript', '1.0')], doc, config);
|
|
84
|
+
const results = await validator.validateBatch([makeRef('TypeScript', '1.0')], doc, config);
|
|
85
|
+
expect(results[0]).toBeDefined();
|
|
86
|
+
});
|
|
87
|
+
it('compares matching versions correctly (same major)', async () => {
|
|
88
|
+
const dir = path.join(tmpDir, 'same-ver');
|
|
89
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
90
|
+
await fs.promises.writeFile(path.join(dir, 'requirements.txt'), 'flask==2.3.0\n');
|
|
91
|
+
const validator = new VersionValidator();
|
|
92
|
+
const config = {
|
|
93
|
+
rootDir: process.cwd(),
|
|
94
|
+
manifestFiles: [path.relative(process.cwd(), path.join(dir, 'requirements.txt'))],
|
|
95
|
+
};
|
|
96
|
+
const results = await validator.validateBatch([makeRef('flask', '2.1')], doc, config);
|
|
97
|
+
expect(results[0].valid).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
it('detects major version mismatch for non-package.json manifests', async () => {
|
|
100
|
+
const dir = path.join(tmpDir, 'mismatch-ver');
|
|
101
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
102
|
+
await fs.promises.writeFile(path.join(dir, 'requirements.txt'), 'flask==3.0.0\n');
|
|
103
|
+
const validator = new VersionValidator();
|
|
104
|
+
const config = {
|
|
105
|
+
rootDir: process.cwd(),
|
|
106
|
+
manifestFiles: [path.relative(process.cwd(), path.join(dir, 'requirements.txt'))],
|
|
107
|
+
rules: { version: { severity: 'error' } },
|
|
108
|
+
};
|
|
109
|
+
const results = await validator.validateBatch([makeRef('flask', '2.0')], doc, config);
|
|
110
|
+
expect(results[0].valid).toBe(false);
|
|
111
|
+
expect(results[0].severity).toBe('error');
|
|
112
|
+
});
|
|
113
|
+
it('handles unparseable version strings gracefully', async () => {
|
|
114
|
+
const validator = new VersionValidator();
|
|
115
|
+
const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
|
|
116
|
+
const results = await validator.validateBatch([makeRef('typescript', 'latest')], doc, config);
|
|
117
|
+
expect(results[0].valid).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
it('handles reference with technology but no version', async () => {
|
|
120
|
+
const validator = new VersionValidator();
|
|
121
|
+
const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
|
|
122
|
+
const ref = {
|
|
123
|
+
type: 'version',
|
|
124
|
+
value: 'typescript',
|
|
125
|
+
technology: 'typescript',
|
|
126
|
+
lineNumber: 1,
|
|
127
|
+
raw: 'typescript',
|
|
128
|
+
sourceFile: 'doc.md',
|
|
129
|
+
};
|
|
130
|
+
const results = await validator.validateBatch([ref], doc, config);
|
|
131
|
+
expect(results[0].valid).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
it('handles nodejs alias mapping', async () => {
|
|
134
|
+
const validator = new VersionValidator();
|
|
135
|
+
const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
|
|
136
|
+
const results = await validator.validateBatch([makeRef('nodejs', '999.0')], doc, config);
|
|
137
|
+
expect(results[0]).toBeDefined();
|
|
138
|
+
});
|
|
139
|
+
it('treats empty version in package.json as "any"', async () => {
|
|
140
|
+
const dir = path.join(tmpDir, 'empty-ver');
|
|
141
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
142
|
+
await fs.promises.writeFile(path.join(dir, 'package.json'), JSON.stringify({
|
|
143
|
+
dependencies: { 'test-pkg': '' },
|
|
144
|
+
}));
|
|
145
|
+
const validator = new VersionValidator();
|
|
146
|
+
const config = {
|
|
147
|
+
rootDir: process.cwd(),
|
|
148
|
+
manifestFiles: [path.relative(process.cwd(), path.join(dir, 'package.json'))],
|
|
149
|
+
};
|
|
150
|
+
const results = await validator.validateBatch([makeRef('test-pkg', '1.0')], doc, config);
|
|
151
|
+
expect(results[0].valid).toBe(true);
|
|
152
|
+
});
|
|
153
|
+
it('uses default manifestFiles when not specified', async () => {
|
|
154
|
+
const validator = new VersionValidator();
|
|
155
|
+
const config = { rootDir: process.cwd() };
|
|
156
|
+
const results = await validator.validateBatch([makeRef('typescript', '1.0')], doc, config);
|
|
157
|
+
expect(results[0]).toBeDefined();
|
|
158
|
+
});
|
|
159
|
+
it('parses package.json with peerDependencies', async () => {
|
|
160
|
+
const dir = path.join(tmpDir, 'peer-deps');
|
|
161
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
162
|
+
await fs.promises.writeFile(path.join(dir, 'package.json'), JSON.stringify({
|
|
163
|
+
peerDependencies: { react: '^18.0.0' },
|
|
164
|
+
}));
|
|
165
|
+
const validator = new VersionValidator();
|
|
166
|
+
const config = {
|
|
167
|
+
rootDir: process.cwd(),
|
|
168
|
+
manifestFiles: [path.relative(process.cwd(), path.join(dir, 'package.json'))],
|
|
169
|
+
};
|
|
170
|
+
const results = await validator.validateBatch([makeRef('react', '18.0')], doc, config);
|
|
171
|
+
expect(results[0].valid).toBe(true);
|
|
172
|
+
});
|
|
173
|
+
it('uses technology name directly when not in technologyMap', async () => {
|
|
174
|
+
const dir = path.join(tmpDir, 'direct-tech');
|
|
175
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
176
|
+
await fs.promises.writeFile(path.join(dir, 'package.json'), JSON.stringify({
|
|
177
|
+
dependencies: { 'custom-lib': '5.0.0' },
|
|
178
|
+
}));
|
|
179
|
+
const validator = new VersionValidator();
|
|
180
|
+
const config = {
|
|
181
|
+
rootDir: process.cwd(),
|
|
182
|
+
manifestFiles: [path.relative(process.cwd(), path.join(dir, 'package.json'))],
|
|
183
|
+
};
|
|
184
|
+
const results = await validator.validateBatch([makeRef('custom-lib', '5.0')], doc, config);
|
|
185
|
+
expect(results[0].valid).toBe(true);
|
|
186
|
+
});
|
|
187
|
+
it('reloads package versions when manifest config changes on the same instance', async () => {
|
|
188
|
+
const dirA = path.join(tmpDir, 'reload-a');
|
|
189
|
+
const dirB = path.join(tmpDir, 'reload-b');
|
|
190
|
+
await fs.promises.mkdir(dirA, { recursive: true });
|
|
191
|
+
await fs.promises.mkdir(dirB, { recursive: true });
|
|
192
|
+
const manifestA = path.join(dirA, 'package.json');
|
|
193
|
+
const manifestB = path.join(dirB, 'package.json');
|
|
194
|
+
await fs.promises.writeFile(manifestA, JSON.stringify({ dependencies: { react: '17.0.0' } }));
|
|
195
|
+
await fs.promises.writeFile(manifestB, JSON.stringify({ dependencies: { react: '18.0.0' } }));
|
|
196
|
+
const validator = new VersionValidator();
|
|
197
|
+
const configA = {
|
|
198
|
+
rootDir: process.cwd(),
|
|
199
|
+
manifestFiles: [path.relative(process.cwd(), manifestA)],
|
|
200
|
+
};
|
|
201
|
+
const configB = {
|
|
202
|
+
rootDir: process.cwd(),
|
|
203
|
+
manifestFiles: [path.relative(process.cwd(), manifestB)],
|
|
204
|
+
};
|
|
205
|
+
const first = await validator.validateBatch([makeRef('react', '18.0')], doc, configA);
|
|
206
|
+
expect(first[0].valid).toBe(false);
|
|
207
|
+
const second = await validator.validateBatch([makeRef('react', '18.0')], doc, configB);
|
|
208
|
+
expect(second[0].valid).toBe(true);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
describe('manifestParsers', () => {
|
|
212
|
+
beforeAll(async () => {
|
|
213
|
+
await fs.promises.mkdir(tmpDir, { recursive: true });
|
|
214
|
+
});
|
|
215
|
+
afterAll(async () => {
|
|
216
|
+
await fs.promises.rm(tmpDir, { recursive: true, force: true }).catch(() => { });
|
|
217
|
+
});
|
|
218
|
+
it('parses package.json with engines and all dep types', async () => {
|
|
219
|
+
const filePath = path.join(tmpDir, 'package.json');
|
|
220
|
+
await fs.promises.writeFile(filePath, JSON.stringify({
|
|
221
|
+
engines: { node: '>=18.0.0', npm: '>=9.0.0' },
|
|
222
|
+
dependencies: { express: '^4.18.0' },
|
|
223
|
+
devDependencies: { jest: '^29.0.0' },
|
|
224
|
+
}));
|
|
225
|
+
const versions = await manifestParsers['package.json'](filePath);
|
|
226
|
+
expect(versions.get('node')).toBe('18.0.0');
|
|
227
|
+
expect(versions.get('nodejs')).toBe('18.0.0');
|
|
228
|
+
expect(versions.get('npm')).toBe('9.0.0');
|
|
229
|
+
expect(versions.get('express')).toBe('4.18.0');
|
|
230
|
+
expect(versions.get('jest')).toBe('29.0.0');
|
|
231
|
+
});
|
|
232
|
+
it('parses requirements.txt with versions and comments', async () => {
|
|
233
|
+
const filePath = path.join(tmpDir, 'requirements.txt');
|
|
234
|
+
await fs.promises.writeFile(filePath, 'flask>=2.0.1\nrequests==2.31.0\n# comment\ndjango\n');
|
|
235
|
+
const versions = await manifestParsers['requirements.txt'](filePath);
|
|
236
|
+
expect(versions.get('flask')).toBe('2.0.1');
|
|
237
|
+
expect(versions.get('requests')).toBe('2.31.0');
|
|
238
|
+
expect(versions.get('django')).toBe('any');
|
|
239
|
+
});
|
|
240
|
+
it('parses pyproject.toml', async () => {
|
|
241
|
+
const filePath = path.join(tmpDir, 'pyproject.toml');
|
|
242
|
+
await fs.promises.writeFile(filePath, '[project.dependencies]\n"fastapi>=0.100.0"\n"pydantic>=2.0"\n');
|
|
243
|
+
const versions = await manifestParsers['pyproject.toml'](filePath);
|
|
244
|
+
expect(versions.get('fastapi')).toBeDefined();
|
|
245
|
+
expect(versions.get('pydantic')).toBeDefined();
|
|
246
|
+
});
|
|
247
|
+
it('parses go.mod', async () => {
|
|
248
|
+
const filePath = path.join(tmpDir, 'go.mod');
|
|
249
|
+
await fs.promises.writeFile(filePath, 'module example.com/mymod\n\ngo 1.21\n\nrequire (\n\tgithub.com/gin-gonic/gin v1.9.1\n)');
|
|
250
|
+
const versions = await manifestParsers['go.mod'](filePath);
|
|
251
|
+
expect(versions.get('go')).toBe('1.21');
|
|
252
|
+
expect(versions.get('golang')).toBe('1.21');
|
|
253
|
+
expect(versions.get('github.com/gin-gonic/gin')).toBe('1.9.1');
|
|
254
|
+
});
|
|
255
|
+
it('parses Cargo.toml', async () => {
|
|
256
|
+
const filePath = path.join(tmpDir, 'Cargo.toml');
|
|
257
|
+
await fs.promises.writeFile(filePath, '[dependencies]\nserde = "1.0"\ntokio = "1.28"');
|
|
258
|
+
const versions = await manifestParsers['Cargo.toml'](filePath);
|
|
259
|
+
expect(versions.get('serde')).toBe('1.0');
|
|
260
|
+
expect(versions.get('tokio')).toBe('1.28');
|
|
261
|
+
});
|
|
262
|
+
it('parses go.mod without require block', async () => {
|
|
263
|
+
const filePath = path.join(tmpDir, 'go-no-require.mod');
|
|
264
|
+
await fs.promises.writeFile(filePath, 'module example.com/mymod\n\ngo 1.22\n');
|
|
265
|
+
const versions = await manifestParsers['go.mod'](filePath);
|
|
266
|
+
expect(versions.get('go')).toBe('1.22');
|
|
267
|
+
expect(versions.size).toBe(2);
|
|
268
|
+
});
|
|
269
|
+
it('parses Cargo.toml without dependencies section', async () => {
|
|
270
|
+
const filePath = path.join(tmpDir, 'Cargo-empty.toml');
|
|
271
|
+
await fs.promises.writeFile(filePath, '[package]\nname = "myapp"\nversion = "0.1.0"');
|
|
272
|
+
const versions = await manifestParsers['Cargo.toml'](filePath);
|
|
273
|
+
expect(versions.size).toBe(0);
|
|
274
|
+
});
|
|
275
|
+
it('parses pyproject.toml without dependencies section', async () => {
|
|
276
|
+
const filePath = path.join(tmpDir, 'pyproject-empty.toml');
|
|
277
|
+
await fs.promises.writeFile(filePath, '[tool.poetry]\nname = "myapp"');
|
|
278
|
+
const versions = await manifestParsers['pyproject.toml'](filePath);
|
|
279
|
+
expect(versions.size).toBe(0);
|
|
280
|
+
});
|
|
281
|
+
it('parses requirements.txt with comments and blank lines', async () => {
|
|
282
|
+
const filePath = path.join(tmpDir, 'requirements-comments.txt');
|
|
283
|
+
await fs.promises.writeFile(filePath, '# Comment\n\nflask>=2.0\n \n# Another comment\n');
|
|
284
|
+
const versions = await manifestParsers['requirements.txt'](filePath);
|
|
285
|
+
expect(versions.get('flask')).toBeDefined();
|
|
286
|
+
expect(versions.size).toBe(1);
|
|
287
|
+
});
|
|
288
|
+
it('parses pom.xml without java version', async () => {
|
|
289
|
+
const filePath = path.join(tmpDir, 'pom-no-java.xml');
|
|
290
|
+
await fs.promises.writeFile(filePath, '<project><dependencies><dependency><artifactId>junit</artifactId><version>5.9</version></dependency></dependencies></project>');
|
|
291
|
+
const versions = await manifestParsers['pom.xml'](filePath);
|
|
292
|
+
expect(versions.get('junit')).toBe('5.9');
|
|
293
|
+
expect(versions.has('java')).toBe(false);
|
|
294
|
+
});
|
|
295
|
+
it('parses pom.xml with java version and dependencies', async () => {
|
|
296
|
+
const filePath = path.join(tmpDir, 'pom.xml');
|
|
297
|
+
await fs.promises.writeFile(filePath, `<project>
|
|
298
|
+
<properties><java.version>17</java.version></properties>
|
|
299
|
+
<dependencies>
|
|
300
|
+
<dependency><artifactId>spring-boot</artifactId><version>3.1.0</version></dependency>
|
|
301
|
+
</dependencies>
|
|
302
|
+
</project>`);
|
|
303
|
+
const versions = await manifestParsers['pom.xml'](filePath);
|
|
304
|
+
expect(versions.get('java')).toBe('17');
|
|
305
|
+
expect(versions.get('spring-boot')).toBe('3.1.0');
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
//# sourceMappingURL=versionValidator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versionValidator.test.js","sourceRoot":"","sources":["../../src/validators/versionValidator.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "doc-freshness-checker",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Universal documentation freshness checker - validates documentation accuracy against actual codebase",
|
|
5
|
+
"homepage": "https://github.com/cosmocoder/doc-freshness-checker#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/cosmocoder/doc-freshness-checker/issues"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/cosmocoder/doc-freshness-checker.git"
|
|
12
|
+
},
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": "cosmocoder",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"doc-freshness": "dist/cli.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"README.md"
|
|
31
|
+
],
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc",
|
|
34
|
+
"build:watch": "tsc --watch",
|
|
35
|
+
"clean": "rm -rf dist",
|
|
36
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"test:watch": "vitest",
|
|
39
|
+
"test:coverage": "vitest run --coverage",
|
|
40
|
+
"test:types": "tsc --noEmit",
|
|
41
|
+
"lint": "eslint . --ext .js,.ts",
|
|
42
|
+
"lint:fix": "npm run lint -- --fix",
|
|
43
|
+
"prettier": "prettier --write src/",
|
|
44
|
+
"prettier:ci": "prettier --check src/",
|
|
45
|
+
"docs:check": "node dist/cli.js",
|
|
46
|
+
"docs:check:json": "node dist/cli.js --reporter json --output reports/doc-freshness.json",
|
|
47
|
+
"prepare": "husky"
|
|
48
|
+
},
|
|
49
|
+
"keywords": [
|
|
50
|
+
"documentation",
|
|
51
|
+
"freshness",
|
|
52
|
+
"validation",
|
|
53
|
+
"docs",
|
|
54
|
+
"checker",
|
|
55
|
+
"stale",
|
|
56
|
+
"lint",
|
|
57
|
+
"markdown",
|
|
58
|
+
"ci",
|
|
59
|
+
"devops"
|
|
60
|
+
],
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=22.19.0"
|
|
63
|
+
},
|
|
64
|
+
"engine-strict": true,
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"commander": "12.0.0",
|
|
67
|
+
"fastembed": "2.1.0",
|
|
68
|
+
"glob": "10.3.10",
|
|
69
|
+
"semver": "7.6.0"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@commitlint/cli": "20.4.3",
|
|
73
|
+
"@commitlint/config-conventional": "20.4.3",
|
|
74
|
+
"@eslint/js": "9.39.2",
|
|
75
|
+
"@types/node": "25.2.0",
|
|
76
|
+
"@types/semver": "7.7.1",
|
|
77
|
+
"@vitest/coverage-v8": "4.0.18",
|
|
78
|
+
"eslint": "9.39.2",
|
|
79
|
+
"globals": "17.3.0",
|
|
80
|
+
"husky": "9.1.7",
|
|
81
|
+
"jiti": "2.6.1",
|
|
82
|
+
"lint-staged": "16.3.2",
|
|
83
|
+
"prettier": "3.8.1",
|
|
84
|
+
"typescript": "5.9.3",
|
|
85
|
+
"typescript-eslint": "8.54.0",
|
|
86
|
+
"vitest": "4.0.18",
|
|
87
|
+
"vitest-fetch-mock": "0.4.5"
|
|
88
|
+
},
|
|
89
|
+
"lint-staged": {
|
|
90
|
+
"src/**/*.md": [
|
|
91
|
+
"npm run prettier"
|
|
92
|
+
],
|
|
93
|
+
"src/**/*.{js,ts}": [
|
|
94
|
+
"npm run lint:fix",
|
|
95
|
+
"npm run prettier"
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
}
|