doc-freshness-checker 2.0.23 → 2.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.
- package/README.md +5 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/manifests/manifestInventory.d.ts +28 -0
- package/dist/manifests/manifestInventory.js +225 -0
- package/dist/manifests/manifestInventory.js.map +1 -0
- package/dist/manifests/manifestInventory.test.d.ts +1 -0
- package/dist/manifests/manifestInventory.test.js +176 -0
- package/dist/manifests/manifestInventory.test.js.map +1 -0
- package/dist/manifests/validatorConstructors.test.d.ts +1 -0
- package/dist/manifests/validatorConstructors.test.js +17 -0
- package/dist/manifests/validatorConstructors.test.js.map +1 -0
- package/dist/parsers/documentParser.d.ts +2 -3
- package/dist/parsers/documentParser.js.map +1 -1
- package/dist/parsers/extractorInterface.test.d.ts +1 -0
- package/dist/parsers/extractorInterface.test.js +34 -0
- package/dist/parsers/extractorInterface.test.js.map +1 -0
- package/dist/parsers/extractors/codeSnippetExtractor.js.map +1 -1
- package/dist/plugins/plugin.d.ts +5 -1
- package/dist/plugins/plugin.js +5 -1
- package/dist/plugins/plugin.js.map +1 -1
- package/dist/reporters/consoleReporter.d.ts +5 -11
- package/dist/reporters/consoleReporter.js +74 -76
- package/dist/reporters/consoleReporter.js.map +1 -1
- package/dist/reporters/consoleReporter.test.js +22 -27
- package/dist/reporters/consoleReporter.test.js.map +1 -1
- package/dist/reporters/enhancedReporter.d.ts +51 -7
- package/dist/reporters/enhancedReporter.js +128 -74
- package/dist/reporters/enhancedReporter.js.map +1 -1
- package/dist/reporters/enhancedReporter.test.js +110 -122
- package/dist/reporters/enhancedReporter.test.js.map +1 -1
- package/dist/reporters/jsonReporter.d.ts +6 -6
- package/dist/reporters/jsonReporter.js +24 -14
- package/dist/reporters/jsonReporter.js.map +1 -1
- package/dist/reporters/jsonReporter.test.js +26 -11
- package/dist/reporters/jsonReporter.test.js.map +1 -1
- package/dist/reporters/markdownIssueCells.d.ts +7 -0
- package/dist/reporters/markdownIssueCells.js +9 -0
- package/dist/reporters/markdownIssueCells.js.map +1 -0
- package/dist/reporters/markdownReporter.d.ts +2 -7
- package/dist/reporters/markdownReporter.js +57 -56
- package/dist/reporters/markdownReporter.js.map +1 -1
- package/dist/reporters/markdownReporter.test.js +104 -76
- package/dist/reporters/markdownReporter.test.js.map +1 -1
- package/dist/reporters/publicReporterApi.test.d.ts +1 -0
- package/dist/reporters/publicReporterApi.test.js +28 -0
- package/dist/reporters/publicReporterApi.test.js.map +1 -0
- package/dist/reporters/reportContext.d.ts +12 -0
- package/dist/reporters/reportContext.js +8 -0
- package/dist/reporters/reportContext.js.map +1 -0
- package/dist/reporters/reportContext.test.d.ts +1 -0
- package/dist/reporters/reportContext.test.js +30 -0
- package/dist/reporters/reportContext.test.js.map +1 -0
- package/dist/reporters/reporters.characterization.test.d.ts +1 -0
- package/dist/reporters/reporters.characterization.test.js +208 -0
- package/dist/reporters/reporters.characterization.test.js.map +1 -0
- package/dist/runner.js +67 -63
- package/dist/runner.js.map +1 -1
- package/dist/runner.test.js +444 -42
- package/dist/runner.test.js.map +1 -1
- package/dist/semantic/vectorSearch.js +2 -1
- package/dist/semantic/vectorSearch.js.map +1 -1
- package/dist/semantic/vectorSearch.test.js +2 -2
- package/dist/semantic/vectorSearch.test.js.map +1 -1
- package/dist/source/sourceIndex.d.ts +39 -0
- package/dist/source/sourceIndex.js +444 -0
- package/dist/source/sourceIndex.js.map +1 -0
- package/dist/source/sourceIndex.largeGlob.test.d.ts +1 -0
- package/dist/source/sourceIndex.largeGlob.test.js +29 -0
- package/dist/source/sourceIndex.largeGlob.test.js.map +1 -0
- package/dist/source/sourceIndex.test.d.ts +1 -0
- package/dist/source/sourceIndex.test.js +263 -0
- package/dist/source/sourceIndex.test.js.map +1 -0
- package/dist/source/sourceValidators.d.ts +7 -0
- package/dist/source/sourceValidators.js +8 -0
- package/dist/source/sourceValidators.js.map +1 -0
- package/dist/source/sourceValidators.test.d.ts +1 -0
- package/dist/source/sourceValidators.test.js +17 -0
- package/dist/source/sourceValidators.test.js.map +1 -0
- package/dist/types.d.ts +12 -2
- package/dist/validators/codePatternValidator.d.ts +5 -11
- package/dist/validators/codePatternValidator.js +17 -145
- package/dist/validators/codePatternValidator.js.map +1 -1
- package/dist/validators/codeSnippetValidator.d.ts +5 -18
- package/dist/validators/codeSnippetValidator.js +19 -312
- package/dist/validators/codeSnippetValidator.js.map +1 -1
- package/dist/validators/dependencyValidator.d.ts +0 -5
- package/dist/validators/dependencyValidator.js +7 -64
- package/dist/validators/dependencyValidator.js.map +1 -1
- package/dist/validators/versionValidator.d.ts +1 -10
- package/dist/validators/versionValidator.js +7 -157
- package/dist/validators/versionValidator.js.map +1 -1
- package/dist/validators/versionValidator.test.js +1 -101
- package/dist/validators/versionValidator.test.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { SourceIndex } from './sourceIndex.js';
|
|
5
|
+
import { createSourceValidators } from './sourceValidators.js';
|
|
6
|
+
async function withSources(files, run) {
|
|
7
|
+
const rootDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'doc-freshness-source-index-'));
|
|
8
|
+
try {
|
|
9
|
+
for (const [relativePath, content] of Object.entries(files)) {
|
|
10
|
+
const absolutePath = path.join(rootDir, relativePath);
|
|
11
|
+
await fs.promises.mkdir(path.dirname(absolutePath), { recursive: true });
|
|
12
|
+
await fs.promises.writeFile(absolutePath, content, 'utf-8');
|
|
13
|
+
}
|
|
14
|
+
await run(rootDir);
|
|
15
|
+
}
|
|
16
|
+
finally {
|
|
17
|
+
await fs.promises.rm(rootDir, { recursive: true, force: true });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function loadBoth(index, config) {
|
|
21
|
+
const [pattern, snippet] = await Promise.all([index.load(config, 'pattern'), index.load(config, 'snippet')]);
|
|
22
|
+
expect(snippet).toBe(pattern);
|
|
23
|
+
return pattern;
|
|
24
|
+
}
|
|
25
|
+
describe('SourceIndex', () => {
|
|
26
|
+
it('preserves the distinct fallback languages used by pattern and snippet scans', async () => {
|
|
27
|
+
await withSources({
|
|
28
|
+
'src/a.js': 'class JsClass {}',
|
|
29
|
+
'src/a.jsx': 'class JsxClass {}',
|
|
30
|
+
'src/a.mjs': 'class MjsClass {}',
|
|
31
|
+
'src/a.cjs': 'class CjsClass {}',
|
|
32
|
+
'src/a.ts': 'interface TsType {}',
|
|
33
|
+
'src/a.tsx': 'interface TsxType {}',
|
|
34
|
+
'src/a.py': 'class PythonClass:',
|
|
35
|
+
'src/a.go': 'type GoType struct {}',
|
|
36
|
+
'src/a.rs': 'struct RustType {}',
|
|
37
|
+
'src/A.java': 'class JavaType {}',
|
|
38
|
+
}, async (rootDir) => {
|
|
39
|
+
const snapshot = await loadBoth(new SourceIndex(), { rootDir });
|
|
40
|
+
expect(Array.from(snapshot.patternFiles.values()).map((file) => file.language)).toEqual(expect.arrayContaining(['javascript', 'typescript', 'python', 'go', 'rust', 'java']));
|
|
41
|
+
expect(snapshot.patternFiles.size).toBe(10);
|
|
42
|
+
expect(snapshot.snippetFiles.size).toBe(6);
|
|
43
|
+
expect(snapshot.snippetFiles.has('src/a.mjs')).toBe(false);
|
|
44
|
+
expect(snapshot.snippetFiles.has('src/a.rs')).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
it('labels explicitly configured unknown files as javascript in both views', async () => {
|
|
48
|
+
await withSources({ 'src/custom.weird': 'export function odd() {}' }, async (rootDir) => {
|
|
49
|
+
const snapshot = await loadBoth(new SourceIndex(), { rootDir, sourcePatterns: ['**/*.weird'] });
|
|
50
|
+
expect(snapshot.patternFiles.get('src/custom.weird')?.language).toBe('javascript');
|
|
51
|
+
expect(snapshot.snippetFiles.get('src/custom.weird')?.language).toBe('javascript');
|
|
52
|
+
expect(snapshot.symbols.get('odd')).toHaveLength(2);
|
|
53
|
+
expect(snapshot.functionSignatures.get('odd')).toHaveLength(1);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
it("starts only the requested view and performs only that view's reads", async () => {
|
|
57
|
+
await withSources({ 'src/api.ts': 'class TypeScript {}', 'src/api.rs': 'struct Rust {}' }, async (rootDir) => {
|
|
58
|
+
const readFile = vi.spyOn(fs.promises, 'readFile');
|
|
59
|
+
try {
|
|
60
|
+
const pattern = await new SourceIndex().load({ rootDir }, 'pattern');
|
|
61
|
+
expect(pattern.patternFiles.size).toBe(2);
|
|
62
|
+
expect(pattern.snippetFiles.size).toBe(0);
|
|
63
|
+
expect(readFile).toHaveBeenCalledTimes(2);
|
|
64
|
+
readFile.mockClear();
|
|
65
|
+
const snippet = await new SourceIndex().load({ rootDir }, 'snippet');
|
|
66
|
+
expect(snippet.patternFiles.size).toBe(0);
|
|
67
|
+
expect(snippet.snippetFiles.has('src/api.ts')).toBe(true);
|
|
68
|
+
expect(snippet.snippetFiles.has('src/api.rs')).toBe(false);
|
|
69
|
+
expect(readFile).toHaveBeenCalledTimes(1);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
readFile.mockRestore();
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
it('preserves view-specific ignores and does not consume general config excludes', async () => {
|
|
77
|
+
await withSources({
|
|
78
|
+
'src/kept.ts': 'class Kept {}',
|
|
79
|
+
'dist/generated.ts': 'class DistOnly {}',
|
|
80
|
+
'build/generated.ts': 'class BuildOnly {}',
|
|
81
|
+
'src/ignored-by-config.ts': 'class ConfigStillIncluded {}',
|
|
82
|
+
'src/ignored.test.ts': 'class TestIgnored {}',
|
|
83
|
+
'src/ignored.spec.ts': 'class SpecIgnored {}',
|
|
84
|
+
'src/types.d.ts': 'class DeclarationIgnored {}',
|
|
85
|
+
'node_modules/pkg/index.ts': 'class DependencyIgnored {}',
|
|
86
|
+
'vendor/pkg.ts': 'class VendorIgnored {}',
|
|
87
|
+
}, async (rootDir) => {
|
|
88
|
+
const fallback = await loadBoth(new SourceIndex(), { rootDir });
|
|
89
|
+
expect(fallback.patternFiles.has('dist/generated.ts')).toBe(true);
|
|
90
|
+
expect(fallback.patternFiles.has('build/generated.ts')).toBe(true);
|
|
91
|
+
expect(fallback.snippetFiles.has('dist/generated.ts')).toBe(false);
|
|
92
|
+
expect(fallback.snippetFiles.has('build/generated.ts')).toBe(false);
|
|
93
|
+
const broad = await loadBoth(new SourceIndex(), {
|
|
94
|
+
rootDir,
|
|
95
|
+
sourcePatterns: ['**/*'],
|
|
96
|
+
exclude: ['src/ignored-by-config.ts'],
|
|
97
|
+
ignorePatterns: ['src/ignored-by-config.ts'],
|
|
98
|
+
});
|
|
99
|
+
expect(broad.patternFiles.has('src/ignored-by-config.ts')).toBe(true);
|
|
100
|
+
expect(broad.snippetFiles.has('src/ignored-by-config.ts')).toBe(true);
|
|
101
|
+
expect(broad.patternFiles.has('src/ignored.test.ts')).toBe(false);
|
|
102
|
+
expect(broad.patternFiles.has('src/ignored.spec.ts')).toBe(false);
|
|
103
|
+
expect(broad.patternFiles.has('src/types.d.ts')).toBe(false);
|
|
104
|
+
expect(broad.patternFiles.has('node_modules/pkg/index.ts')).toBe(false);
|
|
105
|
+
expect(broad.patternFiles.has('vendor/pkg.ts')).toBe(false);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
it('swallows unreadable matches and invalid patterns without aborting later patterns', async () => {
|
|
109
|
+
await withSources({ 'src/good.ts': 'class Good {}' }, async (rootDir) => {
|
|
110
|
+
const snapshot = await loadBoth(new SourceIndex(), { rootDir, sourcePatterns: ['src', '[', 'src/*.ts'] });
|
|
111
|
+
expect(snapshot.symbols.has('Good')).toBe(true);
|
|
112
|
+
expect(snapshot.patternFiles.has('src')).toBe(false);
|
|
113
|
+
expect(snapshot.snippetFiles.has('src')).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
it('indexes every configured occurrence in order but reads each absolute file once', async () => {
|
|
117
|
+
await withSources({
|
|
118
|
+
'src/a.ts': 'export function Shared() {}',
|
|
119
|
+
'src/b.ts': 'export function Shared() {}',
|
|
120
|
+
}, async (rootDir) => {
|
|
121
|
+
const readFile = vi.spyOn(fs.promises, 'readFile');
|
|
122
|
+
try {
|
|
123
|
+
const snapshot = await loadBoth(new SourceIndex(), {
|
|
124
|
+
rootDir,
|
|
125
|
+
sourcePatterns: ['src/b.ts', 'src/a.ts', 'src/b.ts'],
|
|
126
|
+
});
|
|
127
|
+
expect(snapshot.symbols.get('Shared')?.map(({ filePath }) => filePath)).toEqual([
|
|
128
|
+
'src/b.ts',
|
|
129
|
+
'src/b.ts',
|
|
130
|
+
'src/a.ts',
|
|
131
|
+
'src/a.ts',
|
|
132
|
+
'src/b.ts',
|
|
133
|
+
'src/b.ts',
|
|
134
|
+
]);
|
|
135
|
+
expect(snapshot.functionSignatures.get('Shared')?.map(({ filePath }) => filePath)).toEqual(['src/b.ts', 'src/a.ts', 'src/b.ts']);
|
|
136
|
+
expect(readFile).toHaveBeenCalledTimes(2);
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
readFile.mockRestore();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
it('preserves signature, key, and export extraction quirks', async () => {
|
|
144
|
+
await withSources({
|
|
145
|
+
'src/api.ts': [
|
|
146
|
+
'export function calculate(required: Map<string, number>, optional?: string, ...rest: unknown[]) {}',
|
|
147
|
+
'export const arrow = (first: string, second = "x") => first;',
|
|
148
|
+
'export interface Config {',
|
|
149
|
+
' readonly first?: string;',
|
|
150
|
+
' nested: {',
|
|
151
|
+
' ignored: string;',
|
|
152
|
+
' };',
|
|
153
|
+
'}',
|
|
154
|
+
'export type Config = { second: number };',
|
|
155
|
+
'const Internal = 1;',
|
|
156
|
+
'export { Internal as Public };',
|
|
157
|
+
'export default function Named() {}',
|
|
158
|
+
'module.exports = { common, alias: value };',
|
|
159
|
+
].join('\n'),
|
|
160
|
+
'src/api.py': [
|
|
161
|
+
'def method(self, required, optional=1, *args): pass',
|
|
162
|
+
'def public_fn(): pass',
|
|
163
|
+
'def _private(): pass',
|
|
164
|
+
'Public = 1',
|
|
165
|
+
].join('\n'),
|
|
166
|
+
}, async (rootDir) => {
|
|
167
|
+
const snapshot = await loadBoth(new SourceIndex(), { rootDir, sourcePatterns: ['src/*'] });
|
|
168
|
+
expect(snapshot.symbols.get('calculate')).toHaveLength(2);
|
|
169
|
+
expect(snapshot.functionSignatures.get('calculate')).toEqual([
|
|
170
|
+
{ params: ['required', 'optional', 'rest'], requiredParams: 1, filePath: 'src/api.ts' },
|
|
171
|
+
]);
|
|
172
|
+
expect(snapshot.functionSignatures.get('arrow')).toEqual([
|
|
173
|
+
{ params: ['first', 'second'], requiredParams: 1, filePath: 'src/api.ts' },
|
|
174
|
+
]);
|
|
175
|
+
expect(snapshot.functionSignatures.get('method')).toEqual([
|
|
176
|
+
{ params: ['required', 'optional', 'args'], requiredParams: 1, filePath: 'src/api.py' },
|
|
177
|
+
]);
|
|
178
|
+
expect(snapshot.interfaceKeys.get('Config')).toEqual(new Set(['first', 'nested', 'second']));
|
|
179
|
+
expect(snapshot.exportsByFile.get('src/api.ts')).toEqual(new Set(['calculate', 'arrow', 'Config', 'Named', 'Internal', 'default', 'common', 'alias']));
|
|
180
|
+
expect(snapshot.exportsByFile.get('src/api.ts')?.has('Public')).toBe(false);
|
|
181
|
+
expect(snapshot.exportsByFile.get('src/api.py')).toEqual(new Set(['method', 'public_fn', 'Public']));
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
it('memoizes the in-flight load and lets the first config win', async () => {
|
|
185
|
+
await withSources({ 'a.ts': 'class FirstRoot {}' }, async (firstRoot) => {
|
|
186
|
+
await withSources({ 'b.ts': 'class SecondRoot {}' }, async (secondRoot) => {
|
|
187
|
+
const index = new SourceIndex();
|
|
188
|
+
const first = index.load({ rootDir: firstRoot, sourcePatterns: ['*.ts'] }, 'pattern');
|
|
189
|
+
const second = index.load({ rootDir: secondRoot, sourcePatterns: ['*.ts'] }, 'pattern');
|
|
190
|
+
expect(second).toBe(first);
|
|
191
|
+
const [firstSnapshot, secondSnapshot] = await Promise.all([first, second]);
|
|
192
|
+
expect(secondSnapshot).toBe(firstSnapshot);
|
|
193
|
+
expect(firstSnapshot.symbols.has('FirstRoot')).toBe(true);
|
|
194
|
+
expect(firstSnapshot.symbols.has('SecondRoot')).toBe(false);
|
|
195
|
+
const snippet = await index.load({ rootDir: secondRoot, sourcePatterns: ['*.ts'] }, 'snippet');
|
|
196
|
+
expect(snippet.snippetFiles.has('a.ts')).toBe(true);
|
|
197
|
+
expect(snippet.snippetFiles.has('b.ts')).toBe(false);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
it('keeps successful empty loads sticky and recovers to empty maps after a rejected first load', async () => {
|
|
202
|
+
await withSources({ 'a.ts': 'class Later {}' }, async (rootDir) => {
|
|
203
|
+
const emptyIndex = new SourceIndex();
|
|
204
|
+
const empty = await emptyIndex.load({ rootDir, sourcePatterns: [] }, 'pattern');
|
|
205
|
+
expect(empty.symbols.size).toBe(0);
|
|
206
|
+
expect(await emptyIndex.load({ rootDir, sourcePatterns: ['*.ts'] }, 'pattern')).toBe(empty);
|
|
207
|
+
const rejectedIndex = new SourceIndex();
|
|
208
|
+
const error = new Error('bad config');
|
|
209
|
+
const badConfig = Object.defineProperty({ rootDir }, 'sourcePatterns', {
|
|
210
|
+
get: () => {
|
|
211
|
+
throw error;
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
const rejected = rejectedIndex.load(badConfig, 'pattern');
|
|
215
|
+
const concurrent = rejectedIndex.load({ rootDir, sourcePatterns: ['*.ts'] }, 'pattern');
|
|
216
|
+
expect(concurrent).toBe(rejected);
|
|
217
|
+
await expect(Promise.all([rejected, concurrent])).rejects.toBe(error);
|
|
218
|
+
const recovered = await rejectedIndex.load({ rootDir, sourcePatterns: ['*.ts'] }, 'pattern');
|
|
219
|
+
expect(recovered.patternFiles.size).toBe(0);
|
|
220
|
+
expect(recovered.symbols.size).toBe(0);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
it('leaves validator getters initialized after each view rejects once', async () => {
|
|
224
|
+
await withSources({ 'src/api.ts': 'class Later {}' }, async (rootDir) => {
|
|
225
|
+
const error = new Error('bad config');
|
|
226
|
+
const badConfig = Object.defineProperty({ rootDir }, 'sourcePatterns', {
|
|
227
|
+
get: () => {
|
|
228
|
+
throw error;
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
const goodConfig = { rootDir, sourcePatterns: ['src/*.ts'] };
|
|
232
|
+
const index = new SourceIndex();
|
|
233
|
+
const { pattern, snippet } = createSourceValidators(index);
|
|
234
|
+
await expect(pattern.buildSourceIndex(badConfig)).rejects.toBe(error);
|
|
235
|
+
expect(pattern.getSourceIndex()).toEqual(new Map());
|
|
236
|
+
expect(pattern.getSourceFiles()).toEqual(new Map());
|
|
237
|
+
await expect(pattern.buildSourceIndex(goodConfig)).resolves.toBeUndefined();
|
|
238
|
+
await expect(snippet.validateBatch([], {}, badConfig)).rejects.toBe(error);
|
|
239
|
+
expect(snippet.getFunctionSignatures()).toEqual(new Map());
|
|
240
|
+
expect(snippet.getInterfaceKeys()).toEqual(new Map());
|
|
241
|
+
await expect(snippet.validateBatch([], {}, goodConfig)).resolves.toEqual([]);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
it('keeps validator state null until build and then shares stable snapshot maps', async () => {
|
|
245
|
+
await withSources({ 'src/api.ts': 'export function real() {}\ninterface Config { key: string }' }, async (rootDir) => {
|
|
246
|
+
const index = new SourceIndex();
|
|
247
|
+
const { pattern, snippet } = createSourceValidators(index);
|
|
248
|
+
expect(pattern.getSourceIndex()).toBeNull();
|
|
249
|
+
expect(pattern.getSourceFiles()).toBeNull();
|
|
250
|
+
expect(snippet.getFunctionSignatures()).toBeNull();
|
|
251
|
+
expect(snippet.getInterfaceKeys()).toBeNull();
|
|
252
|
+
const config = { rootDir, sourcePatterns: ['src/*.ts'] };
|
|
253
|
+
await pattern.buildSourceIndex(config);
|
|
254
|
+
await snippet.validateBatch([], {}, config);
|
|
255
|
+
const snapshot = await index.load(config, 'pattern');
|
|
256
|
+
expect(pattern.getSourceIndex()).toBe(snapshot.symbols);
|
|
257
|
+
expect(pattern.getSourceFiles()).toBe(snapshot.patternFiles);
|
|
258
|
+
expect(snippet.getFunctionSignatures()).toBe(snapshot.functionSignatures);
|
|
259
|
+
expect(snippet.getInterfaceKeys()).toBe(snapshot.interfaceKeys);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
//# sourceMappingURL=sourceIndex.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceIndex.test.js","sourceRoot":"","sources":["../../src/source/sourceIndex.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CodePatternValidator } from '../validators/codePatternValidator.js';
|
|
2
|
+
import { CodeSnippetValidator } from '../validators/codeSnippetValidator.js';
|
|
3
|
+
import { SourceIndex } from './sourceIndex.js';
|
|
4
|
+
export declare function createSourceValidators(index: SourceIndex): {
|
|
5
|
+
pattern: CodePatternValidator;
|
|
6
|
+
snippet: CodeSnippetValidator;
|
|
7
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CodePatternValidator } from '../validators/codePatternValidator.js';
|
|
2
|
+
import { CodeSnippetValidator } from '../validators/codeSnippetValidator.js';
|
|
3
|
+
export function createSourceValidators(index) {
|
|
4
|
+
const PatternValidator = CodePatternValidator;
|
|
5
|
+
const SnippetValidator = CodeSnippetValidator;
|
|
6
|
+
return { pattern: new PatternValidator(index), snippet: new SnippetValidator(index) };
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=sourceValidators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceValidators.js","sourceRoot":"","sources":["../../src/source/sourceValidators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAK7E,MAAM,UAAU,sBAAsB,CAAC,KAAkB;IAIvD,MAAM,gBAAgB,GAAG,oBAAmF,CAAC;IAC7G,MAAM,gBAAgB,GAAG,oBAAmF,CAAC;IAC7G,OAAO,EAAE,OAAO,EAAE,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CodePatternValidator } from '../validators/codePatternValidator.js';
|
|
2
|
+
import { CodeSnippetValidator } from '../validators/codeSnippetValidator.js';
|
|
3
|
+
import { SourceIndex } from './sourceIndex.js';
|
|
4
|
+
describe('public validator constructors', () => {
|
|
5
|
+
it('accept only zero arguments in the public type surface', () => {
|
|
6
|
+
expectTypeOf(CodePatternValidator).toBeConstructibleWith();
|
|
7
|
+
expectTypeOf(CodeSnippetValidator).toBeConstructibleWith();
|
|
8
|
+
const internalInjectionIsRejected = () => {
|
|
9
|
+
// @ts-expect-error SourceIndex injection is internal-only.
|
|
10
|
+
new CodePatternValidator(new SourceIndex());
|
|
11
|
+
// @ts-expect-error SourceIndex injection is internal-only.
|
|
12
|
+
new CodeSnippetValidator(new SourceIndex());
|
|
13
|
+
};
|
|
14
|
+
expectTypeOf(internalInjectionIsRejected).toBeFunction();
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=sourceValidators.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceValidators.test.js","sourceRoot":"","sources":["../../src/source/sourceValidators.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,YAAY,CAAC,oBAAoB,CAAC,CAAC,qBAAqB,EAAE,CAAC;QAC3D,YAAY,CAAC,oBAAoB,CAAC,CAAC,qBAAqB,EAAE,CAAC;QAE3D,MAAM,2BAA2B,GAAG,GAAS,EAAE;YAC7C,2DAA2D;YAC3D,IAAI,oBAAoB,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;YAC5C,2DAA2D;YAC3D,IAAI,oBAAoB,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;QAC9C,CAAC,CAAC;QACF,YAAY,CAAC,2BAA2B,CAAC,CAAC,YAAY,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -111,7 +111,7 @@ export interface DocFreshnessConfig {
|
|
|
111
111
|
outputDir?: string;
|
|
112
112
|
outputPath?: string;
|
|
113
113
|
ignorePatterns?: string[];
|
|
114
|
-
customExtractors?:
|
|
114
|
+
customExtractors?: Extractor[];
|
|
115
115
|
customValidators?: Record<string, BaseValidator>;
|
|
116
116
|
graph?: GraphConfig;
|
|
117
117
|
git?: GitConfig;
|
|
@@ -196,6 +196,10 @@ export interface LanguagePattern {
|
|
|
196
196
|
regex: RegExp;
|
|
197
197
|
kind: string;
|
|
198
198
|
}
|
|
199
|
+
export interface Extractor {
|
|
200
|
+
supportsFormat(format: DocumentFormat): boolean;
|
|
201
|
+
extract(document: Document): Reference[];
|
|
202
|
+
}
|
|
199
203
|
export interface BaseExtractor {
|
|
200
204
|
type: string;
|
|
201
205
|
supportedFormats: DocumentFormat[];
|
|
@@ -228,6 +232,11 @@ export interface SourceFileData {
|
|
|
228
232
|
content: string;
|
|
229
233
|
language: string;
|
|
230
234
|
}
|
|
235
|
+
export interface FunctionSignature {
|
|
236
|
+
params: string[];
|
|
237
|
+
requiredParams: number;
|
|
238
|
+
filePath: string;
|
|
239
|
+
}
|
|
231
240
|
export interface CodeFile {
|
|
232
241
|
path: string;
|
|
233
242
|
content: string;
|
|
@@ -309,7 +318,8 @@ export interface IncrementalStats {
|
|
|
309
318
|
skipped: number;
|
|
310
319
|
percentSkipped: number;
|
|
311
320
|
}
|
|
312
|
-
export type
|
|
321
|
+
export type SupportedLanguage = 'javascript' | 'typescript' | 'python' | 'go' | 'rust' | 'java';
|
|
322
|
+
export type SupportedSnippetLanguage = Extract<SupportedLanguage, 'javascript' | 'typescript' | 'python' | 'go'>;
|
|
313
323
|
export interface LanguageConfig {
|
|
314
324
|
extensions: string[];
|
|
315
325
|
patterns: LanguagePattern[];
|
|
@@ -1,22 +1,16 @@
|
|
|
1
|
-
import type { DocFreshnessConfig, Document,
|
|
2
|
-
|
|
3
|
-
* Language-specific source file patterns and code symbol extractors
|
|
4
|
-
*/
|
|
5
|
-
declare const languageConfigs: Record<string, LanguageConfig>;
|
|
1
|
+
import type { DocFreshnessConfig, Document, Reference, SourceFileData, SymbolLocation, ValidationResult } from '../types.js';
|
|
2
|
+
declare const languageConfigs: Record<import("../types.js").SupportedLanguage, import("../types.js").LanguageConfig>;
|
|
6
3
|
/**
|
|
7
4
|
* Validates code patterns exist in source files
|
|
8
5
|
*/
|
|
9
6
|
export declare class CodePatternValidator {
|
|
7
|
+
private readonly index;
|
|
10
8
|
private sourceIndex;
|
|
11
9
|
private sourceFiles;
|
|
12
|
-
private
|
|
13
|
-
private sourceInputsAvailable;
|
|
14
|
-
private capturedInputs;
|
|
10
|
+
private incrementalInputs;
|
|
15
11
|
constructor();
|
|
16
12
|
buildSourceIndex(config: DocFreshnessConfig): Promise<void>;
|
|
17
|
-
private
|
|
18
|
-
private detectLanguage;
|
|
19
|
-
private indexContent;
|
|
13
|
+
private useSnapshot;
|
|
20
14
|
validateBatch(references: Reference[], _document: Document, config: DocFreshnessConfig): Promise<ValidationResult[]>;
|
|
21
15
|
private findSimilarSymbol;
|
|
22
16
|
/**
|
|
@@ -1,175 +1,47 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { glob } from 'glob';
|
|
4
1
|
import { findSimilar } from '../utils/similarity.js';
|
|
5
|
-
|
|
6
|
-
* Language-specific source file patterns and code symbol extractors
|
|
7
|
-
*/
|
|
8
|
-
const languageConfigs = {
|
|
9
|
-
javascript: {
|
|
10
|
-
extensions: ['js', 'jsx', 'mjs', 'cjs'],
|
|
11
|
-
patterns: [
|
|
12
|
-
{ regex: /\bclass\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'class' },
|
|
13
|
-
{ regex: /\bexport\s+(?:async\s+)?function\s+([a-zA-Z][a-zA-Z0-9]+)/g, kind: 'function' },
|
|
14
|
-
{ regex: /\bexport\s+const\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'const' },
|
|
15
|
-
{ regex: /\bfunction\s+([a-zA-Z][a-zA-Z0-9]+)/g, kind: 'function' },
|
|
16
|
-
],
|
|
17
|
-
},
|
|
18
|
-
typescript: {
|
|
19
|
-
extensions: ['ts', 'tsx'],
|
|
20
|
-
patterns: [
|
|
21
|
-
{ regex: /\bclass\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'class' },
|
|
22
|
-
{ regex: /\binterface\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'interface' },
|
|
23
|
-
{ regex: /\btype\s+([A-Z][a-zA-Z0-9]+)\s*=/g, kind: 'type' },
|
|
24
|
-
{ regex: /\bexport\s+(?:async\s+)?function\s+([a-zA-Z][a-zA-Z0-9]+)/g, kind: 'function' },
|
|
25
|
-
{ regex: /\bexport\s+const\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'const' },
|
|
26
|
-
{ regex: /\bfunction\s+([a-zA-Z][a-zA-Z0-9]+)/g, kind: 'function' },
|
|
27
|
-
],
|
|
28
|
-
},
|
|
29
|
-
python: {
|
|
30
|
-
extensions: ['py'],
|
|
31
|
-
patterns: [
|
|
32
|
-
{ regex: /\bclass\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'class' },
|
|
33
|
-
{ regex: /\bdef\s+([a-z_][a-zA-Z0-9_]*)/g, kind: 'function' },
|
|
34
|
-
],
|
|
35
|
-
},
|
|
36
|
-
go: {
|
|
37
|
-
extensions: ['go'],
|
|
38
|
-
patterns: [
|
|
39
|
-
{ regex: /\btype\s+([A-Z][a-zA-Z0-9]+)\s+struct/g, kind: 'struct' },
|
|
40
|
-
{ regex: /\btype\s+([A-Z][a-zA-Z0-9]+)\s+interface/g, kind: 'interface' },
|
|
41
|
-
{ regex: /\bfunc\s+(?:\([^)]+\)\s+)?([A-Z][a-zA-Z0-9]+)/g, kind: 'function' },
|
|
42
|
-
],
|
|
43
|
-
},
|
|
44
|
-
rust: {
|
|
45
|
-
extensions: ['rs'],
|
|
46
|
-
patterns: [
|
|
47
|
-
{ regex: /\bstruct\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'struct' },
|
|
48
|
-
{ regex: /\benum\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'enum' },
|
|
49
|
-
{ regex: /\btrait\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'trait' },
|
|
50
|
-
{ regex: /\bpub\s+fn\s+([a-z_][a-zA-Z0-9_]*)/g, kind: 'function' },
|
|
51
|
-
{ regex: /\bfn\s+([a-z_][a-zA-Z0-9_]*)/g, kind: 'function' },
|
|
52
|
-
],
|
|
53
|
-
},
|
|
54
|
-
java: {
|
|
55
|
-
extensions: ['java'],
|
|
56
|
-
patterns: [
|
|
57
|
-
{ regex: /\bclass\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'class' },
|
|
58
|
-
{ regex: /\binterface\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'interface' },
|
|
59
|
-
{ regex: /\benum\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'enum' },
|
|
60
|
-
],
|
|
61
|
-
},
|
|
62
|
-
};
|
|
2
|
+
import { SourceIndex, languageConfigs as sourceLanguageConfigs } from '../source/sourceIndex.js';
|
|
63
3
|
import { isIllustrativeSymbol } from '../utils/illustrativePatterns.js';
|
|
64
4
|
import { createIllustrativeSkippedResult, getRuleSeverity, severityForIllustrative } from '../utils/validation.js';
|
|
5
|
+
const languageConfigs = sourceLanguageConfigs;
|
|
65
6
|
/**
|
|
66
7
|
* Validates code patterns exist in source files
|
|
67
8
|
*/
|
|
68
9
|
export class CodePatternValidator {
|
|
10
|
+
index;
|
|
69
11
|
/** @internal */
|
|
70
12
|
incrementalCaptureScope = 'project';
|
|
71
13
|
/** @internal */
|
|
72
14
|
incrementalInputsRequiredForGraph = true;
|
|
73
15
|
sourceIndex;
|
|
74
16
|
sourceFiles; // Stores file content for vector search
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
constructor() {
|
|
17
|
+
incrementalInputs;
|
|
18
|
+
constructor(index = new SourceIndex()) {
|
|
19
|
+
this.index = index;
|
|
79
20
|
this.sourceIndex = null;
|
|
80
21
|
this.sourceFiles = null;
|
|
81
|
-
this.
|
|
82
|
-
this.sourceInputsAvailable = false;
|
|
83
|
-
this.capturedInputs = null;
|
|
22
|
+
this.incrementalInputs = null;
|
|
84
23
|
}
|
|
85
24
|
async buildSourceIndex(config) {
|
|
86
25
|
if (this.sourceIndex) {
|
|
87
26
|
return;
|
|
88
27
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
this.sourceInputs = new Map();
|
|
92
|
-
this.sourceInputsAvailable = true;
|
|
93
|
-
// Use configured source patterns or detect automatically
|
|
94
|
-
const sourcePatterns = config.sourcePatterns || this.detectSourcePatterns();
|
|
95
|
-
for (const pattern of sourcePatterns) {
|
|
96
|
-
try {
|
|
97
|
-
const files = await glob(pattern, {
|
|
98
|
-
cwd: config.rootDir,
|
|
99
|
-
absolute: true,
|
|
100
|
-
nodir: true,
|
|
101
|
-
ignore: ['**/*.test.*', '**/*.spec.*', '**/*.d.ts', '**/node_modules/**', '**/vendor/**'],
|
|
102
|
-
});
|
|
103
|
-
for (const file of files) {
|
|
104
|
-
const absolutePath = path.resolve(file);
|
|
105
|
-
if (this.sourceInputs.has(absolutePath)) {
|
|
106
|
-
continue;
|
|
107
|
-
}
|
|
108
|
-
try {
|
|
109
|
-
const content = await fs.promises.readFile(absolutePath, 'utf-8');
|
|
110
|
-
const relativePath = path.relative(config.rootDir || process.cwd(), absolutePath);
|
|
111
|
-
const lang = this.detectLanguage(absolutePath);
|
|
112
|
-
this.indexContent(content, relativePath, lang);
|
|
113
|
-
// Store file content for vector search
|
|
114
|
-
this.sourceFiles.set(relativePath, { content, language: lang });
|
|
115
|
-
this.sourceInputs.set(absolutePath, content);
|
|
116
|
-
}
|
|
117
|
-
catch {
|
|
118
|
-
// Skip unreadable files
|
|
119
|
-
this.sourceInputsAvailable = false;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
// Skip invalid patterns
|
|
125
|
-
this.sourceInputsAvailable = false;
|
|
126
|
-
}
|
|
28
|
+
try {
|
|
29
|
+
this.useSnapshot(await this.index.load(config, 'pattern'));
|
|
127
30
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
detectSourcePatterns() {
|
|
133
|
-
// Auto-detect based on what files exist
|
|
134
|
-
const patterns = [];
|
|
135
|
-
for (const conf of Object.values(languageConfigs)) {
|
|
136
|
-
for (const ext of conf.extensions) {
|
|
137
|
-
patterns.push(`**/*.${ext}`);
|
|
138
|
-
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
this.useSnapshot(await this.index.load(config, 'pattern'));
|
|
33
|
+
throw error;
|
|
139
34
|
}
|
|
140
|
-
return patterns;
|
|
141
35
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return lang;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
return 'javascript';
|
|
36
|
+
useSnapshot(snapshot) {
|
|
37
|
+
this.sourceIndex = snapshot.symbols;
|
|
38
|
+
this.sourceFiles = snapshot.patternFiles;
|
|
39
|
+
this.incrementalInputs = snapshot.patternInputs;
|
|
150
40
|
}
|
|
151
41
|
/** @internal */
|
|
152
42
|
async getIncrementalInputs(_references, _document, config) {
|
|
153
43
|
await this.buildSourceIndex(config);
|
|
154
|
-
return this.
|
|
155
|
-
}
|
|
156
|
-
indexContent(content, filePath, language) {
|
|
157
|
-
const langConfig = languageConfigs[language];
|
|
158
|
-
if (!langConfig) {
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
for (const { regex, kind } of langConfig.patterns) {
|
|
162
|
-
let match;
|
|
163
|
-
// Clone regex to avoid state issues
|
|
164
|
-
const re = new RegExp(regex.source, regex.flags);
|
|
165
|
-
while ((match = re.exec(content)) !== null) {
|
|
166
|
-
const name = match[1];
|
|
167
|
-
if (!this.sourceIndex.has(name)) {
|
|
168
|
-
this.sourceIndex.set(name, []);
|
|
169
|
-
}
|
|
170
|
-
this.sourceIndex.get(name).push({ filePath, kind, language });
|
|
171
|
-
}
|
|
172
|
-
}
|
|
44
|
+
return this.incrementalInputs;
|
|
173
45
|
}
|
|
174
46
|
async validateBatch(references, _document, config) {
|
|
175
47
|
await this.buildSourceIndex(config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codePatternValidator.js","sourceRoot":"","sources":["../../src/validators/codePatternValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"codePatternValidator.js","sourceRoot":"","sources":["../../src/validators/codePatternValidator.ts"],"names":[],"mappings":"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"}
|