@eeymoo/context-todos 0.1.0-alpha.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 +261 -0
  2. package/dist/src/index.d.ts +3 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +88 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/mcp/db.d.ts +29 -0
  7. package/dist/src/mcp/db.d.ts.map +1 -0
  8. package/dist/src/mcp/db.js +111 -0
  9. package/dist/src/mcp/db.js.map +1 -0
  10. package/dist/src/mcp/gitignore.d.ts +6 -0
  11. package/dist/src/mcp/gitignore.d.ts.map +1 -0
  12. package/dist/src/mcp/gitignore.js +32 -0
  13. package/dist/src/mcp/gitignore.js.map +1 -0
  14. package/dist/src/mcp/index.d.ts +7 -0
  15. package/dist/src/mcp/index.d.ts.map +1 -0
  16. package/dist/src/mcp/index.js +87 -0
  17. package/dist/src/mcp/index.js.map +1 -0
  18. package/dist/src/mcp/scanner.d.ts +7 -0
  19. package/dist/src/mcp/scanner.d.ts.map +1 -0
  20. package/dist/src/mcp/scanner.js +45 -0
  21. package/dist/src/mcp/scanner.js.map +1 -0
  22. package/dist/src/mcp/tools/get-todo-stats.d.ts +3 -0
  23. package/dist/src/mcp/tools/get-todo-stats.d.ts.map +1 -0
  24. package/dist/src/mcp/tools/get-todo-stats.js +37 -0
  25. package/dist/src/mcp/tools/get-todo-stats.js.map +1 -0
  26. package/dist/src/mcp/tools/list-extensions.d.ts +3 -0
  27. package/dist/src/mcp/tools/list-extensions.d.ts.map +1 -0
  28. package/dist/src/mcp/tools/list-extensions.js +28 -0
  29. package/dist/src/mcp/tools/list-extensions.js.map +1 -0
  30. package/dist/src/mcp/tools/list-todos.d.ts +3 -0
  31. package/dist/src/mcp/tools/list-todos.d.ts.map +1 -0
  32. package/dist/src/mcp/tools/list-todos.js +60 -0
  33. package/dist/src/mcp/tools/list-todos.js.map +1 -0
  34. package/dist/src/mcp/tools/scan-directory.d.ts +3 -0
  35. package/dist/src/mcp/tools/scan-directory.d.ts.map +1 -0
  36. package/dist/src/mcp/tools/scan-directory.js +78 -0
  37. package/dist/src/mcp/tools/scan-directory.js.map +1 -0
  38. package/dist/src/mcp/tools/scan-file.d.ts +3 -0
  39. package/dist/src/mcp/tools/scan-file.d.ts.map +1 -0
  40. package/dist/src/mcp/tools/scan-file.js +63 -0
  41. package/dist/src/mcp/tools/scan-file.js.map +1 -0
  42. package/dist/src/mcp/tools/watch.d.ts +4 -0
  43. package/dist/src/mcp/tools/watch.d.ts.map +1 -0
  44. package/dist/src/mcp/tools/watch.js +110 -0
  45. package/dist/src/mcp/tools/watch.js.map +1 -0
  46. package/dist/src/mcp/types.d.ts +35 -0
  47. package/dist/src/mcp/types.d.ts.map +1 -0
  48. package/dist/src/mcp/types.js +23 -0
  49. package/dist/src/mcp/types.js.map +1 -0
  50. package/dist/src/mcp/watcher.d.ts +7 -0
  51. package/dist/src/mcp/watcher.d.ts.map +1 -0
  52. package/dist/src/mcp/watcher.js +74 -0
  53. package/dist/src/mcp/watcher.js.map +1 -0
  54. package/dist/tests/db.test.d.ts +2 -0
  55. package/dist/tests/db.test.d.ts.map +1 -0
  56. package/dist/tests/db.test.js +339 -0
  57. package/dist/tests/db.test.js.map +1 -0
  58. package/dist/tests/mcp/index.test.d.ts +2 -0
  59. package/dist/tests/mcp/index.test.d.ts.map +1 -0
  60. package/dist/tests/mcp/index.test.js +276 -0
  61. package/dist/tests/mcp/index.test.js.map +1 -0
  62. package/dist/tests/scanner.test.d.ts +2 -0
  63. package/dist/tests/scanner.test.d.ts.map +1 -0
  64. package/dist/tests/scanner.test.js +101 -0
  65. package/dist/tests/scanner.test.js.map +1 -0
  66. package/dist/tests/tools/get-todo-stats.test.d.ts +2 -0
  67. package/dist/tests/tools/get-todo-stats.test.d.ts.map +1 -0
  68. package/dist/tests/tools/get-todo-stats.test.js +256 -0
  69. package/dist/tests/tools/get-todo-stats.test.js.map +1 -0
  70. package/dist/tests/tools/list-extensions.test.d.ts +2 -0
  71. package/dist/tests/tools/list-extensions.test.d.ts.map +1 -0
  72. package/dist/tests/tools/list-extensions.test.js +123 -0
  73. package/dist/tests/tools/list-extensions.test.js.map +1 -0
  74. package/dist/tests/tools/list-todos.test.d.ts +2 -0
  75. package/dist/tests/tools/list-todos.test.d.ts.map +1 -0
  76. package/dist/tests/tools/list-todos.test.js +279 -0
  77. package/dist/tests/tools/list-todos.test.js.map +1 -0
  78. package/dist/tests/tools/scan-directory.test.d.ts +2 -0
  79. package/dist/tests/tools/scan-directory.test.d.ts.map +1 -0
  80. package/dist/tests/tools/scan-directory.test.js +194 -0
  81. package/dist/tests/tools/scan-directory.test.js.map +1 -0
  82. package/dist/tests/tools/scan-file.test.d.ts +2 -0
  83. package/dist/tests/tools/scan-file.test.d.ts.map +1 -0
  84. package/dist/tests/tools/scan-file.test.js +176 -0
  85. package/dist/tests/tools/scan-file.test.js.map +1 -0
  86. package/dist/tests/tools/watch.test.d.ts +2 -0
  87. package/dist/tests/tools/watch.test.d.ts.map +1 -0
  88. package/dist/tests/tools/watch.test.js +286 -0
  89. package/dist/tests/tools/watch.test.js.map +1 -0
  90. package/dist/tests/watcher.test.d.ts +2 -0
  91. package/dist/tests/watcher.test.d.ts.map +1 -0
  92. package/dist/tests/watcher.test.js +372 -0
  93. package/dist/tests/watcher.test.js.map +1 -0
  94. package/dist/vitest.config.d.ts +3 -0
  95. package/dist/vitest.config.d.ts.map +1 -0
  96. package/dist/vitest.config.js +15 -0
  97. package/dist/vitest.config.js.map +1 -0
  98. package/package.json +67 -0
@@ -0,0 +1,279 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { writeFileSync, mkdirSync, rmSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { registerListTodos } from '../../src/mcp/tools/list-todos.js';
6
+ import { initDb, getDb } from '../../src/mcp/db.js';
7
+ import { scanFile } from '../../src/mcp/scanner.js';
8
+ import { syncFileTodos } from '../../src/mcp/db.js';
9
+ class MockMcpServer {
10
+ tools = new Map();
11
+ registerTool(name, schema, handler) {
12
+ this.tools.set(name, { schema, handler });
13
+ }
14
+ getTool(name) {
15
+ return this.tools.get(name);
16
+ }
17
+ }
18
+ describe('list-todos tool', () => {
19
+ let testDir;
20
+ let mockServer;
21
+ beforeEach(async () => {
22
+ testDir = join(tmpdir(), `list-todos-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
23
+ mkdirSync(testDir, { recursive: true });
24
+ mockServer = new MockMcpServer();
25
+ await initDb(testDir);
26
+ });
27
+ afterEach(async () => {
28
+ try {
29
+ const db = getDb();
30
+ await db.close();
31
+ }
32
+ catch {
33
+ // DB might not be initialized
34
+ }
35
+ if (existsSync(testDir)) {
36
+ rmSync(testDir, { recursive: true, force: true });
37
+ }
38
+ });
39
+ describe('tool registration', () => {
40
+ it('should register list-todos tool with correct schema', () => {
41
+ registerListTodos(mockServer);
42
+ const tool = mockServer.getTool('list-todos');
43
+ expect(tool).toBeDefined();
44
+ expect(tool?.schema).toBeDefined();
45
+ });
46
+ });
47
+ describe('listing todos with no filters', () => {
48
+ it('should return all todos from database', async () => {
49
+ const file1 = join(testDir, 'file1.ts');
50
+ writeFileSync(file1, '// TODO: First todo\n');
51
+ const todos1 = await scanFile(file1);
52
+ await syncFileTodos('file1.ts', todos1);
53
+ const file2 = join(testDir, 'file2.ts');
54
+ writeFileSync(file2, '// FIXME: Second todo\n');
55
+ const todos2 = await scanFile(file2);
56
+ await syncFileTodos('file2.ts', todos2);
57
+ registerListTodos(mockServer);
58
+ const tool = mockServer.getTool('list-todos');
59
+ expect(tool).toBeDefined();
60
+ const result = await tool.handler({});
61
+ const content = result.content;
62
+ expect(content).toBeDefined();
63
+ expect(content[0].type).toBe('text');
64
+ expect(content[0].text).toContain('Showing 2 of 2 TODO(s)');
65
+ expect(content[0].text).toContain('[TODO]');
66
+ expect(content[0].text).toContain('[FIXME]');
67
+ });
68
+ it('should return message when database is empty', async () => {
69
+ registerListTodos(mockServer);
70
+ const tool = mockServer.getTool('list-todos');
71
+ expect(tool).toBeDefined();
72
+ const result = await tool.handler({});
73
+ const content = result.content;
74
+ expect(content).toBeDefined();
75
+ expect(content[0].type).toBe('text');
76
+ expect(content[0].text).toContain('No TODOs found in database');
77
+ });
78
+ });
79
+ describe('filtering by tag', () => {
80
+ it('should filter todos by specific tag', async () => {
81
+ const file = join(testDir, 'mixed.ts');
82
+ writeFileSync(file, `// TODO: Todo item
83
+ // FIXME: Fix item
84
+ // HACK: Hack item
85
+ `);
86
+ const todos = await scanFile(file);
87
+ await syncFileTodos('mixed.ts', todos);
88
+ registerListTodos(mockServer);
89
+ const tool = mockServer.getTool('list-todos');
90
+ expect(tool).toBeDefined();
91
+ const result = await tool.handler({ tag: 'TODO' });
92
+ const content = result.content;
93
+ expect(content).toBeDefined();
94
+ expect(content[0].text).toContain('Showing 1 of 1 TODO(s)');
95
+ expect(content[0].text).toContain('[TODO]');
96
+ expect(content[0].text).not.toContain('[FIXME]');
97
+ expect(content[0].text).not.toContain('[HACK]');
98
+ });
99
+ it('should return no results when tag has no matches', async () => {
100
+ const file = join(testDir, 'file.ts');
101
+ writeFileSync(file, '// TODO: Only todo\n');
102
+ const todos = await scanFile(file);
103
+ await syncFileTodos('file.ts', todos);
104
+ registerListTodos(mockServer);
105
+ const tool = mockServer.getTool('list-todos');
106
+ expect(tool).toBeDefined();
107
+ const result = await tool.handler({ tag: 'XXX' });
108
+ const content = result.content;
109
+ expect(content).toBeDefined();
110
+ expect(content[0].text).toContain('No TODOs found in database');
111
+ });
112
+ });
113
+ describe('filtering by file', () => {
114
+ it('should filter todos by file path (partial match)', async () => {
115
+ const file1 = join(testDir, 'component.ts');
116
+ writeFileSync(file1, '// TODO: Component todo\n');
117
+ const todos1 = await scanFile(file1);
118
+ await syncFileTodos('component.ts', todos1);
119
+ const file2 = join(testDir, 'util.ts');
120
+ writeFileSync(file2, '// TODO: Util todo\n');
121
+ const todos2 = await scanFile(file2);
122
+ await syncFileTodos('util.ts', todos2);
123
+ registerListTodos(mockServer);
124
+ const tool = mockServer.getTool('list-todos');
125
+ expect(tool).toBeDefined();
126
+ const result = await tool.handler({ file: 'component' });
127
+ const content = result.content;
128
+ expect(content).toBeDefined();
129
+ expect(content[0].text).toContain('Showing 1 of 1 TODO(s)');
130
+ expect(content[0].text).toContain('component.ts');
131
+ expect(content[0].text).not.toContain('util.ts');
132
+ });
133
+ it('should return no results when file has no matches', async () => {
134
+ const file = join(testDir, 'file.ts');
135
+ writeFileSync(file, '// TODO: Test\n');
136
+ const todos = await scanFile(file);
137
+ await syncFileTodos('file.ts', todos);
138
+ registerListTodos(mockServer);
139
+ const tool = mockServer.getTool('list-todos');
140
+ expect(tool).toBeDefined();
141
+ const result = await tool.handler({ file: 'nonexistent' });
142
+ const content = result.content;
143
+ expect(content).toBeDefined();
144
+ expect(content[0].text).toContain('No TODOs found in database');
145
+ });
146
+ });
147
+ describe('pagination with limit and offset', () => {
148
+ it('should respect limit parameter', async () => {
149
+ const file = join(testDir, 'many.ts');
150
+ writeFileSync(file, `// TODO: First
151
+ // TODO: Second
152
+ // TODO: Third
153
+ // TODO: Fourth
154
+ // TODO: Fifth
155
+ `);
156
+ const todos = await scanFile(file);
157
+ await syncFileTodos('many.ts', todos);
158
+ registerListTodos(mockServer);
159
+ const tool = mockServer.getTool('list-todos');
160
+ expect(tool).toBeDefined();
161
+ const result = await tool.handler({ limit: 3 });
162
+ const content = result.content;
163
+ expect(content).toBeDefined();
164
+ expect(content[0].text).toContain('Showing 3 of 5 TODO(s)');
165
+ });
166
+ it('should respect offset parameter', async () => {
167
+ const file = join(testDir, 'many.ts');
168
+ writeFileSync(file, `// TODO: First
169
+ // TODO: Second
170
+ // TODO: Third
171
+ `);
172
+ const todos = await scanFile(file);
173
+ await syncFileTodos('many.ts', todos);
174
+ registerListTodos(mockServer);
175
+ const tool = mockServer.getTool('list-todos');
176
+ expect(tool).toBeDefined();
177
+ const result = await tool.handler({ offset: 2 });
178
+ const content = result.content;
179
+ expect(content).toBeDefined();
180
+ expect(content[0].text).toContain('Showing 1 of 3 TODO(s)');
181
+ });
182
+ it('should use default limit of 100', async () => {
183
+ registerListTodos(mockServer);
184
+ const tool = mockServer.getTool('list-todos');
185
+ expect(tool).toBeDefined();
186
+ const result = await tool.handler({});
187
+ expect(result).toBeDefined();
188
+ });
189
+ });
190
+ describe('combined filters', () => {
191
+ it('should apply both tag and file filters', async () => {
192
+ const file1 = join(testDir, 'component.ts');
193
+ writeFileSync(file1, `// TODO: Component todo
194
+ // FIXME: Component fix
195
+ `);
196
+ const todos1 = await scanFile(file1);
197
+ await syncFileTodos('component.ts', todos1);
198
+ const file2 = join(testDir, 'util.ts');
199
+ writeFileSync(file2, '// TODO: Util todo\n');
200
+ const todos2 = await scanFile(file2);
201
+ await syncFileTodos('util.ts', todos2);
202
+ registerListTodos(mockServer);
203
+ const tool = mockServer.getTool('list-todos');
204
+ expect(tool).toBeDefined();
205
+ const result = await tool.handler({ tag: 'TODO', file: 'component' });
206
+ const content = result.content;
207
+ expect(content).toBeDefined();
208
+ expect(content[0].text).toContain('Showing 1 of 1 TODO(s)');
209
+ expect(content[0].text).toContain('[TODO]');
210
+ expect(content[0].text).toContain('component.ts');
211
+ expect(content[0].text).not.toContain('[FIXME]');
212
+ expect(content[0].text).not.toContain('util.ts');
213
+ });
214
+ it('should combine all filters: tag, file, limit, offset', async () => {
215
+ const file = join(testDir, 'test.ts');
216
+ writeFileSync(file, `// TODO: First
217
+ // TODO: Second
218
+ // TODO: Third
219
+ // FIXME: Fix
220
+ `);
221
+ const todos = await scanFile(file);
222
+ await syncFileTodos('test.ts', todos);
223
+ registerListTodos(mockServer);
224
+ const tool = mockServer.getTool('list-todos');
225
+ expect(tool).toBeDefined();
226
+ const result = await tool.handler({ tag: 'TODO', file: 'test', limit: 2, offset: 1 });
227
+ const content = result.content;
228
+ expect(content).toBeDefined();
229
+ expect(content[0].text).toContain('Showing 2 of 3 TODO(s)');
230
+ });
231
+ });
232
+ describe('output format', () => {
233
+ it('should include tag, file, line number, and text', async () => {
234
+ const file = join(testDir, 'format.ts');
235
+ writeFileSync(file, '// TODO: Check format\n');
236
+ const todos = await scanFile(file);
237
+ await syncFileTodos('format.ts', todos);
238
+ registerListTodos(mockServer);
239
+ const tool = mockServer.getTool('list-todos');
240
+ expect(tool).toBeDefined();
241
+ const result = await tool.handler({});
242
+ const content = result.content;
243
+ expect(content).toBeDefined();
244
+ const text = content[0].text;
245
+ expect(text).toContain('[TODO]');
246
+ expect(text).toContain('format.ts');
247
+ expect(text).toMatch(/:\d+/);
248
+ expect(text).toContain('Check format');
249
+ });
250
+ it('should include ref when present', async () => {
251
+ const file = join(testDir, 'withref.ts');
252
+ writeFileSync(file, '// TODO(user123): With reference\n');
253
+ const todos = await scanFile(file);
254
+ await syncFileTodos('withref.ts', todos);
255
+ registerListTodos(mockServer);
256
+ const tool = mockServer.getTool('list-todos');
257
+ expect(tool).toBeDefined();
258
+ const result = await tool.handler({});
259
+ const content = result.content;
260
+ expect(content).toBeDefined();
261
+ expect(content[0].text).toContain('(ref:');
262
+ });
263
+ });
264
+ describe('error handling', () => {
265
+ it('should handle database errors gracefully', async () => {
266
+ registerListTodos(mockServer);
267
+ const tool = mockServer.getTool('list-todos');
268
+ expect(tool).toBeDefined();
269
+ const db = getDb();
270
+ await db.close();
271
+ const result = await tool.handler({});
272
+ const content = result.content;
273
+ expect(content).toBeDefined();
274
+ expect(content[0].type).toBe('text');
275
+ expect(content[0].text).toContain('Error querying TODOs');
276
+ });
277
+ });
278
+ });
279
+ //# sourceMappingURL=list-todos.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-todos.test.js","sourceRoot":"","sources":["../../../tests/tools/list-todos.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scan-directory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-directory.test.d.ts","sourceRoot":"","sources":["../../../tests/tools/scan-directory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,194 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { writeFileSync, mkdirSync, rmSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { registerScanDirectory } from '../../src/mcp/tools/scan-directory.js';
6
+ class MockMcpServer {
7
+ tools = new Map();
8
+ registerTool(name, schema, handler) {
9
+ this.tools.set(name, { schema, handler });
10
+ }
11
+ getTool(name) {
12
+ return this.tools.get(name);
13
+ }
14
+ }
15
+ describe('scan-directory tool', () => {
16
+ let testDir;
17
+ let mockServer;
18
+ beforeEach(() => {
19
+ testDir = join(tmpdir(), `scan-directory-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
20
+ mkdirSync(testDir, { recursive: true });
21
+ mockServer = new MockMcpServer();
22
+ });
23
+ afterEach(() => {
24
+ if (existsSync(testDir)) {
25
+ rmSync(testDir, { recursive: true, force: true });
26
+ }
27
+ });
28
+ describe('tool registration', () => {
29
+ it('should register scan-directory tool with correct schema', () => {
30
+ registerScanDirectory(mockServer);
31
+ const tool = mockServer.getTool('scan-directory');
32
+ expect(tool).toBeDefined();
33
+ expect(tool?.schema).toBeDefined();
34
+ });
35
+ });
36
+ describe('scanning directory with TODOs', () => {
37
+ it('should return formatted output for directory with TODOs across multiple files', async () => {
38
+ writeFileSync(join(testDir, 'file1.ts'), `// TODO: First file todo
39
+ const x = 1;
40
+ `);
41
+ writeFileSync(join(testDir, 'file2.ts'), `// FIXME: Second file todo
42
+ const y = 2;
43
+ `);
44
+ registerScanDirectory(mockServer);
45
+ const tool = mockServer.getTool('scan-directory');
46
+ expect(tool).toBeDefined();
47
+ const result = await tool.handler({ path: testDir });
48
+ const content = result.content;
49
+ expect(content).toBeDefined();
50
+ expect(content[0].text).toContain('Found 2 TODO(s) across 2 file(s)');
51
+ expect(content[0].text).toContain('[TODO]');
52
+ expect(content[0].text).toContain('[FIXME]');
53
+ expect(content[0].text).toContain('file1.ts');
54
+ expect(content[0].text).toContain('file2.ts');
55
+ });
56
+ it('should include relative paths in output', async () => {
57
+ const subDir = join(testDir, 'src');
58
+ mkdirSync(subDir, { recursive: true });
59
+ writeFileSync(join(subDir, 'component.ts'), `// TODO: Component todo
60
+ `);
61
+ registerScanDirectory(mockServer);
62
+ const tool = mockServer.getTool('scan-directory');
63
+ expect(tool).toBeDefined();
64
+ const result = await tool.handler({ path: testDir });
65
+ const content = result.content;
66
+ expect(content).toBeDefined();
67
+ expect(content[0].text).toContain('src/component.ts');
68
+ });
69
+ it('should scan nested directories recursively', async () => {
70
+ const level1 = join(testDir, 'level1');
71
+ const level2 = join(level1, 'level2');
72
+ mkdirSync(level2, { recursive: true });
73
+ writeFileSync(join(testDir, 'root.ts'), '// TODO: Root level\n');
74
+ writeFileSync(join(level1, 'level1.ts'), '// TODO: Level 1\n');
75
+ writeFileSync(join(level2, 'level2.ts'), '// TODO: Level 2\n');
76
+ registerScanDirectory(mockServer);
77
+ const tool = mockServer.getTool('scan-directory');
78
+ expect(tool).toBeDefined();
79
+ const result = await tool.handler({ path: testDir });
80
+ const content = result.content;
81
+ expect(content).toBeDefined();
82
+ expect(content[0].text).toContain('Found 3 TODO(s)');
83
+ expect(content[0].text).toContain('root.ts');
84
+ expect(content[0].text).toContain('level1/level1.ts');
85
+ expect(content[0].text).toContain('level1/level2/level2.ts');
86
+ });
87
+ });
88
+ describe('scanning empty directory', () => {
89
+ it('should return "No TODOs found" message for empty directory', async () => {
90
+ registerScanDirectory(mockServer);
91
+ const tool = mockServer.getTool('scan-directory');
92
+ expect(tool).toBeDefined();
93
+ const result = await tool.handler({ path: testDir });
94
+ const content = result.content;
95
+ expect(content).toBeDefined();
96
+ expect(content[0].type).toBe('text');
97
+ expect(content[0].text).toContain('No TODOs found');
98
+ });
99
+ it('should return "No TODOs found" for directory with files but no TODOs', async () => {
100
+ writeFileSync(join(testDir, 'clean.ts'), 'const x = 1;\n');
101
+ registerScanDirectory(mockServer);
102
+ const tool = mockServer.getTool('scan-directory');
103
+ expect(tool).toBeDefined();
104
+ const result = await tool.handler({ path: testDir });
105
+ const content = result.content;
106
+ expect(content).toBeDefined();
107
+ expect(content[0].text).toContain('No TODOs found');
108
+ });
109
+ });
110
+ describe('filtering by extensions', () => {
111
+ it('should filter files by specified extensions', async () => {
112
+ writeFileSync(join(testDir, 'file.ts'), '// TODO: TypeScript\n');
113
+ writeFileSync(join(testDir, 'file.js'), '// TODO: JavaScript\n');
114
+ writeFileSync(join(testDir, 'file.py'), '# TODO: Python\n');
115
+ registerScanDirectory(mockServer);
116
+ const tool = mockServer.getTool('scan-directory');
117
+ expect(tool).toBeDefined();
118
+ const result = await tool.handler({ path: testDir, extensions: ['.ts'] });
119
+ const content = result.content;
120
+ expect(content).toBeDefined();
121
+ expect(content[0].text).toContain('Found 1 TODO(s)');
122
+ expect(content[0].text).toContain('file.ts');
123
+ expect(content[0].text).not.toContain('file.js');
124
+ expect(content[0].text).not.toContain('file.py');
125
+ });
126
+ it('should support multiple extension filters', async () => {
127
+ writeFileSync(join(testDir, 'file.ts'), '// TODO: TypeScript\n');
128
+ writeFileSync(join(testDir, 'file.js'), '// TODO: JavaScript\n');
129
+ writeFileSync(join(testDir, 'file.py'), '# TODO: Python\n');
130
+ registerScanDirectory(mockServer);
131
+ const tool = mockServer.getTool('scan-directory');
132
+ expect(tool).toBeDefined();
133
+ const result = await tool.handler({ path: testDir, extensions: ['.ts', '.js'] });
134
+ const content = result.content;
135
+ expect(content).toBeDefined();
136
+ expect(content[0].text).toContain('Found 2 TODO(s)');
137
+ expect(content[0].text).toContain('file.ts');
138
+ expect(content[0].text).toContain('file.js');
139
+ expect(content[0].text).not.toContain('file.py');
140
+ });
141
+ });
142
+ describe('error handling', () => {
143
+ it('should return error message when path is not a directory', async () => {
144
+ const testFile = join(testDir, 'file.ts');
145
+ writeFileSync(testFile, '// TODO: Test\n');
146
+ registerScanDirectory(mockServer);
147
+ const tool = mockServer.getTool('scan-directory');
148
+ expect(tool).toBeDefined();
149
+ const result = await tool.handler({ path: testFile });
150
+ const content = result.content;
151
+ expect(content).toBeDefined();
152
+ expect(content[0].type).toBe('text');
153
+ expect(content[0].text).toContain('Not a directory');
154
+ });
155
+ it('should handle scan errors gracefully', async () => {
156
+ registerScanDirectory(mockServer);
157
+ const tool = mockServer.getTool('scan-directory');
158
+ expect(tool).toBeDefined();
159
+ const result = await tool.handler({ path: '/nonexistent/path' });
160
+ const content = result.content;
161
+ expect(content).toBeDefined();
162
+ expect(content[0].type).toBe('text');
163
+ expect(content[0].text).toContain('Error scanning directory');
164
+ });
165
+ });
166
+ describe('default path handling', () => {
167
+ it('should use current directory when path is omitted', async () => {
168
+ registerScanDirectory(mockServer);
169
+ const tool = mockServer.getTool('scan-directory');
170
+ expect(tool).toBeDefined();
171
+ const result = await tool.handler({});
172
+ const content = result.content;
173
+ expect(content).toBeDefined();
174
+ expect(content[0].type).toBe('text');
175
+ });
176
+ });
177
+ describe('multiple TODO types', () => {
178
+ it('should detect all TODO tag types', async () => {
179
+ writeFileSync(join(testDir, 'tags.ts'), `// TODO: Regular todo
180
+ // FIXME: Fix me
181
+ `);
182
+ registerScanDirectory(mockServer);
183
+ const tool = mockServer.getTool('scan-directory');
184
+ expect(tool).toBeDefined();
185
+ const result = await tool.handler({ path: testDir });
186
+ const content = result.content;
187
+ expect(content).toBeDefined();
188
+ expect(content[0].text).toContain('Found 2 TODO(s)');
189
+ expect(content[0].text).toContain('[TODO]');
190
+ expect(content[0].text).toContain('[FIXME]');
191
+ });
192
+ });
193
+ });
194
+ //# sourceMappingURL=scan-directory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-directory.test.js","sourceRoot":"","sources":["../../../tests/tools/scan-directory.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,MAAM,aAAa;IACjB,KAAK,GAAmF,IAAI,GAAG,EAAE,CAAC;IAElG,YAAY,CACV,IAAY,EACZ,MAAe,EACf,OAA4C;QAE5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,OAAe,CAAC;IACpB,IAAI,UAAyB,CAAC;IAE9B,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrG,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAE3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;YAC7F,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EACzB;;CAEP,CACM,CAAC;YACF,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EACzB;;CAEP,CACM,CAAC;YAEF,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;YACxE,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEvC,aAAa,CACX,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5B;CACP,CACM,CAAC;YAEF,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACtC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEvC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,uBAAuB,CAAC,CAAC;YACjE,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,oBAAoB,CAAC,CAAC;YAC/D,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,oBAAoB,CAAC,CAAC;YAE/D,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACvD,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACxD,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACpF,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAE3D,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,uBAAuB,CAAC,CAAC;YACjE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,uBAAuB,CAAC,CAAC;YACjE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAE5D,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3E,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACvD,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,uBAAuB,CAAC,CAAC;YACjE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,uBAAuB,CAAC,CAAC;YACjE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAE5D,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAClF,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACvD,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC1C,aAAa,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;YAE3C,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvD,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAClE,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACxB;;CAEP,CACM,CAAC;YAEF,qBAAqB,CAAC,UAAmB,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,IAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAI,MAAwD,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACvD,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scan-file.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-file.test.d.ts","sourceRoot":"","sources":["../../../tests/tools/scan-file.test.ts"],"names":[],"mappings":""}