doc-freshness-checker 2.0.6 → 2.0.7

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 (45) hide show
  1. package/README.md +2 -0
  2. package/dist/runner.js +35 -16
  3. package/dist/runner.js.map +1 -1
  4. package/dist/runner.test.js +433 -1
  5. package/dist/runner.test.js.map +1 -1
  6. package/dist/utils/incremental.d.ts +14 -18
  7. package/dist/utils/incremental.js +281 -39
  8. package/dist/utils/incremental.js.map +1 -1
  9. package/dist/utils/incremental.test.js +385 -74
  10. package/dist/utils/incremental.test.js.map +1 -1
  11. package/dist/utils/manifestPaths.d.ts +2 -0
  12. package/dist/utils/manifestPaths.js +6 -0
  13. package/dist/utils/manifestPaths.js.map +1 -0
  14. package/dist/validators/codePatternValidator.d.ts +3 -0
  15. package/dist/validators/codePatternValidator.js +31 -3
  16. package/dist/validators/codePatternValidator.js.map +1 -1
  17. package/dist/validators/codePatternValidator.test.js +64 -0
  18. package/dist/validators/codePatternValidator.test.js.map +1 -1
  19. package/dist/validators/dependencyValidator.js +9 -6
  20. package/dist/validators/dependencyValidator.js.map +1 -1
  21. package/dist/validators/dependencyValidator.test.js +6 -0
  22. package/dist/validators/dependencyValidator.test.js.map +1 -1
  23. package/dist/validators/directoryValidator.d.ts +1 -0
  24. package/dist/validators/directoryValidator.js +17 -4
  25. package/dist/validators/directoryValidator.js.map +1 -1
  26. package/dist/validators/directoryValidator.test.js +7 -0
  27. package/dist/validators/directoryValidator.test.js.map +1 -1
  28. package/dist/validators/fileValidator.d.ts +1 -0
  29. package/dist/validators/fileValidator.js +16 -14
  30. package/dist/validators/fileValidator.js.map +1 -1
  31. package/dist/validators/fileValidator.test.js +5 -0
  32. package/dist/validators/fileValidator.test.js.map +1 -1
  33. package/dist/validators/incrementalInputs.d.ts +1 -0
  34. package/dist/validators/incrementalInputs.js +6 -0
  35. package/dist/validators/incrementalInputs.js.map +1 -0
  36. package/dist/validators/validationEngine.d.ts +2 -0
  37. package/dist/validators/validationEngine.js +89 -0
  38. package/dist/validators/validationEngine.js.map +1 -1
  39. package/dist/validators/validationEngine.test.js +93 -1
  40. package/dist/validators/validationEngine.test.js.map +1 -1
  41. package/dist/validators/versionValidator.js +9 -6
  42. package/dist/validators/versionValidator.js.map +1 -1
  43. package/dist/validators/versionValidator.test.js +6 -0
  44. package/dist/validators/versionValidator.test.js.map +1 -1
  45. package/package.json +1 -1
@@ -1,84 +1,395 @@
1
1
  import fs from 'fs';
2
- import crypto from 'crypto';
3
- import { IncrementalChecker } from './incremental.js';
4
- function makeDoc(docPath) {
5
- return {
6
- path: docPath,
7
- absolutePath: `/project/${docPath}`,
8
- content: 'content',
9
- format: 'markdown',
10
- lines: ['content'],
11
- references: [],
12
- };
13
- }
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import { IncrementalChecker } from '../index.js';
14
5
  describe('IncrementalChecker', () => {
15
- let checker;
16
- beforeEach(() => {
17
- checker = new IncrementalChecker('/tmp/test-cache');
18
- });
19
- describe('getStats', () => {
20
- it.each([
21
- { total: 10, changed: 3, skipped: 7, pct: 70 },
22
- { total: 0, changed: 0, skipped: 0, pct: 0 },
23
- { total: 5, changed: 5, skipped: 0, pct: 0 },
24
- ])('computes stats for total=$total changed=$changed', ({ total, changed, skipped, pct }) => {
25
- const stats = checker.getStats(total, changed);
26
- expect(stats).toEqual({ total, changed, skipped, percentSkipped: pct });
27
- });
6
+ let rootDir;
7
+ let stateDir;
8
+ let docPath;
9
+ let document;
10
+ let config;
11
+ beforeEach(async () => {
12
+ rootDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'incremental-'));
13
+ stateDir = path.join(rootDir, '.cache');
14
+ docPath = path.join(rootDir, 'guide.md');
15
+ await fs.promises.writeFile(docPath, 'content');
16
+ document = {
17
+ path: 'guide.md',
18
+ absolutePath: docPath,
19
+ content: 'content',
20
+ format: 'markdown',
21
+ lines: ['content'],
22
+ references: [],
23
+ };
24
+ config = { rootDir, sourcePatterns: [], manifestFiles: [] };
28
25
  });
29
- describe('loadState', () => {
30
- it('loads previous hashes from disk', async () => {
31
- vi.spyOn(fs.promises, 'readFile').mockResolvedValue(JSON.stringify({ 'file.md': 'abc123' }));
32
- await checker.loadState();
33
- });
34
- it('handles missing state file gracefully', async () => {
35
- vi.spyOn(fs.promises, 'readFile').mockRejectedValue(new Error('ENOENT'));
36
- await expect(checker.loadState()).resolves.not.toThrow();
37
- });
26
+ const saveCleanBaseline = async (documents = [document], currentConfig = config, currentStateDir = stateDir, incrementalInputs = []) => {
27
+ const checker = new IncrementalChecker(currentStateDir);
28
+ await checker.filterChanged(documents, currentConfig, incrementalInputs);
29
+ await checker.saveState(true);
30
+ };
31
+ const filterWithCapturedInputs = (checker, documents = [document], currentConfig = config, incrementalInputs = []) => checker.filterChanged(documents, currentConfig, incrementalInputs);
32
+ afterEach(async () => {
33
+ await fs.promises.rm(rootDir, { recursive: true, force: true });
38
34
  });
39
- describe('saveState', () => {
40
- it('writes current hashes to disk', async () => {
41
- const mkdirSpy = vi.spyOn(fs.promises, 'mkdir').mockResolvedValue(undefined);
42
- const writeSpy = vi.spyOn(fs.promises, 'writeFile').mockResolvedValue(undefined);
43
- await checker.saveState();
44
- expect(mkdirSpy).toHaveBeenCalledWith('/tmp/test-cache', { recursive: true });
45
- expect(writeSpy).toHaveBeenCalled();
35
+ it.each([
36
+ { total: 10, changed: 3, skipped: 7, pct: 70 },
37
+ { total: 0, changed: 0, skipped: 0, pct: 0 },
38
+ { total: 5, changed: 5, skipped: 0, pct: 0 },
39
+ ])('computes stats for total=$total changed=$changed', ({ total, changed, skipped, pct }) => {
40
+ expect(new IncrementalChecker(stateDir).getStats(total, changed)).toEqual({
41
+ total,
42
+ changed,
43
+ skipped,
44
+ percentSkipped: pct,
46
45
  });
47
46
  });
48
- describe('shouldCheck', () => {
49
- it('returns true for new files not in previous state', async () => {
50
- vi.spyOn(fs.promises, 'readFile').mockResolvedValueOnce(JSON.stringify({})).mockResolvedValueOnce('file content');
51
- await checker.loadState();
52
- expect(await checker.shouldCheck('/project/new.md')).toBe(true);
53
- });
54
- it('returns false for unchanged files', async () => {
55
- const content = 'file content';
56
- const expectedHash = crypto.createHash('md5').update(content).digest('hex');
57
- vi.spyOn(fs.promises, 'readFile')
58
- .mockResolvedValueOnce(JSON.stringify({ '/project/same.md': expectedHash }))
59
- .mockResolvedValueOnce(content);
60
- await checker.loadState();
61
- expect(await checker.shouldCheck('/project/same.md')).toBe(false);
62
- });
63
- it('returns true when file read fails', async () => {
64
- vi.spyOn(fs.promises, 'readFile').mockResolvedValueOnce(JSON.stringify({})).mockRejectedValueOnce(new Error('read error'));
65
- await checker.loadState();
66
- expect(await checker.shouldCheck('/project/broken.md')).toBe(true);
67
- });
47
+ it('skips an unchanged document after a clean compatible run', async () => {
48
+ const first = new IncrementalChecker(stateDir);
49
+ expect(await filterWithCapturedInputs(first)).toEqual([document]);
50
+ await first.saveState(true);
51
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir))).toEqual([]);
68
52
  });
69
- describe('filterChanged', () => {
70
- it('returns only documents whose content has changed', async () => {
71
- const content = 'unchanged';
72
- const hash = crypto.createHash('md5').update(content).digest('hex');
73
- vi.spyOn(fs.promises, 'readFile')
74
- .mockResolvedValueOnce(JSON.stringify({ '/project/unchanged.md': hash }))
75
- .mockResolvedValueOnce(content)
76
- .mockResolvedValueOnce('new content');
77
- const docs = [makeDoc('unchanged.md'), makeDoc('changed.md')];
78
- const changed = await checker.filterChanged(docs);
79
- expect(changed).toHaveLength(1);
80
- expect(changed[0].path).toBe('changed.md');
81
- });
53
+ it('full-validates configured calls when captured inputs are omitted', async () => {
54
+ await saveCleanBaseline();
55
+ expect(await new IncrementalChecker(stateDir).filterChanged([document], config)).toEqual([document]);
56
+ });
57
+ it('retains public no-config calls but always full-validates', async () => {
58
+ const first = new IncrementalChecker(stateDir);
59
+ expect(await first.filterChanged([document])).toEqual([document]);
60
+ await first.saveState();
61
+ expect(await new IncrementalChecker(stateDir).filterChanged([document])).toEqual([document]);
62
+ });
63
+ it('treats legacy flat hash JSON as incompatible state', async () => {
64
+ await fs.promises.mkdir(stateDir);
65
+ const hash = await new IncrementalChecker(stateDir).getHash(docPath);
66
+ await fs.promises.writeFile(path.join(stateDir, 'file-hashes.json'), JSON.stringify({ [docPath]: hash }));
67
+ expect(await new IncrementalChecker(stateDir).filterChanged([document])).toEqual([document]);
68
+ expect(await new IncrementalChecker(stateDir).filterChanged([document], config)).toEqual([document]);
69
+ });
70
+ it('rejects a state with an unexpected version while preserving other fields', async () => {
71
+ await saveCleanBaseline();
72
+ const statePath = path.join(stateDir, 'file-hashes.json');
73
+ const state = JSON.parse(await fs.promises.readFile(statePath, 'utf-8'));
74
+ state.version = 1;
75
+ await fs.promises.writeFile(statePath, JSON.stringify(state));
76
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config)).toEqual([document]);
77
+ });
78
+ it.each([
79
+ { field: 'documentHashes', value: null, message: 'saved document hashes are invalid' },
80
+ { field: 'documentHashes', value: [], message: 'saved document hashes are invalid' },
81
+ { field: 'clean', value: 'true', message: 'saved clean status is invalid' },
82
+ { field: 'configFingerprint', value: 42, message: 'saved config fingerprint is invalid' },
83
+ { field: 'inputFingerprint', value: false, message: 'saved input fingerprint is invalid' },
84
+ ])('rejects invalid $field state fields', async ({ field, value, message }) => {
85
+ await saveCleanBaseline();
86
+ const statePath = path.join(stateDir, 'file-hashes.json');
87
+ const state = JSON.parse(await fs.promises.readFile(statePath, 'utf-8'));
88
+ state[field] = value;
89
+ await fs.promises.writeFile(statePath, JSON.stringify(state));
90
+ const log = vi.spyOn(console, 'log').mockImplementation(() => undefined);
91
+ try {
92
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], { ...config, verbose: true })).toEqual([
93
+ document,
94
+ ]);
95
+ expect(log).toHaveBeenCalledWith(`Incremental full validation: ${message}.`);
96
+ }
97
+ finally {
98
+ log.mockRestore();
99
+ }
100
+ });
101
+ it('keeps exported shouldCheck fail-closed for legacy state and source renames', async () => {
102
+ const sourcePath = path.join(rootDir, 'source.ts');
103
+ const renamedPath = path.join(rootDir, 'renamed.ts');
104
+ await fs.promises.writeFile(sourcePath, 'export const source = true;');
105
+ await fs.promises.mkdir(stateDir);
106
+ const sourceHash = await new IncrementalChecker(stateDir).getHash(sourcePath);
107
+ await fs.promises.writeFile(path.join(stateDir, 'file-hashes.json'), JSON.stringify({ [sourcePath]: sourceHash }));
108
+ const checker = new IncrementalChecker(stateDir);
109
+ await checker.loadState();
110
+ expect(await checker.shouldCheck(sourcePath)).toBe(true);
111
+ await fs.promises.rename(sourcePath, renamedPath);
112
+ expect(await checker.shouldCheck(sourcePath)).toBe(true);
113
+ expect(await checker.shouldCheck(renamedPath)).toBe(true);
114
+ await checker.saveState();
115
+ const savedState = JSON.parse(await fs.promises.readFile(path.join(stateDir, 'file-hashes.json'), 'utf-8'));
116
+ expect(savedState.documentHashes[renamedPath]).toBeTypeOf('string');
117
+ });
118
+ it('full-validates after a captured source file is renamed', async () => {
119
+ const sourcePath = path.join(rootDir, 'source.ts');
120
+ const renamedPath = path.join(rootDir, 'renamed.ts');
121
+ await fs.promises.writeFile(sourcePath, 'export const source = true;');
122
+ const initialInputs = [{ path: sourcePath, content: 'export const source = true;' }];
123
+ await saveCleanBaseline([document], config, stateDir, initialInputs);
124
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, initialInputs)).toEqual([]);
125
+ await fs.promises.rename(sourcePath, renamedPath);
126
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, [
127
+ { path: renamedPath, content: 'export const source = true;' },
128
+ ])).toEqual([document]);
129
+ });
130
+ it('full-validates after a run with findings', async () => {
131
+ const first = new IncrementalChecker(stateDir);
132
+ await first.filterChanged([document], config);
133
+ await first.saveState(false);
134
+ expect(await new IncrementalChecker(stateDir).filterChanged([document], config)).toEqual([document]);
135
+ });
136
+ it.each(['missing', 'corrupt'])('full-validates with %s state', async (stateKind) => {
137
+ if (stateKind === 'corrupt') {
138
+ await fs.promises.mkdir(stateDir, { recursive: true });
139
+ await fs.promises.writeFile(path.join(stateDir, 'file-hashes.json'), '{');
140
+ }
141
+ expect(await new IncrementalChecker(stateDir).filterChanged([document], config)).toEqual([document]);
142
+ });
143
+ it('full-validates when effective config changes', async () => {
144
+ await saveCleanBaseline();
145
+ const changedConfig = { ...config, rules: { 'file-path': { enabled: false } } };
146
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], changedConfig)).toEqual([document]);
147
+ });
148
+ it('full-validates when any project file changes, including dist and build', async () => {
149
+ const sourceDir = path.join(rootDir, 'src');
150
+ const sourcePath = path.join(sourceDir, 'server.ts');
151
+ const manifestPath = path.join(rootDir, 'package.json');
152
+ const distDir = path.join(rootDir, 'dist');
153
+ const distPath = path.join(distDir, 'generated.js');
154
+ const emptyBuildDir = path.join(rootDir, 'build', 'empty');
155
+ await fs.promises.mkdir(sourceDir);
156
+ await fs.promises.mkdir(distDir);
157
+ await fs.promises.mkdir(emptyBuildDir, { recursive: true });
158
+ await fs.promises.writeFile(sourcePath, 'export const server = true;');
159
+ await fs.promises.writeFile(manifestPath, '{}');
160
+ await fs.promises.writeFile(distPath, 'generated');
161
+ config = { ...config, sourcePatterns: ['src/**/*.ts'], manifestFiles: ['package.json'] };
162
+ await saveCleanBaseline();
163
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir))).toEqual([]);
164
+ await fs.promises.rm(distPath);
165
+ const afterDistChange = new IncrementalChecker(stateDir);
166
+ expect(await filterWithCapturedInputs(afterDistChange)).toEqual([document]);
167
+ await afterDistChange.saveState(true);
168
+ const newEmptyDir = path.join(emptyBuildDir, 'new-empty');
169
+ await fs.promises.mkdir(newEmptyDir);
170
+ const afterDirectoryCreation = new IncrementalChecker(stateDir);
171
+ expect(await filterWithCapturedInputs(afterDirectoryCreation)).toEqual([document]);
172
+ await afterDirectoryCreation.saveState(true);
173
+ await fs.promises.rmdir(newEmptyDir);
174
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir))).toEqual([document]);
175
+ });
176
+ it('fingerprints explicit references inside node_modules', async () => {
177
+ const dependencyDir = path.join(rootDir, 'node_modules', 'pkg');
178
+ const dependencyPath = path.join(dependencyDir, 'runtime.js');
179
+ await fs.promises.mkdir(dependencyDir, { recursive: true });
180
+ await fs.promises.writeFile(dependencyPath, 'export const runtime = true;');
181
+ document.references = [{ type: 'file-path', value: 'node_modules/pkg/runtime.js', lineNumber: 1, raw: '', sourceFile: document.path }];
182
+ const inputs = [{ path: dependencyPath }];
183
+ await saveCleanBaseline([document], config, stateDir, inputs);
184
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, inputs)).toEqual([]);
185
+ await fs.promises.rm(dependencyPath);
186
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, inputs)).toEqual([document]);
187
+ });
188
+ it('fingerprints configured manifests inside excluded directories', async () => {
189
+ const manifestDir = path.join(rootDir, 'node_modules', 'pkg');
190
+ const manifestPath = path.join(manifestDir, 'package.json');
191
+ await fs.promises.mkdir(manifestDir, { recursive: true });
192
+ await fs.promises.writeFile(manifestPath, '{}');
193
+ config = { ...config, manifestFiles: ['node_modules/pkg/package.json'] };
194
+ const inputs = [{ path: manifestPath }];
195
+ await saveCleanBaseline([document], config, stateDir, inputs);
196
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, inputs)).toEqual([]);
197
+ await fs.promises.writeFile(manifestPath, '{"dependencies":{"pkg":"1.0.0"}}');
198
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, inputs)).toEqual([document]);
199
+ });
200
+ it('fingerprints provided source inputs excluded from the generic inventory', async () => {
201
+ const sourceDir = path.join(rootDir, '.git');
202
+ const sourcePath = path.join(sourceDir, 'source.ts');
203
+ await fs.promises.mkdir(sourceDir);
204
+ await fs.promises.writeFile(sourcePath, 'export const source = true;');
205
+ const initialInputs = [{ path: sourcePath, content: 'export const source = true;' }];
206
+ await saveCleanBaseline([document], config, stateDir, initialInputs);
207
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, initialInputs)).toEqual([]);
208
+ await fs.promises.writeFile(sourcePath, 'export const source = false;');
209
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, [
210
+ { path: sourcePath, content: 'export const source = false;' },
211
+ ])).toEqual([document]);
212
+ });
213
+ it.each(['.git', 'node_modules'])('excludes generic inventory entries under %s', async (excludedDirectory) => {
214
+ const excludedPath = path.join(rootDir, excludedDirectory, 'generated.ts');
215
+ await fs.promises.mkdir(path.dirname(excludedPath), { recursive: true });
216
+ await fs.promises.writeFile(excludedPath, 'export const generated = true;');
217
+ await saveCleanBaseline();
218
+ await fs.promises.writeFile(excludedPath, 'export const generated = false;');
219
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config)).toEqual([]);
220
+ });
221
+ it('full-validates when a provided source input is outside the project', async () => {
222
+ const outsideDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'incremental-outside-'));
223
+ try {
224
+ const outsidePath = path.join(outsideDir, 'source.ts');
225
+ await fs.promises.writeFile(outsidePath, 'export const source = true;');
226
+ const inputs = [{ path: outsidePath, content: 'export const source = true;' }];
227
+ await saveCleanBaseline([document], config, stateDir, inputs);
228
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, inputs)).toEqual([document]);
229
+ }
230
+ finally {
231
+ await fs.promises.rm(outsideDir, { recursive: true, force: true });
232
+ }
233
+ });
234
+ it('full-validates when captured inputs are unavailable', async () => {
235
+ await saveCleanBaseline([document], config, stateDir, null);
236
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, null)).toEqual([document]);
237
+ });
238
+ it('explains verbose full-validation fallbacks', async () => {
239
+ const log = vi.spyOn(console, 'log').mockImplementation(() => undefined);
240
+ try {
241
+ await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], { ...config, verbose: true }, null);
242
+ expect(log).toHaveBeenCalledWith('Incremental full validation: no saved state exists.');
243
+ expect(log).toHaveBeenCalledWith('Incremental full validation: validation inputs could not be captured.');
244
+ }
245
+ finally {
246
+ log.mockRestore();
247
+ }
248
+ });
249
+ it.each([
250
+ ['configFingerprint', 'Incremental full validation: the saved config fingerprint is unavailable.'],
251
+ ['inputFingerprint', 'Incremental full validation: the saved input fingerprint is unavailable.'],
252
+ ])('reports an unavailable saved %s without claiming a change', async (field, message) => {
253
+ const log = vi.spyOn(console, 'log').mockImplementation(() => undefined);
254
+ try {
255
+ const verboseConfig = { ...config, verbose: true };
256
+ await saveCleanBaseline([document], verboseConfig);
257
+ const statePath = path.join(stateDir, 'file-hashes.json');
258
+ const state = JSON.parse(await fs.promises.readFile(statePath, 'utf-8'));
259
+ state[field] = null;
260
+ await fs.promises.writeFile(statePath, JSON.stringify(state));
261
+ log.mockClear();
262
+ await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], verboseConfig);
263
+ expect(log).toHaveBeenCalledWith(message);
264
+ expect(log).not.toHaveBeenCalledWith('Incremental full validation: configuration changed.');
265
+ expect(log).not.toHaveBeenCalledWith('Incremental full validation: validation inputs changed.');
266
+ }
267
+ finally {
268
+ log.mockRestore();
269
+ }
270
+ });
271
+ it('does not duplicate the custom extractor diagnostic', async () => {
272
+ const log = vi.spyOn(console, 'log').mockImplementation(() => undefined);
273
+ try {
274
+ await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], {
275
+ ...config,
276
+ verbose: true,
277
+ customExtractors: [{}],
278
+ }, []);
279
+ expect(log.mock.calls.flat()).toEqual(expect.arrayContaining(['Incremental full validation: custom extractors cannot be fingerprinted.']));
280
+ expect(log.mock.calls.flat().filter((entry) => entry === 'Incremental full validation: custom extractors cannot be fingerprinted.')).toHaveLength(1);
281
+ }
282
+ finally {
283
+ log.mockRestore();
284
+ }
285
+ });
286
+ it('fingerprints source matches inside cache.dir', async () => {
287
+ const sourcePath = path.join(stateDir, 'source.ts');
288
+ await fs.promises.mkdir(stateDir);
289
+ await fs.promises.writeFile(sourcePath, 'export const source = true;');
290
+ const initialInputs = [{ path: sourcePath, content: 'export const source = true;' }];
291
+ await saveCleanBaseline([document], config, stateDir, initialInputs);
292
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, initialInputs)).toEqual([]);
293
+ await fs.promises.writeFile(sourcePath, 'export const source = false;');
294
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, [
295
+ { path: sourcePath, content: 'export const source = false;' },
296
+ ])).toEqual([document]);
297
+ });
298
+ it('fingerprints source matches through a symlinked cache directory', async () => {
299
+ const realStateDir = path.join(rootDir, '.real-cache');
300
+ const sourcePath = path.join(realStateDir, 'source.ts');
301
+ await fs.promises.mkdir(realStateDir);
302
+ await fs.promises.writeFile(sourcePath, 'export const source = true;');
303
+ await fs.promises.symlink('.real-cache', stateDir, 'dir');
304
+ const sourceInputPath = path.join(stateDir, 'source.ts');
305
+ const initialInputs = [{ path: sourceInputPath, content: 'export const source = true;' }];
306
+ await saveCleanBaseline([document], config, stateDir, initialInputs);
307
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, initialInputs)).toEqual([]);
308
+ await fs.promises.writeFile(sourcePath, 'export const source = false;');
309
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, [
310
+ { path: sourceInputPath, content: 'export const source = false;' },
311
+ ])).toEqual([document]);
312
+ });
313
+ it('fingerprints source matches inside graph.cacheDir', async () => {
314
+ const graphStateDir = path.join(rootDir, '.graph-cache');
315
+ const sourcePath = path.join(graphStateDir, 'source.ts');
316
+ await fs.promises.mkdir(graphStateDir);
317
+ await fs.promises.writeFile(sourcePath, 'export const source = true;');
318
+ config = {
319
+ ...config,
320
+ graph: { cacheDir: '.graph-cache' },
321
+ sourcePatterns: ['.graph-cache/**/*.ts'],
322
+ };
323
+ const initialInputs = [{ path: sourcePath, content: 'export const source = true;' }];
324
+ await saveCleanBaseline([document], config, graphStateDir, initialInputs);
325
+ expect(await filterWithCapturedInputs(new IncrementalChecker(graphStateDir), [document], config, initialInputs)).toEqual([]);
326
+ await fs.promises.writeFile(sourcePath, 'export const source = false;');
327
+ expect(await filterWithCapturedInputs(new IncrementalChecker(graphStateDir), [document], config, [
328
+ { path: sourcePath, content: 'export const source = false;' },
329
+ ])).toEqual([document]);
330
+ });
331
+ it('fingerprints explicit symlink target content', async () => {
332
+ const dependencyDir = path.join(rootDir, 'node_modules', 'pkg');
333
+ const targetPath = path.join(dependencyDir, 'target.js');
334
+ const linkPath = path.join(dependencyDir, 'runtime.js');
335
+ await fs.promises.mkdir(dependencyDir, { recursive: true });
336
+ await fs.promises.writeFile(targetPath, 'export const runtime = true;');
337
+ await fs.promises.symlink('target.js', linkPath);
338
+ document.references = [{ type: 'file-path', value: 'node_modules/pkg/runtime.js', lineNumber: 1, raw: '', sourceFile: document.path }];
339
+ const inputs = [{ path: linkPath }];
340
+ await saveCleanBaseline([document], config, stateDir, inputs);
341
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, inputs)).toEqual([]);
342
+ await fs.promises.writeFile(targetPath, 'export const runtime = false;');
343
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, inputs)).toEqual([document]);
344
+ });
345
+ it('fingerprints directory symlink content under node_modules', async () => {
346
+ const dependencyDir = path.join(rootDir, 'node_modules', 'pkg');
347
+ const targetPath = path.join(dependencyDir, 'source.ts');
348
+ await fs.promises.mkdir(dependencyDir, { recursive: true });
349
+ await fs.promises.writeFile(targetPath, 'export const source = true;');
350
+ await fs.promises.symlink('node_modules/pkg', path.join(rootDir, 'linked'), 'dir');
351
+ await saveCleanBaseline();
352
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir))).toEqual([]);
353
+ await fs.promises.writeFile(targetPath, 'export const source = false;');
354
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir))).toEqual([document]);
355
+ });
356
+ it('keeps captured-input and directory fingerprints deterministic across ordering', async () => {
357
+ const firstInputPath = path.join(rootDir, 'first.ts');
358
+ const secondInputPath = path.join(rootDir, 'second.ts');
359
+ await fs.promises.writeFile(firstInputPath, 'export const first = true;');
360
+ await fs.promises.writeFile(secondInputPath, 'export const second = true;');
361
+ const inputs = [
362
+ { path: firstInputPath, content: 'export const first = true;' },
363
+ { path: secondInputPath, content: 'export const second = true;' },
364
+ ];
365
+ await saveCleanBaseline([document], config, stateDir, inputs);
366
+ const rootEntries = await fs.promises.readdir(rootDir, { withFileTypes: true });
367
+ const readdir = vi.spyOn(fs.promises, 'readdir').mockResolvedValueOnce([...rootEntries].reverse());
368
+ try {
369
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document], config, [...inputs].reverse())).toEqual([]);
370
+ }
371
+ finally {
372
+ readdir.mockRestore();
373
+ }
374
+ });
375
+ it('full-validates all docs when a document also changes the project inventory', async () => {
376
+ const secondPath = path.join(rootDir, 'second.md');
377
+ await fs.promises.writeFile(secondPath, 'second');
378
+ const second = { ...document, path: 'second.md', absolutePath: secondPath, content: 'second', lines: ['second'] };
379
+ await saveCleanBaseline([document, second]);
380
+ await fs.promises.writeFile(docPath, 'changed');
381
+ document = { ...document, content: 'changed', lines: ['changed'] };
382
+ expect(await filterWithCapturedInputs(new IncrementalChecker(stateDir), [document, second])).toEqual([document, second]);
383
+ });
384
+ it('persists a versioned state for completed runs', async () => {
385
+ const checker = new IncrementalChecker(stateDir);
386
+ await filterWithCapturedInputs(checker);
387
+ await checker.saveState(false);
388
+ const state = JSON.parse(await fs.promises.readFile(path.join(stateDir, 'file-hashes.json'), 'utf-8'));
389
+ expect(state).toMatchObject({ version: 2, clean: false });
390
+ expect(state.documentHashes[docPath]).toBeTypeOf('string');
391
+ expect(state.configFingerprint).toBeTypeOf('string');
392
+ expect(state.inputFingerprint).toBeTypeOf('string');
82
393
  });
83
394
  });
84
395
  //# sourceMappingURL=incremental.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"incremental.test.js","sourceRoot":"","sources":["../../src/utils/incremental.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"incremental.test.js","sourceRoot":"","sources":["../../src/utils/incremental.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { DocFreshnessConfig } from '../types.js';
2
+ export declare function resolveManifestPaths(config: DocFreshnessConfig): string[];
@@ -0,0 +1,6 @@
1
+ import path from 'path';
2
+ export function resolveManifestPaths(config) {
3
+ const rootDir = config.rootDir || process.cwd();
4
+ return (config.manifestFiles || ['package.json']).map((manifest) => path.join(rootDir, manifest));
5
+ }
6
+ //# sourceMappingURL=manifestPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifestPaths.js","sourceRoot":"","sources":["../../src/utils/manifestPaths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,UAAU,oBAAoB,CAAC,MAA0B;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACpG,CAAC"}
@@ -9,6 +9,9 @@ declare const languageConfigs: Record<string, LanguageConfig>;
9
9
  export declare class CodePatternValidator {
10
10
  private sourceIndex;
11
11
  private sourceFiles;
12
+ private sourceInputs;
13
+ private sourceInputsAvailable;
14
+ private capturedInputs;
12
15
  constructor();
13
16
  buildSourceIndex(config: DocFreshnessConfig): Promise<void>;
14
17
  private detectSourcePatterns;