@getmikk/core 1.8.3 → 1.9.1

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 (42) hide show
  1. package/package.json +6 -4
  2. package/src/constants.ts +285 -0
  3. package/src/contract/contract-generator.ts +7 -0
  4. package/src/contract/index.ts +2 -3
  5. package/src/contract/lock-compiler.ts +66 -35
  6. package/src/contract/lock-reader.ts +30 -5
  7. package/src/contract/schema.ts +21 -0
  8. package/src/error-handler.ts +432 -0
  9. package/src/graph/cluster-detector.ts +52 -22
  10. package/src/graph/confidence-engine.ts +85 -0
  11. package/src/graph/graph-builder.ts +298 -255
  12. package/src/graph/impact-analyzer.ts +132 -119
  13. package/src/graph/index.ts +4 -0
  14. package/src/graph/memory-manager.ts +186 -0
  15. package/src/graph/query-engine.ts +76 -0
  16. package/src/graph/risk-engine.ts +86 -0
  17. package/src/graph/types.ts +89 -65
  18. package/src/index.ts +2 -0
  19. package/src/parser/change-detector.ts +99 -0
  20. package/src/parser/go/go-extractor.ts +18 -8
  21. package/src/parser/go/go-parser.ts +2 -0
  22. package/src/parser/index.ts +86 -36
  23. package/src/parser/javascript/js-extractor.ts +1 -1
  24. package/src/parser/javascript/js-parser.ts +2 -0
  25. package/src/parser/oxc-parser.ts +708 -0
  26. package/src/parser/oxc-resolver.ts +83 -0
  27. package/src/parser/tree-sitter/parser.ts +19 -10
  28. package/src/parser/types.ts +100 -73
  29. package/src/parser/typescript/ts-extractor.ts +229 -589
  30. package/src/parser/typescript/ts-parser.ts +16 -171
  31. package/src/parser/typescript/ts-resolver.ts +11 -1
  32. package/src/search/bm25.ts +16 -4
  33. package/src/utils/minimatch.ts +1 -1
  34. package/tests/contract.test.ts +2 -2
  35. package/tests/dead-code.test.ts +7 -7
  36. package/tests/esm-resolver.test.ts +75 -0
  37. package/tests/graph.test.ts +20 -20
  38. package/tests/helpers.ts +11 -6
  39. package/tests/impact-classified.test.ts +37 -41
  40. package/tests/parser.test.ts +7 -5
  41. package/tests/ts-parser.test.ts +27 -52
  42. package/test-output.txt +0 -373
package/test-output.txt DELETED
@@ -1,373 +0,0 @@
1
- bun test v1.3.5 (1e86cebd)
2
-
3
- tests\adr-manager.test.ts:
4
- (pass) AdrManager > lists decisions
5
- (pass) AdrManager > gets a decision by id
6
- (pass) AdrManager > adds a new decision
7
- (pass) AdrManager > fails to add if id already exists [15.00ms]
8
- (pass) AdrManager > updates an existing decision
9
- (pass) AdrManager > fails to update missing decision
10
- (pass) AdrManager > removes a decision
11
-
12
- tests\contract.test.ts:
13
- (pass) MikkContractSchema > validates correct mikk.json
14
- (pass) MikkContractSchema > rejects mikk.json with missing required fields
15
- (pass) MikkContractSchema > applies default overwrite mode
16
- (pass) LockCompiler > compiles a valid lock file
17
- (pass) LockCompiler > assigns functions to correct modules
18
- (pass) LockCompiler > computes stable module hash
19
- (pass) LockCompiler > validates against MikkLockSchema
20
- (pass) ContractGenerator > generates contract from clusters
21
-
22
- tests\dead-code.test.ts:
23
- (pass) DeadCodeDetector > detects uncalled functions
24
- (pass) DeadCodeDetector > exempts exported functions
25
- (pass) DeadCodeDetector > exempts entry point name patterns
26
- (pass) DeadCodeDetector > exempts functions called by exported functions in the same file
27
-
28
- tests\fs.test.ts:
29
- (pass) detectProjectLanguage > detects TypeScript from tsconfig.json
30
- (pass) detectProjectLanguage > detects Rust from Cargo.toml [15.00ms]
31
- (pass) detectProjectLanguage > detects Go from go.mod
32
- (pass) detectProjectLanguage > detects Python from pyproject.toml
33
- (pass) detectProjectLanguage > detects Python from requirements.txt
34
- (pass) detectProjectLanguage > detects Ruby from Gemfile
35
- (pass) detectProjectLanguage > detects Java from pom.xml [16.00ms]
36
- (pass) detectProjectLanguage > detects PHP from composer.json
37
- (pass) detectProjectLanguage > detects C# from .csproj file
38
- (pass) detectProjectLanguage > detects C# from .sln file
39
- (pass) detectProjectLanguage > detects JavaScript from package.json (no tsconfig)
40
- (pass) detectProjectLanguage > returns unknown for empty directory
41
- (pass) detectProjectLanguage > prioritises TypeScript over JavaScript
42
- (pass) getDiscoveryPatterns > returns patterns and ignore for typescript [15.00ms]
43
- (pass) getDiscoveryPatterns > returns patterns and ignore for javascript
44
- (pass) getDiscoveryPatterns > returns patterns and ignore for python
45
- (pass) getDiscoveryPatterns > returns patterns and ignore for go
46
- (pass) getDiscoveryPatterns > returns patterns and ignore for rust
47
- (pass) getDiscoveryPatterns > returns patterns and ignore for java
48
- (pass) getDiscoveryPatterns > returns patterns and ignore for ruby
49
- (pass) getDiscoveryPatterns > returns patterns and ignore for php
50
- (pass) getDiscoveryPatterns > returns patterns and ignore for csharp
51
- (pass) getDiscoveryPatterns > returns patterns and ignore for unknown
52
- (pass) getDiscoveryPatterns > typescript includes JS files too
53
- (pass) getDiscoveryPatterns > python patterns include .py
54
- (pass) getDiscoveryPatterns > all languages ignore .mikk and .git
55
- (pass) parseMikkIgnore > parses non-empty lines
56
- (pass) parseMikkIgnore > returns empty array for empty content
57
- (pass) parseMikkIgnore > strips comments and blank lines
58
- (pass) parseMikkIgnore > converts trailing-slash directories without path to **/ glob
59
- (pass) parseMikkIgnore > converts trailing-slash directories with path to ** glob
60
- (pass) parseMikkIgnore > handles bare file patterns without slash
61
-
62
- tests\fuzzy-match.test.ts:
63
- (pass) levenshtein > identical strings → 0
64
- (pass) levenshtein > empty vs non-empty
65
- (pass) levenshtein > single char difference
66
- (pass) levenshtein > completely different strings
67
- (pass) levenshtein > insertion
68
- (pass) splitCamelCase > camelCase
69
- (pass) splitCamelCase > PascalCase
70
- (pass) splitCamelCase > snake_case
71
- (pass) splitCamelCase > multiple words
72
- (pass) extractKeywords > removes stop words
73
- (pass) extractKeywords > lowercases everything
74
- (pass) scoreFunctions > exact name match scores highest
75
- (pass) scoreFunctions > keyword match works
76
- (pass) scoreFunctions > module match boosts score
77
- (pass) scoreFunctions > maxResults limits output
78
- (pass) findFuzzyMatches > finds similar names
79
- (pass) findFuzzyMatches > finds substring matches
80
- (pass) findFuzzyMatches > returns empty for very dissimilar terms
81
-
82
- tests\go-parser.test.ts:
83
- (pass) GoExtractor > function extraction > extracts top-level exported functions [16.00ms]
84
- (pass) GoExtractor > function extraction > extracts unexported top-level functions
85
- (pass) GoExtractor > function extraction > marks exported functions correctly
86
- (pass) GoExtractor > function extraction > does NOT include methods in extractFunctions()
87
- (pass) GoExtractor > function extraction > extracts purpose from leading comment
88
- (pass) GoExtractor > function extraction > extracts params with name and type
89
- (pass) GoExtractor > function extraction > extracts return type
90
- (pass) GoExtractor > function extraction > extracts function ID with correct format
91
- (pass) GoExtractor > function extraction > populates startLine and endLine
92
- (pass) GoExtractor > function extraction > extracts calls within function body
93
- (pass) GoExtractor > class extraction (structs) > extracts struct types as classes
94
- (pass) GoExtractor > class extraction (structs) > groups receiver methods into struct classes
95
- (pass) GoExtractor > class extraction (structs) > marks exported structs correctly
96
- (pass) GoExtractor > class extraction (structs) > method IDs use Receiver.Method format
97
- (pass) GoExtractor > class extraction (structs) > extracts purpose for structs
98
- (pass) GoExtractor > import extraction > extracts block imports
99
- (pass) GoExtractor > import extraction > extracts single-line imports
100
- (pass) GoExtractor > import extraction > uses last path segment as import name
101
- (pass) GoExtractor > export extraction > only exports uppercase identifiers
102
- (pass) GoExtractor > route detection > detects Gin routes with correct methods
103
- (pass) GoExtractor > route detection > extracts route paths correctly
104
- (pass) GoExtractor > route detection > routes have correct file and line
105
- (pass) GoExtractor > error handling extraction > detects "if err != nil" patterns
106
- (pass) GoParser > getSupportedExtensions returns .go
107
- 321 | })
108
- 322 |
109
- 323 | test('parse returns a well-formed ParsedFile', () => {
110
- 324 | const parser = new GoParser()
111
- 325 | const result = parser.parse('auth/service.go', SIMPLE_GO)
112
- 326 | expect(result.path).toBe('auth/service.go')
113
- ^
114
- error: expect(received).toBe(expected)
115
-
116
- Expected: "auth/service.go"
117
- Received: undefined
118
-
119
- at <anonymous> (C:\Users\Ansh\Desktop\web\Mesh\packages\core\tests\go-parser.test.ts:326:29)
120
- (fail) GoParser > parse returns a well-formed ParsedFile
121
- 336 |
122
- 337 | test('parse populates functions from a real Go service', () => {
123
- 338 | const parser = new GoParser()
124
- 339 | const result = parser.parse('auth/service.go', SIMPLE_GO)
125
- 340 | // Top-level funcs: hashPassword, keyFunc
126
- 341 | expect(result.functions.some(f => f.name === 'hashPassword')).toBe(true)
127
- ^
128
- TypeError: undefined is not an object (evaluating 'result.functions.some')
129
- at <anonymous> (C:\Users\Ansh\Desktop\web\Mesh\packages\core\tests\go-parser.test.ts:341:23)
130
- (fail) GoParser > parse populates functions from a real Go service
131
- 343 | })
132
- 344 |
133
- 345 | test('parse populates classes for structs with methods', () => {
134
- 346 | const parser = new GoParser()
135
- 347 | const result = parser.parse('auth/service.go', SIMPLE_GO)
136
- 348 | const authService = result.classes.find(c => c.name === 'AuthService')
137
- ^
138
- TypeError: undefined is not an object (evaluating 'new GoParser().parse("auth/service.go", SIMPLE_GO).classes.find')
139
- at <anonymous> (C:\Users\Ansh\Desktop\web\Mesh\packages\core\tests\go-parser.test.ts:348:36)
140
- (fail) GoParser > parse populates classes for structs with methods
141
- 351 | })
142
- 352 |
143
- 353 | test('parse detects routes in a Gin router file', () => {
144
- 354 | const parser = new GoParser()
145
- 355 | const result = parser.parse('api/routes.go', ROUTES_GO)
146
- 356 | expect(result.routes.length).toBeGreaterThanOrEqual(4)
147
- ^
148
- TypeError: undefined is not an object (evaluating 'result.routes.length')
149
- at <anonymous> (C:\Users\Ansh\Desktop\web\Mesh\packages\core\tests\go-parser.test.ts:356:23)
150
- (fail) GoParser > parse detects routes in a Gin router file
151
- 20 | this.modulePath = readModulePath(projectRoot)
152
- 21 | }
153
- 22 |
154
- 23 | /** Resolve a list of imports for a single file */
155
- 24 | resolveAll(imports: ParsedImport[]): ParsedImport[] {
156
- 25 | return imports.map(imp => this.resolve(imp))
157
- ^
158
- TypeError: undefined is not an object (evaluating 'imports.map')
159
- at resolveAll (C:\Users\Ansh\Desktop\web\Mesh\packages\core\src\parser\go\go-resolver.ts:25:16)
160
- at <anonymous> (C:\Users\Ansh\Desktop\web\Mesh\packages\core\src\parser\go\go-parser.ts:34:31)
161
- at map (1:11)
162
- at <anonymous> (C:\Users\Ansh\Desktop\web\Mesh\packages\core\tests\go-parser.test.ts:363:33)
163
- (fail) GoParser > resolveImports passes through without crashing on no go.mod
164
-
165
- tests\graph.test.ts:
166
- (pass) GraphBuilder > creates nodes for files
167
- (pass) GraphBuilder > creates nodes for functions
168
- (pass) GraphBuilder > creates edges for imports
169
- (pass) GraphBuilder > creates edges for function calls via imports
170
- (pass) GraphBuilder > creates containment edges
171
- (pass) GraphBuilder > builds adjacency maps
172
- (pass) ImpactAnalyzer > finds direct dependents
173
- (pass) ImpactAnalyzer > finds transitive dependents [16.00ms]
174
- (pass) ImpactAnalyzer > reports correct depth
175
- (pass) ImpactAnalyzer > assigns high confidence for small impacts
176
- (pass) ImpactAnalyzer > does not include changed nodes in impacted
177
- (pass) ClusterDetector > groups files by directory
178
- (pass) ClusterDetector > computes confidence scores
179
-
180
- tests\hash.test.ts:
181
- (pass) hashContent > produces consistent hashes
182
- (pass) hashContent > produces different hashes for different content
183
- (pass) hashContent > returns 64 character hex string (SHA-256)
184
- (pass) hashFunctionBody > hashes specific line range
185
- (pass) computeModuleHash > produces consistent hash regardless of input order
186
- (pass) computeModuleHash > changes when any file hash changes
187
- (pass) computeRootHash > produces consistent hash
188
-
189
- tests\impact-classified.test.ts:
190
- (pass) ImpactAnalyzer - Classified > classifies impacts based on depth and module boundaries
191
- (pass) ImpactAnalyzer - Classified > classifies same-module depth-1 impact as HIGH, not CRITICAL
192
-
193
- tests\js-parser.test.ts:
194
- (pass) JavaScriptExtractor > CommonJS require() imports > extracts plain require() as default import
195
- (pass) JavaScriptExtractor > CommonJS require() imports > extracts destructured require() as named imports
196
- (pass) JavaScriptExtractor > CommonJS require() imports > extracts relative require(./db)
197
- (pass) JavaScriptExtractor > CommonJS require() imports > does NOT capture require(variable) — dynamic require skipped
198
- (pass) JavaScriptExtractor > CommonJS require() imports > does NOT capture require.resolve() as an import
199
- (pass) JavaScriptExtractor > CommonJS module.exports = { } exports > module.exports = { foo, bar } marks names as exports
200
- (pass) JavaScriptExtractor > module.exports = function pattern > extracts named function expression from module.exports
201
- (pass) JavaScriptExtractor > module.exports = function pattern > extracted function has correct file and purpose
202
- (pass) JavaScriptExtractor > module.exports = function pattern > extracts params from module.exports function [16.00ms]
203
- (pass) JavaScriptExtractor > module.exports = function pattern > detects edge cases (early return guard)
204
- (pass) JavaScriptExtractor > exports.x = function pattern > extracts function assigned to exports.createUser
205
- (pass) JavaScriptExtractor > exports.x = function pattern > extracts async arrow function assigned to exports.deleteUser
206
- (pass) JavaScriptExtractor > exports.x = function pattern > exports.x appears in extractExports()
207
- (pass) JavaScriptExtractor > exports.x = function pattern > detects throw as error handling
208
- (pass) JavaScriptExtractor > module.exports = { inline functions } > exports names from object literal
209
- (pass) JavaScriptExtractor > ESM imports and exports > extracts static ESM imports
210
- (pass) JavaScriptExtractor > ESM imports and exports > extracts named ESM function export
211
- (pass) JavaScriptExtractor > ESM imports and exports > extracts arrow function export
212
- (pass) JavaScriptExtractor > ESM imports and exports > extracts export default function
213
- (pass) JavaScriptExtractor > JSX components > parses JSX without crashing
214
- (pass) JavaScriptExtractor > JSX components > extracts function component
215
- (pass) JavaScriptExtractor > JSX components > extracts arrow function component
216
- (pass) JavaScriptExtractor > JSX components > extracts purpose from comment above JSX component
217
- (pass) JavaScriptExtractor > JSX components > detects early-return edge case (if !user return null)
218
- (pass) JavaScriptExtractor > async functions > marks async functions correctly
219
- (pass) JavaScriptExtractor > Express route detection > detects GET route
220
- (pass) JavaScriptExtractor > Express route detection > detects POST route with middleware
221
- (pass) JavaScriptExtractor > Express route detection > detects DELETE route
222
- (pass) JavaScriptExtractor > edge cases > empty file parses without error and returns empty arrays
223
- (pass) JavaScriptExtractor > edge cases > comments-only file parses without error
224
- (pass) JavaScriptExtractor > edge cases > module.exports spread literal does not crash
225
- (pass) JavaScriptExtractor > edge cases > mixed ESM + CJS file captures both import and require
226
- (pass) JavaScriptExtractor > edge cases > mixed ESM + CJS: captures both ESM and CJS exports
227
- (pass) JavaScriptExtractor > edge cases > no duplicate imports when same source appears in both ESM and CJS
228
- (pass) JavaScriptExtractor > edge cases > no duplicate exports when CJS and ESM both declare same name
229
- (pass) JavaScriptExtractor > edge cases > malformed code gracefully degrades without crashing
230
- (pass) JavaScriptParser > getSupportedExtensions includes .js .mjs .cjs .jsx
231
- (pass) JavaScriptParser > parse returns language: javascript [16.00ms]
232
- (pass) JavaScriptParser > parse includes hash and parsedAt
233
- (pass) JavaScriptParser > CJS-exported functions are marked isExported via cross-reference
234
- (pass) JavaScriptParser > resolveImports resolves relative paths with .js extension probing
235
- (pass) JavaScriptParser > resolveImports leaves external packages unresolved (empty resolvedPath)
236
- (pass) JavaScriptParser > parse .jsx file language is javascript
237
- (pass) JavaScriptResolver > resolves relative import with .js extension
238
- (pass) JavaScriptResolver > resolves relative import with /index.js fallback
239
- (pass) JavaScriptResolver > falls back to .ts for mixed TS/JS project
240
- (pass) JavaScriptResolver > leaves external packages unresolved
241
- (pass) JavaScriptResolver > resolves with no known files list (defaults to .js suffix)
242
- (pass) JavaScriptResolver > source with existing .js extension returned as-is
243
- (pass) JavaScriptResolver > resolves path alias when aliases provided
244
- (pass) JavaScriptResolver > resolveAll resolves all imports in a list
245
- (pass) getParser — JS extensions > returns JavaScriptParser for .js
246
- (pass) getParser — JS extensions > returns JavaScriptParser for .mjs
247
- (pass) getParser — JS extensions > returns JavaScriptParser for .cjs
248
- (pass) getParser — JS extensions > returns JavaScriptParser for .jsx
249
- (pass) getParser — JS extensions > still returns TypeScriptParser for .ts
250
- 624 | const p = getParser('src/index.ts')
251
- 625 | expect(p.getSupportedExtensions()).toContain('.ts')
252
- 626 | })
253
- 627 |
254
- 628 | test('still throws UnsupportedLanguageError for .py', () => {
255
- 629 | expect(() => getParser('src/app.py')).toThrow()
256
- ^
257
- error: expect(received).toThrow()
258
-
259
- Received function did not throw
260
- Received value: TreeSitterParser {
261
- parser: null,
262
- languages: Map {},
263
- getSupportedExtensions: [Function: getSupportedExtensions],
264
- init: [AsyncFunction: init],
265
- parse: [AsyncFunction: parse],
266
- resolveImports: [Function: resolveImports],
267
- buildEmptyFile: [Function: buildEmptyFile],
268
- loadLang: [AsyncFunction: loadLang],
269
- getLanguageConfig: [AsyncFunction: getLanguageConfig],
270
- }
271
-
272
- at <anonymous> (C:\Users\Ansh\Desktop\web\Mesh\packages\core\tests\js-parser.test.ts:629:47)
273
- (fail) getParser — JS extensions > still throws UnsupportedLanguageError for .py
274
-
275
- tests\parser.test.ts:
276
- (pass) TypeScriptExtractor > extracts function declarations
277
- (pass) TypeScriptExtractor > extracts arrow functions assigned to const
278
- (pass) TypeScriptExtractor > extracts async functions
279
- (pass) TypeScriptExtractor > extracts call expressions from function bodies
280
- (pass) TypeScriptExtractor > extracts imports
281
- (pass) TypeScriptExtractor > extracts named exports
282
- (pass) TypeScriptExtractor > extracts classes with methods
283
- (pass) TypeScriptExtractor > skips type-only imports
284
- (pass) TypeScriptExtractor > handles optional parameters
285
- (pass) TypeScriptExtractor > handles default parameter values
286
- 134 | describe('TypeScriptParser', () => {
287
- 135 | const parser = new TypeScriptParser()
288
- 136 |
289
- 137 | it('returns correct language', () => {
290
- 138 | const result = parser.parse('src/test.ts', 'const x = 1')
291
- 139 | expect(result.language).toBe('typescript')
292
- ^
293
- error: expect(received).toBe(expected)
294
-
295
- Expected: "typescript"
296
- Received: undefined
297
-
298
- at <anonymous> (C:\Users\Ansh\Desktop\web\Mesh\packages\core\tests\parser.test.ts:139:33)
299
- (fail) TypeScriptParser > returns correct language
300
- 144 | import { jwtDecode } from '../utils/jwt'
301
- 145 | export function verifyToken(token: string): boolean {
302
- 146 | return jwtDecode(token).exp > Date.now()
303
- 147 | }
304
- 148 | `)
305
- 149 | expect(result.functions).toHaveLength(1)
306
- ^
307
- error: Received value does not have a length property: undefined
308
- at <anonymous> (C:\Users\Ansh\Desktop\web\Mesh\packages\core\tests\parser.test.ts:149:34)
309
- (fail) TypeScriptParser > parses a complete file
310
- (pass) TypeScriptParser > supports .tsx extension
311
- (pass) TypeScriptResolver > resolves relative imports
312
- (pass) TypeScriptResolver > resolves path aliases
313
- (pass) TypeScriptResolver > skips external packages
314
- (pass) TypeScriptResolver > handles index files
315
- (pass) getParser > returns TypeScriptParser for .ts files
316
- (pass) getParser > returns TypeScriptParser for .tsx files
317
- 211 | const parser = getParser('src/App.tsx')
318
- 212 | expect(parser).toBeInstanceOf(TypeScriptParser)
319
- 213 | })
320
- 214 |
321
- 215 | it('throws for unsupported extensions', () => {
322
- 216 | expect(() => getParser('src/auth.rb')).toThrow(UnsupportedLanguageError)
323
- ^
324
- error: expect(received).toThrow(expected)
325
-
326
- Expected constructor: UnsupportedLanguageError
327
-
328
- Received function did not throw
329
- Received value: TreeSitterParser {
330
- parser: null,
331
- languages: Map {},
332
- getSupportedExtensions: [Function: getSupportedExtensions],
333
- init: [AsyncFunction: init],
334
- parse: [AsyncFunction: parse],
335
- resolveImports: [Function: resolveImports],
336
- buildEmptyFile: [Function: buildEmptyFile],
337
- loadLang: [AsyncFunction: loadLang],
338
- getLanguageConfig: [AsyncFunction: getLanguageConfig],
339
- }
340
-
341
- at <anonymous> (C:\Users\Ansh\Desktop\web\Mesh\packages\core\tests\parser.test.ts:216:48)
342
- (fail) getParser > throws for unsupported extensions [16.00ms]
343
-
344
- tests\tree-sitter-parser.test.ts:
345
- (pass) TreeSitterParser > parses Python correctly [62.00ms]
346
- (pass) TreeSitterParser > parses Java correctly
347
- (pass) TreeSitterParser > parses Go correctly [16.00ms]
348
- (pass) TreeSitterParser > handles empty files gracefully [16.00ms]
349
- (pass) TreeSitterParser > handles syntax errors in Python code gracefully [15.00ms]
350
- (pass) TreeSitterParser > handles unsupported extensions gracefully
351
- (pass) TreeSitterParser > handles syntax errors in Java gracefully
352
-
353
- tests\ts-parser.test.ts:
354
- (pass) ts-parser config "extends" resolution > recursively merges compiler paths from extended configs
355
- (pass) TypeScriptParser Edge Cases & Fault Tolerance > handles completely empty files [16.00ms]
356
- (pass) TypeScriptParser Edge Cases & Fault Tolerance > gracefully degrades on severe syntax errors
357
- (pass) TypeScriptParser Edge Cases & Fault Tolerance > handles files with only comments
358
-
359
- 9 tests failed:
360
- (fail) GoParser > parse returns a well-formed ParsedFile
361
- (fail) GoParser > parse populates functions from a real Go service
362
- (fail) GoParser > parse populates classes for structs with methods
363
- (fail) GoParser > parse detects routes in a Gin router file
364
- (fail) GoParser > resolveImports passes through without crashing on no go.mod
365
- (fail) getParser — JS extensions > still throws UnsupportedLanguageError for .py
366
- (fail) TypeScriptParser > returns correct language
367
- (fail) TypeScriptParser > parses a complete file
368
- (fail) getParser > throws for unsupported extensions [16.00ms]
369
-
370
- 199 pass
371
- 9 fail
372
- 457 expect() calls
373
- Ran 208 tests across 13 files. [769.00ms]