@aiready/core 0.9.4 → 0.9.5
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.
- package/dist/__tests__/parser-factory.test.d.ts +5 -0
- package/dist/__tests__/parser-factory.test.d.ts.map +1 -0
- package/dist/__tests__/parser-factory.test.js +58 -0
- package/dist/__tests__/parser-factory.test.js.map +1 -0
- package/dist/__tests__/python-parser.test.d.ts +5 -0
- package/dist/__tests__/python-parser.test.d.ts.map +1 -0
- package/dist/__tests__/python-parser.test.js +192 -0
- package/dist/__tests__/python-parser.test.js.map +1 -0
- package/dist/__tests__/scoring.test.d.ts +2 -0
- package/dist/__tests__/scoring.test.d.ts.map +1 -0
- package/dist/__tests__/scoring.test.js +180 -0
- package/dist/__tests__/scoring.test.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/parser-factory.d.ts +69 -0
- package/dist/parsers/parser-factory.d.ts.map +1 -0
- package/dist/parsers/parser-factory.js +114 -0
- package/dist/parsers/parser-factory.js.map +1 -0
- package/dist/parsers/python-parser.d.ts +42 -0
- package/dist/parsers/python-parser.d.ts.map +1 -0
- package/dist/parsers/python-parser.js +241 -0
- package/dist/parsers/python-parser.js.map +1 -0
- package/dist/parsers/typescript-parser.d.ts +17 -0
- package/dist/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/parsers/typescript-parser.js +216 -0
- package/dist/parsers/typescript-parser.js.map +1 -0
- package/dist/scoring.d.ts +110 -0
- package/dist/scoring.d.ts.map +1 -0
- package/dist/scoring.js +195 -0
- package/dist/scoring.js.map +1 -0
- package/dist/types/language.d.ts +161 -0
- package/dist/types/language.d.ts.map +1 -0
- package/dist/types/language.js +45 -0
- package/dist/types/language.js.map +1 -0
- package/dist/types.d.ts +104 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/ast-parser.d.ts +50 -0
- package/dist/utils/ast-parser.d.ts.map +1 -0
- package/dist/utils/ast-parser.js +216 -0
- package/dist/utils/ast-parser.js.map +1 -0
- package/dist/utils/cli-helpers.d.ts +37 -0
- package/dist/utils/cli-helpers.d.ts.map +1 -0
- package/dist/utils/cli-helpers.js +76 -0
- package/dist/utils/cli-helpers.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +82 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/file-scanner.d.ts +16 -0
- package/dist/utils/file-scanner.d.ts.map +1 -0
- package/dist/utils/file-scanner.js +100 -0
- package/dist/utils/file-scanner.js.map +1 -0
- package/dist/utils/metrics.d.ts +6 -0
- package/dist/utils/metrics.d.ts.map +1 -0
- package/dist/utils/metrics.js +8 -0
- package/dist/utils/metrics.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-factory.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/parser-factory.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test multi-language parser factory
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { ParserFactory, Language, getParser, isFileSupported, getSupportedLanguages, } from '../parsers/parser-factory';
|
|
6
|
+
describe('ParserFactory', () => {
|
|
7
|
+
it('should return TypeScript parser for .ts files', () => {
|
|
8
|
+
const parser = getParser('test.ts');
|
|
9
|
+
expect(parser).toBeDefined();
|
|
10
|
+
expect(parser?.language).toBe(Language.TypeScript);
|
|
11
|
+
});
|
|
12
|
+
it('should return TypeScript parser for .tsx files', () => {
|
|
13
|
+
const parser = getParser('component.tsx');
|
|
14
|
+
expect(parser).toBeDefined();
|
|
15
|
+
expect(parser?.language).toBe(Language.TypeScript);
|
|
16
|
+
});
|
|
17
|
+
it('should return JavaScript parser for .js files', () => {
|
|
18
|
+
const parser = getParser('script.js');
|
|
19
|
+
expect(parser).toBeDefined();
|
|
20
|
+
expect(parser?.language).toBe(Language.TypeScript); // TS parser handles JS too
|
|
21
|
+
});
|
|
22
|
+
it('should return Python parser for .py files', () => {
|
|
23
|
+
const parser = getParser('script.py');
|
|
24
|
+
expect(parser).toBeDefined();
|
|
25
|
+
expect(parser?.language).toBe(Language.Python);
|
|
26
|
+
});
|
|
27
|
+
it('should return null for unsupported files', () => {
|
|
28
|
+
const parser = getParser('README.md');
|
|
29
|
+
expect(parser).toBeNull();
|
|
30
|
+
});
|
|
31
|
+
it('should correctly identify supported files', () => {
|
|
32
|
+
expect(isFileSupported('test.ts')).toBe(true);
|
|
33
|
+
expect(isFileSupported('test.py')).toBe(true);
|
|
34
|
+
expect(isFileSupported('test.java')).toBe(false); // Not yet implemented
|
|
35
|
+
expect(isFileSupported('README.md')).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
it('should list all supported languages', () => {
|
|
38
|
+
const languages = getSupportedLanguages();
|
|
39
|
+
expect(languages).toContain(Language.TypeScript);
|
|
40
|
+
expect(languages).toContain(Language.Python);
|
|
41
|
+
expect(languages.length).toBeGreaterThanOrEqual(2);
|
|
42
|
+
});
|
|
43
|
+
it('should be case-insensitive for extensions', () => {
|
|
44
|
+
expect(getParser('Test.TS')).toBeDefined();
|
|
45
|
+
expect(getParser('Test.PY')).toBeDefined();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('Language Detection', () => {
|
|
49
|
+
it('should detect language from file path', () => {
|
|
50
|
+
const factory = ParserFactory.getInstance();
|
|
51
|
+
expect(factory.getLanguageForFile('src/index.ts')).toBe(Language.TypeScript);
|
|
52
|
+
expect(factory.getLanguageForFile('src/component.tsx')).toBe(Language.TypeScript);
|
|
53
|
+
expect(factory.getLanguageForFile('src/script.js')).toBe(Language.JavaScript);
|
|
54
|
+
expect(factory.getLanguageForFile('src/main.py')).toBe(Language.Python);
|
|
55
|
+
expect(factory.getLanguageForFile('README.md')).toBeNull();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=parser-factory.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-factory.test.js","sourceRoot":"","sources":["../../src/__tests__/parser-factory.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-parser.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/python-parser.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Python parser
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { PythonParser } from '../parsers/python-parser';
|
|
6
|
+
import { Language } from '../types/language';
|
|
7
|
+
describe('PythonParser', () => {
|
|
8
|
+
const parser = new PythonParser();
|
|
9
|
+
it('should have correct language and extensions', () => {
|
|
10
|
+
expect(parser.language).toBe(Language.Python);
|
|
11
|
+
expect(parser.extensions).toContain('.py');
|
|
12
|
+
});
|
|
13
|
+
it('should handle .py files', () => {
|
|
14
|
+
expect(parser.canHandle('test.py')).toBe(true);
|
|
15
|
+
expect(parser.canHandle('Test.PY')).toBe(true);
|
|
16
|
+
expect(parser.canHandle('test.ts')).toBe(false);
|
|
17
|
+
});
|
|
18
|
+
it('should return PEP 8 naming conventions', () => {
|
|
19
|
+
const conventions = parser.getNamingConventions();
|
|
20
|
+
// Variables and functions should be snake_case
|
|
21
|
+
expect(conventions.variablePattern.test('my_variable')).toBe(true);
|
|
22
|
+
expect(conventions.variablePattern.test('myVariable')).toBe(false);
|
|
23
|
+
expect(conventions.functionPattern.test('my_function')).toBe(true);
|
|
24
|
+
// Classes should be PascalCase
|
|
25
|
+
expect(conventions.classPattern.test('MyClass')).toBe(true);
|
|
26
|
+
expect(conventions.classPattern.test('my_class')).toBe(false);
|
|
27
|
+
// Constants should be UPPER_CASE
|
|
28
|
+
expect(conventions.constantPattern.test('MY_CONSTANT')).toBe(true);
|
|
29
|
+
expect(conventions.constantPattern.test('myConstant')).toBe(false);
|
|
30
|
+
// Should have Python special method exceptions
|
|
31
|
+
expect(conventions.exceptions).toContain('__init__');
|
|
32
|
+
expect(conventions.exceptions).toContain('__str__');
|
|
33
|
+
});
|
|
34
|
+
describe('Import Extraction', () => {
|
|
35
|
+
it('should extract simple imports', () => {
|
|
36
|
+
const code = `
|
|
37
|
+
import os
|
|
38
|
+
import sys
|
|
39
|
+
import json
|
|
40
|
+
`;
|
|
41
|
+
const result = parser.parse(code, 'test.py');
|
|
42
|
+
expect(result.imports).toHaveLength(3);
|
|
43
|
+
expect(result.imports[0].source).toBe('os');
|
|
44
|
+
expect(result.imports[1].source).toBe('sys');
|
|
45
|
+
expect(result.imports[2].source).toBe('json');
|
|
46
|
+
});
|
|
47
|
+
it('should extract from imports', () => {
|
|
48
|
+
const code = `
|
|
49
|
+
from typing import List, Dict, Optional
|
|
50
|
+
from pathlib import Path
|
|
51
|
+
`;
|
|
52
|
+
const result = parser.parse(code, 'test.py');
|
|
53
|
+
expect(result.imports).toHaveLength(2);
|
|
54
|
+
const typingImport = result.imports.find(i => i.source === 'typing');
|
|
55
|
+
expect(typingImport).toBeDefined();
|
|
56
|
+
expect(typingImport?.specifiers).toContain('List');
|
|
57
|
+
expect(typingImport?.specifiers).toContain('Dict');
|
|
58
|
+
expect(typingImport?.specifiers).toContain('Optional');
|
|
59
|
+
const pathlibImport = result.imports.find(i => i.source === 'pathlib');
|
|
60
|
+
expect(pathlibImport?.specifiers).toContain('Path');
|
|
61
|
+
});
|
|
62
|
+
it('should handle wildcard imports', () => {
|
|
63
|
+
const code = `from os import *`;
|
|
64
|
+
const result = parser.parse(code, 'test.py');
|
|
65
|
+
expect(result.imports[0].source).toBe('os');
|
|
66
|
+
expect(result.imports[0].specifiers).toContain('*');
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('Export Extraction', () => {
|
|
70
|
+
it('should extract module-level functions', () => {
|
|
71
|
+
const code = `
|
|
72
|
+
def public_function():
|
|
73
|
+
pass
|
|
74
|
+
|
|
75
|
+
def another_function(arg1, arg2):
|
|
76
|
+
return arg1 + arg2
|
|
77
|
+
`;
|
|
78
|
+
const result = parser.parse(code, 'test.py');
|
|
79
|
+
const funcNames = result.exports.map(e => e.name);
|
|
80
|
+
expect(funcNames).toContain('public_function');
|
|
81
|
+
expect(funcNames).toContain('another_function');
|
|
82
|
+
});
|
|
83
|
+
it('should extract classes', () => {
|
|
84
|
+
const code = `
|
|
85
|
+
class MyClass:
|
|
86
|
+
def __init__(self):
|
|
87
|
+
self.value = 0
|
|
88
|
+
|
|
89
|
+
def method(self):
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
class AnotherClass:
|
|
93
|
+
pass
|
|
94
|
+
`;
|
|
95
|
+
const result = parser.parse(code, 'test.py');
|
|
96
|
+
const classNames = result.exports.filter(e => e.type === 'class').map(e => e.name);
|
|
97
|
+
expect(classNames).toContain('MyClass');
|
|
98
|
+
expect(classNames).toContain('AnotherClass');
|
|
99
|
+
// Methods should not be exported as separate entities
|
|
100
|
+
const methodNames = result.exports.map(e => e.name);
|
|
101
|
+
expect(methodNames).not.toContain('method');
|
|
102
|
+
});
|
|
103
|
+
it('should not export private functions', () => {
|
|
104
|
+
const code = `
|
|
105
|
+
def public_function():
|
|
106
|
+
pass
|
|
107
|
+
|
|
108
|
+
def _private_function():
|
|
109
|
+
pass
|
|
110
|
+
|
|
111
|
+
def __dunder_function__():
|
|
112
|
+
pass
|
|
113
|
+
`;
|
|
114
|
+
const result = parser.parse(code, 'test.py');
|
|
115
|
+
const funcNames = result.exports.map(e => e.name);
|
|
116
|
+
expect(funcNames).toContain('public_function');
|
|
117
|
+
expect(funcNames).toContain('__dunder_function__'); // Dunder methods are included
|
|
118
|
+
expect(funcNames).not.toContain('_private_function'); // Single underscore excluded
|
|
119
|
+
});
|
|
120
|
+
it('should extract __all__ exports', () => {
|
|
121
|
+
const code = `
|
|
122
|
+
__all__ = ['foo', 'bar', 'MyClass']
|
|
123
|
+
|
|
124
|
+
def foo():
|
|
125
|
+
pass
|
|
126
|
+
|
|
127
|
+
def bar():
|
|
128
|
+
pass
|
|
129
|
+
|
|
130
|
+
class MyClass:
|
|
131
|
+
pass
|
|
132
|
+
`;
|
|
133
|
+
const result = parser.parse(code, 'test.py');
|
|
134
|
+
const names = result.exports.map(e => e.name);
|
|
135
|
+
expect(names).toContain('foo');
|
|
136
|
+
expect(names).toContain('bar');
|
|
137
|
+
expect(names).toContain('MyClass');
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
it('should include warning about regex-based parsing', () => {
|
|
141
|
+
const code = 'import os';
|
|
142
|
+
const result = parser.parse(code, 'test.py');
|
|
143
|
+
expect(result.warnings).toBeDefined();
|
|
144
|
+
expect(result.warnings.length).toBeGreaterThan(0);
|
|
145
|
+
expect(result.warnings[0]).toContain('regex-based');
|
|
146
|
+
});
|
|
147
|
+
it('should parse real-world Python code', () => {
|
|
148
|
+
const code = `
|
|
149
|
+
"""
|
|
150
|
+
A sample Python module
|
|
151
|
+
"""
|
|
152
|
+
from typing import List, Optional
|
|
153
|
+
import os
|
|
154
|
+
import sys
|
|
155
|
+
|
|
156
|
+
__all__ = ['process_data', 'DataProcessor']
|
|
157
|
+
|
|
158
|
+
class DataProcessor:
|
|
159
|
+
"""Process data"""
|
|
160
|
+
|
|
161
|
+
def __init__(self, config: dict):
|
|
162
|
+
self.config = config
|
|
163
|
+
|
|
164
|
+
def process(self, data: List[str]) -> List[str]:
|
|
165
|
+
return [item.upper() for item in data]
|
|
166
|
+
|
|
167
|
+
def process_data(items: List[str]) -> Optional[List[str]]:
|
|
168
|
+
"""Process a list of items"""
|
|
169
|
+
if not items:
|
|
170
|
+
return None
|
|
171
|
+
return [item.strip() for item in items]
|
|
172
|
+
|
|
173
|
+
def _helper_function():
|
|
174
|
+
"""Private helper"""
|
|
175
|
+
pass
|
|
176
|
+
|
|
177
|
+
MY_CONSTANT = 42
|
|
178
|
+
`;
|
|
179
|
+
const result = parser.parse(code, 'example.py');
|
|
180
|
+
// Check imports
|
|
181
|
+
expect(result.imports.length).toBeGreaterThan(0);
|
|
182
|
+
const typingImport = result.imports.find(i => i.source === 'typing');
|
|
183
|
+
expect(typingImport).toBeDefined();
|
|
184
|
+
// Check exports
|
|
185
|
+
const exportNames = result.exports.map(e => e.name);
|
|
186
|
+
expect(exportNames).toContain('DataProcessor');
|
|
187
|
+
expect(exportNames).toContain('process_data');
|
|
188
|
+
expect(exportNames).not.toContain('_helper_function');
|
|
189
|
+
expect(exportNames).not.toContain('process'); // Method, not module-level
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=python-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-parser.test.js","sourceRoot":"","sources":["../../src/__tests__/python-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scoring.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { calculateOverallScore, getRating, parseWeightString, normalizeToolName, getToolWeight, DEFAULT_TOOL_WEIGHTS, } from '../scoring';
|
|
3
|
+
describe('Core Scoring Infrastructure', () => {
|
|
4
|
+
describe('calculateOverallScore', () => {
|
|
5
|
+
it('should calculate weighted average correctly', () => {
|
|
6
|
+
const toolOutputs = new Map([
|
|
7
|
+
[
|
|
8
|
+
'pattern-detect',
|
|
9
|
+
{
|
|
10
|
+
toolName: 'pattern-detect',
|
|
11
|
+
score: 80,
|
|
12
|
+
rawMetrics: {},
|
|
13
|
+
factors: [],
|
|
14
|
+
recommendations: [],
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
[
|
|
18
|
+
'context-analyzer',
|
|
19
|
+
{
|
|
20
|
+
toolName: 'context-analyzer',
|
|
21
|
+
score: 60,
|
|
22
|
+
rawMetrics: {},
|
|
23
|
+
factors: [],
|
|
24
|
+
recommendations: [],
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
]);
|
|
28
|
+
// Default weights: pattern-detect=40, context-analyzer=35
|
|
29
|
+
// (80 * 40 + 60 * 35) / (40 + 35) = (3200 + 2100) / 75 = 5300 / 75 = 70.67 → 71
|
|
30
|
+
const result = calculateOverallScore(toolOutputs);
|
|
31
|
+
expect(result.overall).toBe(71);
|
|
32
|
+
expect(result.rating).toBe('Fair'); // 71 is in Fair range (60-74)
|
|
33
|
+
expect(result.toolsUsed).toEqual(['pattern-detect', 'context-analyzer']);
|
|
34
|
+
expect(result.breakdown).toHaveLength(2);
|
|
35
|
+
});
|
|
36
|
+
it('should apply CLI weight overrides', () => {
|
|
37
|
+
const toolOutputs = new Map([
|
|
38
|
+
[
|
|
39
|
+
'pattern-detect',
|
|
40
|
+
{
|
|
41
|
+
toolName: 'pattern-detect',
|
|
42
|
+
score: 80,
|
|
43
|
+
rawMetrics: {},
|
|
44
|
+
factors: [],
|
|
45
|
+
recommendations: [],
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
[
|
|
49
|
+
'context-analyzer',
|
|
50
|
+
{
|
|
51
|
+
toolName: 'context-analyzer',
|
|
52
|
+
score: 60,
|
|
53
|
+
rawMetrics: {},
|
|
54
|
+
factors: [],
|
|
55
|
+
recommendations: [],
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
]);
|
|
59
|
+
const cliWeights = new Map([
|
|
60
|
+
['pattern-detect', 50],
|
|
61
|
+
['context-analyzer', 50],
|
|
62
|
+
]);
|
|
63
|
+
// Equal weights: (80 * 50 + 60 * 50) / 100 = 7000 / 100 = 70
|
|
64
|
+
const result = calculateOverallScore(toolOutputs, undefined, cliWeights);
|
|
65
|
+
expect(result.overall).toBe(70);
|
|
66
|
+
expect(result.calculation.weights['pattern-detect']).toBe(50);
|
|
67
|
+
expect(result.calculation.weights['context-analyzer']).toBe(50);
|
|
68
|
+
});
|
|
69
|
+
it('should handle single tool scoring', () => {
|
|
70
|
+
const toolOutputs = new Map([
|
|
71
|
+
[
|
|
72
|
+
'pattern-detect',
|
|
73
|
+
{
|
|
74
|
+
toolName: 'pattern-detect',
|
|
75
|
+
score: 85,
|
|
76
|
+
rawMetrics: {},
|
|
77
|
+
factors: [],
|
|
78
|
+
recommendations: [],
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
]);
|
|
82
|
+
const result = calculateOverallScore(toolOutputs);
|
|
83
|
+
expect(result.overall).toBe(85);
|
|
84
|
+
expect(result.toolsUsed).toEqual(['pattern-detect']);
|
|
85
|
+
});
|
|
86
|
+
it('should apply config weights when no CLI override', () => {
|
|
87
|
+
const toolOutputs = new Map([
|
|
88
|
+
[
|
|
89
|
+
'pattern-detect',
|
|
90
|
+
{
|
|
91
|
+
toolName: 'pattern-detect',
|
|
92
|
+
score: 90,
|
|
93
|
+
rawMetrics: {},
|
|
94
|
+
factors: [],
|
|
95
|
+
recommendations: [],
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
]);
|
|
99
|
+
const config = {
|
|
100
|
+
tools: {
|
|
101
|
+
'pattern-detect': {
|
|
102
|
+
scoreWeight: 60,
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
const result = calculateOverallScore(toolOutputs, config);
|
|
107
|
+
expect(result.overall).toBe(90);
|
|
108
|
+
expect(result.calculation.weights['pattern-detect']).toBe(60);
|
|
109
|
+
});
|
|
110
|
+
it('should throw error when no tool outputs provided', () => {
|
|
111
|
+
const toolOutputs = new Map();
|
|
112
|
+
expect(() => calculateOverallScore(toolOutputs)).toThrow('No tool outputs provided for scoring');
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('getRating', () => {
|
|
116
|
+
it('should return correct ratings for score ranges', () => {
|
|
117
|
+
expect(getRating(100)).toBe('Excellent');
|
|
118
|
+
expect(getRating(90)).toBe('Excellent');
|
|
119
|
+
expect(getRating(89)).toBe('Good');
|
|
120
|
+
expect(getRating(75)).toBe('Good');
|
|
121
|
+
expect(getRating(74)).toBe('Fair');
|
|
122
|
+
expect(getRating(60)).toBe('Fair');
|
|
123
|
+
expect(getRating(59)).toBe('Needs Work');
|
|
124
|
+
expect(getRating(40)).toBe('Needs Work');
|
|
125
|
+
expect(getRating(39)).toBe('Critical');
|
|
126
|
+
expect(getRating(0)).toBe('Critical');
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe('parseWeightString', () => {
|
|
130
|
+
it('should parse valid weight string', () => {
|
|
131
|
+
const weights = parseWeightString('patterns:50,context:30,consistency:20');
|
|
132
|
+
expect(weights.get('pattern-detect')).toBe(50);
|
|
133
|
+
expect(weights.get('context-analyzer')).toBe(30);
|
|
134
|
+
expect(weights.get('consistency')).toBe(20);
|
|
135
|
+
});
|
|
136
|
+
it('should return empty map for undefined input', () => {
|
|
137
|
+
const weights = parseWeightString(undefined);
|
|
138
|
+
expect(weights.size).toBe(0);
|
|
139
|
+
});
|
|
140
|
+
it('should skip invalid pairs', () => {
|
|
141
|
+
const weights = parseWeightString('patterns:50,invalid,context:abc,consistency:30');
|
|
142
|
+
expect(weights.get('pattern-detect')).toBe(50);
|
|
143
|
+
expect(weights.get('context-analyzer')).toBeUndefined();
|
|
144
|
+
expect(weights.get('consistency')).toBe(30);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe('normalizeToolName', () => {
|
|
148
|
+
it('should normalize shorthand tool names', () => {
|
|
149
|
+
expect(normalizeToolName('patterns')).toBe('pattern-detect');
|
|
150
|
+
expect(normalizeToolName('context')).toBe('context-analyzer');
|
|
151
|
+
expect(normalizeToolName('consistency')).toBe('consistency');
|
|
152
|
+
});
|
|
153
|
+
it('should return full names unchanged', () => {
|
|
154
|
+
expect(normalizeToolName('pattern-detect')).toBe('pattern-detect');
|
|
155
|
+
expect(normalizeToolName('context-analyzer')).toBe('context-analyzer');
|
|
156
|
+
});
|
|
157
|
+
it('should return unknown names unchanged', () => {
|
|
158
|
+
expect(normalizeToolName('unknown-tool')).toBe('unknown-tool');
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('getToolWeight', () => {
|
|
162
|
+
it('should prioritize CLI override', () => {
|
|
163
|
+
const weight = getToolWeight('pattern-detect', { scoreWeight: 30 }, 50);
|
|
164
|
+
expect(weight).toBe(50);
|
|
165
|
+
});
|
|
166
|
+
it('should use config weight when no CLI override', () => {
|
|
167
|
+
const weight = getToolWeight('pattern-detect', { scoreWeight: 30 }, undefined);
|
|
168
|
+
expect(weight).toBe(30);
|
|
169
|
+
});
|
|
170
|
+
it('should fall back to default weight', () => {
|
|
171
|
+
const weight = getToolWeight('pattern-detect', undefined, undefined);
|
|
172
|
+
expect(weight).toBe(DEFAULT_TOOL_WEIGHTS['pattern-detect']);
|
|
173
|
+
});
|
|
174
|
+
it('should use 10 for unknown tools', () => {
|
|
175
|
+
const weight = getToolWeight('unknown-tool', undefined, undefined);
|
|
176
|
+
expect(weight).toBe(10);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=scoring.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.test.js","sourceRoot":"","sources":["../../src/__tests__/scoring.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAG1B,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAE1B,gCAAgC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser Factory - Manages language-specific parsers
|
|
3
|
+
*
|
|
4
|
+
* This factory provides a centralized way to access the appropriate parser
|
|
5
|
+
* for a given file based on its extension.
|
|
6
|
+
*/
|
|
7
|
+
import { Language, LanguageParser } from '../types/language';
|
|
8
|
+
/**
|
|
9
|
+
* Factory for creating and managing language parsers
|
|
10
|
+
*/
|
|
11
|
+
export declare class ParserFactory {
|
|
12
|
+
private static instance;
|
|
13
|
+
private parsers;
|
|
14
|
+
private extensionMap;
|
|
15
|
+
private constructor();
|
|
16
|
+
/**
|
|
17
|
+
* Get singleton instance
|
|
18
|
+
*/
|
|
19
|
+
static getInstance(): ParserFactory;
|
|
20
|
+
/**
|
|
21
|
+
* Register a language parser
|
|
22
|
+
*/
|
|
23
|
+
registerParser(parser: LanguageParser): void;
|
|
24
|
+
/**
|
|
25
|
+
* Get parser for a specific language
|
|
26
|
+
*/
|
|
27
|
+
getParserForLanguage(language: Language): LanguageParser | null;
|
|
28
|
+
/**
|
|
29
|
+
* Get parser for a file based on its extension
|
|
30
|
+
*/
|
|
31
|
+
getParserForFile(filePath: string): LanguageParser | null;
|
|
32
|
+
/**
|
|
33
|
+
* Check if a file is supported
|
|
34
|
+
*/
|
|
35
|
+
isSupported(filePath: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Get all registered languages
|
|
38
|
+
*/
|
|
39
|
+
getSupportedLanguages(): Language[];
|
|
40
|
+
/**
|
|
41
|
+
* Get all supported file extensions
|
|
42
|
+
*/
|
|
43
|
+
getSupportedExtensions(): string[];
|
|
44
|
+
/**
|
|
45
|
+
* Get language for a file
|
|
46
|
+
*/
|
|
47
|
+
getLanguageForFile(filePath: string): Language | null;
|
|
48
|
+
/**
|
|
49
|
+
* Extract file extension (with dot)
|
|
50
|
+
*/
|
|
51
|
+
private getFileExtension;
|
|
52
|
+
/**
|
|
53
|
+
* Reset factory (useful for testing)
|
|
54
|
+
*/
|
|
55
|
+
static reset(): void;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Convenience function to get parser for a file
|
|
59
|
+
*/
|
|
60
|
+
export declare function getParser(filePath: string): LanguageParser | null;
|
|
61
|
+
/**
|
|
62
|
+
* Convenience function to check if file is supported
|
|
63
|
+
*/
|
|
64
|
+
export declare function isFileSupported(filePath: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Get all supported languages
|
|
67
|
+
*/
|
|
68
|
+
export declare function getSupportedLanguages(): Language[];
|
|
69
|
+
//# sourceMappingURL=parser-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-factory.d.ts","sourceRoot":"","sources":["../../src/parsers/parser-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,QAAQ,EACR,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAI3B;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,YAAY,CAAwB;IAE5C,OAAO;IAWP;;OAEG;WACW,WAAW,IAAI,aAAa;IAO1C;;OAEG;IACI,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IASnD;;OAEG;IACI,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,GAAG,IAAI;IAItE;;OAEG;IACI,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAWhE;;OAEG;IACI,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACI,qBAAqB,IAAI,QAAQ,EAAE;IAI1C;;OAEG;IACI,sBAAsB,IAAI,MAAM,EAAE;IAIzC;;OAEG;IACI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAK5D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;WACW,KAAK,IAAI,IAAI;CAG5B;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,EAAE,CAElD"}
|