codingbuddy 0.0.0-dev.20251218084041.e5f3ffe → 0.0.0-dev.20251218092414.9ab52bd
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/src/analyzer/analyzer.module.d.ts +2 -0
- package/dist/src/analyzer/analyzer.module.js +21 -0
- package/dist/src/analyzer/analyzer.module.js.map +1 -0
- package/dist/src/analyzer/analyzer.service.d.ts +10 -0
- package/dist/src/analyzer/analyzer.service.js +73 -0
- package/dist/src/analyzer/analyzer.service.js.map +1 -0
- package/dist/src/analyzer/analyzer.service.spec.d.ts +1 -0
- package/dist/src/analyzer/analyzer.service.spec.js +67 -0
- package/dist/src/analyzer/analyzer.service.spec.js.map +1 -0
- package/dist/src/analyzer/analyzer.types.d.ts +70 -0
- package/dist/src/analyzer/analyzer.types.js +3 -0
- package/dist/src/analyzer/analyzer.types.js.map +1 -0
- package/dist/src/analyzer/code.sampler.d.ts +7 -0
- package/dist/src/analyzer/code.sampler.js +200 -0
- package/dist/src/analyzer/code.sampler.js.map +1 -0
- package/dist/src/analyzer/code.sampler.spec.d.ts +1 -0
- package/dist/src/analyzer/code.sampler.spec.js +153 -0
- package/dist/src/analyzer/code.sampler.spec.js.map +1 -0
- package/dist/src/analyzer/config.analyzer.d.ts +7 -0
- package/dist/src/analyzer/config.analyzer.js +178 -0
- package/dist/src/analyzer/config.analyzer.js.map +1 -0
- package/dist/src/analyzer/config.analyzer.spec.d.ts +1 -0
- package/dist/src/analyzer/config.analyzer.spec.js +146 -0
- package/dist/src/analyzer/config.analyzer.spec.js.map +1 -0
- package/dist/src/analyzer/directory.analyzer.d.ts +12 -0
- package/dist/src/analyzer/directory.analyzer.js +149 -0
- package/dist/src/analyzer/directory.analyzer.js.map +1 -0
- package/dist/src/analyzer/directory.analyzer.spec.d.ts +1 -0
- package/dist/src/analyzer/directory.analyzer.spec.js +119 -0
- package/dist/src/analyzer/directory.analyzer.spec.js.map +1 -0
- package/dist/src/analyzer/index.d.ts +7 -0
- package/dist/src/analyzer/index.js +32 -0
- package/dist/src/analyzer/index.js.map +1 -0
- package/dist/src/analyzer/package.analyzer.d.ts +12 -0
- package/dist/src/analyzer/package.analyzer.js +118 -0
- package/dist/src/analyzer/package.analyzer.js.map +1 -0
- package/dist/src/analyzer/package.analyzer.spec.d.ts +1 -0
- package/dist/src/analyzer/package.analyzer.spec.js +109 -0
- package/dist/src/analyzer/package.analyzer.spec.js.map +1 -0
- package/dist/src/config/config.loader.d.ts +22 -0
- package/dist/src/config/config.loader.js +105 -0
- package/dist/src/config/config.loader.js.map +1 -0
- package/dist/src/config/config.loader.spec.d.ts +1 -0
- package/dist/src/config/config.loader.spec.js +86 -0
- package/dist/src/config/config.loader.spec.js.map +1 -0
- package/dist/src/config/config.module.d.ts +2 -0
- package/dist/src/config/config.module.js +21 -0
- package/dist/src/config/config.module.js.map +1 -0
- package/dist/src/config/config.schema.d.ts +24 -24
- package/dist/src/config/config.service.d.ts +33 -0
- package/dist/src/config/config.service.js +126 -0
- package/dist/src/config/config.service.js.map +1 -0
- package/dist/src/config/context.loader.d.ts +24 -0
- package/dist/src/config/context.loader.js +153 -0
- package/dist/src/config/context.loader.js.map +1 -0
- package/dist/src/config/context.loader.spec.d.ts +1 -0
- package/dist/src/config/context.loader.spec.js +123 -0
- package/dist/src/config/context.loader.spec.js.map +1 -0
- package/dist/src/config/ignore.parser.d.ts +12 -0
- package/dist/src/config/ignore.parser.js +134 -0
- package/dist/src/config/ignore.parser.js.map +1 -0
- package/dist/src/config/ignore.parser.spec.d.ts +1 -0
- package/dist/src/config/ignore.parser.spec.js +130 -0
- package/dist/src/config/ignore.parser.spec.js.map +1 -0
- package/dist/src/config/index.d.ts +9 -0
- package/dist/src/config/index.js +26 -1
- package/dist/src/config/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ARCHITECTURE_PATTERNS = void 0;
|
|
4
|
+
exports.categorizeDirectory = categorizeDirectory;
|
|
5
|
+
exports.detectArchitecturePatterns = detectArchitecturePatterns;
|
|
6
|
+
exports.analyzeDirectory = analyzeDirectory;
|
|
7
|
+
const fs = require("fs/promises");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path = require("path");
|
|
10
|
+
const ignore_parser_1 = require("../config/ignore.parser");
|
|
11
|
+
exports.ARCHITECTURE_PATTERNS = [
|
|
12
|
+
{
|
|
13
|
+
name: 'Next.js App Router',
|
|
14
|
+
indicators: ['app', 'components', 'lib', 'public'],
|
|
15
|
+
minIndicators: 2,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'Next.js Pages Router',
|
|
19
|
+
indicators: ['pages', 'components', 'styles', 'public'],
|
|
20
|
+
minIndicators: 2,
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'NestJS Modular',
|
|
24
|
+
indicators: ['src/modules', 'src/common', 'src/config', 'src/shared'],
|
|
25
|
+
minIndicators: 2,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'Feature-Sliced Design',
|
|
29
|
+
indicators: ['src/features', 'src/entities', 'src/shared', 'src/widgets', 'src/app'],
|
|
30
|
+
minIndicators: 3,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'Component-Based',
|
|
34
|
+
indicators: ['src/components', 'src/hooks', 'src/utils', 'src/services'],
|
|
35
|
+
minIndicators: 2,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Monorepo',
|
|
39
|
+
indicators: ['packages', 'apps', 'libs'],
|
|
40
|
+
minIndicators: 1,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'MVC',
|
|
44
|
+
indicators: ['src/models', 'src/views', 'src/controllers'],
|
|
45
|
+
minIndicators: 2,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'Clean Architecture',
|
|
49
|
+
indicators: ['src/domain', 'src/application', 'src/infrastructure', 'src/presentation'],
|
|
50
|
+
minIndicators: 3,
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
function categorizeDirectory(dirName) {
|
|
54
|
+
const lower = dirName.toLowerCase();
|
|
55
|
+
if (['src', 'lib', 'source', 'app'].includes(lower)) {
|
|
56
|
+
return 'source';
|
|
57
|
+
}
|
|
58
|
+
if (['test', 'tests', '__tests__', 'spec', 'specs', '__mocks__'].includes(lower)) {
|
|
59
|
+
return 'test';
|
|
60
|
+
}
|
|
61
|
+
if (lower === 'config' || lower.startsWith('.config')) {
|
|
62
|
+
return 'config';
|
|
63
|
+
}
|
|
64
|
+
if (['dist', 'build', 'out', '.next', '.nuxt', 'coverage', '.output'].includes(lower)) {
|
|
65
|
+
return 'build';
|
|
66
|
+
}
|
|
67
|
+
if (lower === 'node_modules' || lower === 'vendor') {
|
|
68
|
+
return 'dependencies';
|
|
69
|
+
}
|
|
70
|
+
if (['public', 'static', 'assets', 'images', 'media'].includes(lower)) {
|
|
71
|
+
return 'static';
|
|
72
|
+
}
|
|
73
|
+
return 'other';
|
|
74
|
+
}
|
|
75
|
+
function detectArchitecturePatterns(directories) {
|
|
76
|
+
const detected = [];
|
|
77
|
+
const normalizedDirs = new Set(directories.map((d) => d.toLowerCase()));
|
|
78
|
+
for (const pattern of exports.ARCHITECTURE_PATTERNS) {
|
|
79
|
+
const matchingIndicators = pattern.indicators.filter((indicator) => normalizedDirs.has(indicator.toLowerCase()));
|
|
80
|
+
if (matchingIndicators.length >= pattern.minIndicators) {
|
|
81
|
+
const confidence = matchingIndicators.length / pattern.indicators.length;
|
|
82
|
+
detected.push({
|
|
83
|
+
name: pattern.name,
|
|
84
|
+
confidence,
|
|
85
|
+
indicators: matchingIndicators,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return detected.sort((a, b) => b.confidence - a.confidence);
|
|
90
|
+
}
|
|
91
|
+
async function scanDirectory(rootPath, ignorePatterns, relativePath = '') {
|
|
92
|
+
const files = [];
|
|
93
|
+
const dirs = [];
|
|
94
|
+
const currentPath = relativePath ? path.join(rootPath, relativePath) : rootPath;
|
|
95
|
+
if (!(0, fs_1.existsSync)(currentPath)) {
|
|
96
|
+
return { files, dirs };
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const entries = await fs.readdir(currentPath, { withFileTypes: true });
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
const entryRelativePath = relativePath
|
|
102
|
+
? `${relativePath}/${entry.name}`
|
|
103
|
+
: entry.name;
|
|
104
|
+
if ((0, ignore_parser_1.shouldIgnore)(entryRelativePath, ignorePatterns)) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (entry.isDirectory()) {
|
|
108
|
+
dirs.push(entryRelativePath);
|
|
109
|
+
const subResult = await scanDirectory(rootPath, ignorePatterns, entryRelativePath);
|
|
110
|
+
files.push(...subResult.files);
|
|
111
|
+
dirs.push(...subResult.dirs);
|
|
112
|
+
}
|
|
113
|
+
else if (entry.isFile()) {
|
|
114
|
+
files.push(entryRelativePath);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
}
|
|
120
|
+
return { files, dirs };
|
|
121
|
+
}
|
|
122
|
+
async function analyzeDirectory(projectRoot, customIgnorePatterns = []) {
|
|
123
|
+
const ignorePatterns = [...(0, ignore_parser_1.getDefaultIgnorePatterns)(), ...customIgnorePatterns];
|
|
124
|
+
const { files, dirs } = await scanDirectory(projectRoot, ignorePatterns);
|
|
125
|
+
if (files.length === 0 && dirs.length === 0) {
|
|
126
|
+
if (!(0, fs_1.existsSync)(projectRoot)) {
|
|
127
|
+
return {
|
|
128
|
+
rootDirs: [],
|
|
129
|
+
rootFiles: [],
|
|
130
|
+
allFiles: [],
|
|
131
|
+
patterns: [],
|
|
132
|
+
totalFiles: 0,
|
|
133
|
+
totalDirs: 0,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const rootFiles = files.filter((f) => !f.includes('/'));
|
|
138
|
+
const rootDirs = dirs.filter((d) => !d.includes('/'));
|
|
139
|
+
const patterns = detectArchitecturePatterns(dirs);
|
|
140
|
+
return {
|
|
141
|
+
rootDirs,
|
|
142
|
+
rootFiles,
|
|
143
|
+
allFiles: files,
|
|
144
|
+
patterns,
|
|
145
|
+
totalFiles: files.length,
|
|
146
|
+
totalDirs: dirs.length,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=directory.analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory.analyzer.js","sourceRoot":"","sources":["../../../src/analyzer/directory.analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const directory_analyzer_1 = require("./directory.analyzer");
|
|
5
|
+
(0, vitest_1.describe)('directory.analyzer', () => {
|
|
6
|
+
(0, vitest_1.describe)('ARCHITECTURE_PATTERNS', () => {
|
|
7
|
+
(0, vitest_1.it)('should have definitions for common patterns', () => {
|
|
8
|
+
const names = directory_analyzer_1.ARCHITECTURE_PATTERNS.map((p) => p.name);
|
|
9
|
+
(0, vitest_1.expect)(names).toContain('Next.js App Router');
|
|
10
|
+
(0, vitest_1.expect)(names).toContain('Next.js Pages Router');
|
|
11
|
+
(0, vitest_1.expect)(names).toContain('NestJS Modular');
|
|
12
|
+
(0, vitest_1.expect)(names).toContain('Feature-Sliced Design');
|
|
13
|
+
(0, vitest_1.expect)(names).toContain('Component-Based');
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
(0, vitest_1.describe)('detectArchitecturePatterns', () => {
|
|
17
|
+
(0, vitest_1.it)('should detect Next.js App Router pattern', () => {
|
|
18
|
+
const dirs = ['app', 'components', 'lib', 'public'];
|
|
19
|
+
const result = (0, directory_analyzer_1.detectArchitecturePatterns)(dirs);
|
|
20
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({
|
|
21
|
+
name: 'Next.js App Router',
|
|
22
|
+
confidence: vitest_1.expect.any(Number),
|
|
23
|
+
}));
|
|
24
|
+
});
|
|
25
|
+
(0, vitest_1.it)('should detect Next.js Pages Router pattern', () => {
|
|
26
|
+
const dirs = ['pages', 'components', 'styles', 'public'];
|
|
27
|
+
const result = (0, directory_analyzer_1.detectArchitecturePatterns)(dirs);
|
|
28
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({
|
|
29
|
+
name: 'Next.js Pages Router',
|
|
30
|
+
confidence: vitest_1.expect.any(Number),
|
|
31
|
+
}));
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)('should detect NestJS Modular pattern', () => {
|
|
34
|
+
const dirs = ['src/modules', 'src/common', 'src/config'];
|
|
35
|
+
const result = (0, directory_analyzer_1.detectArchitecturePatterns)(dirs);
|
|
36
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({
|
|
37
|
+
name: 'NestJS Modular',
|
|
38
|
+
}));
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)('should detect Feature-Sliced Design', () => {
|
|
41
|
+
const dirs = ['src/features', 'src/entities', 'src/shared', 'src/widgets'];
|
|
42
|
+
const result = (0, directory_analyzer_1.detectArchitecturePatterns)(dirs);
|
|
43
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({
|
|
44
|
+
name: 'Feature-Sliced Design',
|
|
45
|
+
}));
|
|
46
|
+
});
|
|
47
|
+
(0, vitest_1.it)('should detect Component-Based architecture', () => {
|
|
48
|
+
const dirs = ['src/components', 'src/hooks', 'src/utils'];
|
|
49
|
+
const result = (0, directory_analyzer_1.detectArchitecturePatterns)(dirs);
|
|
50
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({
|
|
51
|
+
name: 'Component-Based',
|
|
52
|
+
}));
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.it)('should detect Monorepo pattern', () => {
|
|
55
|
+
const dirs = ['packages', 'apps'];
|
|
56
|
+
const result = (0, directory_analyzer_1.detectArchitecturePatterns)(dirs);
|
|
57
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({
|
|
58
|
+
name: 'Monorepo',
|
|
59
|
+
}));
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.it)('should return empty array for unrecognized structure', () => {
|
|
62
|
+
const dirs = ['random', 'unknown', 'folders'];
|
|
63
|
+
const result = (0, directory_analyzer_1.detectArchitecturePatterns)(dirs);
|
|
64
|
+
(0, vitest_1.expect)(result).toEqual([]);
|
|
65
|
+
});
|
|
66
|
+
(0, vitest_1.it)('should calculate confidence based on matching indicators', () => {
|
|
67
|
+
const fullMatch = (0, directory_analyzer_1.detectArchitecturePatterns)(['app', 'components', 'lib', 'public']);
|
|
68
|
+
const appRouterPattern = fullMatch.find((p) => p.name === 'Next.js App Router');
|
|
69
|
+
(0, vitest_1.expect)(appRouterPattern?.confidence).toBe(1);
|
|
70
|
+
(0, vitest_1.expect)(appRouterPattern?.indicators).toHaveLength(4);
|
|
71
|
+
const partialMatch = (0, directory_analyzer_1.detectArchitecturePatterns)(['app', 'components']);
|
|
72
|
+
const partialPattern = partialMatch.find((p) => p.name === 'Next.js App Router');
|
|
73
|
+
(0, vitest_1.expect)(partialPattern?.confidence).toBe(0.5);
|
|
74
|
+
(0, vitest_1.expect)(partialPattern?.indicators).toHaveLength(2);
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.it)('should sort patterns by confidence descending', () => {
|
|
77
|
+
const dirs = ['app', 'src/components', 'src/hooks'];
|
|
78
|
+
const result = (0, directory_analyzer_1.detectArchitecturePatterns)(dirs);
|
|
79
|
+
for (let i = 1; i < result.length; i++) {
|
|
80
|
+
(0, vitest_1.expect)(result[i - 1].confidence).toBeGreaterThanOrEqual(result[i].confidence);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.describe)('categorizeDirectory', () => {
|
|
85
|
+
(0, vitest_1.it)('should categorize source directories', () => {
|
|
86
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('src')).toBe('source');
|
|
87
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('lib')).toBe('source');
|
|
88
|
+
});
|
|
89
|
+
(0, vitest_1.it)('should categorize test directories', () => {
|
|
90
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('test')).toBe('test');
|
|
91
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('tests')).toBe('test');
|
|
92
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('__tests__')).toBe('test');
|
|
93
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('spec')).toBe('test');
|
|
94
|
+
});
|
|
95
|
+
(0, vitest_1.it)('should categorize config directories', () => {
|
|
96
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('config')).toBe('config');
|
|
97
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('.config')).toBe('config');
|
|
98
|
+
});
|
|
99
|
+
(0, vitest_1.it)('should categorize build output directories', () => {
|
|
100
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('dist')).toBe('build');
|
|
101
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('build')).toBe('build');
|
|
102
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('out')).toBe('build');
|
|
103
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('.next')).toBe('build');
|
|
104
|
+
});
|
|
105
|
+
(0, vitest_1.it)('should categorize dependency directories', () => {
|
|
106
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('node_modules')).toBe('dependencies');
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.it)('should categorize public/static directories', () => {
|
|
109
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('public')).toBe('static');
|
|
110
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('static')).toBe('static');
|
|
111
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('assets')).toBe('static');
|
|
112
|
+
});
|
|
113
|
+
(0, vitest_1.it)('should return other for unknown directories', () => {
|
|
114
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('random')).toBe('other');
|
|
115
|
+
(0, vitest_1.expect)((0, directory_analyzer_1.categorizeDirectory)('custom')).toBe('other');
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=directory.analyzer.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory.analyzer.spec.js","sourceRoot":"","sources":["../../../src/analyzer/directory.analyzer.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { ProjectAnalysis, PackageInfo, DetectedFramework, FrameworkCategory, DirectoryAnalysis, ArchitecturePattern, ConfigFilesSummary, TsConfigSummary, EslintSummary, PrettierSummary, CodeSample, CodeCategory, } from './analyzer.types';
|
|
2
|
+
export { analyzePackage, parsePackageJson, detectFrameworks, FRAMEWORK_DEFINITIONS, } from './package.analyzer';
|
|
3
|
+
export { analyzeDirectory, detectArchitecturePatterns, categorizeDirectory, ARCHITECTURE_PATTERNS, } from './directory.analyzer';
|
|
4
|
+
export { analyzeConfigs, parseTsConfig, parseEslintConfig, parsePrettierConfig, detectConfigFiles, CONFIG_FILE_PATTERNS, } from './config.analyzer';
|
|
5
|
+
export { sampleCode, selectSampleFiles, categorizeFile, detectLanguage, isCodeFile, LANGUAGE_EXTENSIONS, } from './code.sampler';
|
|
6
|
+
export { AnalyzerService, type AnalyzeOptions } from './analyzer.service';
|
|
7
|
+
export { AnalyzerModule } from './analyzer.module';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AnalyzerModule = exports.AnalyzerService = exports.LANGUAGE_EXTENSIONS = exports.isCodeFile = exports.detectLanguage = exports.categorizeFile = exports.selectSampleFiles = exports.sampleCode = exports.CONFIG_FILE_PATTERNS = exports.detectConfigFiles = exports.parsePrettierConfig = exports.parseEslintConfig = exports.parseTsConfig = exports.analyzeConfigs = exports.ARCHITECTURE_PATTERNS = exports.categorizeDirectory = exports.detectArchitecturePatterns = exports.analyzeDirectory = exports.FRAMEWORK_DEFINITIONS = exports.detectFrameworks = exports.parsePackageJson = exports.analyzePackage = void 0;
|
|
4
|
+
var package_analyzer_1 = require("./package.analyzer");
|
|
5
|
+
Object.defineProperty(exports, "analyzePackage", { enumerable: true, get: function () { return package_analyzer_1.analyzePackage; } });
|
|
6
|
+
Object.defineProperty(exports, "parsePackageJson", { enumerable: true, get: function () { return package_analyzer_1.parsePackageJson; } });
|
|
7
|
+
Object.defineProperty(exports, "detectFrameworks", { enumerable: true, get: function () { return package_analyzer_1.detectFrameworks; } });
|
|
8
|
+
Object.defineProperty(exports, "FRAMEWORK_DEFINITIONS", { enumerable: true, get: function () { return package_analyzer_1.FRAMEWORK_DEFINITIONS; } });
|
|
9
|
+
var directory_analyzer_1 = require("./directory.analyzer");
|
|
10
|
+
Object.defineProperty(exports, "analyzeDirectory", { enumerable: true, get: function () { return directory_analyzer_1.analyzeDirectory; } });
|
|
11
|
+
Object.defineProperty(exports, "detectArchitecturePatterns", { enumerable: true, get: function () { return directory_analyzer_1.detectArchitecturePatterns; } });
|
|
12
|
+
Object.defineProperty(exports, "categorizeDirectory", { enumerable: true, get: function () { return directory_analyzer_1.categorizeDirectory; } });
|
|
13
|
+
Object.defineProperty(exports, "ARCHITECTURE_PATTERNS", { enumerable: true, get: function () { return directory_analyzer_1.ARCHITECTURE_PATTERNS; } });
|
|
14
|
+
var config_analyzer_1 = require("./config.analyzer");
|
|
15
|
+
Object.defineProperty(exports, "analyzeConfigs", { enumerable: true, get: function () { return config_analyzer_1.analyzeConfigs; } });
|
|
16
|
+
Object.defineProperty(exports, "parseTsConfig", { enumerable: true, get: function () { return config_analyzer_1.parseTsConfig; } });
|
|
17
|
+
Object.defineProperty(exports, "parseEslintConfig", { enumerable: true, get: function () { return config_analyzer_1.parseEslintConfig; } });
|
|
18
|
+
Object.defineProperty(exports, "parsePrettierConfig", { enumerable: true, get: function () { return config_analyzer_1.parsePrettierConfig; } });
|
|
19
|
+
Object.defineProperty(exports, "detectConfigFiles", { enumerable: true, get: function () { return config_analyzer_1.detectConfigFiles; } });
|
|
20
|
+
Object.defineProperty(exports, "CONFIG_FILE_PATTERNS", { enumerable: true, get: function () { return config_analyzer_1.CONFIG_FILE_PATTERNS; } });
|
|
21
|
+
var code_sampler_1 = require("./code.sampler");
|
|
22
|
+
Object.defineProperty(exports, "sampleCode", { enumerable: true, get: function () { return code_sampler_1.sampleCode; } });
|
|
23
|
+
Object.defineProperty(exports, "selectSampleFiles", { enumerable: true, get: function () { return code_sampler_1.selectSampleFiles; } });
|
|
24
|
+
Object.defineProperty(exports, "categorizeFile", { enumerable: true, get: function () { return code_sampler_1.categorizeFile; } });
|
|
25
|
+
Object.defineProperty(exports, "detectLanguage", { enumerable: true, get: function () { return code_sampler_1.detectLanguage; } });
|
|
26
|
+
Object.defineProperty(exports, "isCodeFile", { enumerable: true, get: function () { return code_sampler_1.isCodeFile; } });
|
|
27
|
+
Object.defineProperty(exports, "LANGUAGE_EXTENSIONS", { enumerable: true, get: function () { return code_sampler_1.LANGUAGE_EXTENSIONS; } });
|
|
28
|
+
var analyzer_service_1 = require("./analyzer.service");
|
|
29
|
+
Object.defineProperty(exports, "AnalyzerService", { enumerable: true, get: function () { return analyzer_service_1.AnalyzerService; } });
|
|
30
|
+
var analyzer_module_1 = require("./analyzer.module");
|
|
31
|
+
Object.defineProperty(exports, "AnalyzerModule", { enumerable: true, get: function () { return analyzer_module_1.AnalyzerModule; } });
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzer/index.ts"],"names":[],"mappings":";;;AAiBA,uDAK4B;AAJ1B,kHAAA,cAAc,OAAA;AACd,oHAAA,gBAAgB,OAAA;AAChB,oHAAA,gBAAgB,OAAA;AAChB,yHAAA,qBAAqB,OAAA;AAGvB,2DAK8B;AAJ5B,sHAAA,gBAAgB,OAAA;AAChB,gIAAA,0BAA0B,OAAA;AAC1B,yHAAA,mBAAmB,OAAA;AACnB,2HAAA,qBAAqB,OAAA;AAGvB,qDAO2B;AANzB,iHAAA,cAAc,OAAA;AACd,gHAAA,aAAa,OAAA;AACb,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,oHAAA,iBAAiB,OAAA;AACjB,uHAAA,oBAAoB,OAAA;AAGtB,+CAOwB;AANtB,0GAAA,UAAU,OAAA;AACV,iHAAA,iBAAiB,OAAA;AACjB,8GAAA,cAAc,OAAA;AACd,8GAAA,cAAc,OAAA;AACd,0GAAA,UAAU,OAAA;AACV,mHAAA,mBAAmB,OAAA;AAIrB,uDAA0E;AAAjE,mHAAA,eAAe,OAAA;AACxB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PackageInfo, DetectedFramework, FrameworkCategory } from './analyzer.types';
|
|
2
|
+
interface FrameworkDefinition {
|
|
3
|
+
name: string;
|
|
4
|
+
packageName: string;
|
|
5
|
+
category: FrameworkCategory;
|
|
6
|
+
devOnly?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const FRAMEWORK_DEFINITIONS: FrameworkDefinition[];
|
|
9
|
+
export declare function parsePackageJson(content: string): Omit<PackageInfo, 'detectedFrameworks'>;
|
|
10
|
+
export declare function detectFrameworks(dependencies: Record<string, string>, devDependencies: Record<string, string>): DetectedFramework[];
|
|
11
|
+
export declare function analyzePackage(projectRoot: string): Promise<PackageInfo | null>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FRAMEWORK_DEFINITIONS = void 0;
|
|
4
|
+
exports.parsePackageJson = parsePackageJson;
|
|
5
|
+
exports.detectFrameworks = detectFrameworks;
|
|
6
|
+
exports.analyzePackage = analyzePackage;
|
|
7
|
+
const fs = require("fs/promises");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path = require("path");
|
|
10
|
+
exports.FRAMEWORK_DEFINITIONS = [
|
|
11
|
+
{ name: 'React', packageName: 'react', category: 'frontend' },
|
|
12
|
+
{ name: 'Vue', packageName: 'vue', category: 'frontend' },
|
|
13
|
+
{ name: 'Angular', packageName: '@angular/core', category: 'frontend' },
|
|
14
|
+
{ name: 'Svelte', packageName: 'svelte', category: 'frontend' },
|
|
15
|
+
{ name: 'Solid', packageName: 'solid-js', category: 'frontend' },
|
|
16
|
+
{ name: 'Next.js', packageName: 'next', category: 'fullstack' },
|
|
17
|
+
{ name: 'Nuxt', packageName: 'nuxt', category: 'fullstack' },
|
|
18
|
+
{ name: 'Remix', packageName: '@remix-run/react', category: 'fullstack' },
|
|
19
|
+
{ name: 'Astro', packageName: 'astro', category: 'fullstack' },
|
|
20
|
+
{ name: 'NestJS', packageName: '@nestjs/core', category: 'backend' },
|
|
21
|
+
{ name: 'Express', packageName: 'express', category: 'backend' },
|
|
22
|
+
{ name: 'Fastify', packageName: 'fastify', category: 'backend' },
|
|
23
|
+
{ name: 'Hono', packageName: 'hono', category: 'backend' },
|
|
24
|
+
{ name: 'Koa', packageName: 'koa', category: 'backend' },
|
|
25
|
+
{ name: 'Jest', packageName: 'jest', category: 'testing', devOnly: true },
|
|
26
|
+
{ name: 'Vitest', packageName: 'vitest', category: 'testing', devOnly: true },
|
|
27
|
+
{ name: 'Mocha', packageName: 'mocha', category: 'testing', devOnly: true },
|
|
28
|
+
{
|
|
29
|
+
name: 'Playwright',
|
|
30
|
+
packageName: '@playwright/test',
|
|
31
|
+
category: 'testing',
|
|
32
|
+
devOnly: true,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'Cypress',
|
|
36
|
+
packageName: 'cypress',
|
|
37
|
+
category: 'testing',
|
|
38
|
+
devOnly: true,
|
|
39
|
+
},
|
|
40
|
+
{ name: 'Vite', packageName: 'vite', category: 'build', devOnly: true },
|
|
41
|
+
{ name: 'Webpack', packageName: 'webpack', category: 'build', devOnly: true },
|
|
42
|
+
{ name: 'esbuild', packageName: 'esbuild', category: 'build', devOnly: true },
|
|
43
|
+
{ name: 'Rollup', packageName: 'rollup', category: 'build', devOnly: true },
|
|
44
|
+
{ name: 'Turbopack', packageName: 'turbo', category: 'build', devOnly: true },
|
|
45
|
+
{ name: 'ESLint', packageName: 'eslint', category: 'linting', devOnly: true },
|
|
46
|
+
{
|
|
47
|
+
name: 'Prettier',
|
|
48
|
+
packageName: 'prettier',
|
|
49
|
+
category: 'linting',
|
|
50
|
+
devOnly: true,
|
|
51
|
+
},
|
|
52
|
+
{ name: 'Biome', packageName: '@biomejs/biome', category: 'linting', devOnly: true },
|
|
53
|
+
{
|
|
54
|
+
name: 'Tailwind CSS',
|
|
55
|
+
packageName: 'tailwindcss',
|
|
56
|
+
category: 'styling',
|
|
57
|
+
devOnly: true,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'Styled Components',
|
|
61
|
+
packageName: 'styled-components',
|
|
62
|
+
category: 'styling',
|
|
63
|
+
},
|
|
64
|
+
{ name: 'Emotion', packageName: '@emotion/react', category: 'styling' },
|
|
65
|
+
{ name: 'Sass', packageName: 'sass', category: 'styling', devOnly: true },
|
|
66
|
+
{ name: 'Prisma', packageName: '@prisma/client', category: 'database' },
|
|
67
|
+
{ name: 'TypeORM', packageName: 'typeorm', category: 'database' },
|
|
68
|
+
{ name: 'Drizzle', packageName: 'drizzle-orm', category: 'database' },
|
|
69
|
+
{ name: 'Mongoose', packageName: 'mongoose', category: 'database' },
|
|
70
|
+
];
|
|
71
|
+
function parsePackageJson(content) {
|
|
72
|
+
const raw = JSON.parse(content);
|
|
73
|
+
return {
|
|
74
|
+
name: raw.name ?? 'unknown',
|
|
75
|
+
version: raw.version ?? '0.0.0',
|
|
76
|
+
description: raw.description,
|
|
77
|
+
type: raw.type,
|
|
78
|
+
dependencies: raw.dependencies ?? {},
|
|
79
|
+
devDependencies: raw.devDependencies ?? {},
|
|
80
|
+
scripts: raw.scripts ?? {},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function detectFrameworks(dependencies, devDependencies) {
|
|
84
|
+
const allDeps = { ...dependencies, ...devDependencies };
|
|
85
|
+
const detected = [];
|
|
86
|
+
for (const def of exports.FRAMEWORK_DEFINITIONS) {
|
|
87
|
+
const version = def.devOnly
|
|
88
|
+
? devDependencies[def.packageName]
|
|
89
|
+
: allDeps[def.packageName];
|
|
90
|
+
if (version) {
|
|
91
|
+
detected.push({
|
|
92
|
+
name: def.name,
|
|
93
|
+
category: def.category,
|
|
94
|
+
version,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return detected;
|
|
99
|
+
}
|
|
100
|
+
async function analyzePackage(projectRoot) {
|
|
101
|
+
const packagePath = path.join(projectRoot, 'package.json');
|
|
102
|
+
if (!(0, fs_1.existsSync)(packagePath)) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const content = await fs.readFile(packagePath, 'utf-8');
|
|
107
|
+
const parsed = parsePackageJson(content);
|
|
108
|
+
const frameworks = detectFrameworks(parsed.dependencies, parsed.devDependencies);
|
|
109
|
+
return {
|
|
110
|
+
...parsed,
|
|
111
|
+
detectedFrameworks: frameworks,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=package.analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.analyzer.js","sourceRoot":"","sources":["../../../src/analyzer/package.analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const package_analyzer_1 = require("./package.analyzer");
|
|
5
|
+
(0, vitest_1.describe)('package.analyzer', () => {
|
|
6
|
+
(0, vitest_1.describe)('parsePackageJson', () => {
|
|
7
|
+
(0, vitest_1.it)('should parse minimal package.json', () => {
|
|
8
|
+
const content = JSON.stringify({
|
|
9
|
+
name: 'test-project',
|
|
10
|
+
version: '1.0.0',
|
|
11
|
+
});
|
|
12
|
+
const result = (0, package_analyzer_1.parsePackageJson)(content);
|
|
13
|
+
(0, vitest_1.expect)(result.name).toBe('test-project');
|
|
14
|
+
(0, vitest_1.expect)(result.version).toBe('1.0.0');
|
|
15
|
+
(0, vitest_1.expect)(result.dependencies).toEqual({});
|
|
16
|
+
(0, vitest_1.expect)(result.devDependencies).toEqual({});
|
|
17
|
+
(0, vitest_1.expect)(result.scripts).toEqual({});
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.it)('should parse full package.json', () => {
|
|
20
|
+
const content = JSON.stringify({
|
|
21
|
+
name: 'full-project',
|
|
22
|
+
version: '2.0.0',
|
|
23
|
+
description: 'A test project',
|
|
24
|
+
type: 'module',
|
|
25
|
+
dependencies: {
|
|
26
|
+
react: '^18.0.0',
|
|
27
|
+
},
|
|
28
|
+
devDependencies: {
|
|
29
|
+
typescript: '^5.0.0',
|
|
30
|
+
},
|
|
31
|
+
scripts: {
|
|
32
|
+
build: 'tsc',
|
|
33
|
+
test: 'vitest',
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
const result = (0, package_analyzer_1.parsePackageJson)(content);
|
|
37
|
+
(0, vitest_1.expect)(result.name).toBe('full-project');
|
|
38
|
+
(0, vitest_1.expect)(result.version).toBe('2.0.0');
|
|
39
|
+
(0, vitest_1.expect)(result.description).toBe('A test project');
|
|
40
|
+
(0, vitest_1.expect)(result.type).toBe('module');
|
|
41
|
+
(0, vitest_1.expect)(result.dependencies).toEqual({ react: '^18.0.0' });
|
|
42
|
+
(0, vitest_1.expect)(result.devDependencies).toEqual({ typescript: '^5.0.0' });
|
|
43
|
+
(0, vitest_1.expect)(result.scripts).toEqual({ build: 'tsc', test: 'vitest' });
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)('should throw on invalid JSON', () => {
|
|
46
|
+
(0, vitest_1.expect)(() => (0, package_analyzer_1.parsePackageJson)('invalid json')).toThrow();
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('should handle missing name/version with defaults', () => {
|
|
49
|
+
const content = JSON.stringify({});
|
|
50
|
+
const result = (0, package_analyzer_1.parsePackageJson)(content);
|
|
51
|
+
(0, vitest_1.expect)(result.name).toBe('unknown');
|
|
52
|
+
(0, vitest_1.expect)(result.version).toBe('0.0.0');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.describe)('detectFrameworks', () => {
|
|
56
|
+
(0, vitest_1.it)('should detect React', () => {
|
|
57
|
+
const deps = { react: '^18.0.0', 'react-dom': '^18.0.0' };
|
|
58
|
+
const result = (0, package_analyzer_1.detectFrameworks)(deps, {});
|
|
59
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({ name: 'React', category: 'frontend' }));
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.it)('should detect Next.js', () => {
|
|
62
|
+
const deps = { next: '^14.0.0', react: '^18.0.0' };
|
|
63
|
+
const result = (0, package_analyzer_1.detectFrameworks)(deps, {});
|
|
64
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({ name: 'Next.js', category: 'fullstack' }));
|
|
65
|
+
});
|
|
66
|
+
(0, vitest_1.it)('should detect NestJS', () => {
|
|
67
|
+
const deps = { '@nestjs/core': '^10.0.0', '@nestjs/common': '^10.0.0' };
|
|
68
|
+
const result = (0, package_analyzer_1.detectFrameworks)(deps, {});
|
|
69
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({ name: 'NestJS', category: 'backend' }));
|
|
70
|
+
});
|
|
71
|
+
(0, vitest_1.it)('should detect Vue', () => {
|
|
72
|
+
const deps = { vue: '^3.0.0' };
|
|
73
|
+
const result = (0, package_analyzer_1.detectFrameworks)(deps, {});
|
|
74
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({ name: 'Vue', category: 'frontend' }));
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.it)('should detect testing frameworks from devDependencies', () => {
|
|
77
|
+
const devDeps = { vitest: '^1.0.0', jest: '^29.0.0' };
|
|
78
|
+
const result = (0, package_analyzer_1.detectFrameworks)({}, devDeps);
|
|
79
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({ name: 'Vitest', category: 'testing' }));
|
|
80
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({ name: 'Jest', category: 'testing' }));
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.it)('should detect build tools', () => {
|
|
83
|
+
const devDeps = { vite: '^5.0.0' };
|
|
84
|
+
const result = (0, package_analyzer_1.detectFrameworks)({}, devDeps);
|
|
85
|
+
(0, vitest_1.expect)(result).toContainEqual(vitest_1.expect.objectContaining({ name: 'Vite', category: 'build' }));
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)('should return empty array for no recognized frameworks', () => {
|
|
88
|
+
const result = (0, package_analyzer_1.detectFrameworks)({}, {});
|
|
89
|
+
(0, vitest_1.expect)(result).toEqual([]);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
(0, vitest_1.describe)('FRAMEWORK_DEFINITIONS', () => {
|
|
93
|
+
(0, vitest_1.it)('should have definitions for major frameworks', () => {
|
|
94
|
+
const names = package_analyzer_1.FRAMEWORK_DEFINITIONS.map((f) => f.name);
|
|
95
|
+
(0, vitest_1.expect)(names).toContain('React');
|
|
96
|
+
(0, vitest_1.expect)(names).toContain('Next.js');
|
|
97
|
+
(0, vitest_1.expect)(names).toContain('NestJS');
|
|
98
|
+
(0, vitest_1.expect)(names).toContain('Vue');
|
|
99
|
+
(0, vitest_1.expect)(names).toContain('Express');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
(0, vitest_1.describe)('analyzePackage', () => {
|
|
103
|
+
(0, vitest_1.it)('should return null for non-existent package.json', async () => {
|
|
104
|
+
const result = await (0, package_analyzer_1.analyzePackage)('/non/existent/path');
|
|
105
|
+
(0, vitest_1.expect)(result).toBeNull();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=package.analyzer.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.analyzer.spec.js","sourceRoot":"","sources":["../../../src/analyzer/package.analyzer.spec.ts"],"names":[],"mappings":"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"}
|