doc-freshness-checker 2.0.23 → 2.2.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 (98) hide show
  1. package/README.md +19 -0
  2. package/dist/config/defaults.js +9 -3
  3. package/dist/config/defaults.js.map +1 -1
  4. package/dist/index.d.ts +6 -1
  5. package/dist/index.js +5 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/manifests/manifestInventory.d.ts +28 -0
  8. package/dist/manifests/manifestInventory.js +225 -0
  9. package/dist/manifests/manifestInventory.js.map +1 -0
  10. package/dist/manifests/manifestInventory.test.d.ts +1 -0
  11. package/dist/manifests/manifestInventory.test.js +176 -0
  12. package/dist/manifests/manifestInventory.test.js.map +1 -0
  13. package/dist/manifests/validatorConstructors.test.d.ts +1 -0
  14. package/dist/manifests/validatorConstructors.test.js +17 -0
  15. package/dist/manifests/validatorConstructors.test.js.map +1 -0
  16. package/dist/parsers/documentParser.d.ts +2 -3
  17. package/dist/parsers/documentParser.js.map +1 -1
  18. package/dist/parsers/extractorInterface.test.d.ts +1 -0
  19. package/dist/parsers/extractorInterface.test.js +34 -0
  20. package/dist/parsers/extractorInterface.test.js.map +1 -0
  21. package/dist/parsers/extractors/codeSnippetExtractor.js.map +1 -1
  22. package/dist/plugins/plugin.d.ts +5 -1
  23. package/dist/plugins/plugin.js +5 -1
  24. package/dist/plugins/plugin.js.map +1 -1
  25. package/dist/reporters/consoleReporter.d.ts +5 -11
  26. package/dist/reporters/consoleReporter.js +74 -76
  27. package/dist/reporters/consoleReporter.js.map +1 -1
  28. package/dist/reporters/consoleReporter.test.js +22 -27
  29. package/dist/reporters/consoleReporter.test.js.map +1 -1
  30. package/dist/reporters/enhancedReporter.d.ts +51 -7
  31. package/dist/reporters/enhancedReporter.js +128 -74
  32. package/dist/reporters/enhancedReporter.js.map +1 -1
  33. package/dist/reporters/enhancedReporter.test.js +110 -122
  34. package/dist/reporters/enhancedReporter.test.js.map +1 -1
  35. package/dist/reporters/jsonReporter.d.ts +6 -6
  36. package/dist/reporters/jsonReporter.js +24 -14
  37. package/dist/reporters/jsonReporter.js.map +1 -1
  38. package/dist/reporters/jsonReporter.test.js +26 -11
  39. package/dist/reporters/jsonReporter.test.js.map +1 -1
  40. package/dist/reporters/markdownIssueCells.d.ts +7 -0
  41. package/dist/reporters/markdownIssueCells.js +9 -0
  42. package/dist/reporters/markdownIssueCells.js.map +1 -0
  43. package/dist/reporters/markdownReporter.d.ts +2 -7
  44. package/dist/reporters/markdownReporter.js +57 -56
  45. package/dist/reporters/markdownReporter.js.map +1 -1
  46. package/dist/reporters/markdownReporter.test.js +104 -76
  47. package/dist/reporters/markdownReporter.test.js.map +1 -1
  48. package/dist/reporters/publicReporterApi.test.d.ts +1 -0
  49. package/dist/reporters/publicReporterApi.test.js +28 -0
  50. package/dist/reporters/publicReporterApi.test.js.map +1 -0
  51. package/dist/reporters/reportContext.d.ts +12 -0
  52. package/dist/reporters/reportContext.js +8 -0
  53. package/dist/reporters/reportContext.js.map +1 -0
  54. package/dist/reporters/reportContext.test.d.ts +1 -0
  55. package/dist/reporters/reportContext.test.js +30 -0
  56. package/dist/reporters/reportContext.test.js.map +1 -0
  57. package/dist/reporters/reporters.characterization.test.d.ts +1 -0
  58. package/dist/reporters/reporters.characterization.test.js +208 -0
  59. package/dist/reporters/reporters.characterization.test.js.map +1 -0
  60. package/dist/runner.js +67 -63
  61. package/dist/runner.js.map +1 -1
  62. package/dist/runner.test.js +444 -42
  63. package/dist/runner.test.js.map +1 -1
  64. package/dist/semantic/vectorSearch.js +2 -1
  65. package/dist/semantic/vectorSearch.js.map +1 -1
  66. package/dist/semantic/vectorSearch.test.js +2 -2
  67. package/dist/semantic/vectorSearch.test.js.map +1 -1
  68. package/dist/source/sourceIndex.d.ts +39 -0
  69. package/dist/source/sourceIndex.js +444 -0
  70. package/dist/source/sourceIndex.js.map +1 -0
  71. package/dist/source/sourceIndex.largeGlob.test.d.ts +1 -0
  72. package/dist/source/sourceIndex.largeGlob.test.js +29 -0
  73. package/dist/source/sourceIndex.largeGlob.test.js.map +1 -0
  74. package/dist/source/sourceIndex.test.d.ts +1 -0
  75. package/dist/source/sourceIndex.test.js +263 -0
  76. package/dist/source/sourceIndex.test.js.map +1 -0
  77. package/dist/source/sourceValidators.d.ts +7 -0
  78. package/dist/source/sourceValidators.js +8 -0
  79. package/dist/source/sourceValidators.js.map +1 -0
  80. package/dist/source/sourceValidators.test.d.ts +1 -0
  81. package/dist/source/sourceValidators.test.js +17 -0
  82. package/dist/source/sourceValidators.test.js.map +1 -0
  83. package/dist/types.d.ts +34 -2
  84. package/dist/validators/codePatternValidator.d.ts +5 -11
  85. package/dist/validators/codePatternValidator.js +17 -145
  86. package/dist/validators/codePatternValidator.js.map +1 -1
  87. package/dist/validators/codeSnippetValidator.d.ts +5 -18
  88. package/dist/validators/codeSnippetValidator.js +19 -312
  89. package/dist/validators/codeSnippetValidator.js.map +1 -1
  90. package/dist/validators/dependencyValidator.d.ts +0 -5
  91. package/dist/validators/dependencyValidator.js +7 -64
  92. package/dist/validators/dependencyValidator.js.map +1 -1
  93. package/dist/validators/versionValidator.d.ts +1 -10
  94. package/dist/validators/versionValidator.js +7 -157
  95. package/dist/validators/versionValidator.js.map +1 -1
  96. package/dist/validators/versionValidator.test.js +1 -101
  97. package/dist/validators/versionValidator.test.js.map +1 -1
  98. package/package.json +4 -4
@@ -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
@@ -38,6 +38,7 @@ export interface CodeSnippetRuleConfig extends RuleConfig {
38
38
  skipIllustrative?: boolean;
39
39
  }
40
40
  export interface VersionRuleConfig extends RuleConfig {
41
+ /** @deprecated No validation effect; changes invalidate incremental reuse. Major versions are compared. Planned removal in v3.0.0. */
41
42
  allowMinorDrift?: boolean;
42
43
  }
43
44
  export interface RulesConfig {
@@ -62,9 +63,16 @@ export interface GraphConfig {
62
63
  cacheDir?: string;
63
64
  cacheMaxAge?: number;
64
65
  }
66
+ /**
67
+ * @deprecated Its fields have no Git effect; changes invalidate incremental reuse. Git is auto-detected,
68
+ * and Enhanced reports use a seven-day window. Planned removal in v3.0.0.
69
+ */
65
70
  export interface GitConfig {
71
+ /** @deprecated No Git effect; changes invalidate incremental reuse. Git is auto-detected. Planned removal in v3.0.0. */
66
72
  enabled?: boolean;
73
+ /** @deprecated No Git effect; changes invalidate incremental reuse. Tracking is fixed. Planned removal in v3.0.0. */
67
74
  trackChanges?: boolean;
75
+ /** @deprecated No Git effect; changes invalidate incremental reuse. Enhanced uses seven days. Planned removal in v3.0.0. */
68
76
  changeWindow?: number;
69
77
  }
70
78
  export interface FreshnessScoringWeights {
@@ -87,7 +95,9 @@ export interface FreshnessScoringConfig {
87
95
  export interface VectorSearchConfig {
88
96
  enabled?: boolean;
89
97
  similarityThreshold?: number;
98
+ /** @deprecated No indexing effect; changes invalidate incremental reuse. Comments are always indexed. Planned removal in v3.0.0. */
90
99
  indexCodeComments?: boolean;
100
+ /** @deprecated No indexing effect; changes invalidate incremental reuse. No docstring path exists. Planned removal in v3.0.0. */
91
101
  indexDocstrings?: boolean;
92
102
  }
93
103
  export interface CacheConfig {
@@ -108,12 +118,24 @@ export interface DocFreshnessConfig {
108
118
  urlValidation?: UrlValidationConfig;
109
119
  rules?: RulesConfig;
110
120
  reporters?: ReporterType[];
121
+ /**
122
+ * @deprecated No report-routing effect; changes invalidate incremental reuse. Use outputPath for
123
+ * JSON, Markdown, or Enhanced. Console remains on stdout. Planned removal in v3.0.0.
124
+ */
111
125
  outputDir?: string;
112
126
  outputPath?: string;
127
+ /**
128
+ * @deprecated No filtering effect; changes invalidate incremental reuse. Rule-level
129
+ * illustrativePatterns cover file-path, directory-structure, and code-snippet only. Planned removal in v3.0.0.
130
+ */
113
131
  ignorePatterns?: string[];
114
- customExtractors?: BaseExtractor[];
132
+ customExtractors?: Extractor[];
115
133
  customValidators?: Record<string, BaseValidator>;
116
134
  graph?: GraphConfig;
135
+ /**
136
+ * @deprecated No Git effect; changes invalidate incremental reuse. Git is auto-detected, and
137
+ * Enhanced reports use a seven-day window. Planned removal in v3.0.0.
138
+ */
117
139
  git?: GitConfig;
118
140
  freshnessScoring?: FreshnessScoringConfig;
119
141
  vectorSearch?: VectorSearchConfig;
@@ -196,6 +218,10 @@ export interface LanguagePattern {
196
218
  regex: RegExp;
197
219
  kind: string;
198
220
  }
221
+ export interface Extractor {
222
+ supportsFormat(format: DocumentFormat): boolean;
223
+ extract(document: Document): Reference[];
224
+ }
199
225
  export interface BaseExtractor {
200
226
  type: string;
201
227
  supportedFormats: DocumentFormat[];
@@ -228,6 +254,11 @@ export interface SourceFileData {
228
254
  content: string;
229
255
  language: string;
230
256
  }
257
+ export interface FunctionSignature {
258
+ params: string[];
259
+ requiredParams: number;
260
+ filePath: string;
261
+ }
231
262
  export interface CodeFile {
232
263
  path: string;
233
264
  content: string;
@@ -309,7 +340,8 @@ export interface IncrementalStats {
309
340
  skipped: number;
310
341
  percentSkipped: number;
311
342
  }
312
- export type ManifestParser = (filePath: string) => Promise<Map<string, string>>;
343
+ export type SupportedLanguage = 'javascript' | 'typescript' | 'python' | 'go' | 'rust' | 'java';
344
+ export type SupportedSnippetLanguage = Extract<SupportedLanguage, 'javascript' | 'typescript' | 'python' | 'go'>;
313
345
  export interface LanguageConfig {
314
346
  extensions: string[];
315
347
  patterns: LanguagePattern[];
@@ -1,22 +1,16 @@
1
- import type { DocFreshnessConfig, Document, LanguageConfig, Reference, SourceFileData, SymbolLocation, ValidationResult } from '../types.js';
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 sourceInputs;
13
- private sourceInputsAvailable;
14
- private capturedInputs;
10
+ private incrementalInputs;
15
11
  constructor();
16
12
  buildSourceIndex(config: DocFreshnessConfig): Promise<void>;
17
- private detectSourcePatterns;
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
  /**