@j0hanz/filesystem-context-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/README.md +369 -0
  2. package/dist/__tests__/errors.test.d.ts +2 -0
  3. package/dist/__tests__/errors.test.d.ts.map +1 -0
  4. package/dist/__tests__/errors.test.js +88 -0
  5. package/dist/__tests__/errors.test.js.map +1 -0
  6. package/dist/__tests__/file-operations.test.d.ts +2 -0
  7. package/dist/__tests__/file-operations.test.d.ts.map +1 -0
  8. package/dist/__tests__/file-operations.test.js +230 -0
  9. package/dist/__tests__/file-operations.test.js.map +1 -0
  10. package/dist/__tests__/lib/errors.test.d.ts +2 -0
  11. package/dist/__tests__/lib/errors.test.d.ts.map +1 -0
  12. package/dist/__tests__/lib/errors.test.js +156 -0
  13. package/dist/__tests__/lib/errors.test.js.map +1 -0
  14. package/dist/__tests__/lib/file-operations.test.d.ts +2 -0
  15. package/dist/__tests__/lib/file-operations.test.d.ts.map +1 -0
  16. package/dist/__tests__/lib/file-operations.test.js +417 -0
  17. package/dist/__tests__/lib/file-operations.test.js.map +1 -0
  18. package/dist/__tests__/lib/fs-helpers.test.d.ts +2 -0
  19. package/dist/__tests__/lib/fs-helpers.test.d.ts.map +1 -0
  20. package/dist/__tests__/lib/fs-helpers.test.js +183 -0
  21. package/dist/__tests__/lib/fs-helpers.test.js.map +1 -0
  22. package/dist/__tests__/lib/path-validation.test.d.ts +2 -0
  23. package/dist/__tests__/lib/path-validation.test.d.ts.map +1 -0
  24. package/dist/__tests__/lib/path-validation.test.js +103 -0
  25. package/dist/__tests__/lib/path-validation.test.js.map +1 -0
  26. package/dist/__tests__/path-validation.test.d.ts +2 -0
  27. package/dist/__tests__/path-validation.test.d.ts.map +1 -0
  28. package/dist/__tests__/path-validation.test.js +92 -0
  29. package/dist/__tests__/path-validation.test.js.map +1 -0
  30. package/dist/config/types.d.ts +222 -0
  31. package/dist/config/types.d.ts.map +1 -0
  32. package/dist/config/types.js +23 -0
  33. package/dist/config/types.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +50 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/lib/constants.d.ts +16 -0
  39. package/dist/lib/constants.d.ts.map +1 -0
  40. package/dist/lib/constants.js +335 -0
  41. package/dist/lib/constants.js.map +1 -0
  42. package/dist/lib/errors.d.ts +33 -0
  43. package/dist/lib/errors.d.ts.map +1 -0
  44. package/dist/lib/errors.js +205 -0
  45. package/dist/lib/errors.js.map +1 -0
  46. package/dist/lib/file-operations.d.ts +69 -0
  47. package/dist/lib/file-operations.d.ts.map +1 -0
  48. package/dist/lib/file-operations.js +1003 -0
  49. package/dist/lib/file-operations.js.map +1 -0
  50. package/dist/lib/formatters.d.ts +30 -0
  51. package/dist/lib/formatters.d.ts.map +1 -0
  52. package/dist/lib/formatters.js +204 -0
  53. package/dist/lib/formatters.js.map +1 -0
  54. package/dist/lib/fs-helpers.d.ts +29 -0
  55. package/dist/lib/fs-helpers.d.ts.map +1 -0
  56. package/dist/lib/fs-helpers.js +295 -0
  57. package/dist/lib/fs-helpers.js.map +1 -0
  58. package/dist/lib/path-utils.d.ts +12 -0
  59. package/dist/lib/path-utils.d.ts.map +1 -0
  60. package/dist/lib/path-utils.js +34 -0
  61. package/dist/lib/path-utils.js.map +1 -0
  62. package/dist/lib/path-validation.d.ts +31 -0
  63. package/dist/lib/path-validation.d.ts.map +1 -0
  64. package/dist/lib/path-validation.js +181 -0
  65. package/dist/lib/path-validation.js.map +1 -0
  66. package/dist/lib/roots-utils.d.ts +7 -0
  67. package/dist/lib/roots-utils.d.ts.map +1 -0
  68. package/dist/lib/roots-utils.js +39 -0
  69. package/dist/lib/roots-utils.js.map +1 -0
  70. package/dist/lib/types.d.ts +6 -0
  71. package/dist/lib/types.d.ts.map +1 -0
  72. package/dist/lib/types.js +2 -0
  73. package/dist/lib/types.js.map +1 -0
  74. package/dist/schemas/common.d.ts +41 -0
  75. package/dist/schemas/common.d.ts.map +1 -0
  76. package/dist/schemas/common.js +21 -0
  77. package/dist/schemas/common.js.map +1 -0
  78. package/dist/schemas/index.d.ts +3 -0
  79. package/dist/schemas/index.d.ts.map +1 -0
  80. package/dist/schemas/index.js +5 -0
  81. package/dist/schemas/index.js.map +1 -0
  82. package/dist/schemas/inputs.d.ts +72 -0
  83. package/dist/schemas/inputs.d.ts.map +1 -0
  84. package/dist/schemas/inputs.js +326 -0
  85. package/dist/schemas/inputs.js.map +1 -0
  86. package/dist/schemas/outputs.d.ts +476 -0
  87. package/dist/schemas/outputs.d.ts.map +1 -0
  88. package/dist/schemas/outputs.js +181 -0
  89. package/dist/schemas/outputs.js.map +1 -0
  90. package/dist/server.d.ts +5 -0
  91. package/dist/server.d.ts.map +1 -0
  92. package/dist/server.js +83 -0
  93. package/dist/server.js.map +1 -0
  94. package/dist/tools/analyze-directory.d.ts +3 -0
  95. package/dist/tools/analyze-directory.d.ts.map +1 -0
  96. package/dist/tools/analyze-directory.js +57 -0
  97. package/dist/tools/analyze-directory.js.map +1 -0
  98. package/dist/tools/directory-tree.d.ts +3 -0
  99. package/dist/tools/directory-tree.d.ts.map +1 -0
  100. package/dist/tools/directory-tree.js +47 -0
  101. package/dist/tools/directory-tree.js.map +1 -0
  102. package/dist/tools/get-file-info.d.ts +3 -0
  103. package/dist/tools/get-file-info.d.ts.map +1 -0
  104. package/dist/tools/get-file-info.js +44 -0
  105. package/dist/tools/get-file-info.js.map +1 -0
  106. package/dist/tools/index.d.ts +3 -0
  107. package/dist/tools/index.d.ts.map +1 -0
  108. package/dist/tools/index.js +23 -0
  109. package/dist/tools/index.js.map +1 -0
  110. package/dist/tools/list-allowed-dirs.d.ts +3 -0
  111. package/dist/tools/list-allowed-dirs.d.ts.map +1 -0
  112. package/dist/tools/list-allowed-dirs.js +23 -0
  113. package/dist/tools/list-allowed-dirs.js.map +1 -0
  114. package/dist/tools/list-directory.d.ts +3 -0
  115. package/dist/tools/list-directory.d.ts.map +1 -0
  116. package/dist/tools/list-directory.js +60 -0
  117. package/dist/tools/list-directory.js.map +1 -0
  118. package/dist/tools/read-file.d.ts +3 -0
  119. package/dist/tools/read-file.d.ts.map +1 -0
  120. package/dist/tools/read-file.js +55 -0
  121. package/dist/tools/read-file.js.map +1 -0
  122. package/dist/tools/read-media-file.d.ts +3 -0
  123. package/dist/tools/read-media-file.d.ts.map +1 -0
  124. package/dist/tools/read-media-file.js +48 -0
  125. package/dist/tools/read-media-file.js.map +1 -0
  126. package/dist/tools/read-multiple-files.d.ts +3 -0
  127. package/dist/tools/read-multiple-files.d.ts.map +1 -0
  128. package/dist/tools/read-multiple-files.js +53 -0
  129. package/dist/tools/read-multiple-files.js.map +1 -0
  130. package/dist/tools/search-content.d.ts +3 -0
  131. package/dist/tools/search-content.d.ts.map +1 -0
  132. package/dist/tools/search-content.js +67 -0
  133. package/dist/tools/search-content.js.map +1 -0
  134. package/dist/tools/search-files.d.ts +3 -0
  135. package/dist/tools/search-files.d.ts.map +1 -0
  136. package/dist/tools/search-files.js +51 -0
  137. package/dist/tools/search-files.js.map +1 -0
  138. package/dist/utils/index.d.ts +2 -0
  139. package/dist/utils/index.d.ts.map +1 -0
  140. package/dist/utils/index.js +2 -0
  141. package/dist/utils/index.js.map +1 -0
  142. package/dist/utils/response-helpers.d.ts +22 -0
  143. package/dist/utils/response-helpers.d.ts.map +1 -0
  144. package/dist/utils/response-helpers.js +24 -0
  145. package/dist/utils/response-helpers.js.map +1 -0
  146. package/package.json +61 -0
@@ -0,0 +1,230 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
5
+ import { analyzeDirectory, getDirectoryTree, getFileInfo, headFile, listDirectory, readFile, readMediaFile, readMultipleFiles, searchContent, searchFiles, tailFile, } from '../lib/file-operations.js';
6
+ import { normalizePath } from '../lib/path-utils.js';
7
+ import { setAllowedDirectories } from '../lib/path-validation.js';
8
+ describe('File Operations', () => {
9
+ let testDir;
10
+ beforeAll(async () => {
11
+ // Create a temporary test directory with various files
12
+ testDir = await fs.mkdtemp(path.join(os.tmpdir(), 'mcp-fileops-test-'));
13
+ // Create test structure
14
+ await fs.mkdir(path.join(testDir, 'src'));
15
+ await fs.mkdir(path.join(testDir, 'docs'));
16
+ await fs.mkdir(path.join(testDir, '.hidden'));
17
+ // Create test files
18
+ await fs.writeFile(path.join(testDir, 'README.md'), '# Test Project\nThis is a test.\n');
19
+ await fs.writeFile(path.join(testDir, 'src', 'index.ts'), 'export const hello = "world";\n');
20
+ await fs.writeFile(path.join(testDir, 'src', 'utils.ts'), 'export function add(a: number, b: number) { return a + b; }\n');
21
+ await fs.writeFile(path.join(testDir, 'docs', 'guide.md'), '# Guide\nSome documentation.\n');
22
+ await fs.writeFile(path.join(testDir, '.hidden', 'secret.txt'), 'hidden content');
23
+ // Create a multi-line file for head/tail tests
24
+ const lines = Array.from({ length: 100 }, (_, i) => `Line ${i + 1}`).join('\n');
25
+ await fs.writeFile(path.join(testDir, 'multiline.txt'), lines);
26
+ // Create a simple PNG-like binary file (just bytes, not a real image)
27
+ const binaryData = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00]);
28
+ await fs.writeFile(path.join(testDir, 'image.png'), binaryData);
29
+ // Set allowed directories
30
+ setAllowedDirectories([normalizePath(testDir)]);
31
+ });
32
+ afterAll(async () => {
33
+ try {
34
+ await fs.rm(testDir, { recursive: true, force: true });
35
+ }
36
+ catch {
37
+ // Ignore cleanup errors
38
+ }
39
+ });
40
+ describe('listDirectory', () => {
41
+ it('should list directory contents', async () => {
42
+ const result = await listDirectory(testDir);
43
+ expect(result.entries.length).toBeGreaterThan(0);
44
+ expect(result.summary.totalEntries).toBeGreaterThan(0);
45
+ });
46
+ it('should list recursively when specified', async () => {
47
+ const result = await listDirectory(testDir, { recursive: true });
48
+ expect(result.entries.some((e) => e.name === 'index.ts')).toBe(true);
49
+ });
50
+ it('should include hidden files when specified', async () => {
51
+ const result = await listDirectory(testDir, { includeHidden: true });
52
+ expect(result.entries.some((e) => e.name === '.hidden')).toBe(true);
53
+ });
54
+ it('should exclude hidden files by default', async () => {
55
+ const result = await listDirectory(testDir, { includeHidden: false });
56
+ expect(result.entries.some((e) => e.name === '.hidden')).toBe(false);
57
+ });
58
+ it('should respect maxEntries limit', async () => {
59
+ const result = await listDirectory(testDir, { maxEntries: 2 });
60
+ expect(result.entries.length).toBeLessThanOrEqual(2);
61
+ expect(result.summary.truncated).toBe(true);
62
+ });
63
+ });
64
+ describe('searchFiles', () => {
65
+ it('should find files by glob pattern', async () => {
66
+ const result = await searchFiles(testDir, '**/*.ts');
67
+ expect(result.results.length).toBe(2);
68
+ expect(result.results.some((r) => r.path.includes('index.ts'))).toBe(true);
69
+ });
70
+ it('should find markdown files', async () => {
71
+ const result = await searchFiles(testDir, '**/*.md');
72
+ expect(result.results.length).toBe(2);
73
+ });
74
+ it('should return empty results for non-matching patterns', async () => {
75
+ const result = await searchFiles(testDir, '**/*.xyz');
76
+ expect(result.results.length).toBe(0);
77
+ });
78
+ it('should respect maxResults', async () => {
79
+ const result = await searchFiles(testDir, '**/*', [], { maxResults: 1 });
80
+ expect(result.results.length).toBeLessThanOrEqual(1);
81
+ });
82
+ });
83
+ describe('readFile', () => {
84
+ it('should read file contents', async () => {
85
+ const result = await readFile(path.join(testDir, 'README.md'));
86
+ expect(result.content).toContain('# Test Project');
87
+ });
88
+ it('should read specific line ranges', async () => {
89
+ const result = await readFile(path.join(testDir, 'multiline.txt'), {
90
+ lineRange: { start: 1, end: 5 },
91
+ });
92
+ expect(result.content).toContain('Line 1');
93
+ expect(result.content).toContain('Line 5');
94
+ expect(result.truncated).toBe(true);
95
+ });
96
+ it('should reject non-files', async () => {
97
+ await expect(readFile(testDir)).rejects.toThrow('Not a file');
98
+ });
99
+ });
100
+ describe('headFile', () => {
101
+ it('should return first N lines', async () => {
102
+ const content = await headFile(path.join(testDir, 'multiline.txt'), 5);
103
+ const lines = content.split('\n');
104
+ expect(lines[0]).toBe('Line 1');
105
+ expect(lines.length).toBeLessThanOrEqual(5);
106
+ });
107
+ });
108
+ describe('tailFile', () => {
109
+ it('should return last N lines', async () => {
110
+ const content = await tailFile(path.join(testDir, 'multiline.txt'), 5);
111
+ const lines = content.split('\n').filter((l) => l);
112
+ expect(lines[lines.length - 1]).toBe('Line 100');
113
+ });
114
+ });
115
+ describe('readMultipleFiles', () => {
116
+ it('should read multiple files in parallel', async () => {
117
+ const paths = [
118
+ path.join(testDir, 'README.md'),
119
+ path.join(testDir, 'src', 'index.ts'),
120
+ ];
121
+ const results = await readMultipleFiles(paths);
122
+ expect(results.length).toBe(2);
123
+ expect(results.every((r) => r.content !== undefined)).toBe(true);
124
+ });
125
+ it('should handle individual file errors gracefully', async () => {
126
+ const paths = [
127
+ path.join(testDir, 'README.md'),
128
+ path.join(testDir, 'non-existent.txt'),
129
+ ];
130
+ const results = await readMultipleFiles(paths);
131
+ expect(results.length).toBe(2);
132
+ expect(results[0]?.content).toBeDefined();
133
+ expect(results[1]?.error).toBeDefined();
134
+ });
135
+ });
136
+ describe('getFileInfo', () => {
137
+ it('should return file metadata', async () => {
138
+ const info = await getFileInfo(path.join(testDir, 'README.md'));
139
+ expect(info.name).toBe('README.md');
140
+ expect(info.type).toBe('file');
141
+ expect(info.size).toBeGreaterThan(0);
142
+ expect(info.created).toBeInstanceOf(Date);
143
+ });
144
+ it('should return directory metadata', async () => {
145
+ const info = await getFileInfo(testDir);
146
+ expect(info.type).toBe('directory');
147
+ });
148
+ });
149
+ describe('searchContent', () => {
150
+ it('should find content in files', async () => {
151
+ const result = await searchContent(testDir, 'hello');
152
+ expect(result.matches.length).toBeGreaterThan(0);
153
+ expect(result.matches[0]?.file).toContain('index.ts');
154
+ });
155
+ it('should search case-insensitively by default', async () => {
156
+ const result = await searchContent(testDir, 'HELLO');
157
+ expect(result.matches.length).toBeGreaterThan(0);
158
+ });
159
+ it('should respect case sensitivity when specified', async () => {
160
+ const result = await searchContent(testDir, 'HELLO', {
161
+ caseSensitive: true,
162
+ });
163
+ expect(result.matches.length).toBe(0);
164
+ });
165
+ it('should skip binary files by default', async () => {
166
+ const result = await searchContent(testDir, 'PNG');
167
+ // Should not find matches in binary file
168
+ expect(result.summary.skippedBinary).toBeGreaterThanOrEqual(0);
169
+ });
170
+ it('should respect file pattern filter', async () => {
171
+ const result = await searchContent(testDir, 'export', {
172
+ filePattern: '**/*.ts',
173
+ });
174
+ expect(result.matches.length).toBeGreaterThan(0);
175
+ expect(result.matches.every((m) => m.file.endsWith('.ts'))).toBe(true);
176
+ });
177
+ });
178
+ describe('analyzeDirectory', () => {
179
+ it('should analyze directory structure', async () => {
180
+ const result = await analyzeDirectory(testDir);
181
+ expect(result.analysis.totalFiles).toBeGreaterThan(0);
182
+ expect(result.analysis.totalDirectories).toBeGreaterThan(0);
183
+ expect(result.analysis.totalSize).toBeGreaterThan(0);
184
+ });
185
+ it('should list file types', async () => {
186
+ const result = await analyzeDirectory(testDir);
187
+ expect(Object.keys(result.analysis.fileTypes).length).toBeGreaterThan(0);
188
+ });
189
+ it('should track largest files', async () => {
190
+ const result = await analyzeDirectory(testDir, { topN: 5 });
191
+ expect(result.analysis.largestFiles.length).toBeLessThanOrEqual(5);
192
+ });
193
+ });
194
+ describe('getDirectoryTree', () => {
195
+ it('should return tree structure', async () => {
196
+ const result = await getDirectoryTree(testDir);
197
+ expect(result.tree.type).toBe('directory');
198
+ expect(result.tree.children).toBeDefined();
199
+ expect(result.tree.children?.length).toBeGreaterThan(0);
200
+ });
201
+ it('should respect maxDepth', async () => {
202
+ const result = await getDirectoryTree(testDir, { maxDepth: 1 });
203
+ expect(result.summary.maxDepthReached).toBeLessThanOrEqual(1);
204
+ });
205
+ it('should exclude patterns', async () => {
206
+ const result = await getDirectoryTree(testDir, {
207
+ excludePatterns: ['docs'],
208
+ });
209
+ const hasDocsDir = result.tree.children?.some((c) => c.name === 'docs');
210
+ expect(hasDocsDir).toBe(false);
211
+ });
212
+ it('should include sizes when specified', async () => {
213
+ const result = await getDirectoryTree(testDir, { includeSize: true });
214
+ const fileEntry = result.tree.children?.find((c) => c.type === 'file');
215
+ expect(fileEntry?.size).toBeDefined();
216
+ });
217
+ });
218
+ describe('readMediaFile', () => {
219
+ it('should read binary file as base64', async () => {
220
+ const result = await readMediaFile(path.join(testDir, 'image.png'));
221
+ expect(result.mimeType).toBe('image/png');
222
+ expect(result.data).toBeTruthy();
223
+ expect(result.size).toBeGreaterThan(0);
224
+ });
225
+ it('should reject files too large', async () => {
226
+ await expect(readMediaFile(path.join(testDir, 'image.png'), { maxSize: 1 })).rejects.toThrow('too large');
227
+ });
228
+ });
229
+ });
230
+ //# sourceMappingURL=file-operations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-operations.test.js","sourceRoot":"","sources":["../../src/__tests__/file-operations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/lib/errors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,156 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { classifyError, createDetailedError, ErrorCode, formatDetailedError, getSuggestion, McpError, } from '../../lib/errors.js';
3
+ describe('Error Utilities', () => {
4
+ describe('classifyError', () => {
5
+ it('should classify access denied errors', () => {
6
+ const error = new Error('Path not within allowed directories');
7
+ expect(classifyError(error)).toBe(ErrorCode.E_ACCESS_DENIED);
8
+ });
9
+ it('should classify not found errors', () => {
10
+ const error = new Error('ENOENT: no such file or directory');
11
+ expect(classifyError(error)).toBe(ErrorCode.E_NOT_FOUND);
12
+ });
13
+ it('should classify not a file errors', () => {
14
+ const error = new Error('Not a file: /some/path');
15
+ expect(classifyError(error)).toBe(ErrorCode.E_NOT_FILE);
16
+ });
17
+ it('should classify file too large errors', () => {
18
+ const error = new Error('File too large: 100MB');
19
+ expect(classifyError(error)).toBe(ErrorCode.E_TOO_LARGE);
20
+ });
21
+ it('should classify permission errors', () => {
22
+ const error = new Error('EACCES: permission denied');
23
+ expect(classifyError(error)).toBe(ErrorCode.E_PERMISSION_DENIED);
24
+ });
25
+ it('should classify timeout errors', () => {
26
+ const error = new Error('Operation timeout');
27
+ expect(classifyError(error)).toBe(ErrorCode.E_TIMEOUT);
28
+ });
29
+ it('should return unknown for unrecognized errors', () => {
30
+ const error = new Error('Some random error');
31
+ expect(classifyError(error)).toBe(ErrorCode.E_UNKNOWN);
32
+ });
33
+ it('should handle non-Error objects', () => {
34
+ expect(classifyError('ENOENT error')).toBe(ErrorCode.E_NOT_FOUND);
35
+ expect(classifyError({ message: 'permission denied' })).toBe(ErrorCode.E_UNKNOWN);
36
+ });
37
+ it('should classify Node.js EACCES error code', () => {
38
+ const error = Object.assign(new Error('permission denied'), {
39
+ code: 'EACCES',
40
+ });
41
+ expect(classifyError(error)).toBe(ErrorCode.E_PERMISSION_DENIED);
42
+ });
43
+ it('should classify Node.js EPERM error code', () => {
44
+ const error = Object.assign(new Error('operation not permitted'), {
45
+ code: 'EPERM',
46
+ });
47
+ expect(classifyError(error)).toBe(ErrorCode.E_PERMISSION_DENIED);
48
+ });
49
+ it('should classify Node.js EISDIR error code', () => {
50
+ const error = Object.assign(new Error('is a directory'), {
51
+ code: 'EISDIR',
52
+ });
53
+ expect(classifyError(error)).toBe(ErrorCode.E_NOT_FILE);
54
+ });
55
+ it('should classify Node.js ENOTDIR error code', () => {
56
+ const error = Object.assign(new Error('not a directory'), {
57
+ code: 'ENOTDIR',
58
+ });
59
+ expect(classifyError(error)).toBe(ErrorCode.E_NOT_DIRECTORY);
60
+ });
61
+ it('should classify Node.js ELOOP error code', () => {
62
+ const error = Object.assign(new Error('too many symbolic links'), {
63
+ code: 'ELOOP',
64
+ });
65
+ expect(classifyError(error)).toBe(ErrorCode.E_SYMLINK_NOT_ALLOWED);
66
+ });
67
+ it('should classify Node.js ETIMEDOUT error code', () => {
68
+ const error = Object.assign(new Error('operation timed out'), {
69
+ code: 'ETIMEDOUT',
70
+ });
71
+ expect(classifyError(error)).toBe(ErrorCode.E_TIMEOUT);
72
+ });
73
+ it('should classify McpError directly by its code', () => {
74
+ const error = new McpError(ErrorCode.E_TOO_LARGE, 'File too large', '/path/to/file');
75
+ expect(classifyError(error)).toBe(ErrorCode.E_TOO_LARGE);
76
+ });
77
+ });
78
+ describe('McpError', () => {
79
+ it('should create error with all properties', () => {
80
+ const error = new McpError(ErrorCode.E_ACCESS_DENIED, 'Access denied', '/some/path', { extra: 'detail' });
81
+ expect(error.code).toBe(ErrorCode.E_ACCESS_DENIED);
82
+ expect(error.message).toBe('Access denied');
83
+ expect(error.path).toBe('/some/path');
84
+ expect(error.details).toEqual({ extra: 'detail' });
85
+ expect(error.name).toBe('McpError');
86
+ });
87
+ it('should support cause chaining', () => {
88
+ const cause = new Error('Original error');
89
+ const error = new McpError(ErrorCode.E_NOT_FOUND, 'File not found', '/path', undefined, cause);
90
+ expect(error.cause).toBe(cause);
91
+ });
92
+ it('should be instanceof Error', () => {
93
+ const error = new McpError(ErrorCode.E_UNKNOWN, 'Test');
94
+ expect(error instanceof Error).toBe(true);
95
+ expect(error instanceof McpError).toBe(true);
96
+ });
97
+ it('should create from existing error with fromError', () => {
98
+ const original = new Error('Original');
99
+ original.stack = 'Original stack trace';
100
+ const mcpError = McpError.fromError(ErrorCode.E_NOT_FOUND, 'Wrapped error', original, '/path');
101
+ expect(mcpError.code).toBe(ErrorCode.E_NOT_FOUND);
102
+ expect(mcpError.cause).toBe(original);
103
+ expect(mcpError.stack).toContain('Caused by: Original stack trace');
104
+ });
105
+ });
106
+ describe('createDetailedError', () => {
107
+ it('should create detailed error object', () => {
108
+ const error = new Error('File not found');
109
+ const detailed = createDetailedError(error, '/some/path');
110
+ expect(detailed.code).toBe(ErrorCode.E_NOT_FOUND);
111
+ expect(detailed.message).toBe('File not found');
112
+ expect(detailed.path).toBe('/some/path');
113
+ expect(detailed.suggestion).toBeTruthy();
114
+ });
115
+ it('should include additional details', () => {
116
+ const error = new Error('Error');
117
+ const detailed = createDetailedError(error, '/path', { extra: 'info' });
118
+ expect(detailed.details).toEqual({ extra: 'info' });
119
+ });
120
+ });
121
+ describe('formatDetailedError', () => {
122
+ it('should format error for display', () => {
123
+ const detailed = {
124
+ code: ErrorCode.E_NOT_FOUND,
125
+ message: 'File not found',
126
+ path: '/some/path',
127
+ suggestion: 'Check the path exists',
128
+ };
129
+ const formatted = formatDetailedError(detailed);
130
+ expect(formatted).toContain('E_NOT_FOUND');
131
+ expect(formatted).toContain('File not found');
132
+ expect(formatted).toContain('/some/path');
133
+ expect(formatted).toContain('Check the path exists');
134
+ });
135
+ it('should handle missing optional fields', () => {
136
+ const detailed = {
137
+ code: ErrorCode.E_UNKNOWN,
138
+ message: 'Unknown error',
139
+ };
140
+ const formatted = formatDetailedError(detailed);
141
+ expect(formatted).toContain('E_UNKNOWN');
142
+ expect(formatted).toContain('Unknown error');
143
+ });
144
+ });
145
+ describe('getSuggestion', () => {
146
+ it('should return suggestions for all error codes', () => {
147
+ const errorCodes = Object.values(ErrorCode);
148
+ for (const code of errorCodes) {
149
+ const suggestion = getSuggestion(code);
150
+ expect(suggestion).toBeTruthy();
151
+ expect(typeof suggestion).toBe('string');
152
+ }
153
+ });
154
+ });
155
+ });
156
+ //# sourceMappingURL=errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../../src/__tests__/lib/errors.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-operations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-operations.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/lib/file-operations.test.ts"],"names":[],"mappings":""}