@aiready/core 0.9.1 → 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.
Files changed (59) hide show
  1. package/dist/__tests__/parser-factory.test.d.ts +5 -0
  2. package/dist/__tests__/parser-factory.test.d.ts.map +1 -0
  3. package/dist/__tests__/parser-factory.test.js +58 -0
  4. package/dist/__tests__/parser-factory.test.js.map +1 -0
  5. package/dist/__tests__/python-parser.test.d.ts +5 -0
  6. package/dist/__tests__/python-parser.test.d.ts.map +1 -0
  7. package/dist/__tests__/python-parser.test.js +192 -0
  8. package/dist/__tests__/python-parser.test.js.map +1 -0
  9. package/dist/__tests__/scoring.test.d.ts +2 -0
  10. package/dist/__tests__/scoring.test.d.ts.map +1 -0
  11. package/dist/__tests__/scoring.test.js +180 -0
  12. package/dist/__tests__/scoring.test.js.map +1 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/parsers/parser-factory.d.ts +69 -0
  16. package/dist/parsers/parser-factory.d.ts.map +1 -0
  17. package/dist/parsers/parser-factory.js +114 -0
  18. package/dist/parsers/parser-factory.js.map +1 -0
  19. package/dist/parsers/python-parser.d.ts +42 -0
  20. package/dist/parsers/python-parser.d.ts.map +1 -0
  21. package/dist/parsers/python-parser.js +241 -0
  22. package/dist/parsers/python-parser.js.map +1 -0
  23. package/dist/parsers/typescript-parser.d.ts +17 -0
  24. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  25. package/dist/parsers/typescript-parser.js +216 -0
  26. package/dist/parsers/typescript-parser.js.map +1 -0
  27. package/dist/scoring.d.ts +110 -0
  28. package/dist/scoring.d.ts.map +1 -0
  29. package/dist/scoring.js +195 -0
  30. package/dist/scoring.js.map +1 -0
  31. package/dist/types/language.d.ts +161 -0
  32. package/dist/types/language.d.ts.map +1 -0
  33. package/dist/types/language.js +45 -0
  34. package/dist/types/language.js.map +1 -0
  35. package/dist/types.d.ts +104 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +2 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils/ast-parser.d.ts +50 -0
  40. package/dist/utils/ast-parser.d.ts.map +1 -0
  41. package/dist/utils/ast-parser.js +216 -0
  42. package/dist/utils/ast-parser.js.map +1 -0
  43. package/dist/utils/cli-helpers.d.ts +37 -0
  44. package/dist/utils/cli-helpers.d.ts.map +1 -0
  45. package/dist/utils/cli-helpers.js +76 -0
  46. package/dist/utils/cli-helpers.js.map +1 -0
  47. package/dist/utils/config.d.ts +4 -0
  48. package/dist/utils/config.d.ts.map +1 -0
  49. package/dist/utils/config.js +82 -0
  50. package/dist/utils/config.js.map +1 -0
  51. package/dist/utils/file-scanner.d.ts +16 -0
  52. package/dist/utils/file-scanner.d.ts.map +1 -0
  53. package/dist/utils/file-scanner.js +100 -0
  54. package/dist/utils/file-scanner.js.map +1 -0
  55. package/dist/utils/metrics.d.ts +6 -0
  56. package/dist/utils/metrics.d.ts.map +1 -0
  57. package/dist/utils/metrics.js +8 -0
  58. package/dist/utils/metrics.js.map +1 -0
  59. package/package.json +1 -1
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Test multi-language parser factory
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=parser-factory.test.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Test Python parser
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=python-parser.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scoring.test.d.ts.map
@@ -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"}